2013-08-29 224 views
1

您好,我需要訪問我的類中的指針成員,用於重載的賦值運算符。 我的代碼在下面?請讓我什麼我做錯了..謝謝 它的一個簡單的程序來實現的拷貝構造函數,重載的賦值運算符,析構函數如何訪問類的指針成員

#include<iostream> 

    class A 
    { 
    private: 
     int a; 
     char *ctr; 
     int *itr; 
    public: 
     A() 
     { 
      a=10; 
      ctr=new char[10]; 
      itr=NULL; 
      cout<<"Inside default constructor"<<endl; 
     } 
     A(const A &b) 
     { 
      a=b.a; 
      ctr= newchar[10]; 
      itr=new int; 
      *itr=b.*itr; 
      *ctr=b.*ctr; 
      cout<<"inside copy constructor"<<endl; 
     } 
     A operator=(const A a) 
     { 
      A b; 
      b.a=a.a; 
      b.*itr=a.*itr; 
      b.*ctr=a.*ctr; 
      cout<<"Overloaded assignment operator"<<endl; 

      return b; 
     } 
     ~A() 
     { 
      delete(itr); 
      delete(ctr); 
      cout<<"destructor"<<endl; 
     } 
    }; 

int main() 
{ 
    A a1 ,a2; 
    a1.*ctr="GOVIND"; 
    a2.*ctr="SINGH"; 
    a1.*itr=35; 
    a2.*itr=99; 
    A a3=a2; 
    cout<<"Class template program"<<endl; 
    cout<<a1.a<<" ",,a1.*ctr<<" "<<a1.*itr<<endl; 
    cout<<a2.a<<" ",,a2.*ctr<<" "<<a2.*itr<<endl; 
    cout<<a3.a<<" ",,a3.*ctr<<" "<<a3.*itr<<endl; 

    return 0; 
} 
+0

第一眼:訪問私有成員沒有getter? – texasbruce

+0

哇,這段代碼只是可怕的。看看所有那些毫無意義的'新'和原始數組! –

回答

4
b.*itr=a.*itr; 
b.*ctr=a.*ctr; 

應該

*b.itr=*a.itr; 
*b.ctr=*a.ctr; 

而且,不應該操作員要返回對this的引用?

A& operator=(const A a) 
{ 
    this->a = a.a; 
    *itr = *a.itr; 
    *ctr = *a.ctr; 
    return *this; 
} 
+1

我認爲它應該是'* b.itr = * a.itr',否則你會得到泄漏和雙重刪除。 –

+0

@ R.MartinhoFernandes謝謝,我沒有把足夠的注意力放在課程的其他部分。現在糾正了。 – simonc

+0

如何在主程序 –

1

Sooo很多錯,我甚至從哪裏開始?

首先,聰明的指針,男人!智能指針!

A(const A &b) 
    { 
     a=b.a; 
     ctr= newchar[10]; 
     itr=new int; 
     *itr=b.*itr; 

正確的語法指定的值是

*itr = *b.itr; 

如果你要複製的指針,也看起來不一樣,但你共享指針和麻煩,所以不要做。

無論如何,這仍然是錯誤的,因爲b.itr可能爲空(您的默認構造函數使其爲空)。所以想出你真正想要的。它應該永遠不是非null?在構造函數中分配一些東西。它應該可能爲空嗎?然後在複製構造函數中尊重這種可能性。

 *ctr=b.*ctr; 

再一次錯誤的語法,但即使你糾正它,它仍然是錯誤的:它只複製數組中的第一個字符。爲什麼你有這個數組呢?它的大小是固定的。你想要一個簡單的固定數組嗎?你是否想要一個字符串?

 cout<<"inside copy constructor"<<endl; 
    } 

    A operator=(const A a) 

您是不是要爲a做參考? const值不是傳遞給賦值運算符的好東西。如果您正確執行賦值,那麼非const值可能是個好主意。

{ 
     A b; 

這是什麼b應該是什麼?你不想用當前的對象嗎?

 b.a=a.a; 

應該a = a.a;

 b.*itr=a.*itr; 

正如拷貝構造函數,只有糟糕的是:如果ITR已經被分配了,您泄漏了舊內存。

 b.*ctr=a.*ctr; 

如上所述,並具有相同的新問題。

 cout<<"Overloaded assignment operator"<<endl; 

     return b; 

複製分配應返回*this。你正在創建一個懸而未決的參考。如果它沒有爲此發出尖叫聲,那麼你顯然還沒有得到足夠高的編譯器警告(或者你忽略了它們)。

} 

    ~A() 
    { 
     delete(itr); 

請勿在delete上使用括號。那麼,你可以,但這是不尋常的,誤導性的。 delete不是函數。

 delete(ctr); 

ctrnew[]分配,則必須使用delete[]來釋放內存。

 cout<<"destructor"<<endl; 
    } 

還有一些最後的話:智能指針!

+0

對不起,這麼多的錯誤..我是一個新的學習者..感謝所有 –