我是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
,这是我唯一的错误。
答案 0 :(得分:4)
我已经包含了一个代码示例,可以显示和解释您想要的内容。
编辑:删除了旧示例,在单独的标题中添加了这个示例。
Application.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
EventManager.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
Main.cpp的
#include "Application.hpp"
int main(int argc, char **argv) {
Application application;
std::cin.get();
return (0);
}
答案 1 :(得分:1)
您的标题中存在循环依赖关系:每个都尝试包含另一个。包含守卫意味着每个只包括一次,但一个定义将出现在另一个之前。在这种情况下,您最终会在Application
之前定义EventManager
;这是不好的,因为它需要EventManager
的定义才能声明成员变量。
幸运的是,EventManager
不需要Application
的完整定义,因为它只使用指向该类型的指针;因此,您可以删除#include "Application.h"
,然后保留class Application;