C++ 沉思录第八章 代码整理,修改(好像书上的代码根本没法用,这只是按他那个思想写的,若发现错误请指正.)

头文件:

#ifndef EXPRESSION_H
#define EXPRESSION_H

#include <iostream>
#include <string>
using namespace std;

class ExpressionNode;

class Expression
{
public:
    friend ostream & operator << (ostream & o ,Expression &expression);
    Expression & operator = (Expression & expression);
    Expression & operator = (const Expression & expression);
    Expression();
    Expression(int n);
    Expression(const string& op,const Expression& opnd);
    Expression(string op,Expression left,Expression right);
        virtual ~Expression();
    protected:
        ExpressionNode * expressionNode;
        string handleType;
    private:
};

class ExpressionNode
{
    friend class Expression;
    friend ostream & operator << (ostream & o , ExpressionNode & node);
    public:
        ExpressionNode();
        virtual ~ExpressionNode();
        virtual void print( ostream & o )=0;
    protected:
        int count;
    private:
};



class BinaryNode :public ExpressionNode
{
    friend class Expression;
    public:
        BinaryNode(const string& oper_,const Expression &left_,const Expression & right_);
        void print( ostream & o);
        virtual ~BinaryNode();
    protected:
        string oper;
        Expression left;
        Expression right;
    private:
};


class IntNode:public ExpressionNode
{
    friend class Expression;
    public:
        IntNode(int k);
        virtual ~IntNode();
        void print( ostream & o);
    protected:
        int n;
    private:
};

class UnaryNode:public ExpressionNode
{
    friend class Expression;
    public:
        UnaryNode(const string & op,const Expression & expression);
        virtual ~UnaryNode();
        void print( ostream & o);
    protected:
        string oper;
        Expression opnd;
    private:
};




#endif // EXPRESSION_H


实现:


/*
** Copyright (C) QPSOFT.COM All rights reserved.
*/

#include "expression.h"

Expression::Expression():expressionNode(0)
{
    //ctor
}

Expression::~Expression()
{
    //dtor
	this->expressionNode->count--;
    cout<<handleType<<"Destruct!"<<endl;
	if(this->expressionNode->count==0)
	{
		cout<<"被delete掉"<<endl;
		delete this->expressionNode;
	}

}

ostream & operator << (ostream & o ,Expression &expression)
{
    o<<*(expression.expressionNode);
    return o;
}

Expression::Expression(int n)
{
    this->expressionNode=new IntNode(n);
    expressionNode->count=1;
    this->handleType="Int Hanle";
}
Expression::Expression(const string& op,const Expression & opnd)
{
    this->expressionNode=new UnaryNode(op,opnd);
    expressionNode->count=1;
    this->handleType="Unary Handle";
}
Expression::Expression(string op,Expression left,Expression right)
{
    this->expressionNode =new BinaryNode(op,left,right);
    expressionNode->count=1;
    this->handleType="Binary Handle";
}

Expression & Expression::operator = (Expression & expression)
{
    expression.expressionNode->count++;
	this->handleType=expression.handleType;
    if(this->expressionNode)
    {
        if((--(this->expressionNode->count))==0)
        {
            delete this->expressionNode;
        }
    }

    cout<<this->handleType<<"赋值一次";
    this->expressionNode=expression.expressionNode;
    return *this;
}

Expression & Expression::operator = (const Expression & expression)
{
    expression.expressionNode->count++;
	this->handleType=expression.handleType;
    if(this->expressionNode)
    {
        if((--(this->expressionNode->count))==0)
        {
            delete this->expressionNode;
        }
    }

    cout<<this->handleType<<"赋值一次";
    this->expressionNode=expression.expressionNode;
    return *this;
}

BinaryNode::~BinaryNode()
{
    //dtor
}

BinaryNode::BinaryNode(const string& oper_,const Expression &left_,const Expression & right_)
{
    this->oper = oper_;
    this->left=  left_;
    this->right = right_;
}

void BinaryNode::print( ostream & o)
{
    o<<'('<<left<<oper<<right<<')';
}

UnaryNode::UnaryNode(const string & op,const Expression & expression)
{
    //ctor
    this->oper = op;
    this->opnd = expression;
}

UnaryNode::~UnaryNode()
{
    //dtor
}

void UnaryNode::print( ostream & o)
{
    o<<'('<<oper<<opnd<<')';
}


IntNode::IntNode(int k)
{
    //ctor
    this->n=k;
}

IntNode::~IntNode()
{
    //dtor
}

void IntNode::print( ostream & o)
{
    o<<this->n;
}


ExpressionNode::ExpressionNode()
{
    //ctor
    cout<<"constructor"<<endl;
}

ExpressionNode::~ExpressionNode()
{
    //dtor
}

ostream & operator << (ostream & o ,ExpressionNode & node)
{
    node.print(o);
    return o;
}

main:

#include <iostream>
#include <string>
#include "expression.h"
using namespace std;

void test()
{
	Expression exp("*",Expression("+",3),Expression("-",7,9));
	cout<<exp;
}

int main()
{
   // Expression *exp=new Expression("*",2)
   test();
    return 0;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值