2015-04-07 62 views
1

我有一個「mediaInfo」的基類,有三個派生類「Book」「Video」和「Music」。在我的主文件中,我有一個聲明爲類型「mediaInfo」的矢量,該類型動態分配內存並指定矢量元素,以根據測試腳本的輸入鍵入「mediaInfo」「Book」「Video」或「Music」。代碼的另一個功能是按類型(書本,視頻,音樂,媒體信息),名稱和媒體值對矢量元素進行排序。我有名字了,並且正在努力如何按類型排序。如果需要,我可以提供代碼。謝謝。C++如何按類類型排序向量

回答

5

向MediaInfo添加虛擬方法以提供排名信息。例如:

class MediaInfo { 
public: 
    virtual int rank() = 0; 
}; 

class Book : MediaInfo { 
public: 
    virtual int rank() { return 100; } 
}; 

class Video : MediaInfo { 
public: 
    virtual int rank() { return 200; } 
}; 

那麼你可以通過obj->rank()等信息進行排序;

+0

這是一個非常好的解決方案,但是請注意它使'MediaInfo'抽象,因此無法實例化。你可以通過在等級中使用一個虛函數來解決這個問題(如果需要的話),而不是'MediaInfo'類中的純虛函數。 – Mohammad

1

由於C++ 98有一個operator調用typeid,你可以使用它。
例子:

#include <iostream> 
#include <typeinfo> 
using namespace std; 

int main() { 
    int i; 
    cout << typeid(i).name(); 
    return 0; 
} 

輸出:
int
你可以把任何類型的數據不僅內置。

+0

實際上它不是一種方法,並且從C++ 98開始就存在。 –

+0

更正了謝謝。 –

1

雖然我看到它不鼓勵,但另一種(技術上)有效的排序方式是使用typeid。快速示例:

std::vector<MediaInfo*> list; 
list.push_back(new Book()); 
list.push_back(new Video()); 
list.push_back(new Book()); 
list.push_back(new MediaInfo()); 

std::sort(list.begin(), list.end(), [](MediaInfo* a, MediaInfo* b){ 
    return typeid(*a).hash_code() < typeid(*b).hash_code(); 
}); 

這就是說,其他答案中提到的虛擬方法可能是更好的實現方法。
有關typeid陷阱的更多信息可以參考here.

+0

生成的hash_code是根據typename的字典順序還是別的嗎? – CinCout

+0

@GargAnkit我相信hash_code的返回值是未指定的(有更多的信息[這裏](http://en.cppreference.com/w/cpp/types/type_info/hash_code))。但是,如果字典順序很重要,您可以通過typeid(someObject).name()輕鬆排序。但是,返回值是編譯器特有的。 – Skiphs