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 오류] ApplicationPhonePC.cpp (496) : E2285 'operator MyHistoire :: = (MyHistoire *)'에 대한 일치를 찾을 수 없습니다.
전체 구문 분석기 컨텍스트
ApplicationPhonePC.cpp (493) : parsing : void _fastcall TForm1 :: XPhonePc1EvtIdCall (TObject * , long)
오류 메시지는 컴파일러 가 개체 인스턴스에 포인터를 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
항상 새로운 값이고 .NET에 존재하지 않는다는 것을 알고 있다면 std::map
위의 모든 것을 무시하고 대신 다음을 수행 할 수 있습니다.
void __fastcall TForm1::XPhonePc1EvtIdCall(TObject *Sender, long nIdCall)
{
ShowMessage(nIdCall);
myMap[nIdCall];
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다