как объект может получить указатель на объект класса, которому он принадлежит c ++ - PullRequest
0 голосов
/ 19 февраля 2019

Объекту Penelope потребуется доступ к методу getKey () в классе GameWorld (который является базовым классом для вашего класса StudentWorld), объекту Penelope (или, более вероятно, одному из его базовых классов) потребуется способ получитьуказатель на объект StudentWorld, которому он принадлежит.Если вы посмотрите на пример кода, вы увидите, как метод doSomething () Пенелопы сначала получает указатель на свой мир через вызов getWorld () (метод в одном из своих базовых классов, который возвращает указатель на StudentWorld), изатем использует этот указатель для вызова метода getKey ().

void Penelope::doSomething()
{
    int ch;
    if (getWorld()->getKey(ch))
   {
    // user hit a key during this tick!
      switch (ch)
   {
       case KEY_PRESS_LEFT:
         ... move Penelope to the left ...;
         break;
      case KEY_PRESS_RIGHT:
        ... move Penelope to the right ...;
        break;
      case KEY_PRESS_SPACE:
         ... add flames in front of Penelope...;
         break;
   // etc…
  }
}
...
}

код для getWorld () фактически необходим

1 Ответ

0 голосов
/ 19 февраля 2019

Минимальный пример, совместимый с вашим вопросом

#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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...