2011-11-22 82 views
2
#pragma once 
#include "Player.h" 

class Player; 
//class SmallHealth; 

const int kNumOfCards = 3; //for Player class also 
const int kCardLimit = 3; 

class Cards 
{ 
private: 
protected: 
    int turnsInEffect; 
    Player *owner; 
public: 
    Cards() 
    {turnsInEffect = 1;} 
    void AssignOwner(Player &player) 
    { 
     owner = &player; 
    } 
    virtual void PlayCard() 
    {} 
    virtual ~Cards(void) 
    {} 

}; 

class SmallHealth : public Cards 
{ 
public: 
    void PlayCard() 
    { 
     turnsInEffect = 1; 
     owner->SetHealth(owner->GetHealth() + 5); 

     //check if health goes over 
     if(owner->GetHealth() > owner->GetHealthLimit()) 
     { 
      owner->SetHealth(owner->GetHealthLimit()); 
     } 
     turnsInEffect--; 
    } 
}; 

我想通過聲明類球員,我不會得到這些錯誤:混淆遠期聲明

error C2027: use of undefined type 'Player 

看到的宣言「球員」

error C2227: left of '->SetHealth' must point to ... 

檢查誤差2027年,似乎我必須在Card類之前明確地擁有整個班級,但我認爲前面的班級宣言會使其變得沒有必要。我如何設置它是根據Player類創建並分配一個子類,並存儲在Player類中。繼承Cards類的子類將調用Player類的函數。我正在經歷一段艱難的時間,確保兩個班級確定其他班級。

+0

使用通常的命名約定,你不應該需要'class Player'的前向聲明(其接口大概是* Player.h中的* defined *,否)。 – dmckee

回答

3

在這種情況下,C++類的前向聲明只會告訴編譯器您正在使用的類型是一個類。

這對於標題通常很有用,因爲您只需要知道該類型是一個類。包括類的頭文件需要更多的編譯時間。

但是在實現中,它是不同的。對於前向類,編譯器將不知道其成員,方法等。

爲此,您需要包含類的頭文件。

例如,只有正向類,你不能這樣做:

owner->GetHealth(); 

至於有沒有辦法讓編譯器知道GetHealth方法在Player類存在,只有向前類。

請注意,您可能在您的AssignOwner方法中遇到問題,因爲您使用標題實施該方法。我在C++上有點生疏,因爲我大部分時間都在做C,但是我認爲你應該只在類頭文件中聲明原型,然後在實現文件中實現實際的方法,包括正確的頭文件。

+0

我試過註釋掉前面的聲明,只使用include「Player.h」,現在我得到:1> Player.obj:error LNK2005:「void __cdecl CardSelection(class Cards * *,int)」(?CardSelection @@ YAXPAPAVCards @@ H @ Z)在game1.obj中已經定義了1> F:\ game1 \ Debug \ game1.exe:致命錯誤LNK1169:找到了一個或多個乘法定義的符號 – user998797

+0

也應該將子類從到實施文件?我可以在頭文件中使用forward聲明,然後在實現文件中使用include頭文件,實際上它現在可以正常工作 – user998797

+0

,上面列出的錯誤實際上是由於函數不在其中。謝謝 – user998797

0

前向聲明允許你聲明一個指針或對一個類型的引用,但實際使用指針或引用時你必須有完整的類定義。您還需要類成員或局部變量的完整定義。