楼主:
ofd168 (大色狼来袭)
2020-06-17 17:07:14※ 引述《ofd168 ()》之铭言:
: 我有两个class,分别是A和B
:
: 其中
: class B {
: public:
: A a;
: A b;
:
: void save_info() {
: a.save();
: b.save();
: }
: }
:
: void main() {
: B obj_b;
:
: ....
:
: obj_b.save_info();
: }
:
:
:
:
: 如果我要多一个c
:
: class B {
: public:
: A a;
: A b;
: A c;
:
: void save_info() {
: a.save();
: b.save();
: c.save();
: }
: }
:
:
:
: 如果我想新增d/e/f/...
: 势必就要改code
:
: 想说有没有办法比较聪明的方法修改save_info
:
:
:
:
:
: 1. 原本的
: https://ideone.com/KU94fC
:
: 当我要新增变量时,需修改line 34 / 38 / 42
:
:
:
: 2. 改成使用Array + enum
: https://ideone.com/1Q92gH
:
: 当我要新增变量时,需修改 line 34 / 43
:
: 而 show_all_result 不需要动
:
:
:
: → loveme00835: 像这样用 variadic template 递回展开即可 06/02 23:22
: → loveme00835: https://wandbox.org/permlink/MG8AZu2MVTYoRa5W 06/02 23:22
: → loveme00835: 后来想想 <utility> 没有现成工具也不打紧 06/02 23:23
:
: 喔喔,这个写法真的不错,感谢L大
:
: 延续我的1+2的话
:
: https://ideone.com/pccF6Y
:
: 这样的话,需要改line 49 / 58
:
: 但是优点是,code里面不用弄成array方式
:
: 对我原本的code来说,改动最小,只要修改宣告的地方
:
:
: 补充
:
: 根据这篇解答
:
:
: https://stackoverflow.com/questions/46190709/address-of-a-method-of-an-objec
: t-in-c
:
: 缩网址 : https://tinyurl.com/yckgwa42
:
: 原本想说c++有可以类似function pointer的东西
:
: 想说能不能类似使用
:
: (func_ptr + obj_size) 直接切到下一个obj的function使用
:
:
: 但这篇有说明
:
: 有些编译器为了节省空间,会将实作的member function使用同一份
:
: 也就是说,就算知道function address,
: 也没办法透过调整指标位置直接执行另一个object的function
: ※ 编辑: ofd168 (59.102.231.161 台湾), 06/03/2020 00:19:09
: → loveme00835: 你要的是 pointer to member function, 不过那也要你 06/03 00:25
: → loveme00835: 先取得每个物件的位址才行 06/03 00:26
: → kingofsdtw: http://lars.ruoff.free.fr/xmlcpp/ ? 06/05 00:25
补一个另一种做法
利用static member variable + constructor
https://ideone.com/z87uYQ
概念上就是弄一个static vector<A*> A_vector;
因为是static,所以每个A的object都看的到
然后再constructor的时候,都要丢给A_vector自己的位置
所以就可以得到love大说的 先取得每个物件的位址才行
在class B就可以简单的
void show_all_result() {
for (int i = 0; i < A::A_vector.size(); i++)
A::A_vector[i]->show_result();
}
感觉起来像是方法2的变形