我正在使用C ++ Builder XE7。我想使用带有UnicodeString作为键的map和作为值的类。
这是我的班级: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 Corresponance pour'operator MyHistorique :: =(MyHistorique *)'
Contexte d'analyseur complet
ApplicationPhonePC.cpp(493):analyze:void _fastcall TForm1 :: XPhonePc1EvtIdCall(TObject *,long)
答案 0 :(得分:0)
错误消息告诉您编译器找不到可以为operator=
对象实例分配MyHistorique*
指针的MyHistorique
。这是正确的,因为你没有定义一个(你也不应该)。
您的std::map
包含实际的MyHistorique
个对象实例,而不是指向对象的指针,因此您需要删除对new
的调用,以便编译器可以调用MyHistorique
&#39 ;而是复制赋值运算符:
MyHistorique tmp;
myMap[nIdCall] = tmp;
或者简单地说:
myMap[nIdCall] = MyHistorique();
或者,我建议为MyHistorique
添加一个方法,将其当前字段重置为默认值:
class MyHistorique
{
public:
void Reset();
};
void MyHistorique::Reset()
{
numClient = ...;
typeAppel = ...;
codeClient = ...;
... and so on ...
}
然后像这样调用这个方法:
myMap[nIdCall].Reset();
但请注意,如果nIdCall
中不存在std::map
,则这将是多余的。当新插入nIdCall
时,其关联对象将在std::map::operator[]
返回之前默认构建,因此您无需调用Reset()
。您可以使用std::map::find()
来解决冗余操作:
std::map<UnicodeString, MyHistorique>::iterator iter = myMap.find(nIdCall);
if (iter != myMap.end())
iter->second.Reset();
else
myMap.insert(std::make_pair(nIdCall, MyHistorique()));
另一方面,如果你知道nIdCall
永远是一个新值并且永远不会在std::map
中预先存在,那么你可以忽略上面的所有内容并改为执行此操作:
void __fastcall TForm1::XPhonePc1EvtIdCall(TObject *Sender, long nIdCall)
{
ShowMessage(nIdCall);
myMap[nIdCall];
}
答案 1 :(得分:-1)
尝试myMap [nIdCall] = new MyHistorique();
当您完成
时,不要忘记从地图中删除您的实例