2013-04-02 63 views
0

我寫我的同班同學程序私有成員:再次但是沒有解決之道:錯誤C2248:「CObject的:: CObject的」:不能訪問類中聲明「CObject的」

class COrder 
{ 
public: 
    COrder(); 
    ~COrder(); 


public: 
     ... 
    CList <CItem> m_oItem; 
     ... 
}; 

其假設有清單OD對象我的其他類:

class CItem 
{ 
public: 
    CItem(); 
    ~CItem(); 

public: 
    int m_i; 
    double m_d; 
    CString m_o; 
}; 

和編譯器給我這樣的錯誤標題。任何想法爲什麼? 在節目我用科德在地圖:

CMap <CString, LPCTSTR, COrder, COrder> m_map 

報價:

添加拷貝構造函數和賦值運算符類科德。

我添加操作=我的課:

COrder& operator=(const COrder oNewOrder) 
{ 
     ... 
    m_oItem.AddTail(oNewOrder.m_oItem.GetTail()); 
     ... 
    return *this; 
} 

,但您可以通過添加 「拷貝構造函數」 是什麼意思?

http://msdn.microsoft.com/en-us/library/ccb3dh5c.aspx我發現這個,但如何在我的代碼中實現它。我無法改變CList課程。

+0

你應該重新考慮你的信息隱藏,因爲你沒有... –

+0

現在不是我的優先事項,但ty。 – papiozo

回答

1

http://www.codeproject.com/Articles/13458/CMap-How-to

添加拷貝構造函數和賦值操作符你COrder類。這使課堂可複製。

[如果類是用來作爲重點,那麼你需要HashKey()和CompareElemenst()在類]

還要注意的是STL containers are superior to MFC containers

你得到一個錯誤,因爲CMap的具有默認拷貝構造函數,但CMapCListCObject衍生和CObject聲明私人拷貝構造函數和operator =。因此,CMap不提供複製語義「開箱即用」。

我建議您使用STL std::map容器,該容器是以 方式設計的,用於實現複製語義開箱即用。

開箱即用的STL不具備的僅僅是序列化。

請注意,std::map沒有混淆ARG_KEYARG_VALUE 模板。 std::map只有Key和Type模板參數(以其基本形式)。

http://msdn.microsoft.com/en-us/library/s44w4h2s%28VS.80%29.aspx

否則,您可以通過指針的方式去爲阿賈伊建議由你給我閉嘴,編譯器。

+0

非常感謝,你能回答我的問題嗎? – papiozo

+0

是的,你不能改變CList類。但至少你可以派生出一個派生自CList的類,然後通過將這些拷貝構造函數和賦值重載添加到你的類中來使用這個技巧。 –

+0

好吧,我以後也一樣。所以在我的複製構造函數中,我應該將我列表中的所有元素複製到我的複製列表中(循環中)? – papiozo

0

問題描述:

CList<CItem> m_oItem;

和觸發語句(或一些使用):

CMap <CString, LPCTSTR, COrder, COrder> m_map;

爲什麼?那麼,CMap將調用複製構造函數和/或賦值運算符COrder。你沒有提供任何,但編譯器提供他們從你的班級(即COrder)。該類包含一個CList對象,該對象從CObject繼承。 CObject不提供(或更好地說:防止)複製構造函數或賦值運算符。

因此,編譯器引發錯誤。不幸的是,(壞)編譯器不會給你回溯這個錯誤。

對於作爲解決方案的最佳賭注:

  • CList < CItem* > m_oItem;
  • CList<CItem> *m_poItem;
  • 使用或實現自己的收藏。
+0

非常感謝! :) – papiozo

相關問題