Если объявить поле класса как ссылку на объект, то конструктор без параметров будет автоматически удалён и объявить его явно не представляется возможным, так как ссылка должна быть обязательно инициализирована до начала конструирования объекта. Такое возможно только в списке инициализации, а ссылку на объект возможно передать только как параметр конструктора класса. Так что либо используете конструктор с параметром, либо меняйте архитектуру класса Game. #include
using namespace std;
struct Pickaxe {
int x = 0;
};
class Game {
public:
Game() = delete; // своё намерение следует указать явно
explicit Game(Pickaxe& pickaxe) : pickaxe(pickaxe) {}
void set(int x) {
pickaxe.x = x;
}
int get()const {
return pickaxe.x;
}
private:
Pickaxe& pickaxe;
};
int main() {
Pickaxe pickaxe;
Game game(pickaxe);
cout
pickaxe& equ; // Вот здесь ты пытаешься сотворить какую-то дичь.
Если в классе используются ссылки, то они должны быть инициализированы в конструкторе и сам экземпляр класса должен создаваться с этими самыми ссылками.
Причем по контексту вообще непонятно, почему этот equ должен создаваться раньше, никаких логических предпосылок к этому нет. Так что заменяй его на указатель, добавляй конструктор без параметров и инициализируй его nullptr; дальнейшая логика должна опираться на то, что этот equ может быть неинициализирован.
Ссылки нельзя назначать изначально пустыми.
Вариант раз: использовать вместо ссылки указатель
Вариант два: добавить "левый" обьект и привязать ссылку к нему: class Game
{
....
private:
static WoodenPickaxe tmp; //левый обьект
int money = 10;
pickaxe& equ = tmp; //изначальная ссылка на левый обьект
};
WoodenPickaxe Game::tmp{}; //инициализация левого обьекта Вариант три: использовать обертки для ссылок reference wrapped