gpt4 book ai didi

c++ - 嵌套名称说明符 JUICE 中的不完整类型

转载 作者:行者123 更新时间:2023-11-30 02:23:07 26 4
gpt4 key购买 nike

在尝试使用“WindowList”类管理我的窗口时,我遇到了循环依赖问题。当我想用下面的 closeButtonPressed 代码关闭一个窗口时,我需要从 windowList 文件中删除该对象,但是我在 WindowList 文件中包含了 WindowSetter。以前的此类错误可以通过前向声明解决,但是我不确定如何解决这个错误。有什么建议吗?(完整代码可以在这里查看:https://gist.github.com/anonymous/7d43c6d5b2cf1fef618be9f75077ad0c)

#pragma once

#include "../JuceLibraryCode/JuceHeader.h"
#include "WindowList.h"
class WindowList;

class WindowSetter : public DialogWindow
{
public:
WindowSetter (const String& title,
Component* content,
bool shouldBeResizeable,
int initWidth, int initHeight,
int minWidth, int minHeight,
int maxWidth, int maxHeight)
: DialogWindow (title, Colours::white, true, true),
owner (this)
{
setUsingNativeTitleBar (true);
setResizable (true, true);
setResizeLimits (minWidth, minHeight, maxWidth, maxHeight);
setContentOwned (content, false);

setVisible (true);


}

~WindowSetter()
{
}

void closeButtonPressed() override
{
WindowList::getWindowList(); // ERROR: Incomplete type 'WindowList' named in nested name specifier
owner = nullptr;
}

bool escapeKeyPressed() override
{
return true;
}

private:
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WindowSetter)

ScopedPointer<Component> owner;
};

enter image description here

编辑:添加了导致错误的文件的完整代码和错误日志截图

最佳答案

OMGtechy 的回复解决了您提出的问题,但我想推荐一种不同的设计:

  1. 无需担心循环依赖
  2. 是更惯用的 JUCE 代码。

这里的设计将所有东西紧密地结合在一起。解决问题的更 JUCE 方法是使用 ChangeBroadcaster/ChangeListener 类来消除这种紧密耦合。当您将 WindowSetter 添加到您的 WindowList 时,还要订阅它的更改消息。当用户单击关闭按钮时,WindowSetter 设置一个 bool 值并提醒任何收听它的人它已更新。

在草图中,它看起来像

class WindowSetter : public DialogWindow
, public ChangeBroadcaster

{
public:
WindowSetter( /*(etc...)*/)
: DialogWindow(...)
, owner(this)
, wantsToClose(false)
{
// etc

}

void closeButtonPressed() override
{
wantsToClose = true;
// notify observers that we've changed.
sendChangeMessage();
}

bool windowWantsToClose() const
{
return wantstoClose;
}

private:
bool wantsToClose;
};


class WindowList : public ChangeListener
{

void addWindowSetterToList(WindowSetter* wnd)
{
wnd->addChangeListener(this)
windows.addIfNotAlreadyThere(wnd);
}

void changeListenerCallback(ChangeBroadcaster* src) override
{
// cast from the ChangeBroadcaster base class to our WindowSetter class.
WindowSetter* wnd = dynamic_cast<WindowSetter*>(src);
if (nullptr != wnd)
{
// if we contain the object, and the object wants to be closed...
if (windows.contains(wnd) && wnd->windowWantsToClose())
{
// get rid of it.
windows.remove(wnd);
}
}
}

};

您会看到这种设计几乎在 JUCE 代码库中无处不在。

关于c++ - 嵌套名称说明符 JUICE 中的不完整类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46488608/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com