2016-08-24 17 views
0

私はC++ Builder XE7を使用しています。私はキーとしてUnicodeStringと値としてクラスを使用してマップを使用したいと思います。UnicodeStringを値としてクラスのキーとしてマップするC++ Builder

これが私のクラスである:Historique.h

#ifndef HistoriqueH 
#define HistoriqueH 
#include <System.Classes.hpp> 
#include <string>  

class MyHistorique 
{ 
    public: 
     __fastcall MyHistorique(); 
     __fastcall MyHistorique(const MyHistorique& mh); 

     //Getters 
     String __fastcall getNumClient(){return numClient;} 
     bool __fastcall getTypeAppel(){return typeAppel;} 
     String __fastcall getCodeClient(){return codeClient;} 
     String __fastcall getDate(){return date;} 
     String __fastcall getHeure(){return heure;} 
     String __fastcall getNumCti(){return numCti;} 
     bool __fastcall getAppelRecuManque(){return appelRecuManque;} 
     String __fastcall getDebutConvers(){return debutConvers;} 
     String __fastcall getFinConvers(){return finConvers;} 
     String __fastcall getDureeConvers(){return dureeConvers;} 
     bool __fastcall getFlag(){return flag;} 

     //Setters 
     void __fastcall setNumClient(String nc){numClient = nc;} 
     void __fastcall setTypeAppel(bool ta){typeAppel = ta;} 
     void __fastcall setCodeClient(String cc){codeClient = cc;} 
     void __fastcall setDate(String d){date = d;} 
     void __fastcall setHeure(String h){heure = h;} 
     void __fastcall setNumCti(String nCti){numCti = nCti;} 
     void __fastcall setAppelRecuManque(bool arm){appelRecuManque = arm;} 
     void __fastcall setDebutConvers(String dc){debutConvers = dc;} 
     void __fastcall setFinConvers(String fc){finConvers = fc;} 
     void __fastcall setDureeConvers(String dureeC){dureeConvers = dureeC;} 
     void __fastcall setFlag(bool f){flag = f;} 

    private: 
     String numClient; 
     bool typeAppel; 
     String codeClient; 
     String date; 
     String heure; 
     String numCti; 
     bool appelRecuManque; 
     String debutConvers; 
     String finConvers; 
     String dureeConvers; 
     bool flag; 
}; 

そして、私のApplication.h中:

#include <map> 
#include "Historique.h" 

class TForm1 : public TForm 
{ 
    public: 
    std::map<UnicodeString, MyHistorique> myMap; 
}; 

そして、私のApplication.cpp中:私が欲しいもの

void __fastcall TForm1::XPhonePc1EvtIdCall(TObject *Sender, long nIdCall) 
{ 
    ShowMessage(nIdCall); 
    myMap[nIdCall] = new MyHistorique(); 
} 

空のオブジェクトを作成し、それをnIdCallに割り当てることですが、私はこのエラーがあります:

[bcc32 Erreur] ApplicationPhonePC.cpp(496): E2285 Impossible de trouver une correspondance pour 'operator MyHistorique::=(MyHistorique *)'
Contexte d'analyseur complet
ApplicationPhonePC.cpp(493): analyse : void _fastcall TForm1::XPhonePc1EvtIdCall(TObject *,long)

+0

「long」値を使って作業しているときに、なぜ「UnicodeString」をキーとして使いたいのですか? –

答えて

0

をやったときに

があなたのマップからあなたのインスタンスを削除することを忘れないでください、エラーメッセージは、コンパイラがMyHistoriqueオブジェクトインスタンスにMyHistorique*ポインタを割り当てることができます定義されoperator=を見つけることができないことを語っています。そして、そういうわけで、あなたが1つを定義しなかったから(あなたもそうではありません)。

MyHistorique tmp; 
myMap[nIdCall] = tmp; 

それとも単に:あなたはので、コンパイラはMyHistorique年代が代わりに代入演算子をコピー呼び出すことができますnewへの呼び出しを削除する必要があるので、

あなたstd::mapは、実際のMyHistoriqueオブジェクトインスタンス、オブジェクトのないポインタが含まれ

また
myMap[nIdCall] = MyHistorique(); 

、私はデフォルト値に、現在のフィールドをリセットするためにMyHistoriqueにメソッドを追加することをお勧め:

がまだ std::mapに存在しない場合、これは冗長になること、しかし、

myMap[nIdCall].Reset(); 

注:

class MyHistorique 
{ 
public: 
    void Reset(); 
}; 

void MyHistorique::Reset() 
{ 
    numClient = ...; 
    typeAppel = ...; 
    codeClient = ...; 
    ... and so on ... 
} 

そして、このようにそのメソッドを呼び出します。 nIdCallが新規に挿入されると、関連付けられたオブジェクトはstd::map::operator[]によって返される前にデフォルトで構築されるため、Reset()に電話する必要はありません。あなたはその冗長運転を回避するためにstd::map::find()を使用することができます:あなたはnIdCallは、常に新しい価値となることを知っていれば、一方

std::map<UnicodeString, MyHistorique>::iterator iter = myMap.find(nIdCall); 
if (iter != myMap.end()) 
    iter->second.Reset(); 
else 
    myMap.insert(std::make_pair(nIdCall, MyHistorique())); 

決して前に存在しstd::mapで、あなただけのすべてを無視することができ、上記と

+0

は大丈夫です。私はちょうどあなたがブーストの[ptr_map](http://www.boost.org/doc/libs/1_61_0/libs/ptr_container/doc/ptr_map.html)QUIが受け入れることができるのポインタを使用することができることを追加したいと自動的にクリーンアップを行います。 – Sam

+0

はああ良く理解し、それが動作します。私は数日のためにそれをしてきました。おかげでたくさんのレミー。そしてありがとう皆。素敵な一日を! – Wali

-1

myMap [nIdCall] = new MyHistorique();を試してください。 your'eが

+0

Oups申し訳ありませんが、私はそれを変更するのを忘れました。これは実際のエラーです。 [ilink32 Erreur]エラー: '__fastcall MyHistorique :: MyHistorique()'以外の外部のクレデンシャル、C:\ USERS \ SRAADM \ DOCUMENTS \ EMBARCADERO \ STUDIO \ PROJETS \ WIN32 \ DEBUG \ APPLICATIONPHONEPC。OBJ [ILINK32エラー]エラー: '__fastcall MyHistorique :: MyHistorique(MyHistorique&')未解決の外部Cから参照:\ USERS \ SRAADM EMBARCADERO \メーカー\プロジェクト\ Win32の\デバッグ\ APPLICATIONPHONEPC.OBJ [ILINK32エラー\ DOCUMENTS \ ]エラー:リンクに – Wali

+0

オーケー感謝を実行することができません。私はこれを試してきましたし、私はこの1つ持っている: [BCC32エラー] ApplicationPhonePC.cpp(496): '演算子のMyHistorique :: =(MyHistorique *)' の一致を見つけることができませんE2285 完全アナライザの背景 ApplicationPhonePCをCPP(493):分析:無効_fastcall TForm1 :: XPhonePc1EvtIdCall(TObjectを*、長い) – Wali

+0

フランス語を知らない...しかし、タイプMyHistoriqueすなわちのstd ::マップの店舗ポインタにマップを変更オーケー – auburg

関連する問題