c ++上次创建的对象

时间:2015-07-02 12:24:21

标签: c++ oop

我想弄明白一件事。我正在尝试2天并且已经搜索了很多,所以如果已经有答案,那么我很抱歉我找不到它。

我想弄清楚的是:

    class Unit {

public:
    static vector< Unit* > Units_array;
    static Unit*  Last_created_unit;

    Unit();

    Unit(string,int,int);

private:
 some private vars
}

并且我的.cpp文件还有定义。 我想知道:当我调用构造函数时,有没有办法将新对象保存到变量Last_created_unit或将其推送到Units_array。我认为最好使用指针因为我希望它只是指向我创建的实际新对象的指针。但是当我开始更改对象的成员时,它就像我有两个不同的对象,因为它有不同的值。

Unit::Unit(string name, int GUID, int faction){

    Last_created_unit = this;
}

这是我试图将它保存到变量的方式,但我怎么说它就像两个不同的对象。因为当我更改一些实际创建的对象的成员时,通过已保存的指针更改的成员具有默认值,反之亦然。

我想像下面这样做,但是在构造函数中。

Last_created_unit = new Unit("some_name", 1, 1);

在创建该变量时,只需将新创建的对象(可能是指向它的指针)保存到该变量中。

我会告诉你它的表演方式

//create new object
Unit player = Unit("something",100,1);
//our line Last_created_unit = this; have its value from constructor, seems fine.
//than we change, for example int Health (Default 100) through our function SetHealth()
Last_created_unit->SetHealth(90);
//than we retrieve our Health GetHealth()
player.GetHealth(); // output = 100
Last_created_unit->getHealth() // output = 90

我希望这表明我想弄清楚什么。如果需要任何其他信息,请询问。

感谢您的帮助。

4 个答案:

答案 0 :(得分:3)

创建一个创建对象的工厂,让工厂跟踪创建的对象。

class Factory {
  Unit* createUnit() {
    Unit *newUnit = new Unit();
    // keep track of new objects
    return newUnit
  }
};

class Unit {
  friend Factory
  protected:
    Unit();
};

答案 1 :(得分:2)

写作时

player

您(正式)创建一个临时对象,然后将其复制到Unit(Unit const&) = delete; // ... auto player = std::make_unique<Unit>("something",100,1); 。 (此副本可以省略,具体取决于优化级别,但仍然出于访问控制的目的。)

如果对象标识对您很重要,您应该删除复制构造函数并将所有类实例放在智能指针中:

index=False

答案 2 :(得分:0)

这一行

player

表示您创建一个新的临时对象,并调用您的构造函数。然后使用默认创建的复制构造函数将临时对象分配给player,该复制构造函数不跟踪Last_created_unit中的Last_created_unit。然后,销毁临时对象(仍然在Last_created_unit中跟踪),因此使用指针Unit player("something", 100, 1); 的任何后续操作都会导致未定义的行为。

您应该以这种方式构建新对象:

var container = document.querySelector(".container");
sorted.forEach(function(chk) {
    var elementToMove = chk.parentElement; // move the label
    container.appendChild(elementToMove);
});

答案 3 :(得分:0)

您没有使用Unit::Last_created_unit成员:

Unit::Last_created_unit->SetHealth(90);
player.GetHealth();