2014-01-14 2 views
0

Я пытаюсь создать указатель extern на значение статического объекта изнутри этого статического объекта. Мы назовем этот объект Foo.Как получить значение статического объекта изнутри этого объекта?

До сих пор единственным способом, с помощью которого я работал, является создание класса Supervisor, который наследует Foo, который содержит две переменные статического типа. Один, называемый superObject, является фактическим инициализированным объектом. Другой, называемый superPointer, является двойным указателем того же типа. Внутри объекта Foo я объявляю указатель extern с именем TheSupervisor и присваиваю ему значение nullptr. Затем изнутри базового класса Supervisor я использую двойной указатель superPointer, чтобы изменить значение внешнего указателя TheSupervisor на адрес объекта superObject. Wallah.

Целью здесь является создание общедоступной ссылки на этот объект. Пытаюсь изо всех сил избегать одиночных игр и держать вещи в безопасности. Мне просто интересно, есть ли лучший способ?

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

EDIT: Как оказалось, для статических объектов я не могу рассчитывать, когда и в каком порядке они построены. Использование однофазного процесса для этого не будет работать. Вместо этого я должен продолжать полагаться на двухфазный процесс, такой как тот, который я изложил выше. Маркировка Ответ Илья Кобелевский правильный, поскольку он демонстрирует один из способов сделать это, но опять же, при использовании со статическими объектами должно появиться предупреждение.

+0

Почему нет синглета? – Micka

+0

Хороший вопрос. Этот класс Foo на самом деле является шаблоном. Для этого конкретного типа Foo я использую специализированную специализацию для его инициализации, а затем создаю глобальный доступ к ней, как описано выше. Я хочу только одного из них. Однако для других типов эти вещи не происходят, и я мог бы иметь более одного из них. Отвечает ли это на ваш вопрос? – Stradigos

ответ

1

Может быть, я что-то с видом, но не

class Foo 
{ 
//some methods 
public: 
Foo* getSelf() const { return this;} 
} 

просто работать?

+0

Маркировка как ответ, но см. Мой EDIT выше о его использовании со статическими объектами. – Stradigos

+0

@ Stradigos Я думаю, вы передумали. Обратите внимание, что метод getSelf() не статический *. Поэтому нет необходимости делать какие-либо предположения о порядке создания объектов - метод может быть вызван только из существующего объекта после того, как объект был создан, и он вернет указатель на этот объект - объект статический или нет, не имеет значения в этом конкурс. –

+0

Возможно, вы правы. Я посмотрю! – Stradigos

0

Я пытаюсь понять, что вы сказали в комментарии выше, но я не уверен, что это то, что вы ищете или нет.

class Foo 
{ 
    public: 
     Foo(); 
     static Foo* shared_instance() {return &shared_instance_;}; 

    private: 
     static Foo shared_instance_; 
} 

Таким образом, вы можете использовать общий экземпляр, как есть, или экземпляр новые, когда и если это необходимо.

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