C++ 从另一个子类调用虚函数
我已经被设置了一个任务来创建一个以中缀符号作为输入的rpn计算器。部分原因是它必须打印出流程的不同阶段。所以首先它应该将一个字符串分离成标记,然后存储在一个向量中。然后它应该将其转换为rpn符号(例如3+4->3 4+),这是我现在卡在上面的部分,也是我现在卡在上面的部分 有人建议我为此使用虚拟抽象函数。首先,我创建了一个带有抽象函数的类。然后我创建一个子类,它将字符串转换为存储在字符串向量中的标记,这部分工作正常。然后我应该创建另一个子类,它将输入字符串转换为rpn表示法,因此我必须在这个子类的开头调用函数来转换为令牌,这是我认为出错的地方 我已经得到了一些代码作为模板,到目前为止,它是非常错误的,所以可能有一些错误的语法是错误的 所以我把这个作为我的主要课程C++ 从另一个子类调用虚函数,c++,function,virtual,subclass,abstract,C++,Function,Virtual,Subclass,Abstract,我已经被设置了一个任务来创建一个以中缀符号作为输入的rpn计算器。部分原因是它必须打印出流程的不同阶段。所以首先它应该将一个字符串分离成标记,然后存储在一个向量中。然后它应该将其转换为rpn符号(例如3+4->3 4+),这是我现在卡在上面的部分,也是我现在卡在上面的部分 有人建议我为此使用虚拟抽象函数。首先,我创建了一个带有抽象函数的类。然后我创建一个子类,它将字符串转换为存储在字符串向量中的标记,这部分工作正常。然后我应该创建另一个子类,它将输入字符串转换为rpn表示法,因此我必须在这个子类
模板
类令牌流{
公众:
虚拟布尔进程(const std::string&input,std::vector&output)=0;
};代码>
然后将其作为第一个子类
class tokenifier: public tokenstream<std::string> {
public:
bool process(const std::string& input, std::vector<std::string>& output) {
//this part works fine, ive tested it.
};
类令牌生成器:公共令牌流{
公众:
布尔过程(常量std::字符串和输入,std::向量和输出){
//这部分很好,我已经测试过了。
};
然后我必须创建另一个子类,然后在它里面调用上面的函数,这就是它出错的地方
class infix2rpn: public tokenstream<std::string> {
private:
tokenifier *tokens;
public:
tokenifier(tokenstream *_tokens): tokens(_tokens) {} //I think this line is the problem
bool process(const std::string& input, std::vector<std::string>& output) {
//call the underlying tokenstream object
std::vector<std::string> infixtokens;
if(!tokens->process(input, infixtokens))
{
return false;
}
return shunting_yard(infixtokens, output);
}
bool shunting_yard(const std::vector<std::string>& input, std::vector<std::string>& output){
//i've tested the shunting_yard algorithm and it works fine
}
};
类infix2rpn:公共令牌流{
私人:
代币制造者*代币;
公众:
tokenizer(tokenstream*\u tokens):tokens(\u tokens){}//我认为这行就是问题所在
布尔过程(常量std::字符串和输入,std::向量和输出){
//调用底层tokenstream对象
std::向量内挤;
如果(!令牌->进程(输入,infixtoken))
{
返回false;
}
回流调车场(内出口、输出);
}
布尔调车场(常数标准:矢量和输入,标准:矢量和输出){
//我已经测试了调车场算法,效果很好
}
};
当我尝试编译它时,我得到了错误:“ISO C++禁止声明‘tokEnter’,没有类型[fpimix]。< /P>
所以我不明白的部分是如何从另一个子类调用其他虚函数
谢谢
这可能意味着是构造函数,但在这种情况下,方法的名称应该是infix2rpn
,与类名相同。
这个错误意味着,您指定的方法tokenizer
没有指定返回类型,只有构造函数和析构函数没有返回类型
请注意,void
也是返回类型的规范,在这种情况下,它意味着不返回任何内容。您的类被称为infix2rpn
,因此它的构造函数也应该被命名为infix2rpn
,而不是标记器
。这与虚拟函数无关
此外,您的属性应该是tokenstream*
,而不是tokenizer*
,因为您无法将在构造函数中获得的tokenstream*
转换为tokenizer*
tokenifier(tokenstream *_tokens): tokens(_tokens) {}