繁体   English   中英

C2512错误C2512没有适当的默认构造函数

[英]c++ Error error C2512 no appropriate default constructor available

我正在尝试使用VS-2013在C ++中实现纸牌游戏,并且我有一个“ Player”类。 “播放器”类是抽象的,因为该类的实际对象都不会初始化。 取而代之的是,它只能被继承到4种不同的播放器类(具有4种不同的播放策略)-从“ PlayerType1”到“ PlayerType4”。

这是我的Player.h文件:

#ifndef PLAYER_H_
#define PLAYER_H_

#include <iostream>
#include "Hand.h"
using namespace std;

class Player : public Hand {
private:
    const string name;
protected:
    Hand myHand;
public:
    string getName();   //Returns the name of the player
    virtual int getShapeToAsk() = 0;
    virtual int getPlayerToAsk() = 0;
    virtual ~Player();
};

class PlayerType1 : public Player {  //For strategy 1
    PlayerType1();
    virtual int getShapeToAsk() override;
    virtual int getPlayerToAsk() override;
    ~PlayerType1();
};

class PlayerType2 : public Player {  //For strategy 2
    PlayerType2();
    virtual int getShapeToAsk() override;
    virtual int getPlayerToAsk() override;
    ~PlayerType2();
};

class PlayerType3 : public Player {  //For strategy 3
private:
    int myNumber, numOfPlayers, nextPlayer;
public:
    PlayerType3(int myNumber, int numOfPlayers);
    virtual int getShapeToAsk() override;
    virtual int getPlayerToAsk() override;
    ~PlayerType3();
};

class PlayerType4 : public Player {  //For strategy 4
private:
    int myNumber, numOfPlayers, nextPlayer;
public:
    PlayerType4(int myNumber, int numOfPlayers);
    virtual int getShapeToAsk() override;
    virtual int getPlayerToAsk() override;
    ~PlayerType4();
};

#endif

这是我的Player.cpp文件:

#include <iostream>
#include <vector>
#include "Hand.h"
#include "Player.h"
using namespace std;

//Player functions

string Player::getName(){
    return (this->name + " " + this->toString());
}

Player::~Player(){}

//PlayerType1 functions

PlayerType1::PlayerType1(){}

int PlayerType1::getShapeToAsk(){
    int maxCount = 0, maxValue, currValue, count;
    for (std::vector<Card*>::reverse_iterator i = this->myHand.getCards().rbegin(); i != this->myHand.getCards().rend(); i++){
        count = 1;
        currValue = (**i).getValue();
        for (i; (i != this->myHand.getCards().rend()) && ((**i).getValue() == currValue); ++i){
            count++;
        }
        if (count > maxCount){
            maxCount = count;
            maxValue = currValue;
            if (maxCount == 4) // no need to look at the rest of the hand
                break;
        }
    }
    return maxValue;
}

int PlayerType1::getPlayerToAsk(){ return -1; } //-1 means "I am a player of type 1 or 2". Game's responsibility to change later.

PlayerType1::~PlayerType1(){}

//PlayerType2 functions

PlayerType2::PlayerType2(){}

int PlayerType2::getShapeToAsk(){
    int minCount = 5, minValue, currValue, count;
    for (std::vector<Card*>::iterator i = this->myHand.getCards().begin(); i != this->myHand.getCards().end(); i++){
        count = 1;
        currValue = (**i).getValue();
        for (i; (i != this->myHand.getCards().end()) && ((**i).getValue() == currValue); ++i){
            count++;
        }
        if (count < minCount){
            minCount = count;
            minValue = currValue;
            if (minCount == 1) // no need to look at the rest of the hand
                break;
        }
    }
    return minValue;
}

int PlayerType2::getPlayerToAsk(){ return -1; } //-1 means "I am a player of type 1 or 2". Game's responsibility to change later.

PlayerType2::~PlayerType2(){}

//PlayerType3 functions

PlayerType3::PlayerType3(int myNumber, int numOfPlayers){
    this->myNumber = myNumber;
    this->numOfPlayers = numOfPlayers;
    if (myNumber == 1) this->nextPlayer = 2;
    else this->nextPlayer = 1;
}

int PlayerType3::getShapeToAsk(){
    int maxCount = 0, maxValue, currValue, count;
    for (std::vector<Card*>::reverse_iterator i = this->myHand.getCards().rbegin(); i != this->myHand.getCards().rend(); i++){
        count = 1;
        currValue = (**i).getValue();
        for (i; (i != this->myHand.getCards().rend()) && ((**i).getValue() == currValue); ++i){
            count++;
        }
        if (count > maxCount){
            maxCount = count;
            maxValue = currValue;
            if (maxCount == 4) // no need to look at the rest of the hand
                break;
        }
    }
    return maxValue;
}

int PlayerType3::getPlayerToAsk(){
    int temp = this->nextPlayer;
    this->nextPlayer++;
    while ((this->nextPlayer == this->myNumber) || (this->nextPlayer > this->numOfPlayers)){
        if (this->nextPlayer == this->myNumber) this->nextPlayer++;
        if (this->nextPlayer > this->numOfPlayers) this->nextPlayer = 1;
    }
    return temp;
}

PlayerType3::~PlayerType3(){}

//PlayerType4 functions

PlayerType4::PlayerType4(int myNumber, int numOfPlayers){
    this->myNumber = myNumber;
    this->numOfPlayers = numOfPlayers;
    if (myNumber == 1) this->nextPlayer = 2;
    else this->nextPlayer = 1;
}

int PlayerType4::getShapeToAsk(){
    int minCount = 5, minValue, currValue, count;
    for (std::vector<Card*>::iterator i = this->myHand.getCards().begin(); i != this->myHand.getCards().end(); i++){
        count = 1;
        currValue = (**i).getValue();
        for (i; (i != this->myHand.getCards().end()) && ((**i).getValue() == currValue); ++i){
            count++;
        }
        if (count < minCount){
            minCount = count;
            minValue = currValue;
            if (minCount == 1) // no need to look at the rest of the hand
                break;
        }
    }
    return minValue;
}

int PlayerType4::getPlayerToAsk(){
    int temp = this->nextPlayer;
    this->nextPlayer++;
    while ((this->nextPlayer == this->myNumber) || (this->nextPlayer > this->numOfPlayers)){
        if (this->nextPlayer == this->myNumber) this->nextPlayer++;
        if (this->nextPlayer > this->numOfPlayers) this->nextPlayer = 1;
    }
    return temp;
}

PlayerType4::~PlayerType4(){}

我收到以下错误:

Error       error C2512: 'Player' : no appropriate default constructor available    <PATH>\player.cpp

共有4个该类型的错误,每个错误都指向PlayerType1到PlayerType4的构造函数。

当我在“ Player”类中添加一个空的默认构造函数时,它解决了该问题,并且构建成功。 但是,我看不到为什么需要为“ Player”类定义默认的构造函数,因为我从未初始化该类的对象。

我还应该提到我的项目中还有另一个类(“ Card”类),该类是抽象的,可以被其他类(“ FigureCard”和“ NumericCard”)继承,并且也没有构造函数和派生类有自己的构造函数,不会造成任何错误。 我看不出有什么区别。

我搜索了其他问题,但它们都与以下情况有关:未定义默认构造函数,并且尝试在代码中的其他位置对该类进行初始化。 这不是我的情况,因为我没有初始化“ Player”类的对象,仅初始化了4个派生类。

请帮忙! 先感谢您。

即使Player类是抽象类,也必须定义一个构造函数,因为您的类具有成员。 当创建派生类(任何PlayerType)类的实例时,它将调用基类的构造函数。 这就是继承的工作方式...

在那种情况下,使其受到保护(将其公开将是无用的,因为它是纯虚拟类)。

您的Player类具有一个private: const string name; 会员。 看你的Card类; 我敢打赌它没有这样的成员。 就是这样。

问题是, const string name; 必须以某种方式初始化member,并且由于它是private ,因此必须在Player类内对其进行初始化。 (语言规则禁止从派生类初始化类的私有成员。)因此, Player类必须具有用于初始化name成员的构造函数。 空的构造函数可以实现这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM