Имея создателя класса и дочернего класса, как ребенок может вызывать функцию создателя, не имеющую ptr фактическому создателю? - PullRequest
0 голосов
/ 15 июля 2011

Итак, у меня есть class_instantiator, и он создает экземпляр my_class a внутри себя.a

Пример псевдокода:

struct my_class 
{
  void call()
  {
    try{
    call_parent_function(instansiator_function);
    }catch (exception &e)
    }
};

struct class_instantiator
{
  void instansiator_function(){ cout << "Hello!";};
  void fun()
  {
   my_class a;
   a.call();
  }
};
Возможно ли для *1003* вызвать какой-либо из методов class_instantiator, не имея указателя на class_instantiator, только имея доступный его интерфейс?

Ответы [ 3 ]

0 голосов
/ 15 июля 2011

Если вы пытаетесь делать круговые ссылки (как это звучит?), Я бы сказал, что вы, вероятно, делаете что-то не так. Можете ли вы дать нам конкретный пример того, чего вы пытаетесь достичь?

Дочерний класс должен иметь возможность вызывать методы своего родителя, если они не являются частными.

0 голосов
/ 15 июля 2011

Не ясно на 100%, что вы спрашиваете, но для вызова функции-члена класса вам нужен фактический экземпляр (объект) этого класса.Однако, если ваша функция (Me :: pf () в вашем примере) не нуждается в доступе к данным нестатического члена вашего класса, вы можете объявить вашу функцию как статическую и вызывать ее напрямую.Я изменил ваш пример соответственно.Кроме того, обратите внимание, что у вас были циклические ссылки так, как они были написаны (Здравствуйте, мне нужно было увидеть определение Me, и наоборот), поэтому я немного реорганизовал его.

struct Hello 
{
    void call_static_member();
};


struct Me
{
    static void pf(){ std::cout << "Hello!";}
    void main()
    {
        Hello a;
    }
};

void Hello::call_static_member()
{
try{
    Me::pf();
}catch (exception &e){}
}  
0 голосов
/ 15 июля 2011
[edan@edan tmp]$ g++ parent.cpp
[edan@edan tmp]$ ./a.out 
parent_method!
[edan@edan tmp]$ cat parent.cpp 
#include <boost/shared_ptr.hpp>
#include <iostream>


class my_parent {
    protected:
        void parent_method() { std::cout << "parent_method!" << std::endl; }
};

class my_calss : public my_parent {
    public:
        void call_my_parent() { my_parent::parent_method(); }
};

int
main() {
    boost::shared_ptr<my_calss> my_ojb( new my_calss );
    my_ojb->call_my_parent();
    return 1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...