如何将一个类函数设置为另一个类函数

How to set a class function to behave as another class function

本文关键字:类函数 一个 设置 另一个      更新时间:2023-10-16

>我有两个类,ClassWorkingTemplateClass,它们没有任何关系。 有没有办法说,我希望我现在从我的TemplateClassTemplateGenerate()的函数的行为类似于我的类ClassWorkinggenerate()的函数。

就像一个(这个函数不存在)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

方法ClassWorking::generate是一个接受ClassWorking并执行操作的函数。

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

由于TemplateClassClassWorking无关,一个"行为相似"的方法TemplateClass::templateGenerateClassWorking::generate不能成功;你没有ClassWorking,所以ClassWorking::generate的先决条件之一是没有得到满足。

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

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

然后,从存根方法调用 free 函数generateTemplateClass::templateGenerate变得微不足道。

C++不支持"做我的意思"或"读懂我的想法"。 你实际上必须告诉编译器你想要发生什么。 类型在C++中很重要,因此您不能将一个类上的方法连接到另一个类,而不告诉C++类型如何关联。

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

你可以在C++中实现这种对象,但它不是"本机"C++对象,你必须编写一堆胶水代码(其中一些可以被元编程隐藏)。 这远非初学者的任务,通常是一个坏主意;如果您需要脚本语言的灵活性,只需使用脚本语言。

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

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