我正在开发一个类,该类将创建一个内存块并对该内存进行一些处理。用户将执行以下操作:

MyClass m;
float* data = m.createData();
/* user writes to `data` ... */
m.processData();


请记住,createData()仅被调用一次,MyClass保留指向data的内部指针,并且所有processData()调用将始终对该数据起作用。

我的问题是关于processData()方法的签名。对于processData()隐式修改data的事实,我感到不舒服。我是否应该要求data作为参数传递(甚至是多余的),只是为了使这种行为对用户明确?

MyClass m;
float* data = m.createData();
/* user writes to `data` ... */
m.processData(data);

最佳答案

我对processData()隐式修改数据感到不舒服。


实际上,processData根本不修改data。根据您的描述,它会修改data指向的对象。但这仅仅是因为内部指针恰好指向同一对象。


  我是否应该要求将数据作为参数传递(甚至是冗余的)只是为了向用户明确显示此行为?


如果您打算使用内部指针,那么绝对不要。要求用户传递未使用的参数会非常混乱。

如果您打算改用传递的指针,则将指针存储在类中没有多大意义。


  用户需要访问此数据(写和读)。


面向对象的方法是不将指针返回数据,而是将成员函数写入MyClass以执行写入和读取操作。

也可以使用非面向对象的方法:用自由函数替换createDataprocessData,向数据返回一个std::unque_ptr<float[]>(或者更好的是使用std::vector),并摆脱MyClass完全。

10-08 20:05