gpt4 book ai didi

C++ 多态接口(interface)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:28:54 24 4
gpt4 key购买 nike

我正在尝试创建一种方法来处理许多不同版本的协议(protocol),类似于问题 How to handle different protocol versions transparently in c++? .我同意继承链可以很好地解决这个问题。

这就是我在 Java 中的做法:创建一个 IParser 接口(interface),并有几个 ParserV0ParserV1、...类,相互继承并实现IParser

我知道由于某些多重继承和虚拟 技巧,在 C++ 中创建该结构是可能的。 关键在于:在 Java 中,如果我想要一个解析器,我想,我可以说 IParser parser = getCorrectVersion(...)。我会得到一些 ParserV0 等版本,实现 IParser 并调用我需要的方法。

C++ 中最后一步的等效项是什么?我似乎没有办法要求任何实现另一个类然后能够调用其方法的类。

编辑:

这是我尝试执行 jtedit 建议的操作,因为我在 StackOverflow 上看到了类似的建议:

class IParser {
public:
virtual const string doSomething(params) = 0;
};

class ParserPreVersion : public IParser {
public:
const string doSomething(params) {
// do some thing
}
};

class ParserFactory {
...
public:
const IParser* generateParser() {
return new ParserPreVersion();
}
};

在我的代码的另一部分,我说

const IParser parser = *(ParserFactory().generateParser());

不过,我一直在使用这段代码及其变体遇到编译时错误,这让我提出了这个问题。

In member function 'const IParser* generateParser()':
error: cannot allocate an object of abstract type 'ParserPreVersion'
note: because the following virtual functions are pure within 'ParserPreVersion':
note: virtual const std::string IParser::doSomething(params)

还有

error: cannot declare variable 'parser' to be of abstract type 'const IParser'
note: since type 'const IParser' has pure virtual functions

我不明白为什么我有第一个,但第二个在某种程度上是意料之中的,并且是我问题中的主要问题。

编辑 2

以及我对 Scis 建议的尝试(声明类和函数的代码是相同的)

unique_ptr<IParser> getParser() {
return unique_ptr<IParser>(new ParserV0());
}

auto parser(getParser());

这一次,我得到了一个vtable 查找错误,因为它似乎在寻找IParser 中的函数定义。

最终编辑:

我意识到我的代码有点乱,我缺少一些参数修饰符,因此虚拟修饰符和覆盖修饰符不匹配。这些错误很有意义。感谢您的帮助!

最佳答案

您可以使用抽象基类并将所需函数创建为 virtual,如前所述,我唯一建议的是使用 unique_ptr 而不是原始指针您不必在使用完内存后自行删除内存(类似于您在 Java 中的操作):

这里是一个示例:

unique_ptr<IParse> getParser(int x){
switch (x){
case 1:
return unique_ptr<IParse>(new P1());
break;
case 2:
return unique_ptr<IParse>(new P2());
break;
}
return nullptr;
}

int main() {
auto p1(getParser(1));
p1->foo();

auto p2(getParser(2));
p2->foo();
return 0;
}

其中 foo 声明为:virtual void foo() = 0;。查看完整示例 here .

关于C++ 多态接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24173094/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com