我有两个类,ClassWorking
和TemplateClass
,它们没有任何关系。
有没有一种说法,我希望我的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
答案 0 :(得分:1)
方法ClassWorking::generate
是一个接受ClassWorking
并填充的函数。
具有相同行为的函数也需要使用ClassWorking
。这就是该功能的一部分。
由于TemplateClass
与ClassWorking
无关,因此“行为相似” 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
。