2012-02-21 6 views
6

Ho provato ad avere una variabile membro const const per relazionarsi con un'altra variabile const stat in una classe. La motivazione è che se ho bisogno di modificare un valore in un secondo momento (durante la codifica), non ho bisogno di cambiare tutti quelli che sono collegati uno per uno.Come dichiarare una variabile membro costante statica di una classe che comporta alcuni semplici calcoli?

Ad esempio:

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

non si compila e l'errore è stato '' Box :: height 'non può apparire in una costante espressione'. Quindi suppongo che tu debba digitare il valore di un membro const statico. Ma c'è un modo per avere un membro in relazione con un'altra variabile membro della stessa classe, dato che saranno tutti costanti statici ??

+0

Check out [questo link] (http://www2.research.att.com/~bs/C++0xFAQ.html#member-init) –

risposta

16

Impostare il valore delle vostre variabili membro static const al di fuori della dichiarazione di classe, utilizzando la seguente sintassi.

// box.h 
#pragma once 

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

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

Grazie! Non pensavo di farlo in questo modo! – tuzzer

+3

questo è folle! perché il linguaggio dovrebbe impedire l'inizializzazione di const variabili statiche nella classe? e doe x non hanno scoop globale? –

+1

Non riesco a lanciare le variabili al di fuori della dichiarazione di classe E all'interno del suo file di intestazione. Se l'intestazione è inclusa in più di un file di implementazione (obj), vengono creati simboli duplicati. Ho bisogno di buttarli solo nel file di implementazione cpp della classe per farlo funzionare senza duplicati. – bazz

10

In C++ 11 si potrebbe utilizzare constexpr:

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

In caso contrario, è possibile utilizzare una funzione inline (ma è necessario utilizzare chiamare come box::lid_height()), che un buon ottimizzatore dovrebbe essere in grado di ridurlo ad un costante utilizzo:

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

Grazie! Questo sarebbe un bel lavoro, ma penso che sia un po 'scomodo dover chiamare una funzione. – tuzzer

0

Prova questo fuori:

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

Ciò funzionerà Credo che il problema è con i numeri float (doppio). Il mio compilatore ha dato il seguente messaggio di errore quando uso doppia invece di int:

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

Spero che il mio post che aiuta;)

-1

L'eccezione alla inizializzazione di un membro di dati statici all'interno della dichiarazione della classe è se il membro dati statico è un const di integrale o censimento 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 altro esempio

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; 
Problemi correlati