Я должен записать этот проект, в котором я должен сделать 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])
связано с тем, что 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);
}
Таким образом, код теперь становится еще короче, чем первая версия.
Проблема здесь в вашем третьем параметре, который не имеет нужного типа.
Цитирование из сообщения об ошибке от компилятора (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 с одним простым конструктором.