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()的代码
答案 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