c静态块

c静态块,第1张

概述C有非静态块吗? 如果没有,怎么仿效呢? 我想替换如下: class C{ public: void ini(){/* some code */}};class D{ std::vector<C*> regis; //will ini(); later public: C field1; public: C field2; public: C fi C有非静态块吗?

如果没有,怎么仿效呢?

我想替换如下:

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(); }

——编辑——

根据意见要求:

C is a holy class for me. Is it possible to not Hack C?

这是一个可能的选择,不需要你修改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静态块所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1254292.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-07
下一篇2022-06-07

发表评论

登录后才能评论

评论列表(0条)

    保存