DFA构造函数错误,如何进行有效声明



我必须写下这个项目,我必须做一个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::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);
}

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

这里的问题是您的第三个参数,它没有所需的类型。

引用编译器(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++中编写这不是一个好方法。

最新更新