Я хотел бы установить указатели на некоторые элементы в моем векторном массиве на NULL (на основе критерия), а затем проверить, является ли указатель элемента NULL. Если указатель, указывающий на этот элемент, равен NULL, я удаляю этот элемент из векторного массива.
Мой компилятор выдает ошибку, говоря, что адресное выражение должно быть lvalue или указателем функции, и я не понимаю, почему (местоположение строки прокомментировано в коде). Поскольку я беру адрес значения, используя &
, я не вижу, является ли указатель, указывающий на этот элемент, NULL?
Я включил предыдущий код, так как ошибка может заключаться в нем,
Соответствующий код:
vector<particle> pl = c.particlelist;
vector<particle> noncollision = c.particlelist;
vector<vector<particle>> collisionlist = new vector<vector<particle>>();
for (int i = 0; i < c.numparticles-1; i++){
particle first = pl[i];
for (int j = i+1; j < c.numparticles; j++)
{
particle second = pl[j];
double d = distance(first, second);
if (d==0)
{
vector<particle> temp = {pl[i], pl[j]};
collisionlist.push_back(temp);
noncollision[i].setxposint(NULL);
noncollision[j].setxposint(NULL);
}
else
{
}
}
}
int j = 0;
for (int i = 0; i < noncollision.size(); i++)
{
if (&(noncollision[i].getxpos()) == NULL) ////// ERROR HERE
{
noncollision.erase(noncollision.begin()+i);
}
else
{
j++;
}
}
Я новичок в C++, и если бы вы могли предложить более элегантный способ сделать это или исправить, я был бы очень признателен. Я также предполагаю, что мой метод установки указателя на элемент noncollision[i].setxposint(NULL);
верен? Могу ли я вернуть целое число с помощью функции и взять адрес?
Функции для getxpos и setxposint:
int particle::getxpos(){
return xpos;
}
void particle::setxposint(int b){
xpos = b;
}
vector<vector<particle>> collisionlist = *new vector<vector<particle>>();
- ВТФ - person   schedule 05.08.2013int
и сравниваете его с нулем, что не является допустимой операцией. Адрес не будет нулевым. Точно так же ваш вызовsetxpostint(NULL)
попытается установить целое число равным нулю, и это не имеет смысла.NULL
определяется как0
, и хотя это арифметически допустимо, оно не делает того, что вы хотите. Я также разделяю путаницу H2CO3 в этом синтаксисе - понятия не имею, откуда вы его взяли, это просто не то, что следует использовать. - person DUman   schedule 05.08.2013Foo f = *new Foo
это плохо, я предлагаю вам поискать объяснение здесь. (Тем временем вы могли бы подумать об этом немного глубже — я уверен, что в какой-то момент вы это поймете.) - person   schedule 05.08.2013new*
), это нестандартное расширение :) - person sehe   schedule 05.08.2013new
для каждой переменной. С++ так не работает, можно просто объявить локальные переменные, и они будут автоматически выделены. Созданная вами конструкция для ее компиляции чрезвычайно удивит любого, кто хорошо разбирается в C++. И, как указывает @sehe, это вызывает утечку памяти. - person Mark Ransom   schedule 05.08.2013