如何声明涉及一些简单计算的类的静态常量成员变量?

时间:2012-02-21 02:24:19

标签: c++ class static const

我试图让一个静态const成员变量与一个类中的另一个静态const变量相关联。 动机是如果我需要稍后修改一个值(编码时),我不需要逐个更改所有彼此相关的值。

例如:

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

它不会编译,错误是''Box :: height'不能出现在常量表达式中'。所以我猜你必须输入一个静态const成员的值。但是有没有办法让一个成员与同一个类的另一个成员变量相关,因为它们都是静态const?

5 个答案:

答案 0 :(得分:19)

使用以下语法将静态const成员变量的值设置在类声明之外。

// box.h
#pragma once

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

const float box::x = 1.0f;

答案 1 :(得分:10)

在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; }
};

答案 2 :(得分:0)

试试这个:

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

这将有效我认为问题在于浮点(双)数。当我使用double而不是int:

时,我的编译器给出了以下消息错误
  

错误:'box :: height'不能出现在常量表达式

我希望我的帖子可以帮助你;)

答案 3 :(得分:0)

又一个例子

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;

答案 4 :(得分:-1)

在类声明中初始化静态数据成员的例外是静态数据成员是整数或枚举类型的const

#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;
}