如果用户用-m或-f调用程序,我希望初始化一个特定的子类。
我写了一个这样的界面:
class DatabaseInterface {
public:
virtual std::vector<Newsgroup> list_newsgroups() = 0;
virtual std::vector<Article> list_articles(const size_t article_id) const = 0;
virtual bool create_newsgroup(const std::string& newsgroup_name) = 0;
virtual bool create_article(const size_t newsgroup_id, const std::string& title, const std::string& author, const std::string& text) = 0;
virtual bool delete_newsgroup(const size_t newsgroup_id) = 0;
virtual std::pair<int,Article> get_article(const size_t newsgroup_id, const size_t article_id) const = 0 ;
virtual int delete_article(const size_t newsgroup_id, const size_t article_id) = 0;
};在使用数据库的类中,我有以下几行:
string file_memory;
DatabaseMemory db;
try {
file_memory = argv[2];
if(file_memory.compare("-file") == 0 || file_memory.compare("-f") == 0 ) {
DatabaseFile db;
cout << file_memory << endl;
} else if (file_memory.compare("-memory") == 0 || file_memory.compare("-m") == 0 ) {
DatabaseMemory db;
} else {
cerr << "Specify saving on disk with '-f' or in memory with '-m' " << endl;
exit(1);
}
} catch ( exception& e ) {
cerr << "Specify saving on disk or in memory" << endl;
exit(1);}
正如您所看到的,我正在尝试初始化一个派生的DatabaseMemory,只是为了取悦编译器,然而,这似乎是一种拙劣的方法。我该怎么做才能让这一切变得更好?
我想写些类似的东西
DatabaseInterface db;
if(file_memory == "-m") {
db = DatabaseMemory();
} else if ( file_memory == "-f") {
db = DatabaseFile();
} else {
exit(1);
}
//.... do stuff我该怎么做呢?在这一点上,我的界面没有给我任何东西。我想我可能错过了在这里使用它的意义。
发布于 2015-04-02 12:45:56
您需要间接(即指针或对基类的引用)来支持多态性。有点像
std::unique_ptr<DatabaseInterface> db;
if (file_memory == "-f") {
db = std::make_unique<DatabaseFile>();
} else if (file_memory == "-m") {
db = std::make_unique<DatabaseMemory>();
}如果您还没有使用C++14,您可以用
db.reset(new DatabaseFile);https://stackoverflow.com/questions/29413211
复制相似问题