Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何根据对象的运行时类型而不是基本类型对列表中的对象进行操作?_C++ - Fatal编程技术网

C++ 如何根据对象的运行时类型而不是基本类型对列表中的对象进行操作?

C++ 如何根据对象的运行时类型而不是基本类型对列表中的对象进行操作?,c++,C++,在我的程序中,我有一个基本对象类和一个向量。我想对每个对象*执行一个操作,但是该操作取决于对象*最派生的类。因此,我使用访问者模式。然而,我发现访问者模式会导致大量的耦合;每当我添加一个新的对象派生类时,我必须更改基本访问者和从访问者派生的每个类 有没有一种更简单的方法可以根据对象的运行时类型对对象列表执行操作,而不会导致如此高的耦合?任何虚拟函数都可以 Object* obj; //... obj->doOperation(); 任何虚拟函数都可以 Object* obj; //...

在我的程序中,我有一个基本对象类和一个向量。我想对每个对象*执行一个操作,但是该操作取决于对象*最派生的类。因此,我使用访问者模式。然而,我发现访问者模式会导致大量的耦合;每当我添加一个新的对象派生类时,我必须更改基本访问者和从访问者派生的每个类


有没有一种更简单的方法可以根据对象的运行时类型对对象列表执行操作,而不会导致如此高的耦合?

任何虚拟函数都可以

Object* obj;
//...
obj->doOperation();

任何虚拟函数都可以

Object* obj;
//...
obj->doOperation();
类对象
{
虚空动作()=0;
/* ... */
};
void objectAction(Object*o){o->action();}
int main()
{
std::向量v;
std::for_each(v.begin()、v.end()、objectAction);
}
现在只需在每个派生类中实现
操作

类对象
{
虚空动作()=0;
/* ... */
};
void objectAction(Object*o){o->action();}
int main()
{
std::向量v;
std::for_each(v.begin()、v.end()、objectAction);
}
现在只需在每个派生类中实现
action

您的抽象基类(称为“object”)提供了每个继承类必须实现的抽象实现框架。您只需在基类的每个实例上调用适当的方法。类似的东西(在C中,因为我的C++被腐蚀了,但是你应该明白这个想法):

公共抽象类小部件
{
public void MandatoryMethod();//没有方法实现
}
公共类小部件:小部件
{
公共重写void MandatoryMethod()
{
//一些具体实施
}
}
公共类小部件:小部件
{
公共重写void MandatoryMethod()
{
//另一项具体实施
}
}
...
List Widgets=GetSomeWidgets();
for(小部件中的小部件)
{
widget.MandatoryMethod();
}
这就是它的全部内容。

您的抽象基类(称之为“对象”)提供了每个继承类必须实现的抽象实现框架。您只需在基类的每个实例上调用适当的方法。类似的东西(在C中,因为我的C++被腐蚀了,但是你应该明白这个想法):

公共抽象类小部件
{
public void MandatoryMethod();//没有方法实现
}
公共类小部件:小部件
{
公共重写void MandatoryMethod()
{
//一些具体实施
}
}
公共类小部件:小部件
{
公共重写void MandatoryMethod()
{
//另一项具体实施
}
}
...
List Widgets=GetSomeWidgets();
for(小部件中的小部件)
{
widget.MandatoryMethod();
}

这就是它的全部内容。

我将在字里行间阅读,并猜测大多数派生对象都有其独有的成员函数,并且不存在于任何其他派生对象中,这就是为什么您不想将它们添加到基类中的原因

您可以使用
dynamic\u cast
查看指针是否属于最派生的类,如果属于,则调用该函数

MyBase * pBase = *iterator;
MyDerived * pDerived = dynamic_cast<MyDerived *>(pBase);
if (pDerived != NULL)
    pDerived->UniqueMethod();
MyBase*pBase=*迭代器;
MyDerived*pDerived=动态投影(pBase);
如果(pDerived!=NULL)
p验证->唯一方法();

我将在字里行间阅读,并猜测大多数派生对象都有其独有的成员函数,并且不存在于任何其他派生对象中,这就是为什么您不想将它们添加到基类中

您可以使用
dynamic\u cast
查看指针是否属于最派生的类,如果属于,则调用该函数

MyBase * pBase = *iterator;
MyDerived * pDerived = dynamic_cast<MyDerived *>(pBase);
if (pDerived != NULL)
    pDerived->UniqueMethod();
MyBase*pBase=*迭代器;
MyDerived*pDerived=动态投影(pBase);
如果(pDerived!=NULL)
p验证->唯一方法();

虚拟函数如何?能否提供更多详细信息和/或示例,说明如何处理对象?我没有指定派生类上的操作集应该能够在运行时更改。Visitor将操作集封装到一个类中,该类可以在运行时进行子类化和切换。虚拟函数如何?能否提供更多详细信息和/或示例,说明如何处理对象?我没有指定派生类上的操作集应该能够在运行时进行更改。Visitor将操作集封装到一个类中,该类可以在运行时进行子类化和切换。