2016-01-04 58 views
0
class Bishop : public ChessPiece { 
    public: 
    friend class Queen; 
    Bishop(string colorIn, string nameIn); 

    //isLegalMove for bishop 
    //implemented this function for queen 
    bool isLegalBishopMove(int xSrc, int ySrc, int xDest, int yDest); 

    //Can move along any diagnol 
    virtual bool isLegalMove(int xSrc, int ySrc, int xDest, int yDest) ; 
}; 


class Queen : public ChessPiece { 
public: 
    //friend class Bishop; 

    Queen(string colorIn, string nameIn); 
    //friend bool Bishop::isLegalBishopMove(int xSrc, int ySrc, int xDest, int yDest); 

    virtual bool isLegalMove(int xSrc, int ySrc, int xDest, int yDest); 
}; 

我希望我的女王班級實施isLegalMove能夠調用函數isLegalBishopMove。我該如何解決這個問題?我嘗試使用朋友,但它沒有奏效。我不理解C++引用。如何調用其他課程的功能?

+1

也許使用一箇中產階級:'class Diagnol_Mover:public ChessPiece;班女王:公共診斷_移動;'。 –

+0

老實說,每個棋子的「邏輯」是一樣的,唯一的區別是他們可以移動的地方,這是數據。我會使用枚舉而不是子類。 –

+0

@MooingDuck:如果沒有計算機分析需求,這是很好的建議,但如果有可能有不同的邏輯來評估這件作品的優勢/危險程度如何,可以選擇可能的最佳情侶動作等等。儘管如此,Benjamin's如果他在這個問題的模型問題上得到他的頭腦,不太可能會實現一些複雜化的事情...... –

回答

5

我認爲自由功能或公共 靜態方法沒有錯。我更喜歡他們繼承。

static bool Queen::isLegalMove(Position poscurr, Position posnew) 

static bool Bishop::isLegalMove(Position poscurr, Position posnew) 
+0

謝謝。好點 –

1

你可以有Queen::isLegalMove使用Bishop::isLegalMove - 想必Castle的 - 如下:

virtual bool isLegalMove(int xSrc, int ySrc, int xDest, int yDest) 
{ 
    return Bishop().isLegalMove(xSrc, ySrc, xDest, yDest) || 
      Rook().isLegalMove(xSrc, ySrc, xDest, yDest); 
} 

的幾點:

  • 這些功能明顯(的人誰甚至知道一個小國際象棋),不需要知道任何關於Queen piec E在他們正在調用的,所以從這個角度來看,他們可能是static,但他們不能使用虛擬調度,你似乎想要做的,這可能會真正幫助您保持代碼的簡單被稱爲

    • 功能不需要Board對象 - 以請求移動的方式檢查件 - 意味着Board可用作全局或單件;這是一個在編程氣餒一般,因爲它使得它很難做的事情一樣創造Board是你可以在一個固定數量的移動達到一棵樹,以評估其移動「計算機」的球員應該
  • 我推薦針對公開推導Queen來自Bishop或其他片段,它不是 - 試圖保留一個「是」的關係爲公共派生; Queen是(類型)Bishop是不正確的,後來可能會造成意想不到的麻煩作爲你的邏輯Bishop小號無意中影響Queen小號

+0

僅供參考,它被稱爲一個車,而不是一個「城堡」 – NoseKnowsAll

+0

@NoseKnowsAll:由你或許;至少在澳大利亞,「城堡」是經常使用的,所以我會使用它。 –

+0

其實,由國際象棋聯合組織。例如參見ICC或FIDE。話雖如此,你和你的朋友可以隨心所欲地稱呼它。但在這樣的國際網站上,把它稱爲「車」是有道理的。 (對不起,挑剔:/) – NoseKnowsAll

2

你不能調用橫向方法層次的類。如果Queen不是Bishop的子類,那麼嘗試調用Bishop類的方法沒有任何意義,friend指令在此無法提供幫助,因爲您嘗試通過包含另一個類的行爲來添加類定義的行爲與前者沒有直接關係。

我看到了兩個可能的解決方案:

  • 使該方法static,這樣就可以從任何方面
  • 使用多個virtual繼承自由地稱它爲

第二種方法會是這樣的以下,但我不鼓勵考慮這一點,因爲多重繼承有其注意事項,在嘗試使用之前必須充分理解。

class ChessPiece 
{ 
    virtual bool isLegalMove(int xSrc, int ySrc, int xDest, int yDest) = 0; 
}; 

class Rook : public ChessPiece { 
... 
}; 

class Bishop : public ChessPiece { 
... 
}; 

class Queen : public virtual Rook, public virtual Bishop { 
    bool isLegalMove(int xSrc, int ySrc, int xDest, int yDest) override { 
    return Bishop::isLegalMove(xSrc,ySrc,xDest,yDest) || Rook::isLegalMove(xSrc, ySrc,xDest,yDest); 
    } 
}; 

記住,通過移動的源位置isLegalMove並沒有多大意義,在面向對象的環境中,源位置應該,除非你正在使用的對象層次恰好被包含在ChessPiece實例實現行爲(而不是狀態)。

+0

每個棋子的棋子位置都保存在棋盤類 –

+0

的棋盤對象中雖然塑造棋盤的最天生的方式是擁有一個二維單元格陣列,但這不是唯一的方法。你可以很容易地擁有一個'std :: vector '而忘記了棋盤。或者'std :: unordered_map ,ChessPiece>'如果你需要快速查找。甚至還有一個由雙指針數組支持的矢量。解決方案很多。 – Jack