Теперь вопрос в том, есть ли недостатки этого решения?
Да. Посмотрите, например, эту запись в faq c ++ по статическому порядку инициализации фиаско. http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.14 Tldr? По сути, вы не можете контролировать, в каком порядке инициализируются статические объекты (такие как Foo выше), любые предположения о порядке (например, инициализация одного статического объекта значениями из другого) приведут к неопределенному поведению.
Рассмотрим этот код в моем приложении.
#include "my_project/library/Foo.h"
static int whoKnowsWhatValueThisWillHave = Foo::some_value;
int main()
{
return whoKnowsWhatValueThisWillHave;
}
Здесь нет никаких гарантий относительно того, что я возвращаю из main ().
Пользователь может создавать другие экземпляры этой библиотеки, если они захотят, по любой причине. Но копирование не будет разрешено. Один экземпляр будет предоставлен для них по умолчанию. Это требование.
Не совсем, нет ... Поскольку все ваши данные статичны, любые новые экземпляры, по сути, являются пустыми оболочками, указывающими на одни и те же данные. По сути, у вас есть копия.
Мне кажется, что я делаю что-то, чего не должен был делать C ++, потому что IntelliSense в Visual Studio постоянно бесится и думает, что my_project :: Foo не объявлен. Может ли быть так, что и объект, и класс называются Foo, даже если они находятся в разных пространствах имен?
Вы есть! Предположим, я добавил эту строку в свой код:
с использованием пространства имен :: my_project :: library;
что теперь решает «Foo»? Может быть, это определено в стандарте, но, по крайней мере, это сбивает с толку.
Я могу использовать. синтаксис вместо ::. Но это вещь личного стиля.
Не борись с языком. Если вы хотите кодировать в синтаксисе Python или Java, используйте Python или Java (или Ruby или любой другой) ...
Должен ли я просто придерживаться шаблона одноэлементного проектирования в качестве альтернативного решения? Есть ли альтернативные решения?
Да, синглтон хорош, но вы должны также подумать, нужен ли вам здесь синглтон. Поскольку ваш пример является только синтаксическим, трудно сказать, но, возможно, было бы лучше использовать внедрение зависимостей или что-то подобное, чтобы минимизировать / устранить тесные связи между классами.
Надеюсь, я не обидел ваши чувства :) Хорошо задавать вопросы, но, очевидно, вы уже это знаете!