Нет подходящего пользовательского преобразования с перегруженными конструкторами и наследованием - PullRequest
1 голос
/ 01 июля 2019

Извините, что стал миллионером, задавшим этот вопрос!

Я пытаюсь собрать несколько элементарных векторных классов, используя наследование. Извините, что выгрузил все в .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

Я немного новичок в наследовании, что может быть до боли очевидным. Я попытался написать новый operator+ в Vector3.h, который определяет указатель на Vector, присваивает его this, затем специально вызывает Vector::operator+ на rhs Vector3, но это не обрезает его ( хе). Подобный вопрос подразумевал, что не было никакого способа построить Vector3 из Vector, поэтому я попытался добавить это как конструктор, но это тоже не делает этого, а также немного ошибочно. Я также попытался вручную добавить оператор присваивания для Vector, с похожими результатами.

Где я что-то пропустил?

Ответы [ 2 ]

4 голосов
/ 01 июля 2019

Вам вообще не следует использовать наследование.Наследование просто не работает с бинарными операторами.

Если вы хотите, чтобы универсальный вектор абстрагировался по количеству измерений, правильным подходом является его параметризация, создав шаблон класса .

template <size_t D>
class Vector {
   // your data and methods here, 
   // nothing is virtual
};

using Vector3 = Vector<3>;
0 голосов
/ 01 июля 2019

Vector3 myVector3C = myVector3A + myVector3B;

В этой строке будет вызван пользовательский конструктор преобразования (Vector -> Vector3). Vector3 (const Vector & vec): Vector3 (vec [0], vec [1], vec [2]) {}

Но поскольку этот конструктор преобразования является закрытым, вы, возможно, получаетеошибка компилятора.Пожалуйста, сделайте это общедоступным и, надеюсь, это будет решено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...