2016-06-29 10 views
0

Ich kenne zwei Möglichkeiten zur Deklaration nicht-nested-Klasse in einem Klassenkörper.Wie forward-deklarieren nicht angebrochenen Klasse in einem Klassenkörper ohne Freundschafts- oder Deklaration von Zeiger

Zunächst ist:

class A 
{ 
    friend class B; // B is forward-declared + friend 
}; 

Und das zweite ist:

class A 
{ 
    class B* ptr; // B is forward-declared + pointer 
}; 

Es ist möglich, eine Klasse außerhalb der Klasse Körper voraus erklären, aber für bestimmte Grund lassen Sie uns über diese Option vergessen;

So würde Ich mag möglich machen, so Mitglied zu erklären:

class A 
{ 
    /* somehow declare B in the body*/ 
    B* getInstanceB(); 
}; 

Es lohnt sich zu erwähnen, dass: mit einem Zeiger erklärt:

class A 
{ 
    class B* pointer; 
    B* getInstanceB(); //fine 
}; 

Mit Freund Erklärung:

Ich bedauere zutiefst, dass es keine solche Vorwärts-Deklaration Syntax gibt wie:

class ::[optional-namespace::]ClassName;

, die die Vorwärts-Deklaration der verschachtelten Klasse von der Vorwärts-Deklaration der Nicht-Nested-Klasse unterscheiden würde. Ist es möglich, dies auf andere Weise im aktuellen Standard zu tun?

+3

Was ist los mit nach vorn 'B' außerhalb von 'A' erklären? – erenon

+0

@erenon Es ist nichts falsch. Aber wenn es eine andere Möglichkeit gibt, würde ich es gerne wissen :) – xinaiz

+0

Lass mich das bekommen.Sie versuchen herauszufinden, ob es eine andere Lösung für ein Problem gibt, wenn es eine bestehende Lösung gibt, und es funktioniert gut. –

Antwort

2

Um zukunfts zu deklarieren eine Klasse B innerhalb der Klassendefinition von A genannt, ohne dass die Klasse innerhalb A verschachtelt werden, so können Sie in etwa wie folgt tun:

class A { 
    typedef class B B; 
    // do something with B 
}; 

Eine Erklärung kann here finden.

Eine Demonstration, dass dies tatsächlich funktioniert: http://coliru.stacked-crooked.com/a/27913ce45a572d36

+0

Ist das nicht eine rechnerische Erklärung? (Test setzt 'B * ptr;' direkt nach Klasse A) –

+0

@ DieterLücking Das OP möchte, dass die Forward-Deklaration innerhalb der Klassendefinition von 'A' liegt. – Brian

0

Also was Sie versuchen zu tun ist eine Instanz einer Klasse innerhalb einer anderen Klasse haben aber die Definition nach der "Container-Klasse"?

//forward declaration of B 
class B; 

class A 
{ 
    public: 
    B* getInstanceB(); 

    private: 
    B b_; 

}; 

B* A::getInstanceB() 
{ 
    return &b_; 
} 

//implementation of B 
class B{}; 

gefällt das?

HTH

+0

Nein, das wollte ich in diesem Beispiel vermeiden. Es geht darum, die Klasse B innerhalb des Körpers der Klasse A zu deklarieren, nicht außerhalb. – xinaiz

+0

gut Sie könnten nur eine Namespace-Anweisung in Ihrer Klasse machen A sehen: http://www.cplusplus.com/doc/tutorial/namespaces/ – jaaq

0

Ich bedauere zutiefst, dass es nicht so ist voraus erklärt Syntax wie:

class ::[optional-namespace::]ClassName; 

die verschachtelte Klasse voraus Erklärung von nicht verschachtelten Klasse voraus Erklärung unterscheiden würde. Ist es möglich, dies auf andere Weise im aktuellen Standard zu tun?

Nein, das glaube ich nicht.