Частная статическая переменная-член Constexpr недоступна в Main?

#c #class #static #constants #private

Вопрос:

В моем классе среды у меня есть частная статическая переменная-член:

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

    void create_new(const Part amp;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);
    }
}
 

Итак, мой вопрос в том, что не так и как мне создать статическую переменную const, к которой я могу получить доступ за пределами класса среды?

Комментарии:

1. Сделай это public . Если вы хотите, чтобы он был доступен только для целей предоставления конструктору значения по умолчанию, напишите конструктор, который принимает один double аргумент в качестве аргумента, а затем использует default_background_color для делегирования конструктору с двумя аргументами.

2. Я не вижу статической переменной

Ответ №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
    ...
}
 

Онлайн-демонстрация

  • объявить 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
    ...
}
 

Онлайн-демонстрация