C/C++

Ошибка C2280 предпринята попытка ссылки на удаленную функцию C++

Вот ошибка полностью:
Ошибка C2280 "Game::Game(void)": предпринята попытка ссылки на удаленную функцию
Строка 82 -> Game game;
Код: (Ошибка над int main)
 #include  
#include
#include
#include
#include
using namespace std;
class Game;
bool gameover = false;
enum Location {MENU = 1, MINING = 2, SHOP = 3, INV = 4, EXIT = 5};
Location loc = MENU;

class pickaxe
{
public:
pickaxe(string name,int pickspeed)
{
this->name = name;
this->pickspeed = pickspeed;
}
int GetPSpeed()
{ return pickspeed;}
int GetPickSpeed()
{ return pickspeed;}
string GetName()
{ return name;}


virtual void Dig(int addons = 1) = 0;
protected:
string name = "";
int pickspeed = 0;
};


class WoodenPickaxe : public pickaxe
{
public:
WoodenPickaxe() : pickaxe("Wooden Pickaxe", 10) { }

void Dig(int addons = 1) override
{
Sleep(pickspeed / addons);
}
};







class Game
{
public:
void Draw(char Input, int& tempC);
void ChangeMoney(string change, int add);
int GetMoney() { return money; }
char Input();
void Logic(char ach[], int sizeACH, char Input, int& tempC);

void Dig(pickaxe& pix)
{
pix.Dig();
money++;
}
void equipment(const pickaxe& pix)
{
equ = pix;
}

pickaxe& GetEqu()
{
return equ;
}

private:
int money = 10;
pickaxe& equ;
};


Game game; //ОШИБКА


int main()
{
setlocale(LC_ALL, "rus");
fstream GOF; // Создаем Game Options File
string GOFFile = "GameOptinsFile.txt"; //Файл Game Options File
GOF.open(GOFFile, fstream::in | fstream::out); //Открываем Game Options File
if (!GOF.is_open()) //Проверка на открытие файла
{
cout Logic(ach, sizeACH, Input, tempC);

switch (loc)
{
case MENU:
cout
Ссылки нельзя назначать изначально пустыми.
Вариант раз: использовать вместо ссылки указатель
Вариант два: добавить "левый" обьект и привязать ссылку к нему:
 class Game
{
....
private:
static WoodenPickaxe tmp; //левый обьект
int money = 10;
pickaxe& equ = tmp; //изначальная ссылка на левый обьект
};
WoodenPickaxe Game::tmp{}; //инициализация левого обьекта
Вариант три: использовать обертки для ссылок reference wrapped
Василий Лебедев
Василий Лебедев
51 417
Лучший ответ
Если объявить поле класса как ссылку на объект, то конструктор без параметров будет автоматически удалён и объявить его явно не представляется возможным, так как ссылка должна быть обязательно инициализирована до начала конструирования объекта. Такое возможно только в списке инициализации, а ссылку на объект возможно передать только как параметр конструктора класса. Так что либо используете конструктор с параметром, либо меняйте архитектуру класса 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
Janibek Janibek
Janibek Janibek
85 727
У тебя в седьмой строчки объявлен этот класс.
Попробуй закомментировать и проверить, заработает ли...
pickaxe& equ; // Вот здесь ты пытаешься сотворить какую-то дичь.

Если в классе используются ссылки, то они должны быть инициализированы в конструкторе и сам экземпляр класса должен создаваться с этими самыми ссылками.

Причем по контексту вообще непонятно, почему этот equ должен создаваться раньше, никаких логических предпосылок к этому нет. Так что заменяй его на указатель, добавляй конструктор без параметров и инициализируй его nullptr; дальнейшая логика должна опираться на то, что этот equ может быть неинициализирован.
Евгений Немов
Евгений Немов
30 169