Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > C++

Ответ
 
Опции темы
Старый 30.09.2011, 22:23   #1
den
Дэвелопер
 
Аватар для den
 
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений
(для 2,419 пользователей)
Вопрос singleton vs static

Чем singleton лучше статичного класса (т.е. у которого все методы и переменные static)?
(Offline)
 
Ответить с цитированием
Старый 30.09.2011, 22:40   #2
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: singleton vs static

Две разные вещи, по разному используются.
Имхо, их сравнивать нельзя никак. Тот же синглтон - имеет статик переменную в себе, но указывает на дин объект, который при обращении инициализируется.
В статик полностью же объекте, инициализацию делать геморнее - нужен вызов функции инициализации вручную. Но не в этом суть.
То же "вкл/выкл" делать для статик класса проще, с больше экономией памяти и более удобным использованием, чем для синглтона.

Зависит от ситуации, и где и для чего нужно заюзать.
(Offline)
 
Ответить с цитированием
Старый 30.09.2011, 23:25   #3
den
Дэвелопер
 
Аватар для den
 
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений
(для 2,419 пользователей)
Ответ: singleton vs static

Ну допустим есть класс MyCl
Если он синглетон:
//1 кусок кода
MyCl *MyCl::init();
m->someFuncA();
delete m;

//2 кусок кода
MyCl *MyCl::init();
m->someFuncB();
delete m
если же он статичный класс то:
//1 кусок кода
MyCl::someFuncA();

//2 кусок кода
MyCl::someFuncB(); 
Помойму второй пример удобней и понятней.
Но многие почемуто используют первый.
(Offline)
 
Ответить с цитированием
Старый 30.09.2011, 23:28   #4
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: singleton vs static

delete - удаляет объект, или указатель? Если объект - то это не разумно имхо. Суть такого синглтона, это инициализация лишь для совершения определённых действий, и затем разрушение. Имхо, весьма извратный подход, и не удобный.
Я просто на C# сижу.

Второй вариант, естественно проще. Но учитывай разницу, что в первом у тебя в памяти не будет постоянно висеть объект, а во втором варианте будет, и нужно будет вызвать либо Initialize, либо делать то же самое что в первом варианте, только уже в теле статических функций.
Что технически будет то же самое что и первый вариант, только с одним минусом - каждый вызов будет пересоздавать объект, что не позволяет делать последовательного вызова функций с одним созданием и удалением.
Но юзабилити имхо лучше у второго варианта.
(Offline)
 
Ответить с цитированием
Старый 01.10.2011, 00:20   #5
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: singleton vs static

//1 кусок кода
MyCl *m = MyCl::init();
m->someFuncA();
delete m;

//2 кусок кода
MyCl *m = MyCl::init();
m->someFuncB();
delete m;
зачем delete? суть синглтона - объект класса в единственном уникальном экземпляре будет доступным в разное время в разных участках кода. delete нужен только на выходе из программы уже.

Помойму второй пример удобней и понятней.
в твоём случае да.
а в таком нет:

статик:
class myClass
{
 static float a,b,c;
public:
 static void do();
};

float myClass::a = 0; // неявный момент назначения статик переменных (может вызваться в рандомной последовательности относительно инициализации данных других классов)
float myClass::b = 0;
float myClass::c = 0;

void myClass::do()
{
 a = b+c;
}
синглтон:

class myClass
{
 float a,b,c;
 static myClass* instance;
public:
 static myClass* Instance()
 {
  if (!instance) instance = new myClass();
  return instance;
 }
 static void Release()
 {
  if (instance) delete instance;
 }

 void do();

};

myClass* myClass::instance = 0; //единственная инициализация статик данных для синглтон класса. остальные нормальные будут сидеть внутри объекта класса

void myClass::do()
{
 a=b+c;
}
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
den (01.10.2011)
Старый 01.10.2011, 01:02   #6
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: singleton vs static

А так нельзя?

class myClass
{
 static float a = 0;
 static float b = 0;
 static float c = 0;
public:
 static void do();
};

void myClass::do()
{
 a = b+c;
}
В C# можно если что..
(Offline)
 
Ответить с цитированием
Старый 01.10.2011, 01:09   #7
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: singleton vs static

А так нельзя?
даже так уже менее удобно, чем синглтоном, по крайней мере если переменных много.

ну и потом - нельзя
error C2864: 'a' : only const static integral data members can be initialized inside a class or struct
(Offline)
 
Ответить с цитированием
Старый 01.10.2011, 01:19   #8
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: singleton vs static

Ех, вот жеж неудобства с С++.

В C#, это выглядит так.
static:
class MyClass {
    private static float a, b, c;

    public static void Do() {
        a = b + c;
    }
}
...
MyClass.Do();
singleton:
class MyClass {
    private float a, b, c;
    private static MyClass instance;

    private MyClass() { }

    public static MyClass Instance {
        get {
            if (instance == null) {
                instance = new MyClass();
            }
            
            return instance;
        }
    }

    public void Do() {
        this.a = this.b + this.c;
    }
}

...

MyClass.Instance.Do();
Судите сами, но реальная необходимость в singleton'е, очень мало вероятна имхо.
Но конечно, многим религия не позволяет юзать static'и..


Кстати, Den, зачем ссылку удалил?
http://habrahabr.ru/blogs/refactoring/103681/

Тут отлично описываются разница их. И кстати да, много отличным поинтов подмечено.
Но суть больше в том что люди начинают сравнивать singleton'ы как альтернатива static'ам, но это не так, т.к. это две схожие но различные сущности. Singleton хорош в виде объекта, для расширения, наследия и т.п. Но если это не нужно, так зачем клепать ещё?
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
den (01.10.2011), HolyDel (01.10.2011), Reizel (01.10.2011)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 13:29.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com