2013-10-07 2 views
4

У меня проблемы с очень простой программой. Он бросает ошибки:C++ - Нет подходящего конструктора по умолчанию

error C2512: 'Player' : no appropriate default constructor available

IntelliSense: no default constructor exists for class "Player"

У меня есть ощущение, что это что-то делать с объявления класса игрока в качестве частной переменной в Game.h, но я не могу понять, почему. Любая помощь приветствуется.

Game.h

#pragma once 
#include "Player.h" 

class Game 
{ 
public: 
    Game(void); 
    void start(void); 
    ~Game(void); 
private: 
    Player player; 
}; 

Game.cpp

#include "Game.h" 

Game::Game(void) 
{ 
    Player p(100); 

    player = p; 
} 

void Game::start() 
{ 
    ... 
} 

Game::~Game(void) 
{ 
} 

Player.h

#pragma once 
class Player 
{ 
public: 
    Player(int); 
    ~Player(void); 

private: 
    int wallet; 
}; 

Player.cpp

#include "Player.h" 
#include <iostream> 

using namespace std; 

Player::Player(int walletAmount) 
{ 
    wallet = walletAmount; 
} 

Player::~Player(void) 
{ 
} 
+0

Проблема не имеет ничего общего с тем фактом, что ваша переменная-член 'Player' объявлена' private'. Он имеет все, что связано с тем, как вы инициализируете его в конструкторе 'Game'. До сих пор вы получили несколько отличных ответов, которые объясняют это дальше. –

ответ

13

В отличие от C#, это заявление;

Player player; 

... является конкретизацией типа Player, что означает, что к тому времени, когда вы присваивающей его внутри конструктора, он уже построен без параметра.

Что вам нужно сделать, это рассказать классу, как инициализировать player в том, что называется список инициализатор, что вы добавляете в заголовке конструктора;

Game::Game(void) : player(100) 
{ 
... 

... который говорит компилятору использовать этот конструктор для инициализации player в первую очередь вместо первого используя конструктор по умолчанию без параметров и затем назначая к нему.

5

Только Player::Player(int) существует, так что вам необходимо инициализировать плеер в Game::Game()

Game::Game(void) 
    : player(100) 
{ 
} 
6

Когда вы строите экземпляр Game, он пытается построить свой член player используя конструктор по умолчанию. Инициализировать player в списке инициализации, а не в теле конструктора:

Game::Game() : player(100) 
{ 
    ... 
} 
3

В общем - не в этом случае - ошибка

no appropriate default constructor available 

также может произойти, если вы забыли включить файл заголовка для соответствующего объекта.

Это случилось со мной, поэтому я хотел добавить это решение здесь.

Смежные вопросы