我在写一个允许建立贝叶斯网络的库。网络的结构被封装并且用户不能访问其字段;但是他们可以获得并设置其中的一些。假设你想为table
(基本上是一个双数组)的字段编写访问函数。在以下选项之间,哪个更合适?如何定义一个getter函数
第一选项:
int getTable(Net *net, double *res)
第二个选项:
double *getTable(Net *net)
在第一选项中,用户提供一个指针,其中表中的值将被写入阵列。该功能复制res
上的表值,使用户无法直接访问内部结构。修改res
离开网表不变。当然,提供另一个功能(如getTableSize()
)可以正确分配res
。这似乎是安全的(内部结构保持一致),并且具有如果出现问题就可以返回代码值的优点。缺点是这种方法比下一个方法慢,因为它涉及到一个副本。通常,table
的值的数量可能从1到几百不等。
在第二个选项中,函数直接返回指向内部值的指针。在文档中,我将指定用户不能尝试释放指针或修改值。如果执行网络上的其他操作,则释放指针可能会导致分段错误和内存泄漏。修改表格不会导致任何明显的错误,但内部连贯性将被打破,后续计算的结果可能会非常错误,并且很难为用户进行调试。
你更喜欢哪个选项?还有其他的东西需要考虑?还有其他方法可以选择吗?
我会采取前一种方法。这个库的用户可能会有他对动态内存分配的偏好(比如根本不使用它)。 –
IMO两种方法都基于所需的语义有自己的位置。第一种方法由于不暴露内部部件而具有安全的优点,但第二种方法对于容器数据结构的弹出函数 – ForeverStudent