Определение изменчивого объекта класса

Можно ли использовать volatile для объектов класса? Нравиться:

volatile Myclass className;

Проблема в том, что он не компилируется, везде, где вызывается какой-либо метод, ошибка говорит: ошибка C2662: «функция»: невозможно преобразовать указатель «этот» из «изменчивого MyClass» в «MyCLass &»

В чем здесь проблема и как ее решить?

РЕДАКТИРОВАТЬ:

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);

person maximus    schedule 20.06.2010    source источник
comment
Обратите внимание, что в C++ volatile не гарантирует потокобезопасности. Это отличается, например, от .NET, где это так.   -  person sbi    schedule 20.06.2010


Ответы (4)


Да, вы можете, но тогда вы можете вызывать только те функции-члены, которые объявлены volatile (точно так же, как ключевое слово const). Например:

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

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

Редактировать на основе вашего кода:

bool volatile push(struct Data element);

объявляет не-volatile функцию-член, которая возвращает bool volatile (= volatile bool). Ты хочешь

bool push(struct Data element) volatile;
person Jesse Beder    schedule 20.06.2010
comment
Как насчет конструкторов и деструкторов и переменных (свойств), объявленных в классе? - person maximus; 20.06.2010
comment
@maximus, конструкторы и деструкторы не могут быть перегружены с помощью volatile (или const), а переменные-члены наследуют эти свойства от экземпляра класса. Что касается ваших сообщений об ошибках, пожалуйста, опубликуйте точный код, который вы используете. - person Jesse Beder; 20.06.2010
comment
Большое спасибо! Сейчас все нормально! - person maximus; 20.06.2010

Я думаю, он хотел сказать

            bool push(struct Data element) volatile;

вместо

            bool volatile push(struct Data element);

Также посмотрите здесь http://www.devx.com/tips/Tip/13671

person GadaaDhaariAvi    schedule 20.06.2010

В грамматике C++ "volatile" и "const" называются "модификаторами CV". Это означает, что "volatile" работает точно так же, как "const" с синтаксической точки зрения. Вы можете заменить все «volatile» на «const», тогда вы сможете понять, почему ваш код компилируется или нет.

person Windoze    schedule 07.08.2012

Ага. Мы можем использовать. Пожалуйста, смотрите измененный код. Я надеюсь, что это должно работать сейчас.

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);
person Kuppappa DH    schedule 28.12.2015