我正在开发一个类,该类将创建一个内存块并对该内存进行一些处理。用户将执行以下操作:
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
以执行写入和读取操作。
也可以使用非面向对象的方法:用自由函数替换createData
和processData
,向数据返回一个std::unque_ptr<float[]>
(或者更好的是使用std::vector
),并摆脱MyClass
完全。