BadCats
@BadCats

Передача ссылки на экземпляр объекта из конструктора?

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





}

Part_Of_Word.h
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
}

-Ругается на этапе линковки
  • Вопрос задан
  • 191 просмотр
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Дело у вас вот в чём. Файл Part_Of_Word.h напоминает единицу компиляции (*.cpp), но имеет расширение заголовочного файла (*.h). После того, как вы удалили все его include’ы, эти функции просто перестали компилироваться.

А до этого, вангую, у вас было два include’а — а значит, две копии одной функции из разных единиц компиляции. Тоже ошибка линкера.

Решение: переименовать этот файл в cpp.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы