A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

Creando nuestra primera estructura

5/16
Recursos

Aportes 10

Preguntas 7

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

Cuando creamos una variable as铆:

Persona p = Persona();

Lo que hace el compilador es que aparta un espacio de memoria del tama帽o necesario para almacenar una estructura que contenga un nombre y una edad.

A ese espacio le llamamos 鈥減鈥, y de hecho como ah铆 a煤n no le ponemos valores, est谩n vac铆os en la memoria.

Cuando creamos una variable as铆:

Persona *p = new Persona();

Lo que hacemos antes del 鈥=鈥, es NO reservar un espacio de memoria para almacenar una persona, simplemente creamos una variable 鈥減鈥 que puede almacenar una direcci贸n de memoria, y le decimos que almacenar谩 de hecho una direcci贸n que apuntar谩 a una persona m谩s adelante.

Luego, cuando llega al 鈥渘ew Persona()鈥, que de hecho ese ya se ejecuta cuando ejecutamos el programa, no cuando compilamos, lo que pasar谩 es que ah铆 si, apartar谩 en memoria un espacio suficiente para almacenar una persona, obtendr谩 su puntero, y ese puntero ser谩 el que almacenar谩 en p.

Por lo tanto no son exactamente iguales, aunque para fines pr谩cticos puedan ser equivalentes, internamente C++ los maneja distinto, y podemos utilizar uno u otro seg煤n lo que necesitemos m谩s adelante.

Persona p = Persona();

Crea un objeto del tipo Persona en el stack de manera est谩tica (al tiempo de compilaci贸n), mientras que:

Persona *p = new Persona();

Crea un objeto del tipo Persona en el heap de manera din谩mica (al tiempo de ejecuci贸n)
La memoria dinamica que reservamos con new en el heap, debemos liberarla para no generar memory leaks o p茅rdidas de memoria. Para liberar un objeto reservado con new se utiliza:

delete p;

una vez que ya no lo necesitamos mas al objeto.

Les dejo el codig贸 de la clase usando un metodo constructor en la struct 馃槂

#include <iostream>
#include <string>

using namespace std;

struct Person {
  string name;
  int age;

  // Constructor
  Person(string n, int a) {
    name = n;
    age = a;
  }
};

int main() {
  // Traditional way
  Person zero = Person("Eliaz", 14);
  cout << zero.name << endl;

  // Dynamic gestion of memory
  Person *p = new Person("Zero Requiem", 14);
  cout << p->age << endl;
}

Si quiere ver el resto de mi codig贸 les dejo el repositorio aqu铆.

Peque帽o resumen

int main()
{
  // Se reserva al compilar
  Persona p = Persona();
  p.nombre = "Diana";
  p.edad = 26;
  cout << p.nombre << endl;
  cout << p.edad << endl;

  // Gestiona la memoria de forma din谩mica
  Persona *a = new Persona();
  a->nombre = "Diana";
  a->edad = 26;
  cout << a->nombre << endl;
  cout << a->edad << endl;
}

Dejo el c贸digo que hice con notas sobre la clase.

#include <iostream>

using namespace std;

struct Persona
{
    string nombre;
    int edad;
};


int main(int argc, char const *argv[])
{
                  
    /*
    Sin punteros
    Desde el proceso de compilaci贸n se crea la
    variable de tipo Persona y 
    reserva su memoria
    */
    Persona p = Persona();
    p.nombre = "Ana";
    p.edad = 18;
    cout <<"Se llama " << p.nombre << " y tiene " << p.edad << " a帽os" <<endl ;

    /*
    Con punteros
    Se hace por Memoria Din谩mica
    La variable de tipo Persona se crea durante la ejecuci贸n 
    */
    Persona *p_2 = new Persona();   //Se usa la palabra reservada 'new'
    p_2-> nombre = "Bruno";         //Se utiliza la notaci贸n de flecha
    p_2-> edad = 17;
    cout <<"Se llama " << p_2->nombre << " y tiene " << p_2->edad << " a帽os" <<endl ;

    //Tama帽o
    cout << "El tama帽o de p es: "<< sizeof(p) << endl;
    cout << "El tama帽o de p.nombre es: "<< sizeof(p.nombre) << endl;
    cout << "El tama帽o de p.edad es: " << sizeof(p.edad) << endl;

    
    return 0;
}


Ejemplo de clase:

#include <iostream>
#include <string>

using namespace std;

struct Person {
  string name;
  int age;
};

int main() {

  // memory is assigned dinamically (execution time)
  Person *somePerson2 = new Person();
  somePerson2->name = "Anders2";
  // class member and object memory adress
  cout << &somePerson2->name << endl;
  cout << somePerson2 << endl;

  // class member value
  cout << somePerson2->name << endl;

  // memory is assigned statically (compilation time)
  Person somePerson = Person();
  somePerson.name = "Anders";
  cout << somePerson.name << endl;
}

Una analog铆a sencilla y tonta para comprender la diferencia entre la asignaci贸n de memoria din谩mica y est谩tica a las instancias de una clase ser铆a:

Est谩tica:
Ordenar un plato de comida en un restaurant cuando se te solicita tu orden por primera vez. (se te asigna un platillo ANTES de que te traigan tu orden)

Din谩mica:
Ordenar un plato de comida cuando se te solicita retirarte del restaurant por no ordenar nada. (se te asigna un platillo CUANDO debes decidir pedir tu orden)

Nota: En el contexto del restaurant siempre estar谩n dispuestos a asignarte un plantillo.

Complementando la inicializaci贸n por asignaci贸n de memoria en tiempo de compilaci贸n:

Persona p = { "Diana", 26 };

En esta sintaxis es importante escribir los valores en el orden en que fueron declaradas las propiedades de la estructura.

Waao no sabia que se podia hacer esto con los struct

Cada pasito mas cerca de terminar la carrera!