首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >初始化成员变量而不使用初始化程序列表和没有默认构造函数的类型?

初始化成员变量而不使用初始化程序列表和没有默认构造函数的类型?
EN

Stack Overflow用户
提问于 2014-02-28 14:03:30
回答 1查看 176关注 0票数 2

我必须为liblas读取器类写一个包装器。我希望在构造函数中创建reader实例,并将其保存在一个成员变量中。

代码语言:javascript
复制
class LASPointReader : PointReader{
private: 
    liblas::Reader reader;

    ...
}

这就是我认为会起作用的:

代码语言:javascript
复制
LASPointReader::LASPointReader(string file){
    ifstream ifs;
    ifs.open(file, std::ios::in | std::ios::binary);
    liblas::ReaderFactory f;
    reader = f.CreateWithStream(ifs);
    ...
}

但是这失败了,因为liblas::reader没有默认的构造函数。然后,我尝试使读取器变量为指针,然后执行以下操作

代码语言:javascript
复制
reader = &f.CreateWithStream(ifs);

这失败了,因为现在我在使用读取器时会在运行时得到"R6025 -纯虚拟函数调用“错误。

然后,我尝试了一个相当难看的初始化程序列表:

代码语言:javascript
复制
LASPointReader::LASPointReader(string file)
    : reader(liblas::ReaderFactory().CreateWithStream(ifstream(file, std::ios::in | std::ios::binary)))
{

但现在,读者只做了部分工作。它确实可以加载文件的头文件,但是另一个应该读取内容的方法失败了。

我该如何将这个读取器实例存储在我的班上?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-28 14:14:57

C++流是不可复制的.这意味着CreateWithStream()别无选择,只能通过引用获取流并存储该引用。这反过来意味着它只会在它所引用的流是有效的情况下才有效。在您的初始化列表的情况下,这只是直到初始化结束。(我猜您使用的是Visual,否则编译器会抱怨它无法将rvalue绑定到非const引用)。

如果是这样的话,只要读取器是,您就必须确保流是有效的。这意味着使流也成为数据成员。在C++中,成员总是按照类中声明的顺序进行初始化,所以这样做:

代码语言:javascript
复制
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))
{
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22097301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档