我以某种方式读到在构造函数中创建对象是不好的风格......但是,我忘了为什么它被认为是坏样式(特别是在使用依赖注入时)。
这里的构造函数中的对象创建示例为伪代码:
Myclass
{
Myclass(MyMemberFactory& fac)
{
for(Some criteria)
push_back(fac.createMyMemberType());
}
vector<MyMemberType*> getMyMember();
{
return myMember_;
}
...
private:
vector<MyMemberType*> myMember_;
}
因此您可以毫无问题地使用单元测试,因为您可以模拟MyMemberFactory。 如果我在一个单独的初始化方法中移动for循环,那么检查双初始化是必要的,如果初始化已经完成,所有getter都需要先进行ckeck。这里是代码,使用单独的初始化:
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_;
}
所以知道任何理由,为什么我应该使用第二种方法而不是第一种方法?或者也许我只是想到了一些错误,第一种方法是完全可以的?
答案 0 :(得分:3)
如果构造函数抛出异常,则不会调用析构函数,因此您将丢失手动分配的所有内存。
答案 1 :(得分:2)
第一种方法实际上很好。并不是构造函数中的对象创建有问题,而是使用构造函数这样做是有问题的。所以
Myclass()
{
MyMemberFactory fac;
for(Some criteria)
push_back(fac.createMyMemberType());
}
会有问题,因为客户不能再使用不同的工厂(例如,用于测试)。