globaler QVector einer Klasse

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
thuering
Beiträge: 26
Registriert: 1. November 2011 01:48

globaler QVector einer Klasse

Beitrag von thuering »

Hallo Qtler,
ich habe einen QVector<> eines kompletten, sehr umfangreichen Klassenobjekts (über 50 Variablen & Funktionen) den ich gerne Global in meinem Programm zugänglich haben möchte - weil wiederum viele andere Klassen diesen QVector brauchen. Ist das möglich? Wenn ja, wie?

Andere Einsteiger-Fragen:
Ich erstelle o.g. Vector in dem Konstruktur meines MainWindow so:

Code: Alles auswählen

QVector<character*> characters;
und gebe "characters" an Funktionen anderer Klassen in dieser Art weiter:

Code: Alles auswählen

QString battle::action(QVector<character *> &characters)
{
characters->FunktionDerKlasseCharacter();
}
a) Ist das sauberer Code?
b) Gibt es da ein Memory Hole?
c) Wird da irgendwo eine Kopie von "characters" angelegt, oder wird die Funktion der "battle"-Klasse im "Original" von characters arbeiten? Ich hoffe es wird im Ursprungsort gearbeitet, sonst bekomme ich wohl ganz schnell ein Speicherproblem (Menge!).
nebler
Beiträge: 51
Registriert: 9. Juli 2009 15:26

Re: globaler QVector einer Klasse

Beitrag von nebler »

Hallo,

das Design Pattern Singleton (http://de.wikipedia.org/wiki/Singleton_(Entwurfsmuster)) dürfte dann hier interessant werden.
Wenn Du wirklich kreuz-und-quer drauf zugreifen möchtest.
Es ist natürlich die Frage, ob man das nicht sauber in den Programmfluss als Argumenten verpacken kann.

Code: Alles auswählen

 // untested
// h
class CharactersDB {
public:
  static QVector<character*>& getCharacters();
};

// cpp
QVector<character*>& getCharacters() {
  static QVector<character*> db;
  return db;
} 

// Aufrufer:
QVector<character*>& db = CharactersDB::getCharacters();
Meine Antworten/Meinungen zu Deinen Fragen:
a) Wenn er für Dich schnell lesbar und erfassbar ist, dann ja. Sonst nein.
b) Wenn Du es richtig handelst dann nicht. (Deinem Code sieht man es nicht an ...)
c) Das ist eine C++ Grundlagen Fragen, daher mach Dich bitte schlau, welche Arten von Übergaben es existieren.
Lt. Deinem Code Snipe, wird auf dem Speicher vom übergebenen Vector gearbeitet. (Übergabe by ref)

Rückfragen:
Sicher das Deine Klasse schön strukturiert ist, wenn sie 50 Variablen aufzeigt?

Beispiel:
Wenn ich ein detailliertes Auto modellieren möchte, dann mach ich folgendes ja nicht (ist whrsch. eine Geschmacksfrage):

Code: Alles auswählen

class Auto {
public:
  // Allg. Eigenschaften
  double _maxGeschwindigkeit;
  double _gewicht;

  // Eigenschaften der Sitze
  bool _sitzheizung;
  std::string _sitzbezug;
  QColor _sitzfarbe;
  int _anzhalSitze;

  // Eigenschaften der Räder
  unsigned char _anzahlReifen;
  double _reibungskoeffizent;  

  // und noch 40 andere Eigenschaften
};
Dann würde ich die Klasse Thematisch gruppieren und die OOP zum tragen kommen lassen:

Code: Alles auswählen

class Fahrzeug {
public:
  // Allg. Eigenschaften
  double _maxGeschwindigkeit;
  double _gewicht;
};

class Sitz {
public:
  // Eigenschaften der Sitze
  bool _sitzheizung;
  std::string _sitzbezug;
  QColor _sitzfarbe;
}

class Rad {
  // Eigenschaften der Räder
  double _reibungskoeffizent;  
};

class Auto : public Fahrzeug {
public:
  std::vector< Sitz > _sitze; // anzahl steckt implizit im vector
  std::vector< Rad > _raeder; // anzahl steckt implizit im vector
}
Viele Grüße
Antworten