Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Objekt einer Klasse als Membervariable dieser Klasse

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
30.12.2010, 09:18 Uhr
~Capris
Gast


Hallo

gibt es eine bestimmte Bezeichnung dafür, wenn ich in einer Klasse eine Membervariable vom Typ dieser Klasse erstelle? So ungefähr:


C++:
class Test {
public:

Test test_;

};




Und die zweite (wichtigste) Frage... Was muss ich beachten, wenn ich so etwas mache?

Vielen Dank für euere Antworten.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
30.12.2010, 09:33 Uhr
ao

(Operator)


So geht das nicht, eine Klasse kann sich nicht selber enthalten. Das Member ist ja genauso aufgebaut, müsste also selbst auch ein Member vom Typ Test haben, und dieses Member auch wieder .....

Syntaktisch wäre folgendes möglich:

C++:
class Test
{
    Test & andererTest;  // Referenz auf eine andere Instanz
};



ABER: Dabei gibts ein semantisches Problem. Da die Referenz bei der Konstruktion mit einer gültigen Test-Instanz initialisiert werden muss, läuft das auf eine Henne-Ei-Situation heraus - wo kriegst du diese gültige Test-Instanz her, die muss ja auch irgendwann erzeugt werden.

Interessante Frage: Kann man das irgendwie lösen?

Ich würde mangels besseren Wissens auf das hier ausweichen:

C++:
class Test
{
    Test * andererTest;  // Pointer auf eine andere Instanz
};



Der Pointer kann dann auf ein gültiges Objekt zeigen oder auch nicht.

Dieser Post wurde am 30.12.2010 um 09:54 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
30.12.2010, 09:58 Uhr
~Capris
Gast


Dankeschön.. du hast natürlich Recht...

Mein Problem ist, dass ich auf die Funktionen der Klasse Test in anderen Klassen zugreifen möchte ohne ein Objekt dieser Klasse erstellen zu müssen. Und die Funktionen dürfen nicht static sein. Wäre es sinnvoll das so zu machen?


C++:
class Test {
      static Test * test;
}



In cpp würde ich dann meine Variable test mit NULL belegen. Oder muss ich das Objekt außerhalb der Klasse erstellen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
30.12.2010, 10:18 Uhr
ao

(Operator)


Bei solchen Objektbeziehungen sollte man immer berücksichtigen, welche realen Dinge da modelliert werden sollen. Nicht alles, was syntaktisch geht, ist im konkreten Fall sinnvoll. Also, was programmierst du da?

Oder, falls das nur eine sinnentleerte Übungsaufgabe ist: Poste mal die genaue Aufgabenstellung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
30.12.2010, 10:42 Uhr
~Capris
Gast


Es ist leider keine Übungsaufgabe, sondern ein riesiges Projekt (nicht von mir)...

Ich muss hier eine Funktion ergänzen und dazu muss ich einigen Klassen Infos aus dieser einen Klasse übergeben... Ich hab es dann damit gemacht, dass ich in der Klasse ein static Objekt von dieser Klasse erstellt habe...

In einer anderen Klasse habe ich dann dieses Objekt über Test::test aufgerufen und die Daten verwendet. Compiler hat sich nicht beschwert, aber wenn ich das Projekt starte, kommt eine Exception... Ich dachte, es liegt vielleicht daran...

Zusätzlich besteht das Projekt aus dem managed und unmanaged Code... Hier kommt auch dann die Exception (System.AccessViolationException), wenn Daten zwischen managen und unmanaged code ausgetauscht werden...

(sorry wegen so viel text)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
30.12.2010, 12:57 Uhr
ao

(Operator)


Und die Klassen heißen wirklich Test?


Zitat:
Ich muss hier eine Funktion ergänzen und dazu muss ich einigen Klassen Infos aus dieser einen Klasse übergeben...

Sorry, aber das ist völlig nichtssagend. Einer Klasse Infos aus einer anderen übergeben, das tut man ständig, wenn man OO-programmiert. Softwaredesign hat viel mit Abbildung der realen Welt zu tun. Ich kann dir keinen Rat geben, wie du deine Klassenbeziehungen organisieren sollst, wenn du nicht verrätst, mit welchen (realen!) Objekten du hantierst.

Wenn das ganze so hochgeheim ist, dass du nicht mal Klassen- und Funktionsnamen verraten darfst, dann denk dir ein Beispiel aus, das so ähnlich ist. Aber vermeide Namen wie Test, Foo, Class1, die sind einfach nur blöd.


Zitat:
... dass ich auf die Funktionen der Klasse Test in anderen Klassen zugreifen möchte ohne ein Objekt dieser Klasse erstellen zu müssen.

Funktionen, die nicht an eine Instanz gebunden sind? Da kommen nur static-Methoden in Frage. Nicht-statische Methoden gibt es nur in Verbindung mit einer Instanz.


Zitat:
Und die Funktionen dürfen nicht static sein.

Wo kommt diese Anforderung her? In Verbindung mit dem Vorigen ("ohne ein Objekt dieser Klasse ...") ist das Blödsinn, das geht nicht.

Dieser Post wurde am 30.12.2010 um 12:58 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
30.12.2010, 14:25 Uhr
~Capris
Gast


sorry, dass ich es so komisch gemacht habe...

Also... es geht darum double-Werte in Strings umzuwandeln. Vorher wird festgelegt auf wie viele Dezimalstellen gerundet wird. Hier ist die gekürzte Version zweier Klassen und Funktionen, in denen die Anzahl der Dezimalstellen gespeichert wird.


C++:
class ConfigCore
{
    virtual long nrOfDecimals() const = 0;
    ...
}

class DataConfigCore : ConfigCore
{
public:
    //standard constructor
    OOEResDataConfigCore(void);
    //standard destructor
    ~OOEResDataConfigCore(void);
    static bool setDataConfigCore(long nrOfDecimals,bool asDegree,...);
    virtual long nrOfDecimals(void) const;
    ...

    static DataConfigCore * theDataConfigCore;

private:
    //nr of Decimals
    static long nrOfDecimals_;
    static bool asDegree_;
    ...
};

long DataConfigCore::nrOfDecimals_ = 6;
bool DataConfigCore::asDegree_ = false;
DataConfigCore * DataConfigCore::theDataConfigCore = NULL;

bool DataConfigCore::setDataConfigCore(long nrOfDecimals,bool asDegree,...)
{
    nrOfDecimals_ = nrOfDecimals;
    asDegree_ = asDegree;
    return true;
}
long DataConfigCore::nrOfDecimals() const
{
    return nrOfDecimals_;
}



Es gibt noch eine Klasse, die doubles in strings umwandelt, besser gesagt, eine Funktion in dieser Klasse:


C++:
bool DataTypeValue::getAsString(std::wstring& string, const DataConfigCore * dataConfig) const
{
       long precision = dataConfig->nrOfDecimals()); //Hier kommt die Exception
       ...
       return true;
}



getAsString wird wiederum irgendwo wie folgt aufgerufen:

C++:
std::wstring strVal;
...->getAsString(strVal, DataConfigCore::theDataConfigCore);



Leider kommt bei mir ein Fehler,wenn ich auf die Anzahl der Dezimalstellen zugreifen möchte (oder auf asDegree).

(Danke für die Geduld)

Dieser Post wurde am 30.12.2010 um 15:02 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
30.12.2010, 15:18 Uhr
ao

(Operator)


Wohin zeigt theDataConfigCore, wenn getAsString aufgerufen wird? Auf den Initialwert NULL? Dann ist das der Grund für die Exception.

Die Methode nrOfDecimals ist virtuell (rein-virtuell von ConfigCore geerbt und dann überschrieben), d.h. sie wird nicht direkt aufgerufen, sondern über die vtable einer Instanz, und wenn es keine Instanz gibt, geht das unweigerlich in die Hose.

Ich sehe jetzt auch ein, warum die Methode nicht static sein darf (virtuelle Überschreibung), aber irgendwie sieht das ganze Design krank aus.

Warum hast du keine DataConfigCore-Instanz zur Verfügung? Du musst welche haben, sonst machen virtuelle APIs keinen Sinn.

nrOfDecimals_ ist eine statische Membervariable, d.h. du kannst den Wert über JEDE DataConfigCore-Instanz erreichen, die haben alle denselben.

An getAsString irgendeine gültige Instanz übergeben, egal welche, dann geht das.
 
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: