2

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

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

4 回答 4

8

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

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

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 的指针,并使用动态创建的 type 对象的地址对其进行初始化Info,该对象必须稍后删除,否则不会调用析构函数并且不会释放内存。

Info newApp;声明一个类型的自动变量,Info在作用域结束时调用析构函数,并释放其内存。

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

于 2013-08-19T19:32:56.067 回答
2

宣言

vector<Info> dataBase;

声明一个接受Info objects的向量。在初始化程序中,

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

dataBase.push_back(newApp);

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

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

后一种方法更安全,因为您不必记住释放任何东西,并且在这种情况下也更有效,可能是因为尽管您正在复制结构,但您不会对操作系统进行昂贵的系统调用以进行内存分配。

于 2013-08-19T19:34:08.090 回答
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);
}

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

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

于 2013-08-19T19:38:22.803 回答
0

你必须转这个:

vector<Info> dataBase;

进入这个:

vector<Info*> dataBase;

因为你想 push_back 一个指针,并且 vector 被声明为接受对象。

于 2013-08-19T19:31:52.937 回答