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 шт):

Автор решения: Harry

Все верно, ведь присвоить что-то адресу объекта невозможно. Это все равно, что присвоить переменную значению:

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>> не получится из-за срезки.

→ Ссылка
Автор решения: Yura

Вы пытаетесь изменить у переменной адрес по которому она лежит. С++ не позволяет такое сделать. Для того чтобы сослатся на существующий объект необходимо использоват указатели или ссылки.

В случае указателей код будет таким:

Character* a = l;

И такой для ссылки:

Character& a = *l;
→ Ссылка