【问题标题】:Adding an object to a vector将对象添加到向量
【发布时间】:2016-05-31 17:14:38
【问题描述】:

这是我在这个网站上的第一个问题,但我会尽量涵盖所有需要的内容。抱歉,如果我忘记了什么。我在使用 QT Creator 时遇到了这个问题,但我想使用 Visual Studio 或只是一般的 C++ 会是一样的。

我有几个类:Mainwindow、Track 和 AddForm。主窗口就是它的名字。主要形式。 Track 是一个基于 QObject 的自定义类,它只包含一个 QString 变量(只是现在,因为我还在尝试 QT)。 AddForm 是另一个窗体的类,可以通过单击我的 MainWindow 窗体中的按钮来创建。该表单仅包含一个用于填充字符串的单行编辑和一个显示“添加”的按钮。每当按下该按钮时,来自行编辑的文本将被放入 Track 类的 QString 变量中。该 QString 变量称为“艺术家”。

除了将行编辑中的文本分配给 Track-object 的变量“artist”之外,表单还将发出一个发送整个对象的信号。我的主窗口中的一个插槽将对该信号作出反应并收集 Track 对象。到目前为止一切顺利。

这是我的问题。在我的 mainwindow-header 中,我创建了一个名为 trackVector 的私有 QVector,然后我可以在我的 mainwindow.cpp 中调用它。我想要做的是使用该 Track-object 附加/push_back QVector。有点像这样:

trackVector.push_back(trackObject);

我在构建应用程序时收到以下错误消息: click here for a screenshot

当然,对于整数或任何其他变量,这非常简单。我想你会做这样的事情:

QVector<int> myVector;
myVector.push_back(3);

我认为,每当您附加 QVector(或标准的非 QT 向量)时,您都需要使用该类的构造函数来执行此操作。但是我怎样才能创建一个可以放置一个已经存在的对象的构造函数呢?

由于我不是以英语为母语的人,请尽可能用简单的词解释:) 非常感谢!

【问题讨论】:

  • 错误表示当向量是Track objects 的向量时,您尝试将 pointer 推送到 Track 对象(不是指针)。
  • 谢谢!因此,您认为只要它不是指针,它就会起作用。你知道如何让它成为非指针吗?
  • 要么不将指针传递给trackAdded 函数,要么取消对指针的引用。
  • @MartijnKor -- 如果您决定将其设为vector&lt;Track&gt;,请确保Track 是可安全复制的,即复制这些对象时不会产生副作用。 vector 将进行复制,如果 Track 没有正确的复制语义,您将遇到运行时问题。
  • @MartijnKor - 如果这是错误,那么这又回到了我的评论。 vector 将制作副本,并且如果您的类已删除制作副本的能力(通过使复制构造函数“删除”),则不能将其放置在向量中。您可以做的一件事是拥有一个指针向量(更好的智能指针),就像您在开始时所做的那样,并提供适当的代码将这样的指针放置在向量中。

标签: c++ qt object vector qvector


【解决方案1】:

您发布的代码不足(因此您的帖子可能会因为偏离主题而关闭——这是 SO 上的经典初学者错误),但我想这里合适的解决方案是使用一些自动指针类型。如果您的TrackVector 是保留Track 对象的所有权,那么最好的解决方案是拥有std::unique_ptr&lt;Track&gt; 元素:

std::vector<std::unique_ptr<Track>> TrackVector;
// filled like
TrackVector.emplace_back(new Track(args));

另一方面,如果所有权位于其他位置,您可以使用 std::shared_ptr 甚至原始指针(前提是您的布局保证指向 Track 的对象的生命周期超过 TrackVector 的生命周期)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 2015-05-15
    相关资源
    最近更新 更多