对象如何获取指向它所属的c ++类对象的指针

时间:2019-02-19 08:30:58

标签: c++ oop pointers

Penelope对象将需要访问GameWorld类(这是StudentWorld类的基类),Penelope对象(或更可能是其基类之一)中的getKey()方法。 将需要一种获取指向它所属的StudentWorld对象的指针的方法。如果看一下代码示例,您将看到Penelope的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 :(得分:0)

与您的问题兼容的最小示例

#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();
}

我通过指针而不是引用/ weak_ptr给予/记忆世界,因为奇怪的是 getWorld 明显返回了指针

我在Penelope和 getWorld()的所有者之间进行了直接继承,即使这个问题说这可能不是直接的,我也将其命名为 Student ,因为一致

在这个问题中,佩内洛普对象很奇怪,并且必须是佩内洛普的对象佩内洛普实例,因为佩内洛普是一个类而不是实例


新版本,因为您的言论是 StudentWorld 创建 Penelope 实例,但您必须理解 StudentWorld 知道佩内洛普(Penelope)类,必须使用这种织物,织物或类似材料。可能是 StudentWorld 已知的 Student 来记住他们的所有实例,但是肯定不是像 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