2010-09-06 58 views
11

Đây là tiêu đề của tôi:bao gồm typedef bên trong một tiêu đề lớp

#ifndef TIMING_H 
#define TIMING_H 

#define MAX_MESSAGES 1000 
typedef Message* MessageP; //inside the class? 

class Timing { 

public: 

Timing(); 

private: 

struct Message { 
    Agent *_agent; 
    double _val; 
}; 

MessageP* _msgArr; 
int _waitingMsgs; 


}; 

Câu hỏi của tôi là: Tôi phải đặt typedef bên trong khối lớp ngay trên MessageP * _msgArr hoặc là nó OK để đặt nó gần tất cả #define?

Nó không xuất ra lỗi biên dịch vì vậy tôi không chắc chắn về nó.

Trả lời

13

Bên ngoài của lớp, kiểu đó phải được gọi là Timing::Message, vì vậy

typedef Timing::Message* MessageP; 

Nhưng điều này có thể chỉ sau khi tuyên bố Timing::Message, nhưng MessageP được sử dụng trước khi tuyên bố Timing hoàn tất, vì vậy nó không thể.

Hơn nữa, cấu trúc là thành viên private:, vì vậy bạn không thể xác định điều này bên ngoài. Các typedef phải được thực hiện bên trong lớp Timing.

class Timing { 

public: 

Timing(); 

private: 

struct Message { 
    Agent *_agent; 
    double _val; 
}; 

typedef Message* MessageP; // <-- 


MessageP* _msgArr; 
int _waitingMsgs; 


}; 

Bạn không nhận được lỗi biên dịch có thể do một loại phạm vi toàn cầu khác đã tồn tại.

+2

Người ta có thể sử dụng tờ khai chuyển tiếp để không phải nằm trong lớp học. – bobbymcr

+1

@Bobby: Vì nó không phụ thuộc vào 'Thời gian', nó có thể không được lồng và xác định trước nó. Không có cách nào để chuyển tiếp khai báo nó trong phạm vi toàn cục mà không cần làm tổ. – Potatoswatter

+0

Ồ, tôi đã bỏ lỡ phần đó ... vì vậy, tôi đồng ý với bạn. – bobbymcr

4

Đặt typedef vào vị trí phù hợp.

Đặt nó ở trên cùng có nghĩa là bạn chèn bí danh vào phạm vi không gian tên chung. Đặt nó vào trong lớp có thể có nghĩa là chỉ có thể xem trên thế giới hoặc có thể xem được đối với thành viên (và/hoặc lớp con của nó) tùy thuộc vào thông số truy cập gần nhất (hoặc private nếu không có).

Nếu khách hàng của lớp học không cần phải biết về bí danh này, hãy đánh dấu là riêng tư.

Nếu bạn đặt bên trong lớp: Tuy nhiên, lưu ý rằng bên ngoài lớp học, bạn sẽ cần phải đủ điều kiện tên là Timing::MessageP hoặc người khác cần một chỉ thị using Timing::MessageP trong phạm vi. Ngoài ra, trình độ đầy đủ có thể được thực hiện chỉ khi lớp đã được xác định (bạn không thể tạo bí danh cho các loại không đầy đủ - chuyển tiếp tuyên bố Timing do đó sẽ không hoạt động).

class Timing { 
    public: 
    Timing() {} 
    private: 

struct Message { 
    Agent *_agent; 
    double _val; 
}; 

MessageP* _msgArr; 
int _waitingMsgs; 

}; 

typedef Timing::Message* MessageP; // okay 
1

Bạn có thể bỏ qua ở trên cùng. Tuy nhiên, nó không phải là một thực hành tốt để đặt nó trong phạm vi toàn cầu như những người khác đã đề cập.

Các vấn đề liên quan