【问题标题】:Initialize static const member of a class, where the member is of a private type?初始化类的静态 const 成员,其中成员是私有类型?
【发布时间】:2017-04-04 03:02:31
【问题描述】:
// gamewindow.hpp

#include <SFML/Graphics.hpp>
#include <string>
#include <cstdint>

class GameWindow : public sf::RenderWindow
{
public:
    GameWindow(const uint32_t&, const uint32_t&, const std::string&);
    void toggleFullscreen();

    static const ResolutionSetting w640h480,
                                   w1600h900,
                                   w1920h1080,
                                   w2560h1440;
private:
    class ResolutionSetting
    {
    public:
        ResolutionSetting(const uint32_t& width, const uint32_t& height)
        : res(width, height) {}
    private:
        sf::Vector2u res;
    };

    std::string _title;
    uint32_t _width;
    uint32_t _height;
};

我正在尝试初始化GameWindow 类中的公共ResolutionSetting 对象,其中ResolutionSetting 类被定义为GameWindow 中的private 类。

我看过 this 帖子,其中详细说明了如何初始化 static const 类的成员,但这不包括从类范围外无法访问所述成员的类型定义的情况(例如当使用private 访问规则指定类型时)。

我该如何初始化这些对象?会:

const GameWindow::ResolutionSetting GameWindow::w640h480(640, 480);

const GameWindow::ResolutionSetting GameWindow::w640h480 = GameWindow::ResolutionSetting(640, 480);

够了吗? (假设我可以纠正ResolutionSetting 无法访问的任何可能问题)。

【问题讨论】:

    标签: c++ c++11 language-lawyer


    【解决方案1】:

    够了吗? (假设我可以更正 ResolutionSetting 无法访问的任何可能问题)。

    是的就足够了。 GameWindow::ResolutionSetting 可在静态成员的初始化表达式中访问。

    所以你可以将它们定义为:

    const GameWindow::ResolutionSetting GameWindow::w640h480(640, 480);
    const GameWindow::ResolutionSetting GameWindow::w1600h900{1600, 900};
    const GameWindow::ResolutionSetting GameWindow::w1920h1080 = GameWindow::ResolutionSetting(1920, 1080);
    

    来自标准,$12.2.3.2/2 Static data members [class.static.data]

    静态数据成员定义中的初始化表达式在其类的范围内([basic.scope.class])。

    Minimal sample

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-19
      • 1970-01-01
      • 2012-02-18
      • 2011-07-18
      • 1970-01-01
      相关资源
      最近更新 更多