由于以下原因,可以在堆中实例化对象吗?

时间:2018-01-01 02:37:00

标签: c++

我有一个类,构造函数接受一个参数。例如,

class Entity
{
private:
    int number_;
public:
    Entity(int number):number_(number)
    {
       std::cout << "Entity object created";
    }
}

// header
class SuperEntity
{
private:
   Entity *entity_;

public:
   SuperEntity(int value);
};

// source
SuperEntity::SuperEntity(int value)
{
    entity_ = new Entity(value);
}

班级SuperEntity有一个私人会员Entity。由于为了实例化Entity,您需要将int传递给它的构造函数,并且无法完成声明文件(superentity.h),因为实例化int值需要{ {1}}尚不可用,是否可以在Entity的构造函数中动态分配Entity?这是一种不好的做法吗?感谢。

3 个答案:

答案 0 :(得分:4)

每种语言都可以,但不一定是最好的实践。

  1. 如果可以,请使用对象。
  2. 如果失败,请使用智能指针而不是原始指针。请参阅std::shared_ptrstd::unique_ptr
  3. 如果您必须使用原始指针,请务必遵循The Rule of Three

答案 1 :(得分:4)

正如Dietmar所说,使用成员初始化列表

class SuperEntity
{
    Entity entity_;

public:
    SuperEntity( int value )
        : entity_{ value }
    {}
};

答案 2 :(得分:0)

对于解耦的 has-a 关系,指针数据字段很好。如果你真的想坚持指针,那么你应该更喜欢std::unique_ptr到原始指针,并使用构造函数的std::make_unique中的member initializer list函数:

class SuperEntity {
private:
    std::unique_ptr<Entity> entity_;
public:
    SuperEntity(int value);
};
SuperEntity::SuperEntity(int value)
    : entity_(std::make_unique<Entity>(value))
{}

如果你想拥有一个经典的 has-a 关系抽象,即一个生命周期绑定到所有者生命周期的数据字段,那么松开指针并继续使用该对象:

class SuperEntity {
    private:
        Entity entity_;
    public:
        SuperEntity(int value);
    };
    SuperEntity::SuperEntity(int value)
        : entity_(value)
    {}
};

entity_类型的对象超出范围时,SuperEntity对象将被销毁。