很抱歉成为第100万个此类问题的提问者!
我正在尝试使用继承来组合一些基本的向量类。不好意思将所有内容都转储到.h中,我的实现将它们拆分开了,但是为了简洁起见,我在这里压缩它们。
Vector.h
class Vector{
public:
Vector operator+(const Vector& rhs) {
assert(dimensions == rhs.getDimensions());
Vector result(dimensions);
for (char i = 0; i < dimensions; i++) {
result[i] = values[i] + rhs[i];
}
return result;
}
double& operator[](int index) {
//Asserts 0 <= index < dimensions and returns values[index]
}
protected:
Vector(char dimensions) :
dimensions(dimensions), values(dimensions) {}
std::vector<double> values;
private:
char dimensions;
};
Vector3.h
class Vector3 : public Vector {
public:
Vector3(double X, double Y, double Z) :
Vector(3),
x(X), y(Y), z(Z)
{values[0] = x; values[1] = y; values[2] = z;}
double& x, y, z;
private:
Vector3(const Vector& vec) :
Vector3(vec[0], vec[1], vec[2]) {}
};
我很确定这是问题所涉及的一切...
这是哪里出错了:
Vector3 myVector3A(1,2,3); //OK
Vector3 myVector3B(4,5,6); //OK
Vector3 myVector3C = myVector3A + myVector3B; //Error: No suitable user-defined conversion for Vector to Vector3
我对继承有些陌生,这可能很明显。我尝试在Vector3.h中编写一个新的operator+
,它定义了一个指向Vector
的指针,将其分配给this
,然后在{{1}上专门调用了Vector::operator+
},但这并不能削减(heh)。一个类似的问题暗示无法从rhs Vector3
来构建Vector3
,因此我尝试将其添加为构造函数,但这也没有做到,而且感觉有点错误。我还尝试过手动为Vector
添加一个副本分配运算符,结果相似。
我在哪里错过了什么?
答案 0 :(得分:4)
您根本不应该在这里使用继承。继承根本不适用于二进制运算符。
如果要让通用Vector在维数上抽象,正确的方法是对其进行参数化,创建一个 class模板。
template <size_t D>
class Vector {
// your data and methods here,
// nothing is virtual
};
using Vector3 = Vector<3>;
答案 1 :(得分:0)
Vector3 myVector3C = myVector3A + myVector3B;
在这一行中,将调用用户定义的转换构造函数(Vector-> Vector3)。 Vector3(const Vector&vec): Vector3(vec [0],vec [1],vec [2]){}
但是由于此转换构造函数是私有的,因此您可能会遇到编译器错误。 请设为公开,并希望它能解决。