Ошибка c2280 предпринята попытка ссылки на удаленную функцию c++ - Вопросы по С+

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

Регистрация
12 Июл 2013
Сообщения
96
Репутация
-3
Спасибо
0
Монет
0
Вот ошибка полностью:

Ошибка 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::eek:ut); //Открываем Game Options File

if (!GOF.is_open()) //Проверка на открытие файла

{

cout Logic(ach, sizeACH, Input, tempC);



switch (loc)

{

case MENU:

cout
 
Регистрация
24 Ноя 2013
Сообщения
86
Репутация
-3
Спасибо
0
Монет
0
Если объявить поле класса как ссылку на объект, то конструктор без параметров будет автоматически удалён и объявить его явно не представляется возможным, так как ссылка должна быть обязательно инициализирована до начала конструирования объекта. Такое возможно только в списке инициализации, а ссылку на объект возможно передать только как параметр конструктора класса. Так что либо используете конструктор с параметром, либо меняйте архитектуру класса 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
 
Регистрация
19 Окт 2013
Сообщения
87
Репутация
0
Спасибо
0
Монет
0
pickaxe& equ; // Вот здесь ты пытаешься сотворить какую-то дичь.

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

Причем по контексту вообще непонятно, почему этот equ должен создаваться раньше, никаких логических предпосылок к этому нет. Так что заменяй его на указатель, добавляй конструктор без параметров и инициализируй его nullptr; дальнейшая логика должна опираться на то, что этот equ может быть неинициализирован.
 
Регистрация
6 Сен 2013
Сообщения
77
Репутация
0
Спасибо
0
Монет
0
У тебя в седьмой строчки объявлен этот класс.
Попробуй закомментировать и проверить, заработает ли...
 
Регистрация
4 Дек 2013
Сообщения
75
Репутация
0
Спасибо
0
Монет
0
Ссылки нельзя назначать изначально пустыми.
Вариант раз: использовать вместо ссылки указатель
Вариант два: добавить "левый" обьект и привязать ссылку к нему: class Game
{
....
private:
static WoodenPickaxe tmp; //левый обьект
int money = 10;
pickaxe& equ = tmp; //изначальная ссылка на левый обьект
};
WoodenPickaxe Game::tmp{}; //инициализация левого обьекта Вариант три: использовать обертки для ссылок reference wrapped
 
Сверху Снизу