C++ 在扩展已知类的未知类内调用函数
正如标题所述,我有以下用户可以扩展的“基类”:C++ 在扩展已知类的未知类内调用函数,c++,C++,正如标题所述,我有以下用户可以扩展的“基类”: class BaseScene { private: bool sceneloop = false; public: virtual void Start(); virtual void EventHandler(SDL_Event event); virtual void Update(); virtual void Draw(); void _toggleLoopMode() { scenel
class BaseScene
{
private:
bool sceneloop = false;
public:
virtual void Start();
virtual void EventHandler(SDL_Event event);
virtual void Update();
virtual void Draw();
void _toggleLoopMode() { sceneloop = !sceneloop; }
bool _sceneloop() { return sceneloop; }
};
我的问题是,我不知道用户为他的类选择了什么名称,所以如何从未知类中的主类调用已知方法(如Start或EventHandler)
我不知道但用户知道的类的示例可以是:
class SomeFunnyRandomName : public BaseScene
{
public:
void Start();
void Eventhandler(SDL_Event event);
void Update();
void Draw();
};
因此,形成我需要在“SomeFunnyRandomName”中调用Start()的主类,但不包括:
如果您可以包含代码,它将非常有用(但不是必需的)。您可以获取一个指向
BaseScene
的引用或指针,并调用该方法。调用方传递其派生类的实例
class UsesScene {
BaseScene & scene;
public:
UsesScene(BaseScene & scene) : scene(scene) {}
void doStuff() { scene.Start(); scene.Update(); }
/*... etc*/
};
int main() {
SomeFunnyRandomName scene;
UsesScene usesScene(scene);
usesScene.doStuff();
}
使用虚拟方法?可能显示您试图实现的代码?
SomeFunnyRandomName sfrn;sftrn.Start()
应该可以工作,因为您的代码目前还处于运行状态,我仍然不明白您想要做什么。现在,由于您不调用类,只调用函数,因此在调用函数时不需要命名类(除非它是静态成员函数,但这里不需要这样的东西)。那么什么时候需要命名一个类呢?当您创建该类的对象时。我看不出您可能需要在哪里创建对象。有一个由用户创建的对象,其类继承了BaseScene
。您只需要一个指向该对象的指针或引用就可以调用其成员函数。(续)在BaseScene
的所有非静态成员函数中,有一个指向该对象的指针,称为this
。因此,您可以在此上调用成员函数。如果函数是虚拟的,它将在用户的类中调用正确的函数。谢谢你的回答,但是,这不能解决我的问题。在我的例子中,不是用户调用BaseSecene,而是我的代码调用扩展基类的用户类。(es.my code->user_class:BaseScene)我的问题是我不知道如何接受未知类并调用已知方法(es.UserScene在我的未知类中,Start()是我已知的方法)@user13767094我想你误解了答案:usescene
(而不是UserScene
)是你这边的代码,它只知道BaseScene
SomeFunnyRandomName
,用户类型,仅出现在用户侧的main
中。@Quentin我尝试过你的解决方案,但我只能访问我的BaseSecene函数,不能访问SomeFunnyRandomName函数。如果我在SomeFunnyRandomName::Start()中打印“Hello”,在BaseSecene::Start()中打印“Hi”,则您的代码只运行第二个,而不是第一个。@Pinnaker
class UsesScene {
BaseScene & scene;
public:
UsesScene(BaseScene & scene) : scene(scene) {}
void doStuff() { scene.Start(); scene.Update(); }
/*... etc*/
};
int main() {
SomeFunnyRandomName scene;
UsesScene usesScene(scene);
usesScene.doStuff();
}