Excelente video profe, tengo una duda, #pragma y #ifndef no se usan para lo mismo, osea puedo usar cualquiera de los 2, o se recomienda usarlos en conjunto???
Hola Código. Sí, se usan para lo mismo. Lo que ocurre es que los header guards (#ifndef y demás) son los oficiales de C++, mientras que #pragma once es una directiva de preprocesador que no está estandarizada en C++ y algún compilador puede no interpretarla, aunque no los más usados. En el curso ya vimos que es muy común que en las librerías estándar se usen los dos, ya que no provocan ningún problema de compatibilidad ni sobrecarga y evitan que haya problemas con algún compilador que no admita pragma, así que se pueden usar los dos sin problemas. Saludos.
Sera posible crear en Unreal Engine con C++ algunas clases precompiladas como explicas en este video para ahorrar un poco de tiempo??... Muchas gracias!!!
Hola Ariel. Sí, claro. La mayoría de las Clases que se usan en Unreal siguen este patrón y son miles las Clases preconstruidas con las que cuenta Unreal. Incluso cuenta con un wizard para importarlas y personalizarlas: docs.unrealengine.com/4.27/en-US/ProductionPipelines/DevelopmentSetup/ManagingGameCode/CppClassWizard/ Unreal cuenta también con un modo denominado IMYU (incluir solo lo que se usa) que permite precompilar tanto código como encabezados, con los denominados archivos PCH. Con IMYU cada archivo solo incluye lo que nuestro juego o aplicación necesite, minimizando los tiempos de compilación. No suele estar activado de modo predeteminado, pero puede ver su funcionamiento en la documentación de Unreal: docs.unrealengine.com/4.27/en-US/ProductionPipelines/BuildTools/UnrealBuildTool/IWYU/
Tengo una duda,es correcto inicializar una variable en el archivo h o mejor seria en el archivo cpp.Lo que pasa es que no se como inicializar la variable en el archivo cpp sin usar el constructor de la clase.
Hola Manuel: * De modo general, todas las variables miembro se deben definir dentro de la Clase. Si la Clase está definida en el header, se deben definir en el header. * Además como mejor práctica se deben inicializar siempre al definirlas, así que también se inicializarían en el header. * Pero ya hemos visto que es posible inicializarla en el constructor, con la inicialización de miembros no-static, que no se encuentra en el prototipo, sino en la definición completa del constructor, así que de este modo sí se puede inicializar una variable fuera de la Clase(y del header), pero sólo en ese caso. *En otros puedes asignarlas, no inicializarlas, siempre que no sean privadas, o si son privadas, a través de funciones miembro, pero sería asignación, no inicialización. No sé si queda claro, si hay dudas ponga algún ejemplo del código con el que está trabajando para tratar sobre algo más concreto. Saludos.
@@0utKast Hace unos meses estuve probando una biblioteca de videojuegos para ruby y en ella se recomendaba que a la hora de cargar una imagen,se hiciera al inicializar la variable y no en el constructor,porque era mas optimo,y por eso queria saber cual era la forma correcta de hacerlo en c++. *Pongo ejemplo con codigo ruby: ------------------------------------------------------------------------------------------------ require 'dxruby' class MySprite < Sprite @@image = Image.new(100, 100, C_WHITE) def initialize super self.x = 0 self.y = 100 self.image = @@image end def update self.x += 1 end end s = MySprite.new Window.loop do s.update s.draw end ----------------------------------------------------------------------
Si se refiere a inicializarla en la definición de la Clase, no puede tener ninguna repercusión en el rendimiento. Las variables siempre se aconseja inicializarlas al definirlas, pero se suele hacer por valor, vacías. La definición de la clase es solo diseño y no crea realmente nada hasta que instanciemos un Objeto, es en ese momento cuando se asigna espacio en memoria y cuando se inicializa todo lo que la clase necesite. Si necesita algo que se cargue ya cuando se inicie el programa, tendría entonces que declarar la variable como Global, con lo que ya se cargaría cuando se inicie el programa y luego podría llamarla desde la Clase si la necesita, pero en el diseño de la Clase no puede tener ningún beneficio en el rendimiento.
Saludos maestro Jesús. Tengo un par de dudas: ¿Qué significa el [[nodiscard]] en la declaración [[nodiscard]] virtual int NStateVariables() const = 0; ? Por otro lado, en el siguiente código, el bloque del medio es para "importar" clases y templates de clases? #ifndef TPZMATERIAL_H #define TPZMATERIAL_H #include "TPZSavable.h" #include "TPZMatTypes.h" class TPZStream; class TPZMaterialData; template class TPZVec; template class TPZFMatrix; class TPZMaterial : public virtual TPZSavable{ ... cuerpo de la clase ...}; Gracias de antemano.
Hola Ricardo. Respecto a [[nodiscard]] es un atributo de función que se puede usar en C++ para indicar que el valor de retorno de una función no debe descartarse. Esto significa que si esa función es llamada y el programador no utiliza el valor de retorno en el código, ese atributo alertará al programador que debe usar ese valor de retorno. En este ejemplo la función devuelve un entero y con el uso de [[nodiscard]] se intenta prevenir que ese valor no quede sin utilizar. El atributo [[nodiscard]] se puede encontrar en la sección 7.1.5 del estándar de C++ (N4659). Aquí está el enlace a la sección en cuestión: eel.is/c++draft/dcl.attr.nodiscard En cuanto a las líneas de codigo, sí están importando declaraciones de clase y plantillas de clases. Son clases y plantillas de clase que no están definidas en este archivso, sino que se incluyen para poder utilizarlas en la clase TPZMaterial. Se están importando las de declaraciones de la clase PTZStream, la clase TPZMaterialData y la plantilla de clase TPZVec, que se utilizarán en la clase TPZMaterial. Un saludo.
Profe muchas gracias usted es genial, no dude que esta ganado mucho buen karma, gracias profe
Buen tutorial mestro
Estupendo maestro, gracias. 😊
Hola, muchas gracias
Muy buen tutorial.
Gracias, saludos
Excelente video profe, tengo una duda, #pragma y #ifndef no se usan para lo mismo, osea puedo usar cualquiera de los 2, o se recomienda usarlos en conjunto???
Hola Código. Sí, se usan para lo mismo. Lo que ocurre es que los header guards (#ifndef y demás) son los oficiales de C++, mientras que #pragma once es una directiva de preprocesador que no está estandarizada en C++ y algún compilador puede no interpretarla, aunque no los más usados. En el curso ya vimos que es muy común que en las librerías estándar se usen los dos, ya que no provocan ningún problema de compatibilidad ni sobrecarga y evitan que haya problemas con algún compilador que no admita pragma, así que se pueden usar los dos sin problemas.
Saludos.
Sera posible crear en Unreal Engine con C++ algunas clases precompiladas como explicas en este video para ahorrar un poco de tiempo??... Muchas gracias!!!
Hola Ariel. Sí, claro. La mayoría de las Clases que se usan en Unreal siguen este patrón y son miles las Clases preconstruidas con las que cuenta Unreal. Incluso cuenta con un wizard para importarlas y personalizarlas:
docs.unrealengine.com/4.27/en-US/ProductionPipelines/DevelopmentSetup/ManagingGameCode/CppClassWizard/
Unreal cuenta también con un modo denominado IMYU (incluir solo lo que se usa) que permite precompilar tanto código como encabezados, con los denominados archivos PCH. Con IMYU cada archivo solo incluye lo que nuestro juego o aplicación necesite, minimizando los tiempos de compilación. No suele estar activado de modo predeteminado, pero puede ver su funcionamiento en la documentación de Unreal:
docs.unrealengine.com/4.27/en-US/ProductionPipelines/BuildTools/UnrealBuildTool/IWYU/
@@0utKast gracias!
Tengo una duda,es correcto inicializar una variable en el archivo h o mejor seria en el archivo cpp.Lo que pasa es que no se como inicializar la variable en el archivo cpp sin usar el constructor de la clase.
Hola Manuel:
* De modo general, todas las variables miembro se deben definir dentro de la Clase. Si la Clase está definida en el header, se deben definir en el header.
* Además como mejor práctica se deben inicializar siempre al definirlas, así que también se inicializarían en el header.
* Pero ya hemos visto que es posible inicializarla en el constructor, con la inicialización de miembros no-static, que no se encuentra en el prototipo, sino en la definición completa del constructor, así que de este modo sí se puede inicializar una variable fuera de la Clase(y del header), pero sólo en ese caso.
*En otros puedes asignarlas, no inicializarlas, siempre que no sean privadas, o si son privadas, a través de funciones miembro, pero sería asignación, no inicialización.
No sé si queda claro, si hay dudas ponga algún ejemplo del código con el que está trabajando para tratar sobre algo más concreto.
Saludos.
@@0utKast Hace unos meses estuve probando una biblioteca de videojuegos para ruby y en ella se recomendaba que a la hora de cargar una imagen,se hiciera al inicializar la variable y no en el constructor,porque era mas optimo,y por eso queria saber cual era la forma correcta de hacerlo en c++.
*Pongo ejemplo con codigo ruby:
------------------------------------------------------------------------------------------------
require 'dxruby'
class MySprite < Sprite
@@image = Image.new(100, 100, C_WHITE)
def initialize
super
self.x = 0
self.y = 100
self.image = @@image
end
def update
self.x += 1
end
end
s = MySprite.new
Window.loop do
s.update
s.draw
end
----------------------------------------------------------------------
Si se refiere a inicializarla en la definición de la Clase, no puede tener ninguna repercusión en el rendimiento. Las variables siempre se aconseja inicializarlas al definirlas, pero se suele hacer por valor, vacías. La definición de la clase es solo diseño y no crea realmente nada hasta que instanciemos un Objeto, es en ese momento cuando se asigna espacio en memoria y cuando se inicializa todo lo que la clase necesite. Si necesita algo que se cargue ya cuando se inicie el programa, tendría entonces que declarar la variable como Global, con lo que ya se cargaría cuando se inicie el programa y luego podría llamarla desde la Clase si la necesita, pero en el diseño de la Clase no puede tener ningún beneficio en el rendimiento.
@@0utKast Gracias por la ayuda. :)
Saludos maestro Jesús. Tengo un par de dudas: ¿Qué significa el [[nodiscard]] en la declaración [[nodiscard]] virtual int NStateVariables() const = 0; ? Por otro lado, en el siguiente código, el bloque del medio es para "importar" clases y templates de clases?
#ifndef TPZMATERIAL_H
#define TPZMATERIAL_H
#include "TPZSavable.h"
#include "TPZMatTypes.h"
class TPZStream;
class TPZMaterialData;
template
class TPZVec;
template
class TPZFMatrix;
class TPZMaterial : public virtual TPZSavable{ ... cuerpo de la clase ...};
Gracias de antemano.
Hola Ricardo. Respecto a [[nodiscard]] es un atributo de función que se puede usar en C++ para indicar que el valor de retorno de una función no debe descartarse. Esto significa que si esa función es llamada y el programador no utiliza el valor de retorno en el código, ese atributo alertará al programador que debe usar ese valor de retorno. En este ejemplo la función devuelve un entero y con el uso de [[nodiscard]] se intenta prevenir que ese valor no quede sin utilizar.
El atributo [[nodiscard]] se puede encontrar en la sección 7.1.5 del estándar de C++ (N4659). Aquí está el enlace a la sección en cuestión:
eel.is/c++draft/dcl.attr.nodiscard
En cuanto a las líneas de codigo, sí están importando declaraciones de clase y plantillas de clases. Son clases y plantillas de clase que no están definidas en este archivso, sino que se incluyen para poder utilizarlas en la clase TPZMaterial. Se están importando las de declaraciones de la clase PTZStream, la clase TPZMaterialData y la plantilla de clase TPZVec, que se utilizarán en la clase TPZMaterial.
Un saludo.
@@0utKast Su trabajo no tiene precio. Muchas gracias.