2009-01-10 22 views
9

¿Hay alguna ventaja sobre el uso de una clase sobre una estructura en casos como estos? (Nota: sólo se llevará a cabo las variables, nunca habrá funciones)Clase vs Struct solo para datos?

class Foo { 
private: 
    struct Pos { int x, y, z }; 
public:  
    Pos Position; 
}; 

Versus:

struct Foo { 
    struct Pos { int x, y, z } Pos; 
}; 

preguntas similares:

+0

typo: debe ser {int x, y, z; } –

Respuesta

18

No hay ninguna ventaja real de utilizar uno sobre el otro, en C++, la única diferencia entre una estructura y una clase es la visibilidad por defecto de sus miembros (estructuras por defecto para el público, por defecto clases de privado).

Personalmente, tiendo a preferir las estructuras para los tipos de POD y uso las clases para todo lo demás.

EDIT: litb hizo un buen punto en el comentario, así que le voy a citar aquí:

otra diferencia importante es que estructuras derivan de otras clases estructura pública/por defecto, mientras que las clases derivan privadamente por por defecto.

+6

una diferencia importante es que las estructuras derivan de otras clases/struct public de forma predeterminada, mientras que las clases se derivan de forma privada por defecto. –

-1

"(nota: sólo mantendrá las variables, nunca habrá funciones)"

Nunca es una palabra grande. Por lo general, "nunca" significa "eventualmente". Como ese es el caso, te sugiero que uses una clase. De esa manera, cuando las cosas cambian, no tienes mucho que cambiar.

La gente de Java (y Python) se han llevado bien con todo siendo una clase. No les ha hecho daño el no tener estas clases especializadas sin método que C++ llama una "estructura".

+1

Sí, pero hay casos en los que debe usar tipos de compuestos C++ con código C, llamadas al sistema, etc. Para enfatizar que un tipo de datos C++ es, y seguirá siendo, nada más que C datos antiguos, prefiero denotarlo como estructura En todos los demás casos, uso clases. –

+0

Y, en consecuencia, refactorizarlo en una clase es bastante trivial en el improbable caso de que se vuelva útil. Apuesto a que hay una herramienta en VS para que lo haga por ti, y en otros lugares también si no estás usando VS. – dkretz

2

La única diferencia entre una clase y una estructura es que los miembros de la estructura son públicos por defecto y los miembros de la clase son privados por defecto. Así que digo ir con el que más te guste. Estoy seguro de que hay argumentos para hacer en términos de cuál es más legible, pero realmente no creo que sea un gran problema.

5

struct y class media exactamente lo mismo en C++ con la excepción de que el acceso por defecto para los miembros de la estructura y las bases es público que es privado para las clases. Tiendo a elegir struct para las clases que solo tienen miembros públicos y clases para todo lo demás, pero es solo un problema de estilo.

0

Si el contenido del tipo no tiene problemas de asignación de memoria (como plain int), entonces usar struct está bien si esa es la forma en que desea ir y ha tomado una decisión consciente al respecto que puede justificar aquellos que usan tu código Sin embargo, si alguno de los miembros es un tipo de puntero, entonces necesita pensar mucho sobre los problemas de administración de memoria.Todavía puede estar bien usar un struct, pero es mucho más probable que necesite un destructor, y algunos constructores, y así sucesivamente. En ese punto, quiere un class.

+1

En C++ también es posible agregar constructores y métodos a 'struct's. – MKroehnert

1

Esencialmente, la elección entre una estructura y una clase se reduce a su estilo y la cantidad que desea escribir.

  • Si solo tiene miembros públicos en una clase/estructura, también podría utilizar la palabra clave struct. Le ahorrará tener que escribir "public:" más adelante.
  • La otra razón para elegir una estructura sobre una clase sería documentar implícitamente la intención del objeto. Entonces haría estructuras de tipos POD (incluso si contienen un constructor y algunos métodos estáticos de ayuda, etc.), y usaría clase para todas las otras clases "regulares".
6

Un punto es que las estructuras se utilizan a menudo para estructuras de datos inicializadas agregadas, ya que todos los miembros de datos no estáticos deben ser públicos de todos modos (C++ 03, 8.5.1/1).

struct A { // (valid) 
{ 
    int a; 
    int b; 
} x = { 1, 2 }; 

struct A { // (invalid) 
private: 
    int a; 
    int b; 
} x = { 1, 2 }; 

class A { // (invalid) 
    int a; 
    int b; 
} x = { 1, 2 }; 

class A { // (valid) 
public: 
    int a; 
    int b; 
} x = { 1, 2 }; 

class A { // (invalid) 
public: 
    int a; 
private: 
    int b; 
} x = { 1, 2 };