首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于输入初始化特定子类

基于输入初始化特定子类
EN

Stack Overflow用户
提问于 2015-04-02 12:38:44
回答 1查看 73关注 0票数 0

如果用户用-m或-f调用程序,我希望初始化一个特定的子类。

我写了一个这样的界面:

代码语言:javascript
复制
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;
};

在使用数据库的类中,我有以下几行:

代码语言:javascript
复制
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,只是为了取悦编译器,然而,这似乎是一种拙劣的方法。我该怎么做才能让这一切变得更好?

我想写些类似的东西

代码语言:javascript
复制
 DatabaseInterface db;
if(file_memory == "-m") {
    db = DatabaseMemory();
} else if ( file_memory == "-f") {
    db = DatabaseFile();
} else {
exit(1);
}
//.... do stuff

我该怎么做呢?在这一点上,我的界面没有给我任何东西。我想我可能错过了在这里使用它的意义。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-02 12:45:56

您需要间接(即指针或对基类的引用)来支持多态性。有点像

代码语言:javascript
复制
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,您可以用

代码语言:javascript
复制
db.reset(new DatabaseFile);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29413211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档