Указатель лучше, чем экземпляр при объявлении членов в классе? - PullRequest
2 голосов
/ 25 октября 2010

Вариант 1:

class B{//};
class A
{
    public:
        void Funcs();
    private:
       std::vector<A> vecA;
};

Вариант2:

class B{//};
class A
{
    public:
        void Funcs();
    private:
        std::vector<A*> vecpA;
};

Какой из них лучше, есть ли какие-либо рекомендации?

Ответы [ 3 ]

3 голосов
/ 25 октября 2010

Это одна из тех вещей, где это зависит от конкретного сценария. Вот неполный список вопросов, которые нужно задать себе при выборе между этими вариантами:

  1. Это полиморфно? То есть, вы знаете точный тип во время компиляции, или у вас могут быть разные типы времени выполнения, которые все наследуются от одного и того же базового типа. Полиморфный => УКАЗАТЕЛЬ.
  2. Насколько велик этот объект? Т.е. будет ли строительство объекта в стеке занимать мое стековое распределение? Если он маленький или умеренно большой, то это не имеет значения. Огромный => УКАЗАТЕЛЬ.
  3. Хочу ли я убедиться, что только у меня есть копия (или что моя копия уникальна). Будет ли этот объект подвергаться воздействию других частей интерфейса. Может ли это привести к неоднозначности владения в API. Если да, то, вероятно, указатель не лучший выбор. Это был бы хороший случай для непосредственного использования объекта. Общая чистота API => ОБЪЕКТ.

Если вы используете указатель, обычно вам нужно использовать boost :: unique_ptr, если класс является единственным владельцем, или boost :: shared_ptr, если данные могут совместно использоваться несколькими объектами, потоками и т. Д. Только в редкие обстоятельства необработаны, обычные C ++ указатели на правильный путь. Трудно определить, что это такое.

0 голосов
/ 25 октября 2010

Если «A» не подлежит копированию и назначению, у вас нет выбора, кроме как использовать указатель на «A». Если «A» не копируется и не назначается, у вас не остается выбора, кроме как использовать указатель в «А».

Однако, если предположить, что «A» можно копировать и назначать, то выбор будет зависеть от следующих факторов:

a) Вы действительно хотите, чтобы контейнер / алгоритмы работали с отдельной копией, а не с оригинальным объектом (через указатель)

б) Какое снижение производительности при копировании?

в) Хотите ли вы хранить полиморфные объекты в контейнере, используя указатель?

Я полагаю, что ссылки на RValue в C ++ 0x могут быть полезны в пунктах (a) и (b), но я не уверен.

0 голосов
/ 25 октября 2010

Используйте вектор объектов, когда можете.Используйте вектор указателей, когда это единственный (разумный) способ выполнить то, что вы хотите.Кроме того, вам приходится иметь дело с такими вопросами, как: A владеет объектами в vecA или имеет ссылки только на объекты, принадлежащие чему-то другому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...