2010-05-14 23 views
15

Vì vậy, tôi đi qua một chữ ký phương pháp thú vị mà tôi không hoàn toàn hiểu, nó đã đi dọc theo dòng:C++, lớp như tham số để một phương pháp, không template

void Initialize(std::vector<std::string> & param1, class SomeClassName * p); 

những gì tôi làm không hiểu là từ khóa "class" được sử dụng làm tham số, tại sao nó lại ở đó? Nó có cần thiết để xác định hoặc nó hoàn toàn hời hợt?

+0

tôi thấy điều này cũng trong một thành viên lớp tuyên bố và tôi đã phát điên cố gắng tìm hiểu ý nghĩa của nó. 'lớp Foo { riêng tư: lớp Bar * pointerToBar; } ' – Vicro

Trả lời

16

Đây là tuyên bố chuyển tiếp của lớp học. Nó có hiệu quả giống như

class SomeClassName; 
void Initialize(std::vector<std::string> & param1, SomeClassName * p); 

Có nhiều tình huống trong đó tuyên bố chuyển tiếp hữu ích; có một danh sách toàn bộ những thứ mà bạn có thể và không thể làm với tờ khai chuyển tiếp trong số this answer to another question).

+0

hiện hành động như khai báo chuyển tiếp? – ra170

+0

@ ra170: Vâng, đúng vậy. –

+1

"nhưng bạn cần phải sử dụng một con trỏ hoặc tham chiếu đến một thể hiện của lớp" -> Nếu bạn chỉ có một khai báo hàm không định nghĩa như trong trường hợp này, bạn có thể tốt với các tham số giá trị. –

1

Nó không hời hợt. Nó cho phép bạn chỉ định "SomeClassName" làm tham số ngay cả khi "SomeClassName" chưa được xác định.

+0

hiện hành động như khai báo chuyển tiếp? – ra170

1

Bề ngoài hời hợt nhất. Trong C, khi bạn xác định cấu trúc:

struct x { 
    int member; 
    char member2; 
}; 

Để sử dụng, bạn phải sử dụng struct x whatever. Nếu bạn muốn sử dụng x như một tên tự (không có struct trước đó), bạn phải sử dụng một typedef:

typedef struct x { 
    int member; 
    char member2; 
} x; 

Trong C++, tuy nhiên, người đầu tiên (không có typedef) có khoảng tác dụng tương tự như thứ hai (cả hai đều định nghĩa x để bạn có thể tự sử dụng nó mà không cần struct trước đó). Trong C++, class về cơ bản giống như struct, ngoại trừ mặc định là private thay vì public (cho cả thành viên và thừa kế).

Nơi duy nhất có sự khác biệt là nếu không có định nghĩa về phạm vi class ở điểm khai báo chức năng.

0

nó giống như bạn viết:

for(int i=0;i<10;i++) 

như

int i; 
for(i=0;i<10;i++) 

khai báo lớp là một định nghĩa và một con trỏ đến nó

+0

phạm vi của biến i khác nhau. – iOS

+0

Không trả lời câu hỏi gốc. – prapin

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