
如果没有,怎么仿效呢?
我想替换如下:
class C{ public: voID ini(){/* some code */}};class D{ std::vector<C*> regis; //will ini(); later public: C fIEld1; public: C fIEld2; public: C fIEld3; //whenever I add a new fIEld,I have to ... #1 public: D(){ regis.push_back(&fIEld1); regis.push_back(&fIEld2); regis.push_back(&fIEld3); //#1 ... also add a line here } public: voID ini(){ for(auto ele:regis){ ele->ini(); } }}; 与: –
class D{ std::vector<C*> regis; public: C fIEld1;{regis.push_back(&fIEld1);}//less error-prone (because it is on-site) public: C fIEld2;{regis.push_back(&fIEld2);} public: C fIEld3;{regis.push_back(&fIEld3);} public: D(){ } //<-- empty public: voID ini(){ for(auto ele:regis){ ele->ini(); } }}; 我在C中发现了与静态块有关的许多问题,但没有发现任何关于非静态块的问题.
为了方便回答,这里是a full code.
可以使用X-MACRO (wiki link),但我试图避免它.
编辑
在实际情况下,fIEldX可以具有从某个C导出的任何类型.
我考虑另一个坏的解决方法:
class D{ std::vector<C*> regis; char f(C& c){ regis.push_back(&c); return 42;} public: C fIEld1; char dummyWaste1=f(fIEld1); public: C fIEld2; char dummyWaste2=f(fIEld2); public: C fIEld3; char dummyWaste3=f(fIEld3); Edit2(赏金原因)
skypjack的答案是非常有用的,但我很好奇,找出更多的选择.
最终的目标是模拟一般非静态块,具有更多的多样性.
换句话说,如果新的解决方案可以解决这个问题,这将是很好的:
class D{ int fIEld1=5; { do something very custom; /* may access fIEld1 which must = 5 */} //^ have to be executed after "fIEld1=5;" but before "fIEld2=7" int fIEld2=7; int fIEld3=8; { do something very custom ; /* e.g. "fIEld1=fIEld2+fIEld3" */} //^ have to be executed after "fIEld3=8;"}; 而不会浪费每个块的1个字符(或更多 – 用于对齐).
解决方法how to emulate it elegantly?
您可以直接初始化regis:
std::vector<C*> regis = { &fIEld1,&fIEld2,&fIEld3 }; 也就是说,将你的班级定义为:
class D{public: C fIEld1; C fIEld2; C fIEld3; voID ini(){ for(auto ele:regis){ ele->ini(); } }private: std::vector<C*> regis = { &fIEld1,&fIEld3 };}; 否则,如果您可以向C添加构造函数,请恢复逻辑并将其自身添加到向量中:
#include<vector>struct C { C(std::vector<C*> &vec) { vec.push_back(this); // ... } voID ini() {}};class D{ std::vector<C*> regis{};public: C fIEld1 = regis; C fIEld2 = regis; C fIEld3 = regis; voID ini(){ for(auto ele:regis){ ele->ini(); } }};int main() { D d{}; d.ini(); } ——编辑——
根据意见要求:
Cis a holy class for me. Is it possible to not HackC?
这是一个可能的选择,不需要你修改C:
#include<vector>struct C { voID ini() {}};struct Wrapper { Wrapper(std::vector<C*> &vec) { vec.push_back(*this); // ... } operator C *() { return &c; }private: C c;};class D{ std::vector<C*> regis{};public: Wrapper fIEld1{regis}; Wrapper fIEld2{regis}; Wrapper fIEld3{regis}; voID ini(){ for(auto ele:regis){ ele->ini(); } }};int main() { D d{}; d.ini(); } 总结 以上是内存溢出为你收集整理的c静态块全部内容,希望文章能够帮你解决c静态块所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)