C++ C++;类初始化
新手警觉。我有以下课程 看法 当我在另一个类中使用上述函数作为成员时,我为它编写了一个构造函数,如下所示C++ C++;类初始化,c++,constructor,C++,Constructor,新手警觉。我有以下课程 看法 当我在另一个类中使用上述函数作为成员时,我为它编写了一个构造函数,如下所示 class SegmentedTable : public BasicOperation { public: SegmentedTable::SegmentedTable(const std::vector<TupleSchema> vp_schemas, BufferAllocator* buffer_allocator) : BasicOperation(
class SegmentedTable : public BasicOperation {
public:
SegmentedTable::SegmentedTable(const std::vector<TupleSchema> vp_schemas, BufferAllocator* buffer_allocator)
: BasicOperation(),
view_copier_(NULL, NULL) { }
private:
scoped_ptr<Block> block_;
View view_;
ViewCopier view_copier_;
}
类分段表:公共基础{
公众:
SegmentedTable::SegmentedTable(常量std::向量vp_模式,缓冲分配器*缓冲分配器)
:BasicOperation(),
视图\u复印机\u(空,空){}
私人:
作用域块;
查看视图;
视图复印机视图\u复印机\u;
}
我收到一条错误消息,没有定义方法View::View()。我理解这是因为不需要类的View()构造函数,因为它会在SegmentedTable构造函数的初始值设定项列表中自动初始化。但是我有两个问题
1) 为什么不需要相同的块
2) 为什么我可以用ViewCopier(NULL,NULL)初始化ViewCopier,而不能对View进行初始化。Doing View(NULL)还告诉我没有定义任何方法View::View(NULL)
我知道我没有提供示例中使用的其他一些类定义,但我希望在没有它们的情况下可以回答这个问题 这是因为当你写作时:
View view_;
它不像java中那样创建空引用,它实际上尝试构造视图
因此,您应该使用指针并稍后实例化它,或者通过传递所需参数来构造它
或者在视图中添加一个不带任何参数的构造函数
同样的事情也适用于ViewCopier这是因为当您编写时:
View view_;
它不像java中那样创建空引用,它实际上尝试构造视图
因此,您应该使用指针并稍后实例化它,或者通过传递所需参数来构造它
或者在视图中添加一个不带任何参数的构造函数
同样的事情也适用于查看复印机- 由于声明了指向块的指针,因此在任何时候都没有尝试构造一个块(Block_uu将被初始化为nullptr),因此编译器不会抱怨缺少构造函数
将调用ViewCopier(NULL,NULL)
没有接受指针的构造函数;只有参考资料ViewCopier(const-BoundSingleSourceProjector*projector,bool-deep\u-copy)代码>;第二个参数转换为
<代码>视图bool
- 由于声明了指向块的指针,因此在任何时候都没有尝试构造一个块(Block_uu将被初始化为nullptr),因此编译器不会抱怨缺少构造函数
将调用ViewCopier(NULL,NULL)
没有接受指针的构造函数;只有参考资料ViewCopier(const-BoundSingleSourceProjector*projector,bool-deep\u-copy)代码>;第二个参数转换为
<代码>视图bool
块的构造函数中的初始值设定项列表中,可以调用视图的TupleSchema
构造函数:
view_(schema) {
“还有,为什么我可以使用ViewCopier(NULL,NULL)
初始化ViewCopier
”
因为NULL
可以隐式转换为bool
。您实际上正在调用此构造函数:
ViewCopier(const BoundSingleSourceProjector* projector, bool deep_copy);
为了防止这种情况发生,可以使用C++11的nullptr而不是NULL。如果您尝试了以下方法:
ViewCopier(nullptr,nullptr)
您将得到一个编译器错误。这是因为nullptr
不会隐式转换为bool
“但是为什么块不需要相同的值。”
因为在块的构造函数中的初始值设定项列表中,可以调用视图的TupleSchema
构造函数:
view_(schema) {
“还有,为什么我可以使用ViewCopier(NULL,NULL)
初始化ViewCopier
”
因为NULL
可以隐式转换为bool
。您实际上正在调用此构造函数:
ViewCopier(const BoundSingleSourceProjector* projector, bool deep_copy);
为了防止这种情况发生,可以使用C++11的nullptr而不是NULL。如果您尝试了以下方法:
ViewCopier(nullptr,nullptr)
您将得到一个编译器错误。这是因为nullptr
不会隐式转换为bool
1),因为您声明了指向块的指针,所以在任何时候都没有尝试构造块(Block
将初始化为nullptr
),因此编译器不会抱怨缺少构造函数或类的look private成员:view_u不是指向view的指针,那么在创建SegmentedTable时必须创建一个对象,但它没有默认构造函数(这是您得到的错误)。对于block_uu,它之所以有效,是因为您存储了一个指针(然后当您提供调用适当构造函数的所有参数时,它将延迟到对象创建)1)自从您声明了一个指向块的指针以来,您从未尝试过构造一个块(block_uu
将初始化为nullptr
),因此编译器不会抱怨缺少构造函数或类的look private成员:view_u不是指向view的指针,那么在创建SegmentedTable时必须创建一个对象,但它没有默认构造函数(这是您得到的错误)。对于block_uu,它之所以有效,是因为您存储了一个指针(然后,当您提供调用适当构造函数的所有参数时,它将延迟到对象创建)