9

我在使用一个非常简单的程序时遇到了麻烦。它抛出错误:

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

IntelliSense: no default constructor exists for class "Player"

我觉得这与在 Game.h 中将 Player 类声明为私有变量有关,但我不明白为什么。任何帮助将非常感激。

游戏.h

#pragma once
#include "Player.h"

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

游戏.cpp

#include "Game.h"

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

    player = p;
}

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

Game::~Game(void)
{
}

播放器.h

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

private:
    int wallet;
};

播放器.cpp

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

using namespace std;

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

Player::~Player(void)
{
}
4

4 回答 4

23

与 C# 相比,此声明;

Player player;

...是 type 的实例化Player,这意味着当您在构造函数中分配它时,它已经在没有参数的情况下被构造了。

您需要做的是告诉类如何在附加到构造函数头player的所谓初始化列表中进行初始化;

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

...它告诉编译器首先使用该构造函数进行初始化player,而不是首先使用默认的无参数构造函数然后分配给它。

于 2013-10-07T19:51:40.297 回答
9

Player::Player(int)存在,所以你需要初始化播放器Game::Game()

Game::Game(void)
    : player( 100 )
{
}
于 2013-10-07T19:45:39.743 回答
9

一般来说 - 不是在这种情况下 - 错误

no appropriate default constructor available

如果您忘记包含相关对象的头文件,也可能发生。

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

于 2016-01-19T11:42:36.053 回答
8

当您构造 的实例时Game,它会尝试player使用默认构造函数构造其成员。在初始化player器列表中初始化,而不是在构造函数体内:

Game::Game() : player(100)
{
    ...
}
于 2013-10-07T19:46:29.293 回答