如何将一个类函数设置为另一个类函数
How to set a class function to behave as another class function
>我有两个类,ClassWorking
和TemplateClass
,它们没有任何关系。 有没有办法说,我希望我现在从我的TemplateClass
TemplateGenerate()
的函数的行为类似于我的类ClassWorking
generate()
的函数。
就像一个(这个函数不存在)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
。 这是函数功能的一部分。
由于TemplateClass
与ClassWorking
无关,一个"行为相似"的方法TemplateClass::templateGenerate
ClassWorking::generate
不能成功;你没有ClassWorking
,所以ClassWorking::generate
的先决条件之一是没有得到满足。
现在,可能是ClassWorking::generate
的实现实际上不需要ClassWorking
的实例。 它可能需要其他东西。
但是要让编译器知道这一点,您必须将方法从ClassWorking
方法更改为其他方法。 例如,你可以编写一个自由函数generate
,它接受你实际需要的参数,并ClassWorking::generate
调用该自由函数。
然后,从存根方法调用 free 函数generate
TemplateClass::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
。
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 将值传递到另一个类函数在打印时为零
- 类函数返回到另一个类函数返回打印不同的值
- 访问另一个类中的模板化嵌套类函数和对象
- C :基类调用自己的虚拟函数 - 一个反图案
- 是否可以从另一个类对象调用一个类函数而不继承第一个类
- C 如何仅实现多个继承类的一个构造函数
- 作为其他类成员的类:创建一个接受所有数据的构造函数
- 如何将一个类函数设置为另一个类函数
- GDB:在 C++ 中的类函数上创建一个断点
- 修改类中调用另一个类函数的变量
- c++类函数在另一个函数中不能按预期工作
- 为什么当我有两个函数时编译器没有显示错误,一个将采用基类,一个将派生类作为参数
- 如何在另一个类函数中使用类,而不依赖于它在C++中的声明位置
- 如何从另一个类调用一个类中的函数?(C++)
- 在 c++ 中通过指针从另一个类调用类函数
- C++ 类函数作为另一个类函数的参数
- 对于自定义类的一个未定义集,是否有一个默认的散列函数
- 您如何为构造函数采用rvalue的类声明一个变量
- C++将一个类成员传递到另一个类函数中