我遇到了创建结构矢量的问题。在我的函数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);
}
答案 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来获取对象。