2010-03-23 66 views
6

Tôi muốn tạo một lớp C++ với các loại sau:C++ Biến có thể khai báo trong phần thân hàm, nhưng không phải là thành viên của lớp?

  1. Nó có thể được khai báo bên trong một hàm.
  2. Nó có thể được khai báo bên trong một hàm thành viên.
  3. Không thể khai báo thành viên của lớp học.

Việc sử dụng điều này: suy nghĩ các đối tượng "Gốc" cho GC.

Điều này có thể thực hiện được trong C++ không? Đặc biệt, tôi đang sử dụng g ++. Sẵn sàng chuyển sang tiếng kêu. Hoặc là mẫu hoặc giải pháp macro tốt.

Cảm ơn!

Trả lời

16

Bạn có thể làm điều đó với một vĩ mô, có lẽ:

#define MY_TYPE \ 
    do { } while(0); \ 
    RealType 

void foo() { 
    MY_TYPE myvar; 
    myvar.Whatever(); 
} 

này sẽ chỉ biên dịch bên trong một hàm (vì sự "do ... while" chút - dù bạn muốn nhận được một lỗi thực sự lạ thông điệp). Nó có vẻ giống như một trong những "ác" sử dụng các macro mà bạn muốn tránh, tuy nhiên ...

+5

Khá sáng tạo. :) – GManNickG

+0

Điều gì sẽ xảy ra nếu bạn thử 'const MY_TYPE myvar'? – Will

+4

Bạn luôn có thể làm 'MY_TYPE const myvar';) –

0

Mặc dù tôi phải yêu câu trả lời của codeka, tôi không thể tưởng tượng được vấn đề là gì với tuyên bố là thuộc tính thành viên.

Đối với một cái gì đó giống như gốc của GC, tôi có thể sử dụng mẫu Monoid. Tất cả các cá thể của lớp đều là proxy thực tế cho một số Singleton (về bản chất), tức là tất cả chúng đều có cùng trạng thái. Bằng cách này nó không quan trọng bao nhiêu được instantiated, tất cả họ đều trỏ đến cùng một tài nguyên.

Nếu bạn làm như vậy để tránh các tham chiếu tuần hoàn, tôi e rằng nó không đủ gần.

struct A { boost::shared_ptr<B> mB; }; 

struct B { boost::shared_ptr<A> mA; }; 
+0

Hãy tưởng tượng bạn đang viết một thông dịch viên chương trình. Một phần chức năng được viết bằng C. Giờ đây, GC có thể xảy ra bất cứ lúc nào. Tuy nhiên, khi GC chạy, chúng tôi muốn đảm bảo rằng các tham chiếu đến các sơ đồ boject trên ngăn xếp _C_ được coi là các đối tượng gốc. – anon

+0

Vì vậy, bạn đang thực hiện GC của bạn như một loại 'Mark And Sweep' phải không? Thông thường, loại này dùng stack như root ... nhưng tôi không thích 'freeze the world' mà nó gây ra, mặc dù tất nhiên được sử dụng để làm việc trên các máy chủ phải trả lời trong vòng chưa đầy 200ms, tôi thiên vị đó. –

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