0

所以我为整数创建了一个容器类,我想重载=运算符,以便我可以返回对象的深层副本。我的代码有效,但两个对象指向同一个地址。这是 main.cpp 文件:

int main (int argc, const char * argv[]) {
    IntList cArray(5);

    for (int i = 0; i < cArray.getLength(); i++) {
        cArray[i] = (i + 1) * 10;
    }

    using namespace std;

    for (int i = 0; i < cArray.getLength(); i++)
        cout << cArray[i] << " ";
    cout << endl << popped << endl;

    IntList cArray2(4);

    for (int i = 0; i < cArray2.getLength(); i++)
        cArray2[i] = i * 5;

    cArray2 = cArray;
    cArray2[2] = 1000;

    for (int i = 0; i < cArray.getLength(); i++)
        cout << cArray[i] << " ";
    cout << endl;
    for (int i = 0; i < cArray2.getLength(); i++)
        cout << cArray2[i] << " ";
    cout << endl;

    return 0;
}

这是IntList该类的头文件:

class IntList {
private:
    int _length;
    int* _data;

public:
    IntList(int length);
    ~IntList();

    void erase();
    void reallocate(int length);    //  Faster way to call erase() and resize()
    void resize(int length);
    void insert(int value, int index);
    void prepend(int value);
    void append(int value);
    int pop(int index);
    void removeBefore(int index);    //  Exclusive
    void removeAfter(int index);    //  Exclusive
    int getLength();
    int indexOf(int value);

    int& operator[](int index);
    IntList operator=(IntList* source);
};

这是IntClass'soperator=()方法的实现:

IntList IntList::operator=(IntList* source) {
    _length = source->getLength();

    reallocate(_length);

    for (int i = 0; i < _length; i++) {
        _data[i] = (*source)[i];
    }

    return *this;
}
4

4 回答 4

2

您没有使用指向的指针IntList-operator=通常需要 aconst &并返回对分配给的实例的引用。

IntList & IntList::operator=(IntList const & source) {
  ...
  return *this;
}

请记住,您还需要一个复制构造函数:IntList(IntList const & source)

可以创建一个 operator= ,它带有一个指向 IntList 的指针 - 只有在您执行以下操作时才有效:

IntList l1;
IntList l2;
l1 = &l2;

这不是典型用法,如果需要,您应该明确说明,void IntList::copyFrom(IntList const *)在这种情况下使用 eg。

您应该进行的其他更改:

添加这个:

int operator[](int index) const;

使这些常量:

int getLength() const;
int indexOf(int value) const;
于 2011-03-25T19:02:00.947 回答
2

因为您的赋值运算符需要一个指向 IntList 的指针,所以您需要像这样调用它:

cArray2 = &cArray;

您的示例代码使用编译器生成的默认赋值运算符。你的赋值运算符应该有这个声明:

IntList& IntList::operator=(IntList const& source)
于 2011-03-25T19:06:13.337 回答
1

您的接线员需要签名IntList& operator=(const IntList& source);。请注意引用而不是指针,并且您还必须通过引用返回以允许分配链接。当您在需要隐式赋值的任何地方通过指针传递它时,将使用编译器生成的浅拷贝赋值运算符。

编辑:您还需要使它getLength const能够在赋值运算符中被调用。

于 2011-03-25T19:02:19.720 回答
1
IntList IntList::operator=(IntList* source) 

的签名错误,因为它的operator=参数类型是指向IntList

正确的签名是这样的:

IntList & IntList::operator=(const IntList & source) //reference of source!
     //^^^ note this                      ^^^ note this as well!

也就是说,同时设置参数类型和返回类型引用

于 2011-03-25T19:03:39.090 回答