c_cpp cpp对于使用动态转换和内存的可评估节点的想法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp cpp对于使用动态转换和内存的可评估节点的想法相关的知识,希望对你有一定的参考价值。
#include <iostream>
/**
* prototype for evaluatable tree
*/
enum EvalType {
EvalType_Int,
EvalType_Add
};
/* Base eval class
* has a type and a result node.
* the result node carries the last evaluatable result
*/
class EvalNode
{
public:
EvalNode(): _result(nullptr) {}
~EvalNode() { delete _result; }
EvalType getType() const {
return _type;
}
void setType(EvalType type) {
_type = type;
}
const EvalNode* getResult() const {
return _result;
}
void delResult() {
delete _result;
_result = nullptr;
}
bool hasResult() const { return _result != nullptr; }
/**
* this resets the result node based off the
* child node values.
*/
virtual void eval() const {
_result = this;
}
private:
EvalNode* _result;
EvalType _type;
};
/**
* class to represent int
*/
class IntNode : public EvalNode
{
public:
IntNode(int value = 0): _value(value) {
setType(EvalType_Int);
}
~IntNode(){}
int getValue() const { return _value; }
void setValue(int val) { _value = val; }
private:
int _value;
};
class AddNode : public EvalNode
{
public:
AddNode(int lfs, int rfs):
_lfs(new IntNode(lfs)),
_rfs(new IntNode(rfs))
{
setType(EvalType_Add);
}
AddNode(EvalNode* lfs = nullptr, EvalNode* rfs = nullptr):
_lfs(lfs), _rfs(rfs)
{
setType(EvalType_Add);
}
~AddNode() {
delete _lfs;
delete _rfs;
}
void eval() const {
if(_lfs != nullptr)
_lfs.eval();
if(_rfs != nullptr)
_rfs.eval();
IntNode* ilfs = dynamic_cast<IntNode*>(_lfs);
IntNode* irfs = dynamic_cast<IntNode*>(_rfs);
if(hasResult()) {
delResult();
}
_result = new IntNode(ilfs.getValue() + irfs.getValue());
}
private:
EvalNode* _lfs;
EvalNode* _rfs;
};
int main(int argc, char const* argv[]) {
std::cout << "Hello World!\n";
}
以上是关于c_cpp cpp对于使用动态转换和内存的可评估节点的想法的主要内容,如果未能解决你的问题,请参考以下文章
c_cpp 评估反向波兰表示法
c_cpp 可评估语言的第一个原型
c_cpp c中自我评估型系统的原型。
c_cpp LeetCode - 等式方程的可满足性
c_cpp 可评估表达式中的新计算模型。
c_cpp 给你一个文本文件太大,不适合内存和3个字符串A,B,C。对于每个字符串,你有一个列出位置o的排序数组