Newsgroup: it.comp.lang.c++
Titolo: Figlia chiama Madre

Ciao a tutti, e grazie in anticipo per l'attenzione.
Ho il seguente problema: ammettiamo di avere una classe madre A, con dei
metodi e dei membri, e una classe figlia B. Ammettiamo che la classe figlia
voglia chiamare un metodo della classe madre, SENZA usare la derivazione
(class B : A). Come si può fare in questo caso?
class A
{
public:
    A();
    ~A();
    void Metodo1();
    void Metodo2();
private:
    B b;
};
class B
{
public:
    B();
    ~B();
    inline void ChiamaMadre()
    {
        Metodo1(); // <---- Il problema sta qui!
    }
};
Ciao e grazie a tutti!
Dome
--
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
PC Brain Official Web Site
http://digilander.iol.it/pcbrain
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

 
Non sono certissimo di aver capito quello che vuoi ottenere.
Può darsi che questa idea faccia al caso tuo:
 class A;
 class B
 {
	public:
	B( A* a) : a_r_(a) { }
	void ChiamaMadre();    
	private:
	A* a_r_;
  };
 class A
 {
    public:
    A() : b_(this) { };
    void Metodo1() { };
    private:
    B b_;
 };
 
 void
 B::ChiamaMadre()
 { a_r_->Metodo1();
 }	
Max


[cut]
Se ho capito bene...
1)Senza ereditarieta':
class A
{
public:
    A();
    ~A();
    void Metodo1();
    void Metodo2();
private:
    B b;
};
class B
{
public:
    B();
    ~B();
    void ChiamaMadre() //scritta cosi' e' gia' inline
    {
     A myObject;    //creare un oggetto della classe A
     myObject.Metodo1(); 
    }
};
2)Con ereditarieta':
class A
{
public:
    A();
    ~A();
    void Metodo1();
    void Metodo2();
private:
    B b;
};
class B:public A
{
public:
    B();
    ~B();
    void ChiamaMadre()
    {
     A::Metodo1();
    }
};
Ciao


La tua domanda non e' molto chiara, do un'altra interpretazione rispetto
a quella gia avuta da Max M. e da MrAgnwstos:
class A {
    public:
        void static metodo() {}
};
class B {            //Figlia di nessuno !!!!!
    void chiamaMetododiA() {
            A::metodo();
    }
};
occhio che puoi chiamare il metodo di A in questo modo perche' e' stato
dichiarato static.
-- 
Posted from 
flopiano.mm.eutelsat.org
 [194.214.173.28] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

vediamo se ho capito quello che vuoi fare.
tu vuoi una classe che chiama il metodo di una qualsiasi classe? allora puoi
usare i template e i puntatori a funzione:
#include <iostream>
class A
{
public:
 void foo() { std::cout << "A::foo()\n"; }
};
template<class T, typename PTR>
class B
{
private:
 T* inst;
 PTR method;
public:
 B(T* i, PTR m) : inst(i), method(m) { }
 void ChiamaMadre() { (inst->*method)(); }
};
typedef void (A::* A_FPTR)(void);
int main()
{
 A a_inst;
 B<A, A_FPTR> b(&a_inst, A::foo);
 b.ChiamaMadre();
 return 0;
}
ciao :: xaero

 (class B : A). Come si può fare in questo caso?
Prova ad usare l'ereditarietà privta, che per certi versi è simile al contenimento. Altrimenti si dovrebbe usare
pesantemente reinterpret_cast per risalire all'oggetto padre, ma adesso non ricordo bene, se vuoi faccio qualche prova e
ti faccio sapere
--
--------------------------
Fulvio Esposito
--------------------------


Qui francamente non ti seguo.
Un approccio potrebbe essere dichiarare B in questo modo:
class B
{
   public:
     B();
     ~B();
     template<class T> inline void ChiamaMadre(const T& obj)
     {
       obj.Metodo1();
     }
     template<class T> inline void ChiamaMadre(T& obj)
     {
       obj.Metodo1();
     }
};
Mentre la classe A
class A
{
   public:
     A();
     ~A();
     void Metodo1();
     void Metodo2();
     B& leggiFiglia() { return b; }    // attenzione ad usare correttamente i
const
 private:
     B b;
};
A questo punto ecco un esempio (di quello che posso immaginare tu voglia fare)
int main()
{
    A a;
    a.leggiFiglia().ChiamaMadre(a);
}
Ma la cosa non mi sembra avere senso.....
Ciao   Manlio Perillo

> Ma la cosa non mi sembra avere senso.....
penso anche io cosě.
magari se si va a vedere il problema da risolvere esiste sicuramente un modo
per evitare questa questa soluzione (di fare A figlia di B, o al contrario)
che _sembra_ essere priva di logica :)))
(ciao->*xaero)();

Gia fatto, grazie a tutti!
Ho semplicemente dichiarato CONST la funzione che mi serviva, e ora
funziona!



Scusa la curiosità, ma a cosa ti stai riferendo?
Ciao   Manlio Perillo

 wrote in message
QWMr7.3004$jT5.1...@news.infostrada.it...


 Potresti utilizzare l'operatore di visibilità ottenendo un codice del
tipo:
Prima di postare cavolate come quella che hai postato è meglio che provi
a compilarle. Anche perchè il C++ non mi pare che tu lo mastichi molto.
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556