通过引用在C ++中返回对象

时间:2019-06-28 14:42:17

标签: c++ operator-overloading

我为自己设定的目标是使operator+重载(添加类对象)。事实证明,该总和可以解释为两个向量的总和。但是当涉及到方法operator+时,我发现很难返回对象。我读过类似的主题,甚至尝试应用一些建议,但不幸的是没有成功。我附上一些代码。

template<class Y>
class myVect {
public:
    myVect(int n = 1);                          
    ~myVect();
    myVect(const myVect& a);                    

    myVect& operator= (const myVect&);
    myVect& operator+ (const myVect&);

    void display(const myVect& a);      

private:
    int size;
    Y* data;
    template<class U> friend class myClass;     
}; 

template<class Y>                               // constructor      
myVect<Y>::myVect(int n) {
    size = n;
    data = new Y[size];
    cout << endl << "Pass the elements" << " " << size << "\n";
    for (int i = 0; i < size; i++) {
        cin >> *(data + i);
    }
}

template <class Y>                             // deconstructor                 
myVect<Y> :: ~myVect() {
    delete[] data;
}



template<class Y>                               // copy constructor
myVect<Y> ::myVect(const myVect & a) {
    size = a.size;
    data = new Y[size];                         

    for (int i = 0; i < size; i++) {
        *(data + i) = *(a.data + i);            
    }
}

template<class Y>                              //ASSIGMENT OPERATOR                                                 
myVect<Y> & myVect<Y> :: operator= (const myVect<Y> & a) {
    if (this != &a) {                                                   
        delete[] data;                                                  
        size = a.size;                                                  
        data = new Y[size];
        for (int i = 0; i < size; i++) {
            *(data + i) = *(a.data + i);
        }
    }
    return *this;
}

operator +方法如下:

template<class Y>
myVect<Y>& myVect<Y> ::operator+ (const myVect<Y>& a) {
    if (this->size != a.size) {
    cout << endl << "not able to perform that operation - wrong dimensions" << endl;
    }
    else {
        myVect<Y> newObj(this->size);
        for (int i = 0; i < this->size; i++) {
            *(newObj.data + i) = *(this->data + i) + *(a.data + i);
        }
    }
    return newObj;                                                      
}       

我得到的错误是'newObj':找不到标识符。我相信这是由于析构函数。我试图将类myVect放到一个新类中(封装它)并构造return方法,但它没有改变任何东西-错误的类型仍然相同。你知道如何解决这个问题吗?

无论如何,如果这是析构函数错误,是否意味着newObj在返回之前就被删除了?

2 个答案:

答案 0 :(得分:5)

问题可以归结为:

int foo()
{
    if (true)  // In reality, some meaningful condition
    {
       int x = 4;
    }

    return x;
}

该变量作用域if块。它不存在。

您必须将其声明从条件中移出,并执行该工作所需要的其他一切……或在条件中 return,然后执行其他操作(抛出异常?)否则。

例如,给出上面的演示:

int foo()
{
    int x = 0; // Or some other value

    if (true)  // In reality, some meaningful condition
    {
       x = 4;
    }

    return x;
}

或:

int foo()
{
    if (true)  // In reality, some meaningful condition
    {
       int x = 4;
       return x;
    }

    throw std::runtime_error("For some reason I have no value to give you!");
}

您的下一个问题将是您尝试通过引用返回局部变量。你不能这样做。取而代之的是返回值which is anyway idiomatic for what you're doing

答案 1 :(得分:2)

您已在一个块内声明了对象,因此该对象不在外部范围内。通常,这将使您腾出时间来在不同分支之间重用变量名。尝试在语句的newObj内插入if,并观察它 not 引发错误。例如,