繁体   English   中英

在构造函数中创建对象

[英]Object creation in constructor

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

这是一个在构造函数中创建对象的示例,该示例为伪代码:

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

    vector<MyMemberType*> getMyMember();
    {
        return myMember_;
    }
    ...

private:
    vector<MyMemberType*> myMember_;
}

因此,您可以毫无问题地使用单元测试,因为您可以模拟MyMemberFactory。 如果我将for循环移动到单独的初始化方法中,则必须检查双重初始化,并且如果已经完成初始化,则所有吸气剂都需要首先进行修正。 下面的代码通过使用单独的初始化:

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

那么,您是否知道任何原因,为什么我应该使用第二种方法而不是第一种方法? 或者,也许我只是记错了,第一种方法完全可以吗?

如果构造函数引发异常,则不会调用析构函数,因此您将丢失所有手动分配的内存。

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

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

由于客户不能再使用其他工厂(例如,用于测试),因此会出现问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM