【发布时间】:2017-09-24 18:03:40
【问题描述】:
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++中static-block相关的问题,但没有找到任何关于non-static-block的问题。
为了方便回答,这里是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 个char(或更多 - 用于对齐)。
【问题讨论】:
-
你真的想要一个指针向量吗?通过说明内存所有权,引用向量不是更好吗?
-
@Theolodis 是的,我可以,但是这样做仍然没有解决问题。
-
为什么需要各个字段?
-
@Mat 每个字段都是一个数据库。我正在尝试做一个数据库中心。 stackoverflow.com/a/43557157 我还想按名称访问这些字段以提高可读性。前任。
field1,2,3真实姓名为DatabaseHenToCage1to1、DatabaseChickToFood1to1。 -
@javaLover 这就是我写评论的原因......顺便说一句,只要它们具有相同的类型,为什么需要将它们作为单独的变量?难道你不能只做一个字段的初始化向量:
std::vector<C> regis = { C(), C(), C() };编辑:或者让它成为一个地图,从而保持名称可读......
标签: c++ initialization c++14 non-static