0

我正在研究一些 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++ 中做到这一点?

4

4 回答 4

2

这一切都是正确的,除了new. 仅在需要动态分配时使用;在这种情况下,您只想创建一个对象:

object = MyClass(stuff);

或者您可能想在构造函数中初始化它:

Entity(stuff) : object(stuff) {}
于 2013-10-03T17:39:24.633 回答
0

这是错误的。object是一个对象而不是一个指针。但是你的代码

object = new MyClass(stuff);

视为object指针。

您可以object在类中声明为指针Entity或更改您的函数doTest

如果你想要一个指针,最好smart pointers在 C++ 中使用,例如unique_ptr.

于 2013-10-03T17:38:01.317 回答
0

您想在声明中使用:

MyClass* object

此外,如果您要使用,请new MyClass确保使用delete object以避免泄漏。

IE

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),但如果您确实希望使用原始指针,请遵守三的规则

*复制和交换成语

于 2013-10-03T17:38:22.380 回答
0

在 C++ 中,您的object领域实际上是一个对象。这意味着您可以创建的每个对象内部都有一个分配的内存。Entity问题是如何初始化该object字段?

  • 如果MyClass没有 ctor 或没有参数的可调用 ctor,则一切正常。
  • Entity如果没有,您应该在定义这种方式的ctor的同时定义字段的初始化

    Entity::Entity() : object(parameters) { code for Entities initialization }

    这是一种确保初始化正确性的方法,以便object控制Entity.

object在 each 内部被静态初始化,这是在 C++ 中编写面向对象编程Entity中所谓的组合的好方法。

于 2013-10-03T17:45:35.320 回答