c ++ передача нестандартного собственного вектора в качестве аргумента функции и изменение его в функции

Я реализую функцию-член производного класса (объявленного как виртуальный в базовом классе). Один из аргументов - это vectorXd, и именно в нем будет сохранен результат операции.

Я прочитал «Написание функций, принимающих собственные типы в качестве параметров» (http://eigen.tuxfamily.org/dox/TopicFunctionTakingEigenTypes.html), и их взлом полагается на шаблонные функции, фокусируясь на общем объекте Eigen в качестве возможного параметра. В моем случае я не думаю, что это сработает, потому что кажется, что нельзя смешивать виртуальный и шаблонный.

С другой стороны, я знаю, что мой аргумент всегда будет иметь тип VectorXd, и я даже могу изменить его размер до нужного размера, прежде чем переходить к функции, чтобы не изменять размер внутри функции. Я пытаюсь передать вектор по ссылке как константу и использовать const_cast, чтобы иметь возможность вносить необходимые изменения, но я все равно получаю ошибку связывания:

ошибка LNK2001: неразрешенный внешний символ "public: virtual void __thiscall проблема :: f (метод класса *, класс Eigen :: Matrix const &, class Eigen :: Matrix const &)" (? f @ проблема @@ UAEXPAVmethod @@ ABV? $ Матрица @ N $ 0? 0 $ 00 $ 0A @ $ 0? 0 $ 00 @ Eigen @@ 1 @ Z)

Здесь «проблема» - это базовый класс, «f» - это функция, а «метод» - это другой класс (мне тоже нужен объект этого типа внутри моей функции).

В определении проблемы у меня есть:

virtual void f(method *m, const Eigen::VectorXd &x, Eigen::VectorXd const &y);

В определении производной: проблема у меня:

void f(method *m, const Eigen::VectorXd &x, Eigen::VectorXd const &y) {...};

'y' - это место, где мне нужно сохранить результат. Любые предложения о том, как этого добиться? Заранее спасибо.


person Kevin    schedule 17.07.2013    source источник


Ответы (1)


Если ваш базовый класс абстрактный, установите для метода значение =0 и будьте чистым virtual.

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

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

person Yakk - Adam Nevraumont    schedule 17.07.2013
comment
Спасибо, мне не хватало = 0. Я использую производные классы для реализации f, но передаю указатель на базовый класс в функции, в которой вызывается f. - person Kevin; 18.07.2013