2014-05-20 45 views
0

我必须写下我必须制作DFA的这个项目。我无法确定如何编写我的构造函数以避免出现以下错误no matching function for call to 'DFA::DFA(int&, char [2], char [4][2], char&, char [1])'|。任何帮助都很受欢迎。下面是代码:DFA构造函数错误,有效声明该怎么办?


#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); 
} 
+1

你现在的代码实际上都是'C',而且很少有C++。我强烈建议你使用'std :: string'而不是'char *'和'std :: vector '而不是'char **'或'new char []'。否则,你将很可能有其他问题(与内存相关),比如何向构造函数发出调用要困难得多。 – PaulMcKenzie

回答

1

错误no matching function for call to 'DFA::DFA(int&, char [2], char [4][2], char&, char [1])是由于真正的2维阵列(在本例中为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::vectorstd::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); 
} 

所以现在的代码比第一个版本更短。

+0

出于好奇,为什么你不使用StringArray的统一初始化? – soandos

+0

@soandos - 我可以,但希望该解决方案适用于C++ 11之前的编译器。 – PaulMcKenzie

+0

更新回答添加'初始化语法'版本。 – PaulMcKenzie

0

这里的问题是你的第三个参数,它不具备所需的类型。

从错误信息引用从编译器(gcc 4.9):

prog.cpp:14:1:注:从没有已知的转换为参数的3 '的char [4] [2]' 至'字符**' prog.cpp:4:7:注:constexpr DFA :: DFA(常量DFA &)

要解决,你有问题,只是改变了线路,所以要:

DFA(int,c HAR *,炭[4] [2],焦炭,炭*);

DFA :: DFA(INT snumber_of_states,字符* salphabet,炭stransition_table [4] [2],炭sstart_state,字符* sfinal_states)

注意,尽管这使得你的代码编译和运行时不会崩溃,这不是用C++编写的好方法。这只是一个简单的构造函数的C语言。