【问题标题】:What are void (*op)(T &) and void (*op)(T &, void *)?什么是 void (*op)(T &) 和 void (*op)(T &, void *)?
【发布时间】:2019-09-25 12:27:07
【问题描述】:

我有一个关于链表和模板的任务,其中有一些带有奇怪参数的函数是强制性的。 我找不到有关它的在线文档,感谢您提供的任何材料。

我尝试为 op 分配另一个地址,然后它编译得很好,但我无法调用它。

template <class T> struct L1Item {
  T data;
  L1Item<T> *pNext;
  L1Item() : pNext(NULL) {}
  L1Item(T &a) : data(a), pNext(NULL) {}
};

template <class T> class L1List {
  L1Item<T> *_pHead; // The head pointer of linked list
  size_t _size;      // number of elements in this list
public:
  void traverse(void (*op)(T &)) {
    // TODO: Your code goes here
  }
  void traverse(void (*op)(T &, void *), void *pParam) {
    // TODO: Your code goes here
    //    string *Req = static_cast<string *>(pParam);
    //    if (*Req == "find city's id") {
    //        op = this->_pHead;
    //    };
  }
};

【问题讨论】:

  • 相关:stackoverflow.com/questions/2592137/… 试图为骗子找到更好的目标
  • 搜索函数指针
  • 这里有这个translator,从C(和C++)到英文。
  • 在之前没有解释函数指针语法的情况下,有人会给你这个作业,真是太神奇了。
  • 咆哮:有时老师在教 c++ 方面的糟糕程度让我感到惊讶。我认为这是该语言没有得到更广泛使用的原因之一。就好像有些老师正在教授“C with classes”(实际上是第一个 c++ 版本之一)而不是 c++。如果你给某人上一门 Java 课程——开始教他们字节码是很疯狂的(即使老师可能非常了解字节码)。也许不是一个很好的例子,但你明白我的意思。应该是相反的!

标签: c++ templates parameters linked-list


【解决方案1】:

代码void (*op)(T &amp;)op 声明为指向函数的指针,将T 类型的引用作为参数; void (*op)(T &amp;, void *) 类似,但多了一个 void* 类型的参数。

而不是试图在您的(注释掉的)代码中为它分配一个指向对象的指针,op = this-&gt;_pHead; 您应该调用 函数通过。像这样的东西,例如:

void traverse(void (*op)(T &, void *), void *pParam) {
// TODO: Your code goes here
    op(pHead->data, pParam); // First parameter is a T passed by reference
}

在您的代码的其他地方,当您实际调用 traverse 时,您需要将您(或某人)定义的函数(地址)作为它的第一个参数;例如:

template <class T> void myFunc(T& obj, void *pParam) {
    string *Req = static_cast<string *>(pParam);
    if (*Req == "find city's id") {
    // do something with/to "obj"
    }
}
//...
traverse(myFunc, pString);
// ...

请随时要求进一步解释(但也请阅读您的问题中给出的 cmets)!

【讨论】:

  • 它是一个指向函数的指针,需要有它指向的函数。这种情况下需要在调用traverse()时传入函数
  • @DanS 感谢您的评论!我已扩展我的答案以纳入您的建议。
【解决方案2】:

这个:

void traverse(void (*op)(T &)) {
  // TODO: Your code goes here
}

是一个函数声明,它有一个指向函数类型的指针参数 void ( * )(T &amp;).

如果用函数类型代替函数指针,则声明看起来会更简单,例如:

void traverse( void op( T & ) ) {
    // TODO: Your code goes here
}

编译器将函数类型隐式转换为指向函数类型的指针。

这个:

void traverse(void (*op)(T &, void *), void *pParam) {
    // TODO: Your code goes here
    //    string *Req = static_cast<string *>(pParam);
    //    if (*Req == "find city's id") {
    //        op = this->_pHead;
    //    };
}

也是一个带有两个参数的函数声明,第一个参数有一个指向函数类型的指针。

同样,可以声明一个函数类型的参数来代替函数指针:

void traverse( void op(T &, void *), void *pParam ) {
   // TODO: Your code goes here
   //    string *Req = static_cast<string *>(pParam);
   //    if (*Req == "find city's id") {
   //        op = this->_pHead;
   //    };
}

这使声明更清晰。

【讨论】:

    猜你喜欢
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多