2013-04-30 181 views
-3

Player.h构造函数的参数

#ifndef HEADER_GUARD_PLAYER 
#define HEADER_GUARD_PLAYER 

#include <string> 
using std::string; 


//Parent player class 
class Player 
{ 
     private:   
     protected: 
     string playerName; 
     int chipCount; 

     public: 
     //Constructor 
     Player(); 
     Player(string name); 

}; 

//Custom Players 

class PlayerSteven: public Player 
{ 
}; 
class PlayerBlake: public Player 
{ 
}; 
class PlayerTucker: public Player 
{ 
}; 
#endif 

Player.cpp

#include "Player.h" 
#define STARTCHIPS 1500 

Player::Player() 
{ 
    chipCount = STARTCHIPS; 
    playerName = "Default";   
}; 
Player::Player(string name) 
{ 
    playerName = name; 
}; 

Main.cpp的

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

using namespace std; 

int main() 
{ 
    Deck deck; 
    PlayerSteven steven = new PlayerSteven("Steven"); 
    PlayerBlake blake = new PlayerBlake("Blake"); 
    PlayerTucker tucker = new PlayerTucker("Tucker"); 

    deck.shuffle(); 
    int x = 0; 
    int y = 0; 
    for (int i = 0; i < 52; i++) 
    { 
     deck.nextCard(x,y); 
     cout << x << "," << y << endl; 
    } 
    system("PAUSE"); 
    return 0; 
} 

错误:

11 C:\用户\文档\ temp中\ p_comp.cpp没有用于调用PlayerSteven :: Play的匹配函数erSteven(为const char [7]) '

11 C:\用户\文档\ TEMP \ p_comp.cpp没有匹配函数调用`PlayerSteven :: PlayerSteven(为const char [7])'

音符C:\ Dev-Cpp \ PROJECTS \ Player.h:26 PlayerSteven :: PlayerSteven(const PlayerSteven &)

任何人都知道我可以得到这个编译?

谢谢。

+0

你试过了什么? – djechlin 2013-04-30 14:43:28

+2

为什么你让你的“自定义球员”强壮的类型?它们与基础'Player'类没有什么不同,并且你没有做任何与需要的类型相关的特定任何东西。例如,正确的方法是实例化实际类型,即Player Steven(“Steven”)。 – Chad 2013-04-30 14:46:09

+0

@djechlin:你什么意思?他试图编译这个问题中的代码。 – 2013-04-30 14:47:01

回答

2

在C++构造函数中没有继承。所以,你必须将它们添加在子类:

class PlayerSteven: public Player 
{ 
public: 
    PlayerSteven() 
    {} 
    PlayerSteven(string name) 
    :Player(name) 
    {} 
}; 

与同为中Player其他子类。

如果你有一个足够新的C++编译器11实际上你可以继承构造函数,但你必须这样做明确:

class PlayerSteven : public Player 
{ 
public: 
    using Player::Player; 
}; 
+0

在C++ 11中,使用Player :: Player应该就足够了(显然,在支持它的编译器上)。 – mfontanini 2013-04-30 14:41:36

+0

好吧我添加了每个子类的构造函数,但是我收到了新错误:从'PlayerSteven'转换为非标量类型'PlayerSteven'请求 – Steven 2013-04-30 14:54:15

+0

@Steven:是的,与前一个无关,并暗示在@Chad删除的答案中。这是C++,而不是Java或C#:不写'PlayerSteven steven = new PlayerSteven(“Steven”);',只是'PlayerSteven steven(“Steven”);'或者如果你需要它是动态的:'PlayerSteven * steven = new PlayerSteven(“Steven”);',但你必须在某处删除它。 – rodrigo 2013-04-30 15:02:24

1

您需要声明并定义为派生类型构造函数:

class PlayerSteven: public Player 
{ 
    PlayerSteven() {} 
    PlayerSteven(const std::string& s) : Player(s) {} 
}; 

等等。在C++ 11中,您可以使用inherited constructors

class PlayerSteven: public Player 
{ 
    using Player::Player; 
}; 

接下来,在你的主,你正试图从一个指针PlayerSteven对象初始化为PlayerSteven

PlayerSteven steven = new PlayerSteven("Steven"); 

你没有构造函数来执行这样的转换,这你可能不无论如何。你可以实例化一个PlaverSteven对象:

PlayerSteven steven("Steven");