www.mikrocontroller.net

Forum: PC-Programmierung Liste mit Koordinaten C++


Autor: chrigu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

Ich habe die folgende Liste in C++:
  List<int> Liste;
  Liste.Add(5);
  Liste.Add(1);
  Liste.Add(1);
  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:
class Coordinate
{
int x_pos;
int y_pos;
public:
  Coordinate(int x, int y){
  x_pos = x;
  y_pos = y;
  }
};
und folgende Liste:
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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: chrigu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Referenzen schon, aber ohne Handle.

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

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: chrigu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nee, bleib mal lieber bei vernünftigem C++...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.