子类函数重写中带有默认值的省略参数

时间:2018-08-07 16:01:04

标签: c++

我正在为多个I / O类编写接口。

有一个功能可以在不同类型的文件(有时是html,sdb,txt,...)中查找信息:

bool Search(std::string file, std::string field)

但是,其中之一需要附加参数来补充SQL查询。在这种情况下,sdb需要指定该字段位于哪个表中。

我正在尝试以下操作(我知道它无法编译):

class fileIO{
  public:
    virtual ~FileIO(){};
    virtual bool Search(std::string file, std::string field,
                          std::string additional = 0 /* for sdb only */) = 0;
}
class readHTML : fileIO{
  public:
    bool Search(std::string file, std::string field); //does NOT override virtual method
  1. 有什么可以给我我想要的行为的东西吗?
  2. 这样的策略是否符合C ++标准?
  3. 我还可以添加什么来替换界面上的此类强制规定?

很抱歉,如果标题误导了我,我正在寻找一种替代方法。到目前为止,我找不到它。

3 个答案:

答案 0 :(得分:2)

我会说你不需要它。

在呼叫者网站上,只有两种可能性:您知道自己的特定fileIO实例是sdbIO,或者不是。如果这样做,则可以调用Search中定义的sdbIO的重载版本,以获取此附加信息。如果不这样做,那么您就不会这样做,sdbIO::Search应该根据其重载版本进行定义。

struct fileIO
{
    virtual bool Search(std::string file, std::string field) = 0;
}

struct sdbIO : fileIO
{
    bool Search(std::string file, std::string field, std::string additional);
    bool Search(std::string file, std::string field) override
    {
        Search(file, field, "");
    }
};

在呼叫方站点:

void f(fileIO& io)
{
    // I know this is a sdb:
    dynamic_cast<sdbIO&>(io).Search("/file", "text", "WHERE answer=42");

    // I don't
    io.Search("/file", "text");
}

注意:您真的需要这些字符串的副本吗?

答案 1 :(得分:0)

您可以在非公共接口中隐藏虚拟函数,并使公共接口(具有默认参数)为非虚拟。

function handleRoutes($name, $obj) {
    echo $obj->render($name . '.twig');
}

$router->map( 'GET', '/[*:id]', function ($id) {
    handleRoutes($id, $twig);
});

具有明显的派生:

struct Interface
{
     ...
     // public interface calls the abstract members.
     bool Search(string const&a, string const&b, string const&c = "") 
     {
         if(c.empty() && need_third_string())
             throw runtime_error("search requires an additional string argument");
         return search(a,b,c);
     }
   protected:
     virtual bool need_third_string() const = 0;
     virtual bool search(string const&, string const&, string const&) const=0;
};

答案 2 :(得分:0)

我认为以上两种处理方式没有任何问题。不过,我只有一个。

var flatUniqArr = []
var lines = []
Logger.log(visibleValueArr)
Logger.log(memberType)
for (var i = 0; i < colValueArr.length; i++){
  lines = colValueArr[i].toString().split('\n');
  var found = false;
  for(var j = 0; j < lines.length; j++){
    var data = lines[j].toLowerCase().split(':')
    if(data[0] == memberType.toString().toLowerCase() && data[1].indexOf(visibleValueArr.toString().toLowerCase()) != -1){
      found = true;
    }
  }
  Logger.log(found)
  if(found == false){flatUniqArr.push(colValueArr[i])} 
}

return flatUniqArr;