类成员函数错误的函数指针

时间:2018-04-24 01:09:17

标签: c++ pointers function-pointers

我创建的系统包含7类数据(因此,7个不同的对象),用户可以添加,编辑和删除。为了提高效率,我创建了一个实用程序类,从中定义了添加,编辑和删除程序更具体的函数。因为用户可以在Add函数中输入数据,所以我将类成员函数指针传递给List的addObject类,该类输入特定于该对象的数据。因此,List类添加了对象,每个类都有一个特定变量的类成员函数。

我在addObject类中有这个错误:

  

被叫对象类型' bool(Product :: *)()'不是函数或函数指针

似乎List类无法访问产品数据。当我添加#include" Product.h"在头部,编译器发送了许多关于Product函数的双初始化的错误,这很奇怪,因为所有类在顶部和底部都有#ifndef,#define和#endif。

这是我的代码 - 我添加了我认为对理解很重要的内容,所以如果您需要了解更多内容,请告诉我们:

主:

#include <list>
#include <iterator>
#include <algorithm>
#include "Product.h"
#include "List.h"
int main () 
{
    bool (Product::*prodFunc) () = &Product::addProduct;
    allProducts.addObject(allProducts.back(), prodFunc); 
}
列表类中的

template<class DT>
bool List<DT>::addObject(DT & previous, bool (DT::* func)())
{
    bool success = true;
    int newID = 1 + (previous.getID());
    cout << "New ID: " << newID << endl;
    previous.setID(newID);
    func(); //Error here
    return success;
}

产品的addProduct类:

bool Product::addProduct()
{
    bool success = true;
    cout << "Please enter the following for your new product:\n";
    addItem();
    return success;
}

我确信(或者至少希望)它是一件非常简单的东西,我不知道。谢谢!

2 个答案:

答案 0 :(得分:1)

假设您要在makeExecutableSchema参数上调用成员函数,您进行此类调用的方式如下:

previous

或者,因为语法看起来很粗糙,所以大多数建议使用(previous.*func)(); 代替

std::invoke

哪会自动推断std::invoke(func, previous); 是成员函数,应该使用func

进行调用

答案 1 :(得分:0)

您不能将指向非静态成员函数的指针作为裸函数传递;必须在类的类型的某个对象上调用它。实现此目的的简便方法是使用std::bind

auto prodFunc = std::bind(&Product::addProduct, &allProducts.back());
allProducts.addObject(allProducts.back(), &prodFunc);

或者,您可以将Product::addProduct()声明为static成员函数,在这种情况下,您的代码应按预期运行。看看你如何使用它,这可能就是你真正想要的。