在嵌套命名空间中使方法成为好友

时间:2016-08-20 19:32:40

标签: c++ namespaces nested

以下问题:我正在将命名空间添加到我的项目中,并且有一件事我似乎无法解决,在嵌套命名空间中提供方法。如果类x在命名空间a和命名空间b中,但是类y想要在类x中使用方法,那么它在命名空间a和命名空间b中它不能工作,因为类y没有关于命名空间b的线索,但是你不能包含类x的头,因为类x已经包含类y。有没有办法来解决这个问题 ?

我得到的错误:

   ::时间::时间:: m_DeltaTime':无法访问类'Kinnon :: Time :: Time'中声明的私有成员   'Main':不是类或命名空间名称   'Main':不是类或命名空间名称

time.h中

#pragma once
namespace Kinnon { namespace Time {

class Time
{
    friend void Main::MainComponent::run();
public:
static const float &getDeltaTime();
private:
    Time();
    static float m_DeltaTime;
};
} }

MainComponent.h

#pragma once
#include <chrono>
#include "..\graphics\Window.h"
#include "..\input\Input.h"
#include "..\time\Time.h"

namespace Kinnon { namespace Main { 

typedef std::chrono::high_resolution_clock Clock;
typedef std::chrono::duration<float> fsec;

class MainComponent
{
public:
    MainComponent(const char *title, unsigned int width, unsigned int height);
    ~MainComponent();
    void run();
    void tick();
    void render();
private :
    Graphics::Window m_Window;

};
} }

MainComponent.run()方法:

namespace Kinnon { namespace Main {
void MainComponent::run()
    {
        auto lastTime = Clock::now();
        auto currentTime = Clock::now();
        while(!m_Window.shouldClose())
        {
            lastTime = Clock::now();
            tick();
            render();
            currentTime = Clock::now();
            fsec passedTime = currentTime - lastTime;
            Time::Time::m_DeltaTime = passedTime.count();
        }
    }
    }}

1 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

  1. MainComponent.h内使用包含警卫,并从中取出#include "Time.h"
  2. MainComponent.run()功能放入.cpp文件中,并在其中加入Time.hMainComponent.h
  3. MainComponent.h中添加Time.h
  4. 所以你最终得到这样的东西:
    MainComponent.h

    #ifndef __MAIN_COMPONENT_H__
    #define __MAIN_COMPONENT_H__
    #pragma once
    #include <chrono>
    #include "..\graphics\Window.h"
    #include "..\input\Input.h"
    
    namespace Kinnon { namespace Main { 
    
    typedef std::chrono::high_resolution_clock Clock;
    typedef std::chrono::duration<float> fsec;
    
    class MainComponent
    {
    public:
        MainComponent(const char *title, unsigned int width, unsigned int height);
        ~MainComponent();
        void run();
        void tick();
        void render();
    private :
        Graphics::Window m_Window;
    
    };
    } }
    #endif
    
    Time.h中的

    #include "MainComponent.h"
    #pragma once
    namespace Kinnon { namespace Time {
    
    class Time
    {
        friend void Main::MainComponent::run();
    public:
    static const float &getDeltaTime();
    private:
        Time();
        static float m_DeltaTime;
    };
    } }
    

    MainComponent.cpp

    #include "MainComponent.h"
    #include "Time.h"
    namespace Kinnon { namespace Main {
    void MainComponent::run()
        {
            auto lastTime = Clock::now();
            auto currentTime = Clock::now();
            while(!m_Window.shouldClose())
            {
                lastTime = Clock::now();
                tick();
                render();
                currentTime = Clock::now();
                fsec passedTime = currentTime - lastTime;
                Time::Time::m_DeltaTime = passedTime.count();
            }
        }
        }}
    

    如果你想要另一个解决方案,你可以阅读它here(使用前向声明,每个类保留一个指向另一个类的实例的指针)。