2013-10-07 76 views
4

我遇到了一个非常简单的程序问题。它抛出的错误:C++ - 没有适当的默认构造函数可用

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

IntelliSense: no default constructor exists for class "Player"

我有一种感觉它有事情做与声明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,这意味着在你的构造函数中分配给它的时候,它已经不带参数的构造的一个实例。

你需要做的是告诉该类如何初始化所谓的初始值设定项列表您追加到构造函数头;

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 

也可能会出现,如果你忘了,包括对相关对象的头文件。

这发生在我身上,所以我想在这里添加这个解决方案。

相关问题