我是C++的新手,我正在編寫一個簡單的代碼來比較一個名爲Comparable的父類的子類的兩個對象。我想每個子類有它自己實現一個比較基礎上,他們持有的數據對象的方法,所以我用虛擬關鍵字:虛擬功能實現C++不工作
class Comparable {
public:
virtual int compare(Comparable *other);
};
例如,我的子類HighScoreElement將有自己的執行比較是的會將對象的分數與另一個HighScoreElement的分數進行比較。
這裏是我的子類HighScoreElement:
class HighScoreElement: public Comparable {
public:
virtual int compare(Comparable *other);
HighScoreElement(string user_name, int user_score); // A constructor
private:
int score;
string name;
};
但在我HighScoreElement比較實施,我第一次嘗試檢查當前對象的數據是一樣的其他數據。但是由於指向其他類的指針是Comparable類而不是HighScoreElement,因此即使HighScoreElement是Comparable的子類,我也無法在代碼中引用other->分數。
這是迄今爲止全碼:
#include <iostream>
using namespace std;
class Comparable {
public:
virtual int compare(Comparable *other);
};
class HighScoreElement: public Comparable {
public:
virtual int compare(Comparable *other);
HighScoreElement(int user_score, string user_name);
private:
string name;
int score;
};
HighScoreElement::HighScoreElement(int user_score, string user_name) {
name = user_name;
score = user_score;
}
int HighScoreElement::compare(Comparable *other) {
if (this->score == other->score) { // Compiler error right here, other->score is invalid.
// Code to do the comparing if two scores are equal...
}
}
我立即得到一個編譯錯誤,當我寫這篇文章的代碼:
if (this->score == other->score)
因爲其他沒有數據稱爲比分,但其子類HighScoreElement的確如此。如何修復我的函數實現,以便可以引用「其他」的數據?我知道我的問題可能聽起來含糊不清,但任何幫助將不勝感激!
一個簡單的解決辦法是使用'的dynamic_cast(其他)',它返回'nullptr'('0')的情況下,'other'不指向HighScoreElement'的'的實例(或從中得出)。不過,可能有更好的設計,但不包括'dynamic_cast'。 –
dyp
沒有什麼個人的,但這個代碼是醜陋的。看起來像Comparable作爲接口的某種java風格的c + +代碼?我的心碎了。 – kvv
@kw當我開始使用C++時,我的代碼非常糟糕。=)學習過程是一條泥濘的道路。隨着時間的推移,人們的代碼質量會提高。 –