我试图让汤普森的构建算法在c + +中(我对语言有点新鲜)。但是我在执行类NFiniteAutomaton
的析构函数时遇到了一些困难。在NFiniteAutomaton
构造的某些部分,我有:如何实现在构造函数中使用自己的对象的析构函数
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
// ....
}
然后在我的代码的其他部分,我在主NFiniteAutomaton
创建指向single_ele.init_state
的和single_ele.final_state
的内容,因为我想重用状态,而不是用相同的属性创建新的。 的结构State
看起来是这样的:
struct State;
struct Transition {
State* to;
std::string symbol;
};
struct State{
std::vector<Transition> transitions;
};
所以,当我执行的NFiniteAutomaton
一个析构函数删除在堆上分配所有的结构,产生了我的问题,因为当single_ele
失控的范围,它会删除所有State
包含其他自动机正在使用的指针(因为析构函数被调用)。我认为的一个解决方案是创建一个方法Clear()
,该方法会在我需要时删除所有指针,并保留默认的析构函数。有一种方法只使用原始指针来实现此类的析构函数?
我觉得需要更多具体的例子来说明你在用'NFiniteAutomaton'做什么。对我而言,自动机应该是自包含的并且完全封装,绝不与其他任何事物共享状态。显然不是这里的情况。 –