2017-02-21 1 views
0

Ich beginne mit C++ und ich versuche, std :: map Klasse über Komposition zu erweitern. Ich möchte diese Klasse CardPackage verwenden, um eine private Karte von IDs und Zeiger zu meinem EntityCards zu haben und drei Methoden AddCard, GetCard und RemoveCard zu implementieren, die auf die private Karte zugreifen werden m.Wert von privaten Std erhalten :: map

Das Problem ist, dass ich nicht in der Lage gewesen, mit m Methoden (find und end) zu arbeiten, weil ich die folgenden Fehlermeldung erhalten:

expression must have a pointer type

Ich verstehe, dass m Bedürfnisse ein Zeiger sein Der Zugriff erfolgt durch Pfeilnotation (oder Punkt), aber ich kann den Code nicht anpassen, um meine Anforderungen zu erfüllen.

Rubrik:

#include <EntityCard.h> 

class CardPackage 
{ 
public: 

CardPackage(); 
~CardPackage(); 

void AddCard(EntityCard* card); 
EntityCard* GetCard(int id); 
bool RemoveCard(int id); 

private: 
    map<int, EntityCard*> m; 
}; 

Quelle:

#include "CardPackage.h" 

CardPackage::CardPackage() 
{ 
} 


CardPackage::~CardPackage() 
{ 
} 

    void CardPackage::AddCard(EntityCard *card) 
    { 
     m[card->ID] = card; 
    } 

EntityCard* CardPackage::GetCard(int id) 
{ 
    if (id < 1) { return nullptr; } 
    if(m->find(id) == m->end()) 
    { 
     return (m[id]); 
    } 
    else 
    { 
     return nullptr; 
    } 
} 

bool CardPackage::RemoveCard(int id) 
{ 
    //TODO 
    return false; 
} 

Antwort

5
if(m->find(id) == m->end()) 

Sollte sein:

if(m.find(id) != m.end()) 

m ist kein Zeiger, so dass Sie . brauchen, anstatt -> . Sie haben den Test auch falsch herum.

Eine etwas bessere Umsetzung wäre:

const auto it = m.find(id); 
    if (it != m.end()) 
     return it->second; 
    else 
     return nullptr; 

Der Unterschied besteht darin, dass dies tut nur eine Suche in der Karte, während der Code zwei tut.

+0

ich falsch angenommen. (Punkt) und -> (Pfeil) waren gleich. http://stackoverflow.com/questions/1238613/what-is-the-difference-between-the-dot-operator-and-in-c – Sturm

+1

@Sturm sie sind nicht. Normalerweise kann nur '->' oder '.' angewendet werden, abhängig davon, ob Sie es auf einen Zeiger oder ein Objekt anwenden. Es gibt jedoch einige "hybride" Typen, die beides implementieren (z. B. Smartpointer). – user463035818

+0

@Martin wäre es nicht 'return it-> second;'? Ich erhalte einen Fehler, wenn ich gerade * es zurückschicke – Sturm