C ++ Доступ к функции оператора в унаследованном классе - PullRequest
0 голосов
/ 06 апреля 2020

В настоящее время я пишу приложение, в котором я использую Eigen-Library для сложных 3D-Math. Поскольку мне требовались разные точечные и векторные классы, мой point3d-класс выглядит следующим образом:

class point3d : public Eigen::Vector4d
{
public:
    point3d(){}
    point3d(double x, double y, double z) : Eigen::Vector4d(x, y, z, 1) {}
    void fromString(std::string input);
};

Теперь я хочу создать функцию-член этого класса, которая позволит мне анализировать строки OBJ-файлов, которые выглядят как это:

v 2.8 0.52 10.18

в качестве такой точки. Вот как я намереваюсь разработать свою функцию синтаксического анализа

void point3d::fromString(std::string input)
{
    char* buf = strdup(input.c_str());
    if (strtok(buf, " ") == "v")
    {

        ;
        strtok(buf, " ");
        this-x = std::stod(strtok(buf, " "));
        this->y = std::stod(strtok(buf, " "));
        this->z = std::stod(strtok(buf, " "));  

    }
}

Моя проблема в том, что Eigen не позволяет мне получить доступ к данным, хранящимся в Vector4d, как this-> x, this-y, this-> z и скоро. Вместо этого вы обычно получаете доступ к нему как Vector4d v; v [0], v [1], v [2] et c. Я думаю, что это происходит с помощью функции

double Eigen::Vector4d::operator[](unsigned int index){...}

.

Я не знаю, как именно можно получить доступ к этим данным в производном классе. Что мне нужно сделать, чтобы получить доступ к этим данным в этой функции, чтобы я мог записать значения x, y, z?

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

x, y, z - это не переменные-члены Eigen::Vector4d, а методы. Вы можете получить к ним доступ из своего производного класса, используя this->x() et c (или Vector4d::x()). То, что также работает, является (*this)[0] или (*this)(0). Если вам нужно часто обращаться к x(), y(), z() в своем классе, вы можете написать один раз:

using Vector4d::x;
using Vector4d::y;
using Vector4d::z;

, а затем обращаться к ним, используя x(), y(), z(). Однако это может вызвать некоторые конфликты теневого копирования (если вы называете локальные переменные одинаково).

1 голос
/ 06 апреля 2020

Вы можете сделать

(*this)[0]

и так далее, чтобы вызвать базовый класс operator[].

...