0

Tengo un problema, estoy traduciendo un programa de Matlab a C++ utilizando Armadillo, y la estructura en Matlab es parecido a esto:

struct demo_nile{
    int T=1;
    mat gam[];
    int R=1;
    int Z=1;
    mat D[];
    int C=1;
    mat S[];
    float Q=10^(p(0,0);
    float H=10^(p(0,1));
    mat p;


};

Las variables Q y H dependen de otra variable, ¿existe alguna manera de representarlas? ¿Puedo meter estructuras dentro de otras estructuras?

Huanmer
  • 9
  • 3
  • "*¿Puedo meter estructuras dentro de otras estructuras?*" Si. "*Las variables Q y H dependen de otra variable, ¿existe alguna manera de representarlas?*" No entiendo la pregunta. – PaperBirdMaster Apr 23 '19 at 12:17

1 Answers1

0

¿Puedo meter estructuras dentro de otras estructuras?

Sí, las clases, y por extensión también las estructuras, pueden anidarse cuantas veces se desee:

struct C
{
  int var_c;
};

struct A
{
  int var_a;

  struct B // Estructuras anidadas
  {
    int var_b;
    C c;
  };

  B b; // Variable basada en estructura anidada
  C c; // Variable basada en estructura externa a A
};

A a;
a.var_a     = 1;
a.b.var_b   = 2;
a.b.c.var_c = 3;
a.c.var_c   = 4;

Las variables Q y H dependen de otra variable, ¿existe alguna manera de representarlas?

Haberla la hay. Dependiendo del contexto la solución varía:

Lo que pretendes es únicamente inicializar Q y H

En este caso lo mejor es usar un constructor:

struct demo_nile{
    demo_nile(mat other_p)
      : p(other_p),
      , Q(std::exp(other_p(0,0))
      , H(std::exp(other_p(0,1))
    { }

    int T=1;
    int R=1;
    int Z=1;
    int C=1;
    float Q;
    float H;
    mat p;
};

Ahora los objetos se crearán invocando dicho constructor:

mat p1;
demo_nile var(p1); // Se invoca el constructor que acabamos de crear

Los valores de Q y H dependerán del valor que tenga p en cada momento

En este caso la solución no pasa por usar variables sino funciones:

struct demo_nile
{
  float Q() const
  { return std::exp(p(0,0)); }

  float H() const
  { return std::exp(p(0,1)); }

  mat p;
};
eferion
  • 49,291
  • 5
  • 30
  • 72
  • Si dependen de otra variable, pueden ser variables sin problema alguno. [Echa un vistazo](https://wandbox.org/permlink/BkFQi45u7yqUjzg0). – PaperBirdMaster Apr 23 '19 at 12:51
  • son los inicializadores por defecto (que es lo único que nos ha mostrado el autor) así que no es que cambien de valor con frecuencia, si no que obtienen el valor sólo al inicializarse. – PaperBirdMaster Apr 23 '19 at 12:54
  • @PaperBirdMaster a ver si así te convence más – eferion Apr 23 '19 at 13:03
  • Dado que no entiendo la pregunta, tampoco puedo evaluar la respuesta. Eso si, la respuesta ahora es más completa, gracias :) – PaperBirdMaster Apr 23 '19 at 13:07
  • Los variables de p no varían, son dos valores almacenados en un vector. Respecto a las soluciones que propones, y no teniendo nada que ver con el tema ¿El std::exp se puede sustituir por exp a secas usando el "using namespace std"? Otra tontería, el return así se comporta como una función? ¿Por qué usas return y no void? Muchísimas gracias por tu respuesta, me ha sido muy útil – Huanmer Apr 24 '19 at 18:40
  • @Huanmer Respecto a `using namespace` me remito a [esta otra pregunta](https://es.stackoverflow.com/q/460/463). `return` sirve para devolver valores fuera de la función. En este caso la función devuelve un valor de tipo `float` y por eso se usa el `return`. Por otro lado, dado que dices que los valores son estáticos la primera solución sería quizás la más recomendable en tu caso – eferion Apr 25 '19 at 05:51