Ошибка конструктора 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);
}

0

Решение

Ошибка no matching function for call to 'DFA::DFA(int&, char [2], char [4][2], char&, char [1]) связано с тем, что bonafide 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::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);
}

Таким образом, код теперь становится еще короче, чем первая версия.

1

Другие решения

Проблема здесь в вашем третьем параметре, который не имеет нужного типа.

Цитирование из сообщения об ошибке от компилятора (gcc 4.9):

prog.cpp: 14: 1: примечание: нет известного преобразования для аргумента 3 из ‘char [4] [2]’ в ‘char **’
prog.cpp: 4: 7: примечание: constexpr DFA :: DFA (const DFA)&)

Чтобы исправить возникшую проблему, просто измените строки так:

DFA (INT, символ *, символ [4] [2], символ, символ *);

а также

DFA :: DFA (int snumber_of_states, char * salphabet, char stransition_table [4] [2], char sstart_state, char * sfinal_states)

Обратите внимание, что хотя ваш код компилируется и запускается без сбоев, это не очень хороший способ написать это на c ++. Это просто C с одним простым конструктором.

0

По вопросам рекламы [email protected]