2012-02-21 29 views
6

Tôi cố gắng có một biến thành viên const tĩnh để liên quan đến một biến const tĩnh khác trong một lớp. Động lực là nếu tôi cần sửa đổi một giá trị sau (khi mã hóa), tôi không cần phải thay đổi tất cả những giá trị có liên quan với nhau.Làm thế nào để khai báo một biến thành viên cố định tĩnh của một lớp liên quan đến một số phép tính đơn giản?

Ví dụ:

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

Nó sẽ không biên dịch và lỗi là '' Box :: chiều cao 'không thể xuất hiện trong một hằng số thể hiện'. Vì vậy, tôi đoán bạn phải nhập vào giá trị của một thành viên const tĩnh. Nhưng có cách nào để có một thành viên liên quan đến biến thành viên khác của cùng một lớp, cho rằng tất cả họ sẽ là const tĩnh?

+0

Kiểm tra [liên kết này] (http://www2.research.att.com/~bs/C++0xFAQ.html#member-init) –

Trả lời

16

Đặt giá trị của biến thành viên const tĩnh của khai báo lớp, sử dụng cú pháp sau.

// box.h 
#pragma once 

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

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

Xin cảm ơn! Tôi không nghĩ làm theo cách này! – tuzzer

+3

điều này thật điên rồ! tại sao ngôn ngữ sẽ ngăn chặn biến đổi const tĩnh được khởi tạo trong lớp? và doe x không có scoop toàn cầu? –

+1

Tôi không thể ném các biến bên ngoài khai báo lớp và bên trong tệp tiêu đề của nó. Nếu tiêu đề được bao gồm trong nhiều tệp triển khai (obj), các biểu tượng trùng lặp sẽ được tạo. Tôi cần phải ném chúng vào tệp thực thi cpp của lớp để làm cho nó hoạt động mà không có bản sao. – bazz

10

Trong C++ 11 bạn có thể sử dụng constexpr:

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

Nếu không, bạn có thể sử dụng một hàm nội tuyến (nhưng bạn cần phải sử dụng gọi nó như box::lid_height()), trong đó tối ưu hóa tốt nên có thể làm giảm nó liên tục được sử dụng:

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

Cảm ơn! Đây sẽ là một công việc tốt đẹp xung quanh nhưng tôi nghĩ rằng đó là một chút bất tiện khi phải gọi một chức năng. – tuzzer

0

Hãy thử điều này:

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

này sẽ làm việc tôi nghĩ rằng vấn đề là với phao số (double). trình biên dịch của tôi đã đưa ra thông báo lỗi sau khi tôi sử dụng đôi thay vì int:

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

Tôi hy vọng bài viết của tôi sẽ giúp bạn;)

-1

Các ngoại lệ đối với khởi tạo của một thành viên dữ liệu tĩnh bên trong khai báo lớp là nếu các thành viên dữ liệu tĩnh là một const của thiếu hoặc liệt kê loại

#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

thêm một ví dụ

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; 
Các vấn đề liên quan