Доброго времени суток, имеется следующий вопрос: Есть класс с конструктором. В конструкторе класса, помимо инициализации полей, вызывается несколько методов и в каждый из них, в качестве параметра - необходимо передать ссылку на текущий создаваемый экземпляр.Как это грамотно можно сделать?
Вот в таком варианте использования this :
Word.hprotected:
// базовые поля // Иниуиализируются в конструкторе
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.cppWord::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();
}
Part_Of_Word.hstring 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
}
-Ругается на этапе линковки