2014-09-22 82 views
0

我想製作一個袋子容器。當我超載=操作員時,超出我的問題就會發生。通過參考傳遞迷失參數,值

Zsak& Zsak::operator =(const Zsak& a) 
{ 
    (*this).V=a.V; 
    (*this).elemsz=a.elemsz; 
    return *this; 
} 

與此頭:

class Zsak 
{ 
public: 
    Zsak(){V=new Elem[100];} 
    Zsak (const Zsak & a) 
    { 
     *this=a; 
    } 
    Zsak(int meret) 
    { 
     V=new Elem[meret]; 
    } 
    ~Zsak(){delete[] V;} 
    Zsak& operator -(const Zsak& b); 
    Zsak& operator =(const Zsak& a); 
    void Zsak_Ba(int e); 
    void Zsak_Bol(int e); 
    bool Uress(); 
    int E_Hany(int e) const; 
    friend std::ostream& operator << (std::ostream& out,const Zsak& z); 
private: 
    Elem *V; 
    int elemsz=0; 

}; 

Zsak_Ba把一個元件到所述袋;

Zsak_Bol從包裏掏出一個元素;

我通過測試發現的地址是const Zsak a,地址爲*this

與此背景下

Zsak z(5),c(5); 
z.Zsak_Ba(1); 
z.Zsak_Ba(1); 
z.Zsak_Ba(1); 
z.Zsak_Ba(2); 
z.Zsak_Ba(2); 
z.Zsak_Ba(2); 
z.Zsak_Ba(4); 
Zsak d=z; 
d.Zsak_Bol(1); 
cout<<z<<endl<<d; 

它打印:

1 2 
2 3 
4 1 

1 2 
2 3 
4 1 

而且它到底應該打印是:

1 3 
2 3 
4 1 

1 2 
2 3 
4 1 

我應該怎麼做來獲得這個? 我做錯了什麼?爲什麼?

非常感謝!

+2

你只是在這裏複製一個指針:'(* this).V = a.V;'。所以現在兩個對象指向相同的數據。 – juanchopanza 2014-09-22 12:09:58

+0

如何消除這種情況? – Iero 2014-09-22 12:10:47

+0

將由RHS對象指向的數組的所有元素分配給由LHS對象指向的數組的那些元素。 – juanchopanza 2014-09-22 12:12:02

回答

0

你只是複製指派操作符中的指針(而不是內容)。

Zsak& Zsak::operator =(const Zsak& a) 
{ 
    if (this == &a) { // or std::addressof(a) 
    return *this; 
    } 

    delete[] V; 

    elemsz=a.elemsz; 
    V=new Elem[elemsz]; 
    for (std::size_t i = 0; i < elemsz; ++i) { 
    V[i] = a.V[i]; 
    } 
    return *this; 
} 

此外,我沒有看到elemsz正在更新(成員初始化之外)的位置。我會想象它會在構造函數中。

Zsak(int meret) 
{ 
    V=new Elem[meret]; 
    elemsz = meret; 
} 

而且

Zsak() 
{ 
    V=new Elem[100]; 
    elemsz = 100; 
} 

這也可能是值得注意的是,往往是「複製交換」來實現賦值操作符,並在複製構造一個完整副本(基本上其他方式圍繞你所擁有的)。

「複製交換」看起來像

Zsak (const Zsak & a) : elemsz(a.elemsz) 
{ 
    V = new Elem[elemsz]; 
    for (int i = 0; i < elemsz; ++i) { // copy the contents 
    V[i] = a.V[i]; 
    } 
} 

Zsak& Zsak::operator =(const Zsak& a) 
{ 
    Zsak temp(a); 
    std::swap(this->elemsz, temp.elemsz); 
    std::swap(this->V, temp.V); 
    return *this; 
} 

它帶來了一些開銷上分配到自我,可以爲這個,如果需要添加自分配的測試。

瞭解這是一個使用和實現動態內存的任務,最好重新排除Elem陣列及其在主類之外的管理。維護和糾正錯誤和問題通常更容易。

+0

@ Niall解構器調用時,'V = new Elem [elemsz]'會被刪除嗎?我在這裏設置了elemsz:'private:Elem * V; int elemsz = 0;'這樣做不好嗎? – Iero 2014-09-22 12:18:37

+1

@lero,是的'delete []'將在析構函數中調用。設置'elemsz'是一個好主意,但是當你用'V'分配內存時需要更新它。 – Niall 2014-09-22 12:19:52

+0

非常感謝!我正在看這個代碼幾個小時...再次感謝! – Iero 2014-09-22 12:21:42

0

如果您使用vector<Elem>而不是手動動態內存,則不需要任何用戶定義的複製構造函數或賦值運算符。它會工作。這是首選解決方案。讓C++爲你做好工作。

+1

我知道這個......但這是任務:)我必須動態地做到這一點。 – Iero 2014-09-22 12:30:36