Минимальный пример, совместимый с вашим вопросом
#include <iostream>
class GameWorld {
public:
int getKey(int & k) const { k = 123; }
};
class StudentWorld : public GameWorld {
};
class Student {
public:
Student(StudentWorld * w) : world_(w) {}
StudentWorld * getWorld() const { return world_; }
private:
StudentWorld * world_;
};
class Penelope : public Student {
public:
Penelope(StudentWorld * w) : Student(w) {}
void doSomething();
};
void Penelope::doSomething()
{
int ch;
getWorld()->getKey(ch);
std::cout << ch << std::endl;
}
int main()
{
StudentWorld sw;
Penelope pe(&sw);
pe.doSomething();
}
Я даю / запоминаю мир с помощью указателя, а не reference / weak_ptr, потому что странным образом getWorld явно возвращает указатель
Я делаю прямое наследование между Пенелопой и владельцем getWorld () , даже в вопросе говорится, что он может быть не прямым, и я называю этого владельца Студент только потому, что кажутся последовательными
В вопросе объект Пенелопы странный и должен быть объект Пенелопы или экземпляр Пенелопы , потому что Пенелопа является скорее классомчем экземпляр
Новая версия из-за вашего замечания о том, что экземпляр Penelope создан StudentWorld , но вы должны понимать, как это StudentWorld знает класс Пенелопы и это плохо, ткань или что-то в этом роде должны быть использованы.Может быть StudentWorld известен Ученик , чтобы запомнить все их экземпляры, но, конечно, не дочерний класс, как Penelope
#include <iostream>
class GameWorld {
public:
int getKey(int & k) const { k = 123; }
};
class Penelope;
class StudentWorld : public GameWorld {
public:
Penelope * createPenelope();
};
class Student {
public:
Student(StudentWorld * w) : world_(w) {}
StudentWorld * getWorld() const { return world_; }
private:
StudentWorld * world_;
};
class Penelope : public Student {
public:
Penelope(StudentWorld * w) : Student(w) {}
void doSomething();
};
Penelope * StudentWorld::createPenelope()
{
// probably the instance is not just returned
// but also memorized to save all the students
return new Penelope(this);
}
void Penelope::doSomething()
{
int ch;
getWorld()->getKey(ch);
std::cout << ch << std::endl;
}
int main()
{
StudentWorld sw;
Penelope * pe = sw.createPenelope();
pe->doSomething();
}
Компиляция и выполнение:
pi@raspberrypi:/tmp $ g++ -pedantic -Wextra -g w.cc
pi@raspberrypi:/tmp $ ./a.out
123