else - C++ anidado clase/problema de declaración adelante
if anidado php (6)
No hay forma de reenviar declarar una clase anidada sin especificar completamente la clase contenedora. Este pequeño truco también soluciona el problema
class Outer_Inner
{
};
class Outer
{
public:
typedef Outer_Inner Inner;
};
Esto funciona para mí como en mi convención de nombres Outer_Inner
no es un nombre de clase válido, por lo que es obvio que se refiere a una clase anidada.
Aún no puede reenviar declarar la clase anidada como esta:
class Outer::Inner;
Pero al menos puede ser declarado adelante con:
class Outer_Inner;
Si no te gusta la apariencia de Outer_Inner, puedes adoptar una convención de nomenclatura para las clases anidadas que mejor se adapte a tus gustos. Outer__Inner
, Outer_nested_Inner
, etc.
¿Es posible reenviar-declarar una clase anidada, luego usarla como el tipo para un miembro de datos concreto (no puntero a / referencia) de la clase externa?
ES DECIR
class Outer;
class Outer::MaybeThisWay // Error: Outer is undefined
{
};
class Outer
{
MaybeThisWay x;
class MaybeThatOtherWay;
MaybeThatOtherWay y; // Error: MaybeThatOtherWay is undefined
};
No puede reenviar-declarar una clase anidada como esa.
Dependiendo de lo que intentes hacer, tal vez puedas usar un espacio de nombres en lugar de una clase en la capa externa. Puede reenviar-declarar dicha clase sin problema:
namespace Outer {
struct Inner;
};
Outer::Inner* sweets; // Outer::Inner is incomplete so
// I can only make a pointer to it
Si tu Outer tiene que ser una clase, y no puedes conectarla a un espacio de nombres, entonces necesitarás que Outer sea un tipo completo en el contexto donde reenviar declaras Inner.
class Outer
{
class Inner; // Inner forward-declared
}; // Outer is fully-defined now
Outer yes; // Outer is complete, you can make instances of it
Outer::Inner* fun; // Inner is incomplete, you can only make
// pointers/references to it
class Outer::Inner
{
}; // now Inner is fully-defined too
Outer::Inner win; // Now I can make instances of Inner too
No, pero ¿qué pasa con
class Outer {
public: //or protected or private
class Inner {
};
private:
Inner foo;
};
Declarar adelante no tiene sentido aquí, a menos que me falta algo (que es posible ya que su pregunta carece de muchos detalles)
Recuerde, si una clase se declara hacia delante, solo puede declarar referencias o punteros a un objeto del tipo de declaración directa. No puede hacer nada más con eso, incluido el acceso a sus miembros o funciones.
Si declara un atributo de tipo MaybeThatOtherWay
, no una referencia ni un puntero, el compilador debe conocer la definición completa de la clase para determinar el tamaño de la clase externa. Por lo tanto, no puede usar la declaración directa y ese tipo de declaración de campo, ya sea una clase anidada o no.
Si solo necesita un tipo como parámetro de función o variable estática, podría hacerse en el lado del cliente. Por ejemplo, para recibir notificaciones de eventos desde el exterior:
Interfaz:
class Client {
public:
private:
static void gotIt(int event);
class Helper;
};
Implementación:
#include <outer.hpp>
class Client::Helper {
public:
static void fromOuter(Outer::Inner const& inner)
{
gotIt(inner.event());
}
};
Si una clase ha sido declarada (pero aún no tiene la definición completa), solo puede declararla, porque el compilador aún no conoce el tamaño de la clase (ni los nombres de sus campos). o métodos).