View previous topic :: View next topic |
Author |
Message |
manuels Advocate
Joined: 22 Nov 2003 Posts: 2146 Location: Europe
|
Posted: Fri Sep 18, 2009 9:57 am Post subject: OT: C++ Membervariable als Referenz [solved] |
|
|
Hi,
mal etwas anderes: Ein C++-Problem.
Ich habe folgenden Code:
Code: | using namespace std;
class Klasse1 {
int wert1;
public:
Klasse1() {
wert1 = 9999;
}
int& getWert() { return wert1; }
};
class Klasse2 {
int wert2;
public:
Klasse2(Klasse1* k1) {
wert2 = k1->getWert();
}
};
int main() {
Klasse1* k1 = new Klasse1();
Klasse2 k2(k1);
}
|
Welcher auch wunderbar funkioniert.
Nun soll allerdings, wenn sich der Wert von Klasse1::wert1 aendert "automatisch" auch der Wert von Klasse2::wert2 aendern.
Das macht man naetuerlich mit einer Referenz.
Also wird Klasse2 so abgeandert:
Code: | class Klasse2 {
int &wert2; // <- Hieraus wird eine Referenz
public:
Klasse2(Klasse1* k1) {
wert2 = k1->getWert();
}
}; |
Doch leider mag das der Gnu-C++-Kompiler (und wohl auch jeder andere Kompiler) nicht:
Code: | test.cpp:18: error: uninitialized reference member `Klasse2::wert2' |
Er maekert, dass Klasse2::wert2 nicht initialisiert wurde. Das kann ich aber erst im Konstruktor machen, oder?
Er gibt mir keine Chance das Ding zu initialisieren!
Folgender Code in der main() funkioniert:
Code: | int &wert3 = k1->getWert(); |
Ich moechte aber keine Referenz in der main()-Funkion, sondern in der Klasse2.
Gibt es irgendeine Moeglichkeit dies zu realisieren? _________________ Build your own live cd with catalyst 2.0!
Last edited by manuels on Fri Sep 18, 2009 2:11 pm; edited 1 time in total |
|
Back to top |
|
|
69719 l33t
Joined: 20 Sep 2004 Posts: 865
|
Posted: Fri Sep 18, 2009 11:43 am Post subject: |
|
|
Code: |
#include <stdio.h>
using namespace std;
class Klasse1 {
public:
Klasse1( int value ) {
wert1 = value;
}
int *getPointer( void ) {
return &wert1;
}
int getWert( void ) {
return wert1;
}
private:
int wert1;
};
class Klasse2 {
public:
Klasse2( Klasse1* k1 ) {
wert2 = k1->getPointer();
}
int getWert( void ) {
return *wert2;
}
private:
int *wert2;
};
int main( int argc, char *argv[] ) {
Klasse1 k1( 9999 );
Klasse2 k2( &k1 );
printf( "k1=%d\n", k1.getWert() );
printf( "k2=%d\n", k2.getWert() );
return 0;
}
|
|
|
Back to top |
|
|
mrsteven Veteran
Joined: 04 Jul 2003 Posts: 1939
|
Posted: Fri Sep 18, 2009 12:57 pm Post subject: |
|
|
Oder du benutzt Initialisierungslisten:
Code: | using namespace std;
class Klasse1 {
int wert1;
public:
Klasse1() {
wert1 = 9999;
}
int& getWert() { return wert1; }
};
class Klasse2 {
int &wert2;
public:
Klasse2(Klasse1* k1) :
wert2(k1->getWert()) //Das hier!
{
}
};
int main() {
Klasse1* k1 = new Klasse1();
Klasse2 k2(k1);
} |
|
|
Back to top |
|
|
manuels Advocate
Joined: 22 Nov 2003 Posts: 2146 Location: Europe
|
|
Back to top |
|
|
Earthwings Bodhisattva
Joined: 14 Apr 2003 Posts: 7753 Location: Germany
|
Posted: Sun Sep 20, 2009 7:31 am Post subject: |
|
|
Eigentlich kannst Du k1 auch auf dem Stack anlegen, dann musst Du den Speicher nicht selbst freigeben.
Code: | Klasse1 k1;
Klasse2 k2(&k1); |
_________________ KDE |
|
Back to top |
|
|
|