C++ - когда должен, я использую участника указателя в классе

21
задан Dima 24 July 2009 в 16:23
поделиться

4 ответа

Указатель имеет следующие преимущества:

a) Вы можете выполнить отложенную инициализацию, то есть инициализировать / создать объект незадолго до первого реального использования.

b ) Дизайн: если вы используете указатели для членов внешнего типа класса, вы можете разместить предварительное объявление над своим классом и, таким образом, вам не нужно включать заголовки этих типов в свой заголовок - вместо этого вы включаете стороннюю заголовки в вашем .cpp - это имеет то преимущество, что сокращает время компиляции и предотвращает побочные эффекты, включая слишком много других заголовков.

class ExtCamera;  // forward declaration to external class type in "ExtCamera.h"

class MyCamera {
public: 
  MyCamera() : m_pCamera(0) { }

  void init(const ExtCamera &cam);

private:
   ExtCamera  *m_pCamera;   // do not use it in inline code inside header!
};

c) Указатель может быть удален в любое время - так что у вас будет больше контроля над временем жизни и вы сможете воссоздать объект - например, в случае сбоя.

21
ответ дан 29 November 2019 в 06:51
поделиться

Преимущества использования указателя описаны в 3DH: отложенная инициализация, уменьшение зависимостей заголовков и контроль над временем жизни объекта.

Это также недостатки. Когда у вас есть элемент данных-указатель, вам, вероятно, придется написать свой собственный конструктор копирования и оператор присваивания, чтобы убедиться, что копия объекта создается правильно. Конечно, вы также должны не забыть удалить объект в деструкторе. Кроме того, если вы добавляете элемент данных-указатель к существующему классу, вы должны не забыть обновить конструктор копирования и оператор =. Короче говоря, наличие элемента данных-указателя - это больше для вас.

Другой недостаток - это обратная сторона контроля над временем жизни объекта, на который указывает указатель. Члены данных, не являющиеся указателями, уничтожаются автоматически при уничтожении объекта, Это означает, что вы всегда можете быть уверены, что они существуют, пока существует объект. С помощью указателя вы должны проверить, является ли он nullptr , что также означает, что вы должны установить его на nullptr , когда он ни на что не указывает. Необходимость иметь дело со всем этим может легко привести к ошибкам.

Наконец, доступ к элементам, не являющимся указателями, вероятно, будет быстрее, поскольку они непрерывны в памяти. С другой стороны, доступ к элементу данных указателя, указывающему на объект, размещенный в куче, может вызвать промах в кэше, что замедлит его работу.

На ваш вопрос нет однозначного ответа. Вы должны взглянуть на свой дизайн и решить, перевешивают ли преимущества элементов данных-указателей дополнительную головную боль. Если важно сократить время компиляции и зависимости заголовков, используйте идиому pimpl . Если ваш член данных может не понадобиться вашему объекту в определенных случаях, используйте указатель и выделите его при необходимости. Если это не звучит убедительно, и вы не хотите выполнять дополнительную работу, не используйте указатель.

18
ответ дан 29 November 2019 в 06:51
поделиться

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

3
ответ дан 29 November 2019 в 06:51
поделиться

Разместите его в стеке, если можете, из бесплатного хранилища, если необходимо. Здесь есть аналогичный вопрос , где вы найдете все «почему».

Причина, по которой вы часто видите использование указателей, когда дело касается игр и прочего, заключается в том, что DirectX - это COM-интерфейс, и Честно говоря, большинство программистов игр в те времена на самом деле не программисты на C ++, они программисты на C с классами, и в C очень часто используется указатель.

12
ответ дан 29 November 2019 в 06:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: