c++ - DFA构造函数报错,有效声明怎么办?

标签 c++ constructor 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 主义:

#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/

相关文章:

C++ 映射迭代器问题

c++ - 我想在两台或多台计算机之间进行 UDP 通信

computer-science - 这种语言的 DFA

theory - 如何将 DFA 转换为图灵机?

c++ - 如何模板化 C++ 构造函数以实现完美转发

c++ - 对列表和对的混淆

c++ - 在构造函数中使用 Q_ASSERT

java - 当没有构造函数的类的默认构造函数是 'automatically' 时,为什么编译器会提示父类(super class)没有构造函数?

java - 在调用子类构造函数之前,编译器是否会在子类构造函数中查找 **super** 关键字?

regex - 回复 : Number of a's is divisible by 6 and Number of b's is divisible by 8