Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Copy-Konstruktor und operator=

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
11.07.2006, 16:16 Uhr
zubrowa



Hallo,

ich habe eine Beispielklasse mit einem Copy-Konstruktor
und einem Zuweisungsoperator. Sind die Konstrukte Eurer
Meinung nach in Ordnung oder habt Ihr irgendwelche
Kommentare/Verbesserungsvorschläge?


C++:
#include <map>
#include <list>
#include <string>

class C {};
class B {};

class A : public C {

  public:
    A();
    ~A();
    A( const A& );
    A& operator=( const A& );

  private:
    struct str_type {
      int a;
      int b;
      int *c;
    } mStruct;

    std::map< std::string, int > mMap;

    std::list< int > mList;

    std::map< int, B* > mMap2;

    static int mS;
    const int mC;
    B *mB;              // Pointer to another class
};

// Copy constructor
A::A( const A& a )
  : mStruct( a.mStruct ),
    mMap( a.mMap ),
    mList( a.mList ),
    mMap2( a.mMap2 ),
    mC( a.mC ),
    mB( new B( *a.mB ) ) {
      
      for (std::map< int, B* >::const_iterator it( a.mMap2.begin() );
          it != a.mMap2.end(); ++it )
        mMap2.insert( std::make_pair( it->first, new B( *(it->second) ) ) );
};

// Assignment operator
A& A::operator=( const A& a ) {
  if ( this != &a ) {
    B* bakB = 0;
    try {
      bakB = new B( *a.mB );
    }
    catch( ... ) {
      delete bakB;
      throw;
    }
    C::operator=( a );
    delete mB;
    mB = bakB;
    mStruct = a.mStruct;

    mMap = a.mMap;

    mList = a.mList;

    mMap2.clear();
    for (std::map< int, B* >::const_iterator it( a.mMap2.begin() );
      it != a.mMap2.end(); ++it )
      mMap2.insert( std::make_pair( it->first, new B( *(it->second) ) ) );

    mS  = a.mS;
  }
  return *this;
};


Gruß,
Christian

Bearbeitung von ao:
Ein Satz cpp-Tags zum Angewöhnen

Dieser Post wurde am 12.07.2006 um 09:08 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
11.07.2006, 22:58 Uhr
ao

(Operator)


Zum Copy-Constructor:
Das mStruct sollte "tief" kopiert werden; bei der bitweisen Kopie, die da gemacht wird, zeigen die *c-Pointer auf dieselben Ziele.

mC und mB werden ebenfalls nur bitweise kopiert. Ob das Ok ist oder nicht, kann man nicht sagen, wenn man die Klassendefinitionen nicht kennt.

Das C als Basisklasse von A wird nur implizit initialisiert. Kann OK sein, kann falsch sein, das kommt auf C an.

So weit erst mal

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
11.07.2006, 23:26 Uhr
xXx
Devil


mach mal jemand codetags rein... so kann man da ja garnet durchblicken
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
12.07.2006, 19:23 Uhr
zubrowa



Also sollte der Copy-Konstruktor in etwa so aussehen:

A::A( const A& a)
: ...
{
mStruct.a = a.mStruct.a;
mStruct.b = a.mStruct.b;
mStruct.c = new int( *a.mStruct.c );
...
}

Muß denn dann mStruct.c vom Destruktor mit "delete" gelöscht werden?

Vermutlich hängt es davon ab, wie der Konstruktor aussieht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
13.07.2006, 09:34 Uhr
stephanw
localhorst


In diesem Fall sollte die Klasse A einen Copy-Con und operator= haben, klar. Der Klasse (struct) str_type würde ich lieber eigene Copy-Con und operator= verpassen, auch wenn sie innerhalb von A privat ist. Damit kann man dann auch innerhalb von A's Methoden entspannter umgehen.
--
Reden ist Schweigen und Silber ist Gold.

Dieser Post wurde am 13.07.2006 um 09:35 Uhr von stephanw editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
13.07.2006, 12:47 Uhr
zubrowa



Danke, ich wußte gar nicht, dass man auch copy constructors und operator= für structs
definieren kann. Bisher dachte ich, das geht nur für Klassen
Könntest Du mir ein Beispiel geben, wie das für meine o.g. struct aussehen würde?

Danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
13.07.2006, 13:58 Uhr
kronos
Quotenfisch
(Operator)



Zitat von zubrowa:
Danke, ich wußte gar nicht, dass man auch copy constructors und operator= für structs
definieren kann. Bisher dachte ich, das geht nur für Klassen

Der einzige unterschied zwischen Klassen und structs ist, das die Elemente bei Klassen per default private sind und bei structs public.
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
13.07.2006, 15:31 Uhr
stephanw
localhorst



C++:
struct str_type
{
  str_type()
  {
     c = new int[23];
  }
  str_type(const str_type& other)
  {
     c = new int[23];
     // copy values of c[]
  }
  str_type& operator=(const str_type& other)
  {
     if ( &other == this ) return *this;
     // else
     delete[] c;
     c = new int[23];
     // copy values of c[]
     return *this;
  }
  int a;
  int b;
  int *c;
};



Der operator= ist nicht perfekt. Falls das Allokieren von c fehlschlägt, ist die Kacke am Dampfen. AFAIK hat "virtual" mal irgendwo (FAQ ?) einen Beitrag dazu geschrieben. Ansonsten findet man in guter Fachliteratur auch Diskussionen zum Thema.
--
Reden ist Schweigen und Silber ist Gold.
 
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: