Как объявить статическую константу-переменную-член класса, которая включает в себя несколько простых вычислений? - PullRequest
10 голосов
/ 21 февраля 2012

Я попытался создать одну статическую переменную-член const, которая будет связана с другой статической переменной const в классе. Мотивация заключается в том, что если мне нужно изменить одно значение позже (при кодировании), мне не нужно менять все те, которые связаны друг с другом, по одному.

Например:

class Box
{
    public:
        Box();
    private:
        static const double height = 10.0;
        static const double lid_height = 0.5 + height;
};

Он не скомпилируется, и ошибка «Box :: height» не может появиться в константном выражении ». Поэтому я думаю, что вы должны ввести значение статического константного члена. Но есть ли способ, чтобы один член имел отношение к другой переменной-члену того же класса, учитывая, что все они будут статическими константами?

Ответы [ 5 ]

19 голосов
/ 21 февраля 2012

Установите значение ваших статических константных переменных-членов вне объявления класса, используя следующий синтаксис.

// box.h
#pragma once

class box
{
public:
static const float x;   
};

const float box::x = 1.0f;
10 голосов
/ 21 февраля 2012

В C ++ 11 вы можете использовать constexpr:

class box
{
    public:
        box();
    private:
        static constexpr double height = 10.0;
        static constexpr double lid_height = 0.5 + height;
};

В противном случае, вы можете использовать встроенную функцию (но вам нужно использовать ее как box::lid_height()), что хороший оптимизатор должен иметь возможность уменьшить ее до постоянной при использовании:

class box
{
    public:
        box();
    private:
        static const double height = 10.0;
        static double lid_height() { return 0.5 + height; }
};
0 голосов
/ 09 ноября 2017

Еще один пример

foo.h

class foo {
    static const string s; // Can never be initialized here.
    static const char* cs; // Same with C strings.

    static const int i = 3; // Integral types can be initialized here (*)...
    static const int j; //     ... OR in cpp.
};
foo.cpp

#include "foo.h"
const string foo::s = "foo string";
const char* foo::cs = "foo C string";
const int foo::j = 4;
0 голосов
/ 09 ноября 2017

Исключением для инициализации статического члена данных внутри объявления класса является случай, если статический член данных является константой целочисленного или перечислимого типа

#include <iostream>

class Car
{
    enum Color {silver = 0, maroon, red };  
    int year;
    int mileage = 34289;                   // error: not-static data members
                                           // only static const integral data members 
                                           // can be initialized within a class

    static int vin = 12345678;             // error: non-constant data member
                                           // only static const integral data members 
                                           // can be initialized within a class

    static const string model = "Sonata";  // error: not-integral type
                                           // cannot have in-class initializer

    static const int engine = 6;           // allowed: static const integral type
};

int Car::year = 2013;                          // error: non-static data members 
                                               // cannot be defined out-of-class

int main()
{
    return 0;
}
0 голосов
/ 21 февраля 2012

Попробуйте это:

private:
    static const int height = 100;
    static const int lid_height = 05 + height;

Это сработает. Я думаю, проблема в числах с плавающей запятой (двойных).Мой компилятор выдал следующее сообщение об ошибке, когда я использую double вместо int:

error: 'box :: height' не может появиться в константном выражении

Я надеюсьмой пост вам поможет;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...