2012-02-21 31 views
6

Intenté tener una variable de miembro estática const para relacionarme con otra variable constante estática en una clase. La motivación es que si necesito modificar un valor más adelante (al codificar), no necesito cambiar todos los que están relacionados entre sí uno por uno.¿Cómo declarar una variable miembro constante estática de una clase que implica algunos cálculos simples?

Por ejemplo:

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

No va a compilar y el error fue '' Box :: altura 'no puede aparecer en una expresión-constante'. Así que supongo que debe escribir el valor de un miembro static const. ¿Pero hay una forma de que un miembro se relacione con otra variable miembro de la misma clase, dado que todos serán const estáticos?

+0

Mira [este enlace] (http://www2.research.att.com/~bs/C++0xFAQ.html#member-init) –

Respuesta

16

Establecer el valor de sus variables miembro static const fuera de la declaración de la clase, utilizando la siguiente sintaxis.

// box.h 
#pragma once 

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

const float box::x = 1.0f; 
+0

Gracias! ¡No pensé en hacerlo de esta manera! – tuzzer

+3

esto es una locura! ¿Por qué el lenguaje impediría que las variables estáticas estáticas se inicialicen en la clase? y doe x no tiene primicia global? –

+1

No puedo arrojar las variables fuera de la declaración de clase Y dentro de su archivo de encabezado. Si el encabezado se incluye en más de un archivo de implementación (obj), se crean símbolos duplicados. Necesito incluirlos solo en el archivo de implementación cpp de la clase para que funcione sin duplicados. – bazz

10

En C++ 11 se puede utilizar constexpr:

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

De lo contrario, podría utilizar una función en línea (pero es necesario utilizar llamarlo como box::lid_height()), que un buen optimizador debe ser capaz de reducirlo a una constante en el uso:

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

¡Gracias! Este sería un buen trabajo, pero creo que es un poco incómodo tener que llamar a una función. – tuzzer

0

Trate de hacer esto:

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

Esto funcionará Creo que el problema es con números flotantes (dobles). Mi compilador dio el siguiente mensaje de error cuando uso doble en vez de int:

error: ‘box::height’ cannot appear in a constant-expression

espero que mi mensaje le ayuda;)

-1

La excepción a la inicialización de un miembro de datos estáticos dentro de la declaración de la clase es si el miembro de datos estático es un const de integral o enumeración tipo

#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

un ejemplo más

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; 
Cuestiones relacionadas