2

我以某种方式读到在构造函数中创建对象是不好的风格......但是,我忘记了为什么它被认为是不好的风格(尤其是在使用依赖注入时)。

下面是在构造函数中作为伪代码创建对象的示例:

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_;
}

所以知道任何原因,为什么我应该使用第二种方法而不是第一种方法?或者,也许我只是脑子有问题,而第一种方法完全没问题?

4

2 回答 2

3

如果构造函数抛出异常,析构函数将不会被调用,因此您将失去所有手动分配的内存。

于 2012-09-13T07:05:57.117 回答
2

第一种方法实际上很好。并不是在构造函数中创建对象有问题,而是在构造函数中这样做是有问题的。所以

Myclass()
{
    MyMemberFactory fac;
    for(Some criteria)
        push_back(fac.createMyMemberType());
}

会有问题,因为客户不能再使用不同的工厂(例如用于测试)。

于 2012-09-13T07:06:39.803 回答