Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » C++ Konstruktor problem

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
21.08.2003, 00:35 Uhr
~conman
Gast


Hallo Leute!

Ich möchte aus einem Konstruktor heraus einen anderen Konstruktor aufrufen, der die standard-initialisierung übernimmt.
Leider weiß ich nicht wie das geht.
this->A(..) funktioniert nicht und auch A::A(..) wäre falsch, da ein neues Objekt erzeugt wird.

Um nochmal den Sachverhalt klar zu machen:


Code:
class A {
public:
  int* m_a;
  A(int n) { m_a = new int[n]; }
  A(int n, int m) {
    this->A(n*m);           //Funzt leider nicht..
  }
};



Danke! conman
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.08.2003, 01:00 Uhr
Pablo
Supertux
(Operator)


Ich würde es so machen:


C++:
class A {
public:
  int* m_a;
  A(int n) { m_a = new int[n]; }
  A(int n, int m) {
    A tmp(n*m);
    *this = tmp;
  }
};



Ich hab es getestet und bei mir hat es funktioniert. Es wird tatsächlich kompiliert (oder? ). Das Problem ist, dass this->A(n*m) ein neues Objekt erzeugt, das nicht this ist, und deshalb geht da verloren (ich bin nicht sicher von der Erklärung). Aber ich bin sicher, dass mein Code funktioniert.

Ich glaube, die beste Lösung wäre ein Copy-Konstruktor, oder? Mal sehen, was die anderen dazu sagen.

Ich hab damit ausprobiert:

C++:
#include <iostream>
using namespace std;
class A {
public:
  int k;
  A();
  A(int);
  A(int,int);

};

A::A()
{
    this->k=0;
}

A::A(int a)
{
   A tmp(a,10);
   *this = tmp;
}

A::A(int a, int b)
{
    this->k=a*b;
}

int main()
{
    A a,b(8),c(5,8);
    cout << a.k << " " << b.k << " " << c.k << endl;
}


Ausgabe: 0 80 40
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 21.08.2003 um 01:03 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.08.2003, 01:18 Uhr
~conman
Gast


Danke für deine Antwort!

Leider bin ich mir ziemlich sicher, dass das keine gute Idee ist:
Wenn ein Objekt erzeugt wird werden vor dem Konstruktoraufruf alle Member-Objekte der Klasse initialisiert (also auch Speicher bereitgestellt)
In deinem Bsp war das ein Integer (int k). Wenn dann im Konstruktor ein tmp-Objekt erzeugt und der Objekt-Zeiger umgelenkt wird, ist dieser Speicher verloren!

Trotzdem danke!

PS: Ich stelle mir eigentlich so etwas vor, wie es in Java geht, da kann man auch aus einem Konstruktor den anderen Konstruktor der selben Objekt-Instanz aufrufen. Das muss doch mit C++ auch irgendwie gehen!?!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.08.2003, 01:33 Uhr
0xdeadbeef
Gott
(Operator)


Iiiiih!!!! Knick das erste Code-Fragment, this = <bla> ist keine gute Idee. C++ kennt keine Konstruktordelegation a la Java. Übrigens eines der Features, die ich in C++ vermisse - vielleicht mal an die ISO wenden, kann sein, dass sie es in der nächsten Revision des Standards berücksichtigen. Für die meisten Fälle kann man aber vernünftige Workarounds finden, in dem man private Member-Funktionen anlegt und/oder Default-Werte für Parameter angibt:

C++:
class A {
private:
  void init(int);
public:
  A(int);
  A(double);
};

A::A(int i) { init(i); }
A::A(double d) { init(int(d)); }

void A::init(int i) { std:.cout << i << std::endl; }


bzw.

C++:
class A {
public:
  A(int = 3);
};

A::A(int i = 3) { std::cout << i << std::endl; }


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.08.2003, 02:16 Uhr
~Martin
Gast


Eine simple Lösung wäre eine Art Dummy-Funktion, die einfach von beiden Konstruktoren gerufen werden kann. Etwa so:


C++:
# include <iostream.h>

class A
{
public:
    int x;
    A(int n) { setze(n); }
    A(int n, int m) { setze(n*m); }

    void setze(int n) { x=n; }
};

int main()
{
    A test1(10);
    A test2(10, 2);

    cout << "test1: " << test1.x << ", test2: " << test2.x << endl;
}



Ausgabe wäre dann: test1: 10, test2: 20

Gruß
Martin
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: