C++: "clases anidadas"

Algoritmos, estructuras de datos, estrategias o patterns. Lenguaje' de programasión, vieja! Ce, loco, Ce! Páison, y todo eso.

C++: "clases anidadas"

Notapor Adriano el Mar Ene 30, 2007 8:43 am

Algo que me llenó de satisfacción cuando logré hacerlo, aunque posiblemente no tenga mucho uso -por suerte:
Código: Seleccionar todo
// ex7.cpp - Modify ex6 so that Nest and Egg contain private data.
// grant friendship to allow the enclosing classes access to this
// private data

#include <iostream>
using namespace std;

class Hen {
    public: // no private data for Hen right now.
        void display(); // just couts a message, nothing more for now.
        class Nest {
            int nested;
            public:
                friend class Hen;
                void display(); // shows state of private attr nested.
                class Egg; // incomplete declaration
                void touchEgg(Egg*, char* yolk); // this is friended in egg.
                void setNested(int mynested);
                class Egg {
                    char* egged;
                    public:
                        friend void Hen::Nest::touchEgg(Egg*, char* yolk); // Here's the friend declaration
                        void display(); // shows state of private attr egged.
                        void setEgged(char* shell);
                };
        };
   
    // back in the Hen class
    public: // These funcs go _after_ everything else has been declared!
   
        // this was sort of easy.
        void touchNest(Nest* nest, int feather);
   
        // this is the one that stumped me:
        // uses Nest.touchEgg() inside :)
        void touchEgg(Nest* proxy, Nest::Egg* egg, char* white);
};

int main() {
    Hen pecker;
    Hen::Nest gooey;
    Hen::Nest::Egg yolkey;

    pecker.display();

    gooey.setNested(42);
    gooey.display();
   
    yolkey.setEgged("A nice egg");
    yolkey.display();

    pecker.touchNest(&gooey, 43);
    gooey.display();
   
    pecker.touchEgg(&gooey, &yolkey, "Changed by hen!");
    yolkey.display();

    gooey.touchEgg(&yolkey, "Changed by nest!");
    yolkey.display();
}

// Hen members
void Hen::display() {
    cout << "I'm a Hen!" << endl;
}

void Hen::touchNest(Nest* nest, int feather) {
    nest->nested = feather;
}

void Hen::touchEgg(Nest* proxy, Nest::Egg* egg, char* white) {
    proxy->touchEgg(egg, white);
}

// Nest members
void Hen::Nest::display() {
    cout << "I'm a Nest!" << endl;
    cout << "nested = " << nested << endl;
}

void Hen::Nest::setNested(int myNest) {
    nested = myNest;
}

void Hen::Nest::touchEgg(Egg* egg, char* yolk) {
    egg->egged = yolk;
}

// Egg members
void Hen::Nest::Egg::display() {
    cout << "And I'm an Egg!" << endl;
    cout << "egged = " << egged << endl;
}

void Hen::Nest::Egg::setEgged(char* white) {
    egged = white;
}
Saludos
Adriano
Avatarde Usuario
Adriano
Administrador
 
Posts: 392
Registrado: Sab Dic 09, 2006 12:50 pm
Ubicación: Argentina

C++: "clases anidadas"

Sponsor

Sponsor
 

Volver a Programación y Diseño de Sófwer.

¿Quién está conectado...?

Usuarios navegando este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron