Wie erhalte ich Zugang zu einem privaten Konstruktor in eine eigene Klasse?
Ich Schreibe eine library in C++. Ich habe zwei Klassen, die in " meine Bibliothek A
und B
. Ich will zu verstecken A()
Konstruktor von code, Referenzen meiner Bibliothek. Ich möchte auch Klasse B
zu können, rufen Sie die A()
Konstruktor.
Komme ich aus einer C# - hintergrund und erinnern wenig an meine C++. In C# würde ich einfach erklären, die A()
Konstruktor als internal
. Ich habe gelesen, dass die nächste Möglichkeit in C++ ist eine Kombination von friend
Erklärungen und forward-Deklarationen. Wie mache ich das? Hier sind meine drei Dateien unter:
A. h:
#pragma once
class A
{
private:
A();
};
B. h
#pragma once
class A;
class B
{
public:
A createA();
};
B.cpp:
#include "A.h"
#include "B.h"
A B::createA()
{
A result; //cannot access private member declare in class 'A'
return result;
}
Ich habe versucht, indem diese a-h:
public: friend A createA();
Ich habe stattdessen versucht, indem diese a-h mit einem entsprechenden forward-Deklaration:
public: friend A B::createA();
Ich habe stattdessen versucht, hinzufügen und extern class B;
zu a-h und das B eine Klasse wie folgt aus:
public: friend class B;
Bin ich ratlos.
Ich denke, das könnte einfacher sein, wenn ich die B::createA()
Funktion gibt einen Zeiger auf eine A
- Objekt, anstatt ein A
Objekt direkt, aber das geht nicht in meinem Fall. Ich bin emuliert eine geschlossene API und der API-Aufruf gibt einen A
Objekt, sondern einen Zeiger.
InformationsquelleAutor user2023861 | 2013-09-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werden Sie wahrscheinlich nur brauchen, um die drop "extern" aus Ihrem Dritten Versuch, um Sie in einer korrekten vorwärts-Deklaration. Versuchen:
A. h:
Das war es dann. Danke! Ist es möglich, nur die
createA()
Funktion ein Freund, und nicht die ganze Klasse?Ja, es ist. Im Grunde würde kopieren Sie die gesamte Funktion Unterschrift (Umfang enthalten) und Platz
friend
vor. Zum Beispiel:friend A B::CreateA();
Das wird nicht funktionieren, da
B
ist nur vorwärts deklariert. Und Sie können nicht definierenB
vorA
da, als du schon brauchenA
da sind Sie wieder, es auscreateA
.Ich wollte eigentlich nur sagen, dass es nicht kompilieren. Es ist nicht vorgeschrieben, dass nur die Funktion ist ein Freund. Ich halte die Klasse als Freund. Nochmals vielen Dank!
InformationsquelleAutor Daniel Frey
Brauchen Sie nicht die
external
Schlüsselwort. Machen Sie es sich einfach:Live Beispiel.
InformationsquelleAutor Pierre Fourgeaud
Wenn es absolut notwendig ist, sollten Sie
A
Konstrukt selbst (oder haben eine Fabrik, die schafftA
). Wenn Sie wirklich wollenB
es zu tun:Hinweis: Sie muss erklären
B
vor und erklärten Siefriend
imA
.Wenn Sie nur die Funktion als Freund:
friend class A B::CreateA();
<- warum hast du Klasse hinzufügen-Taste, bevorA
Frage ich mich? Ich meine, ist das nicht redundant?Sie besagt, dass
B
ist ein Freund vonA
nicht, dassA
ist ein Freund der Klasse.InformationsquelleAutor Zac Howland
Können Sie stellen Sie B ein Freund von A:
InformationsquelleAutor Sergey K.