Pergunta

Em quais cenários é melhor usar um struct contra um class em C++?

Foi útil?

Solução

Diferenças entre um class e um struct em C++ são que as estruturas têm padrão public membros e bases e classes têm padrão private membros e bases.Ambas as classes e estruturas podem ter uma mistura de public, protected e private membros, podem usar herança e podem ter funções de membro.

Eu recomendaria usar structs como estruturas de dados simples e antigas, sem quaisquer recursos semelhantes a classes, e usar classes como estruturas de dados agregadas com private dados e funções de membro.

Outras dicas

Como todos observam, existem apenas duas diferenças reais de idioma:

  • struct o padrão é o acesso público e class o padrão é acesso privado.
  • Ao herdar, struct o padrão é public herança e class o padrão é private herança.(Ironicamente, como acontece com tantas coisas em C++, o padrão é inverso: public a herança é de longe a escolha mais comum, mas as pessoas raramente declaram structé só para economizar digitando o "public"palavra-chave.

Mas a verdadeira diferença na prática é entre um class/struct que declara um construtor/destruidor e outro que não o faz.Existem certas garantias para um tipo de POD de "dados simples", que não se aplicam mais quando você assume a construção da classe.Para manter esta distinção clara, muitas pessoas usam deliberadamente apenas structs para tipos de POD e, se eles forem adicionar algum método, use classé.A diferença entre os dois fragmentos abaixo não tem sentido:

class X
{
  public:

  // ...
};

struct X
{
  // ...
};

(Aliás, aqui está um tópico com algumas boas explicações sobre o que "tipo POD" realmente significa: Quais são os tipos de POD em C++?)

Existem muitos equívocos nas respostas existentes.

Ambos class e struct declarar uma classe.

Sim, pode ser necessário reorganizar suas palavras-chave de modificação de acesso dentro da definição de classe, dependendo de qual palavra-chave você usou para declarar a classe.

Mas, além da sintaxe, o apenas a razão para escolher um em vez do outro é convenção/estilo/preferência.

Algumas pessoas gostam de ficar com o struct palavra-chave para classes sem funções-membro, porque a definição resultante "se parece" com uma estrutura simples de C.

Da mesma forma, algumas pessoas gostam de usar o class palavra-chave para classes com funções de membro e private dados, porque diz "classe" neles e, portanto, parecem exemplos de seu livro favorito sobre programação orientada a objetos.

A realidade é que isso depende inteiramente de você e de sua equipe e não fará literalmente nenhuma diferença para o seu programa.

As duas classes a seguir são absolutamente equivalentes em todos os aspectos, exceto no nome:

struct Foo
{
   int x;
};

class Bar
{
public:
   int x;
};

Você pode até trocar palavras-chave ao redeclarar:

class Foo;
struct Bar;

(embora isso quebra as compilações do Visual Studio devido à não conformidade, para que o compilador emita um aviso quando você fizer isso.)

e as seguintes expressões são avaliadas como verdadeiras:

std::is_class<Foo>::value
std::is_class<Bar>::value

Observe, porém, que você não pode mudar as palavras-chave quando redefinindo;isso ocorre apenas porque (de acordo com a regra de definição única) definições de classe duplicadas em unidades de tradução devem "consiste na mesma sequência de tokens".Isso significa que você não pode nem trocar const int member; com int const member;, e não tem nada a ver com a semântica de class ou struct.

A única vez que uso uma estrutura em vez de uma classe é ao declarar um functor logo antes de usá-lo em uma chamada de função e quero minimizar a sintaxe para maior clareza.por exemplo.:

struct Compare { bool operator() { ... } };
std::sort(collection.begin(), collection.end(), Compare()); 

De Perguntas frequentes sobre C++ Lite:

Os membros e classes base de uma estrutura são públicos por padrão, enquanto na classe eles são privados por padrão.Observação:você deve tornar suas classes base explicitamente públicas, privadas ou protegidas, em vez de confiar nos padrões.

struct e class são funcionalmente equivalentes.

OK, chega dessa conversa estridente de techno limpo.Emocionalmente, a maioria dos desenvolvedores faz uma forte distinção entre uma classe e uma estrutura.Uma estrutura simplesmente parece uma pilha aberta de bits com muito pouco encapsulamento ou funcionalidade.Uma classe se sente como um membro vivo e responsável da sociedade, com serviços inteligentes, uma forte barreira de encapsulamento e uma interface bem definida.Como essa é a conotação que a maioria das pessoas já tem, você provavelmente deveria usar a palavra-chave struct se tiver uma classe que tenha poucos métodos e dados públicos (essas coisas existem em sistemas bem projetados!), mas caso contrário, você provavelmente deveria usar a classe palavra-chave.

Um lugar onde uma estrutura tem sido útil para mim é quando tenho um sistema que recebe mensagens de formato fixo (por exemplo, uma porta serial) de outro sistema.Você pode converter o fluxo de bytes em uma estrutura que define seus campos e acessá-los facilmente.

typedef struct
{
    int messageId;
    int messageCounter;
    int messageData;
} tMessageType;

void processMessage(unsigned char *rawMessage)
{
    tMessageType *messageFields = (tMessageType *)rawMessage;
    printf("MessageId is %d\n", messageFields->messageId);
}

Obviamente, isso é a mesma coisa que você faria em C, mas acho que a sobrecarga de ter que decodificar a mensagem em uma classe geralmente não vale a pena.

Você pode usar "struct" em C++ se estiver escrevendo uma biblioteca cujos componentes internos são C++, mas a API pode ser chamada por código C ou C++.Você simplesmente cria um único cabeçalho que contém estruturas e funções de API globais que você expõe ao código C e C++ como este:

// C access Header to a C++ library
#ifdef __cpp
extern "C" {
#endif

// Put your C struct's here
struct foo
{
    ...
};
// NOTE: the typedef is used because C does not automatically generate
// a typedef with the same name as a struct like C++.
typedef struct foo foo;

// Put your C API functions here
void bar(foo *fun);

#ifdef __cpp
}
#endif

Então você pode escrever uma função bar() em um arquivo C++ usando código C++ e torná-la chamável a partir de C e os dois mundos podem compartilhar dados através das estruturas declaradas.Existem outras advertências, é claro, ao misturar C e C++, mas este é um exemplo simplificado.

Como todos dizem, a única diferença real é o acesso padrão.Mas eu particularmente uso struct quando não quero nenhum tipo de encapsulamento com uma classe de dados simples, mesmo que eu implemente alguns métodos auxiliares.Por exemplo, quando preciso de algo assim:

struct myvec {
    int x;
    int y;
    int z;

    int length() {return x+y+z;}
};

Estruturas (PODs, de maneira mais geral) são úteis quando você fornece uma interface compatível com C com uma implementação C++, já que são portáveis ​​além das fronteiras da linguagem e dos formatos de vinculador.

Se isso não é uma preocupação para você, suponho que o uso de "struct" em vez de "class" seja um bom comunicador de intenções (como @ZeroSignal disse acima).As estruturas também têm uma semântica de cópia mais previsível, portanto são úteis para dados que você pretende gravar em mídia externa ou enviar pela rede.

As estruturas também são úteis para várias tarefas de metaprogramação, como modelos de características que apenas expõem um monte de typedefs dependentes:

template <typename T> struct type_traits {
  typedef T type;
  typedef T::iterator_type iterator_type;
  ...
};

... Mas isso é apenas aproveitar o fato de o nível de proteção padrão da struct ser público ...

Para C++, realmente não há muita diferença entre estruturas e classes.A principal diferença funcional é que os membros de uma estrutura são públicos por padrão, enquanto são privados por padrão nas classes.Caso contrário, no que diz respeito à linguagem, são equivalentes.

Dito isso, costumo usar estruturas em C++ como faço em C#, semelhante ao que Brian disse.As estruturas são contêineres de dados simples, enquanto as classes são usadas para objetos que precisam atuar nos dados, além de apenas mantê-los.

Para responder à minha própria pergunta (descaradamente), como já mencionado, os privilégios de acesso são a única diferença entre eles em C++.

Costumo usar uma estrutura apenas para armazenamento de dados.Permitirei que ele obtenha algumas funções auxiliares se isso facilitar o trabalho com os dados.No entanto, assim que os dados exigirem controle de fluxo (ou seja,getters/setters que mantêm ou protegem um estado interno) ou começa a adquirir qualquer funcionalidade importante (basicamente mais semelhante a um objeto), ele será 'atualizado' para uma classe para comunicar melhor a intenção.

Eles são praticamente a mesma coisa.Graças à magia do C++, uma estrutura pode conter funções, usar herança, criada usando “new” e assim por diante, assim como uma classe

A única diferença funcional é que uma classe começa com direitos de acesso privados, enquanto uma estrutura começa com públicos.Esta é a manutenção da compatibilidade retroativa com C.

Na prática, sempre usei structs como detentores de dados e classes como objetos.

Aula.

Os membros da classe são privados por padrão.

class test_one {
    int main_one();
};

É equivalente a

class test_one {
  private:
    int main_one();
};

Então, se você tentar

int two = one.main_one();

Receberemos um erro: main_one is private porque não é acessível.Podemos resolvê -lo inicializando -o especificando seu público, ou seja,

class test_one {
  public:
    int main_one();
};

Estrutura.

Uma struct é uma classe onde os membros são públicos por padrão.

struct test_one {
    int main_one;
};

Significa main_one é privado, ou seja

class test_one {
  public:
    int main_one;
};

Eu uso estruturas para estruturas de dados em que os membros podem assumir qualquer valor, é mais fácil assim.

eles são a mesma coisa com padrões diferentes (privado por padrão para class, e público por padrão para struct), então, em teoria, eles são totalmente intercambiáveis.

então, se eu quiser apenas empacotar algumas informações para movimentar, eu uso uma estrutura, mesmo que eu coloque alguns métodos lá (mas não muitos).Se for algo opaco, onde o uso principal seria por meio de métodos, e não diretamente para os membros dos dados, eu uso uma classe completa.

As estruturas por padrão têm acesso público e as classes por padrão têm acesso privado.

Pessoalmente eu uso estruturas para objetos de transferência de dados ou como objetos de valor.Quando usado como tal, declaro todos os membros como const para evitar modificações por outro código.

Uma vantagem de struct sobre class é que ele economize uma linha de código, se aderir a "primeiro membros públicos, depois privados".Sob esta luz, encontro a palavra-chave class inútil.

Aqui está outra razão para usar apenas struct e nunca class.Algumas diretrizes de estilo de código para C++ sugerem o uso de letras minúsculas para macros de função, a justificativa é que quando a macro é convertida em uma função embutida, o nome não precisa ser alterado.Mesmo aqui.Você tem sua bela estrutura estilo C e um dia descobre que precisa adicionar um construtor ou algum método conveniente.Você muda para um class?Em todos os lugares?

Distinguir entre structareia classÉ muito complicado atrapalhar o que deveríamos fazer - programar.Como muitos dos problemas do C++, ele surge do forte desejo de compatibilidade com versões anteriores.

Tecnicamente, ambos são iguais em C++ - por exemplo, é possível que uma estrutura tenha operadores sobrecarregados, etc.

No entanto :

Eu uso estruturas quando desejo passar informações de vários tipos simultaneamente, uso classes quando estou lidando com um objeto "funcional".

Espero que ajude.

#include <string>
#include <map>
using namespace std;

struct student
{
    int age;
    string name;
    map<string, int> grades
};

class ClassRoom
{
    typedef map<string, student> student_map;
  public :
    student getStudentByName(string name) const 
    { student_map::const_iterator m_it = students.find(name); return m_it->second; }
  private :
    student_map students;
};

Por exemplo, estou retornando um aluno struct nos métodos get...() aqui - aproveite.

Quando você escolheria usar a STRUCT e quando usar a classe no C ++?

eu uso struct quando eu definir functors e POD.Caso contrário eu uso class.

// '()' is public by default!
struct mycompare : public std::binary_function<int, int, bool>
{
    bool operator()(int first, int second)
    { return first < second; }
};

class mycompare : public std::binary_function<int, int, bool>
{
public:
    bool operator()(int first, int second)
    { return first < second; }
};

Eu uso estruturas quando preciso criar um tipo ou functor POD.

Todos os membros da classe são privados por padrão e todos os membros da estrutura são públicos por padrão.A classe possui bases privadas padrão e Struct possui bases públicas padrão.A estrutura no caso de C não pode ter funções de membro, enquanto no caso de C++ podemos ter funções de membro sendo adicionadas à estrutura.Além dessas diferenças, não acho nada de surpreendente nelas.

Como outros apontaram

  • ambos são equivalentes, exceto a visibilidade padrão
  • pode haver razões para ser forçado a usar um ou outro por qualquer motivo

Há uma recomendação clara sobre quando usar o Stroustrup/Sutter:

Use class se a classe tiver uma invariante;use struct se os membros dos dados puderem variar independentemente

No entanto, tenha em mente que não é aconselhável encaminhar declarar sth.como uma classe (class X;) e defina-o como struct (struct X { ... }).Ele pode funcionar em alguns linkers (por exemplo, g++) e falhar em outros (por exemplo, MSVC), então você se encontrará no inferno dos desenvolvedores.

Eu uso struct somente quando preciso manter alguns dados sem nenhuma função de membro associada a eles (para operar nos dados do membro) e para acessar as variáveis ​​de dados diretamente.

Por exemplo:Leitura/gravação de dados de arquivos e fluxos de soquete, etc.Passar argumentos de função em uma estrutura onde os argumentos de função são muitos e a sintaxe da função parece muito longa.

Tecnicamente não há grande diferença entre classe e estrutura, exceto a acessibilidade padrão.Mais do que isso depende do estilo de programação de como você o usa.

Eu pensei que Structs era uma estrutura de dados (como uma matriz de informações do tipo multidados) e as classes eram destinadas ao empacotamento de código (como coleções de sub-rotinas e funções).

:(

Eu nunca uso "struct" em C++.

Não consigo imaginar um cenário em que você usaria uma estrutura quando deseja membros privados, a menos que esteja deliberadamente tentando ser confuso.

Parece que usar structs é mais uma indicação sintática de como os dados serão usados, mas prefiro apenas fazer uma classe e tentar deixar isso explícito no nome da classe, ou através de comentários.

Por exemplo.

class PublicInputData {
    //data members
 };
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top