超级郁闷的问题~
tree.h
--------------
class Node
{
public:
virtual ~Node();
virtual double Calc() const=0;
virtual bool IsLvaue() const;
virtual void Assign(double);
};
class NumNode:public Node //第一个问题
{
public:
NumNode(double num);
double Calc() const;
private:
const double _num;
};
//...
class BinNode:public Node
{
public:
BinNode(Node *p_left,Node *p_right);
~BinNode();
protected:
const Node *_p_left;
const Node *_p_right;
};
class AssignNode : public BinNode
{
public:
AssignNode(Node *p_left,Node *p_right);
double Calc () const;
};
tree.cpp
-------------------
NumNode::NumNode(double num):_num(num){}
double NumNode::Calc() const
{
return _num;
}
//...
double AssignNode::Calc() const //这里是第2个问题
{
double x = _p_right-> Calc();
_p_left-> Assign(x);
return x;
}
错误提示:
1.
tree.obj : error LNK2019: 无法解析的外部符号 "public: virtual __thiscall Node::~Node(void) " (??1Node@@UAE@XZ),该符号在函数 "public: virtual void * __thiscall Node::`scalar deleting destructor '(unsigned int) " (??_GNode@@UAEPAXI@Z) 中被引用
2.
c:\cpp.pjt\vs 2005\caculator\scanner\tree.cpp(112) : error C2662: 'Node::Assign ' : cannot convert 'this ' pointer from 'const Node ' to 'Node & '
怎么解决呢?
[解决办法]
因为double AssignNode::Calc() const 有const修饰函数
所以这个函数不能修改成员变量
而_p_left-> Assign(x);这个可能修改了_p_left指针所指向的内容.
要么将Node::Assign()声明为const类型
要么去掉double AssignNode::Calc() const这里的const
[解决办法]
析构函数没有定义
声明为const成员函数却要改变变量值是欺骗编译器的不可取做法
[解决办法]
(1)Node::~Node只有声明没有定义。“无法解析的外部符号”意思就是找不到其定义。
(2)_p_left-> Assign(x);这里的“_p_left”是个const对象,不能在它上面调用非const的Assign成员函数。