Seite 1 von 2

anderen Konstruktor der eigenen Klasse aufrufen

Verfasst: Mo Feb 11, 2013 9:11 am
von Glocke
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

Re: anderen Konstruktor der eigenen Klasse aufrufen

Verfasst: Mo Feb 11, 2013 2:57 pm
von Kerli
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.

Re: anderen Konstruktor der eigenen Klasse aufrufen

Verfasst: Mo Feb 11, 2013 3:07 pm
von fat-lobyte
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)
{}

Re: anderen Konstruktor der eigenen Klasse aufrufen

Verfasst: Mo Feb 11, 2013 4:24 pm
von Glocke
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

Re: anderen Konstruktor der eigenen Klasse aufrufen

Verfasst: Mo Feb 11, 2013 5:17 pm
von fat-lobyte
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.

Re: anderen Konstruktor der eigenen Klasse aufrufen

Verfasst: Mo Feb 11, 2013 5:51 pm
von Glocke
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

Re: anderen Konstruktor der eigenen Klasse aufrufen

Verfasst: Mo Feb 11, 2013 7:55 pm
von Kerli
Delegating Constructors benötigen gcc 4.7...

Re: anderen Konstruktor der eigenen Klasse aufrufen

Verfasst: Mo Feb 11, 2013 8:54 pm
von Glocke
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

Re: anderen Konstruktor der eigenen Klasse aufrufen

Verfasst: Mo Feb 11, 2013 9:33 pm
von Kerli
Hast du -std=c++11 aktiviert?

Re: anderen Konstruktor der eigenen Klasse aufrufen

Verfasst: Di Feb 12, 2013 8:54 am
von Glocke
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