Отобразить 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();

Не забудьте удалить свои экземпляры с карты, когда вы закончите

Другие вопросы по тегам