这应该调用赋值运算符,但是如何?

时间:2013-09-25 18:11:14

标签: c++

我是这里的C ++新手。我的任务是创建一个Vector类,而不使用已经存在的Vector类。我不确定我是否正确实现了赋值运算符。如果是这样,我如何在主函数中使用它?

# include <iostream>
# include <string.h>
using namespace std;

class Vector{
public:
    unsigned int * p;
    size_t size;              

    Vector(){  // Default contructor
        cout << "The default contructor" << endl;
        this -> size = 20;                // initial value
            this -> p = new unsigned int [size];  
        // trying to set every elements value to 0.
        for(int i = 0; i < size; i++){
            *(p+i) = 0;     
        }
    }

    Vector (const Vector & v){   // The copy contructor
        cout << "The copy constructor" << endl;
        this -> size = v.size;

        p = new unsigned int[size];     
        for(int i = 0; i < size; i++){
            *(p+i) = *(v.p + i);
        }
    }

    Vector& operator = (const Vector & v){
        cout << "The assignment operator" << endl;
        this -> size = v.size;

        p = new unsigned int[size];     
        for(int i = 0; i < size; i++){
            *(p + i) = *(v.p + i);
        }
        //p = p - size;       // placing back the pointer to the first element
        //return *this;       // not sure here
    }


    void print_values(){
        for(int i = 0; i< size; i++){
            cout << *(p + i) << " ";
        }
        cout << endl;   
    }

};

int main(){
    Vector * v1 = new Vector();  
    (*v1).print_values();
    Vector * v2;      // this should call the assignment operator but......... how?
    v2 = v1;
    (*v2).print_values();
    Vector v3(*v1);
    v3.print_values();
}

2 个答案:

答案 0 :(得分:3)

你的专栏:

v2 = v1;

不会调用您的赋值运算符。它只是将一个指针指向另一个指针。您需要在对象之间进行分配,以便运算符使用。

你想要这样的东西:

Vector v1;
v1.print_values();
Vector v2;
v2 = v1;

等等。你的程序也有一些内存泄漏 - 小心!

编辑说明:为什么*(p+i)代替p[i]?后者更容易阅读。

答案 1 :(得分:1)

您将一个指针指向另一个,而不是一个类实例。为了调用赋值运算符,你需要有两个类实例(你只有一个),然后使用指针来表示你访问这些实例,例如:

int main(){
    Vector * v1 = new Vector();  
    v1->print_values();
    Vector * v2 = new Vector();
    *v2 = *v1;
    v2->print_values();
    Vector v3(*v1);
    v3.print_values();
    delete v1;
    delete v2;
}

可替换地:

int main(){
    Vector v1;  
    v1.print_values();
    Vector v2;
    v2 = v1;
    v2.print_values();
    Vector v3(v1);
    v3.print_values();
}