Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2013, 10:37   #1
Shad0wF1rst
Форумчанин
 
Регистрация: 11.01.2013
Сообщений: 149
По умолчанию Как лучше записать?

Как лучше сделать объявление класса в единственном экземпляре? Постараюсь на примерах объяснить свою мысль.
У меня есть класс от которого наследуются 2 дочерних класса. В родительском классе хочу завести статический класс для работы по сети, так как он будет использоваться в двух дочерних. Но загвоздка в том что не совсем понимаю как инициализировать этот класс, так как туда нужно передать аргументы сети (IP и порт). И кстати эти оба класса будут использовать одни и те же параметры сети, по этому я и хочу сделать статическим класс для работы с сетью.
Знаю несколько способов инициализации:
1) Через конструктор:
Код:
Server* AbstractDataClass::server = 0;

AbstractDataClass::AbstractDataClass(QHostAddress Ip, quint port, QObject *parent) : QObject(parent)
{
    if (server == 0) server = new Server (Ip, port);
}
2) Через статическую функцию в главном классе:
Код:
AbstractDataClass::setServerParametrs (QHostAddress Ip, quint port) 
{
    server = new Server (Ip, port);
}
3) Это объявление класса Server в главном классе и передача в остальные классы указателя на этот объект.

Эти 3 способа кажутся немного корявыми. По этому есть ли другие способы?
Может это и чушь, но это моя чушь и я ее никому не отдам.
Shad0wF1rst вне форума Ответить с цитированием
Старый 25.09.2013, 11:14   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Ну я б сделал класс работы с сетью.

А в родительском классе статический метод для доступа к этой сети:

Код:
class Net {...};

class Parent
{
    ...
    static Net& GetNet() 
   {  
        static Net net(Ip, port); //<--- гарантирует одноразовое создание и инициализацию
        return net;
   } 
        
};


class Child: public Parent
{

     ... 

     void Work()
    {

         ...

        GetNet().Post(data);  //<--- работаем в сетью

        ...
     }
};
_Bers вне форума Ответить с цитированием
Старый 25.09.2013, 11:54   #3
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

А почему бы просто не сделать константное статическое поле в базовом классе?
still_alive вне форума Ответить с цитированием
Старый 25.09.2013, 12:31   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от still_alive Посмотреть сообщение
А почему бы просто не сделать константное статическое поле в базовом классе?
Не понятно, какое отношение "констатное статическое поле в базовом классе" имеет к сабжу.
_Bers вне форума Ответить с цитированием
Старый 25.09.2013, 13:52   #5
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Мне в свою очередь непонятно нафига все время дергать статическую функцию если можно обойтись полем.
still_alive вне форума Ответить с цитированием
Старый 25.09.2013, 14:08   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от still_alive Посмотреть сообщение
Мне в свою очередь непонятно нафига все время дергать статическую функцию если можно обойтись полем.
рассмотрим псевдокод:

Код:
class Net {...};

class Parent
{
    ...
    static Net& GetNet() 
   {  
        static Net net(Ip, port);
        return net;
   } 
        
};
Здесь существует статический метод, внутри которого существует статический объект.

Стандарт гарантирует, что инициализация локального-статического объекта произойдет в момент первого вызова функции.

Что это значит?

Это значит, что не важно откуда (из любой точки программы, из любой единицы трансляции) вы дергаете статический метод, и это приводит к немедленной инициализации локального-статического объекта.

Если бы статический объект не был бы локальным, а был глобальным:


Код:
//Parent.h
class Parent
{
    ...
    static Net net
};
Код:
//Parent.cpp
...
Net Parent::net(Ip, port);
...
То в этом случае, возникла бы зависимость от порядка инициализации едениц трансляций, который, как известно не определен.


Таким образом, вариант с локальным-статиком можно дергать откуда угодно, и когда угодно.

Вариант с просто статиком - только после того, как все единицы трансляции уже определены (только после запуска main() )


При чем тут константные статики, о которых вы сообщали выше для меня попрежнему загадка.

Последний раз редактировалось _Bers; 25.09.2013 в 14:10.
_Bers вне форума Ответить с цитированием
Старый 25.09.2013, 15:30   #7
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Ты верно написал и я в курсе всего этого, но покажи мне, где возникла бы проблема с порядком инициализаций, если тут у нас статический объект только один - сеть. Который можно наверное сделать даже константным (хз, от задачи зависит).
still_alive вне форума Ответить с цитированием
Старый 25.09.2013, 15:36   #8
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от still_alive Посмотреть сообщение
Ты верно написал и я в курсе всего этого, но покажи мне, где возникла бы проблема с порядком инициализаций, если тут у нас статический объект только один - сеть. Который можно наверное сделать даже константным (хз, от задачи зависит).
Создай любой статический объект в ед. трансляции.
Который при инициализации дернет сингелтон (сеть).

Получишь плавающие ошибки, которые зависят от фазы луны и офигеть как не очевидны.


Локальный-статический позволяет делать все тоже самое, что и статический, только при этом дает большую безопасность.
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
понимаю как сделать, а как записать непойму(( lisica198808 Помощь студентам 9 24.11.2012 20:57
как сравнить 4 числа,наименьшее записать в R15.как вычислить степень? dezder Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 18.12.2011 13:02
как лучше скомпилировать? ALKOrobot Общие вопросы Delphi 3 10.11.2010 06:46
Посоветуйте, как лучше? Artem4ik Win Api 2 09.05.2010 23:11
Как лучше организовать базу данных типо как в ICQ Руслантус БД в Delphi 3 09.08.2008 23:57