2010-09-16 31 views
9

Có thể khai báo một chuỗi ở tất cả trong một tệp tiêu đề (.h), trong định nghĩa của một Lớp không?Tôi có thể khai báo một chuỗi trong một tệp tiêu đề theo định nghĩa của một lớp không?

Khi tôi muốn thiết lập mặc định int, tôi làm:

class MyClass 
{ 
    static const unsigned int kDATA_IMAGE_WIDTH = 1024; 

Có cách nào để làm tương tự cho các đối tượng string?

class MyClass 
{ 
     static const string kDEFAULT_FILE_EXTENSION = "png"; // fail 

Tôi biết tôi có thể sử dụng #define ...

#define kDEFAULT_FILE_EXTENSION "png" 

nhờ

chỉnh sửa: thêm rằng nó là trong một định nghĩa lớp. các ví dụ được cập nhật.

+0

trình biên dịch gì bạn đang sử dụng và lỗi là gì? Nó ổn với tôi. – vanza

+0

Lỗi Xcode (gcc là nó?) Là: 'lỗi: khởi tạo trong lớp không hợp lệ của thành viên dữ liệu tĩnh của loại không tách rời 'const std :: string'' – Ross

+0

Bạn có chắc là bạn đang ở trong không gian tên đúng. Hãy thử std :: string. Bạn đang làm điều này bên trong một lớp học? –

Trả lời

11

Từ thông báo lỗi bạn đã cung cấp (tôi nhấn mạnh):

error: invalid in-class initialization of static data member of non-integral type 'const std::string'

Bạn có thể làm điều này trong một tập tin tiêu đề, nhưng bạn không thể làm như vậy trong một lớp học.

Đó là:

class MyClass 
{ 
    static const std::string invalid = "something"; 
}; 

là không hợp lệ, nhưng

static const std::string valid = "something else"; 

là hợp lệ.

Nếu bạn muốn tĩnh trở thành một thành viên của lớp duy nhất, bạn làm như sau:

//Header 
class MyClass 
{ 
    static const std::string valid; 
}; 


//Implementation (.cpp) file 

const std::string MyClass::valid = "something else again"; 

Chỉ const tĩnh không thể thiếu biến lớp học có thể được khởi tạo bằng cách sử dụng "= liên tục" cú pháp.

+0

Xin lỗi, nó nằm trong một định nghĩa lớp. Tôi đã cập nhật câu hỏi của mình. Cảm ơn – Ross

+0

@Ross: Vậy thì câu trả lời của tôi không thay đổi. ;) Các codebox cuối cùng cho bạn biết làm thế nào để làm điều này một cách chính xác. –

+0

Tôi phải xóa từ khóa 'static' khỏi tệp triển khai (.cpp). –

1

có, nhưng các chuỗi không phải là nội tại đối với C++. bạn cần đúng #include

#include <string> 

static const std::string kDEFAULT_FILE_EXTENSION = "png"; 

Lưu ý phụ. Tôi chưa bao giờ thấy mã C++ sử dụng tiền tố k để biểu thị một hằng số. Tôi nghĩ đó là một quy ước Objective-C. Ngoài ra, các biểu tượng ALL_CAPS thực sự nên được dành riêng cho các macro #define, không phải là hằng số ngôn ngữ.

+0

hmmm, cảm ơn, nhưng không làm việc cho tôi? ...: 'lỗi: khởi tạo trong lớp không hợp lệ của thành viên dữ liệu tĩnh của loại không tách rời 'const std :: string'' – Ross

+1

Tôi không nhận ra bạn đang cố gắng làm điều này bên trong một lớp học. – Ferruccio

+0

Ứng dụng ... sự thiếu kinh nghiệm của tôi, tôi nên đề cập đến nó. – Ross

0

Có, bạn sẽ có thể khai báo chuỗi hoặc đặt bất kỳ loại mã nào khác trong tệp tiêu đề của mình. Nó có thể không thành công vì tệp tiêu đề thiếu #include định nghĩa chuỗi hoặc bạn cần đặt "std ::" trước mặt nếu bạn không "sử dụng không gian tên std" trong tệp tiêu đề.

Vui lòng cập nhật câu hỏi của bạn với lỗi trình biên dịch cụ thể mà bạn thấy nếu những đề xuất này không khắc phục được. Hy vọng rằng điều này sẽ giúp.

0

Tôi không có bối cảnh ở đây, nhưng nếu mục đích là để xác định một mảng bất biến của các nhân vật được kết thúc bằng '\ 0', tại sao không sử dụng:

const char tĩnh kDEFAULT_FILE_EXTENSION [] = "png ";

Ngoài ra, lưu ý rằng không có chuyển đổi trong suốt giữa lớp string và const char * mà không gọi chuỗi :: c_str() ..

0

Hai lựa chọn:

Xác định một chức năng trong tiêu đề đó là tĩnh và trả về chuỗi bạn muốn.

static std::string kDEFAULT_FILE_EXTENSION() 
    { 
     return "png"; 
    } 

Một vĩ mô sẽ làm điều đúng ở đây

#define STATIC_STRING_IN_HEADER(name,value) static std::string name(){return value;} 
STATIC_STRING_IN_HEADER(kDEFAULT_FILE_EXTENSION,"png") 
Các vấn đề liên quan