返回一个std :: unique_ptr的实例,它自动推导出基类和父类

时间:2018-01-31 22:40:53

标签: c++ unique-ptr

我有一个父类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
}

0 个答案:

没有答案