gpt4 book ai didi

c++ - 重载+运算符

转载 作者:太空狗 更新时间:2023-10-29 19:49:06 26 4
gpt4 key购买 nike

我正在尝试熟悉 C++ 中的运算符。我想我会用一个简单的 vector 加法来做到这一点。不幸的是,我似乎遇到了一些问题。我的类定义如下:

#ifndef _MVEC_H_
#define _MVEC_H_

#include "Error.h" //I define things like throw(message) here, it works and is not the issue

class MVec {
private:
double vec[3];
public:
MVec();
MVec(double &);
MVec(double *);
MVec(MVec &);
MVec & operator=(MVec &);
inline double & operator[](const int i);
inline const double & operator[](const int i) const;
MVec operator+(const MVec &) const;
~MVec();
};

MVec::MVec() {}

MVec::MVec(double &a) {
for(int i = 0; i < 3; i++)
vec[i] = a;
}

MVec::MVec(double *a) {
for(int i = 0; i < 3; i++)
vec[i] = *a++;
}

MVec::MVec(MVec &rhs) {
for(int i = 0; i < 3; i++)
vec[i] = rhs[i];
}

MVec & MVec::operator=(MVec &rhs) {
if(this != &rhs)
for(int i = 0; i < 3; i++)
vec[i] = rhs[i];

return *this;
}

inline double & MVec::operator[](const int i) {
#ifdef _CHECKBOUNDS_
if(i < 0 || i >= 3)
throw("Subscript out of bounds");
#endif

return vec[i];
}

inline const double & MVec::operator[](const int i) const {
#ifdef _CHECKBOUNDS_
if(i < 0 || i >= 3)
throw("Subscript out of bounds");
#endif

return vec[i];
}

MVec MVec::operator+(const MVec &vec1) const {
MVec ans;

for(int i = 0; i < 3; i++)
ans[i] = vec[i] + vec1[i];

return ans;
}

MVec::~MVec() {
delete[] vec;
}

#endif

[] 运算符似乎按预期工作。不幸的是, vector 加法运算符没有。具体来说,当我运行代码时:

#include "Error.h"
#include "MVec.h"
#include <cstdlib>
#include <iostream>

int main(int argc, char *argv[]) {
MVec a, b, c;
a[0] = 1; a[1] = 2; a[2] = 3;
b[0] = 5.9906; b[1] = 72.1139; b[2] = 83.1324;

//c = a + b;

std::cout << (a + b)[0] << std::endl;
std::cout << (a + b)[1] << std::endl;
std::cout << (a + b)[2] << std::endl;

exit(0);
}

当我取消注释行 c = a + b;我收到编译器错误:

no match for 'operator=' in 'c = MVec::operator+(const MVec&) const(((const MVec&)((const MVec*)(& b))))'

当我注释掉它时,我在第一个 std::cout 之后收到 glibc detected error。据推测,我在 operator+ 函数中创建的临时变量有问题。不幸的是,我不够聪明,无法弄清楚是什么。对此的任何和所有见解都会非常有帮助。

最佳答案

您需要在您的复制构造函数中获取对 MVecconst 引用,以便能够将其与临时对象一起使用:

MVec(const MVec &);

这同样适用于赋值运算符,构造函数采用double:

MVec(const double &); // or no reference, MVec(double);
MVec& operator=(const MVec& rhs);

您还应该从析构函数中删除 delete [] vec,因为 vec 不是动态分配的。这可能是导致 glibc 错误的原因。

现在,为了表达如

SomeVec = 1.0 + SomeOtherVec;

您需要将 operator+ 声明为非成员函数:

MVec operator+(const MVec& lhs, const MVec& lhs); 

这将允许在左轴和右轴上同时进行隐式转换。一般来说,将这些类型的运算符作为非成员函数是个好主意,以保证 LHS 和 RHS 操作数之间的对称性。

另一方面,完全不允许 double 的隐式转换可能更有意义。您可以通过使相关的构造函数显式来实现这一点:

explicit MVec(double);

关于c++ - 重载+运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13461082/

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