logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[C++] Jak uzyskać dostęp do prywatnych pól klasy wektor2d w C++?

Freeload 23 Kwi 2007 16:55 1503 4
REKLAMA
  • #1 3813994
    Freeload
    Poziom 10  
    Posty: 11
    Mam znaleźć błąd w podanym programie

    
    class wektor2d
    {
     private:
      float x;
      float y;
     public: 
      wektor2d();
    };
    
    wektor2d::wektor2d()
    {
     x=0;
     y=0;
    }
    
     void main()
    {
     wektor2d w;
     w.x=1;
     w.y=37;
    }
    


    i teraz mam pytanie czy wystarczy jak zmienię

    
    private:
    float x;
    float y;
    


    na public to będzie działać dobrze :?: Czy w tym przypadku muszę użyć opcji friend :?: I jak by to ewentualnie wyglądało z opcją friend :?:
  • REKLAMA
  • #2 3814783
    MirekCz
    Poziom 35  
    Posty: 2220
    Pomógł: 330
    Ocena: 62
    Ty masz tam tylko jedną klasę, żadnych friend.

    Zmienisz na public i będzie ok.
  • REKLAMA
  • #3 3829924
    lord_dagoth
    Poziom 25  
    Posty: 860
    Pomógł: 68
    Ocena: 6
    Przedewszystkim, to zmienne x i y są składowymi klasy prywatnymi. Jeżeli chcesz, aby nadal były prywatne, powinieneś stosować akcesory. Są to napisane metody publiczne klasy, służące do ustawiania bądź zwaracania zmiennych składowych. Należy to do dobrych nawyków programistycznych.

    Tutaj zamieszcze przykład twojej klasy z akcesorami:

    class wektor2d 
    { 
     private: 
      float x; 
      float y; 
     public: 
      wektor2d();
      void setX(float a);
      float getX(); 
    }; 
    
    wektor2d::wektor2d() 
    { 
     x=0; 
     y=0; 
    } 
    
    wektor2d::void setX(float a);
    { 
     x=a; 
    } 
    
    wektor2d::float getX(); 
    { 
     return x; 
    } 
    
     void main() 
    { 
     wektor2d w; 
     w.setX(1); 
    } 
    


    Coś w ten deseń ;) kod powinien działać :P ogólnie taka jest idea akcesorów.

    A opcja friend służy do czego innego. Poczytaj o zaprzyjaźnieniu pomiędzy klasami (bądź tworzenie zaprzyjaźnionych funkcji). Ale do tego potrzebujesz conajmniej dwie klasy, bądź jedną klase i funkcję zewnętrzną ;)
  • REKLAMA
  • #4 3831882
    jacko12345
    Poziom 11  
    Posty: 9
    Jeżeli miałeś podane, że przypisujesz wartości w postaci
    "klasa.elementKlasy = wartość " to na pewno nie chodziło o zaprzyjaźnienie, lecz właśnie o ten kruczek, że w ten sposób zmienne muszą tyć publiczne, wiec wystarczylo to tylko zauważyć.

    U mnie też błędem było wpisanie void main,
    jestem dość świeżym programistą więc może nie wiem, w każdym razie w Dev-Cpp musi być int main () najogólniej pisząc.

    Natomiast jeśli chciałbyś trochę może nawet ułatwić wstawianie elementów (będącymi elementami prywatnymi), mógłbyś oczywiście dołączyć kolejną zaprzyjaźnioną funkcję i za jej pomocą to wykonywać. Oto przyklad.

    W klasie dodaj: ( zmienne x,y oczywiście zostają w private )
     friend void wyswietl(wektor2d &t);
     friend void wstaw (float a, float b, wektor2d &t);
    Definicja funkcji;
    
    void wyswietl(wektor2d &t)
    {
       cout<<"x = "<<t.x<<endl<<"y = "<<t.y<<endl; 
    }
    
    void wstaw( float a, float b, wektor2d &t )
    {
        t.x=a;
        t.y=b;
        
    }
    
    
    I dla testu działania w Main
     wektor2d w; 
     wstaw(6,2,w);
     wyswietl(w);
    
    
  • #5 3832492
    lord_dagoth
    Poziom 25  
    Posty: 860
    Pomógł: 68
    Ocena: 6
    heh... ale po co pisać zaprzyjaźnione klasy? Nie lepiej zastosować akcesory? Są to zwyczajne metody służące do zwracania wartości danej zmiennej składowej bądź jej ustawiania. Nie dość że należy to do dobrych nawyków programistycznych, to jeszcze jest opisane w każdej książce praktycznie na początku działu "Programowanie obiektowe" :P

    Aaaaa... i jeszcze a propo Dev-Cpp, to nie koniecznie musi być int main().
REKLAMA