2010-06-20 2 views
5

Có thể sử dụng dễ bay hơi cho các đối tượng lớp không? Giống như:Xác định đối tượng lớp dễ bay hơi

volatile Myclass className; 

Vấn đề là nó không biên dịch, ở khắp mọi nơi khi một số phương pháp được gọi, các lỗi nói: lỗi C2662: 'chức năng': không thể chuyển đổi 'này' con trỏ từ 'MyClass dễ bay hơi 'to' MyCLass & '

Sự cố ở đây là gì và cách giải quyết vấn đề?

EDIT:

class Queue { 
      private: 
       struct Data *data; 
       int amount; 
       int size; 
      public: 
       Queue(); 
       ~Queue(); 
       bool volatile push(struct Data element); 
       bool volatile pop(struct Data *element); 
       void volatile cleanUp(); 
      }; 
    ..... 
    volatile Queue dataIn; 

     ..... 

    EnterCriticalSection(&CriticalSection); 
    dataIn.push(element); 
    LeaveCriticalSection(&CriticalSection); 
+0

Lưu ý rằng trong C++, 'volatile' không đảm bảo an toàn luồng. Đó là khác nhau, ví dụ, NET, nơi nó. – sbi

Trả lời

12

Vâng, bạn có thể, nhưng sau đó bạn chỉ có thể gọi hàm thành viên được tuyên bố volatile (giống như từ khóa const). Ví dụ:

struct foo { 
    void a() volatile; 
    void b(); 
}; 

volatile foo f; 
f.a(); // ok 
f.b(); // not ok 

Chỉnh sửa dựa trên mã của bạn:

bool volatile push(struct Data element); 

tuyên bố một phi - chức năng volatile thành viên đó trả về một bool volatile (= volatile bool). Bạn muốn

bool push(struct Data element) volatile; 
+2

Còn về các hàm tạo và hàm hủy và biến (thuộc tính) được khai báo trong lớp thì sao? – maximus

+0

Tôi đã làm như bạn đã nói, nhưng dù sao các thông báo lỗi tương tự .. – maximus

+2

@maximus, constructors và destructors không thể bị quá tải với 'volatile' (hoặc' const'), và các biến thành viên kế thừa các thuộc tính này từ cá thể lớp. Về thông báo lỗi của bạn, vui lòng đăng mã chính xác mà bạn đang sử dụng. –

7

tôi nghĩ anh ấy có nghĩa là để nói

  bool push(struct Data element) volatile; 

thay vì

  bool volatile push(struct Data element); 

Cũng có một cái nhìn ở đây http://www.devx.com/tips/Tip/13671

+0

Cảm ơn bạn rất nhiều! Nó hoạt động! – maximus

2

Trong C++ ngữ pháp, "không ổn định" và " const "được gọi là" công cụ sửa đổi CV ". Điều đó có nghĩa là "dễ bay hơi" hoạt động chính xác giống như "const" từ quan điểm cú pháp. Bạn có thể thay thế tất cả "biến động" bằng "const" sau đó bạn có thể hiểu tại sao mã của bạn biên dịch lại hay không.

0

Đúng. Chúng ta có thể sử dụng. Vui lòng xem mã đã sửa đổi. Tôi hy vọng nó sẽ hoạt động ngay bây giờ.

class Queue { 
      private: 
       struct Data *data; 
       int amount; 
       int size; 
      public: 
       Queue(); 
       ~Queue(); 
       bool push(struct Data element) volatile; 
       bool pop(struct Data *element) volatile; 
       void cleanUp() volatile; 
      }; 
..... 
volatile Queue dataIn; 

    ..... 

EnterCriticalSection(&CriticalSection); 
dataIn.push(element); 
LeaveCriticalSection(&CriticalSection);