我需要知道一些关于构造器的信息。我真的不知道如何表达这个问题,但基本上我需要让所有的操作发生在最终类的构造函数中,而变量在一个类的构造函数中创建,并在另一个类的构造函数中使用。这行得通吗?它安全吗?下面是示例代码。
// Init class
class cInit {
private:
std::string *m_X;
public:
cInit() { m_X = new std::string; }
std::string *getX() { return m_X; }
};
// Does this work (?)
class cUse {
private:
std::string *m_X;
public:
cUse(cInit *x) : m_X( x->getX() ) { }
// Final Class - same question here? Does it work?
class Final : public cInit, public cUse {
public:
Final() : cInit(), cUse( this ) { }
}发布于 2013-12-05 06:33:43
由于基构造器是按声明顺序调用的,因此将首先调用cInit::cInit()。它的构造函数将分配cInit::m_X成员。
然后,将调用cUse::cUse(cInit *),并将调用cInit::getX()的结果赋给cUse::m_X。鉴于cInit::getX()不是一个虚函数,这样调用它是安全的。
换句话说,这段代码没有任何错误。除了它是丑陋的(或者我应该说不是精心设计的?),令人困惑,并且只会造成更多的麻烦。
希望能有所帮助。
发布于 2013-12-05 06:24:56
我更喜欢下面的设计(因为它更面向RAII ):
// Init class
class cInit {
private:
std::string m_X;
public:
cInit() : m_X() {}
std::string & getX() { return m_X; }
};
class cUse {
private:
std::string& m_X;
public:
cUse(std::string &x) : m_X( x ) { }//最后一个类-同样的问题在这里?它起作用了吗?
在您的样例中,您使用的是this,尽管cInit已经完全构造好了,但它当时还没有完全构造好。使用vtable(虚拟函数定义),this的使用肯定会失败。
请尝试执行以下操作:
class Final : public cInit, public cUse {
public:
Final() : cInit(), cUse( cInit::getX() ) { }
}您也可以像在原始示例中一样使用指针,但我一直强烈建议您不要使用原始指针。最好为cInit::m_X选择一个std::unique_ptr (带有预c++11标准的std::auto_ptr),为cUse::m_X选择一个原始指针。
https://stackoverflow.com/questions/20387236
复制相似问题