Skocz do zawartości

Szablony i dynamiczne tworzenie klas


ZeroXbot

Rekomendowane odpowiedzi

Po długiej odstawce znowu się wziąłem za C++ i mam pewien problem, otóż dla poćwiczenia szablonów klas napisałem sobie taki do niczego niepotrzebny program. Tworzę w nim dynamicznie klasę wybranego przez użytkownika typu. Później może sobie na niej operować (czytaj zmieniać i pokazywać wartość zmiennej w klasie) i ją usunąć. Błędy wyskakują mi przy każdej operacji na klasie (tworzeniu i usuwaniu też), ale sądzę, że problem tkwi w samym tworzeniu (chyba zasięg też tu nie pasi, ale skoncentrujmy się na samym tworzeniu). Poniżej błędy i kod.

c:\documents and settings\boys\moje dokumenty\visual studio 2008\projects\test5\test5\test.cpp(85) : error C2360: initialization of 'klasa' is skipped by 'case' label
        c:\documents and settings\boys\moje dokumenty\visual studio 2008\projects\test5\test5\test.cpp(83) : see declaration of 'klasa'
c:\documents and settings\boys\moje dokumenty\visual studio 2008\projects\test5\test5\test.cpp(86) : error C2371: 'klasa' : redefinition; different basic types

#include <iostream>
#include<string>
#include<conio.h>

using namespace std;

template <class typ>
class mc
{
    typ zmienna;
    public:
        void pokaz()
        {
            cout<<"Wartosc zmiennej klasy wynosi: "<<zmienna<<endl;
        }
        void pobierz()
        {
            cout<<"Podaj wartosc: ";
            cin>>zmienna;
            cout<<endl;
        }
        mc()
        {
            cout<<"Klasa utworzona!"<<endl;
            pobierz();
        }
        ~mc()
        {
            cout<<"Klasa zniszczona!"<<endl;
        }
};

int main()
{
    int wybor;
    bool dobrze=true;

    do
    {

    do
    {
    
        cout<<"Co chcesz zrobic?"
            <<endl
            <<"1. Utworzyc klase"
            <<endl
            <<"2. Wyjsc"
            <<endl;
        wybor = getch();
        switch(wybor)
        {
            case 1:
                dobrze=true;
                break;
            case 2:
                return 0;
            default: 
                cout<<"Nieprawidlowy znak"<<endl;
                dobrze=false;
                break;
        }
    }while (!dobrze);
    do
    {

    cout<<"Wybierz typ:"
        <<endl
        <<"1. calkowity (int)"
        <<endl
        <<"2. zmiennoprzecinkowy (double)"
        <<endl
        <<"3. znak (char)"
        <<endl
        <<"4. lancuch znakow (string)"
        <<endl;
    dobrze=true;
    wybor = getch();
    switch(wybor)
        {
            case 1:
                mc<int>* klasa= new mc<int>;
                break;
            case 2:
                mc<double>* klasa= new mc<double>;
                break;
            case 3:
                mc<char>* klasa= new mc<char>;
                break;
            case 4:
                mc<string>* klasa= new mc<string>;
                break;
            default: 
                cout<<"Nieprawidlowy znak"<<endl;
                dobrze=false;
                break;
        }

    } while(dobrze);

    do
    {
    
        cout<<"Co chcesz zrobic?"
            <<endl
            <<"1. Zmienic wartosc"
            <<endl
            <<"2. Pokazac wartosc"
            <<endl
            <<"3. Usunac klase"
            <<endl;
        dobrze=false;
        wybor = getch();
        switch(wybor)
        {
            case 1:
                klasa->pobierz();
                break;
            case 2:
                klasa->pokaz();
                break;
            case 3:
                delete klasa;
                dobrze=true;
                break;
            default: 
                cout<<"Nieprawidlowy znak"<<endl;
                dobrze=false;
                break;
        }
    }while (!dobrze);
    
    }while(1);
}

Nie proszę o gotowy kod, tylko o jakieś wytłumaczenie, chyba że inaczej się nie da. Z góry dzięki ;)

Odnośnik do komentarza
Udostępnij na innych stronach

lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol

To nie GM ;)

Wskaźnik na typ mc<.> ustaw na początku w funkcji main, bądź w zakresie globalnym.

Odnośnik do komentarza
Udostępnij na innych stronach

Liczby zmiennoprzecinkowe to nie double, tylko float.

float - liczba zmiennoprzecinkowa

double - liczba zmiennoprzecinkowa podwójnej precyzji

Odnośnik do komentarza
Udostępnij na innych stronach

nie potrzeba, tak samo jak samo unsigned zamiast unsigned int. na sile kombinujesz by sie przyczepic :P

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...