以下问题:我正在将命名空间添加到我的项目中,并且有一件事我似乎无法解决,在嵌套命名空间中提供方法。如果类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();
}
}
}}
答案 0 :(得分:0)
您可以执行以下操作:
MainComponent.h
内使用包含警卫,并从中取出#include "Time.h"
。MainComponent.run()
功能放入.cpp
文件中,并在其中加入Time.h
和MainComponent.h
。MainComponent.h
中添加Time.h
。 所以你最终得到这样的东西:
在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(使用前向声明,每个类保留一个指向另一个类的实例的指针)。