2011-02-09 17 views
7

Tengo que agregar un objeto de clase como miembro dentro de una estructura c.incluyendo clase como miembro en struct

¿Hay alguna prohibición de hacer esto.

Saludos, iSight

+0

Ha etiquetado su pregunta C y C++. En C++ es ciertamente posible ya que struct es solo un tipo de clase. En C es por supuesto imposible. –

+0

Como struct es más propenso a "C" etiquetado con C también. – boom

Respuesta

1

PUEDE tener un miembro de la clase C++ en C, pero debe verse como un void* en el punto de vista C, para que la C pueda manejarlo bien.

Esta técnica se llama Opaque Pointer.

0

n no lo hay. Echa un vistazo a este ejemplo:

#include<iostream> 

class Foo { 
    public: 
     Foo() { 
      this->i = 1; 
     } 
     int i; 
}; 

struct Bar { 
    Foo foo; 
}; 

int main() { 
    struct Bar bar; 
    std::cout << bar.foo.i << std::endl; 

    return 0; 
} 
+0

Sin embargo, dependiendo de la composición de la clase, la estructura puede perder el estado POD, lo que restringirá algunas operaciones que de otro modo podrían haberse realizado en la estructura. –

+0

¿Qué quieres decir con POD? ¿Puedes aclarar el término para mí? Nunca lo oí. – Kungi

+1

POD = [datos antiguos simples] (http://en.wikipedia.org/wiki/Plain_old_data_structure). – gr0v3r

4

Voy a asumir que estamos hablando de C++, ya que no existe el concepto de una "clase" en C - aunque ciertamente puede tener un struct como miembro de otra struct.

Aparte de un detalle sin importancia, y classstruct son idénticos, y ambos se refieren a menudo como "tipos de clase". Cualquier cosa que pueda hacer con un class (como tener un miembro del tipo de clase), también puede hacerlo con un struct.

Si le interesa, la única diferencia es la accesibilidad predeterminada de los miembros y las clases base; public para struct y private para class.

0

Mientras que la estructura solo se use en código C++, no hay problema. Sin embargo, si la estructura se pasa al código C, pueden ocurrir cosas malas (el destructor no se llama cuando struct se libera/elimina).

Si no ve nada como extern "C" en el archivo de declaración, probablemente esté seguro.

Cuestiones relacionadas