gpt4 book ai didi

c++ - 在 C++ 中对派生类使用基类指针有什么负面影响吗?

转载 作者:行者123 更新时间:2023-11-30 00:58:16 26 4
gpt4 key购买 nike

我通常避免使用类指针,因为引用似乎更有效率。但我最近被迫使用它们,因为它们提供了唯一(高效且简单)的解决方案,可以在我的 Windows API 包装器中将函数与窗口 ID 绑定(bind)。我创建了一个类 WinControl 的数组。在我处理 WndProc(窗口过程)的 WinHandler 类中,并将程序中使用的所有小部件添加到该数组。

class WinControl   //These are not the entire classes, just the significant parts.
{
public:
int WinID;
virtual void Click(void) = 0; //Pure Virtual Function.
}

class WinHandler
{
WinHandler() : WCount(0) { }
WinControl* WidgetSet[MAX_LENGTH]; // Or I can use an STL vector...
int WCount;
void AddWidget(Widget* w) { WCount++; WidgetSet[WCount] = w; }
}

然后我用:

if (WidgetSet[i]->ID == LOWORD(wParam)) WidgetSet[i]->Click();

从长远来看,这种方法是否可行?由于WidgetSet 中实际存储的对象都是类WinControl 的派生类。谁能提出更好的方法?

注意:我已尽力使我的问题尽可能清楚。如果您仍然无法理解我的问题,请发表评论,我会尽力详细说明问题。

最佳答案

您在小部件集中存储的是一个指针。不是对象。您的设计存在的问题是不清楚谁应该拥有该对象从而销毁它。

我会更改界面以使所有权明确。

选项 1:

WinHandler 拥有小部件:

void AddWidget(Widget& w) { WCount++; WidgetSet[WCount] = &w; }

选项 2:

WinHandler 取得小部件的所有权

void AddWidget(std::auto_ptr<Widget> w) { WCount++; WidgetSet[WCount].reset(w); }
std::auto_ptr<WinControl> WidgetSet[MAX_LENGTH];

选项 2a:

(对于那些使用较新编译器的人)
WinHandler 取得小部件的所有权

void AddWidget(std::unique_ptr<Widget>& w) { WCount++; WidgetSet[WCount] = std::move(w); }
std::unique_ptr<Widget> WidgetSet[MAX_LENGTH];

选项 3:

(对于那些使用较新编译器的人)
WinHandler 共享小部件的所有权

void AddWidget(const std::shared_ptr<Widget>& w) { WCount++; WidgetSet[WCount] = w; }
std::shared_ptr<Widget> WidgetSet[MAX_LENGTH];

关于c++ - 在 C++ 中对派生类使用基类指针有什么负面影响吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6709735/

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