【问题标题】:Assigning function pointer to function pointer将函数指针分配给函数指针
【发布时间】:2014-10-15 13:04:07
【问题描述】:

我在尝试将函数指针分配给结构中的函数指针时遇到问题。

我有一个结构command,它包含一个调用字符串值、一个确认其激活的消息以及一个在激活时调用的函数。

但是,我在下面的结构的构造函数中分配函数指针时遇到了麻烦(以后可能会将结构变成一个类,不确定)。

struct Command
{
    Command(string _code, string _message, void *_func(void))
        : code(_code), message(_message) { /* ERROR: */ func = _func; }

    string code;        // The string that invokes a console response
    string message;     // The response that is printed to acknowledge its activation
    void *func(void);   // The function that is run when the string is called
};

在上面的代码中,标记为/* ERROR: */ 我得到了错误"expression must be a modifiable value"。我怎样才能解决这个问题?我只想将一个函数的引用传递给结构。

【问题讨论】:

  • void *func(void) 不是函数指针,它是一个名为 func 的函数的声明,它不接受任何参数并返回 void*void (*func)(void) 是一个名为 func 的变量,它是一个指向不带参数且不返回任何内容的函数的指针。
  • 另外,在 C++ 中你应该小心指向函数的指针,因为它们只能用于非成员函数、静态成员函数或一种类型的 lambda 表达式。如果您想要更通用的函数类型,请阅读std::function
  • @Joachim Pileborg 呃,你是对的。帅哥,谢谢解答!现在工作:)

标签: c++ pointers struct function-pointers


【解决方案1】:

正如@Joachim Pileborg 所述,您没有声明指向函数的指针。

要声明函数指针,您需要在星号和标识符部分周围添加括号,例如

// 'func' is a pointer to function taking parameter void and returning void.
void (*func)(void);

从 C++11 开始,您还可以像这样声明一个不太简洁的函数指针:

std::add_pointer_t<void()> func;

std::add_pointer_t<void(int, int)> func; // Pointer to func taking 2 ints.

【讨论】:

  • 在快速解决问题后,我不完全了解 add_pointer 也不了解如何将 std::function 用于我的目的。我将不得不进一步调查。在那之前,感谢您的快速修复:D
  • 您可以简单地将所有出现的void (*func)(void) 替换为std::add_pointer_t&lt;void()&gt; func,而不会改变行为。还请记住,在 C++ 中,您不必使用 (void) 声明不带任何内容的参数列表,而是可以简单地使用 ()
【解决方案2】:

*func 和 *_func 需要括号

【讨论】:

    猜你喜欢
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 2019-10-19
    相关资源
    最近更新 更多