访问“父”对象

时间:2013-08-02 12:01:24

标签: c++ sfml

我是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,这是我唯一的错误。

2 个答案:

答案 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;

的声明