2011-08-16 11 views
1

問題を完全に理解していないため、私の質問が正しいかどうかを100%確かめることはできません。返されたクラスのメンバintにintを割り当てることができません

私のコースでは、自分自身の後でクリーンアップするために自分のスマートなポインタを作成する必要があります。

ここでは、これまでに私のコードです:

ヘッダー:

class Test 
{ 
    public: 
     Test() 
     { 
      m_iTest1 = 4; 
      m_iTest2 = 3; 
      m_iTest3 = 2; 
      m_iTest4 = 1; 
     } 

     Test (int a, int b, int c, int d) 
     { 
      m_iTest1 = a; 
      m_iTest2 = b; 
      m_iTest3 = c; 
      m_iTest4 = d; 
     } 

     Test(const Test& a_oTest) 
     { 
      m_iTest1 = a_oTest.m_iTest1; 
      m_iTest2 = a_oTest.m_iTest2; 
      m_iTest3 = a_oTest.m_iTest3; 
      m_iTest4 = a_oTest.m_iTest4; 
     } 

     ~Test(){;} 

     int m_iTest1; 
     int m_iTest2; 
     int m_iTest3; 
     int m_iTest4; 
}; 

template<class T> 
class SmartData 
{ 
    public: 
     template<class T> friend class SmartPointer; 

     SmartData(); 
     SmartData(const T& a_oData); 
     ~SmartData(); 

     T operator *() const; 
     unsigned int GetCount(){return m_uiCount;} 

    protected: 
     void IncrementCount(){++m_uiCount;} 

     void DecrementCount(); 

     void DeleteThis(); 

     unsigned int m_uiCount; 
     T* m_poData; 
}; 

template<class T> 
class SmartPointer 
{ 
    public: 
     SmartPointer(); 
     SmartPointer(SmartData<T>& a_oSmartData); 
     SmartPointer(const SmartPointer& a_oSmartPointer); 
     ~SmartPointer(); 

     SmartPointer<T>& operator = (const SmartPointer<T>& a_oSmartPointer); 

     T operator *() const; 
     SmartData<T>* operator ->() const; 

     unsigned int GetCount() const;  

    private: 
     SmartData<T>* m_poSmartData; 
}; 

#include "smartpointer.inl" 

インラインファイル:

void SomeFunction1(SmartData<Test>& a_SmartData) 
{ 
    SmartPointer<Test> oSmartPointer2(a_SmartData); 
} 

void main() 
{ 
    SmartData<int> oSmartData1(5); 

    if (1) 
    {  
     SmartPointer<int> oSmartPointer1(oSmartData1); 

     int iTemp1 = oSmartPointer1->GetCount(); 
     int iTemp2 = *oSmartPointer1; 
     int iTemp3 = *oSmartData1; 
    } 

    if (1) 
    { 
     SmartData<int> oSmartData2(5); 
    } 

    SmartData<Test> oSmartData3; 

    (*oSmartData3).m_iTest1 = 5; //Does not work 

    if (1) 
    { 
     SmartData<Test> oSmartData4(oSmartData3); 

     SomeFunction1(oSmartData3); 

     //oSmartData4 still exits 
    } 
} 

すべてが正常に動作します

template<class T> 
SmartData<T>::SmartData() 
{ 
    m_uiCount = 0; 
    m_poData = new T(); 
} 

template<class T> 
SmartData<T>::SmartData(const T& a_oData) 
{ 
    m_uiCount = 0; 
    m_poData = new T(a_oData); 
} 

template<class T> 
SmartData<T>::~SmartData() 
{ 
    if (m_poData) 
    { 
     delete m_poData; 
    } 
} 

template<class T> 
T SmartData<T>::operator *() const 
{ 
    return *m_poData; 
} 

template<class T> 
void SmartData<T>::DecrementCount() 
{ 
    if (m_uiCount - 1 == 0 || m_uiCount == 0) 
    { 
     DeleteThis(); 

     return; 
    } 

    --m_uiCount;  
} 

template<class T> 
void SmartData<T>::DeleteThis() 
{ 
    if (m_poData) 
    { 
     delete m_poData; 
     m_poData = 0; 
    } 
} 

template<class T> 
SmartPointer<T>::SmartPointer() 
{ 
    m_poSmartData = new SmartData<T>(); 
    m_poSmartData->IncrementCount(); 
} 

template<class T> 
SmartPointer<T>::SmartPointer(SmartData<T>& a_oSmartData) 
{ 
    m_poSmartData = &a_oSmartData; 
    m_poSmartData->IncrementCount(); 
} 

template<class T> 
SmartPointer<T>::SmartPointer(const SmartPointer& a_oSmartPointer) 
{ 
    m_poSmartData = a_oSmartPointer.a_oSmartData; 
    m_poSmartData->IncrementCount(); 
} 

template<class T> 
SmartPointer<T>::~SmartPointer() 
{ 
    m_poSmartData->DecrementCount(); 
    m_poSmartData = 0; 
} 

template<class T> 
SmartPointer<T>& SmartPointer<T>::operator = (const SmartPointer<T>& a_oSmartPointer) 
{ 
    m_poSmartData = a_oSmartPointer.m_poSmartData; 
    m_poSmartData->IncrementCount(); 
} 

template<class T> 
T SmartPointer<T>::operator *() const 
{ 
    return *m_poSmartData->m_poData; 
} 

template<class T> 
SmartData<T>* SmartPointer<T>::operator ->() const 
{ 
    return m_poSmartData; 
} 

template<class T> 
unsigned int SmartPointer<T>::GetCount() const 
{ 
    return m_poSmartData->m_uiCount; 
} 

main.cppに、データがされますそれ自身の後できれいにされ、私は得るリークなし... 1行を除く:

(*oSmartData3).m_iTest1 = 5; 

私はビジュアルスタジオで編集しています。 "(* oSmartData3)" ... "m_iTest1"が正しく表示された後。 エラーC2106: '=':左側のオペランドはl-値でなければなりません

なぜこれが機能しないのかわからないのですか?

+1

これはあなたの問題に関連はありませんが、あなたの 'SmartPointer ::演算子=(constのSmartPointer &a_oSmartPointer)は'それはそれの前にSmartDataをデクリメントしないバグを持っています内部データを再割り当てします。それは大きな問題を引き起こすでしょう。 –

答えて

0

は、この作業を行う:

oSmartData3.m_iTest1 = 5; 
+0

いいえ、格納されているクラスのメンバ変数にアクセスしようとしています...私はそれを取得するために "*"演算子をオーバーロードしました。 oSmartData3はSmartDataクラスのインスタンスであり、メンバ "m_iTest1"はありません。 – Ben

4

はSmartDataに)演算子*(の宣言を詳しく見:

T operator *() const; 

これは、オペレータがある、T型のオブジェクトを返すことを意味しますm_poSmartData->m_poDataのコピー。それは、この文脈では、一時的なオブジェクトです:もちろん

(*oSmartData3).m_iTest1 = 5; //Does not work 

それは左辺値ではありませんので、あなたは、一時的なオブジェクトに値を割り当てることはできません。 L値及びR値は、ここにあるものについての続きを読む:http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7a.doc%2Flanguage%2Fref%2Fclrc05lvalue.htm

私は(私はあなたがやろうとしている正確に何を理解していた場合)あなたは()演算子*でm_poSmartData->m_poData への参照を返すことを示唆しています。

2

T operator *() constは、l値ではない(割り当てられない)一時的なオブジェクト(つまりコピー)を返しています。代わりに参照を返します:

T& operator *() const; 
関連する問題