Ранее я задал вопрос о том, как вызывать функции-члены статического члена, чтобы инициализировать его перед фактическим использованием статического объекта. Затем я понял, что, возможно, неправильно использовал статический элемент, что привело к следующему вопросу:
Для определенного класса, MyClass
, сколько способов мы можем разработать наш код, чтобы MyClass
мог получить доступ к функциям-членам другого класса, YourClass
? [Нотабене Предположим, что общая ситуация, когда MyClass
объявлена в MyClass.h
и определена в MyClass.cpp
, и аналогично для YourClass
.]
Я могу думать о некоторых, но, будучи далеко от эксперта, я думаю, вы могли бы назвать несколько других:
Сдерживание: Может иметь несколько «разновидностей», при этом прямое удержание объекта YourClass
является одной из опций, в то время как указатель или ссылка на объект является другой опцией:
class MyClass
{
public:
// Some MyClass members...
private:
YourClass instance; // or YourClass* instance / YourClass& instance;
// Some other MyClass members...
};
a) Конечно, прямое сдерживание удобно, но я могу вспомнить один немедленный недостаток: если YourClass
немного дороговато с точки зрения требований к памяти, и у вас есть несколько MyClass
экземпляров (как в моем связанном вопросе), содержащее объект напрямую не может быть и речи. Кроме того, отношения has-a не всегда имеют смысл.
b) В этом случае лучше иметь указатель или ссылку на объект. При использовании ссылки возникает проблема, заключающаяся в том, что вы можете в конечном итоге сослаться на объект, который больше не существует, поэтому вы должны убедиться, что объект YourClass
существует на время существования объекта MyClass
.
c) В случае указателя вышеуказанная проблема все еще существует, но вы можете легче переназначить указатель на новый объект.
Наследование: Можно наследовать от объекта YourClass
, так что члены наследуются, например:
class MyClass : public YourClass
{
public:
// Some MyClass members...
private:
// Some other MyClass members...
};
a) Это также очень просто настроить для нескольких классов, но может стать громоздким для общего использования. Например, если бы YourClass
был генератором случайных чисел, не обязательно было бы иметь смысл говорить, что MyClass
is-a генератор случайных чисел. Конечно, можно определить класс-оболочку для генератора случайных чисел, скажем, назвать его Randomizable
, и тогда MyClass
может наследовать от Randomizable
, что имеет смысл.
Лично я хотел бы узнать больше о плюсах и минусах статических членов, глобальных объектов, синглетонов и о том, как они правильно используются. Итак, с точки зрения «мета», какие другие методы или шаблоны будут работать?
PS. Хотя я спрашиваю с точки зрения C ++, я думаю, то же самое можно сказать и о применении ко многим другим объектно-ориентированным языкам, поэтому не беспокойтесь о предоставлении примеров на других языках.