Implementation of virtual functions from a third party class(从第三方类实现虚拟函数)
问题描述
摘要
我想设计一个保存所有问题数据的类,这样它的成员函数就可以用来将信息传递给第三方成员函数。如何为以下两个函数执行此操作?
我的问题:
我正在为科学计算编写一个程序。为了解决我的问题,我不得不使用一些第三方库。目前,我正在使用IPOT(用于数值优化)。
要使用IPOT,我必须通过以下方式提供足够的信息。
首先,我需要创建一个继承第三方类TNLP的类。
然后我必须提供8个虚函数的实现,其中两个虚函数的实现如下所示。
// MyNLP is the class which I coded to inherit from TNLP.
bool MyNLP::get_starting_point(Index n, bool init_x, Number* x,
bool init_z, Number* z_L, Number* z_U,
Index m, bool init_lambda,
Number* lambda)
{
// Here, we assume we only have starting values for x, if you code
// your own NLP, you can provide starting values for the others if
// you wish.
assert(init_x == true);
assert(init_z == false);
assert(init_lambda == false);
// we initialize x in bounds, in the upper right quadrant
x[0]=0.5;
x[1]=1.5;
return true;
}
和
bool MyNLP::eval_f(Index n, const Number* x, bool new_x, Number&
obj_value)
{
// return the value of the objective function
Number x2 = x[1];
obj_value = -(x2 - 2.0) * (x2 - 2.0);
return true;
}
在上面的实现中,我直接为函数调用中的参数提供了值。现在为了使程序更通用,我不是直接在上面的函数中输入所需的信息,而是希望使用一个包含有关我的问题的所有信息的类,并在第三方虚拟函数中使用函数成员。
例如,如果NLP是保存我的问题内容的类,m_nlp是它在类MyNLP中的事件,那么我将重写虚函数,如下所示。
bool MyNLP::get_starting_point(Index n, bool init_x, Number* x,
bool init_z, Number* z_L, Number* z_U,
Index m, bool init_lambda,
Number* lambda)
{
// Here, we assume we only have starting values for x, if you code
// your own NLP, you can provide starting values for the others if
// you wish.
assert(init_x == true);
assert(init_z == false);
assert(init_lambda == false);
x = m_nlp->get_initial_values();
}
和
bool MyNLP::eval_f(Index n, const Number* x, bool new_x, Number&
obj_value)
{
// return the value of the objective function
obj_value = m_nlp->get_obj_value();
}
但我不能以上述方式完成此操作,因为第二个函数使用x来计算object_val。如何设计一个类来保存所有数据并使用其成员函数向IPOT提供所需的信息。
我认为的解决方案:
将std::vector<Number> values定义为nlp类的成员,并将x指向values的第一个元素。
x = &(m_nlp->get_values()).at(0);
在第二个函数中,我可以修改values而不是x和计算obj_val。
推荐答案
您可以从MyNLP派生一个类。或
class NLPWithStuff : public MyNLP {
//...
virtual bool get_starting_point(/*...*/)
{
// optional boost::signals that do their stuff ??
// do my stuff, set flags so that no-one touches my stuff
// don't assert
return MyNLP::get_starting_point(/*.+.*/);
}
};
您必须声明MyNLP::get_starting_pointvirtual才能使其工作。
这篇关于从第三方类实现虚拟函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:从第三方类实现虚拟函数
基础教程推荐
- 在 C++ 中计算滚动/移动平均值 2021-01-01
- 如何在 C++ 中初始化静态常量成员? 2022-01-01
- C++结构和函数声明。为什么它不能编译? 2022-11-07
- 如何通过C程序打开命令提示符Cmd 2022-12-09
- 我有静态或动态 boost 库吗? 2021-01-01
- 这个宏可以转换成函数吗? 2022-01-01
- 如何将 std::pair 的排序 std::list 转换为 std::map 2022-01-01
- 常量变量在标题中不起作用 2021-01-01
- 静态库、静态链接动态库和动态链接动态库的 .lib 文件里面是什么? 2021-01-01
- 如何检查GTK+3.0中的小部件类型? 2022-11-30
