C++ 如何生成指向动态分配对象的指针向量?

C++ 如何生成指向动态分配对象的指针向量?,c++,vector,C++,Vector,我想创建一个指针向量,每个指针指向各自的火星物体,但我不知道如何排列它。我目前得到的错误 对类型“vector”的非常量左值引用无法绑定到不相关类型“martianDatabase”的值 但是错误总是随着我的每一次改变而改变。在过去的两天里,我看了大量的教程试图弄明白这一点,但我仍然被困在其中 struct Martian { Martian(string fname, string lname, string ssid); string fname, lname, ssid;

我想创建一个指针向量,每个指针指向各自的火星物体,但我不知道如何排列它。我目前得到的错误

对类型“vector”的非常量左值引用无法绑定到不相关类型“martianDatabase”的值


但是错误总是随着我的每一次改变而改变。在过去的两天里,我看了大量的教程试图弄明白这一点,但我仍然被困在其中

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++;
}
struct火星人
{
火星人(字符串fname、字符串lname、字符串ssid);
字符串fname、lname、ssid;
~Martian();
};
类火星数据库
{
矢量数据库;
火星数据库();
void addMartian(向量和数据库、int和迭代器、字符串f、字符串l、字符串id);
int迭代器=0;
};
Martian::Martian(字符串f、字符串l、字符串id)
{
fname=f;
lname=l;
ssid=id;
}
void martian数据库::addMartian(向量和数据库、int和i、字符串f、字符串l、字符串id)
{
火星人*m=新火星人(f,l,id);
数据库[i]。推回(m);
i++;
}
由于
database
是一个向量,
database[i]
将是该向量中的
i
th值。由于该向量是
火星*
的向量,因此
数据库[i]
是该向量中的一些
火星*

显然,你知道如果你有
Martian*
,一个指向火星人的指针,它就不是一个类,你不能
在上面推回任何东西。这是一个指针。一种朴素的花园品种。您不能
将任何内容向后推()
到指针。你不能
begin()
end()
它,等等

这就是编译器告诉您的,以及它的错误消息

至于你的“如何生成指针向量”问题,你已经做到了:

vector<Martian *> database;
矢量数据库;
这是指针向量。现在,不管它是否是指向动态分配对象的指针向量,都不再相关。向量不关心它指向的对象来自何处。指向动态分配对象的指针与指向
静态
范围中某个对象的指针完全相同

由于
database
是一个向量,
database[i]
将是该向量中的
i
th值。由于该向量是
火星*
的向量,因此
数据库[i]
是该向量中的一些
火星*

显然,你知道如果你有
Martian*
,一个指向火星人的指针,它就不是一个类,你不能
在上面推回任何东西。这是一个指针。一种朴素的花园品种。您不能
将任何内容向后推()
到指针。你不能
begin()
end()
它,等等

这就是编译器告诉您的,以及它的错误消息

至于你的“如何生成指针向量”问题,你已经做到了:

vector<Martian *> database;
矢量数据库;

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

您的代码有几个问题:

  • 你不应该把你的
    向量
    作为参数传递给
    addMartian
    ,相反,你可以通过
    这个
    指针访问它
  • 不需要使用
    int&iterator
    ,因为您所要做的就是将
    Martian
    添加到向量的末尾
  • 你的代码
    数据库[i]。向后推(m)
    获取向量
    数据库的第i个元素,它是
    火星人&
    ,然后尝试在它上面调用
    push_back(m)
    ,这是不可能的,因为没有为类型
    火星人
    声明这样的函数,您可能想要的是
    数据库。push_back(m)
    ,在
    数据库的后面插入
    m
考虑以下备选方案:

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

您的代码有几处错误:

  • 你不应该把你的
    向量
    作为参数传递给
    addMartian
    ,相反,你可以通过
    这个
    指针访问它
  • 不需要使用
    int&iterator
    ,因为您所要做的就是将
    Martian
    添加到向量的末尾
  • 你的代码
    数据库[i]。向后推(m)
    获取向量
    数据库的第i个元素,它是
    火星人&
    ,然后尝试在它上面调用
    push_back(m)
    ,这是不可能的,因为没有为类型
    火星人
    声明这样的函数,您可能想要的是
    数据库。push_back(m)
    ,在
    数据库的后面插入
    m
考虑以下备选方案:

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)
会更好,因为
Martian::Martian(const string&f,const string&l,const string&id)
-保存了复制,所以使用智能指针可能会让你的生活更轻松谢谢你,改变了,但我的困境仍然是“错误随着我的每一次改变而不断改变。”-您需要找出导致错误的原因,并进行修复。随机更改程序并希望看到错误是否消失,这不是一个好主意。即使您碰巧消除了错误,代码仍然可能有一个错误bug@EdHeal在某些情况下,按值传递会更有效。此
Martian::Martian(字符串f、字符串l、字符串id)
Martian::Martian(常量字符串&f、常量字符串&l、常量字符串&id)一样更好
-节省了复制时间,使用智能指针可能会让您的生活更美好
Martian::Martian(string f, string l, string id) : fname(f), lname(l), ssid(id) { }