а) Настройте его так:
хиджра:
#ifndef A_HEADER_GUARD
#define A_HEADER_GUARD
class A {...};
#endif
a.cpp:
// A::method1 implementation
// A::method2 implementation
// etc...
B.h:
#ifndef B_HEADER_GUARD
#define B_HEADER_GUARD
#include "A.h"
template <enum VAR> class B {...}
#endif
Обратите внимание, что класс B не может быть реализован в файле cpp. Это связано с тем, что класс B является шаблоном, и его реализация должна быть полностью видимой для любого, кто создает экземпляр шаблона.
Убедитесь, что вы понимаете использование охранников заголовка (также включает охранников).
б) Написание приватных вспомогательных методов для «вычеркивания» часто повторяющегося кода вполне нормально, и я бы даже сказал, что это поощряется.
в) Да, shared_ptr::get()
гарантированно будет 0 при неинициализированном, как указано в пунктах постусловий в документации .
Вместо проверки shared_ptr::get()
в выражении условия вы можете просто проверить сам shared_ptr
. Он автоматически преобразуется в bool
при использовании в логическом контексте. Например:
shared_ptr<A> a_ptr;
if (!a_ptr)
cout << "a_ptr not initialized!";
Это идиоматический способ проверки правильности умного указателя.