C++类的向量,不能在所述类的构造函数内部push_back

C++ Vector of classes, can't push_back inside constructor of said class

本文关键字:内部 构造函数 push back 向量 不能 C++      更新时间:2023-10-16

所以这是我的问题,我想要一个类的对象向量,然后我可以将其传递给其他类供使用。

我希望向量在该类的构造函数中添加类的实例。因此,我已经在类成员和构造函数中设置了一个静态向量

当前有两个类别的类,一个是事件处理程序类,每次左键单击时都会创建一个"障碍"类的实例(我想要的矢量)。

(我省略了无关的代码)

class MyEventReceiver: public IEventReceiver
{
private:
    blah blah

public:
    blah blah
virtual bool OnEvent (const SEvent& event){
    if(left click)
       Obstacle obs(scn,randX,randY,randR);
}
}

障碍:

class Obstacle
{
private:
    static std::vector<Obstacle> *obs;
public:
    Obstacle(scene::ISceneManager*, float, float, float);
    ~Obstacle();
};

障碍CPP:

std::vector<Obstacle> *Obstacle::obs;
Obstacle::Obstacle(scene::ISceneManager* scn, float x, float y, float radius)
{
    //get and set the passed in params blah blah
    obs->push_back(this);

}

这不起作用,但希望您能看到我要实现的目标。稍后,我想要一个函数,该函数将返回对obs的引用,以便其他类可以调用此功能并访问向量进行操作和读取它。

  1. 没有obs作为指针,没有必要。
  2. obs被声明为对象的向量this是指向对象的指针,因此您必须将push_back称为obs->push_back(*this);

您确实想更改向量,以便通过指针存储它们,而不是通过价值来存储它们,因为您不想在其中副本:

static std::vector<Obstacle*> *obs;

请记住要从destructor中的该向量中删除实例:

Obstacle::~Obstacle()
{
    auto iter = std::find(obj->begin(), obj->end(), this);
    if (iter != obj->end())
    {
        obj->erase(iter);
    }
}

您还需要编写一个添加它的复制构造函数。如果您不这样做,那么您将无法跟踪副本(假设您允许):

Obstacle::Obstacle(const Obstacle& rhs)
    // ... initialise from rhs
{
    obs->push_back(this);
}

您的向量被声明为错误。应该是

static std::vector<Obstacle*> obs;

即。指针的向量。您所拥有的是指向向量的指针。

假设您的目标是维护所有构造障碍物的指针向量,那么您还必须声明复制构造函数(复制的障碍物对象也需要添加到您的向量)和destructor(应该应该添加到destructor(应该应该)从矢量中删除对象)。这不会有效,但可能可以满足您的需求。