读书人

超级郁闷的有关问题

发布时间: 2012-03-01 10:25:46 作者: rapoo

超级郁闷的问题~
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成员函数。

读书人网 >C++

热点推荐