存储带有要传递给回调的参数的空函数指针

问题描述 投票:0回答:0

我正在研究一种 C++ 算法,该算法可以像线性结构一样对列表进行排序,而无需使用任何外部数据结构的任何帮助。我的计划是首先找到最小值并将其放在开头以开始对其余值进行比较和排序。我没有使用 STL,因为我试图了解该语言的基础。这种学习方法在我的旅程中代表了一条更长的路,但我觉得这样做真的很好。

我的计划是使用

iterate
函数作为主函数,通过我的线性结构调用以下辅助函数:
print
在控制台中查看值,
getLast
添加节点和
findMin
找到开始的最小值。我已经阅读了一些有关涵盖
std::function
、lambdas 表达式和函数指针的相关问题的 Stack overflow 答案。我在某个时候对这么多信息感到困惑,然后意识到最简单但最有效的方法是依赖函数指针。但是,尝试在
void(*callback)(Node* node)
中存储对函数的引用会引发无法找到我的函数地址的错误。

void List::iterate(Node * node,void(*callBack)(Node* node)){
  callBack(node);
  if(node->next == nullptr)
    return;
  iterate(node->next,callBack); 
}

void List::add(int data){
  void (*callback)(Node* node) = &print(root); //Can't take the address of an rvalue of type void 
  iterate(root, callBack);
}

我在互联网上找到的东西很难应用到我的代码中,原因有二。一是示例具有返回值类型且没有参数,二是大多数示例不在类中。第二个原因导致非静态值出现问题,尤其是在尝试使用 lambda 和

std::function
.

我想问一下社区是否对 void 函数进行了特殊处理。另外,我的猜测是具有返回值的函数更容易处理,因为类型表示可以在编译时分配的内存大小,而 void 显然是未知的。这背后的理论是什么?与此同时,我将阅读这篇 Stack Overflow 帖子 what-are-rvalues-lvalues-xvalues-glvalues-and-prvalues 以更好地理解控制台告诉我的内容。

谁能告诉我我的代码做错了什么?我缺少/没有很好地应用到练习中的概念是什么?另外,如果您觉得需要对代码提供额外的反馈,请提供,我也非常感谢。

这是练习

/* Implement sorting in a dynamic linked list without using an additional array or data structure.*/

#include <iostream>

class List{
  struct Node{
    int data;
    Node* next = nullptr;
  };
  public:
    List(int data);
    ~List();
    void add(int data);
    void iterate(Node * node, void(*callback)(Node* node));
  private:
    void print(Node *node);
    void findMin(Node* node);
    void getLast(Node* node);
    int min = 0;
    Node* root;
    Node* it;
};

List::List(int data){
  root->data = data;
  it = root;
}

List::~List(){}

void List::print(Node *node){
  std::cout<<node->data<<'\n';
}

void List::findMin(Node* node){
  if (node->data<min) {
    min = node->data; 
  }
}

void List::getLast(Node* node){
  it = node; 
}

void List::iterate(Node * node,void(*callBack)(Node* node)){
  callBack(node);
  if(node->next == nullptr)
    return;
  iterate(node->next,callBack); 
}

void List::add(int data){
  void (*callback)(Node* node) = &print(root); //Can't take the address of an rvalue of type void 
  iterate(root, callBack);
}

int main(){
  List list(8); 
  list.add(9);
  list.add(7);
  list.add(4);
  list.add(3);

  return 0;
}
c++ callback function-pointers void-pointers
© www.soinside.com 2019 - 2024. All rights reserved.