c++ - 构造函数中的对象创建

标签 c++ unit-testing constructor factory

我以某种方式读到,在构造函数中创建对象是一种不好的风格……但是,我忘记了为什么它被认为是不好的风格(特别是在使用依赖注入(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/

相关文章:

c++ - 在 Visual Studio 中为函数定义和头文件编译单独的 .cpp 文件

php - symfony2 Controller 的功能测试 : How to generate a route

javascript - Angular - 提交时测试服务订阅

.net - 如何在 F# 中实现 ISerialized

c++ - Qt QNetworkAccessManager总是返回空数据,状态码为0

c++ - NS3 套接字混淆(需要帮助理解)

c++ - 添加 x509v3 扩展导致 Mozilla pkix 不信任

php - Mocking Laravel Eloquent 模型 - AppServiceProvider 中使用的 Mocking 模型

javascript - 数学不是构造函数,但它有

c++ - 如何在 C++ 的嵌套类中初始化 2 个成员