Как этот код создает экземпляр класса, который имеет только закрытый конструктор? - PullRequest
5 голосов
/ 07 июля 2011

Я работаю над звуковой библиотекой (с OpenAL), и, черпая вдохновение из интерфейса, предоставленного FMOD, вы можете увидеть интерфейс по этой ссылке .

У меня естьПри наличии некоторых концепций, таких как: Sound, Channel и ChannelGroup, как вы можете видеть через интерфейс FMOD, все эти классы имеют приватный конструктор, и, например, если вы хотите создать Sound, вы должны использовать функцию createSound () предоставляется классом System (то же самое, если вы создадите Channel или ChannelGroup).

Я хотел бы предоставить аналогичный механизм, но я не понимаю, как он работает.Например, как функция createSound () может создать новый звук?Конструктор является приватным, и из интерфейса Sound нет никаких статических методов или дружбы.Используются ли некоторые шаблоны?

РЕДАКТИРОВАТЬ: Просто, чтобы прояснить вопрос OP, он / она не спрашивает, как создать экземпляр класса с закрытым конструктором, Вопрос в размещенной ссылке, как этосозданы экземпляры классов с закрытым конструктором и без статических методов или функций-друзей.

Спасибо.

Ответы [ 4 ]

7 голосов
/ 07 июля 2011

Трудно сказать, не видя исходного кода.Тем не менее, кажется, что FMOD на 100% C с глобальными переменными и с плохой оболочкой C ++ «OOP».

Учитывая отсутствие исходного кода и некоторые из плохих трюков, которые воспроизводятся в файлах .hвозможно, код скомпилирован с использованием другого заголовочного файла, а затем просто работает (даже если он явно нестандартный) с компиляторами, которые они используют.

Я предполагаю, что настоящий (неопубликованный) исходный кодпоскольку оболочка C ++ определяет статический метод или, в качестве альтернативы, если все действительно просто глобально, то объект на самом деле даже не создается, и разыгрываются трюки, чтобы обмануть объектную систему C ++, чтобы думать, что действительно существует объект.Очевидно, что вся диспетчеризация является статической, так что это (хотя и формально не законно) может работать в любом случае с реализациями C ++, которые я знаю.

Что бы они ни делали, это довольно уродливо и не соответствует с точки зрения C ++.

1 голос
/ 07 июля 2011

Они никогда не создают никаких экземпляров!Фабричная функция находится прямо в заголовке

/*
    FMOD System factory functions.
*/
inline FMOD_RESULT System_Create(System **system)
{ return FMOD_System_Create((FMOD_SYSTEM **)system); }

Указатель, который вы передаете, чтобы получить объект System, немедленно приводится к указателю на структуру C, объявленную в заголовке fmod.h.

Как это класс без каких-либо членов данных, которые могут отличить?

0 голосов
/ 07 июля 2011

Это фабричный шаблон - как говорится в их комментарии.

/*
    FMOD System factory functions.
*/
inline FMOD_RESULT System_Create(System **system) { return FMOD_System_Create((FMOD_SYSTEM **)system); }

Трудно точно сказать, что происходит, поскольку они не публикуют источник для метода FMOD_System_Create.

Фабричный шаблон - это механизм для создания объекта, но создаваемый (под) класс зависит от параметров фабричного вызова.http://en.wikipedia.org/wiki/Factory_method_pattern

0 голосов
/ 07 июля 2011
struct Foo {
    enum Type {
        ALPHA,
        BETA_X,
        BETA_Y
    };
    Type type () const;
    static Foo alpha (int i) {return Foo (ALPHA, i);}
    static Foo beta  (int i) {return Foo (i<0 ? BETA_X : BETA_Y, i);}
private:
    Foo (Type, int);
};

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

Боюсь, я не могу получить доступ к этой ссылке, но другим способом может быть фабричный шаблон.Теперь я немного догадываюсь.

...