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

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

1

21.05.2016, 17:09

C++ Object ohne Werte nach Konstruktor

Hi,
wenn ich Objekten der Klasse B Werte im Konstruktor zuweise, sind sie in der Methode work wieder weg. Woran kann das liegen?

classB.h

C-/C++-Quelltext

1
2
3
4
5
6
7
8
class B : public A
{
public:
    B(void);
    work(int);
private:
    int value;
}


classB.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
#include "classB.h"
B::B(void)
{
    this->value = 2;
}

B::work(int number)
{
    //Wenn nach dem erstellen des Objects diese Methode verwendet wird, hat value nicht den Wert 2
    this->value += number;
}



Schöne Grüße,
MitgliedXYZ

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

21.05.2016, 19:23

Zeig mal ein komplettes Beispiel. Vor allem auch wie A aussieht, wie das Objekt erstellt wird und wo genau du den Wert, den du erwartest ausliest.

So wie es da steht wird der Wert ja value+number sein nach der Methode.

3

21.05.2016, 19:46

Welchen Wert hat es denn? Sind es gewisse Magicnumbern, welche zB von msvc benutzt werden, um anzuzeigen, dass es sich um gedeleteten speicher etc handelt? Mein Rat wäre natürlich Debuggen. Dass deine Speichermodule defekt sind oder von Sonnenwinden manipuliert wurden, schließe ich mal aus.

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

4

21.05.2016, 21:04

Hab den Code vermutlich zu sehr verallgemeinert. Ist eine Studienarbeit über eine Sortierungs Funktion.

Also ich habe eine Klasse CSortedList, davon erstelle ich mir in der main Funktion von Source.cpp Objekte. Wenn ich mir im Konstruktor von CSortedList einen Haltepunkt setze, sehe ich die Initialisierung mit den richtigen Werten. Wird danach die Insert Funktion aufgerufen, ist es so, als wäre das Objekt noch nicht initialisiert worden. Die int Variablen haben zum Beispiel den Wert -858993460. Was könnte die Fehlerursache dafür sein?

Das ist der Link zum vollständigen Code:
http://pastebin.com/u8JwdXxq

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

21.05.2016, 21:08

C-/C++-Quelltext

1
2
3
4
CSortedList::CSortedList(void)
{
    CSortedList(listSizeDefault);
}

Hier liegt dein Fehler. Hinweis: Nein, das ruft nicht den anderen Konstruktor auf, das würde so aussehen:

C-/C++-Quelltext

1
2
3
4
CSortedList::CSortedList()
 : CSortedList(listSizeDefault)
{
}

;)

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

6

21.05.2016, 21:14

Danke, du hast recht ^^

Wäre es C# wäre mein Code aber vom Prinzip gültig gewesen, oder?

Meine C++ Kenntnisse sind noch verbesserungsfähig :rolleyes:

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

7

21.05.2016, 21:15

Wäre es C# wäre mein Code aber vom Prinzip gültig gewesen, oder?


Nein.

C#-Quelltext

1
2
3
4
CSortedList()
 : this(listSizeDefault)
{
}

MitgliedXYZ

Alter Hase

  • »MitgliedXYZ« ist der Autor dieses Themas

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

8

21.05.2016, 21:19

Dann hab ich das verwechselt, oder könnte es vielleicht in Java so ähnlich funktioniert haben?

Hab ein Beispiel gefunden, in Java hätte es so ähnlich funktioniert:
http://www.leepoint.net/JavaBasics/oop/o…verloading.html

Ist aber vermutlich nicht der optimale Weg, bei Bugs einfach eine Sprache zu suchen, bei welcher der Code gültig ist ^^

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

21.05.2016, 21:21

Ja, in C# ging das iirc so (schon länger her, dass ich das angefasst hab). In C++ machst du da ein temporäres Objekt, das gleich wieder verschwindet... ;)

Btw:
  1. Smartpointer!
  2. Initialisierungsliste!
  3. Du könntest einfacht std::sort() verwenden.
  4. Deine "SortedList" sieht mir eigentlich eher wie ein Heap aus...dafür gibt's in der Standardbibliothek auch was...

10

21.05.2016, 21:23

Bzw statt Smartpointer entsprechende Container wie std::vector. new und delete nur aus guten Gründen verwenden.

Werbeanzeige