我有一个父类Window
class Window
{
public:
Window(int x, int y);
virtual void Display();
virtual ~Window();
}
和基类Console
class Console : public Window
{
public:
Console(int x, int y);
virtual void Display();
virtual ~Console();
}
我将结果存储在具有以下签名的经理类中:
class WindowManager
{
public:
WindowManager() {};
void AddWindow(int x, int y)
{
m_Windows.emplace(nle::WindowType::RenderWindow, std::make_unique<nle::Window>(x,y))
}
void AddConsole(int x, int y)
{
m_Windows.emplace(nle::WindowType::ConsoleWindow, std::make_unique<nle::Console>(x,y));
}
nle::Window* GetRenderWindow()
{
return m_Windows[nle::WindowType::RenderWindow].get();
}
nle::Window* GetConsoleWindow()
{
return m_Windows[nle::WindowType::ConsoleWindow].get();
}
private:
std::unordered_map<WindowType, std::unique_ptr<nle::Window>> m_Windows;
};
当调用Get___Window函数时,总是调用基类,我尝试返回对窗口的引用而不是指针,但是仍然调用了基类,我看到其他人的引用用于远程访问的远程访问容器:
for(const window& : m_Windows)
{
window->Display();
}
这可行,但我想避免直接访问我的经理。
此代码的一个示例是:
static WindowManager m_WindowManager; // static purely for simplicity to avoid using a class for SO
int main()
{
InitResources();
while(1)
{
DisplayWindow();
}
return 1;
}
void InitResources()
{
m_WindowManager.AddConsoleWindow(1080, 720);
}
void DisplayWindow()
{
m_WindowManager.GetConsoleWindow()->Display(); // Base class is called
}