尝试将对象存储在向量中 我是C++的新手,我想把对象存储在一个STD::vector中,像这样:
事件h:尝试将对象存储在向量中 我是C++的新手,我想把对象存储在一个STD::vector中,像这样:,c++,C++,事件h: //event.h class Event { public: Event(); Event(std::string name); ~Event(); void addVisitor(Visitor visitor); private: std::vector<Visitor> m_visitors; }; Visitor.cpp: //visitor.cpp Visitor::Visitor() : m_name("J
//event.h
class Event
{
public:
Event();
Event(std::string name);
~Event();
void addVisitor(Visitor visitor);
private:
std::vector<Visitor> m_visitors;
};
Visitor.cpp:
//visitor.cpp
Visitor::Visitor() :
m_name("John Doe")
{
}
Visitor::Visitor(std::string name) :
m_name(name)
{
}
std::string Visitor::getName() const
{
return m_name;
}
main.cpp:
//main.cpp
int main()
{
Event *e1 = new Event("Whatever");
Visitor *v1 = new Visitor("Dummy1");
Visitor *v2 = new Visitor("Dummy2");
e1->addVisitor(*v1);
e1->addVisitor(*v2);
}
如果我这样做的话,我将不得不添加一个复制构造函数,它将生成一个深度复制,以便将对象正确地复制到向量中。我正在寻找一种方法,只存储指向向量中对象的指针。
我已经在std::vector m_visitors
中尝试过了,但是在main.cpp中调用addVisitor时出现了一些错误。当然,我也相应地修改了班级成员的声明。
成员和成员函数的适当声明如何使其工作?从风格上讲,如果传递指针,只接受指针作为函数参数 在上面的示例代码中,访问者被复制成函数参数,而您拥有的指针没有被主函数之外的任何东西引用 我无法说明您看到的错误是什么,因为您没有描述它们,但这可能与不兼容的类型有关 只需去掉新的,因为对于这些数据结构,它们是不必要的
int main()
{
Event e1("Whatever");
Visitor v1("Dummy1");
Visitor v2("Dummy2");
e1.addVisitor(v1);
e1.addVisitor(v2);
}
我建议,如果您不知道如何使用指针,您可能不想存储它们(在我看来,当按值复制工作正常时,将它们存储在向量中很麻烦)
编译器生成的复制构造函数应该可以正常工作。不需要手动深度复制,因为您使用的是支持的
std::string
但是,您的main
函数有三个内存泄漏-无论如何都不需要在那里使用new
,所以不要这样做
一般经验法则:
如果在任何时候,您正考虑在代码中引入更多指针,那么您可能走错了方向。是否对访问者进行了访问。
向后推(访问者)
不起作用?我也是C++的NoOB,最近我创建了一个程序,它使用几乎相同的语法来完成同样的目标,而且很好。为什么你认为你需要添加一个拷贝构造函数?编译器提供了一个应该做得很好。你应该做的是去掉main()
std::string
中的所有new
s,并且std::vector
已经做了正确的事情。你不必添加任何内容。不过,您可能希望删除指针和new
的使用。它们不是必需的。@juanchopanza因为对象从主作用域复制到向量,不是吗?我试过了,就像我发布的一样,但是listVisitors只给了我空行(它没有复制m_name的值),在我添加了一个复制构造函数之后,它就工作了。但是我不想每次我更改Classic的成员时都要更改cctor如果您的真实代码与本文中的代码类似,那么您不需要添加和复制构造函数、赋值运算符或析构函数。编译器提供了相应的复制、分配和销毁版本。
//main.cpp
int main()
{
Event *e1 = new Event("Whatever");
Visitor *v1 = new Visitor("Dummy1");
Visitor *v2 = new Visitor("Dummy2");
e1->addVisitor(*v1);
e1->addVisitor(*v2);
}
int main()
{
Event e1("Whatever");
Visitor v1("Dummy1");
Visitor v2("Dummy2");
e1.addVisitor(v1);
e1.addVisitor(v2);
}