Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> extern - свойство-член класса 
V
    Опции темы
boostcoder
Дата 17.2.2011, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



всем привет.
есть класс:
Код

struct type {
   struct pimpl;
   boost::shared_ptr<pimpl> _pimpl;

   void method() {
      extern pimpl::_mutex;
      boost::mutex::scoped_lock locker(_mutex); // <<<<<<<<<<<<<<
   }
};

struct type::pimpl {
   boost::mutex _mutex;
};


компилятор говорит:
Цитата

‘_mutex’ in class ‘type::pimpl’ does not name a type

что не правильно делаю?

спасибо smile 
PM WWW   Вверх
Abyx
Дата 17.2.2011, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 1
Всего: 10



разве так можно делать?
extern вроде бы применим только к глобальным переменным (и функциям)
PM MAIL   Вверх
volatile
Дата 17.2.2011, 02:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



boostcoder,  extern говорит что где-то есть такая переменная, описанная в другом месте.
пишется примерно так:
extern тип имя;

У вас непонятно что вы хотели.
extern pimpl::_mutex;  <-- это что? Опишите словами, что вы хотели.



PM MAIL   Вверх
boostcoder
Дата 17.2.2011, 02:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(Abyx @  17.2.2011,  01:58 Найти цитируемый пост)
разве так можно делать?

ну хз. впервые пытаюсь такое проделать smile 

Цитата(volatile @  17.2.2011,  02:17 Найти цитируемый пост)
пишется примерно так:
extern тип имя;

так тоже пробовал. другую ошибку получаю. сейчас ее показать не могу. по причине рефака код не компилится пока по другой причине.

Цитата(volatile @  17.2.2011,  02:17 Найти цитируемый пост)
extern pimpl::_mutex;  <-- это что?

это переменная типа boost::mutex, объявленная в type:: pimpl
PM WWW   Вверх
volatile
Дата 17.2.2011, 02:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Честно говоря, я так и не понял что вы хотели...
Но вот так откомпилится:
Код

struct type {
    struct pimpl {
        boost::mutex _mutex;
    };
    boost::shared_ptr<pimpl> _pimpl;

    void method() {
        extern pimpl some_name;
        boost::mutex::scoped_lock locker(some_name._mutex); // <<<<<<<<<<<<<<
    }
};

И где-то должна быть глобальная переменная some_name.
Если вы это хотели... smile

Добавлено через 11 минут и 22 секунды
Ну а если вы хотели чтобы член класса был экстерн, то члены класса не могут быть экстерн.
Они должны быть описаны в классе, иначе никак.

PM MAIL   Вверх
azesmcar
Дата 17.2.2011, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



boostcoder

Нет, так нельзя. Надо просто описать метод в заголовочном файле, а тело перенести в файл реализации, туда же перенести реализацию структуры type::pimpl, но в таком случае хранить в заголовочном файле можно только указатель на type::pimpl (вообще-то правильнее не pimpl а impl, так-как это реализация а не указатель).

PM   Вверх
boostcoder
Дата 17.2.2011, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(azesmcar @  17.2.2011,  07:53 Найти цитируемый пост)
Надо просто описать метод в заголовочном файле, а тело перенести в файл реализации, туда же перенести реализацию структуры type::pimpl

метод - шаблонный.
потому я и описал саму структуру pimpl после использования ее членов, чтоб была понятна проблема. думал, что extern заставит компилятор искать _mutex позже, чем компилирование метода metod().

Цитата(azesmcar @  17.2.2011,  07:53 Найти цитируемый пост)
вообще-то правильнее не pimpl а impl, так-как это реализация а не указатель

вообще-то, pimpl, потому что это private-implementation.

PM WWW   Вверх
Abyx
Дата 17.2.2011, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 1
Всего: 10



boostcoder, вообще-то "p" в "pimpl" - это "pointer". (т.е. у *всех* "pointer", а у вас что-то другое)

Это сообщение отредактировал(а) Abyx - 17.2.2011, 15:22
PM MAIL   Вверх
mes
Дата 17.2.2011, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



boostcoder, по моему то, что Вы ищете, получается путем добавления двух функций (lock() и lock_free()) в pimpl.. 




--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 17.2.2011, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(Abyx @  17.2.2011,  15:21 Найти цитируемый пост)
у *всех* "pointer", а у вас что-то другое

а кто мне запретит? smile 

Цитата(mes @  17.2.2011,  16:20 Найти цитируемый пост)
получается путем добавления двух функций (lock() и lock_free()) в pimpl.. 

так и сделал smile 
PM WWW   Вверх
Abyx
Дата 18.2.2011, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 1
Всего: 10



Цитата(boostcoder @  17.2.2011,  23:17 Найти цитируемый пост)
а кто мне запретит?

просто другие разработчики не сходу понимают что вы хотели сказать своим кодом
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0517 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.