2014-03-28 40 views
3

我写了一个File IO库。一个功能,File::read看起来是这样的:将unique_ptr用于浮点数组

template <typename T> 
void File::read(T * t, unsigned long count) const 

它读取count牛逼到*t

现在,跳到客户端。我分配一个我想要读入的内存缓冲区。我写了这一点,它的伟大工程:

float * buffer = new float [16]; 
file->read(buffer, 16); 

然而,这不是异常安全的。所以我决定将缓冲区包装在std::unique_ptr中。在这里的某个地方,我犯了一个错误。

std::unique_ptr<float[]> buffer (new float[16]); 
file->read(*buffer , 16); 

这将产生以下的错误上文件 - >读:

敌不过 '运算符*'(操作数的类型是 '的std ::的unique_ptr')

我想通过取消引用unique_ptr我得到一个指向float[]数组的第一个元素的指针。我的错误在哪里,什么是修复?

回答

5

你有几个问题:第一个是你做一个std::unique_ptrfloat[](即你有一个指向float数组的指针)。

另一个问题是智能指针的行为与普通指针一样。当您使用*运算符取消引用正常指针时,不再有指针而只有一个值(指针指向的值)。


另外,我建议你使用任何std::array(如果你知道在编译时的大小)或std::vector,而不是智能指针。在现代C++中几乎不需要指针。

你可以使用它像

std::array<float, 16> buffer; 
file->read(buffer.data(), buffer.size()); 

如果没有std::array你可以使用std::vector代替:

std::vector<float> buffer(16); // Create a vector of 16 floats, 
           // default initialized (i.e. 0.0) 

// &buffer[0] is a pointer to the first element in the vector 
// all vectors are guaranteed to be contiguous like normal arrays 
file->read(&buffer[0], buffer.size()); 
+0

我不知道如何从二进制文件读入载体(字节流),恐怕。 'File :: read'调用只是将'count * sizeof(T)'字节直接读入'T * t'指向的内存中。我正在寻找修复我的方法。 –

+0

哦,'std :: array :: data'返回一个指向连续和变化的内存块的指针,所以我可以读入!这应该工作。非常感谢你。 –

+0

您能否以正确的方式发布我的(已弃用)风格?知道学习的目的可能有用。 –