2016-07-17 18 views
-2

Dies kann eine sehr grundlegende Frage sein. Wie kann ich einen Konstruktor nach der Variablendeklaration aufrufen? Zum Beispiel ist dies ein Arbeitscode:Aufruf Konstruktor nach der Deklaration

// in header 
class Bar 
{ 
    SomeClass *foo; 
public: 
    Bar(); 
} 

// in .cpp 
Bar::Bar() 
{ 
    foo = new SomeClass(1, 2, 3); 
} 

Aber wie kann ich das ändern, so foo kein Zeiger ist?

Danke!

+1

Was bedeutet der Kommentar "in der Klasse"? Bitte fügen Sie ein konkretes Beispiel für Ihr Problem hinzu. Für jetzt habe ich gewählt, um zu schließen ** fehlt Beispiel **. –

+0

@ Cheersandhth.-Alf Ich habe die Frage bearbeitet. –

+0

OK, ich habe die Schlussabstimmung zurückgezogen. –

Antwort

1

Wenn Ihre foo innerhalb der Klasse definiert wird dann Konstruktor Initialisiererliste wie folgt verwenden:

class X { 
    X() : foo(1,2,3) {} 
    SomeClass foo; 
}; 

Wenn Sie berechnet Argumente foo es Konstruktor brauchen dann wird es schwieriger. Sie könnten Funktionen hinzuzufügen, die Ihre Werte, dh .:

class X { 
    X() : foo(initX(),initY(),initZ()) {} 
    SomeClass foo; 

    static int initX() { return 1;} 
    static int initY() { return 2;} 
    static int initZ() { return 3;} 
}; 

berechnen würde, aber dies ist nicht immer möglich - das heißt, es hängt davon ab, wie Sie Ihre Werte berechnen. (Statisch ist beabsichtigt, da Sie besser nicht vollständig konstruierte Klassenmitglieder verwenden sollten).

Sie könnten diese Werte auch als Konstruktorparameter übergeben.

+0

Wirklich? Ich meine, das muss ein häufiges Problem sein - Sie haben eine Klasse mit einer Variablen (Klasse) und Sie wollen ihren Konstruktor mit einigen Argumenten aufrufen (nicht der Standard-Ctor). Also ist die einzige Lösung, einen Zeiger zu verwenden? –

+1

@ MartinHeralecký sehe meine edit2, ich denke, das sollte die Lösung sein – marcinj

+0

Bei deiner ersten Bearbeitung habe ich diesen Kommentar ursprünglich gelöscht, aber dann erkannte ich, dass es zwar erlaubt wäre, aber 'foo' wäre doppelt so aufgebaut, wie du sagst. – ArchbishopOfBanterbury

1

ersetzen

class Bar 
{ 
    SomeClass *foo; 
public: 
    Bar(); 
}; 

Bar::Bar() 
{ 
    foo = new SomeClass(1, 2, 3); 
} 

& hellip; mit

class Bar 
{ 
private: 
    SomeClass foo; 

public: 
    Bar(); 
}; 

Bar::Bar() 
    : foo{ 1, 2, 3 } 
{} 
+0

Das löst das Problem mit berechneten Argumenten nicht. –

+0

@ MartinHeralecký: Es löst nicht das Problem von schlechten Geräuschen aus dem Mikrowellenherd, das stimmt. Aber dieses Problem wird nirgendwo bisher erwähnt. Was ist das "Problem mit berechneten Argumenten"? Wenn es sich als nicht-trivial herausstellt, bitte posten Sie eine neue Frage darüber. Ändern Sie die bestehende Frage nicht wesentlich, weil dadurch bestehende Antworten ungültig werden. –

+0

Downvoter, bitte erklären Sie Ihren Downvote. –

1

Wenn Sie dies außerhalb einer Klasse deklarieren, wird es eine globale Variable sein. Um es in einer CPP-Datei aufgebaut sollten Sie es wahrscheinlich erklären extern im Kopf und dann den Konstruktor verwenden Sie, wenn Sie es in der CPP erklären

SomeModule.h:

extern SomeClass foo; 

SomeModule.cpp :

SomeClass foo(1, 2, 3); 

Wenn es eine Membervariable einer Klasse, dann können Sie den Konstruktor explizit wollen verwenden, indem Sie die Variable in der Mitglied Initialisierungsliste des Konstruktors

Initialisierung

OtherClass.h:

class OtherClass 
{ 
    SomeClass foo; 
    public: 
     OtherClass(); 
} 

OtherClass.cpp:

OtherClass::OtherClass() : foo(1, 2, 3) {}; 

Wenn will in der Mitte des Codes zu initialisieren, wie mit dem Zeiger Fall ist, dann können Sie nur mit dem Standard-Konstruktor initialisieren lassen und kopiere den Wert mit dem, den du willst, an der gleichen Stelle wie der Zeiger.

foo = SomeClass(1, 2, 3); 
Verwandte Themen