簡體   English   中英

虛函數設計問題

[英]virtual function design issue

我有一個基類,目前我有一個名為get_value()的方法,它應該返回適​​當轉換為各種原始數據類型的值。 因為,我們不能只有返回類型的虛擬方法,我必須做以下事情:

virtual void get_value(unsigned int index, unsigned char & r) const = 0;
virtual void get_value(unsigned int index, char & r) const = 0;
virtual void get_value(unsigned int index, unsigned short & r) const = 0;
virtual void get_value(unsigned int index, short & r) const = 0;
virtual void get_value(unsigned int index, unsigned int & r) const = 0;
virtual void get_value(unsigned int index, int & r) const = 0;
virtual void get_value(unsigned int index, float & r) const = 0;
virtual void get_value(unsigned int index, double & r) const = 0;

從維護的角度來看這非常煩人,並且由於用戶必須執行以下操作,因此使用有點尷尬:

unsigned char v;
obj->get_value(100, v);

無論如何,所有子類都必須覆蓋這些類型的事實是令人討厭的。 我想知道是否有人有任何建議要避免這種情況,或者以某種方式僅通過一個虛擬功能以更緊湊的方式做到這一點。

子類可以是這樣的:

void get_value(unsigned int index, unsigned char & r) const {get<unsigned char>(index, r);}
void get_value(unsigned int index, char & r) const {get<char>(index, r);}
void get_value(unsigned int index, unsigned short & r) const {get<unsigned short>(index, r);}
void get_value(unsigned int index, short & r) const {get<short>(index, r);}
void get_value(unsigned int index, unsigned int & r) const {get<unsigned int>(index,r);}
void get_value(unsigned int index, int & r) const {get<int>(index,r);}
void get_value(unsigned int index, float & r) const {get<float>(index,r);}
void get_value(unsigned int index, double & r) const {get<double>(index,r);}

這個專門的模板get方法為每個子類做了特定的事情。

您應該考慮創建不同的功能。

int getInt();
double getDouble();

等等。

看來您的調用代碼必須知道任何情況下的差異 由於您可以執行的操作(顯然至少)沒有真正的抽象,因此您可以明確區分。 模板和面向對象的類可能只會增加不必要的復雜性。

當然,為了判斷這一點,人們可能需要更多的背景。 只是我0.02€:)

您可能想看看模板 它們允許您指定類型,如下所示:

foo<float>(bar); // calls the float version
foo<int>(bar); // calls the int version

你可以有一個虛函數調用返回一個boost::variant如下所示:

using vartype = boost::variant<
    unsigned char,
    char,
    unsigned short,
    short,
    // ...
>;
virtual vartype get_value(unsigned int index) const = 0;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM