2014-12-15 14 views
1

Я хочу добавить объект класса в STL-карту как значение в C++. Это как std::map<CString,class myClass*>myMap. Но компиляторы показывают мне ошибку в этом. Должен ли я реализовать все перегрузки операторов сравнения для этого класса? Если нет, то как я могу это достичь? код выглядит следующим образом: // заголовочного файла функцияДобавление объекта класса в stl map как значение

#pragma once 
#include "afxsock.h" 
#include"NetworkDataProcessor.h" 
#include"MainFrm.h" 
#include"ChattingDialog.h" 
#include<map> 
using namespace std; 

class CConnectionManager :public CAsyncSocket 
{ 
public: 
    static CConnectionManager *GetClientInstance(); 
    BOOL ClientSignIn(CString, CString); 
    void ConnectToServer(); 
public: 
    CString m_sendBuffer; 
    int m_nBytesSent; 
    int m_nBytesBufferSize = MAX_BUFFER_SIZE; 
    virtual void OnClose(int nErrorCode); 
    virtual void OnConnect(int nErrorCode); 
    virtual void OnReceive(int nErrorCode); 
    virtual void OnSend(int nErrorCode); 
public: 

    std::map<CString, CChattingDialog* >ChatWindows; 
private:`enter code here` 
    CConnectionManager(); 
    ~CConnectionManager(); 
    static CConnectionManager * client_instance; 
}; 

// CPP файл:

void CMyMessangerView::OnClientListClick(NMHDR* pnmh, LRESULT* pResult) 
{ 
    DWORD dwPos = ::GetMessagePos(); 
    CPoint point((int)LOWORD(dwPos), (int)HIWORD(dwPos)); 
    GetListCtrl().ScreenToClient(&point); int nIndex; if ((nIndex = GetListCtrl().HitTest(point)) != -1) 
    { 
    CString string = GetListCtrl().GetItemText(nIndex, 0); 
    CChattingDialog chatingDlg; 
    chatingDlg.SendToUser = string; 
    CString user = chatingDlg.UserRealName(string); 
    CConnectionManager *client = CConnectionManager::GetClientInstance(); 
    client->ChatWindows.insert(pair<CString, CChattingDialog *>(user, &chatingDlg)); 
    UpdateData(FALSE); 
    chatingDlg.DoModal(); 
    } 
    *pResult = 0; 

} 

ОШИБКА: 15 IntelliSense: нет экземпляра перегруженных функции «станд :: Карта < _Kty, _Ty, _Pr, _Alloc> :: insert [с _Kty = CString, _Ty = CChattingDialog *, _Pr = std :: less, _Alloc = std :: allocator>] "соответствует списку аргументов Типы аргументов: (std :: pair) Тип объекта: std :: map, std :: allocator>

Ошибка 3 Ошибка C2976: 'станд :: Карта': слишком мало шаблонные аргументы C: \ Проекты \ РоС \ mymessanger \ mymessanger \ clientconnection.h 25 1 MyMessanger

Ошибка 4 Ошибка C2665: «станд :: пара :: pair ': ни одна из трех перегрузок не может преобразовать все типы аргументов c: \ projects \ poc \ mymessanger \ mymessanger \ mymessangerview.cpp 131 1 MyMessanger 16 IntelliSense: нет экземпляра конструктора "std :: pair < _Ty1, _Ty2 > :: pair [with_Ty1 = CString, _Ty2 = CChattingDialog &] "соответствует списку аргументов Типы аргументов: (CString, CChattingDialog *) c: \ Projects \ POC \ MyMessenger \ MyMessanger \ MyMessangerView.cpp 131 29 MyMessanger и т. д. ... несколько ошибок, таких как указание то же

+1

Показать код и текст сообщения. – 0x499602D2

+0

std :: map myMap. «класс myClass» выглядит странно. Почему вы добавляете «класс». – user1

+0

Мне нужна коллекция этих объектов класса вместе с ключом как строка. Я хочу получить объект этого класса в соответствии с некоторыми строковыми типами ключей. –

ответ

1

Спасибо всем за ответ на эту проблему. Спасибо Фомин Арсений. Решение этой проблемы - вот что я догадался в вопросе, и Фомин Арсений сказал выше. Нам нужно перегрузить как минимум конструктор копирования и назначить оператора для класса, который мы будем использовать на карте в качестве значения. Во-первых, карта декларация определенных пользователем типов данных должно быть как

std::map<CString, class CChattingDialog> ChatWindows; 

вместо

std::map<CString, CChattingDialog> ChatWindows; 

и второй, я добавил две функции

CChattingDialog& operator=(const CChattingDialog &s); 

CChattingDialog(const CChattingDialog &s); 

в классе CChattingDialog. Используемый способ вставки, как сообщил Фомин Арсений.

client->ChatWindows[user] = &chatingDlg; 

скомпилированный код успешно.

Мы должны предоставить публичный конструктор, конструктор копирования, дескриптор, оператор и оператор оператора < (меньше), если необходимо добавить определенные пользователем типы данных в карту STL.

2

Вы используете std :: map в неправильном направлении. Вы должны переписать код следующим образом:

client->ChatWindows[user] = &chatingDlg; 

(Если вы хотите использовать метод карты :: вставки вы можете прочитать об этом здесь:. http://www.cplusplus.com/reference/map/map/insert/ Там нет пары вставки, как вы делаете, есть один метод, который возвращает пара interator/succes).

Однако, вы также спросили, что вы должны реализовать в своем классе, чтобы сохранить его на карте не указатель, а по значению, как:

std::map<CString, CChattingDialog> ChatWindows; 

Правильный ответ: вам нужен открытый конструктор, конструктор копирования, дескриптор, определяющий оператор и оператор < (меньше) в классе CChattingDialog, но не в классе CConnectionManager. Карта использует их, чтобы иметь возможность правильно хранить, копировать, удалять и сортировать элементы этого класса.