C++ C++;:是否有理由在非异常情况下使用异常

C++ C++;:是否有理由在非异常情况下使用异常,c++,exception,C++,Exception,让我给你举个例子:假设你有一个窗口类,它可以有子窗口。每个子窗口都有一个指向其父窗口的弱指针,每个窗口都有一个指向其子窗口的共享PTR列表。现在我遇到了这样的情况,如果子窗口被破坏,我不知道它是因为父窗口被关闭,还是因为子窗口本身被关闭而被破坏。因此,我提出的解决方案是在try{}catch{}块中取消引用子窗口析构函数中的父窗口弱指针,以查看父窗口是否仍然存在(伪代码): //我们尝试在此处保留父窗口 尝试 { //从弱指针创建共享指针,失败时抛出BadReferenceCounterExce

让我给你举个例子:假设你有一个窗口类,它可以有子窗口。每个子窗口都有一个指向其父窗口的弱指针,每个窗口都有一个指向其子窗口的共享PTR列表。现在我遇到了这样的情况,如果子窗口被破坏,我不知道它是因为父窗口被关闭,还是因为子窗口本身被关闭而被破坏。因此,我提出的解决方案是在try{}catch{}块中取消引用子窗口析构函数中的父窗口弱指针,以查看父窗口是否仍然存在(伪代码):

//我们尝试在此处保留父窗口
尝试
{
//从弱指针创建共享指针,失败时抛出BadReferenceCounterException
WindowPtr parent=m_parentWindow.retain();
//检查是否存在父级,否则为0
如果(家长)
{
父项->删除childwindow(此项);
}
}
捕获(const BadReferenceCounterException&_ec)
{

std::cout您似乎使用了错误的共享/弱指针对。标准(在C++11和boost中)共享/弱指针允许您毫无例外地执行此操作:

typedef std::shared_ptr<Window> WindowPtr;
typedef std::weak_ptr<Window> WeakWindowPtr;

WeakWindowPtr m_parentWindow;
//...

WindowPtr parent = m_parentWindow.lock();
if (parent)
{
  // here you know parent wasn't destroyed and you can access it via parent
}
typedef std::shared_ptr WindowPtr;
typedef std::弱ptr WeakWindowPtr;
WeakWindowPtr m_parentWindow;
//...
WindowPtr parent=m_parentWindow.lock();
如果(家长)
{
//在这里,您知道父项未被销毁,您可以通过父项访问它
}

您可能还想查看我在

中提供的代码示例,对我来说,这听起来像是圣战领土。我将高射第一枪:您的弱指针可以允许检查它们的有效性,而无需投掷。
boost::weak_ptr::lock
在这样的访问中返回null
boost::shared_ptr
。@moka:“有效”是什么意思是?它是否按预期工作?性能足够好吗?可以理解吗?那么这是一个有效的解决方案,IMHO。标题中的问题听起来像是程序员的问题,而你在正文中提出的问题是堆栈溢出问题。你想回答你的特定设计问题,还是想讨论广泛的问题呃?话题?你不能同时拥有两个。@管理器,它感觉到有点可怕的错误,从我之前读过的异常:),由于C++语法中的一个巧妙的怪癖,你可以说:“代码>(WiDOWPTR Prime= MyPaleNeal.Cub()){/*使用父*/} /CODE >和<代码>父母<代码>将有正确的范围。
typedef std::shared_ptr<Window> WindowPtr;
typedef std::weak_ptr<Window> WeakWindowPtr;

WeakWindowPtr m_parentWindow;
//...

WindowPtr parent = m_parentWindow.lock();
if (parent)
{
  // here you know parent wasn't destroyed and you can access it via parent
}