我遇到一个非常简单的程序有问题。它抛出错误:
error C2512: 'Player' : no appropriate default constructor available
IntelliSense: no default constructor exists for class "Player"
我觉得这与在Game.h中将Player类声明为私有变量有关,但我不明白为什么。任何帮助将不胜感激。
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 :(得分:14)
与C#相反,这个声明;
Player player;
...是类型Player
的实例化,这意味着当你在构造函数中分配它时,它已经构造成没有参数。
您需要做的是告诉班级如何在附加到构造函数标头的所谓初始化列表中初始化player
;
Game::Game(void) : player(100)
{
...
...告诉编译器首先使用该构造函数初始化player
,而不是先使用默认的无参数构造函数,然后然后分配给它。
答案 1 :(得分:7)
构造Game
的实例时,它会尝试使用默认构造函数构造其成员player
。在初始化列表中初始化player
,而不是在构造函数体内:
Game::Game() : player(100)
{
...
}
答案 2 :(得分:6)
仅存在Player::Player(int)
,因此您需要在Game::Game()
Game::Game(void)
: player( 100 )
{
}
答案 3 :(得分:5)
一般情况下 - 不是在这种情况下 - 错误
no appropriate default constructor available
如果您忘记包含相关对象的头文件,也可能会出现。
这件事发生在我身上,所以我想在这里添加这个解决方案。