表示表达式计算c++(多态性设计)
Represent expression calculation c++ (Polymorphism design)
我想在C++中实现一个非常简单的表达式计算器,例如计算
(3+2)*8
因此,我为这样的表达式创建了一个基类:
class Expression {
public:
virtual ~Expression() {}
// Returns the result of evaluating this expression.
virtual float eval() const = 0;
// Prints the expression. DO NOT evaluate before printing.
virtual void print() const = 0;
};
然后,为了表示数字,我只关心INT和FLOAT,我做了这个:
/*
* Number
*/
class Number : public Expression {
};
class IntNum : public Number {
public:
IntNum(int num) : m_value(num) {}
~IntNum() {}
float eval() const {return (float) m_value;}
void print() const {std::cout << m_value;}
protected:
int m_value;
};
class FloatNum : public Number {
public:
FloatNum(float num) : m_value(num) {}
~FloatNum() {}
float eval() const {return m_value;}
void print() const {std::cout << m_value;}
protected:
float m_value;
};
最后,我想表示ADD,它需要两个操作数:
/*
* Two oprand expression
*/
class TwoOpndExp : public Expression {
public:
TwoOpndExp(Expression* exp1, Expression* exp2) : m_exp1(exp1), m_exp2(exp2) {}
~TwoOpndExp() {}
protected:
Expression* m_exp1;
Expression* m_exp2;
};
/*
* Add expression
*/
class AddExp : public TwoOpndExp {
public:
float eval() const;
void print() const;
};
问题是:我写
TwoOpndExp(表达式*exp1,表达式*exp2):m_exp1(exp1),m_exp2(exp2){}
因为没有人知道"+"两边是什么,它可以是一个数字,就像"1+2"一样,也可以是相关的表达式,比如"1+(2^3)"。所以我认为构造函数的para类型应该是Expression*。但是,当我测试它时,就像:
IntNum* x = new IntNum(3);
FloatNum* y = new FloatNum(4.1);
AddExp* add = new AddExp(x, y);
编译器表示找不到的构造函数
AddExp*add=新的AddExp(x,y);
我知道这个类会把一些东西作为para-list来找到合适的构造函数,但是,对于这个问题,如何设计才能使它正确?
此问题可在现场解决:
http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-088-introduction-to-c-memory-management-and-c-object-oriented-programming-january-iap-2010/assignments/
参见ass5
谢谢。
您需要添加另一个构造函数:
AddExp(Expression* exp1, Expression* exp2) : TwoOpndExp(exp1, exp2) {}
如果没有这一点,TwoOpndExp
构造函数就不会被继承,因此不可用。
相关文章:
- 多态性和功能结合
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- C++boost序列化多态性问题
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 如何在多线程中正确使用unique_ptr进行多态性?
- 具有智能指针的多态性
- 在 C++ 中在堆栈上创建实例时如何保持多态性?
- 继承/多态性 - 我是否被迫使用"protected"变量?
- C++ 多态性在代码::块 17.12 中不起作用
- C++ 泛型和多态性:这种模式可行吗?
- 为什么我们实际上需要运行时多态性?
- 如何在这个简单的最小示例中实现多态性?
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 无法初始化已知大小的矢量指针,该大小不会因多态性而更改
- 运行时多态性和dynamic_cast需要澄清
- 如何调用指针类型的方法(禁用多态性)?
- 从基类调用函数的多态性
- 运行时多态性 - 箭头运算符访问了错误的成员?
- 表示表达式计算c++(多态性设计)