anderen Konstruktor der eigenen Klasse aufrufen

Schnelle objektorientierte, kompilierende Programmiersprache.
Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

anderen Konstruktor der eigenen Klasse aufrufen

Beitrag von Glocke » Mo Feb 11, 2013 9:11 am

Hi,

ich suche einen Weg beim Aufruf des Konstruktors einen anderen Konstruktor der eigenen Klasse aufzurufen. Dabei habe ich folgendes "hinbekommen":

Code: Alles auswählen

#include <iostream>

class Test {
	protected:
		int a, b;
	public:
		Test(int a, int b);
		Test(int a);
		Test();
};

Test::Test(int a, int b)
	: a(a)
	, b(b) {
	std::cout << "a=" << a << ", b=" << b << std::endl;
}

Test::Test(int a) {
	Test(a, a);
}

Test::Test() {
	Test(0, 0);
}

int main() {
	Test a;
	Test b(1);
	Test c(2, 3);
}
Also zumindest erscheint erstmal die gewünscht Ausgabe. Nur frage ich mich, ob er wirklich das macht was er soll, oder ob das (wegen was auch immer) nur Zufall ist :lol: Ich hoffe ihr wisst was ich meine ^^

LG Glocke

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: anderen Konstruktor der eigenen Klasse aufrufen

Beitrag von Kerli » Mo Feb 11, 2013 2:57 pm

Der Code tut nicht das was du vermutest. Gib doch einmal in jedem Konstruktor 'this' aus ;) Konstruktoren aus Konstruktoren aufzurufen ist erst mit C++11 möglich (http://en.wikipedia.org/wiki/C%2B%2B11# ... mprovement) So wie du es machst erzeugst du nur temporäre Instanzen deiner Klasse die sofort wieder zerstört werden.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: anderen Konstruktor der eigenen Klasse aufrufen

Beitrag von fat-lobyte » Mo Feb 11, 2013 3:07 pm

Dies ist mit C++03 nicht direkt möglich. Du kannst den gemeinsamen Code in eine statische Klassenfunktion auslagern.

Mit C++11 geht das:

Code: Alles auswählen

Test::Test(int a)
    : Test(a, a)
{}
Haters gonna hate, potatoes gonna potate.

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: anderen Konstruktor der eigenen Klasse aufrufen

Beitrag von Glocke » Mo Feb 11, 2013 4:24 pm

fat-lobyte hat geschrieben:Mit C++11 geht das:

Code: Alles auswählen

Test::Test(int a)
    : Test(a, a)
{}
Irgendwie klappt das nicht. Folgender Code:

Code: Alles auswählen

#include <iostream>

class Test {
    protected:
        int a, b;
    public:
        Test(int a, int b);
        Test();
        void print();
};

Test::Test(int a, int b)
   : a(a)
   , b(b) {
   std::cout << "a=" << a << ", b=" << b << std::endl;
}

Test::Test()
    : Test(0, 0) {
}

void Test::print() {
    std::cout << "a=" << a << ", b=" << b << std::endl;
}

int main() {
    Test a;
    Test b(2, 3);
    a.print();
    b.print();
}
g++ -o test test.cpp -std=c++0x liefert:
test.cpp: In Konstruktor »Test::Test()«:
test.cpp:19:7: Fehler: Typ »Test« ist keine direkte Basis von »Test«
Was mache ich falsch?

LG Glocke

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: anderen Konstruktor der eigenen Klasse aufrufen

Beitrag von fat-lobyte » Mo Feb 11, 2013 5:17 pm

Bitte poste noch

Code: Alles auswählen

gcc --version
und versuchs nochmal mit

Code: Alles auswählen

Test::Test()
    : Test::Test(0, 0) {
}
Ich muss zugeben, ich habe das selbst noch gar nicht verwendet.
Haters gonna hate, potatoes gonna potate.

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: anderen Konstruktor der eigenen Klasse aufrufen

Beitrag von Glocke » Mo Feb 11, 2013 5:51 pm

fat-lobyte hat geschrieben:und versuchs nochmal mit

Code: Alles auswählen

Test::Test()
    : Test::Test(0, 0) {
}
Das gleiche Ergebnis..

Code: Alles auswählen

gcc --version
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.
Dies ist freie Software; die Kopierbedingungen stehen in den Quellen. Es
gibt KEINE Garantie; auch nicht für MARKTGÄNGIGKEIT oder FÜR SPEZIELLE ZWECKE.
Sonstige C++11-Spezialitäten funktionieren aber. Wahrscheinlich ist syntaktisch noch irgendwas falsch.

LG Glocke

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: anderen Konstruktor der eigenen Klasse aufrufen

Beitrag von Kerli » Mo Feb 11, 2013 7:55 pm

Delegating Constructors benötigen gcc 4.7...
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: anderen Konstruktor der eigenen Klasse aufrufen

Beitrag von Glocke » Mo Feb 11, 2013 8:54 pm

Ich hab jetzt GCC-4.7 aus einem PPA installiert (Ubuntu Precise bietet nur die 4.6) aber irgendwie zickt der neue Compiler noch rum... ich schau morgen mal ob ich das in den Griff bekomme. Ansonsten muss ich eben eine zusätzliche Initialisierungsmethode verwenden, also quasi

Code: Alles auswählen

#include <iostream>

class Test {
    private:
        void init(int a, int b);
    protected:
        int a, b;
    public:
        Test(int a, int b);
        Test();
        void print();
};

Test::Test(int a, int b) {
    this->init(a, b);
}

Test::Test() {
    this->init(0, 0);
}

void Test::init(int a, int b) {
    this->a = a;
    this->b = b;
    std::cout << "a=" << a << ", b=" << b << std::endl;
}

void Test::print() {
    std::cout << "a=" << a << ", b=" << b << std::endl;
}

int main() {
    Test a;
    Test b(2, 3);
    a.print();
    b.print();
}
LG Glocke

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: anderen Konstruktor der eigenen Klasse aufrufen

Beitrag von Kerli » Mo Feb 11, 2013 9:33 pm

Hast du -std=c++11 aktiviert?
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: anderen Konstruktor der eigenen Klasse aufrufen

Beitrag von Glocke » Di Feb 12, 2013 8:54 am

Kerli hat geschrieben:Hast du -std=c++11 aktiviert?
Ja, habe ich probiert:
christian@glocke:/tmp$ gcc-4.7 --version
gcc-4.7 (Ubuntu/Linaro 4.7.2-11precise2) 4.7.2
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

christian@glocke:/tmp$ gcc-4.7 -o test test.cpp -std=c++0x
gcc-4.7: error trying to exec 'cc1plus': execvp: Datei oder Verzeichnis nicht gefunden
christian@glocke:/tmp$ gcc-4.7 -o test test.cpp -std=c++11
gcc-4.7: error trying to exec 'cc1plus': execvp: Datei oder Verzeichnis nicht gefunden

Antworten