Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;类初始化_C++_Constructor - Fatal编程技术网

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
    <代码>视图
    没有接受指针的构造函数;只有参考资料

不能将NULL传递给构造函数或引用的函数;你必须通过一些考试

  • 由于声明了指向块的指针,因此在任何时候都没有尝试构造一个块(Block_uu将被初始化为nullptr),因此编译器不会抱怨缺少构造函数

  • ViewCopier(NULL,NULL)
    将调用
    ViewCopier(const-BoundSingleSourceProjector*projector,bool-deep\u-copy);第二个参数转换为
    bool
    <代码>视图
    没有接受指针的构造函数;只有参考资料

不能将NULL传递给构造函数或引用的函数;你必须通过一些考试

“但是,为什么块不需要相同的设置。”

因为在
块的构造函数中的初始值设定项列表中,可以调用
视图的
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,它之所以有效,是因为您存储了一个指针(然后,当您提供调用适当构造函数的所有参数时,它将延迟到对象创建)