2012-06-03 5 views
5

Предположим, что у нас есть класс, какСтатический объект член класса в том же классе

class Egg 
{ 
static Egg e; 
int i; 
Egg(int ii):i(ii) {} 
Egg(const Egg &); //Prevents copy-constructor to be called 
public: 
static Egg* instance() {return &e} 
}; 

Egg Egg::e(47); 

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

И еще одно, поскольку e является статическим объектом, а статические объекты могут вызывать только статические функции-члены, поэтому как конструктор может быть вызван здесь для статического объекта e, а его конструкторы являются частными.

ответ

6

Но как мы можем объявить статический объект того же класса в классе.

Элемент-член static не сохраняется внутри каждого объекта класса. Поэтому, если вы объявляете переменную члена static внутри класса или как объект уровня пространства имен после того, как вы определили класс, он отличается только доступом (Class::var и var) и доступом к protected и private членам.

А также еще одно, так как e статический объект, и статические объекты могут вызывать только статические функции

Я думаю, вы смешиваете static функции и static объектов. Внутри функции static вы можете вызывать только функции static (если вы не вызываете их на объект).

так, как мог бы конструктор был назван здесь для статического объекта e

Как для любого другого объекта, конструктор должен быть вызван для static объектов тоже.

также его конструкторы являются частными

Контроль доступа проверяется на уровне класса в C++. Так как объект static находится внутри класса, он может получить доступ к private членам.

В отличие от некоторых других языков, следующее легальным в C++, так как доступ к частному члену от внутри класса - даже если на другом объекте (other в данном случае):

class Test { 
private: 
     int i; 
public: 
     Test(const Test &other) 
     : i(other.i) 
     {} 
}; 
+0

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

+1

Он может получить доступ к конструктору, так как он определен внутри класса. Все внутри класса может получить доступ к частным членам. –

2

Но как мы можем объявить статический объект того же класса в классе.

Обычно вам нужно вперед ссылку, но так как яйцо е статичен, он на самом деле определяется вне определения класса. Если e не статично, вы получите ошибку (что-то вроде «поле Egg e имеет неполный тип»).

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

Это не совсем так. Статический член Функция внутри класса может получить доступ только к статическим данным элемента. статическое яйцо e - это экземпляр яйца, так что он может получить доступ ко всем членам и данным обычным яйцом.

также его конструкторы являются частными.

Любой частный член может использоваться из класса. Поскольку статическое яйцо e объявлено как член Egg, он может использовать частный конструктор. Определение e равно за пределами класса, так как оно статично, но оно по-прежнему является членом класса.

И, наконец, ваш код не компилируется, потому что вы оставили из точкой с запятой здесь:

static Egg* instance() {return &e;} 
Смежные вопросы