没有合适的用户定义的转换,带有重载的构造函数和继承

时间:2019-07-01 04:51:09

标签: c++ inheritance

很抱歉成为第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添加一个副本分配运算符,结果相似。

我在哪里错过了什么?

2 个答案:

答案 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]){}

但是由于此转换构造函数是私有的,因此您可能会遇到编译器错误。 请设为公开,并希望它能解决。