结构c ++向量

时间:2013-08-19 19:30:09

标签: c++ vector

我遇到了创建结构矢量的问题。在我的函数AddApp中,我无法将新分配的结构“推回”到向量中。我收到错误消息“无效的参数”。我四处看看是否有人有类似的问题,但没有任何帮助。任何人都可以指出我的逻辑中的缺陷是什么? THX。

class AppHolder
{
private:
    struct Info
    {
    int refNumber;
    string name;
    string link;
    };

vector<Info> dataBase;

public:
    void AddApp(int ,string ,string );
};

void AppHolder::AddApp(int R, string N, string L)
{
Info *newApp = new Info;
newApp -> name = N;
newApp -> link = L;
newApp -> refNumber = R;

dataBase.push_back(newApp);
}

4 个答案:

答案 0 :(得分:6)

您的代码失败的原因是std::vector<Info>::push_back要求您传递Info类型的对象,但是您传递Info*

我们可以直接使用Info个对象而不是使用指向new ed变量的指针来解决这个问题:

void AppHolder::AddApp(int R, string N, string L)
{
    Info newApp;
    newApp.name = N;
    newApp.link = L;
    newApp.refNumber = R;
    dataBase.push_back(newApp);
}

Info* newApp = new Info;声明一个指向Info的指针,并用动态创建的类型为Info的对象的地址初始化它,必须在以后删除它,否则将不会调用析构函数,也不会调用内存释放。

Info newApp;声明一个Info类型的自动变量,在范围的末尾调用析构函数,并释放其内存。

在现代C ++中不鼓励使用带有指针的new,因为它需要手动delete指针,它的异常是不安全的(如果在删除之前抛出异常,资源不会被删除)并且涉及写入许多代码(复制构造函数,复制赋值运算符,析构函数,移动构造函数,移动赋值运算符)以确保您的类正常工作。但是,有些情况需要指针使用(在容器中存储派生类的实例),在这种情况下,您希望使用智能指针,它可以为您管理资源。

答案 1 :(得分:2)

声明

vector<Info> dataBase;

声明一个采用Info 对象的向量。在初始化中,

Info *newApp = new Info;
newApp -> name = N;
newApp -> link = L;
newApp -> refNumber = R;

dataBase.push_back(newApp);

语句dataBase.push_back(newApp);尝试将指向Info结构的指针推送到向量上(但是你的向量需要对象,而不是指向对象的指针)。

因此,您需要对指向Info结构 - vector<Info *>的指针矢量进行十分转换 - 并记住释放类析构函数中的每个指针。或者,只需在堆栈上创建一个Info结构(即实际对象)并将其推送到向量(它将在向量中创建结构的副本 - 将在您的情况下使用默认的结构复制构造函数,很好,因为结构不包含指针等或任何需要或不支持深拷贝的东西。

后一种方法更安全,因为您不必记住任何东西,并且在这种情况下也可能更高效,因为虽然您正在复制一个结构,但您不需要进行昂贵的系统调用操作系统进行内存分配。

答案 2 :(得分:2)

您的编译器抱怨的原因是您将dataBase定义为Info个实例的向量,并且您正在尝试将指针推送到Info实例。

vector<Info>声明更改为vector<Info*>是一种方法,或更改AddApp方法:

void AppHolder::AddApp(int R, string N, string L)
{
    Info newApp;
    newApp.name = N;
    newApp.link = L;
    newApp.refNumber = R;

    dataBase.push_back(newApp);
}

正如其他人所指出的那样,不鼓励在C ++中使用new,因此保留容器定义是首选。更改您的实现以使用正确的类型。

评论者澄清了为什么在C ++中使用new时应该小心。

答案 3 :(得分:0)

你必须转过来:

vector<Info> dataBase;

进入这个:

vector<Info*> dataBase;

因为你想push_back一个指针,并且声明了vector来获取对象。