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

Zmiana wartości zmiennej rodzica w klasie pochodnej

Ostatnio zmodyfikowano 2012-11-07 22:35
Autor Wiadomość
wiktor12348
Temat założony przez niniejszego użytkownika
Zmiana wartości zmiennej rodzica w klasie pochodnej
» 2012-11-07 21:55:17
Witam

Nie mogę znaleźć odpowiedzi na swoje pytanie. Najprawdopodobniej źle szukam.

Mam 2 klasy. figura i trojkat. Klasa trojkat dziedziczy po klasie figura. W klasie figura jest zmienna "q". Ona odpowiedzialna jest w kilku metodach za dzielnik oraz pomaga konstruktorowi figury stworzyć dynamiczną tablice dwuwymiarową - ale to chyba mało ważne. Muszę w klasie trojkat zmienić wartość q. Generalnie w kolejnych klasa też które dopiero stworzę. 

Mam takie coś:
C/C++
class figura
{
public:
    //q - ilosc tablic, zalezna od figury
    int q;
    //później jest konstruktor i destruktor oraz kilka metod
};
class trojkat
    : public figura
{
public:
    float a, b, c; //dlugosci bokow
    int q = 3; //error
    //później jest konstruktor i destruktor oraz kilka metod
};

Bawiłem się static const oraz próbowałem przekazać wartość przez konstruktor trojkąta oraz przez nadpisywanie zmiennych. Nie udało się, albo wywalał błąd lub q=160454....

Dziękuje za pomoc.
P-68789
Mrovqa
» 2012-11-07 22:02:02
C/C++
class figura
{
public:
    //q - ilosc tablic, zalezna od figury
    int q;
    //później jest konstruktor i destruktor oraz kilka metod
};
class trojkat
    : public figura
{
public:
    float a, b, c; //dlugosci bokow
    //int q; //error - dziedziczymy, po co zaslaniac istniejacy skladnik nowym?
    trojkat()
        : q( 3 )
    { /* kod */ }
    //później jest konstruktor i destruktor oraz kilka metod
};
Składniki inicjalizuje się w konstruktorze.
P-68790
wiktor12348
Temat założony przez niniejszego użytkownika
» 2012-11-07 22:09:29
Niestety, źle to chyba nadal używam.

C/C++
trojkat()
    : q( 3 )
{
    //int q=3;
    zapytaj();
    przydziel_boki();
    punkty_wyswietl();
    pole_wyswietl();
    obwod_wyswietl();
   
}

Dawałem też:

C/C++
trojkat()
{
    q( 3 );
    //int q=3;
    zapytaj();
    przydziel_boki();
    punkty_wyswietl();
    pole_wyswietl();
    obwod_wyswietl();
   
}

Tak jakoś nie działa...
P-68792
akwes
» 2012-11-07 22:13:17
a
C/C++
figura::q = 3;
?

Inicjalizowanie powinno działać... ale nie wgryzałem się w kod.

Najlepiej poda log kompilacji jeszcze.

( korzystaj z tagów [cpp] kod [/cpp] )
P-68793
wiktor12348
Temat założony przez niniejszego użytkownika
» 2012-11-07 22:20:01
Dzięki za tag.

Jak dałem
C/C++
class trojkat
    : public figura
{
public:
    float a, b, c; //dlugosci bokow
    //int q=3;
   
    trojkat()
    {
        figura::q = 3;
        ...

Skompilował ale niestety wywalił błąd przy tworzeniu tablic dynamicznych a sam q miał wartość ponad 20k
P-68794
akwes
» 2012-11-07 22:29:47
Chyba już wiem w czym problem.

Twoja klasa rodzic po prostu używa tego "q" do stworzenia tablicy dynamicznej? (jakbyś dał cały kod to by było jasne)
Więc to "q" musi zostać zainicjalizowane zanim zostanie wywołany konstruktor (w tym przypadku pewnie domyślny) klasy rodzica.

Czyli najpewniej będzie to coś na wzór
C/C++
class figura
{
public:
    int q;
    figura( int var1 )
    {
        q = var1;
    }
};


class trojkat
    : public figura
{
   
public:
    trojkat( int a )
        : figura( a )
    {
    }
    // ewentualnie
    trojkat()
        : figura( 3 )
    {
    }
};
P-68796
wiktor12348
Temat założony przez niniejszego użytkownika
» 2012-11-07 22:35:59
Tak jest! Dzięki Ci dobry człowieku!

C/C++
class figura
{
public:
    //q - ilosc tablic, zalezna od figury
    int q;
    int ** wierzcholki;
    figura( int qq )
    {
        q = qq;
        wierzcholki = new int *[ q ];
        for( int j = 0; j < q; j++ )
             wierzcholki[ j ] = new int[ 2 ];
       
    }
    ~figura()
    {
        for( int j = 0; j < q; j++ )
             delete[] wierzcholki[ j ];
       
        delete[] wierzcholki;
       
    }
    ...
    ...
    class trojkat
        : public figura
    {
    public:
        float a, b, c; //dlugosci bokow
        trojkat()
            : figura( 3 )
        {
           
            zapytaj();
            przydziel_boki();
            punkty_wyswietl();
            pole_wyswietl();
            obwod_wyswietl();
           
        }
        ...

Teraz działa, może komuś zagubionemu wśród ciemności tak jak ja, kod się przyda :)
P-68798
« 1 »
  Strona 1 z 1