Скажем, у меня есть объект типа A, имеющий метод Initialize(). Метод получает объект B, который хранится как элемент данных объекта. Объект B разделяется между несколькими объектами, поэтому A должен содержать первоначально полученный объект B, а не его копию.Общий доступ к объекту по ссылке или указателю
class A
{
public:
bool Initialize(B?? b);
private:
B?? m_B;
}
Объект B должен быть представлен. Таким образом, я думаю, передать его по ссылке, вместо того, чтобы передавать указатель и не инициализировать() в случае, когда B является NULL.
Единственная альтернатива для m_B должна быть типа указателя B (он не может быть ссылкой на B, так как инициализация B не выполняется в A c-tor). Таким образом, Инициализация должна выглядеть так:
bool A::Initialize(B& b)
{
m_B = &b;
....
}
Это aproach в порядке?
UPD:
код не является новой, и я просто пытаюсь "исправить" некоторые проблемы. На самом деле я не говорю о некоторых конкретных классах A и b, скорее о том, как проблема приближается к моей базе кода. Код широко передает указатель на B и проверяет его в Initialize(), если он NULL.
Передача B в c-tor не всегда является хорошим вариантом. Также есть другие параметры, переданные в A, которые не существуют во время создания A. Поэтому я не хотел бы передавать часть параметров A-c-tor, а остальное - в A :: Initialize().
shared_ptr тоже может быть «NULL», поэтому передача его в A :: Initialize() не отличается от передачи только указателя на B, в том аспекте, что подпись Initialize() не объявляет, если B является обязательным или не. В моем случае это так, и я хочу выразить это, передав ссылку на B.
В настоящее время наш код не использует boost. Итак, хотя решение shared_ptr лучше, чем просто передать необработанный указатель, может ли предложенное мной решение рассматриваться как плохое, но все же решение.
У вас не должно быть функции Initialize() - у вас должен быть конструктор. – 2009-12-06 17:38:58
Вы можете вытащить отдельные компоненты из бустера с помощью bcp: http://www.boost.org/doc/libs/1_41_0/tools/bcp/bcp.html –