我正在研究一些C ++ 11示例,但我有点生疏。我正在尝试将对象实例添加到类属性。我有这样的事情:
Entity.h
class Entity {
private:
MyClass object;
public:
Entity();
void doTest();
};
Entity.cpp
#include "Entity.h"
Entity::Entity() {
}
void Entity::doTest(stuff) {
object = new MyClass(stuff);
}
这是对的吗?我怎么能用C ++做到这一点?
答案 0 :(得分:2)
除了new
之外,它都是正确的。只在需要动态分配时使用;在这种情况下,您只想创建一个对象:
object = MyClass(stuff);
或许你想在构造函数中初始化它:
Entity(stuff) : object(stuff) {}
答案 1 :(得分:0)
这是错的。 object
是一个对象而不是指针。但是你的代码
object = new MyClass(stuff);
将object
视为指针。
您可以将object
声明为班级Entity
中的指针,也可以更改您的函数doTest
;
如果你想要一个指针,最好在C ++中使用smart pointers
,例如unique_ptr
。
答案 2 :(得分:0)
你想在decleration中使用:
MyClass* object
此外,如果您要使用new MyClass
,请确保使用delete object
以避免泄密。
即
Entity::Entity() { object = NULL; } //constructor
Entity::doTest(stuff) {
delete object;
object = new MyClass(stuff);
}
//Following rule of three, since we need to manage the resources properly
//you should define Copy Constructor, Copy Assignment Operator, and destructor.
Entity::Entity(const Entity& that) { //copy constructor
object = that.object;
//assumes you've correctly implemented an assignment operator overload for MyClass
}
//invoke copy and swap idiom* if you wish, I'm too lazy
Entity& Entity::operator=(const Entity& source) {
MyClass* temp = new MyClass(source.object)
//assumes you've correctly implemented an copy constructor (or default one works) for MyClass.
delete object;
object = temp;
return *this;
}
Entity::~Entity() { //destuctor
delete object;
}
如果可能的话,你应该避免动态分配。您还应该使用智能指针(如std::shared_ptr
),但如果您确实希望使用原始指针,请遵守rule of three。
答案 3 :(得分:0)
在C ++中,您的object
字段确实是一个对象。这意味着您可以创建的每个Entity
对象中都有内部。问题是如何初始化object
字段?
MyClass
没有ctor或ctor可调,没有参数,一切都还可以。如果没有,你应该在Entity
这样定义ctor的同时定义字段的初始化
Entity::Entity() : object(parameters) {
code for Entities initialization
}
这是一种确保初始化正确性的方法,以便{/ 1}}初始化,然后您可以控制object
的初始化。
您的Entity
已在每个object
内静态初始化,这是一种很好的方式,在C ++中,可以在面向对象的编程中编写所谓的组合。