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

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

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

Post by borr_1 » Wed Mar 18, 2009 7:05 am

В приложении есть куча классов - окошек. Их как-то нужно вызывать.
Сейчас делаю так

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чики и явовцы издеваются над С++.

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

Kolya
Experienced Solver
Experienced Solver
Posts: 85
Joined: Mon Dec 11, 2006 11:35 am
Location: /dev/null

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

Post by Kolya » Wed Mar 18, 2009 7:50 am

А почему бы не использовать шаблоны?

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");

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

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

Post by borr_1 » Wed Mar 18, 2009 8:55 am

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

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 » Thu Mar 19, 2009 12:24 pm

Стала всплывать ошибка при линковке
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 очень прошу указать верный путь.

User avatar
T-Rex
Moderator
Moderator
Posts: 1188
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex » Thu Mar 19, 2009 12:39 pm

Тело функции внутрь класса вынеси. Шаблоны обрабатываются во время компиляции и если у тебя эта функция внутри библиотеки, то ясное дело что при компиляции проекта оно ее не находит т.к. библиотека уже собрана. Вот... а если внесешь тело функции внутрь тела класса, тогда при сборке самого проекта компилятор сможет ее найти.

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 » Thu Mar 19, 2009 12:45 pm

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

User avatar
T-Rex
Moderator
Moderator
Posts: 1188
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex » Thu Mar 19, 2009 1:54 pm

почему это должно? inline говорит что "вот тело функции должно не вызываться а встраиваться", а у тебя сейчас линкер говорит "так а вобще ГДЕ тело функции-то?"

Post Reply