如何制作指向动态分配对象的指针向量?

时间:2016-05-01 01:31:40

标签: c++ vector

我想创建一个指针向量,每个指针指向他们自己的火星对象,但我无法弄清楚如何安排它。我目前收到错误

  

非常量左值引用类型' vector'无法绑定到不相关类型&martanDatabase'

的值

但是错误会随着我所做的每一次改变而不断变化。我在最近两天看了很多教程试图解决这个问题,但我仍然陷入困境。

struct Martian
{
    Martian(string fname, string lname, string ssid);
    string fname, lname, ssid;
    ~Martian();
};


class martianDatabase
{
    vector<Martian*> database;
    martianDatabase();
    void addMartian(vector <Martian*> &database, int &iterator, string f,  string l, string id);
    int iterator = 0;
};

Martian::Martian(string f, string l, string id)
{
    fname = f;
    lname = l;
    ssid = id;
}

void martianDatabase::addMartian(vector <Martian*> &database, int &i, string f, string l, string id)
{
    Martian* m = new Martian(f, l, id);
    database[i].push_back(m);
    i++;
}

2 个答案:

答案 0 :(得分:1)

vector<Martian*> database;

您的database是指向std::vector个对象的Martian个指针。这是宣言所说的。

database[i].push_back(m);

由于database是向量,database[i]将是此向量中的i值。由于此向量是Martian *的向量,因此此向量中的database[i]值为Martian *

显然,你明白如果你有Martian *,指向火星人的指针,它不是一个类,你不能push_back()任何东西。这是一个指针。一个普通的花园品种指针。你不能push_back()指针的任何东西。你不能begin()end()等等......

这就是编译器告诉你的错误信息。

而且,就你的“如何制作一个指针矢量”问题而言,你已经做到了:

vector<Martian *> database;

这是指针的向量。现在,无论它是否是动态分配对象的指针向量,它都不再相关。向量不关心它指向的对象来自何处。指向动态分配对象的指针与指向static范围内某个对象的指针完全相同。

答案 1 :(得分:1)

您的代码有几个问题:

  • 您不应将vector<Martian*>作为参数传递给addMartian,而是可以通过this指针访问它。
  • 您不需要int& iterator,因为您要做的就是将Martian添加到向量的末尾
  • 您的代码database[i].push_back(m);获取向量database的第i个元素,即Martian&,然后尝试在其上调用push_back(m),这不是可能,因为没有为类型Martian声明这样的函数,你可能想要的是database.push_back(m),它在m向量的后面插入database

考虑以下备选方案:

class martianDatabase
{
    vector<Martian*> database;
    martianDatabase();
    void addMartian(string f,  string l, string id);
};

void martianDatabase::addMartian(string f, string l, string id)
{
    this->database.push_back(new Martian(f, l, id));
}

虽然不是真正的问题,但最好直接初始化构造函数中的成员(如果可能),而不是复制分配它们,即使用代码:

Martian::Martian(string f, string l, string id) : fname(f), lname(l), ssid(id) { }