B
B
BadCats2019-01-14 21:43:47
C++ / C#
BadCats, 2019-01-14 21:43:47

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

-Swears at the stage of linking

Answer the question

In order to leave comments, you need to log in

1 answer(s)
M
Mercury13, 2019-01-15
@BadCats

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 question

Ask a Question

731 491 924 answers to any question