我必须为liblas读取器类写一个包装器。我希望在构造函数中创建reader实例,并将其保存在一个成员变量中。
class LASPointReader : PointReader{
private:
liblas::Reader reader;
...
}这就是我认为会起作用的:
LASPointReader::LASPointReader(string file){
ifstream ifs;
ifs.open(file, std::ios::in | std::ios::binary);
liblas::ReaderFactory f;
reader = f.CreateWithStream(ifs);
...
}但是这失败了,因为liblas::reader没有默认的构造函数。然后,我尝试使读取器变量为指针,然后执行以下操作
reader = &f.CreateWithStream(ifs);这失败了,因为现在我在使用读取器时会在运行时得到"R6025 -纯虚拟函数调用“错误。
然后,我尝试了一个相当难看的初始化程序列表:
LASPointReader::LASPointReader(string file)
: reader(liblas::ReaderFactory().CreateWithStream(ifstream(file, std::ios::in | std::ios::binary)))
{但现在,读者只做了部分工作。它确实可以加载文件的头文件,但是另一个应该读取内容的方法失败了。
我该如何将这个读取器实例存储在我的班上?
发布于 2014-02-28 14:14:57
C++流是不可复制的.这意味着CreateWithStream()别无选择,只能通过引用获取流并存储该引用。这反过来意味着它只会在它所引用的流是有效的情况下才有效。在您的初始化列表的情况下,这只是直到初始化结束。(我猜您使用的是Visual,否则编译器会抱怨它无法将rvalue绑定到非const引用)。
如果是这样的话,只要读取器是,您就必须确保流是有效的。这意味着使流也成为数据成员。在C++中,成员总是按照类中声明的顺序进行初始化,所以这样做:
class LASPointReader : PointReader{
private:
std::ifstream stream;
liblas::Reader reader;
...
}
LASPointReader::LASPointReader(string file)
: stream(file, std::ios::in | std::ios::binary)
, reader(liblas::ReaderFactory().CreateWithStream(stream))
{https://stackoverflow.com/questions/22097301
复制相似问题