簡體   English   中英

在stl映射中添加類對象作為值

[英]Adding class object in stl map as a value

我想在STL映射中添加類對象作為C ++中的值,就像std::map<CString,class myClass*>myMap 但是編譯器向我展示了這樣做的錯誤。 我應該為該類實現所有比較運算符的重載嗎? 如果沒有,那我該如何實現呢? 代碼如下://頭文件

#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:沒有重載函數實例“ std :: map <_Kty,_Ty,_Pr,_Alloc> :: insert [with _Kty = CString,_Ty = CChattingDialog *,_Pr = std :: less,_Alloc = std :: allocator>]“匹配參數列表的參數類型為:(std :: pair)對象類型為:std :: map,std :: allocator>

錯誤3錯誤C2976:'std :: map':模板參數太少c:\\ projects \\ poc \\ mymessanger \\ mymessanger \\ clientconnection.h 25 1 MyMessanger

錯誤4錯誤C2665:'std :: pair :: pair':3個重載均不能轉換所有參數類型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 \\ MyMessanger \\ MyMessanger \\ MyMessangerView.cpp 131 29 MyMessanger等...還有一些其他錯誤,例如表示相同

您以錯誤的方式使用std :: map。 您應該按照以下方式重寫代碼:

client->ChatWindows[user] = &chatingDlg;

(如果您想使用map :: insert方法,則可以在這里閱讀有關它的信息: http : //www.cplusplus.com/reference/map/map/insert/ 。不像您那樣插入任何對,只有一種方法返回一對插入器/成功)。

但是,您還詢問您需要在類中實現什么才能將其存儲在map中,而不是通過指針而是通過值存儲為:

std::map<CString, CChattingDialog> ChatWindows;

正確的答案是:在類CChattingDialog中需要公共構造函數,復制構造函數,解構器,輔助運算符和operator <(小於),但在類CConnectionManager中則不需要。 Map使用它們有可能在其中正確存儲,復制,刪除和排序此類的元素。

感謝大家對這個問題的回答。 謝謝Fomin Arseniy。 這個問題的解決方案是我在問題中所猜測的,而Fomin Arseniy也在上面說過。 我們必須至少要重載我們將在map中用作值的類的Copy構造函數和分配運算符。 首先,用戶定義數據類型的地圖聲明必須像

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

代替

std::map<CString, CChattingDialog> ChatWindows;

其次,我添加了兩個功能

 CChattingDialog& operator=(const CChattingDialog &s); 

 CChattingDialog(const CChattingDialog &s);

在類CChattingDialog中。 按照Fomin Arseniy的建議使用插入方法。

client->ChatWindows[user] = &chatingDlg;

成功編譯代碼。

如果需要在STL映射中添加用戶定義的數據類型,則必須提供公共構造函數,復制構造函數,解擾器,輔助運算符和operator <(小於)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM