Page 1 of 1

Куча окошек - классов и их вызов

Posted: Wed Mar 18, 2009 7:05 am
by borr_1
В приложении есть куча классов - окошек. Их как-то нужно вызывать.
Сейчас делаю так

Code: Select all

int Main::NewPlata(wxString name)
{
   Plata *find =  dynamic_cast<Plata*>( FindWindowByName(name, this));
   if(!find == NULL)
     if(!find->DocInf.edit)
     {
       find->SetFocus();
       return find->GetId();
     }
   find = new Plata((wxAuiMDIParentFrame*)wxGetApp().GetTopWindow());
   find->Layout();
   return find->GetId();
}
Окошки все однообразные, но хоть стреляйся чтобы вызвать класс (хоть даже через шаблон) его надо обозначить у меня в функции это Plata *find = new Plata((wxAuiMDIParentFrame*)wxGetApp().GetTopWindow());
Т.е. сколько окошек столько вот таких однообразных функций. :?
По-моему от этого никуда не уйти, по этому же Netчики и явовцы издеваются над С++.

У кого-нибудь есть соображения на этот счет. Может смысла кода изменить нельзя но можно как-то упростить для понимания поиска и что самое главное дальнейшее добавление и правки его структуру?

Re: Куча окошек - классов и их вызо

Posted: Wed Mar 18, 2009 7:50 am
by Kolya
А почему бы не использовать шаблоны?

Code: Select all

template <typename TPlata>
int Main::NewTPlata(wxString name)
{
   TPlata *find =  dynamic_cast<TPlata*>( FindWindowByName(name, this));
   if(!find == NULL)
     if(!find->DocInf.edit)
     {
       find->SetFocus();
       return find->GetId();
     }
   find = new TPlata((wxAuiMDIParentFrame*)wxGetApp().GetTopWindow());
   find->Layout();
   return find->GetId();
}
NewTPlata<Plata>("name");
NewTPlata<Plata2>("name");

Re: Куча окошек - классов и их вызо

Posted: Wed Mar 18, 2009 8:55 am
by borr_1
Kolya wrote:А почему бы не использовать шаблоны?
Правда короче выходит, спасибо. У меня заклинило
но хоть стреляйся чтобы вызвать класс (хоть даже через шаблон) его надо обозначить
А подумать о том что NewTPlata<Plata>("name"); будет короче чем переписывать функцию каждый раз это не :oops:

Posted: Thu Mar 19, 2009 12:24 pm
by borr_1
Стала всплывать ошибка при линковке
undefined reference to `int Main::NewEdit<Plata>(wxString const&, int)

Code: Select all

//-------Main.h----------------
template <typename TEdit>
    inline int NewEdit(const wxString &name, int id = 0);
template <typename TPlata>
    inline int NewPlata(const wxString &name );
void OnMPlatSelected(wxCommandEvent& event);
//--------Main.cpp--------------
template <typename TEdit>
 int Main::NewEdit(const wxString &name, int id)
{
   TEdit *find =  dynamic_cast<TEdit*>( FindWindowByName(name, this));
   if(!find == NULL)
     if(!find->DocInf.edit)
     {
       find->SetFocus();
       return find->GetId();
     }
   find = new TEdit((wxAuiMDIParentFrame*)wxGetApp().GetTopWindow());
   find->Layout();
   //find->SetName(name); ///Нужно или нет????
   if(id > 0)
   {
     find->GetRow(id);
   }
   return find->GetId();
}

template <typename TPlata>
 int Main::NewPlata(const wxString &name)
{
   TPlata *find =  dynamic_cast<TPlata*>( FindWindowByName(name, this));
   if(!find == NULL)
     if(!find->DocInf.edit)
     {
       find->SetFocus();
       return find->GetId();
     }
   find = new TPlata((wxAuiMDIParentFrame*)wxGetApp().GetTopWindow());
   find->Layout();
   return find->GetId();
}
void Main::OnMPlatSelected(wxCommandEvent& event)
{
  NewPlata<Plata>(wxT("Plata"));//Если тут компилирую то начинает компилиться
  //NewEdit<Plata>(wxT("Plata"));
}
//--------PlataView.cpp
#include "Main.h"

int PlataView::New(const wxString name)
{
  Main *main = dynamic_cast<Main*> (FindWindowByName(wxT("Main"),
                                   (wxAuiMDIParentFrame*)wxGetApp().GetTopWindow()));
  Plata* find = dynamic_cast<Plata*> (FindWindowById(main->NewEdit<Plata>(name)));//Тут при линковке и выскакивает ошибка
  return find->GetId();
}
Читал тут http://www.codeguru.com/forum/showthread.php?t=250284 inline поставил не помогло.
Компилятор MinGW 3.4.5 очень прошу указать верный путь.

Posted: Thu Mar 19, 2009 12:39 pm
by T-Rex
Тело функции внутрь класса вынеси. Шаблоны обрабатываются во время компиляции и если у тебя эта функция внутри библиотеки, то ясное дело что при компиляции проекта оно ее не находит т.к. библиотека уже собрана. Вот... а если внесешь тело функции внутрь тела класса, тогда при сборке самого проекта компилятор сможет ее найти.

Posted: Thu Mar 19, 2009 12:45 pm
by borr_1
T-Rex wrote:Тело функции внутрь класса вынеси. Шаблоны обрабатываются во время компиляции и если у тебя эта функция внутри библиотеки, то ясное дело что при компиляции проекта оно ее не находит т.к. библиотека уже собрана. Вот... а если внесешь тело функции внутрь тела класса, тогда при сборке самого проекта компилятор сможет ее найти.
Ясно спасибо. Еще люди рекомендуют создавать для шаблонов отдельный header.
А почему с inline не работает, хотя должно?

Posted: Thu Mar 19, 2009 1:54 pm
by T-Rex
почему это должно? inline говорит что "вот тело функции должно не вызываться а встраиваться", а у тебя сейчас линкер говорит "так а вобще ГДЕ тело функции-то?"