www.mikrocontroller.net

Forum: Compiler & IDEs OOP: Variable in zwei Klassen nutzen, aber wie?


Autor: Martin R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo !
Ich suche ein einfaches (Programmier- ) Beispiel, wie ich in zwei 
Klassen eine einzige Variable nutzen kann.

Dabei möchte ich die Variable in einer Klasse definieren, diese aber in 
beiden Klassen veränderbar machen.

Ich habe schon ein paar Variation in C++ ausprobiert, allerdings ohne 
nennenswerten Erfolg ;-(


Es wäre nett, wenn mir einer von Euch kurz auf die Sprünge helfen 
könnte!
Danke!


Gruss Martin

Autor: max.p (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Also ich hab zwar nur ein bischen Erfahrung mit Java, es kann also auch 
sein das es in C++ komplett anders funktioniert. So wie ich das Prinzip 
von OOP verstanden habe ist es nicht Sinn und Zweck der Sache so etwas 
zu machen was du vorhast. Normalerweise wird ja aus einer Klasse zur 
Laufzeit ein oder mehrere Objekte erzeugt. Also ich es so auch nicht 
möglich auf eine Globale Variable zuzugreifen, da ja mehrere Instanzen 
des Objekts vorhanden sein könnten.

mfg
Max

Autor: Jorge (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich schliesse mich meinem Vorredner an. Trotzdem hier eine mögliche 
Lösung:


int myVar=123;


class A {

public:
  int &myVar;

  A():myVar(::myVar) {}

  int get() {
    return myVar;
  }

  void set(int v) {
    myVar=v;
  }

};

class B {
public:
  int &myVar;

  B():myVar(::myVar) {};

  int get() {
    return myVar;
  }

  void set(int v) {
    myVar=v;
  }

};



int main(int argc, char* argv[])
{
  A a;
  B b;
  printf("%d\n",a.get());

  a.set(456);

  printf("%d\n",b.get());

  return 0;
}

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Überarbeite lieber deine Klassenstruktur, oder lies ein Buch über OOP ;)

Sowas ist gewissermaßen gegen den Sinn der Objektorientierung.

Autor: Fabian Scheler (rosepeter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Überarbeite lieber deine Klassenstruktur, oder lies ein Buch über OOP ;)
> Sowas ist gewissermaßen gegen den Sinn der Objektorientierung.

Ja, das stimmt schon, aber manchmal spart man sich einfach echt viel 
nerviges Zeug, wenn man das mal einer Stelle wohldefiniert tut. Bei der 
Programmierung von eingebetteten Systemen kommt sowas durchaus mal vor.

Das obige Beispiel tut zwar das, was du willst, allerdings wird die 
Variable nicht in der Klasse definiert. Ich schlage daher folgendes vor:

Im Header:
class B;

class A {
private:
  friend class B;
  static int myVar;
public:
  ...
}

class B {
public:
  void method() {
    int local_var = A::myVar;
  }
}

In der Implementierung:
# include "A.h"

int A::myVar = MY_INITIALIZER;

das obige Beispiel verwendet eine Klassenvariable (oder statische 
Variable). Der Vorteil der friend-Deklaration ist, das neben der Klasse 
A nur die Klasse B auf die Variable myVar zugreifen darf und nicht 
irgendeine beliebige Klasse. Soll die Variable keine Klassenvariable 
sein, sondern eine Instanzvariable, musst du halt das static und die 
Initialisierung weglassen. Eine Instanzvariable passt IMO allerdings 
nicht so ganz auf deine Beschreibung, wonach du suchst.

Ciao, Fabian

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.