类成员在实例初始化时需要this-pointer

时间:2013-09-24 01:53:46

标签: c++ initialization class-members

我试图在类(B)中创建一个成员(A类的道具)。 A类的成员“prop”需要获取在其构造函数中传递的新创建的B实例的“this”指针。正如下面的代码段(Snippet 1)所示。

但是,这在编译时失败并显示错误消息: “预计会出现类型说明”(翻译自德语)。

我认为这是关于我无法在此上下文中使用this-pointer,但我不想采用 Snippet 2 的方式并使用指针。这对我来说是不切实际的。

有没有办法实现这个接近第一个片段的编码风格?

Snippet 1

class B;

class A
{
public:
    A(B* b) 
    {
       // ...
    };

};

class B 
{
public:
    A prop(this);
};

Snippet 2

class B;

class A
{
public:
    A(B* b) 
    {
       // ...
    };

};

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

    A* prop;
};

编辑:刚想出这个片段,但是当他们在一个班级中有很多片段时,它真的不可读。

摘录3

class B;

class A
{
public:
    A(B* b)
    {
       // ...
    };

};

class B 
{
public:
    B() : prop(this) {};

    A prop;
};

非常感谢!
塞巴斯蒂安

2 个答案:

答案 0 :(得分:5)

您无法在类声明中初始化类成员。正如您在代码段#3中正确指出的那样 - 成员存在构造函数初始化列表,这需要将参数传递给构造函数。

使用初始化列表是IMHO执行此操作的最佳方式,请注意,成员按您声明的顺序初始化,但不是初始化列表中的顺序:

class B 
{
  public:
      B() : prop(this) {};

  A prop;
};

答案 1 :(得分:2)

我现在自己解决了这个问题。

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

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

class B;

class A
{
public:
    A(B* b)
    {
       // ...
    };

};

class B 
{
public:
    A prop{this};
};

这看起来有点奇怪,但更像我正在寻找的东西。