Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[c++] dziedziczenie klas. Jak zrobić wyświetlanie składowych klasy?

_kamil 19 Mar 2006 15:19 13462 7
  • #1
    _kamil
    Level 11  
    Hej mam problem pewien bo mamnapisany program tak jak poniżej tlyko nie chce mi wyswietlac zawartości klas, czy wie moze ktos jak powinienem zmienic cout by program działał i wyswietlala sie zawartośc poszczegolnych klas?

    Code:
    //---------------------------------------------------------------------------
    

    #include <vcl.h>
    #pragma hdrstop
    #include <iostream.h>

    //---------------------------------------------------------------------------
    #pragma argsused



    class Nazwa1
     {
      public:
       char samochody (char bmw, char maluch, char polonez);
      private:
      protected:
       } N1;
    ///////////////////////////////////////////////////////////////////////////////
    class Nazwa2:public Nazwa1
     {
     public:
      char dwuosiowe (char citroen, char renault);
     private:
      char jednaos (char rower, char hulajnoga);
     protected:
     }*N2;
     ///////////////////////////////////////////////////////////////////////////////
     class Nazwa3:private Nazwa1
     {
     public:
        char pojazdy (char rower2, char hulajnoga2);
     private:

     }N3;
    ///////////////////////////////////////////////////////////////////////////////
    int main(int argc, char* argv[])
    {


     cout <<"Zawartosc klasy podstawowej:" <<N1.samochody()<<endl;

     cout<<"Zawartosc klasy pochodnej po public:" <<N2->dwuosiowe()<<"/n"<<N2->samochody()<<endl;

     cout<<"Zawartosc klasy pochodnej po private:" <<N3.pojazdy()<<endl;

            return 0;
    }
    //---------------------------------------------------------------------------
  • #2
    elektryk
    Level 42  
    A wogóle ten kod się kompiluje? Bo widze tam kilka problemów:
    1. char samochody (char bmw, char maluch, char polonez); to jest funkcja(!) która zwraca jeden znak(!)
    2. Jeśli chcesz wyrzucić klase strumieniem do cout to musisz zdefiniować operator << na tej klasie.
  • #3
    _kamil
    Level 11  
    tzn?

    mógłbys mi nakreslic jak go zdefiniować?
  • #4
    bialy
    Level 15  
    1. Zeby wykonac powyzsze funkcje tak jak to napisales musialy by byc one zadeklarowane jako statyczne. Oczywiscie wywolanie ich musi sie zgadzac co do argumentow, u ciebie sie nie zgadza ani 1 ani 2.
    Code:

    N2->samochody();

    Aby wywolac powyzszy kod muszisz miec stworzony obiekt N2 samo zadeklarowanie wskaznika nic nie da trzeba utworzyc ten obiekt

    2. Co do operatora << to jesli dobrze pamietam wyglada on tak:
    Code:

    ostream& operator<<(ostream& ostr, const Klasa& foo)
    {
      cout<<foo->metoda(); //wyswietla zawartosc klasy lub cokolwiek
     return ostr;
    }
  • #5
    JanuszPulit
    Level 17  
    Patrząc na twój kod można wysnuć wniosek że nie masz chyba pojęcia o tym co robisz. Co wg ciebie miałby zrobić twój program? Co masz na myśli że chciałbyś wyświetlić zawartość klasy?
    Czy zajrzałeś do jakiegoś podręcznika programowania obiektowego zanim napisałeś tego posta??
  • #6
    _kamil
    Level 11  
    hej witam, mam prosbe bo mialem wlasnie napsiac program maly by zaprezentowac dzialanie dziedziczenia czy moglby ktos zerknac i zobaczyc czy jest on poprawny ??
    oto on:
    Code:
    //---------------------------------------------------------------------------
    
    #include <iostream.h>
    #pragma hdrstop

    //---------------------------------------------------------------------------
    class Ta
     {
       public:
       int x;
      protected:
       int z;
      }a1;
    class Tb:public Ta
     {
      public:
       int w;
      }b1;
    class Tc:private Ta
     {
      public:
       int p;
     }c1;
    #pragma argsused
    int main(int argc, char* argv[])
    {
    int a,ba,bb,c;
    a=a1.x=1;
    cout<<"zawartosc klasy Ta: "<<a<<endl;
    ba=b1.w=2;
    bb=b1.x=1;
    cout<<"zawartosc klasy Tb: "<<bb<<" i "<<ba<<endl;
    c=c1.p=3;
    cout<<"zawartosc klasy Tc: "<<c<<endl;

           system ("pause");
            return 0;
    }
    //---------------------------------------------------------------------------
     

    z góry wielkie dzieki
  • #7
    JanuszPulit
    Level 17  
    To zależy pod jakim względem poprawny...
    Z punktu widzenia składni poprawny jest bo się kompiluje.

    Z punktu widzenia sensowności to już trochę gorzej : wytłumacz mi np. jak wypisywanie na ekran zawartości zmiennych a,ba,bb,c ma prezentować jakiekolwiek zagadnienie obiektowości??

    Jeżeli chodzi o prezentację dziedziczenia to jest delikatnie ujmując kiepska... Dodałbyś może jeszcze jakieś metody w swoich klasach, pokazał że można w obiektach potomnych skorzystać z metod z klasy bazowej, ze obiekt potomny dziedziczy po bazowym nie tylko zmienne ale również metody, niech ta prezentacja pokaze korzyści z obiektowego programowania...

    W każdej książce dla początkujących jest rodział w którym to jest dokładnie pokazane pozostaje tylko do niej zajrzeć..
  • #8
    wiso
    Level 15  
    _kamil wrote:
    Hej mam problem pewien bo mamnapisany program tak jak poniżej tlyko nie chce mi wyswietlac zawartości klas, czy wie moze ktos jak powinienem zmienic cout by program działał i wyswietlala sie zawartośc poszczegolnych klas?

    Code:
    //---------------------------------------------------------------------------
    

    #include <vcl.h>
    #pragma hdrstop
    #include <iostream.h>

    //---------------------------------------------------------------------------
    #pragma argsused

    class Nazwa1
     {
      public:
       char samochody (char bmw, char maluch, char polonez);
      private:
      protected:
       } N1;
    ///////////////////////////////////////////////////////////////////////////////
    class Nazwa2:public Nazwa1
     {
     public:
      char dwuosiowe (char citroen, char renault);
     private:
      char jednaos (char rower, char hulajnoga);
     protected:
     }*N2;
     ///////////////////////////////////////////////////////////////////////////////
     class Nazwa3:private Nazwa1
     {
     public:
        char pojazdy (char rower2, char hulajnoga2);
     private:

     }N3;
    ///////////////////////////////////////////////////////////////////////////////
    int main(int argc, char* argv[])
    {


     cout <<"Zawartosc klasy podstawowej:" <<N1.samochody()<<endl;

     cout<<"Zawartosc klasy pochodnej po public:" <<N2->dwuosiowe()<<"/n"<<N2->samochody()<<endl;

     cout<<"Zawartosc klasy pochodnej po private:" <<N3.pojazdy()<<endl;

            return 0;
    }
    //---------------------------------------------------------------------------




    co mogę powiedzeć, że jakim cudem ma ci coś wyświetlać jak klasy nie są w pełni napisane, czyli brakuje tyle, że napewno cię rozbili głowa jak się dowiesz ile

    gdzie są ciała funkcji??
    tak jak zdefiniowałeś obiekty N1, N2 i N3 tylko woła o pomste do niebios

    radzę poczytać głębokie podstawy C++ i mówię to życzliwie

    Code:
    class Nazwa1
    
     {
      public:
       char samochody (char bmw, char maluch, char polonez);
      private:
      protected:
       } N1;


    ten kod nic nie robi i to dosłownie

    np.
    Nazwa1 N1;
    N1.samochody(...) // ... to powinny byc argumenty
    w twoim przypadku sa to pojedyncze znaki typu char, co to ma zorbić
    i zwracac tez char, poco?

    to jest bezsensu, jaki jest cel tego programu?

    to samo z pozostalymi klasami

    dlaczego N2 uzywasz jako obiektu alokowanego dynamicznie a nigdzie go nie alokujesz

    np
    Nazwa2 *N2 = new Nazwa2;

    a potem np.
    delete N2;

    no ale to chyba za daleko poszedłem ;-)