2015-04-07 40 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