带有函数指针的typedef

时间:2014-02-02 15:08:44

标签: c++ pointers typedef

我想在构造函数中传递一个函数指针但是得到一些错误消息......

我的父类我宣布:

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并没有命名类型

任何想法如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

因此,将指针传递给成员函数会出现几个问题:

  1. 它是一个成员函数,因此它需要传递一个类的实例才能工作(隐式this参数)。
  2. 它不会阻止你传递它的类知道函数指针所产生的类,所以你在隐藏方面没有任何收获。
  3. 更好的方法是声明一个接口并传递

    // 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;
}

http://ideone.com/RD4K1r