我以某种方式读到,在构造函数中创建对象是一种不好的风格……但是,我忘记了为什么它被认为是不好的风格(特别是在使用依赖注入(inject)时)。
这是在构造函数中以伪代码形式创建对象的示例:
Myclass
{
Myclass(MyMemberFactory& fac)
{
for(Some criteria)
push_back(fac.createMyMemberType());
}
vector<MyMemberType*> getMyMember();
{
return myMember_;
}
...
private:
vector<MyMemberType*> myMember_;
}
因此您可以毫无问题地使用单元测试,因为您可以模拟 MyMemberFactory。 如果我将 for 循环移动到单独的初始化方法中,则需要检查双重初始化,并且如果初始化已经完成,则所有 getter 都需要首先进行检查。这里是使用单独初始化的代码:
Myclass
{
Myclass() : isInitialized_(false)
{
}
void initialize(MyMemberFactory& fac);
{
if(isInitialized_)
throw "Error: Double-Init is not permitted.";
for(Some criteria)
push_back(fac.createMyMemberType());
isInitialized_ =true;
}
vector<MyMemberType*> getMyMember();
{
if(isInitialized_)
throw "Initialize first!";
return myMember_;
}
...
private:
vector<MyMemberType*> myMember_;
bool isInitialized_;
}
那么你知道为什么我应该使用第二种方法而不是第一种方法吗?或者也许我只是想到了一些错误,而第一种方法完全没问题?
最佳答案
如果构造函数抛出异常,析构函数将不会被调用,因此您将丢失所有手动分配的内存。
关于c++ - 构造函数中的对象创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12401057/