Forum: Mikrocontroller und Digitale Elektronik C++ lernen verschachtelte Ob


von Thorsten (Gast)


Lesenswert?

Hallo ich lerne gerade C++

ich hab mir folgendes Programm ausgedacht es funktioniert zwar ergibt 
aber keinen Sinn da es nur zum üben ist!


#include <iostream>
using namespace std;

class A //Base
{
public:
  A() {};
    A(int x) {a_a = x; }

  int agetdaten(){return a;}


  int asetdaten(int x){a = x; return 0;}

  int asetdatenbase(int x){publica = x; return 0;}

  int publica;

private:
   int a,a_a,aaaa;
};

//**********************************************************************

class B : public A //abgeleitete Klasse
{
public:
  B() {};
  B(int x) {b_b = x; }

    int ergenzeamitb(int x){publica = publica + x; return 0;}
  void aenderea() {asetdaten(6); publica = 66;}
  int getbekommeDatena () {return publica;}
    int bgetdaten(){return b;}
  int bsetdaten(int x){b = x; return 0;}
private:
   int b, b_b;
};
//**********************************************************************
class C
{
public:
  //C() {};
  C(int x = 0) :ac(x) {c_c = x; }

    int cgetdaten(){return c;}
  int csetdaten(int x){c = x; return 0;}


private:
  A ac; //Verschachteltes Ob
   int c,c_c;
};

//**********************************************************************

int main(void)
{
   A u;
   A uu(5);
   u.asetdaten(5);

   B v;
   B (5);
   v.aenderea();
   cout <<  v.getbekommeDatena() << "das geht !" << v.publica ;
   v.bsetdaten(5);

   C w;
   C ww(5);
   w.csetdaten(5);
   w.ac
   v.asetdatenbase(10); //in der Base Klasse
   v.ergenzeamitb(22);

   cout << v.getbekommeDatena();
   return 0;
}


 Wie kann ich das verschachtelte Obiekt in Klasse C ansprechen?
welche Metoden muss ich dazu in Klasse A und C definieren.

von Karl H. (kbuchegg)


Lesenswert?

Thorsten wrote:

>  Wie kann ich das verschachtelte Obiekt in Klasse C ansprechen?

Von wo aus?


von main() aus?
Im besten Fall gar nicht.
Das C Objekt verwaltet as ac Objekt. Daher solle es dafür zuständig
sein, Funktionsaufrufe weiterzugeben.


class C
{
   ....

   void SetACDaten( int x )     { ac.asetdaten( x ); }

   ...
}

und in main dann:


    ....
    w.SetACDaten( 8 );
    ...

> welche Metoden muss ich dazu in Klasse A und C definieren.

Obiges geht zwar immer, ist aber oftmals mühsam. Man müsste sonst in C 
viel zu viele Funktionen machen, die nichts anderes tun, als ihre 
Argumente an die Memberobjekte weiterzugeben.

Also baut man sich eine Funktion, mit der man von aussen auf das 
eingebettete A Objekt per Referenz rankommt.

class C
{
   ....

   A& getA()         { return ac; }
   ...
};

und kann dann schreiben

  ...
  w.getA().asetdaten( 8 );
  ...

von Thorsten (Gast)


Lesenswert?

Gemacht hab es jetzt mal so


#include <iostream>
using namespace std;

class A //Base
{
public:
  A() {};
  A( char * ttt){  for (int i = 0;i< 4;i++) { cout << *ttt; ++ttt;}}
    A(int x) {a_a = x; }

  int agetdaten(){return a;}


  int asetdaten(int x){a = x; return 0;}

  int asetdatenbase(int x){publica = x; return 0;}
  void bekommeDatenfuerac(){cout << "ich bins";}
  int publica;

private:
  char *ist;
   int a,a_a,aaaa;
};

//**********************************************************************

class B : public A //abgeleitete Klasse
{
public:
  B() {};
  B(int x) {b_b = x; }

    int ergenzeamitb(int x){publica = publica + x; return 0;}
  void aenderea() {asetdaten(6); publica = 66;}
  int getbekommeDatena () {return publica;}
    int bgetdaten(){return b;}
  int bsetdaten(int x){b = x; return 0;}


private:
   int b, b_b;
};
//**********************************************************************
class C
{
public:
  //C() {};
  C(int x = 0) :ac(x) {c_c = x; }

    int cgetdaten(){return c;}
  int csetdaten(int x){c = x; return 0;}
  int arbeitemitobac(){ac.bekommeDatenfuerac(); ac.publica = 7 ; return 
0;}
  int getac() {cout << ac.publica; return 0;}
private:
  A ac; //Verschachteltes Ob
   int c,c_c;
};

//**********************************************************************

int main(void)
{
   ...
  C w
    w.csetdaten(5);
   w.getac();
    A ddd("gg\n");
  A m;
  A *dddd = &m;




   cout << v.getbekommeDatena();
   return 0;
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.