2016-05-01 6 views
0

Ich möchte einen Vektor von Zeigern erstellen, die jeweils auf ihr eigenes Martian-Objekt zeigen, aber ich kann nicht herausfinden, wie man es anordnet. Ich bin immer noch den FehlerWie kann ich einen Zeigervektor erzeugen, der auf ein dynamisch zugewiesenes Objekt zeigt?

Nicht konstante lvalue Referenz ‚Vektor‘ geben binden kann nicht auf einen Wert von nicht verwandten Typ ‚martianDatabase‘

aber der Fehler ändert sich ständig mit jedem i Änderung vornehmen . Ich habe mir in den letzten zwei Tagen eine Menge Tutorials angeschaut, um das herauszufinden, aber ich stecke immer noch fest.

struct Martian 
{ 
    Martian(string fname, string lname, string ssid); 
    string fname, lname, ssid; 
    ~Martian(); 
}; 


class martianDatabase 
{ 
    vector<Martian*> database; 
    martianDatabase(); 
    void addMartian(vector <Martian*> &database, int &iterator, string f, string l, string id); 
    int iterator = 0; 
}; 

Martian::Martian(string f, string l, string id) 
{ 
    fname = f; 
    lname = l; 
    ssid = id; 
} 

void martianDatabase::addMartian(vector <Martian*> &database, int &i, string f, string l, string id) 
{ 
    Martian* m = new Martian(f, l, id); 
    database[i].push_back(m); 
    i++; 
} 
+0

Dieses 'Mars :: Mars (String f, String l, String id) 'wäre besser als' Mars :: Mars (const String & f, const String & l, const String & id) '- Speichert Kopieren –

+0

Auch die Verwendung von Smart Pointers könnte Ihr Leben zu einem etwas einfacher –

+0

danke, geändert, aber das mein Dilemma bleibt – Ammar

Antwort

1

gibt es einige Dinge falsch mit Ihrem Code:

  • Sie sollten nicht Ihre vector<Martian*> als Argument an addMartian geben, sondern können es nur die this Zeiger zugreifen durch.
  • Es besteht keine Notwendigkeit für Ihre int& iterator, wie alles, was Sie zu tun versuchen fügen Sie Ihre Martian bis zum Ende eines Vektors ist
  • Ihr Code database[i].push_back(m); das i-te Element des Vektors database bekommt, die ein Martian& ist, und dann trys push_back(m) darauf zu nennen, was nicht möglich ist, da es keine solche Funktion für Typ deklariert ist Martian, was Sie wahrscheinlich wollte, ist database.push_back(m), die m auf der Rückseite des database Vektor einfügen

Betrachten Sie die folgende Alternative:

class martianDatabase 
{ 
    vector<Martian*> database; 
    martianDatabase(); 
    void addMartian(string f, string l, string id); 
}; 

void martianDatabase::addMartian(string f, string l, string id) 
{ 
    this->database.push_back(new Martian(f, l, id)); 
} 

Obwohl kein Problem wirklich, ist es möglicherweise besser direkt Mitglied in Ihrem Konstruktor zu initialisieren (wo möglich) eher sie dann kopieren zuweisen, dh verwenden Sie den Code:

Martian::Martian(string f, string l, string id) : fname(f), lname(l), ssid(id) { } 
+0

Sie brauchen 'this->' nicht. Auch intelligente Zeiger - warum überhaupt Zeiger verwenden! –

+0

@EdHeal, ich habe es nur verwendet, um zu betonen, woher die 'Datenbank' stammt, das aktuelle Objekt im Gegensatz zu einem Parameter. Was Ihre Bemerkung über Zeiger betrifft, wenn Sie meinen, dass "das" ein Zeiger ist, stimme ich zu, dass es dumm ist, es sollte eine Referenz sein. Wenn Sie meinen, dass "Datenbank" ein Vektor von Zeigern ist, ist es in dieser Situation zwar sinnlos, aber es ist das, was das OP wollte, ich nahm an, dass das OP es brauchte, um ein Zeiger zu sein, zum Beispiel wenn er es kann um Objekte abgeleiteter Klassen in dem Array zu speichern, oder er möchte später die Marsianer manuell löschen, ohne sie aus der Datenbank zu entfernen. – Isaac

+0

@Isaac Ich habe gerade festgestellt, dass ich nicht push_back möchte, ich möchte die Datenbank [i] = m setzen. Würde ich in diesem Fall immer noch mein int i entfernen? – Ammar

1
vector<Martian*> database; 

Ihre database ist ein std::vector von Zeigern auf Martian Objekte. Das sagt diese Erklärung.

database[i].push_back(m); 

Seit database ist ein Vektor, database[i] wäre der i ten Wert in diesem Vektor. Da dieser Vektor ein Vektor von Martian * ist, ist daher database[i] ein Wert von Martian * in diesem Vektor.

Offensichtlich Sie verstehen, dass, wenn Sie Martian * haben, ein Zeiger auf einen Mars, es ist nicht eine Klasse, und Sie können nicht push_back() nichts darauf. Es ist ein Zeiger. Ein einfacher, Gartensortenzeiger. Sie können nicht push_back() irgendetwas zu einem Zeiger. Sie können nicht begin() oder end() es, etc ...

Das ist, was der Compiler Ihnen sagt, mit seiner Fehlermeldung.

Und so weit wie Ihre Frage „Wie kann ich einen Vektor von Zeigern machen“, haben Sie es bereits:

vector<Martian *> database; 

Das ist ein Vektor von Zeigern ist. Nun, ob es ein Vektor von Zeigern zu dynamisch zugewiesenen Objekten ist oder nicht, das ist nicht mehr relevant. Dem Vektor ist es egal, woher die Objekte kommen, von denen er stammt. Ein Zeiger auf ein dynamisch zugewiesenes Objekt entspricht genau einem Zeiger auf ein Objekt in einem Bereich static.

+0

Ah so wäre es Datenbank [i] = m; – Ammar

+0

Das wäre ein gültiger C++ - Code, der ohne Probleme kompiliert werden sollte. Ob das tun wird, was Sie wirklich wollen, ist eine völlig andere Frage. –

Verwandte Themen