0

我有这堂课:

class A : public B

我需要在A中添加一些受保护的字段:_field,我无法触摸/更改B。现在,B和A中的所有函数都是虚拟的,除了构造函数。显然,_field 不是 B 类的一部分。

我需要初始化_field。如果唯一的构造函数是 B,我该怎么做?另外,像这样的东西:

unsigned long _field = 0;

给我一个错误编译。

我通过以下方式解决这个问题:

class A : public B
{
protected: 
  unsigned long _field;
public:
  void fooFunction(){
     ....do other stuff....
     static bool isInitField = false;
     if (!isInitField){
       _field = 0;
       isInitField = true;
     }
     ...rest of the function...
  }

有没有更好的方法可以在不使用静态的情况下做到这一点?

谢谢,或者

4

2 回答 2

2

在初始化列表中使用 A 构造函数并调用 B 构造函数,这样就可以初始化 A 类的所有字段:

A(unsigned long i, other_paramaters oth) : B(oth),_field(i) {

}
于 2012-12-16T14:32:03.737 回答
1

对不起,其实我没有理解你的问题。就一次性初始化而言,构造函数是做它的地方。但是您提出的解决方案暗示您想要别的东西。

函数定义中的 static 将使 _field 在类的所有对象中只能修改一次,这是使 _field 一次可修改的一种有点尴尬的机制。

如果你只想初始化 _field 然后使用初始化。埃斯特班的解决方案就可以了。更好的使用

A(unsigned long i, other_paramaters oth) : B(oth),_field(i) { }

A(参数):B(参数),_field(0){}

于 2012-12-16T14:52:57.337 回答