2013-08-08 2 views
5

Я видел такой код, поэтому я пытаюсь найти причину.
Какова основная причина наличия статических функций, которые действуют как конструкторы, вместо фактических конструкторов?Преимущества статических функций для конструкций классов

Я имею в виду что-то вроде:

class MyClass 
{ 
    public: 
    static MyClass CreateFrom(bar); 
    static MyClass CreateFrom(foo); 
    ... 
} 

вместо:

class MyClass 
{ 
    public: 
    MyClass(bar); 
    MyClass(foo); 
    ... 
} 

ответ

10

Это называется именованной конструкторской идиомой.

Это обычно используется, когда:

  1. У вас есть много ctors с достаточно достаточно подобными списками параметров, перегруженных ctors будет запутанным (например,, различные смеси целых чисел и чисел с плавающей запятой, поэтому 1, 1.0, 1 должно означать что-то отличное от 1, 1, 1.0).
  2. У вас есть два разных источника, которые обеспечивают ввод как один и тот же тип. Например, предположим, что вы хотели преобразовать расстояние на поверхности земли в угол, расположенный между точками, расположенными на расстоянии друг от друга, - но вы можете захотеть предоставить расстояние в километрах или километрах, причем любой из них будет представлен как double.

В этом случае один angle(double dist) не может различать между входом в километре против миль, но: angle_from_miles и angle_from_kilomters могут сделать это довольно легко.

+0

Для конкретного примера я использовал его в классе 'Duration':' Duration :: Days', 'Duration :: Hours',' Duration :: Minutes' ... все принимают тот же аргумент, и это дает понять, какой должна быть его единица при получении. –

+0

Также полезно использовать 'enable_shared_from_this'. http://mortoray.com/2013/08/02/safely-using-enable_shared_from_this/ –

7

Они называются Named Constructors.

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

Например у вас есть класс, как:

class AREA 
{ 
double area; 
AREA(int x); 
}; 

//how will you construct the object differently in case of circle and square?? 

Для этой цели мы назвали конструкторы, которые помогают создать соответствующий объект.

Таким образом, мы можем создать 2 статические методы внутри класса, как:

static AREA square(int x) 
{ return AREA(x*x); } 

и

static AREA circle(int x) 
{ return AREA(x*x*3.14); } //or a more accurate PI value 

Таким образом, мы можем назвать соответствующую статическую функцию, чтобы вернуть объект инициализирован с требуемой области.

ПРИМЕЧАНИЕ: Они являются статическими, поскольку при создании объекта для определенного класса вы не должны требовать от него объекта.

THIS для получения более подробной информации.

1

Наиболее очевидные преимущества:

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

Другая причина в том, что в некоторых случаях легче инициализировать класс внутри тела функции, а не использовать список инициализации.

Смежные вопросы