【发布时间】:2013-07-17 07:47:44
【问题描述】:
我设计了一个继承自CDialog的对象(称为NBDialog,以及一些控件的派生对象,如CEdit、CDateTimeCtrl、CComboBox等。NBDialog是一个项目,控件在其他项目中。
当然,所有的控件都放在对话框上并使用对话框的方法,所以我必须
#include NBDialog.h,并为链接器添加其.lib 文件。
我还想处理对话框中的所有这些控件,所以我在NBDialog.h 中写了以下几行:
class NBCommonEditBox;
class NBDateTimeCtrl;
class NBCommonComboBox;
CMapWordToOb* NBGetEditBoxMap();
NBCommonEditBox* NBGetEditBoxById(unsigned long ID);
CMapWordToOb* NBGetDateTimeMap();
NBDateTimeCtrl* NBGetDateTimeById(unsigned long ID);
CMapWordToOb* NBGetComboBoxMap();
NBCommonComboBox* NBGetComboBoxById(unsigned long ID);
这种方式NBDialog.h 不知道对象的上下文,但它知道它们存在并将它们存储在映射中。
现在我想扩展NBDialog项目并添加一个方法来获取所有控件的打印信息,这样所有继承自NBDialog的对象都可以使用这个方法。打印信息在控件实现中定义。
编辑:如果我在NBDialog.cpp 中编写此方法,我无法编译它,因为NBDialog 不知道控件类的上下文:
CStringList* NBDialog::NBGetMainTexts()
{
CStringList* mainTexts = new CStringList();
POSITION pos;
WORD key;
NBCommonEditBox* currEdit = NULL;
for (pos = this->NBGetEditBoxMap()->GetStartPosition(); pos != NULL;)
{
this->NBGetEditBoxMap()->GetNextAssoc(pos, key, (CObject*&)currEdit);
currEdit->NBStringsToPrint(mainTexts);
}
return mainTexts;
}
有没有办法写出想要的方法?
【问题讨论】:
-
您可以使用多重继承为这些对象添加一个接口,并强制转换为该接口,您可以提供一个虚拟函数来执行您需要的查询。我不确定这是否能回答你的问题,因为理解你真正想要做什么有点困难。你能展示一些你的函数的伪代码来迭代你的对象吗?你真的需要一个 ID->CWnd 的映射来迭代吗?
-
@Pete 我添加了一个伪代码。现在轮到你了……
-
为什么会得到未解析的符号?您确定实现这些虚拟方法的对象已链接吗?
-
@greatwolf 他们不能被链接,正如我在问题中解释的那样。如果我链接它们,它将是依赖循环。
-
好的,我明白你的意思,Pete 的建议是有道理的。但老实说,我认为
NBDialog不应该为此负责。如果稍后添加一种新的控件怎么办?您最终将返回NBDialog.h以添加另一个NBGet*Map函数。
标签: c++ inheritance dependencies containers circular-dependency