2017-02-21 18 views
0

私はC++から始まり、std :: mapクラスをコンポジションで展開しようとしています。 私はEntityCardsにIDとポインタのプライベートマップを持っているために、このクラスCardPackageを使用してプライベートマップmにアクセスする三つの方法AddCardGetCardRemoveCardを実装したいです。プライベートstd :: mapから値を取得

expression must have a pointer type

私はmニーズはへのポインタであることがあることを理解する:

問題は、私は、次のエラーメッセージが表示されますので、m方法(findend)で動作することができていないということです矢印表記(またはドット)でアクセスできますが、要件を尊重するようにコードを適応させることはできません。

ヘッダー:

#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; 
}; 

出典:

#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; 
} 

答えて

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

は次のようになります。

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

mは、ポインタではありませんので、あなたは.、というよりも->を必要とします。あなたはまた、間違った方法でテストを持っています。

Aわずかに良い実装は次のようになります。

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

違いはあなたのコードは、2つを行うのに対し、これはのみ、マップで1つのルックアップを行うことです。

+0

私は間違っています。 (ドット)と - >(矢印)は同じでした。 http://stackoverflow.com/questions/1238613/what-is-the-difference-between-the-dot-operator-and-in-c – Sturm

+1

@Sturmそうではありません。ポインタやオブジェクトに適用するかどうかによって、通常は ' - >'や '.'のみが適用されます。しかし、両方を実装するいくつかの "ハイブリッド"タイプ(スマートポインタなど)があります。 – user463035818

+0

@Martinは 'return it-> second 'にならないでしょうか?私がちょうどそれを返すと私はエラーになります – Sturm

関連する問題