【问题标题】:How can I initialize static const class member object referring to private fields?如何初始化引用私有字段的静态 const 类成员对象?
【发布时间】:2016-11-30 06:06:40
【问题描述】:

问题来了:一个名为Factory的类有几个签名相同的非静态成员函数,我们称它们为f1f2等等。我想将指向这些成员函数的指针放在std::vector 中,即static const,因为在运行时不需要更改。同样,出于优雅的原因,我不想公开f1 和其他人(总结如下fi),也不想公开vector,但这是次要的。

在类中初始化vector不会起作用,因为它是一个不完整的类型,而&Factory::fi 当时是未知的。在文件级别外部初始化它将不起作用,因为fi 是私有的,我无法与全局范围成为朋友。将其放入初始化函数并使其成为 friend 将不起作用,因为这需要重写 const

有效的是:

  • 删除 static const 限定符,代价是为每个实例制作此 vector 的不必要副本。

  • 编写一个static 成员函数,声明一个static 变量并返回它。我认为这会一样好,但它使我的程序在所有优化下运行速度慢了一倍。

当然,我希望看到没有后一个缺点的解决方案。请不要建议我从 switch 或类似的范式巨大变化中调用函数。

【问题讨论】:

    标签: c++11 static-members member-function-pointers access-specifier


    【解决方案1】:

    这就是你的想法吗?从问题陈述中看不太清楚。

    #include <vector>
    
    class Factory {
    private:
        void f1() {}
        void f2() {}
    public:
        typedef void (Factory::*PF)();
        static const std::vector<PF> v;
    };
    
    const std::vector<Factory::PF> Factory::v{&Factory::f1, &Factory::f2};
    
    
    int main()
    {
        Factory f;
        (f.*Factory::v[0])();
    }
    

    Demo

    【讨论】:

    • 这是我尝试过但没有奏效的方法之一(q 第二段中的第二种情况)。它说“错误:[签名...] Factory::f1() 在此上下文中是私有的”。好吧,它不在 your 示例中。我需要找出它与我当前的代码有何显着差异。
    • 很抱歉不清楚,虽然我看不到在哪里。您的代码正是我想到的场景。奇怪的是,这可以单独工作(并且确实是我首先尝试的方法之一),但在我的大型项目中会产生上述错误。
    • @TheVee 好吧,如果您需要进一步的帮助,请显示重现故障的 an MCVE。我无法帮助我看不到代码。
    • 天啊,我忘了在定义中叫它Factory::v。并且编译器对 那个 很满意,因为该类的 v 被简单地留下了一个空向量,但它认为我正在尝试定义一个名为 ::v 的新 const 来访问私有字段。非常感谢,您的代码(作为有效的证明)帮助我找到了我的这个愚蠢的错误!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    相关资源
    最近更新 更多