2010-09-28 5 views
18

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

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

struct Rectangle { 
    int width; 
    int height; 
}; 

Я считаю, что очень удобно для работы с:

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

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

+1

* структура * в термине "структура данных" делает * нет * средний структура. –

+8

Структуры также являются частью стандарта C++, и вы должны использовать их, когда захотите. – karlphillip

+0

Я не думаю, что с этим что-то не так, если это имеет смысл в контексте, в котором вы работаете. – FrustratedWithFormsDesigner

ответ

33

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

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

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

+19

На самом деле, используется последовательно таким образом, 'struct' надежно сообщает читателям« Я - туманная структура данных ». –

+1

Структуру без модификаторов или методов иногда называют структурой [POD] (http://stackoverflow.com/questions/146452/what-are-pod-types-in-c). Они часто используются в качестве обратного совместимого интерфейса с библиотеками C, поскольку он (предположительно) гарантированно выложен, как если бы это была структура C. Другим основным отличием, которое следует учитывать при использовании structs vs. classes, является то, что видимость элементов в структуре по умолчанию является общедоступной, а не частной. – LBushkin

+0

У вашей структуры не будет конструктора или деструктора. Это может быть улучшение производительности по классам. – phkahler

4

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

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

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

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

+1

OT: недействительный код кода на C++ – erjot

+1

Ему просто нужно его отредактировать и поместить двоеточие (:) после публичных объявлений. –

+0

@erjot heh, спасибо, было пару лет с тех пор, как я на самом деле делал C++, занимался в основном Java, PHP и C#, легко забывал различия в синтаксисе. – Tarka

1

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

1

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

0

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

+3

Так же легко не запускать 'class' как' struct'. –

+2

Вы можете добавить удобные методы в 'struct'. Я не совсем понимаю вашу мысль. – ereOn

+0

@Steve: Как насчет конструктора по умолчанию? Из примера, я думаю, мы могли бы использовать его для установки ширины и высоты на 0. – tia

6

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

1

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

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

+0

Разница между структурой и классом не отличается. На самом деле, другой доступ по умолчанию не имеет никакого различия * между классом и структурой. Я вижу, что вы получаете, следовательно, нет d/v, но я думаю, что вы предполагаете слишком много семантических подробностей о struct vs class. –

+0

@ Джон, я не предполагаю семантических подробностей, я использую семантические детали, как это предусмотрено в начальном вопросе. Это довольно типичное использование; когда вы в последний раз видели, как кто-то кодирует структуру с помощью конструкторов? –

+0

Ранее сегодня. Вчера я написал структуру без тривиального конструктора по умолчанию, но компилятор сделал для меня один, поэтому он все еще не POD. Вы говорите о POD, что не совпадает с тем, что обсуждался в оригинальном вопросе, даже если его пример предоставил один. –

1

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

-1

Я использовал, чтобы сделать следующее:

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

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

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

+0

это то, что я тоже делаю – pm100

+2

Надеюсь, вы не забыли «виртуальный интерфейс»() {} 'тогда ... –

+0

Это не отвечает на вопрос, и я думаю, что это своего рода запах кода , На мой взгляд, структуры должны использоваться только для данных (как это делает OP). C++ позволяет структурам как классы, но не следует использовать такие структуры, как классы. В любом случае, я также должен был бы защитить деструктор. –

1

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

Смежные вопросы