【问题标题】:Trying to use std::vector<MyClass>尝试使用 std::vector<MyClass>
【发布时间】:2011-11-23 10:18:07
【问题描述】:

我在使用自己班级的向量时遇到问题。我的意图是在每次空格键单击时创建一个新对象。我已经写了一些代码:

classes.h

class someClass
{
public:
    short x;
    short y;
    someClass::someClass();
};

classes.cpp

someClass::someClass()
{
    x = 0;
    y = 0;
}

main.cpp

using namepsace std;    
vector<someClass> vMyVector;
(...)
case SDLK_SPACE:
    vMyVector.push_back();
break;

我也尝试在 SDLK_SPACE 的情况下添加额外的一行:

someClass *temp = new someClass(); 
vMyVector.push_back(temp);

但在这两种情况下,编译器都会返回类似

的错误

错误 C3867:'std::vector<_ty>::push_back':缺少函数调用 参数列表;使用 '&std::vector<_ty>::push_back' 创建一个指针 加入 [_Ty=someClass]

我已经花了大约一个小时在互联网上搜索一些书籍和阅读各种主题,但没有一个有用。我把希望寄托在你们身上!

【问题讨论】:

  • 你没问题,写 someClass temp; vMyVector.push_back(temp);是解决方案。谢谢!

标签: c++ object vector sdl


【解决方案1】:

在第一种情况下,您缺少push_back 的参数。它应该是SomeClass 的实例,不是指向 SomeClass 的指针,顺便说一下,这是第二个问题 案例。

编辑: 如果你只想添加一个使用默认构造函数构造的元素,你可以这样做

v.resize (v.size () + 1)

并用

引用新对象
v.back ()

【讨论】:

    【解决方案2】:

    您声明了包含 someClass 对象的向量,但尝试添加一个指针。

    改写

    someClass *temp = new someClass(); 
    vMyVector.push_back(*temp);
    

    someClass temp; 
    vMyVector.push_back(temp);
    

    【讨论】:

    • 谢谢,这就是问题所在! :)
    【解决方案3】:

    你有对象向量,然后你首先尝试 push_back 什么都没有,然后你尝试 push_back 指向你的对象的指针,而不是对象本身。

    【讨论】:

      【解决方案4】:

      鉴于您对 vMyVector 的定义:

      vector<someClass> vMyVector;
      

      你不应该向它推送 指针,而是完整的对象:

       someClass *temp = new someClass(); 
       vMyVector.push_back(*temp);
       delete temp;
      

      注意*,它将取消引用您的指针并给出someClass 类型的对象。另外,感谢 sehe 关于在将对象推送到数组后需要删除指针的评论,因为您正在制作对象的副本并且指针将悬空。当然,如果你真的需要删除那里,取决于你如何在函数的其余部分使用指针,但在某些时候你需要删除它。

      实际上,您根本不需要使用 new/delete(但我从您的代码开始显示您的问题所在)。你只需这样做:

       someClass temp; 
       vMyVector.push_back(temp);
      

      【讨论】:

      • OMG - 这会导致很好的内存泄漏!您正在动态分配,只是将 copy 存储在向量中,并且永远忘记删除 temp。
      • 仍为 -1 以完全无意义地使用 new
      • 这不会导致内存泄漏,因为push_back() 会复制您传入的对象,然后您将在刚刚创建的堆上拥有一个实例,并从中构造对象副本在向量中。
      • @r_ahlskog:实际上没有,因为副本的存储由std::vector 管理(它可能会创建堆碎片,但我会将其推迟到分析阶段)
      • @sergio 稍微好一点;甚至更好 vMyVector.push_back(someClass());vMyVector.push_back(std::move(temp)); 甚至是 vMyVector.resize(vMyVector.size()+1);
      【解决方案5】:

      如果您有vector&lt;T&gt;,那么您需要在致电push_back() 时提供T(或T &amp;)。在您的第一个代码 sn-p 中,您根本没有提供任何东西。在您的第二个代码 sn-p 中,您推送的是 T *,而不是 T

      试试这样的:

      someClass temp;
      ...
      vMyVector.push_back(temp);
      

      【讨论】:

        猜你喜欢
        • 2018-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-17
        • 2020-09-28
        • 1970-01-01
        • 1970-01-01
        • 2017-04-30
        相关资源
        最近更新 更多