提前感谢您的帮助。 这是我的问题:
我有一个包含在类(A)中的子类(x,y,z)。一些函数是共享的(在A中声明)而另一些函数不在(在子类中声明)。
所有对象都存储在一个地图map<string,A>Groups
中。
然后,我想使用迭代器为所有函数执行循环,但是出现了仅属于一个类的函数的问题,它表示类A不包含函数...
我想说
for(it=Groups.begin(); it!=Groups.end(); ++it)
{
it->second.functionShared1()
如果objects1属于类x:it-&gt; second.functionsOfClassX 并且它理解它必须在类x中找到该函数。
我想这是不可能的,但如果你知道如何解决这个问题,我将非常感激。
我虽然关于创建虚拟函数但是它会很乱,或者为每个类创建一个地图以及包含所有地图的大地图。但后来我不知道如何迭代它并声明outermap [“x”] = innermap [x]。所以就是这样,对不起我刚刚开始使用C ++,我希望我解释得很好。
答案 0 :(得分:1)
为什么不做一个虚函数:
class A
{
//...
virtual void executeMyJunk();
};
for( it=Groups.begin(); it!=Groups.end(); ++it ) it->second.executeMyJunk();
为子类中的实现提供实现。您还可以在A中提供一个实现来调用所有类共有的函数。
void A::executeMyJunk()
{
EveryoneHasThisFunction();
}
void x::executeMyJunk()
{
// Call common functions
A::executeMyJunk();
// Call functions specific to this class
DoExxyStuff();
}
我应该指出的一件事是,如果您打算使用虚拟方法,则需要存储A*
(或智能指针,例如 std::unique_ptr<A>
)您的地图,而不仅仅是A
的实例。
我不确定我是否正确解释了你的问题。也许这对你没用。如果您实际上只是在类支持该功能时才想要执行特定的函数,那么您可以使用dynamic_cast
。在这里,我假设您的地图存储指针:
for( it=Groups.begin(); it!=Groups.end(); ++it ) {
x *xinst = dynamic_cast<x*>(it->second);
if( x ) x->DoExxyStuff();
}
答案 1 :(得分:0)
首先,当您将对象放入std::map<std::string, A>
时,对象将切片:即使对象类型为x
,y
或{ {1}}进入地图,实际上只复制和存储对象的基础部分。如果您真的想在地图中存储潜在派生对象的对象,则需要将某种指针(可能是某种托管指针)存储到地图中。例如,您可以使用
z
假设您的班级std::map<std::string, std::shared_ptr<A>> Group;
至少有一个A
功能,您可以检测是否有任何类型属于特定的派生类型,例如,使用
virtual