如何设置一个类函数以充当另一个类函数

时间:2019-04-04 09:34:47

标签: c++ c++11 c++14

我有两个类,ClassWorkingTemplateClass,它们没有任何关系。 有没有一种说法,我希望我的TemplateGenerate()中的函数TemplateClass现在像我的类generate()中的函数ClassWorking一样。

像a(此功能不存在)SetFunctionBehavior(&templateClassRef->templateGenerate, &classWorkingRef->generate)

我知道我可以使用函数指针来使TemplateClass接收一个指针并在类中调用它,但这不是我想要的。

更像是LD_Preload,它可以替换函数的内部而不必重新编写它,也无需从拥有它的类继承。


更明确一点,让我们更像是类的节点构造

TemplateClass可以具有多种功能,但不能具有相同的行为

 - TemplateClass
   - TemplateGenerate() {will do this}
   - TemplateGenerate() {will do that}
   - TemplateGenerate() {will do like that}

以及当我声明类指针templateClassRef->TemplateGenerate = TemplateGenerate() {will do that}

但不包含lambda:)


关键是要拥有真正通用的东西,而不必为每种需要重新创建一个类,例如,我可以拥有一个类:

TemplateGenerate 
 - function A {A1 Behavior}  Functiun B {B1 Behavoir}  Functiun C {C1 Behavior}
              {A2 Behavior}             {B2 Behavoir}             {C2 Behavior}
              {A3 Behavior}             {B3 Behavoir}             {C3 Behavior}

当我声明我的函数时,我说我选择了A1,B2,C3或A1,B1,C2

2 个答案:

答案 0 :(得分:1)

方法ClassWorking::generate是一个接受ClassWorking并填充的函数。

具有相同行为的函数也需要使用ClassWorking。这就是该功能的一部分。

由于TemplateClassClassWorking无关,因此“行为相似” TemplateClass::templateGenerate的方法ClassWorking::generate无法成功;您没有ClassWorking,因此ClassWorking::generate的先决条件之一没有得到满足。

现在,可能是ClassWorking::generate 的实现实际上并不需要 ClassWorking实例的情况。它可能还需要其他东西。

但是要使编译器知道这一点,您必须方法从ClassWorking方法更改为其他方法。例如,您可以编写一个自由函数generate,接受一个您实际上 需要的参数,然后让ClassWorking::generate调用该自由函数。

然后从存根方法generate调用自由函数TemplateClass::templateGenerate变得很简单。

C ++不支持“按我的意思做”或“读我的想法”。实际上,您必须告诉编译器您要发生的事情。而且类型在C ++中很重要,因此您不能在不告诉C ++类型之间如何联系的情况下,将一个类的方法连接到另一类。

在某些语言中,类型比较松散,实际上您可以从一个类中获取一个方法并将其粘贴到另一个类上。这些通常是解释性语言,其运行时对象模型比C ++重得多。这种语言的成员被实现为命名值的属性包,值实际上是运行时的变体,等等。

您可以在C ++中实现这种对象,但它不是“本机” C ++对象,并且您必须编写一堆粘合代码(其中一些可以被元编程隐藏)。那不是初学者的工作,通常是一个坏主意。如果您需要脚本语言的灵活性,只需使用脚本语言即可。

答案 1 :(得分:0)

一种方法是使用组成。定义接口

struct Interface
{
    virtual void/*maybe*/ templateGenerate(/*maybe*/) /*const?*/ = 0;
};

然后实施

struct ClassWorkingImpl : Interface, ClassWorking
{
    // ToDo - delegate all the constructors
    // ToDo - implement templateGenerate using the method in ClassWorking
};

,并且对于TemplateClass同样。

然后您实例化ClassWorkingImpl&c。而不是ClassWorking。并且您可以在任一接口上调用接口方法templateGenerate