C ++ 11类属性作为另一个对象?

时间:2013-10-03 17:35:26

标签: c++ c++11

我正在研究一些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 个答案:

答案 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

* copy and swap idiom

答案 3 :(得分:0)

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

  • 如果MyClass没有ctor或ctor可调,没有参数,一切都还可以。
  • 如果没有,你应该在Entity这样定义ctor的同时定义字段的初始化

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

    这是一种确保初始化正确性的方法,以便{/ 1}}初始化,然后您可以控制object的初始化。

    < / LI>

您的Entity已在每个object内静态初始化,这是一种很好的方式,在C ++中,可以在面向对象的编程中编写所谓的组合