Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

ArthurII

Treue Seele

  • »ArthurII« ist der Autor dieses Themas

Beiträge: 132

Wohnort: Aachen

Beruf: Student

  • Private Nachricht senden

1

05.12.2010, 19:26

Poblem mit Kopierkosntruktor

Habe da ein Problem mit dem Kopierkonstruktor in C++:

Ich habe ihn so deklariert:

C-/C++-Quelltext

1
Matrix(const Matrix& other);


So ist dann meine definition:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Matrix::Matrix(const Matrix& other):
n(other.n), m(other.m)
{
    if (&other!=this)
    {
        const Matrix *pother = &other;
        
        for (int i=0; i<m; i++)
        {
            add_level();
            for (int j=0; j<n; j++)
                append2D(i, new DeriveValue(*static_cast<DeriveValue*>(pother->get2D(i,j))));
        }
        
        for (int i=0; i<nodes.len(); i++)
        {
            nodes.append(new Node(static_cast<Node*>(pother->nodes.get(i))));
        }
    }
}


Der Compiler (g++) moppert bei den Stellen get(i) und get2D(i,j) die geweils von einer Basisklasse vererbt sind:

Quellcode

1
2
3
4
Matrix.cpp: In copy constructor ‘Matrix::Matrix(const Matrix&)’:
Matrix.cpp:21: error: passing ‘const Matrix’ as ‘this’ argument of ‘Entity* List2D::get2D(int, int)’ discards qualifiers
Matrix.cpp:26: error: passing ‘const ListMain’ as ‘this’ argument of ‘Entity* ListMain::get(int)’ discards qualifiers
Matrix.cpp: In member function ‘void Matrix::zip_jacobi(Matrix&, Matrix&)’:


Die beiden Funktionen verändern natürlich nichts, sondern geben nur zurück. Deklarationen:

C-/C++-Quelltext

1
2
Entity* get2D(int x, int y);
Entity* get(int i);


Meine bisherigen Recherchen haben ergeben, dass es etwas mit der Aussage über const zu tun hat. Wenn ich die jedoch weglasse gibt es andere Fehler, die unangenehmer zu sein scheinen:

Quellcode

1
2
3
main.cpp:53: error: no matching function for call to ‘Matrix::Matrix(Matrix)’
../inc/Matrix.h:30: note: candidates are: Matrix::Matrix(Matrix&)
../inc/Matrix.h:28: note:                 Matrix::Matrix(int, int)


Für Hilfe und Erklärungen wäre ich sehr dankbar

hf

Arthur
Ich bin nicht verrückt - nur verhaltensoriginell!
Project-Seite: Aura

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

05.12.2010, 19:29

Du musst get2D und get const deklarieren, weil der Compiler nicht weiss, ob die Funktion etwas verändert oder nicht.

C-/C++-Quelltext

1
2
Entity* get2D(int x, int y) const;
Entity* get(int i) const;


btw:
Der Test in Zeile 4 ist überflüssig. 2x den Kopierkonstruktor von einem Objekt aufrufen geht nicht.

3

05.12.2010, 20:32

Solltest insgesamt ein wenig aufpassen mit const, unsigned und co. ... Was erhoffst du dir eigtl. dadurch das du na nen Pointer auf other nutzt?

Achja, im c-ctor von hast du private-Zugriff auf other ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Deviloper« (05.12.2010, 20:38)


drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

05.12.2010, 20:39

Was erhoffst du dir eigtl. dadurch das du na nen Pointer auf other nutzt?

Das habe ich mich auch gefragt. :P

Auch die news und die casts wecken ungute Gefühle in mir. Und dann implementierst du eine Matrix Klasse.. ich hoffe, dass du nicht erwartest, dass die irgendwie performant sein wird. ;)

ArthurII

Treue Seele

  • »ArthurII« ist der Autor dieses Themas

Beiträge: 132

Wohnort: Aachen

Beruf: Student

  • Private Nachricht senden

5

05.12.2010, 21:58

also den Check aus Zeile 4 mache ich aus Sicherheitsgründen, um kein memory-leak zu verursachen.
im Zuge von Schleifen usw. könnte es ja passieren, das es zu einer Selbstzuweisung kommt. und dann wäre die sache mit dem new krittisch

Die sache mit pointer war zur fehlersuche, das ist sinnlos :D hab ich nur ganz vergessen zu löschen, sry.

Und es muss nicht performant sein. ich wollte einfach alten Code recyclen um mir Arbeit zu ersparen. Im Nachhinein war es vll ein bisschen sinnlos aber jetzt rennt es einmal so, und es ist nur für 'ne Hausaufgabe an der Uni...

Aber danke für die Hilfe
Ich bin nicht verrückt - nur verhaltensoriginell!
Project-Seite: Aura

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

05.12.2010, 22:16

Kopierkonstruktor != Zuweisungsoperator!

Werbeanzeige