我必须写下我必须在其中制作 DFA 的项目。我无法弄清楚如何准确地编写我的构造函数才能避免出现以下错误 no matching function for call to 'DFA::DFA(int&, char [2], char [4][2], char&, char [1])'|
。欢迎任何帮助。这是代码:
#include <iostream>
#include<cstring>
using namespace std;
class DFA
{
int number_of_states;
char* alphabet;
char** transition_table;
char start_state;
char* final_states;
public:
DFA(int,char*,char**,char,char*);
};
DFA::DFA(int snumber_of_states,char* salphabet,char** stransition_table,char sstart_state, char* sfinal_states)
{
number_of_states= snumber_of_states;
int l1=strlen(salphabet);
alphabet=new char[l1+1];
for(int i=0;i<l1+1;i++)
{
alphabet[i]=salphabet[i];
}
transition_table=new char* [number_of_states];
for(int h=0;h<number_of_states;++h)
{
transition_table[h]=new char[l1+1];
}
for(int j=0;j<number_of_states;j++)
{
for(int k=0;k<l1+1;k++)
transition_table[j][k]=stransition_table[j][k];
}
start_state=sstart_state;
int l2=strlen(sfinal_states);
final_states=new char [l2+1];
for(int r=0;r<l2+1;r++)
{
final_states[r]=sfinal_states[r];
}
}
int main()
{
char start_state='0';
char final_states[1]={'3'};
int number_of_states=4;
char alphabet[2]={'a','b'};
char transition_table[4][2]={
{'1','1'},
{'2','1'},
{'0','3'},
{'3','-'}
};
DFA automaton(number_of_states,alphabet,transition_table,start_state,final_states);
}
最佳答案
错误no matching function for call to 'DFA::DFA(int&, char [2], char [4][2], char&, char [1])
是由于真正的二维数组(在本例中为 char[4][2]
)与 char**
不同。 .这是简单的解释(我不会深入探讨为什么它不一样,但这就是问题所在)。
此外,不要尝试将数组转换为 char**
“关闭编译器”——那将是一场灾难。由于使用 new[]
,您的代码也有内存泄漏无需调用 delete[]
.
这是一个 C++ 解决方案,可以避免在代码中使用如此多的 C 主义:
#include <iostream>
#include <string>
#include <vector>
typedef std::vector<std::string> StringArray;
class DFA
{
int number_of_states;
std::string alphabet;
StringArray transition_table;
char start_state;
std::string final_states;
public:
DFA(int, const std::string&, const StringArray&, char, const std::string&);
};
DFA::DFA(int snumber_of_states, const std::string& salphabet,
const StringArray& stransition_table, char sstart_state,
const std::string& sfinal_states) :
number_of_states(snumber_of_states),
alphabet(salphabet),
start_state(sstart_state),
transition_table(stransition_table),
final_states(sfinal_states) { }
int main()
{
char start_state='0';
std::string final_states = "3";
int number_of_states=4;
std::string alphabet = "ab";
StringArray transition_table;
transition_table.push_back("11");
transition_table.push_back("21");
transition_table.push_back("03");
transition_table.push_back("3-");
DFA automaton(number_of_states, alphabet, transition_table, start_state,
final_states);
}
注意 std::vector
的用法和 std::string
.上面的代码基本上是你的整个代码使用 new[]
所做的。和 delete[]
.代码很简短——没有调用 strlen
,没有循环,没有内存泄漏,一切都正确初始化(注意 member initialization list
的构造函数中的 DFA
)。
如果您以此为起点,您很可能会进一步编写程序来解决您的真正目标,即编写 DFA,而不是与字符指针和动态分配的内存作斗争。
编辑:这里是 main()
程序,但使用 C++ 11 的 uniform initialization
语法:
int main()
{
char start_state='0';
std::string final_states = "3";
int number_of_states=4;
std::string alphabet = "ab";
StringArray transition_table = {"11", "21", "03", "3-"};
DFA automaton(number_of_states, alphabet, transition_table, start_state,
final_states);
}
所以现在的代码比第一个版本更短。
关于c++ - DFA构造函数报错,有效声明怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23768441/