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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Shandr_71
13 / 13 / 1
Регистрация: 05.12.2011
Сообщений: 84
#1

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

21.02.2012, 13:05. Просмотров 1001. Ответов 14
Метки нет (Все метки)

Мне необходимо создать класс А, причем: этот класс всегда нужен в единственном экземпляре, через этот класс работают классы В и С (т.е. в них храниться указатель на А). Я решил сделать все поля данных и методы класса А статическими.
Вопрос: каким образом это может повлиять на производительность программы?

Класс А не является производным и не имеет наследников.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2012, 13:05     Статические члены
Посмотрите здесь:

Статические члены класса - C++
Доброго времени суток. Задача состоит в том, чтобы создать список обыектов класса Test, с возможностью последующего добавления элементов...

Статические члены и функции - C++
Что-то я не могу понять что я забыли и чяднт что код не компилируется. #include <iostream> #include <string> using namespace std; ...

Зависимости и статические члены - C++
По ходу дела, у меня возникла следующая проблема. Допустим, что у нас есть два класса. Один класс затребует второй. Второй класс...

Как инициализировать статические члены класса - C++
Помогите пожалуйста....я не знаю как вывести в статическое поле значения((( #include <conio.h> #include <stdlib.h> #include...

Классы (статические члены и конструктор копирования) - C++
Добрый вечер! Написал программку, все нормально работает, но есть два нюанса: необходимо сделать счетчик количества записей через...

Конструктор класса, содержащего только статические члены - C++
Практикуюсь по книге Стенли Липпмана "Язык программирования C++ вводный курс" 4 изд. Осваиваю главу 12.6 Статические члены класса. В...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
6287 / 5890 / 1910
Регистрация: 18.12.2011
Сообщений: 15,123
Завершенные тесты: 1
21.02.2012, 13:16     Статические члены #2
А с какой стати это должно влиять на производительность?
Разве что Вы не будете создавать экземпляры класса А, а обращаться
к статичным данным через А::
Shandr_71
13 / 13 / 1
Регистрация: 05.12.2011
Сообщений: 84
21.02.2012, 13:19  [ТС]     Статические члены #3
Да, именно так и планирую обращаться.
Благодарю за помощь.
Evg
Эксперт CАвтор FAQ
17473 / 5711 / 364
Регистрация: 30.03.2009
Сообщений: 15,683
Записей в блоге: 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
Эксперт CАвтор FAQ
17473 / 5711 / 364
Регистрация: 30.03.2009
Сообщений: 15,683
Записей в блоге: 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
Эксперт CАвтор FAQ
17473 / 5711 / 364
Регистрация: 30.03.2009
Сообщений: 15,683
Записей в блоге: 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
Эксперт CАвтор FAQ
17473 / 5711 / 364
Регистрация: 30.03.2009
Сообщений: 15,683
Записей в блоге: 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
Эксперт CАвтор FAQ
17473 / 5711 / 364
Регистрация: 30.03.2009
Сообщений: 15,683
Записей в блоге: 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
Эксперт CАвтор FAQ
17473 / 5711 / 364
Регистрация: 30.03.2009
Сообщений: 15,683
Записей в блоге: 26
22.02.2012, 16:22     Статические члены #14
Понятно. Просто ты толком не пояснил, что хочешь одно вместо другого

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

Статические функции-члены - хорошо или плохо? - C++
Всем привет. Приведу пример такой архитектуры. Есть базовый интерфейс. От него наследуются много конкретных. И есть фабрика,...

Класс MyString через статические члены класса - C++
Всем доброго времени суток. Возникла необходимость решить задачу, хочу обратиться к знающим людям за подходящим к данной задаче...

Как правильно инициализировать статические члены класса? - C++
Я новичок и заранее прошу прощение за тупые вопросы. Имеются два класса: Solution и Pool. Pool состоит из нескольких обьектов класса...

Упорядочить массив так, чтобы сначала иши упорядоченные положительные члены а потом упорядоченные отрицательные члены - C++
упорядочить одномерный массив таким образом,чтобы сначала шли упорядоченные положительные члены а потом упорядоченные по возрастанию...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru