gpt4 book ai didi

c++ - 通过引用返回 C++ 中的对象

转载 作者:太空宇宙 更新时间:2023-11-04 15:11:42 25 4
gpt4 key购买 nike

我给自己设定的目标是重载operator+(添加类对象)。事实证明,这个总和可以解释为两个 vector 的总和。但是到了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 在返回之前被删除了?

最佳答案

问题可以简化为:

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

return x;
}

变量的作用域if block 。它不存在于它之外。

您必须将它的声明从条件中移出,并做任何其他需要做的事情……或者从 条件中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 .

关于c++ - 通过引用返回 C++ 中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56808922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com