Forum: PC-Programmierung Liste mit Koordinaten C++


von chrigu (Gast)


Lesenswert?

Hallo Zusammen,

Ich habe die folgende Liste in C++:
1
  List<int> Liste;
2
  Liste.Add(5);
3
  Liste.Add(1);
4
  Liste.Add(1);
5
  Liste.Add(1);
Dies funktioniert prima. Nun möchte ich aber statt einer Liste mit 
Integer eine Liste mit Koordinaten.
Dazu habe ich folgende Klasse:
1
class Coordinate
2
{
3
int x_pos;
4
int y_pos;
5
public:
6
  Coordinate(int x, int y){
7
  x_pos = x;
8
  y_pos = y;
9
  }
10
};
und folgende Liste:
1
List<Coordinate> Coords;
Dies generiert die Fehlermeldung: Das generische Typargument für "T" 
kann nicht "bull::Coordinate" sein, es muss ein Werttyp oder ein Handle 
für einen Referenztyp sein.
Wie könnte ich dieses Problem lösen?
Mit freundlichen Grüssen
Chrigu

von Karl H. (kbuchegg)


Lesenswert?

chrigu schrieb:

> Dies generiert die Fehlermeldung: Das generische Typargument für "T"
> kann nicht "bull::Coordinate" sein, es muss ein Werttyp oder ein Handle
> für einen Referenztyp sein.
> Wie könnte ich dieses Problem lösen?

Dazu müsste man erst mal wissen, wie das Template List gemacht ist.
Die Standard C++ Liste kann es nicht sein, denn die heißt std::list mit 
einem kleinen l.

Aber abgesehen davon, denke ich, dass deiner Klasse einfach nur ein paar 
Member fehlen. Ich denke da zb an einen Default-Konstruktor. Was sonst 
noch notwendig ist, könnte man sagen, wenn man das List-Template kennen 
würde. Kann natürlich auch sein, dass dieses List-Template der 
tatsächliche Müll ist, denn eigentlich sollte sich eine Liste nicht 
dafür interssieren, was in ihr gespeichert wird und damit sollte es ihr 
egal sein, ob das jetzt ein einzelner int oder eine Klasse oder Pointer 
oder ... sind. Ist die Liste richtig geschrieben, dann ist das auch so.

Mein erster Ansatzpunkt wäre an dieser Stelle, das List Template zu 
zerpflücken. Alleine schon, weil ich weiß, dass sich eine Liste nicht 
darum kümmern soll, wer oder was in ihr gespeichert wird. Der 
tatsächlich einzig interessante Fall, ist der Fall, wenn die Liste 
Pointer enthält. Dann erhebt sich die Frage: Wer ist für den delete auf 
den Objekten hinter den Pointern verantwortlich?

von chrigu (Gast)


Lesenswert?

Hallo Karl Heinz
Ich danke dir für deine Antwort. Ich verwende Visual Studio 2008. Leider 
bin ich nicht wirklich gut in C++. Aber das List mit dem grossen "L" 
funktioniert definitiv. (siehe 
http://msdn.microsoft.com/de-de/library/6sh2ey19.aspx) Ich konnte das 
Problem nun aber mit dem std::list wie von dir vorgeschlagen lösen.
Mit bestem Dank und freundlichen Grüssen
Chrigu

von Karl H. (kbuchegg)


Lesenswert?

chrigu schrieb:
> Hallo Karl Heinz
> Ich danke dir für deine Antwort. Ich verwende Visual Studio 2008. Leider
> bin ich nicht wirklich gut in C++. Aber das List mit dem grossen "L"
> funktioniert definitiv.

Das glaub ich schon.
Es wird nur auf diesem Planeten wohl so um die 1 Million verschiedene 
Listen in Form von Templates geben, die alle List heißen.

> (siehe
> http://msdn.microsoft.com/de-de/library/6sh2ey19.aspx)

Aha. Wieder mal das .Net Geraffel.
Dachte ich mir irgendwie schon, als du von "es muss ein Werttyp oder ein 
Handle für einen Referenztyp sein." gesprochen hast. Die Begrifee 
Werttyp bzw. Referenztyp gibt es m.W. so in C++ nämlich gar nicht.

von Klaus W. (mfgkw)


Lesenswert?

Referenzen schon, aber ohne Handle.

Und Referenzen nicht in den Standardcontainern, bzw. nur mit Klimmzügen.

von Tom (Gast)


Lesenswert?

// listenTest.cpp: Hauptprojektdatei.

#include "stdafx.h"

using namespace System;
using namespace System::Collections::Generic;

value class Coordinate  //<--- Mach doch einfach eine WertKlasse draus
                        //mittels -value-
{
Int32 x_pos;
Int32 y_pos;
public:
  Coordinate(Int32 x,Int32 y)
  {
   x_pos = x;
   y_pos = y;
  }
};

int main(array<System::String ^> ^args)
{
  List<Coordinate> ^liste;

  liste= gcnew List<Coordinate>;

    Console::WriteLine(L"Hello World");
    return 0;
}

MfG, tom

von chrigu (Gast)


Lesenswert?

Hallo Tom,
von Werteklassen habe ich bis anhin nichts gehört! Werde ich noch 
ausprobieren.
Ich danke allen für die Hilfe!
mfg
chrigu

von Klaus (Gast)


Lesenswert?

Nee, bleib mal lieber bei vernünftigem C++...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.