2

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

我希望 Vector 在该类的构造函数中添加该类的实例。因此,我在类成员和构造函数中设置了一个静态向量,如果有任何意义,我想尝试 push_back(this)。

目前有 2 个类在工作,一个是事件处理程序类,它在每次左键单击时创建一个“障碍”类(我想要一个向量的类)的实例。

(我省略了不相关的代码)

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);
}

}

障碍.h:

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 的引用,以便其他类可以调用此函数并访问向量以操作和读取它。

4

3 回答 3

2

你真的想改变你的向量,这样你就可以通过指针而不是值来存储它们,因为你不希望在那里有单独的副本:

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

请记住从析构函数中的此向量中删除您的实例:

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);
}
于 2012-11-02T13:39:51.500 回答
2
  1. 没有obs作为指针,没有必要。
  2. obs被声明为objects的向量。this是一个指向对象的指针,所以你必须调用push_backasobs->push_back(*this);
于 2012-11-02T13:27:50.657 回答
1

您的向量被宣布错误。它应该是

static std::vector<Obstacle*> obs;

即指针向量。你所拥有的是一个指向向量的指针。

假设您的目标是维护指向所有构造的 Obstacle 对象的指针向量,那么您还必须声明复制构造函数(复制的 Obstacle 对象也需要添加到向量中)和析构函数(应该从向量)。这不会是有效的,但它可能适合您的需求。

于 2012-11-02T13:31:37.870 回答