Hallo allerseits,
ich haette mal eine Frage zu C++. Und zwar stolpere ich gerade ueber ein Problem. Aufs Wesentliche reduziert sieht der Code so aus:
test.h:
class Test { public: static Test* eintest(); private: int i; };
------------------- test.cpp:
Test* Test::eintest() { Test* t = new Test(); t->i = 5; return t; }
-------------------
D.h. ich greife in der statischen Funktionen auf private Elemente eines Objektes dieser Klasse zu. Der gcc schluckt das offenbar ohne Beanstandungen. AFAIR akzeptiert er auch Sachen wie
Object::Object(Object& clone) :t(clone.t)
wobei t privat ist. Meine Frage jetzt: Ist das offizielles C++ oder eine gcc-Erweiterung?
Ulf
D.h. ich greife in der statischen Funktionen auf private Elemente eines Objektes dieser Klasse zu. Der gcc schluckt das offenbar ohne Beanstandungen. AFAIR akzeptiert er auch Sachen wie
Alle Methoden haben Zugriff auf private Member. Das ist ja genau die definition von "private".
Was Du da mit Test::eintest() machst sieht sogar nach einer Factory aus, bei der man üblicherweise sogar den ctor private macht:
class Test { public: static Test* createTest() { return new Test(); } private: Test() {} };
HTH, Eric
On Wed, Nov 15, 2006 at 05:27:18PM +0100, Ulf Lorenz wrote:
Hallo allerseits,
Hi Ulf,
class Test { public: static Test* eintest(); private: int i; };
test.cpp:
Test* Test::eintest() { Test* t = new Test(); t->i = 5; return t; }
D.h. ich greife in der statischen Funktionen auf private Elemente eines Objektes dieser Klasse zu.
Da du auf eine Instanz der Klasse (new Test()) zugreifst ist das kein Problem, wenn du versucht hättest direkt auf i zuzugreifen hätte dich der Compiler schon gewarnt bzw. hätte abgebrochen.
Der gcc schluckt das offenbar ohne Beanstandungen. AFAIR akzeptiert er auch Sachen wie
Object::Object(Object& clone) :t(clone.t)
Ja, ist ja auch in Ordnung. Klasseninstanzen können untereinander auf ihre Membervariablen/private Methoden zugreifen.
Wenn du folgende Definition verwendest:
class Foo { friend class Bar;
private: int geheim; };
könntest du sogar das machen:
class Foo { public: Foo( const Bar &bar ) : auchGeheim( bar.geheim ) { }
private: int auchGeheim; };
Meine Frage jetzt: Ist das offizielles C++ oder eine gcc-Erweiterung?
Offizieller C++ Standard.
Ciao, Tobias
lug-dd@mailman.schlittermann.de