【问题标题】:Private Static Constexpr Member Variable is Inaccessible in Main?私有静态 Consexpr 成员变量在 Main 中不可访问?
【发布时间】:2021-09-30 04:04:13
【问题描述】:

在我的环境类中,我有一个私有静态成员变量:

class Environment {
public:
    Environment(double air_density, Color background_color);

    void create_new(const Part &object);

    double get_air_density() const noexcept;
    void set_air_density() noexcept;

    Color get_background_color() const noexcept;
    void set_background_color() noexcept;

    std::vector<Part> get_objects() const noexcept;
    void set_objects() noexcept;

private:
    std::vector<Part> objects;
    Color background_color;
    
    //ERROR:
    static constexpr Color default_background_color = Color({ 210, 210, 210 });
};

主要是我试图访问该变量:

int main() {
    Environment environment(0.1, Environment::default_background_color); // ERROR: 'member "Environment::default_background_color" is inaccessible' 

    Part part(10, 10, 50, 50, false, 0, true);
    environment.create_new(part);

    while (running) {
        part.update_position(0.1);

        background(141, 3, 255);
        part.draw();


        render(dc);
    }
}

所以我的问题是,出了什么问题,如何创建一个可以在 Environment 类之外访问的 const 静态变量?

【问题讨论】:

  • 让它public。如果您只希望它可访问以向构造函数提供默认值,请编写一个构造函数,将单个 double 作为其参数,然后使用 default_background_color 委托给两个参数的构造函数。
  • 我没有看到静态变量

标签: c++ class static constants private


【解决方案1】:

您的数据成员被声明为private(而不是static,顺便说一句),因此类外的任何代码都无法访问它。

如果您希望main() 访问该成员,则:

  • 将成员声明为public(和static):
class Environment {
public:
    Environment(double air_density, Color background_color);
    ...
    static constexpr Color default_background_color = Color({ 210, 210, 210 });
    ...
};
int main() {
    Environment environment(0.1, Environment::default_background_color); // OK
    ...
}

Online Demo

  • main() 声明为类的friend
class Environment {
public:
    Environment(double air_density, Color background_color);
    ...
private:
    ...
    static constexpr Color default_background_color = Color({ 210, 210, 210 });

    friend int main();
};
int main() {
    Environment environment(0.1, Environment::default_background_color); // OK
    ...
}

Online Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 2014-04-06
    • 2018-05-15
    相关资源
    最近更新 更多