2017-04-26 2 views
0

Ich bin neu in C++ und arbeite an einem Pacman-Prototyp. Während ich versuchte, das Konzept des Polymorphismus zu verstehen, kam ich über dieses Problem. Jedes Mal, wenn ich versuche, einen Konstruktor oder ein Objekt für Ghost- und ScaredGhost-Klassen zu erstellen, komme ich mit der No-Mating-Funktion zum Aufruf von class :: class error.Keine Mating-Funktion zum Aufrufen der Klasse ::

Heres meiner Header-Datei:

class Enemies : public Window 
    { 
     public: 
      Enemies(const Window &window,int w,int h,int x,int y); 
      virtual ~Enemies(); 
      virtual void EnemyDraw() = 0; 
     protected: 
      int gh,gw;   //Height width 
      int gx,gy;    // x and y 

    }; 

    //-------------------------------------------------------- 
    class Ghost : public Enemies 
    { 
     public: 
      Ghost(); 
      void EnemyDraw(); 
    }; 
    //-------------------------------------------------------- 
    class ScaredGhosts : public Enemies 
    { 
     public: 
      void EnemyDraw(); 
    }; 

und die Umsetzung:

Enemies::Enemies(const Window &window,int w,int h,int x,int y): 
    Window(window), gw(w), gh(h), gx(x),gy(y) 
{ 
    //ctor 
} 
Enemies::~Enemies(){} 

//_________________________________________________________________________________________________________ 

void Ghost::EnemyDraw() 
{ 
    SDL_Rect rect; 
    rect.w = gw; 
    rect.h = gh; 

    rect.x = gx; 
    rect.y = gy; 

    SDL_SetRenderDrawColor(renderer,0,0,255,0); 
    SDL_RenderFillRect(renderer,&rect); 

} 
    Ghost::Ghost() 
    { 
    } 

//_________________________________________________________________________________________________________ 

void ScaredGhosts::EnemyDraw() 
{ 
    SDL_Rect rect; 
    rect.w = gw; 
    rect.h = gh; 

    rect.x = gx; 
    rect.y = gy; 

    SDL_SetRenderDrawColor(renderer,0,255,255,0); 
    SDL_RenderFillRect(renderer,&rect); 
} 

Dies ist nur die Basis dieser Klasse, aber ich kann ohne Überwindung dieses Problems nicht fortgesetzt werden.

+0

Es abd im allgemeinen Klassennamen nicht plural.s schwer zu sehen sein soll, wie "Feinde" kann ein "Fenster" sein. Außerdem würde ich vorschlagen, Ihr Spiel ohne Vererbung zu schreiben - die Vererbung wird von Anfängern stark überbeansprucht. –

Antwort

2
Ghost::Ghost() 
{ 
} 

Dieser Konstruktor versucht implizit, den Konstruktor ohne Argumente aller seiner Basistypen aufzurufen. Allerdings gibt es keinen No-Argument-Konstruktor von Enemies, von dem Ghost erbt, so dass dieser Aufruf fehlschlägt. (Hier kommt der "no passing call to Enemies :: Enemies()" her - der Compiler sagt Ihnen, dass Ghost::Ghost() versucht, diesen Konstruktor aufzurufen, aber es existiert nicht.)

Ein Weg zu lösen dieses Problem die gleichen Argumente im Ghost Konstruktor akzeptieren würde und leiten sie:

class Ghost : public Enemies { 
    public: 
     Ghost(const Window &window,int w,int h,int x,int y); 
     // ... 
}; 

Ghost::Ghost(const Window &window,int w,int h,int x,int y) 
    : Enemies(window, w, h, x, y) 
{ 
} 

Sie müssen die gleiche Sache mit ScaredGhost zu tun.

C++ 11 erlauben Sie Konstrukteuren wie diese zu erben, was wesentlich einfacher ist und weit weniger fehleranfällig:

class Ghost : public Enemies { 
    public: 
     using Enemies::Enemies; 
     // ... 
}; 
+0

Vielen Dank! Es half –

+0

@JuliusTumas, wenn es hilft, in Betracht ziehen, die Antwort zu akzeptieren –

Verwandte Themen