【问题标题】:Function Pointer Definition in Block Scope块范围内的函数指针定义
【发布时间】:2018-04-19 22:48:19
【问题描述】:

我有一个这样的代码部分。

if (opt_choice == 1){
  double (*foo)(int , const MatrixXd& ); 
  double (*optimize)(double (*)(int, const MatrixXd&)) = function1;}
else if (opt_choice == 2){
  double (*foo)(int , const VectorXd& ); 
  double (*optimize)(double (*)(int, const VectorXd&)) = function2;}

我打算根据用户输入使用相同的函数指针(此处为优化)指向不同的函数。同样,我还有另一个函数指针 foo,它根据用户的选择采用不同的参数。 foo 稍后被分配给不同的函数。

switch (....)
case 1: foo = someFunction; break;  // error : foo is not declared in this scope
case 2: foo = someFunction2; break; 
...

最后,我希望使用它们各自的函数指针来调用它们。

optimize(var1,foo); // error : optimize is not declared in this scope 

正如您可能已经猜到的那样,编译器会在这里抛出一个错误,因为 foooptimize 不在作用域内,因为它们是在 if 语句中声明的。

有什么方法可以实现吗?也就是说,将 foooptimize 保持在范围内,直到程序结束。 谢谢。

【问题讨论】:

  • 当我想做这样的事情时,我将它分配给一个变量。
  • 您需要在ifelse 之外定义函数指针,并将它们设置在ifelse 内。
  • 我不明白这个问题。随心所欲地处理任何变量?
  • 类型必须在编译时知道,你不能这样做。

标签: c++ pointers scope function-pointers


【解决方案1】:

您应该从定义函数指针的类型开始。像这样的:

typedef double (*FooFunc)(int, const MatrixXd&);
typedef double (*OptimizeFunc)(int, const VectorXd&);

接下来,可以定义if范围之外的变量:

FooFunc foo;
OptFunc optimize;

然后在if里面赋值:

if (opt_choice == 1)
{
    optimize = function1;
}
else if (opt_choice == 2)
{
    optimize = function2;
}

你从来没有在你的第一个代码 sn-p 中分配给foo,所以我不知道在那里分配什么,但它应该分配给与FooFunc 具有相同签名的函数指针类型。对于开关,您可以执行以下操作:

switch (...)
{
    case 1: foo = <some function with a FooFunc signature>; break
    case 2: foo = <some other function with a FooFunc signature>; break;
    // ...etc.
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    • 2014-05-31
    • 1970-01-01
    • 2021-11-25
    相关资源
    最近更新 更多