Создаю аналог статического класса в C++ при помощи namespace. Он выглядит приблизительно так (без разбиения на .h и .cpp):
namespace MyClass {
// public'и
...
namespace {
// private'ы
...
SomeType some_var = initial_value;
}
void setSomeVar ( SomeType new_value ) {
some_var = new_value;
}
}
Столкнулся с непонятным эффектом: когда я вызываю setSomeVar в какой-нибудь функции и т.о. присваиваю some_var какое-то новое значение, оно сохраняется в ней до тех пор, пока выполняется вызвавшая setSomeVar функция, сразу после выхода из неё значение меняется на initial_value или 0, если initial_value не задано (всё это наблюдается в отладчике QtCreator'а). Это происходит со всеми переменными внутри указанного namespace'а; то же самое, если вместо безымянного namespace'а использовать модификатор static, то же самое, если напрямую менять значение переменной. Многопоточности нет, поэтому асинхронное изменение исключено. На пробном проекте повторить ошибку не удалось.
В чём может быть ошибка? Возможно у инициализации переменных в namespace'ах есть какие-то особенности?
Примечание:
overloop, пересобирал - бестолку.
Интересует именно вариант с неймспейсами - без классов, приватных конструкторов и т.д.
Примечание:
Без имени (новый пользователь), не синглтон а как-бы статический класс.
Почему обязательно извращение? По-моему писать класс только и закрывать конструктор - не меньшее извращение.
Жаль, что нельзя, как в C#: static class - и вперёд.
Примечание:
*только со статик-членами
Примечание:
Igoor, пожалуй стоит читать вопрос внимательнее.
Antohabm, спасибо, всё получилось.
Для интересующихся сообщаю: ошибка заключалась в том, что для каждой переменной, объявленной в namespace'е объявленном в .h-файле при каждом #include'е этого файла создавался отдельный её экземпляр. Помогло объявление переменных extern'ами и инициализация их в .cpp-файле.
RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.
Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.
Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.