这个' A类的参数是什么?电话正在做什么?

时间:2018-06-04 10:10:11

标签: c++ embedded-linux

我在b.h

中定义了一个类
class A{ 
public:
   void       (B ::*writeBlock)    ();
};

其他class B定义为

class B{
public:
      A obj;
};

class B中使用b.cpp的此参数作为

(this->*obj.writeBlock)();

请提供上述writeBlock的调用的定义。

2 个答案:

答案 0 :(得分:1)

你的问题不是很清楚,但仍然是我能理解的:

B由A对象组成,A对象的函数指针writeBlock未初始化。此外,您尝试取消引用未初始化的指针writeBlock,同时通过它进行调用,这是错误的。

首先将writeBlock初始化为类B的成员函数,然后尝试解除引用它。

注意B::*表示类B的成员函数。因此,this->*obj.writeBlock必须解析为B的成员函数之一。

答案 1 :(得分:1)

如果你的意思是它的目的和可能的用途,那么这是让B的不同实例具有不同行为的一种方式,这取决于他们obj的{​​{1}}被初始化为writeBlock成员。

A将成员类B的成员函数的地址存储为稍后要使用的成员。这就是writeBlock:它是pointer to member function

writeBlock必须在某处初始化以指向B的成员函数,在这种情况下,它接受零参数并返回void。

可能的情况如下:

class B
{
public:
    A obj;

    void DoWork()
    {
        (this->*obj.writeBlock)();
    }

    void Task1() { std::cout << "1"; };
    void Task2() { std::cout << "2"; };
};


B b1, b2;
b1.obj.writeBlock = &B::Task1;
b2.obj.writeBlock = &B::Task2;

b1.DoWork(); // prints 1
b2.DoWork(); // prints 2

此处,b1b2看起来相同,但表现不一样。这就是这种语法的目的。