我试图用c ++制作汤普森的构造算法(我对这种语言有些新意)。但是我在为我的班级NFiniteAutomaton() = default;
NFiniteAutomaton(std::string regex){
// A lot of code here
// ....
NFiniteAutomaton single_ele;
single_ele.init_state = new State;
single_ele.final_state = new State;
// A lot of code here
// ....
}
实施析构函数时遇到了一些困难。在single_ele.init_state
的构造函数的某些部分,我有:
single_ele.final_state
然后在我的代码的其他部分,我在主NFiniteAutomaton
中创建指向State
和struct State;
struct Transition {
State* to;
std::string symbol;
};
struct State{
std::vector<Transition> transitions;
};
内容的指针,因为我想要重用状态而不是创建具有相同属性的新状态。
结构NFiniteAutomaton
看起来像这样:
single_ele
因此,当我实现一个State
的析构函数来删除堆上分配的所有结构时,我的问题就会生成,因为当Clear()
超出范围时,它会删除所有Clicking.setOnClickListener(new View.OnClickListener(){
// do your thing here
})
指针包括其他自动机正在使用的指针(因为析构函数被调用)。我认为一个解决方案是创建一个方法android:clickable
,它可以随时删除所有指针,并保留默认的析构函数。有一种方法只使用原始指针来实现此类的析构函数吗?
答案 0 :(得分:1)
我认为一个解决方案是使方法
Clear()
随时删除所有指针,并保留默认的析构函数。
可能但为什么要创建一个类的用户应该知道的新函数,而不是让析构函数负责解除动态内存的分配?我不会这样做。
在调用NFiniteAutomaton
的析构函数之前,应将指针设置为nullptr。在析构函数中使用delete
表示init和final状态。
答案 1 :(得分:0)
如果要在构造函数外部使single_ele
对象持久化,请将其定义为类属性而不是本地对象。析构函数可以正常清理(不需要Clear()
函数),对象只会在程序结束时调用析构函数。
class NFIniteAutomaton {
protected:
static NFIniteAutomaton single_ele;
...
};