Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Klassen-Salat

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
13.01.2006, 09:44 Uhr
insaint



Hallo Leute.

Irgendwie funkt bei mir heute garnichts. Hab schon ne Menge Müll geschrieben.
Vielleicht fällt euch ja was ein.

Also folgendes Problem:

Ich habe diese fünf Klassen:
A, B, C, D, und E.

In Klasse A erzeuge ich ein Objekt der Klasse B (oB).
In Klasse B erzeuge ich ein Objekt der Klassen C (oC), D(oD), und E(oE).
Klasse E hat die Methoden SetE(int i), und int GetE().
Klasse B hat die Methode SetE_in_B(int i), die auf SetE() zugreifen soll.
Die Klassen C und D sollen int GetE_vonC/D() Methoden besitzen, die irgendwie auf oE zugreifen.

Allerdings soll A nicht direkt auf oE zugreifen.

In A will ich hinterher folgenden Code schreiben können:


C++:
oB->SetE_in_B(5);
int j = oB->oC->GetE_von_C();
int k = oB->oD->GetE_von_D();

// SetE_in_B(7);
// SetE(7);
// ...  Solchen Zugriffe in A dürfen nicht möglich sein.



[ Ach ja, alle fünf Klassen sind jeweils auf eine .h und eine .cpp verteilt.
Sprich 10 Dateien ]

Ich hoffe ihr habt verstanden, worauf ich hinaus will.
Vielleicht fällt euch ja was ein.

Grüsse!
--
don't be insane, be mad ;p
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.01.2006, 10:29 Uhr
ao

(Operator)



Zitat von insaint:
Ich hoffe ihr habt verstanden, worauf ich hinaus will.

Nein, denn du hast keine Frage formuliert.

Ein Stückchen Code sagt mehr als tausend Worte. Schreib doch mal die Klassendefinitionen hin, mit den Kind-Objekten und den Settern und Gettern.

Und wenn die Klassen richtige Namen haben, deutlichere als A bis E, dann verrat uns die auch; wenn man weiß, was das werden soll, ist es viel leichter, die richtigen Tipps zu geben.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.01.2006, 11:06 Uhr
insaint



Ok, hab ich jetzt einfach mal runter geschrieben, also nicht ausprobiert ob es läuft.
Naja laufen wird es so bestimmt nicht,
aber darauf spielt jetzt meine Frage ab:

Wie bekomme ich es hin, dass ich von B nur Zugriff auf Set_Ej(int i), von C und D nur Zugriff auf int Get_Ej() habe, und von A aus garnicht?


A.h

C++:
class A
{
    public:
    A(); // Konstruktor
    ~A(); // Destruktor
    void Start();
    
    B *objB;
};



A.cpp

C++:
#include "B.h"
#include "A.h"

A::A()
{
}

A::~A()
{
}

void A::Start()
{
    objB->Set_Ej_von_B(5);
    int jc/d = objB->objC/D->Get_Ej_von_C/D();
}



B.h

C++:
class B
{
    public:
    B(); // Konstruktor
    ~B(); // Destruktor
    void Set_Ej_von_B (int i);
    
    C *objC;
    D *objD;
    
    private:
    E *objE;
};



B.cpp

C++:
#include "C.h"
#include "D.h"
#include "E.h"
#include "B.h"

B::B()
{
}

B::~B()
{
}

void B::Set_Ej_von_B (int i)
{
    E->Set_Ej(i);
}



C/D.h

C++:
class C/D
{
    public:
    C/D(); // Konstruktor
    ~C/D(); // Destruktor
    int Get_Ej_von_C/D();
    
    private:
    E *objE;
};



C/D.cpp

C++:
#include "E.h"
#include "C/D.h"

C/D::C/D()
{
}

C/D::~C/D()
{
}

int C/D::Get_Ej_von_C/D()
{
    return E->Get_Ej;
}



E.h

C++:
class E
{
    public:
    E(); // Konstruktor
    ~E(); // Destruktor
    void Set_Ej(int i);
    int Get_Ej();
    
    private:
    int j;
};



E.cpp

C++:
#include "E.h"

E::E()
{
}

E::~E()
{
}

void E::Set_Ej(int i)
{
    j = i;
}

int E::Get_Ej(int i)
{
    return j;
}



Grüsse!
--
don't be insane, be mad ;p
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.01.2006, 11:45 Uhr
Spacelord
Hoffnungsloser Fall



Zitat von insaint:


C++:
oB->SetE_in_B(5);
int j = oB->oC->GetE_von_C();
int k = oB->oD->GetE_von_D();

// SetE_in_B(7);
// SetE(7);
// ...  Solchen Zugriffe in A dürfen nicht möglich sein.




C++:
class A
{
    public:
    A(); // Konstruktor
    ~A(); // Destruktor
    void Start();
    
    B *objB;
};






Da die Klasse A keine Methoden SetE und SetE_in_B hat dürfte es dir schwerfallen diese direkt (ohne den Umweg des B Zeigers) aufzurufen.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
13.01.2006, 11:50 Uhr
ao

(Operator)


Dazu müssen die Setter und Getter nicht public, sondern private sein:


C++:
class B
{
    public:
    B(); // Konstruktor
    ~B(); // Destruktor

    private:
    void Set_Ej_von_B (int i);
    
    C *objC;
    D *objD;
    
    private:
    E *objE;
};


Andere Klassen entsprechend.

Sowas hier

C++:
void A::Start()
{
    objB->Set_Ej_von_B(5);
    int jc/d = objB->objC/D->Get_Ej_von_C/D();
}


ist allerdings ziemlich dreckig, die Klasse B muss dazu ihre Innereien (objC und objD) offenlegen. Das ist C-Programmierung mit C++-Mitteln, ein übler Missbrauch von OO-Konzepten, der zwar anfangs zu schnellen Erfolgserlebnissen führt, aber später oft großen Ärger macht.

Erste Regel für Anfänger: Membervariablen grundsätzlich private deklarieren. Es kann Gründe geben, davon abzuweichen, das ist aber nur was für Leute, die so weit fortgeschritten sind, dass sie diese Gründe beurteilen können. Wenn du lernen willst, von OO-Prinzipien zu profitieren, musst du sie zuallerst konsequent anwenden.

Wenn man Mühe hat, ein Klassenmodell zu programmieren, kann das daran liegen, dass man schon beim Modellieren einen Fehler gemacht hat. Daher nochmal: Was soll das da oben sein?

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: