C++ 尝试使用std::vector<;MyClass>;

C++ 尝试使用std::vector<;MyClass>;,c++,object,vector,sdl,C++,Object,Vector,Sdl,我在使用自己的类的向量时遇到了问题。我的意图是在每次单击空格键时创建一个新对象。我已经编写了一些代码: 类 class someClass { public: short x; short y; someClass::someClass(); }; 类.cpp someClass::someClass() { x = 0; y = 0; } main.cpp using namepsace std; vector<someClass>

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

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

someClass::someClass()
{
    x = 0;
    y = 0;
}
main.cpp

using namepsace std;    
vector<someClass> vMyVector;
(...)
case SDLK_SPACE:
    vMyVector.push_back();
break;
但在这两种情况下,编译器都会返回如下错误

错误C3867:'std::vector::push_back':缺少函数调用 参数表;使用“&std::vector::push_back”创建指针 加入[_Ty=someClass]


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

根据您对vMyVector的定义:

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

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

 someClass temp; 
 vMyVector.push_back(temp);

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

改写

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


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

编辑: 如果您只想添加一个使用默认构造函数构造的元素,那么只需执行以下操作即可

v.resize (v.size () + 1)
并使用

v.back ()

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

如果你有一个
向量,那么当你调用
推回()
时,你需要提供一个
T
(或者
T&
)。在第一个代码段中,您根本没有提供任何内容。在第二个代码段中,您推的是
T*
,而不是
T

试着这样做:

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

天哪,这会导致很好的内存泄漏!您正在动态分配,只将其副本存储在向量中,并且永远忘记删除temp.still-1,因为完全没有意义地使用
new
,这不会导致内存泄漏,因为
push_back()
为您传入的对象创建一个副本,然后您将在刚刚创建的堆上拥有一个实例,并在向量中使用它构造对象副本。@r\u ahlskog:实际上不是,因为副本的存储由
std::vector管理。
(这可能会创建堆碎片,但我会将其推迟到分析阶段)@sergio稍微好一点;甚至更好
vMyVector.push_back(someClass());
vMyVector.push_back(std::move(temp));
甚至
vMyVector.resize(vMyVector.size()+1)
您很好,编写了一些类temp;vMyVector。push_back(temp);是解决方案。谢谢!谢谢,这就是问题所在!:)
v.resize (v.size () + 1)
v.back ()
someClass temp;
...
vMyVector.push_back(temp);