C++ C++;递归指针函数调用
我目前有一个基类C++ C++;递归指针函数调用,c++,pointers,pass-by-reference,C++,Pointers,Pass By Reference,我目前有一个基类Expr和一些派生类,如AddExpr,MultExpr和NumExpr。我试图重载一个常规的print()函数,该函数递归调用其成员的print()函数,这些成员是指向其他Expr对象的指针 //Addition Expression AddExpr::AddExpr( Expr* l, Expr* r ) { left = l; right = r; } string AddExpr::print() { string s; stringstr
Expr
和一些派生类,如AddExpr
,MultExpr
和NumExpr
。我试图重载一个常规的print()
函数,该函数递归调用其成员的print()
函数,这些成员是指向其他Expr
对象的指针
//Addition Expression
AddExpr::AddExpr( Expr* l, Expr* r ) {
left = l;
right = r;
}
string AddExpr::print() {
string s;
stringstream out;
out << "(+" << left->print() << right->print() << ")";
s = out.str();
}
NumExpr::NumExpr( string n ) {
number = atoi( n.c_str() );
}
string NumExpr::print() {
string s;
stringstream out;
out << number;
s = out.str();
return s;
}
这将打印出1和2,但在加法器上有问题
感谢您的帮助
编辑:
my expression类的标题:
class Expr {
public:
virtual string name();
virtual string print();
};
class AddExpr : public Expr {
public:
AddExpr(Expr* l, Expr* r);
string print();
private:
Expr* left;
Expr* right;
};
class NumExpr : public Expr {
public:
NumExpr( string v );
string print();
private:
int number;
};
AddExpr::print()不返回任何值。AddExpr::print()不返回任何值。我发现您的AddExpr::print()方法有两个问题:
左侧
和右侧
之间放置任何空格string AddExpr::print() {
string s;
stringstream out;
out << "(+" << left->print() << " " << right->print() << ")";
s = out.str();
return s;
}
stringaddexpr::print(){
字符串s;
流出来;
out我发现您的AddExpr::print()方法有两个问题:
它实际上并没有返回任何东西。你至少应该得到一个编译器警告,如果不是错误的话
它不会在左侧
和右侧
之间放置任何空格
试试这个:
string AddExpr::print() {
string s;
stringstream out;
out << "(+" << left->print() << " " << right->print() << ")";
s = out.str();
return s;
}
stringaddexpr::print(){
字符串s;
流出来;
请编辑您的问题并添加相关类的完整源代码(Expr
,AddExpr
,NumExpr
)?另外,您的示例的实际输出是什么,您希望得到什么?您忘了在AddExpr::print()中返回s;
)
请编辑您的问题并添加相关类的完整源代码(Expr
,AddExpr
,NumExpr
)?另外,您的示例的实际输出是什么,您希望得到什么?您忘了在AddExpr::print()中返回s;
)
谢谢!这就是问题所在,print()
函数现在正在正确输出我的表达式。非常感谢,尽管我希望g++至少会警告我类似的事情this@Jason:是的,但您必须要求它启用警告。我通常使用-Wall-Wextra
(还有-Werror
,将它们转化为错误,这样就没有人可以忽略它们)。@MikeSeymour谢谢这是一个很棒的技巧,我通常在windows端用visualstudio编写代码,但不幸的是,我目前无法访问它,所以我在linux端通过g++和vim来实现:)不过经验不错。谢谢!这就是问题所在,print()
函数现在正正确输出我的表达式。非常感谢,尽管我希望g++至少会提醒我类似的事情this@Jason:是的,但您必须要求它启用警告。我通常使用-Wall-Wextra
(还有-Werror
,将它们转化为错误,这样就没有人可以忽略它们)。@MikeSeymour谢谢这是一个很棒的技巧,我通常在windows端用visualstudio编写代码,但不幸的是,我目前无法访问它,所以我在linux端通过g++和vim来实现:)不过体验不错。
string AddExpr::print() {
stringstream out;
out << "(+" << left->print() << " " << right->print() << ")";
return out.str();
}