C++ 没有使用重载构造函数和继承进行适当的用户定义转换
很抱歉,我是第100万个问这种问题的人 我正在尝试使用继承来组合一些基本的向量类。请原谅在.h中转储所有内容,我的实现将它们拆分,但为了简洁起见,我将它们压缩到这里 向量hC++ 没有使用重载构造函数和继承进行适当的用户定义转换,c++,inheritance,C++,Inheritance,很抱歉,我是第100万个问这种问题的人 我正在尝试使用继承来组合一些基本的向量类。请原谅在.h中转储所有内容,我的实现将它们拆分,但为了简洁起见,我将它们压缩到这里 向量h class Vector{ public: Vector operator+(const Vector& rhs) { assert(dimensions == rhs.getDimensions()); Vector result(dimensions); for (char i = 0;
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 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中编写一个新的操作符+,它定义了一个指向Vector的指针,分配给它,然后专门调用rhs Vector3上的Vector::operator+,但这并没有解决这个问题。一个类似的问题意味着无法从向量构造Vector3,所以我尝试将其作为构造函数添加,但这也不行,而且感觉有点错误。我还尝试为Vector手动添加一个复制赋值操作符,结果类似
我在哪里错过了一些东西?您不应该在这里使用继承。继承不适用于二进制运算符 如果希望泛型向量在维度数上进行抽象,正确的方法是将其参数化,创建一个类模板
您不应该在这里使用继承。继承不适用于二进制运算符 如果希望泛型向量在维度数上进行抽象,正确的方法是将其参数化,创建一个类模板 Vector3 myVector3C=myVector3A+myVector3B 在这一行中,将调用用户定义的转换构造函数Vector->Vector3。 向量3约束向量和向量: Vector3vec[0],vec[1],vec[2]{} 但由于此转换构造函数是私有的,因此可能会出现编译器错误。 请公开,希望它能得到解决。vector3myvector3c=myVector3A+myVector3B 在这一行中,将调用用户定义的转换构造函数Vector->Vector3。 向量3约束向量和向量: Vector3vec[0],vec[1],vec[2]{} 但由于此转换构造函数是私有的,因此可能会出现编译器错误。
请将其公开,希望它能得到解决。最好是向代码展示您是如何实现operator+的,谢谢您的建议,并澄清了问题的其余部分。我正在尝试使用您不应该使用的继承来组合一些基本的向量类。它不适用于其他任何人,也不适用于你。在Vector3中,作为双参数x、y、double和z的悬空引用的x与vector中的值向量有什么区别?没有区别,这是为了与使用someVector3.x和someVector3[0]的现有代码兼容可以互换,但我可以看出这个实现根本不起作用。我将用@n.m的建议重写它。最好你展示一下你是如何实现operator+的,谢谢你的建议,并澄清了问题的其余部分。我正试图用你不应该使用的继承来组合一些基本的向量类。它不适用于其他任何人,也不适用于你。在Vector3中,作为双参数x、y、double和z的悬空引用的x与vector中的值向量有什么区别?没有区别,这是为了与使用someVector3.x和someVector3[0]的现有代码兼容可以互换,但我可以看出这个实现根本不起作用。我将使用@n.m的建议重写它。这看起来更合理。非常感谢你的想法+1表示不使用继承。Vector具有任意元素,则Vector3不是矢量。应该有一个没有继承的概念,它模拟了一种非继承关系;这看起来更合理。非常感谢你的想法+1表示不使用继承。Vector具有任意元素,则Vector3不是矢量。应该有一个没有继承的概念,它模拟了一种非继承关系;
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
template <size_t D>
class Vector {
// your data and methods here,
// nothing is virtual
};
using Vector3 = Vector<3>;