С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

Класс А не является производным и не имеет наследников.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2012, 13:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Статические члены (C++):

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

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

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

Статические члены класса - C++
Добрый день. Проходили тему - статические члены класса. Написали программу, вылезает ошибка, помогите побороть пожалуйста. #include...

Статические массивы, члены класса - C++
необходимо создать статический массив. компилятор gcc #include<iostream> class c{ public: static const char x = "qwe"; ...

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

14
zss
Модератор
Эксперт С++
6586 / 6148 / 2025
Регистрация: 18.12.2011
Сообщений: 16,027
Завершенные тесты: 1
21.02.2012, 13:16 #2
А с какой стати это должно влиять на производительность?
Разве что Вы не будете создавать экземпляры класса А, а обращаться
к статичным данным через А::
1
Shandr_71
13 / 13 / 1
Регистрация: 05.12.2011
Сообщений: 84
21.02.2012, 13:19  [ТС] #3
Да, именно так и планирую обращаться.
Благодарю за помощь.
0
Evg
Эксперт CАвтор FAQ
18382 / 6430 / 441
Регистрация: 30.03.2009
Сообщений: 17,850
Записей в блоге: 28
21.02.2012, 17:39 #4
Какой смысл в классах B и C хранить указатель на класс A, если в классе A нет ничего, кроме статических данных (для обращения к которым никакой this не нужен)?

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

Технически твоё решение с точки зрения производительности даст небольшое ускорение, т.к. при обращении к полям класса не требуется косвенного обращения через экземпляр класса, а будет обращение напрямую к статическому полю. Но идеологически такое решение выглядит топорным и корявым.
0
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
}
0
Evg
Эксперт CАвтор FAQ
18382 / 6430 / 441
Регистрация: 30.03.2009
Сообщений: 17,850
Записей в блоге: 28
22.02.2012, 08:57 #8
Независимо от того, как выглядит программа, писать её в предположении, что для данного класса будет только один экземпляр - это неправильно. Идеологически неправильно, хотя технически будет работать
0
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 нужно будет хранить нехилое количество указателей на него я пришел к такому решению.
0
Evg
Эксперт CАвтор FAQ
18382 / 6430 / 441
Регистрация: 30.03.2009
Сообщений: 17,850
Записей в блоге: 28
22.02.2012, 15:37 #10
По этому огрызку кода всё равно понять ничего невозможно.

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

Пункт 1 концептуально более правильный. Пункт 2 технически немного быстрее (если ты сможешь ощутить разницу в тысячных или милионных долях секунды)
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
22.02.2012, 17:08 #15
Shandr_71, если выбрали решение 1 и при этом позарез необходимо, чтобы был только один экземпляр класса А - почитайте про паттерн "Одиночка" (Singleton).
0
22.02.2012, 17:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2012, 17:08
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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