2014-09-22 79 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