作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个由 ValueNode 和 OperatorNode 继承的类 GenericNode。OR_Node 继承 OperatorNode。
#include <iostream>
#include <vector>
template< typename T_Value >
class GenericNode
{
public:
GenericNode() {} ;
virtual ~GenericNode() {} ;
// virtual T_Value evaluate() { std::cout << "BAD I'm abstract, who call me?" << std::endl ;} ;
virtual T_Value evaluate() = 0 ;
} ;
template< typename T_Value >
class ValueNode : public GenericNode<T_Value>
{
public:
ValueNode() {} ;
ValueNode( T_Value arg0 )
{
this->aValue = arg0 ;
}
void setValue( T_Value arg0 )
{
this->aValue = arg0 ;
}
~ValueNode() {} ;
protected:
T_Value aValue ;
public:
virtual T_Value evaluate()
{
return this->aValue ;
}
} ;
template< typename T_Value >
class OperatorNode : public GenericNode<T_Value>
{
public:
OperatorNode() {} ;
OperatorNode( GenericNode<T_Value>* arg0 , GenericNode<T_Value>* arg1 )
{
std::cout << "aValue: " << arg0->evaluate() << std::endl ;
std::cout << "aValue: " << arg1->evaluate() << std::endl ;
this->left = arg0 ;
this->right = arg1 ;
std::cout << "aValue: " << this->left->evaluate() << std::endl ;
std::cout << "aValue: " << this->right->evaluate() << std::endl ;
}
virtual T_Value evaluate() { std::cout << "BAD I'm abstract OperatorNode, who call me?" << std::endl ;} ;
virtual ~OperatorNode() {} ;
//protected:
GenericNode<T_Value>* left ;
GenericNode<T_Value>* right ;
} ;
template< typename T_Value >
class OR_Node : public OperatorNode<T_Value>
{
public:
~OR_Node() {} ;
OR_Node( GenericNode<T_Value> *arg0 , GenericNode<T_Value> *arg1 )
{
OperatorNode<T_Value>( arg0 , arg1 ) ;
}
public:
virtual T_Value evaluate()
{
std::cout << "ok here " << std::endl ;
std::cout << "-> " << this->left->evaluate() << std::endl ;
//return this->left->evaluate() + this->right->evaluate() ;
}
} ;
int main()
{
std::vector< GenericNode< int >* > myVec ;
ValueNode<int> One , Two , Three , Four , Five ;
One.setValue( 1 ) ;
Two.setValue( 2 ) ;
Three.setValue( 3 ) ;
Four.setValue( 4 ) ;
Five.setValue( 5 ) ;
OR_Node<int> orOne( &Three , &Four ) ;
//std::cout << "----> " << orOne.evaluate() << std::endl ;
myVec.push_back( &orOne ) ;
myVec.push_back( &One ) ;
myVec.push_back( &Two ) ;
myVec.push_back( &Three ) ;
myVec.push_back( &Four ) ;
myVec.push_back( &Five ) ;
// ValueNode< int > aVN( 1 ) ;
while (!myVec.empty())
{
std::cout << "-> " << myVec.back()->evaluate() << std::endl ;
myVec.pop_back();
}
return 0 ;
}
输出是:
aValue: 3
aValue: 4
aValue: 3
aValue: 4
-> 5
-> 4
-> 3
-> 2
-> 1
ok here
Segfault
我不明白为什么这行代码:
std::cout << "aValue: " << this->left->evaluate() << std::endl ;
工作正常,线路
std::cout << "-> " << this->left->evaluate() << std::endl ;
产生段错误。
谢谢! :D
最佳答案
OR_Node( GenericNode<T_Value> *arg0 , GenericNode<T_Value> *arg1 )
{
OperatorNode<T_Value>( arg0 , arg1 ) ;
}
这段代码:
OperatorNode<T_Value>
OperatorNode<T_Value>
类型的临时对象, 通过 arg0
和 arg1
因此 OperatorNode<T_Value>
的成员在 OR_Node<T_Value>
内仍然是未初始化的指针。
初始化基类子对象的正确方法是使用成员初始化列表:
OR_Node( GenericNode<T_Value> *arg0 , GenericNode<T_Value> *arg1 )
: OperatorNode( arg0, arg1 )
{
}
关于二级层次类 : do not understand why it does not work 中的 C++ 多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14736532/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!