1

我对 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;

};

事件.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;
}

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

4

2 回答 2

2

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

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

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

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

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

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

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

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

于 2013-01-21T18:03:50.800 回答
1

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

然而,你的main函数有三个内存泄漏——反正没有必要在new那里使用,所以干脆不要。


一般经验法则:

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

于 2013-01-21T18:32:14.857 回答