试图将对象存储在向量中

Posted

技术标签:

【中文标题】试图将对象存储在向量中【英文标题】:Trying to store objects in a vector 【发布时间】:2013-01-21 17:46:47 【问题描述】:

我对 C++ 很陌生,我正在尝试将对象存储在 std::vector 中,如下所示:

事件.h:

//event.h
class Event

public:
    Event();
    Event(std::string name);
    ~Event();
    void addVisitor(Visitor visitor);

private:
    std::vector<Visitor> m_visitors;

;

Event.cpp:

//event.cpp
Event::Event() :
    m_name("Unnamed Event")



Event::Event(std::string name) :
    m_name(name)



void Event::addVisitor(Visitor visitor)

    this->m_visitors.push_back(visitor);

void Event::listVisitors()

    std::vector<Visitor>::iterator it;
    for(it = this->m_visitors.begin();it != this->m_visitors.end(); ++it)
    
        std::cout << it->getName() << std::endl;
    

访问者.h:

//visitor.h
class Visitor

    public:
    Visitor();
    Visitor(std::string name);
    ~Visitor();
    std::string getName() const;
    void listVisitors();

    private:
    std::string m_name;
;

访问者.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&lt;std::unique_ptr&lt;Visitor&gt; &gt; m_visitors 尝试过了,但是在main.cpp 中调用addVisitor 时出现了一些错误。当然,我相应地更改了班级成员的声明。 成员和成员函数的适当声明如何使其工作?

【问题讨论】:

m_visitors.push_back(visitor) 不起作用吗?我也是 C++ 的菜鸟,我最近创建了一个程序,它使用几乎相同的语法来实现相同的目标,并且运行良好。 为什么你认为你需要添加一个拷贝构造函数?编译器提供的应该做的很好。你应该做的是摆脱main()中的所有news。 std::stringstd::vector 已经做了正确的事情。您无需添加任何内容。不过,您可能希望删除对指针和new 的使用。它们不是必需的。 @juanchopanza 因为对象被从主作用域复制到向量,不是吗?我像发布的那样尝试了它,但是 listVisitors 只给了我空行(它没有复制 m_name 的值),在我添加了一个复制构造函数之后它就可以工作了。但我不想每次更改班级成员时都必须更改 cctor 如果你的真实代码看起来和这篇文章中的一样,那么你不需要添加和复制构造函数、赋值运算符或析构函数。编译器提供的这些版本将适当地复制、分配、销毁。 【参考方案1】:

从风格上讲,如果您传递指针,只需接受指针作为函数参数即可。

上面的示例代码中发生的情况是,访问者被复制为函数参数,而您拥有的指针未被主函数之外的任何东西引用。

我无法说出您看到的错误是什么,因为您没有描述它们,但它可能与不兼容的类型有关。

只需去掉 news,因为对于这些数据结构,它们是不必要的。

int main()

    Event e1("Whatever");
    Visitor v1("Dummy1");
    Visitor v2("Dummy2");

    e1.addVisitor(v1);
    e1.addVisitor(v2);

我建议,如果您不知道如何使用指针,那么您不可能想要存储它们(当按值复制工作正常时,将它们存储在向量中是 IMO 的麻烦)。

编译器生成的复制构造函数应该可以正常工作。

【讨论】:

【参考方案2】:

不需要手动深拷贝,因为您使用std::string 非常正确,它支持RAII。

但是,您的 main 函数存在三个内存泄漏 - 无论如何都不需要在那里使用 new,所以干脆不要。


一般经验法则:

如果在任何时候T,您正在考虑在代码中引入更多指针,那么您可能走错了方向。

【讨论】:

以上是关于试图将对象存储在向量中的主要内容,如果未能解决你的问题,请参考以下文章

将对象存储在向量中,编译器说元素不存在

将地址存储到向量中的堆栈分配对象

将指向自定义对象的指针向量存储到文件中

在指针向量c ++中存储新对象

C ++将抽象类型的动态分配对象传递给函数并存储在向量中[重复]

如何将文件存储到包含 C++ 中的类对象的向量中?