Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Uniwersalny kontener function

Ostatnio zmodyfikowano 2014-03-02 17:46
Autor Wiadomość
Haker123
Temat założony przez niniejszego użytkownika
Uniwersalny kontener function
» 2014-03-02 00:52:07
Witam.

Mam klase która przechowuje i wypisuje funkcje za pomoca "function"
Jak można zrobić żeby "function" mogło przechowywać róznego rodzaju funkcje, tak żeby w jednym menu przyjmowała same funkcje void() a innym raze bool() lub inne?

Jak narazie to starałem się to zrobić za pomocą szablonów ale dostaje same błędy i to w bibliotece function.

d:\programy\microsoft visual c++ 2010 express\vc\include\functional(94): error C2027: use of undefined type 'std::tr1::_Get_function_impl<_Tx>'
1>          with
1>          [
1>              _Tx=bool
1>          ]
1>          d:\programy\microsoft visual c++ 2010 express\vc\include\moje\menu.h(23) : see reference to class template instantiation 'std::tr1::function<_Fty>' being compiled
1>          with
1>          [
1>              _Fty=bool
1>          ]
1>          d:\programy\microsoft visual c++ 2010 express\vc\include\moje\menu.h(24) : see reference to class template instantiation 'cMenu<Typ>::sDane' being compiled
1>          with
1>          [
1>              Typ=bool
1>          ]
1>          d:\programowanie\projekty - programy\moje\mix\mix\main.cpp(33) : see reference to class template instantiation 'cMenu<Typ>' being compiled
1>          with
1>          [
1>              Typ=bool
1>          ]
1>d:\programy\microsoft visual c++ 2010 express\vc\include\functional(95): error C2504: '_Type' : base class undefined
1>d:\programy\microsoft visual c++ 2010 express\vc\include\functional(98): error C2027: use of undefined type 'std::tr1::_Get_function_impl<_Tx>'
1>          with
1>          [
1>              _Tx=bool
1>          ]
1>d:\programy\microsoft visual c++ 2010 express\vc\include\functional(98): error C2146: syntax error : missing ';' before identifier '_Mybase'
1>d:\programy\microsoft visual c++ 2010 express\vc\include\functional(98): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\programy\microsoft visual c++ 2010 express\vc\include\functional(98): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\programy\microsoft visual c++ 2010 express\vc\include\functional(94): error C2027: use of undefined type 'std::tr1::_Get_function_impl<_Tx>'
1>          with
1>          [
1>              _Tx=void
1>          ]
1>          d:\programy\microsoft visual c++ 2010 express\vc\include\moje\menu.h(23) : see reference to class template instantiation 'std::tr1::function<_Fty>' being compiled
1>          with
1>          [
1>              _Fty=void
1>          ]
1>          d:\programy\microsoft visual c++ 2010 express\vc\include\moje\menu.h(24) : see reference to class template instantiation 'cMenu<Typ>::sDane' being compiled
1>          with
1>          [
1>              Typ=void
1>          ]
1>          d:\programowanie\projekty - programy\moje\mix\mix\main.cpp(62) : see reference to class template instantiation 'cMenu<Typ>' being compiled
1>          with
1>          [
1>              Typ=void
1>          ]
1>d:\programy\microsoft visual c++ 2010 express\vc\include\functional(95): error C2504: '_Type' : base class undefined
1>d:\programy\microsoft visual c++ 2010 express\vc\include\functional(98): error C2027: use of undefined type 'std::tr1::_Get_function_impl<_Tx>'
1>          with
1>          [
1>              _Tx=void
1>          ]
1>d:\programy\microsoft visual c++ 2010 express\vc\include\functional(98): error C2146: syntax error : missing ';' before identifier '_Mybase'
1>d:\programy\microsoft visual c++ 2010 express\vc\include\functional(98): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\programy\microsoft visual c++ 2010 express\vc\include\functional(98): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

C/C++
template < class Typ > class cMenu
{
public:
   
    struct sDane //STRUKTURA DO PRZECHOWYWANIA NAZWY I FUNKCJI W MENU
    {
        string Nazwa;
        function < Typ > funkcja; //function BEDZIE PRZECHOWYWAC ADRES FUNKCJI
    } Dane;
   
    bool wypisz(); //FUNKCJA WYPISUJACA MENU
   
    void Dodaj()
    {
        vecWypis.push_back( Dane );
    }
   
    //KONSTRUKTOR
    cMenu()
        : pozycja( 0 )
        , prawda( true )
    { };
   
private:
   
    int pozycja; //ZMIENNA DO WYBRANIA ODPOWIEDNIEJ FUNKCJI
    bool prawda; //ZMIENNA DO WYJSCIA Z PETLI WYPISUJACEJ
   
    vector < sDane > vecWypis; //vector PRZECHOWUJACY DANE ZE STRUKTURY
};
Tak używam.
C/C++
int main()
{
    //TWORZYMY OBIEKT cMenu KTORY PRZECHOWUJE FUNKCJE void(void)
    cMenu < void > Menu0; //wpisywalem rozniez <void(void)> oraz <void()>
    //DODAJEMY DANE
    //1 EXIT
    Menu0.Dane.Nazwa = "EXIT";
    Menu0.Dodaj();
   
    //2 KOLKO I KRZYZYK
    Menu0.Dane.Nazwa = "KOLKO I KRZYZYK";
    Menu0.Dane.funkcja = Gra;
    Menu0.Dodaj();
   
    //3 LABIRYNT
    Menu0.Dane.Nazwa = "LABIRYNT";
    Menu0.Dane.funkcja = Lab;
    Menu0.Dodaj();
   
    //POKI NIE ZOSTANIE WYBRANE WYJSCIE PROGRAM BEDZIE DZIALAC
    while( Menu0.wypisz() ) { }
   
    return 0;
}
Funkcje "Gra" oraz "Lab" zwracają void i nie mają posiadają argumentów.
Funkcja "wypisz()" ma za zadanie wypisać menu i po wciśnięciu entera uruchomić odpowiednią funkcje.
P-105473
Monika90
» 2014-03-02 09:16:00
Ale w czym problem? Jak napiszesz cMenu<void ()> Menu0; to kod będzie poprawny (w pewnym sensie, tzn da się go skompilować: http:/​/coliru.stacked-crooked.com/a​/e917990fbacf2361).

Radzę Ci zrób upgrade kompilatora i nie używaj tr1 używaj C++11
P-105480
Haker123
Temat założony przez niniejszego użytkownika
» 2014-03-02 15:20:56
Korzystam z "Microsoft Visual C++ 2010 Express".
Czyli te błędy są spowodowane przestarzałym kompilatorem??

P.S
Mogłbys mi podac jakis link do podobnej funkcji jak "functin" w c++11, bo tego nowego standardu narazie w ogóle nie znam jeszcze.
P-105502
Monika90
» 2014-03-02 16:05:04
Czyli te błędy są spowodowane przestarzałym kompilatorem??
Nie. Te błędy są spowodowane tym, że jako argument szablonu cMenu podałeś void i bool zamiast void() i bool().

Ale w komentarzu masz napisane
wpisywalem rozniez <void(void)> oraz <void()>
Jeżeli to wpisywałeś, to nie powinno być błędu. Czy kod do którego link podałam wyżej, kompiluje się twoim kompilatorem (jeżeli nie to może trzeba dopisać using namespace std::tr1;).

link do podobnej funkcji jak "functin" w c++11
Alternatywą dla std::function jest boost::function
http://www.boost.org/doc/libs​/1_55_0/doc/html/function.html
Ale nie powinno to być potrzebne bo MSVC++ 2010 ma function. Nie wiem czy w przestrzeni nazw std czy w std::tr1, ale ma na pewno.
P-105507
Haker123
Temat założony przez niniejszego użytkownika
» 2014-03-02 17:46:26
Nic już z tego nie rozumiem. Teraz wszystko działa jak trzeba (poza licznymi ostrzezeniami do getch i kbhit).

Już któryś raz zdarza się że kompilator robi mi takie chece że kod raz działa a raz nie ;/
Chyba musze pomyśleć o nowszej wersji, może tam nie bede mial takich problemów.

Dzięki za pomoc ;]
P-105513
« 1 »
  Strona 1 z 1