C++ Выражение должно быть допустимым для изменения
#include <iostream>
class Character
{
private:
short x = -1;
short y = -1;
};
class Luchnik : public Character
{
public:
Luchnik(short x, short y) {
this->x = x;
this->y = y;
}
private:
short x = 0;
short y = 0;
};
int main() {
Luchnik *l = new Luchnik(1, 2);
Character a();
&a = l;
delete l;
return 0;
}
visual stuido пишет Выражение должно быть допустимым для изменения левосторонним значение.
вот скрин
Update
а можно в конструкторе Luchnik получить указатель вектора и менять vector[x][y] объект на Luchnil
я написал так, но не работает, я что-то плохо понимаю указатели и классы
Luchnik(short x, short y, std::vector<std::vector<Character>> map) {
this->x = x;
this->y = y;
Character* pm = &(map[x][y]);
pm = *this;
}
int main() {
std::vector<std::vector<Character>> board = new std::vector<std::vector<Character>>(3, std::vector<Character>(4));
Luchnik l(1, 2, *board);
return 0;
}
Ответы (2 шт):
Все верно, ведь присвоить что-то адресу объекта невозможно. Это все равно, что присвоить переменную значению:
int i = 5;
2 = i;
Здесь у вас возражений нет, что такое присваивание недопустимо?
Но в любом случае учтите, что
Character a();
представляет собой объявление функции без аргументов, возвращающей значение типа Character.
Объявление объекта a типа Character должно иметь иной вид:
Character a;
или
Character a{};
Подсказать, как именно исправить ваш код, можно будет только после того, как вы поясните, что вы хотите сделать, что этот код должен, по-вашему, делать.
Update
Если я верно понял вашу задачу, то вам надо создать вектор указателей vector<Character*>; тогда вы сможете присваивать указатель на потомка:
vector<Character*> vc;
......
vc[i] = new Luchnik(1, 2);
С vector<Character> вы не сможете работать из-за срезки, а вектор ссылок создается сложно, через прокси-класс reference_wrapper, мне кажется, вам с этим связываться не стоит. Через указатели проще.
Update 2 (мы этот вопрос вообще когда-то закроем? :))
Вероятно, вы хотите следующее:
Luchnik(short x, short y, std::vector<std::vector<Character*>>& map)
:x(x),y(y)
{
map[x][y] = this;
}
Еще раз: работать с std::vector<std::vector<Character>> не получится из-за срезки.
Вы пытаетесь изменить у переменной адрес по которому она лежит. С++ не позволяет такое сделать. Для того чтобы сослатся на существующий объект необходимо использоват указатели или ссылки.
В случае указателей код будет таким:
Character* a = l;
И такой для ссылки:
Character& a = *l;
