Answer the question
In order to leave comments, you need to log in
Passing a reference to an instance of an object from a constructor?
Kind time of the day, there is the following question: There is a class with a constructor. In the class constructor, in addition to initializing the fields, several methods are called, and in each of them, as a parameter, you must pass a reference to the current instance being created. How can this be done correctly?
In this use case this :
Word.h
protected:
// базовые поля // Иниуиализируются в конструкторе
string word;
int length;
bool is_double_word;
int padej;
string Near_Orphography();
//#include "Part_Of_Word.h"
friend string FindKoren(string p, Word* w,string Pristavka , string Suffics);
friend string FindPristavka(string p, Word* w);
friend string FindSuffics(int & link, Word* w,string p);
friend string FindOkonchanie(string p, Word* w);
friend string FindOsnova(string p, Word* w);
Word::Word(string str, int count_glsn)
{
//#include "Part_Of_Word.h" - Логика работы в этом классе
extern string PRISTAVKA_GF;
extern string KOREN_GF;
extern string OKONCHANIE_GF;
extern string OSNOVA_GF;
// Именнно в таком порядке!
// ОШИБКА ЛИНКОВШИКА!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
PRISTAVKA_GF = FindPristavka(str, this);
OKONCHANIE_GF = FindOkonchanie(str, this); // - тут же происходит вызов FindSuffics(str, *this);
OSNOVA_GF= FindOsnova(str, this);
string SUF_FICS = GF->SUFFICS_GF;
KOREN_GF= FindKoren(str, this , PRISTAVKA_GF , SUF_FICS);
////////////////////////////////////////////////////////
word = str;
length = str.length();
}
string FindPristavka(string p, Word* w)
{
// Приставки третей группы
if (((int)p[0] + (int)p[1] + (int)p[2]) == ((int)"П" + (int)"р" + (int)"и"))
{
w.pristavka = p[0] + p[1] + p[2];
}
if (((int)p[0] + (int)p[1] + (int)p[2]) == ((int)"П" + (int)"р" + (int)"е"))
{
w.pristavka = p[0] + p[1] + p[2];
return w.pristavka;
}
for (int i = 0; i <= sizeof(arr_of_pristavki) / sizeof(string); i++)
{
if (((int)(p[0] && p[1])) == atoi(GF->arr_of_pristavki[i].c_str()))
{
w.pristavka = p[0] + p[1];
return w.pristavka;
}
if ((int)p[1] == atoi(GF->arr_of_pristavki[i].c_str()))
{
w.pristavka = p[1];
return w.pristavka;
}
if ((int)p[0] == atoi(GF->arr_of_pristavki[i].c_str()))
{
w.pristavka = p[0];
return w.pristavka;
}
}
return w.pristavka;
} //done
string FindKoren(string p, Word* w, string Pristavka, string Suffics)
{
size_t pr = p.find(Pristavka);
size_t suf = p.find(Suffics);
p.erase(pr);//Удаляем приставку
return w.koren = p.erase(suf, *p.end());//Удаляем все остальное
}
string FindSuffics(int & Last_Glsn_Okonchanie, Word* w, string p)
{
//Начиная от Last_Glsn_Okonchanie (последней гласной с окончания) (p1) до перввой согласной после которой идет гласная (p2)
//p2 - уже относится к корню
//т.е от последней гласной с окончания до первой буквы корня
int & p1 = Last_Glsn_Okonchanie;
char& p2 = *(new char());
for (int i = 0; i < Arr_of_Sglsn->length(); i++)
{
const char* s_str;
for (int j = Last_Glsn_Okonchanie; j < p.length(); j++)//Начиная от Last_Glsn_Okonchanie (последней гласной с окончания) (p1)
{
if (int(p[j]) == atoi(Arr_of_Sglsn[i].c_str()) && int(p[j + 1]) == atoi(Arr_of_Glsn[i].c_str())) //atoi(Arr_of_Sglsn[i].c_str()) - это p2
{
p2 = p[j];
}
}
}
w.suffics = p.copy(&p2, p1);
//НЕ ПРОИСХОДИТ ПРОВЕРКА ТИПОВ?
// string tmp = .copy(&p2, p1); - не работает для локальных переменных
SUFFICS_GF = p.copy(&p2, p1);
return SUFFICS_GF;
//done
}
string FindOkonchanie(string p, Word* w)
{
int okonchanie_count;
int & Last_Glsn_Okonchanie = *(new int());// ссылка нужна для поиска суффикса
for (int i = 0; i < sizeof(Arr_of_Glsn) / sizeof(char); i++)
{
if ((*p.end() - i) == atoi(Arr_of_Glsn[i].c_str())) //*p.end() - i - идем от окончания к началу слова
{
Last_Glsn_Okonchanie = (*p.end() - i);
w.okonchanie += p[i];
okonchanie_count++;
}
else if (okonchanie_count == 0)
{
return w.okonchanie = "null okonchanie";
}
else
{
return w.okonchanie;
FindSuffics(Last_Glsn_Okonchanie, w, p);
}
}
}//done
string FindOsnova(string p, Word* w)
{
size_t o = p.find(w.okonchanie);
return w.osnova = p.erase(o, p.find(w.suffics));//done
}
Answer the question
In order to leave comments, you need to log in
Here's your thing. The Part_Of_Word.h file resembles a compilation unit (*.cpp) but has a header file extension (*.h). After you removed all of its includes, those functions simply stopped compiling.
And before that, wangyu, you had two include's - which means two copies of the same function from different compilation units. Also a linker error.
Solution: rename this file to cpp.
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question