Как этот код создает экземпляр класса, который имеет только закрытый конструктор?

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

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

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

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

Благодарю.

4 ответа

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

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

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

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

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

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

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

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

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

/*
    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

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 но это просто загрязняет пространство имен.

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

Другие вопросы по тегам