【问题标题】:Issue with function pointers in C++C ++中的函数指针问题
【发布时间】:2013-02-08 10:04:42
【问题描述】:

我打算使用函数指针在一个类中实现不同的函数。 但是,我在尝试实现一个这样的功能时遇到了一些麻烦。

代码在这里:

std::vector<int> * (*create_vector)()
{
    std::vector<int> * vec_p = new std::vector<int>;
    return vec_p;
}

错误如下:

3: [Error] expected primary-expression before '*' token
3: [Error] 'vec_p' was not declared in this scope
3: [Error] expected '}' before ';' token 
4: [Error] expected unqualified-id before 'return' 
5: [Error] expected declaration before '}' token

我对函数指针有什么误解吗,还是另一个问题?

【问题讨论】:

  • 我不明白你在做什么。您需要返回指针或函数指针的函数吗?

标签: c++ function-pointers


【解决方案1】:

std::vector&lt;int&gt; * (*create_vector)() 声明一个指向函数的指针。一个指针。不是函数。您不能继续使用指针并假装它是一个函数并定义它的主体。您需要分别声明这两者:

std::vector<int> * create_vector()
{
    std::vector<int> * vec_p = new std::vector<int>;
    return vec_p;
}

std::vector<int> * (*pcreate_vector)() = create_vector;

【讨论】:

    【解决方案2】:

    你不能同时声明一个函数和一个函数指针。

    简单地定义你的函数:

    std::vector<int>* create_vector()
    {
        std::vector<int>* vec_p = new std::vector<int>;
        return vec_p;
    }
    

    那么,最好是做一个typedef(为了代码可读性):

    typedef std::vector<int>* (*create_vector_func)();
    

    现在你可以使用它了:

    create_vector_func myFunc = &create_vector;
    

    【讨论】:

      【解决方案3】:

      函数被实现,函数指针可以指向函数。函数指针本身没有实现。

      改为:

      std::vector<int>* create_vector()
      {
          std::vector<int> * vec_p = new std::vector<int>;
          return vec_p;
      }
      

      然后你可以声明一个指向create_vector()的函数指针。使用typedef 可以简化管理函数指针:

      typedef std::vector<int>* (*func_t)();    // C++03
      typedef decltype(&create_vector) func_t; // C++11
      
      func_t f = create_vector;
      auto f = create_vector; // C++11 option also.
      

      尽可能避免动态分配,因为它会引入额外的复杂性,使代码更容易出错。在 C++11 中,引入了移动语义,因此在这种情况下按值返回的成本显着降低,因为名为 vec_pvector 将从中移动(因为它即将到期),不是从那里复制的。如果您必须动态分配,请使用smart pointer 的形式。

      【讨论】:

        【解决方案4】:

        这不是你定义函数指针的方式。首先用你拥有的函数体定义函数,然后将其分配给函数指针。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-05-31
          • 1970-01-01
          • 1970-01-01
          • 2021-10-29
          • 1970-01-01
          • 2011-09-09
          • 1970-01-01
          相关资源
          最近更新 更多