mikrocontroller.net

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


Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 );
  ...

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.