Estructuras privadas de C++

3 minutos de lectura

avatar de usuario
Dasaru

He leído que las principales diferencias entre las clases y las estructuras (aparte de las funciones) es que los miembros de la clase son privados por defecto, mientras que los miembros de la estructura son públicos por defecto.

Eso implica que los miembros de la estructura pueden ser privados. Mi pregunta es: ¿Pueden tener miembros de estructura privada? Y si puede, ¿cuál es el propósito de usar miembros privados? ¿Cómo accederías a ellos?

  • Accedería a los miembros de la estructura privada de la misma manera que accede a los miembros de la clase privada. La pregunta solo tiene sentido si piensas en estructuras y clases como diferentes. Trate de pensar en ellos como prácticamente idénticos.

    – Pato mugido

    03/04/2015 a las 21:36


avatar de usuario
Guardar

Sí, las estructuras pueden tener miembros privados, solo necesita usar el especificador de acceso para el mismo.

struct Mystruct
{
    private:
       m_data;

};

Las únicas diferencias entre estructura y clase son:

  • el especificador de acceso predeterminado es privado para la clase y público para la estructura
  • la herencia por defecto es privada para la clase y pública para la estructura

¿Cómo puedes acceder a ellos?
Al igual que accede a miembros privados de una clase. es decir: solo se puede acceder a ellas dentro de las funciones miembro de la estructura y no en la estructura derivada, etc.

avatar de usuario
bdonlan

los solamente diferencia entre struct y class es el acceso predeterminado (con la excepción de algunas situaciones de plantillas extrañas, consulte los comentarios de Alf a continuación). Esto significa que puede acceder a miembros privados de la misma manera que en una clase:

struct foo {
  int get_X() { return x; }
  void set_X(int x_) { x = x_; }
private:
  int x;
};

Ya sea que uses struct o class, entonces, es puramente una cuestión de estilo. tiendo a usar struct cuando todos los miembros son públicos (p. ej., si es una clase de funtor sin variables miembro y solo funciones públicas).

  • bueno, con respecto a las palabras clave, también hay una diferencia en una lista de parámetros de plantilla, por ejemplo template< template< class Foo > class Bar >. no puedes escribir eso con struct. 🙂

    – Saludos y hth. – alf

    10 de diciembre de 2011 a las 5:41

  • no puedes usar typename por eso (sería error de sintaxis). Salud,

    – Saludos y hth. – alf

    10 de diciembre de 2011 a las 5:58

  • @AlfP.Steinbach Creo que tengo razón al decir que no se puede usar la palabra clave struct en cualquier tipo de plantillaya que uno debe usar cualquiera class o typename. El hecho de que haya creado el ejemplo utilizando un parámetro de plantilla de plantilla es un poco confuso.

    – NeXus

    10 de diciembre de 2011 a las 6:40

  • @Nexus: Creo que estás hablando de la lista de parámetros de la plantilla y, en ese caso, creo que tienes razón. Usé un parámetro de plantilla de plantilla solo porque ese es un caso en el que el class debe usarse la palabra clave.

    – Saludos y hth. – alf

    10 de diciembre de 2011 a las 6:48


  • @ AlfP.Steinbach Ok, pero lo confuso de tu ejemplo es que template<template <typename Foo> class Bar> class MyClass; es perfectamente legal. Solo quería señalarlo.

    – NeXus

    10 de diciembre de 2011 a las 7:00

Una cosa que hace que esto sea útil es que también puede usar la palabra clave amigo en las estructuras, por lo que los miembros privados solo pueden ser usados ​​y modificados por esas funciones o clases específicas o lo que no desee para poder modificarlo. De esta manera, el usuario no puede modificar esas secciones por sí mismo. Ni siquiera aparecerán en las funciones de autocompletar, al menos en Visual Studio.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad