在c ++中使用什么代替基础对象

时间:2016-04-07 11:01:29

标签: c++ function-pointers

我想在c ++中做这样的事情(但是因为没有" baseobject"就像在例如JAVA中那样)

double integrate(double(*integrand)(InputData, int), vector<BaseObject>& inputdata){
   ...
   for(...)
       value+= integrand(inputdata, someIntVariable);
   ...
   return value;
}

我在inputData中放置了不同类型的对象,为我的integrand - 函数输入shuold。然后,我可以将这些值转换为我的integrand-functions

double integrand1(vector<BaseObject> &inputdata, int s){
     double d = (double) inputdata.at(1);
     char s = (char ) inputdata.at(2);
     ... do stuff with d ans s
}

我怎样才能以其他方式实现这一目标?

编辑我理解为什么按值传递矢量并不是一个好主意,我只是想表明我需要为不同的整数提供不同数据的集合。

我可以解释一下我的功能目标是什么:我想做一般的集成功能,所以我可以通过一般的&#34; integrand&#34;我的功能然后以数字方式集成。但是,不同的积分需要完全不同的输入数据(比如可能有些需要4x4矩阵等)。

3 个答案:

答案 0 :(得分:0)

在java中,比int更复杂的东西是引用。在C ++中,默认情况下对象不是引用。这使得无法在向量中存储不同的对象,因为每个对象类型将需要不同的空间来存储它(向量连续存储对象)。

要实现你想要的东西,你必须使用指针(一个更通用的参考版本,因为你可以在指针上执行指针数学运算)。使用void *的向量没有任何问题,但是你可能最好为你想要存储在向量中的所有对象使用公共基类,因为在处理对象之前需要某种方法来找出类型(C ++的RTTI非常有限)。

答案 1 :(得分:-1)

使用boost::any

vector<boost::any> inputdata

答案 2 :(得分:-2)

C ++的方法是使用模板:

template<typename integrand_type, typename inputdata_type>
double integrate(integrand_type &&integrand, const inputdata_type &inputdata){
   ...
   for(...)
       value+= integrand(inputdata, someIntVariable);
   ...
   return value;
}

...假设inputdata应该是某种类型的常量容器。另外,您确实理解通过值传递矢量作为函数参数可以生成矢量的完整副本,对吧?这就是你需要参考的原因。

Java对象与C ++对象完全不同。在Java中,当您引用对象时,您实际上是引用指向对象的指针。 Java中的所有对象都是引用。在C ++中,你必须明确你想要什么,否则你最终会产生非常低效的代码。