Должен ли я использовать структуры в C ++? - PullRequest
19 голосов
/ 28 сентября 2010

Разница между структурой и классом в C ++ невелика, в основном только то, что члены структуры по умолчанию являются открытыми, а члены класса - по умолчанию закрытыми.

Однако я все еще использую структуры всякий раз, когда мне нужны чистые структуры данных,например:

struct Rectangle {
    int width;
    int height;
};

Мне очень удобно работать с:

Rectangle r;
r.width = 20;
r.height = 10;

Однако структуры данных взяты из процедурного программирования, и я занимаюсь объектно-ориентированным программированием.Это плохая идея, чтобы ввести эту концепцию в ОО?

Ответы [ 10 ]

34 голосов
/ 28 сентября 2010

Нет.Если имеет смысл использовать структуру где-то, зачем вам усложнять вещи, используя что-то другое, не предназначенное для этой цели?

В моих проектах я склонен использовать struct для простых «структур»которые просто должны содержать некоторые тривиальные данные.

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

6 голосов
/ 28 сентября 2010

структуры особенно полезны для инкапсуляции POD (простых старых данных).В struct vs class in C ++

есть еще много всего об этом
4 голосов
/ 28 сентября 2010

На мой взгляд, нет, это неплохая идея.Если вы собираетесь использовать класс таким же образом, как

class Rectangle {
    public:
        int width;
        int height;
};

, то вы также можете использовать struct.Это поможет удостовериться, что вы не забыли объявить что-либо общедоступным, и если вы сделаете это согласованным, то будущие разработчики (включая вас самих) будут знать, что вы задумали это исключительно как объект данных, а не как нечто, имеющее внутри методы.1005 *

Это все еще объект с точки зрения удобства использования, так что нет, он не конфликтует с ОО-дизайном.

1 голос
/ 28 сентября 2010

Нет ничего плохого в использовании структуры в C ++, я стараюсь избегать использования классов, если у меня нет достаточно времени, чтобы спланировать, какова должна быть их цель.

1 голос
/ 28 сентября 2010

Похоже, у вас есть Ferrari Scaglietti и Lamborgini Espada, когда вы ездите на Ferarri, когда вы ездите на Lamborghini .... Когда вы используете struct, иногда вы используете class, есть ли какие-либо true и false?

1 голос
/ 28 сентября 2010

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

См. мой предыдущий вопрос для дальнейшего обсуждения этого вопроса.

1 голос
/ 28 сентября 2010

Я все время использую структуры для таких объектов, как unary_function и тому подобное.На самом деле нет смысла явно объявлять public в классе только с методом operator().Кроме того, это не значит, что вы предлагаете его наследовать.

1 голос
/ 28 сентября 2010

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

0 голосов
/ 28 сентября 2010

Раньше я делал следующее:

struct Interface
{
    virtual ~Interface() {}
    virtual void foo() = 0;
};

class Implementation : public Interface
{
    void foo(); // or public, it depends.
public:
    Implementation(...);
};

, поскольку по умолчанию в интерфейсе все члены являются открытыми, а в реализациях по умолчанию члены являются частными.

0 голосов
/ 28 сентября 2010

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

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