使用 vector push_back类对象

push_back a class object using vector.

本文关键字:对象 back vector push 使用      更新时间:2023-10-16

如何将类的对象添加到另一个类中的向量。

#include <iostream>
#include <vector>
#include <string>
using namespace std;
class info{
    private: 
        int id;
        string name;
    public:
        info(int extId, string extName) {
            this->id = extId;
            this->name = extName;
        }
};
class db {
    private:
        vector<info> infoVector;
    public:
        void pushData(info * data) {
            this->infoVector.push_back(&data);
        }
};
int main(){ 
    info * testData = new info(123, "nice"); 
    db database;
    database.pushData(testData);    
    return 0;
}

我正在创建一个info类的对象。该对象包含一个int和一个string变量。然后我正在创建db对象,并在那里传递一个testData对象。

我在构建项目时收到错误消息。

main.cpp: In member function ‘void db::pushData(info*)’:
main.cpp:23:44: error: no matching function for call to ‘std::vector<info>::push_back(info*&)’
             this->infoVector.push_back(data);
                                            ^
In file included from /usr/include/c++/5/vector:64:0,
                 from main.cpp:2:
/usr/include/c++/5/bits/stl_vector.h:913:7: note: candidate: void std::vector<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = info; _Alloc = std::allocator<info>; std::vector<_Tp, _Alloc>::value_type = info]
       push_back(const value_type& __x)
       ^
/usr/include/c++/5/bits/stl_vector.h:913:7: note:   no known conversion for argument 1 from ‘info*’ to ‘const value_type& {aka const info&}’

我做错了什么?

看起来您正在尝试将info *类型的地址传递给 vector<info>::push_back ,它只接受 const info &info && 的类型。 调用 push_back 时,请尝试使用取消引用运算符 * 而不是地址运算符&

this->infoVector.push_back(*data);

但是,这不是使用指针的好方法,如果从矢量中删除或删除data,可能会导致内存泄漏或段错误。 vector最好拥有其成员,因此您可以考虑这样做:

class db {
    private:
    vector<info> infoVector;
    public:
    void pushData(info data) {            // note: not a pointer
        this->infoVector.push_back(data); // note: not address-of
    }
};
int main(){ 
    info testData(123, "nice"); // note: not a pointer
    db database;
    database.pushData(testData);
    return 0;
}

否则,如果您确实希望infoVector包含指针,请将其声明为:

std::vector<info*> infoVector;

然后删除地址收件人运算符。

附言,尽可能避免using namespace std

你有vector<info>,你想放info *,试着做:

int main(){ 
    info testData(123, "nice"); 
    db database;
    database.pushData(testData);    
   return 0;
}