DFA构造函数错误,如何进行有效声明
DFA constructor error, what to do for valid declaration?
我必须写下这个项目,我必须做一个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-isms:
#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
的调用,没有循环,没有内存泄漏,并且一切都被正确初始化(注意DFA
的构造函数中的member initialization list
)。如果你从这个开始,你很可能会进一步编写程序来解决你的真正目标,那就是写一个DFA,而不是与char指针和动态分配的内存作斗争。
编辑:这是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);
}
所以代码现在变得比第一个版本更短。
这里的问题是您的第三个参数,它没有所需的类型。
引用编译器(gcc 4.9)的错误信息:
prog.cpp:14:1:注意:参数3从' char[4][2] '到' char** '没有已知的转换prog.cpp:4:7: note: constexpr DFA::DFA(const DFA&)
要解决这个问题,只需将行改为:
DFA (int、char * char [4] [2], char, char *);
和
DFA::DFA(int snumber_of_states,char* salphabet, char stransition_table[4][2],char sstart_state, char* sfinal_states)
请注意,虽然这使您的代码编译和运行不会崩溃,但在c++中编写这不是一个好方法。
- C++/11 auto 关键字是在更有效时推导参数进行按引用传递,还是始终按值传递?
- 将顶点位置从顶点传递到片段着色器 - 仅在使用 Nsight 进行调试时有效
- 如何有效地用第二个值对向量对进行分组
- 如何有效地在OpenCV Mat和GpuMat上进行元素处理?
- C VTable如何有效?(在Q中进行示例)
- 如何使用 stl 容器有效地存储对象?(即根据其字段的值进行搜索)
- 相对于另一个向量对一个向量进行排序 - 最有效的方法
- 可能以有效的方式在模拟的循环中进行多线程
- 如何有效地对__m256i向量的字节进行重新排序(将int32_t转换为uint8_t)?
- 在排序字符串向量中进行有效搜索
- 使用QWTPlotCurve进行有效的曲线绘图
- 有效地对整个内存块进行位移位
- 要求使用cout/cin进行有效输入
- 用C++对作为数据给出的任意函数进行有效求值
- 对不可变树进行有效的随机更新
- 使用多关键字地图进行有效搜索
- 在具有非关键字类型的集合中进行有效搜索
- DFA构造函数错误,如何进行有效声明
- 组件之间如何进行有效的通信
- 如何初始化CUDA,以便我可以进行有效的执行时间测量