Форум программистов, компьютерный форум CyberForum.ru

Статические члены - C++

Восстановить пароль Регистрация
 
Shandr_71
13 / 13 / 1
Регистрация: 05.12.2011
Сообщений: 84
21.02.2012, 13:05     Статические члены #1
Мне необходимо создать класс А, причем: этот класс всегда нужен в единственном экземпляре, через этот класс работают классы В и С (т.е. в них храниться указатель на А). Я решил сделать все поля данных и методы класса А статическими.
Вопрос: каким образом это может повлиять на производительность программы?

Класс А не является производным и не имеет наследников.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,155
Завершенные тесты: 1
21.02.2012, 13:16     Статические члены #2
А с какой стати это должно влиять на производительность?
Разве что Вы не будете создавать экземпляры класса А, а обращаться
к статичным данным через А::
Shandr_71
13 / 13 / 1
Регистрация: 05.12.2011
Сообщений: 84
21.02.2012, 13:19  [ТС]     Статические члены #3
Да, именно так и планирую обращаться.
Благодарю за помощь.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
21.02.2012, 17:39     Статические члены #4
Какой смысл в классах B и C хранить указатель на класс A, если в классе A нет ничего, кроме статических данных (для обращения к которым никакой this не нужен)?

Добавлено через 46 секунд
При твоей постановке задачи наличие класса A ничем не отличается от namespace A
Shandr_71
13 / 13 / 1
Регистрация: 05.12.2011
Сообщений: 84
21.02.2012, 22:18  [ТС]     Статические члены #5
Указатели относятся к случаю, когда создаются экземпляры класса А.
namespace не подойдет, т.к. некоторые методы из В и С являются друзями А.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
21.02.2012, 23:05     Статические члены #6
Значит я с первого раза неправильно понял фразу "этот класс всегда нужен в единственном экземпляре"

Технически твоё решение с точки зрения производительности даст небольшое ускорение, т.к. при обращении к полям класса не требуется косвенного обращения через экземпляр класса, а будет обращение напрямую к статическому полю. Но идеологически такое решение выглядит топорным и корявым.
Shandr_71
13 / 13 / 1
Регистрация: 05.12.2011
Сообщений: 84
22.02.2012, 00:17  [ТС]     Статические члены #7
Мое решение выглядит примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class A
{
    class B;
 
    static void y();
 
    friend class B;
 
    //...
};
 
class A::B
{
    static T x;
    //...
};
 
void A::y()
{
    //...
    //обращение к A::B::x
}
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
22.02.2012, 08:57     Статические члены #8
Независимо от того, как выглядит программа, писать её в предположении, что для данного класса будет только один экземпляр - это неправильно. Идеологически неправильно, хотя технически будет работать
Shandr_71
13 / 13 / 1
Регистрация: 05.12.2011
Сообщений: 84
22.02.2012, 15:32  [ТС]     Статические члены #9
Ок, Evg тогда подскажи как решить мою задачу.

Сейчас у меня это выглядит так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class framework  //каркас приложения
{
    class facade;     //графическая подсистема
    //...
 
};
 
class framework::facade 
{
    static T device;
 
    friend class framework;
};
Думаю, по смыслу понятно, что иметь несколько графических подсистем нет смысла. На основе этого и того, что при создании экземпляра класса framework::facade нужно будет хранить нехилое количество указателей на него я пришел к такому решению.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
22.02.2012, 15:37     Статические члены #10
По этому огрызку кода всё равно понять ничего невозможно.

Но если уж хочется делать именно так, то из классов B и C нужно обращаться к статическим полям класса A через A::field, а не через указатель на экземпляр (ибо он нафиг в этом случае не нужен и только ввобит в забуждение)
Shandr_71
13 / 13 / 1
Регистрация: 05.12.2011
Сообщений: 84
22.02.2012, 15:39  [ТС]     Статические члены #11
Я написал, что указатели придется использовать только в случае создания экземпляра класса (я ищу пути, чтобы этого можно было избежать, один из которых приведен выше.)
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
22.02.2012, 15:54     Статические члены #12
А зачем создавать экземпляр класса, у которого нет ни одного поля? (поскольку все поля статические)
Shandr_71
13 / 13 / 1
Регистрация: 05.12.2011
Сообщений: 84
22.02.2012, 16:05  [ТС]     Статические члены #13
Ты путаешь два моих решения:
1) Не делать все поля и методы статическими, создать экземпляр класса, обращаться к нему через указатель (к классу обращение происходит очень часто и много откуда, а это лишний путь выбора члена и память под указатели).
2) Сделать все поля и методы статическими, обращаться через оператор :: (сейчас я остановился на этом варианте).
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,121
Записей в блоге: 26
22.02.2012, 16:22     Статические члены #14
Понятно. Просто ты толком не пояснил, что хочешь одно вместо другого

Пункт 1 концептуально более правильный. Пункт 2 технически немного быстрее (если ты сможешь ощутить разницу в тысячных или милионных долях секунды)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2012, 17:08     Статические члены
Еще ссылки по теме:

C++ Статические члены класса
Классы (статические члены и конструктор копирования) C++
C++ Класс MyString через статические члены класса

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
22.02.2012, 17:08     Статические члены #15
Shandr_71, если выбрали решение 1 и при этом позарез необходимо, чтобы был только один экземпляр класса А - почитайте про паттерн "Одиночка" (Singleton).
Yandex
Объявления
22.02.2012, 17:08     Статические члены
Ответ Создать тему
Опции темы

Текущее время: 12:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru