0

我是 C++ 的初学者(英文为 :P),我试图用 SFML 制作一个生活游戏。我创建了一个Application带有EventManager属性的类。我想知道如何从Evenmanager属性Application访问。我首先尝试添加一个指向Application实例的指针,但我不知道该怎么做。这是正确的方法吗?

编辑:现在我得到了这个代码

// Application.h
#ifndef APP_H
#define APP_H

#include "EventManager.h"

class EventManager;

class Application
{
public:
    Application(void);
    ~Application(void);
    // ...
private:
    EventManager m_eventManager;
};

#endif

// EventManager.h
#ifndef EVENT_MGR_H
#define EVENT_MGR_H

#include "Application.h"

class Application;

class EventManager
{
public:
    EventManager::EventManager(Application* app) : m_app(app) {}
    ~EventManager(void){}
private:
    Application* m_app;
};

#endif

Application:m_eventManager uses undefined class EventManager,这是我得到的唯一错误。

4

2 回答 2

4

我已经包含了一个代码示例,它显示并解释了您想要的内容。

编辑:删除旧示例,将此示例与单独的标题中的类一起添加。

应用程序.hpp:

#ifndef APPLICATION_HPP
#define APPLICATION_HPP

#include "EventManager.hpp" // The EventManager.hpp file is pasted into this header, so it will technically look like the first example I showed.

class Application {
    EventManager _event_manager;
public:

    Application() : _event_manager(this) {

    }
};

#endif

事件管理器.hpp

#ifndef EVENT_MANAGER_HPP
#define EVENT_MANAGER_HPP

#include <iostream>

class Application;

class EventManager {
    Application* _application;
public:
    EventManager(Application* _Application) {
        _application = _Application;
        std::cout << "Pointer to application: " << _application << std::endl;
    }
};

#endif

主文件

#include "Application.hpp"

int main(int argc, char **argv) {
    Application application;
    std::cin.get();
    return (0);
}
于 2013-08-02T12:12:42.507 回答
1

您的标头中有一个循环依赖:每个都尝试包含另一个。包含守卫意味着每个都只会被包含一次,但一个定义将出现在另一个之前。在这种情况下,您最终会得到Applicationdefined before EventManager; 这很糟糕,因为它需要定义EventManager才能声明成员变量。

幸运的是,EventManager不需要完整的定义,Application因为它只使用指向该类型的指针;所以你可以删除#include "Application.h"并留下声明class Application;

于 2013-08-02T12:59:55.933 回答