Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 初始化指向受保护成员函数的指针_C++_Initialization - Fatal编程技术网

C++ 初始化指向受保护成员函数的指针

C++ 初始化指向受保护成员函数的指针,c++,initialization,C++,Initialization,我有一个问题: 在头文件中: class D : public B { //... private: typedef char* (B::*psbposfun_t)() const; static psbposfun_t ms_aposf[2][3]; //... }; 在源文件中: D::psbposfun_t D::ms_aposf[2][3] = { { &B::fa1, &B::fa2, &am

我有一个问题:

在头文件中:

class D : public B
{
//...
private:
    typedef char* (B::*psbposfun_t)() const;

    static psbposfun_t ms_aposf[2][3];
//...
};
在源文件中:

D::psbposfun_t D::ms_aposf[2][3] = 
{
    {
        &B::fa1,
        &B::fa2,
        &B::fa3
    },
    {
        &B::fb1,
        &B::fb2,
        &B::fb3
    }
};
编译器抱怨fa1。。。fb3方法受到保护。 事实上,它们在B中受到保护,但我正在初始化一个属于D的成员,它来自B

我尝试在类(D)中初始化ms_aposf,但编译器抱怨它不是初始化它的地方


因此,除了在构造函数中实现一次性初始化外,还有人知道如何避免这个问题吗?

使用
D::

D::psbposfun_t D::ms_aposf[2][3] = 
{
    {
        &D::fa1,
        &D::fa2,
        &D::fa3
    },
    {
        &D::fb1,
        &D::fb2,
        &D::fb3
    }
};

由于
D
继承了这些函数,因此可以通过
D
访问它们,但可以作为
B::
指针使用。

为什么有指向成员方法的指针?有更优雅、更安全的方法来达到预期的效果。你有点破坏了我的观点是的!为什么你首先使用C++?(新加坡国家公园)。。。该示例使用VS2013编译,但当然成员函数必须是const。您使用哪种编译器?是的,将函数公开可以满足gcc的要求。这看起来并不正确,尽管它相当深奥。上帝!这么简单,我应该删除我的问题@迈特巴特:我觉得这是个有趣的问题。受保护访问的工作方式并不一定显而易见。它不像“只有这个类或派生类可以访问它”那么简单。这更像是“为了访问,允许将基类成员视为私有派生类成员”。