Отобразить UnicodeString как ключ к классу как значение C++Builder
Я использую C++Builder XE7. Я хочу использовать карту с UnicodeString в качестве ключа и класса в качестве значения.
Это мой класс: 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 Невозможно найти соответствие для оператора 'MyHistorique::=(MyHistorique *)'
Завершенный контекстный анализ
ApplicationPhonePC.cpp(493): анализ: void _fastcall TForm1::XPhonePc1EvtIdCall(TObject *,long)
2 ответа
Сообщение об ошибке говорит вам, что компилятор не может найти operator=
определены, которые могут назначить MyHistorique*
указатель на MyHistorique
экземпляр объекта. И это правильно, потому что вы не определили один (и вы не должны).
Ваш std::map
содержит актуальный MyHistorique
экземпляры объектов, а не указатели на объекты, поэтому необходимо удалить вызов new
поэтому компилятор может вызвать MyHistorique
вместо оператора присваивания копии:
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];
}
Попробуйте myMap[nIdCall] = new MyHistorique();
Не забудьте удалить свои экземпляры с карты, когда вы закончите