我有一个类,构造函数接受一个参数。例如,
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
?这是一种不好的做法吗?感谢。
答案 0 :(得分:4)
每种语言都可以,但不一定是最好的实践。
std::shared_ptr
和std::unique_ptr
。答案 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
对象将被销毁。