我正在为多个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
很抱歉,如果标题误导了我,我正在寻找一种替代方法。到目前为止,我找不到它。
答案 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;