我创建的系统包含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;
}
我确信(或者至少希望)它是一件非常简单的东西,我不知道。谢谢!
答案 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
成员函数,在这种情况下,您的代码应按预期运行。看看你如何使用它,这可能就是你真正想要的。