C++ – Geen geschikte standaardconstructor beschikbaar

Ik heb problemen met een heel eenvoudig programma. Het gooit de fouten:

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

IntelliSense: no default constructor exists for class "Player"

Ik heb het gevoel dat het iets te maken heeft met het declareren van de Player-klasse als een privévariabele in Game.h, maar ik zie niet in waarom. Alle hulp wordt zeer op prijs gesteld.

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;
};

Speler.cpp

#include "Player.h"
#include <iostream>
using namespace std;
Player::Player(int walletAmount)
{
    wallet = walletAmount;
}
Player::~Player(void)
{
}

Antwoord 1, autoriteit 100%

In tegenstelling tot C#, deze verklaring;

Player player;

…is een instantie van het type player, wat betekent dat tegen de tijd dat u het in de constructor toewijst, het al is geconstrueerd zonder een parameter.

Wat u moet doen, is de klas vertellen hoe playermoet worden geïnitialiseerd in een zogenaamde initializerlijstdie u aan de constructorheader toevoegt;

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

…die de compiler vertelt om die constructor te gebruiken om playerin de eerste plaats te initialiseren in plaats van eerst de standaard constructor zonder parameters te gebruiken en vervolgenseraan toe te wijzen .


Antwoord 2, autoriteit 39%

In het algemeen – niet in dit geval – de fout

no appropriate default constructor available

kan ook voorkomen als u bent vergeten het headerbestand voor het gerelateerde object op te nemen.

Dit is mij overkomen, dus ik wilde deze oplossing hier toevoegen.


Antwoord 3, autoriteit 30%

Alleen Player::Player(int)bestaat, dus je moet de speler initialiseren in Game::Game()

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

Antwoord 4, autoriteit 30%

Wanneer u een instantie van Gamemaakt, probeert deze zijn lid playerte construeren met behulp van de standaardconstructor. Initialiseer playerin de initialisatielijst, niet in de body van de constructor:

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

Other episodes