我想在构造函数中传递一个函数指针但是得到一些错误消息......
我的父类我宣布:
class Strip{
public:
typedef void(Strip::*LOG)(const std::string&);
使用函数log(const string&)
在我的孩子课上,我用class Strip
转发声明带,并且有类似的东西
class Observable{
public:
Observable(const char &signal,Strip::LOG log,const QCustomPlot *plot);
带参数
Strip::LOG log;
当我尝试编译时,我得到错误的
Strip :: LOG尚未声明 类Strip中的LOG并没有命名类型
任何想法如何解决这个问题?
答案 0 :(得分:1)
因此,将指针传递给成员函数会出现几个问题:
this
参数)。更好的方法是声明一个接口并传递
// ILogger.hpp
// should be completely virtual
struct ILogger{
virtual void log(const ::std::string&) = 0;
};
// Strip.cpp
class Strip : public ILogger{
public:
void log(const ::std::string& data){
// does something
}
};
// Observable.cpp
#include "ILogger.hpp"
class Observable{
public:
Observable(ILogger* logger);
};
// some other file that knows about and constructs both
// has to be a pointer allocated to new to make the Vtables work
::std::unique_ptr<Strip> s(new Strip());
// pass in the pointer to an instance of a class that implements ILogger
Observable observed(s.get());
使用接口意味着您可以完全抽象出两个类,Observable
除了实现ILogger
之外,不需要知道传递给它的实例。内部Observable
可以通过调用logger->log
来调用记录器。
答案 1 :(得分:0)
这段代码可能很有用(编译没有错误):
#include <iostream>
using namespace std;
class Strip{
public:
typedef void(Strip::*LOG)(const std::string&);
void log(const string& s)
{
cout << "log() called\n";
}
};
class Observable{
public:
Observable( Strip::LOG l )
{
Strip s;
(s.*l)("string");
}
};
int main() {
Strip::LOG log = &Strip::log;
Observable o( log );
return 0;
}