2013-09-24 84 views
2

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

但是,这在编译时失败,并显示错误消息: “A typespecifier was expected”(德语翻译)。

我认为这是关于我不能在这种情况下使用这个指针,但我不想去Snippet 2的方式,并使用一个指针。这对我来说并不实际。

有什么办法可以完成这个接近第一个代码片段的编码风格吗?

片段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; 
}; 

编辑:只是想出了这个片段,但在一个类别,它具有很多的时候使得它真正不可读。

片段3

class B; 

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

}; 

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

    A prop; 
}; 

非常感谢!
Sebastian

回答

2

我自己得到了解决现在。

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

但是,如果我们给看一下C++ 11,我们可以做如下:

class B; 

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

}; 

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

这看起来有点怪异,但更像是我一直在寻找。

5

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

使用的initializtion列表是这样做的最佳方式恕我直言,笔记,成员在声明的顺序初始化,而不是在初始化列表的顺序:

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

    A prop; 
}; 
+0

我发现了一个包含C++ 11代码的解决方案,但对于非C++ 11代码,您是绝对正确的!谢谢。 –