Попытка использовать std :: vector <MyClass> - PullRequest
3 голосов
/ 23 ноября 2011

У меня проблемы с использованием векторов моего класса.Мое намерение состоит в том, чтобы создавать новый объект при каждом нажатии клавиши пробела.Я уже написал некоторый код:

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);

Но в обоих случаях компилятор возвращает ошибки, такие как

error C3867: 'std :: vector <_Ty> ::push_back ': список отсутствующих аргументов при вызове функции;используйте '& std :: vector <_Ty> :: push_back', чтобы создать указатель на член с помощью [_Ty = someClass]

Я уже потратил около часа на поиск некоторых книг и чтение различных тем.в интернете, но ни один из них не был полезен.Я надеюсь на вас, ребята!

Ответы [ 5 ]

4 голосов
/ 23 ноября 2011

В первом случае вам не хватает аргумента для push_back ,.Это должен быть экземпляр SomeClass, , а не указатель на SomeClass, что, кстати, является проблемой во втором случае.

РЕДАКТИРОВАТЬ: Если выпросто хотите добавить элемент, созданный с помощью конструктора по умолчанию, вы можете просто сделать

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

и ссылаться на новый объект с помощью

v.back ()
2 голосов
/ 23 ноября 2011

Вы объявили вектор, содержащий объекты someClass, но попытались добавить указатель.

Напишите вместо

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

или

someClass temp; 
vMyVector.push_back(temp);
1 голос
/ 23 ноября 2011

У вас есть вектор объектов, затем вы сначала вообще ничего не пытаетесь push_back, а затем пытаетесь указать указатель push_back на ваш объект, а не на сам объект.

1 голос
/ 23 ноября 2011

Учитывая ваше определение vMyVector:

vector<someClass> vMyVector;

Вы не должны нажимать указатели на него, скорее, полные объекты:

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

Обратите внимание на *, который будет разыменовывать ваш указатель и даст объект типа someClass. Кроме того, благодаря комментарию sehe о необходимости удалить указатель после того, как вы поместите объект в массив, так как вы создаете копию объекта, и указатель остается висящим. Конечно, если вам действительно нужно удалить там, зависит от того, как вы используете указатель в остальной части функции, но в какой-то момент вам придется удалить его.

На самом деле вам вообще не нужно использовать new / delete (но я начал с вашего кода, чтобы показать, где находится ваша проблема). Вы просто делаете:

 someClass temp; 
 vMyVector.push_back(temp);
0 голосов
/ 23 ноября 2011

Если у вас есть vector<T>, то вам нужно указать T (или T &), когда вы звоните push_back().В вашем первом фрагменте кода вы вообще ничего не предоставляете.Во втором фрагменте кода вы нажимаете T *, а не T.

Попробуйте что-то вроде этого:

someClass temp;
...
vMyVector.push_back(temp);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...