Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Container als Element einer Klasse

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
09.11.2012, 15:50 Uhr
~Schamote
Gast


Hallo,

mit der Suchfunktion bin ich zu keinem Ergebnis gekommen und Google konnte mir leider auch nicht wirklich weiterhelfen, deswegen möchte ich hier um Hilfe bitten:


C++:
#ifndef _KOFFERRAUM_H_
#define _KOFFERRAUM_H_
#include <vector>
#include "Koffer.h"


class Kofferraum {
private:
    unsigned int Gesamtgewicht;
    unsigned int Gesamtwert;
    vector<Koffer*> *Inhalt;      // HIER
public:
    Kofferraum(unsigned int, unsigned int);
    ~Kofferraum();
    void add_Koffer(Koffer*);
    unsigned int get_Gesamtgewicht() const;
    unsigned int get_Gesamtwert() const;
    Koffer* get_Inhalt(int);
}



In der Klasse möchte ich eine Containerklasse als ein Element deklarieren, allerdings meldet er mir, dass nach "vector" ein Semikolon kommen soll (Syntaxfehler: Es fehlt ';' vor '<'), wenn ich das dann ändere, meldet er dann aber, dass kein Typ definiert wurde.

Wie kann ich es schaffen, dass der Vector oder eine Liste etc. Teil der Klasse wird?


Danke schonmal
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.11.2012, 16:11 Uhr
Tommix



Hallo,

C++:
std::vector...


using sollte man in Headern meiden.

Gruß,
Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.11.2012, 16:48 Uhr
~Schamote
Gast


Ok,

das hat mir schon sehr geholfen, da war ich mal wieder blind.


C++:
#include <list>
#include <stdexcept>
#include "Kofferraum.h"
#include "Koffer.h"


using std::out_of_range;   // HIER
using std::list;



Jetzt meldet der Compilier mir aber, dass hier ein Semikolon vor "using" fehlt, was ich mir wieder nicht erklären kann. Ich weiß allerdings jetzt nicht, ob das wieder ein anderer kleiner Fehler ist, den ich nicht sehe und der Compilier wieder nur verwirrt oder ob ich da was anderes grundlegendes falsch gemacht habe.

error C2143: Syntaxfehler: Es fehlt ';' vor 'using'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.11.2012, 16:49 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,

Strichpunkt fehlt nach der Klasse (also "};" statt "}" )
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.11.2012, 17:14 Uhr
~Schamote
Gast


Danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
11.11.2012, 13:30 Uhr
ao

(Operator)



C++:
class Kofferraum {
private:
    unsigned int Gesamtgewicht;
    unsigned int Gesamtwert;
    vector<Koffer*> *Inhalt;      // HIER
public:
    Kofferraum(unsigned int, unsigned int);
    ~Kofferraum();
    void add_Koffer(Koffer*);
    unsigned int get_Gesamtgewicht() const;
    unsigned int get_Gesamtwert() const;
    Koffer* get_Inhalt(int);
}


Überdenk das Design noch mal:

1. Warum ist Inhalt ein Pointer auf einen Vektor? Warum ist es nicht der Vektor selbst?

2. Warum enthält der Vektor nur Pointer auf Koffer? Wenn man davon ausgeht, dass du nur tatsächlich existierende Koffer einlädst, dann solltest du besser Referenzen auf Koffer nehmen. add_Koffer hätte dann auch ein Koffer& als Parameter, und was du bei Koffer * get_Inhalt zurückgeben willst, ist mir nicht ganz klar. Etwa Inhalt->data?

3. Wenn sich Gesamtgewicht und Gesamtwert unmittelbar durch Aufsummierung aus dem Inhalt ergeben, dann ist die Extra-Speicherung redundant, und das sollte eigentlich vermieden werden. Es sei denn, es gibt wichtige Gründe, die dafür sprechen (Performance z.B.), aber die sollte man dann konkret benennen können.

Außerdem, nur aus Interesse: Welche Bedeutung haben die beiden Parameter des Kofferraum-Konstruktors?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
19.11.2012, 18:13 Uhr
Schamote



1. Da habe ich nur rumprobiert, das war keine eigentliche Lösung.

2. Da ich die Koffer ständig hin- und herschiebe, um ein bestimmtest Ergebnis zu erhalten, will ich nicht ständig den ganzes Koffer kopieren müssen, deshalb dachte ich mir, dass ich einfach nur auf die Koffer zeige.
add_Koffer schiebt den Zeiger dann einfach in den vector.
get_Inhalt läuft bis zur Position int und gibt den Pointer auf den Koffer dort aus.

Wenn du eine bessere Lösung weißt (Referenzen?), dann kannst du mir gerne einen Hinweis geben.

3. Ich vergleiche oft die Werte (Gewicht,Wert) mit einer anderen Instanz, da will ich nicht jedesmal alles zusammenrechnen müssen, also Performance.


Neugierde: Der Konstruktor war in Verbindung mit dem Pointer auf den Vektor nur aus Testgründen nötig, um Gewicht und Wert festlegen zu können, habe ich aber nie benutzt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
20.11.2012, 10:51 Uhr
ao

(Operator)


Dann mache ich folgenden Vorschlag:

C++:
class Kofferraum {
private:
//    unsigned int Gesamtgewicht;
//    unsigned int Gesamtwert;
    vector<Koffer&> Inhalt;      // HIER
public:
//    Kofferraum(unsigned int, unsigned int);
    Kofferraum();
    ~Kofferraum();
    void add_Koffer(Koffer&);
    unsigned int get_Gesamtgewicht() const;
    unsigned int get_Gesamtwert() const;
    Koffer& get_Inhalt(int);
}


Erklärungen:
1. Der Kofferraum hat einen parameterlosen Konstruktor.

2. Der Vektor Inhalt ist fester Bestandteil (also direktes Member) des Kofferraums. Eine Verpointerung würde z.B. dann Sinn machen, wenn jemand den ganzen Vektor austauschen wollte. Das ist aber im API nicht vorgesehen und hat auch keine Entsprechung in der realen Welt.

3. Die Koffer werden über Referenzen verwaltet, nicht über Pointer. Da Koffer-Objekte nicht NULL sein können, gibt es keinen Grund für Pointer.

4. Im Sinne von "Keep it simple" erfolgt die Berechnung von Gesamtgewicht und Gesamtwert innerhalb der entsprechenden Get-Funktion, die Ergebnisse werden nicht in der Klasse gespeichert. Sollte das tatsächlich nachweisbar (!) zu Performance-Schwächen führen, kannst du dich immer noch drum kümmern. Aber bis dahin bleibt dein Code einfach und leicht nachvollziehbar.

Performance-Probleme "vorsorglich" wegoptimieren zu wollen ist eine äußerst beliebte Ursache für "schlechten" Code und für Fehler an ganz anderer Stelle.

Dieser Post wurde am 20.11.2012 um 10:52 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
21.11.2012, 16:05 Uhr
Schamote



Also, ich habe das so ausprobiert, allerdings scheinen Referenzen nicht zulässig zu sein, denn ich bekomme diesen Fehler:

error C2528: 'pointer': Zeiger auf Verweis ungültig

Meine Deklaration sieht so aus:

C++:
std::vector<Koffer&> Inhalt;


Und ich habe alles - außer der Deklaration -, was etwas mit dem "Inhalt" zu tun hat auskommentiert und der Fehler besteht trotzdem noch, also muss es ja wohl an der Deklaraion liegen.
Laut dieser Quelle geht das auch nicht:
http://stackoverflow.com/questions/4010937/why-does-storing-references-not-pointers-in-containers-in-c-not-work

D.h. ich werde es mal mit den "neuen" C++11-Pointer versuchen.
 
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: