为泛型代码提供的复制函数返回的类型可以是我们想要的任何类型吗?

问题描述

我正在使用具有这些 typedef 的通用 adt

typedef void *Element;
typedef Element(*copyElements)(Element);
typedef Element(*copyElements)(Element);
typedef void(*freeElements)Element);

我必须使用这个创建函数传递它们:

GenericAdt create(copyElements copy,freeElements destroy);

所以我的问题是: 1)当我写一个我想传递给这个创建函数的复制函数时,我可以把它写成

SomeOtherType copy( SomeOtherType a);

而不是

Element copy(Element);

???

  1. 关于free函数的同样问题我可以写成
void destroy(SomeOtherType a);

而不是

void destroy( Element a);

???

解决方法

作为参数传递给 create 的函数必须与参数的类型兼容。

要使两种函数类型兼容,参数的数量和类型必须相同,并且返回类型必须相同。在您的示例中, SomeOtherType copy( SomeOtherType a)copyElements 类型不兼容,因为返回类型不同且参数类型不同。这同样适用于 void destroy(SomeOtherType a)。所以你不能将这些传递给 create 函数。

使用适当的类型创建这些函数,并在函数内部强制转换相关指针:

Element copy(Element e)
{
    struct SomeOtherType *oldvalue = (struct SomeOtherType *)e;
    
    struct SomeOtherType *newvalue = malloc(sizeof *newvalue ));
    // populate newvalue 
    return (Element)newvalue;
}

还有关于这个 typedef:

typedef void *Element;

将对象指针隐藏在 typedef 后面通常不是一个好主意,因为这会导致读者混淆是否使用了指针。但是对于函数指针,它更容易接受,因为它提高了可读性。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...