C ++从类外部设置指向结构中函数成员的指针

Posted

技术标签:

【中文标题】C ++从类外部设置指向结构中函数成员的指针【英文标题】:C++ setting pointer to function member in a struct from outside the class 【发布时间】:2015-12-22 14:13:03 【问题描述】:

我尝试通过SetPtr()方法从类外部设置类内str结构中包含的函数指针。

我得到错误:非静态成员函数的使用无效。

class C 
    public:

    float v1, v2;

    struct S 
        float (*Read)();
        void  (*Write)(float);
     str;

    float ReadV1() 
        return v1;
    

    void WriteV1(float value) 
        v1 = value;
    

    float ReadV2() 
        return v2;
    

    void WriteV2(float value) 
        v2 = value;
    

    void SetPtr(float (*read)(), void (*write)(float)) 
        str.Read = read;
        str.Write = write;
       

    void F()
    
        float f = str.Read();
        str.Write(f);       
    
;

int main()

    C c;

    c.SetPtr(c.ReadV1, c.WriteV2); // ERROR

    c.v1 = 0;
    c.F();
    return 0;

我还尝试用指向成员函数的指针替换函数指针:

class C 
    public:

    float v1, v2;

    struct S 
        float (C::*Read)();
        void  (C::*Write)(float);
     str;

    float ReadV1() 
        return v1;
    

    void WriteV1(float value) 
        v1 = value;
    

    float ReadV2() 
        return v2;
    

    void WriteV2(float value) 
        v2 = value;
    

    void SetPtr(float (C::*read)(), void (C::*write)(float)) 
        str.Read = read;
        str.Write = write;
       

    void F()
    
        float f = str.Read();   // ERROR
        str.Write(f);           // ERROR
    
;

int main()

    C c;

    c.SetPtr(&C::ReadV1, &C::WriteV2);

    c.v1 = 0;
    c.F();
    return 0;

但这会在类中移动错误:

错误:必须使用'.'或'->'来调用指向成员函数的指针 '((C*)this)->C::str.C::S::Read (...)',例如'(...->* ((C*)this)->C::str.C::S::Read) (...)'

无论我尝试使用this->, braces, *, ->, . 的任何组合,它都不起作用。

有什么想法吗? 谢谢!

【问题讨论】:

【参考方案1】:

你需要使用第二种形式(带有指向类方法的指针),但是在调用方法时你需要使用:

float f = (this->*str.Read)();
(this->*str.Write) (f);

第一种方法无法正常工作,因为指向类方法的指针不会衰减为指向标准函数的指针(即float (C::*) () 不能衰减为float (*) ())。

使用C++11,您可以将方法存储为std::function 并使用std::bind

#include <functional>

class C 

    struct S 
        std::function <float()> Read ;
        std::function <void(float)> Write ;
     str ;

    void SetPtr(float (C::*read)(), void (C::*write)(float)) 
        str.Read = std::bind(read, this);
        str.Write = std::bind(write, this, std::placeholders::_1);
       

    void F() 
        float f = str.Read();
        str.Write (f);
    



int main () 
    C c;
    c.SetPtr(&C::ReadV1, &C::WriteV2);

【讨论】:

以上是关于C ++从类外部设置指向结构中函数成员的指针的主要内容,如果未能解决你的问题,请参考以下文章

c#-基础:类的进阶

C++继承设计链表

c++ - 使用私有参数调用公共函数

当有多个派生类时,如何使用基类指针访问派生类的函数成员?

C++从类的向量指针访问类的成员

c#核心基础--类的继承