类成员在实例初始化时需要这个指针

Posted

技术标签:

【中文标题】类成员在实例初始化时需要这个指针【英文标题】:class member needs this-pointer at instance-initialization 【发布时间】:2013-09-24 01:53:46 【问题描述】:

我试图为类 (B) 创建一个成员(类 A 的道具)。 A 类的这个成员“prop”需要获取在其构造函数中传递的新创建的 B 实例的“this”指针。就像下面的 sn -p (Snippet 1) 所示。

但是,这在编译时失败并显示错误消息: “需要一个类型说明符”(翻译自德语)。

我认为这是关于我无法在这种情况下使用 this 指针,但我不想走 Snippet 2 的方式并使用指针。这对我来说不实用。

有什么方法可以实现接近第一个sn-p的编码风格吗?

片段 1

class B;

class A

public:
    A(B* b) 
    
       // ...
    ;

;

class B 

public:
    A prop(this);
;

片段 2

class B;

class A

public:
    A(B* b) 
    
       // ...
    ;

;

class B 

public:
    B()
    
       this->prop = new A(this);
    

    A* prop;
;

编辑:刚刚发现了这个 sn-p,但是当一个类中有很多时,它真的不可读。

片段 3

class B;

class A

public:
    A(B* b)
    
       // ...
    ;

;

class B 

public:
    B() : prop(this) ;

    A prop;
;

非常感谢! 塞巴斯蒂安

【问题讨论】:

【参考方案1】:

您不能在类声明中初始化类成员。正如您在 sn-p #3 中正确指出的那样 - 成员存在构造函数初始化列表,需要将参数传递给构造函数。

使用初始化列表是恕我直言的最佳方式,请注意,成员按照您声明它们的顺序进行初始化,而不是初始化列表中的顺序:

class B 

  public:
      B() : prop(this) ;

  A prop;
;

【讨论】:

我找到了一个包含c++11代码的解决方案,但是对于非c++11代码,你是绝对正确的!谢谢。【参考方案2】:

我现在自己解决了。

对于非实验性的;非c++11标准,luri Covalisin是对的。

但是如果我们看一下c++11,我们可以这样做:

class B;

class A

public:
    A(B* b)
    
       // ...
    ;

;

class B 

public:
    A propthis;
;

这看起来有点奇怪,但更像我想要的。

【讨论】:

以上是关于类成员在实例初始化时需要这个指针的主要内容,如果未能解决你的问题,请参考以下文章

java成员变量默认赋值和初始化

指向实例的成员函数而不是类的指针

VB6/VBA中跟踪鼠标移出窗体控件事件(类模块成员函数指针CHooker类应用)

类成员的正确语法函数指针列表是啥?

关于软件构造3.4节的学习总结

Java对象实例化顺序