1

新手警报。我有以下课程

看法

class View {
 public:
  explicit View(const TupleSchema& schema)
      : schema_(schema),
        columns_(new Column[schema.attribute_count()]),
        row_count_(0) {
  }
  View(const View& other)
      : schema_(other.schema()),
        columns_(new Column[other.schema().attribute_count()]),
        row_count_(0) {

  }
  explicit View(const View& other, rowcount_t offset, rowcount_t row_count)
      : schema_(other.schema()),
        columns_(new Column[other.schema().attribute_count()]),
        row_count_(0) {

  }
     View(const Column& column, rowcount_t row_count)
      : schema_(TupleSchema::Singleton(column.attribute().name(),
                                       column.attribute().type(),
                                       column.attribute().nullability())),
        columns_(new Column[1]),
        row_count_(row_count) {

  }

 private:
  const TupleSchema schema_;
  scoped_array<Column> columns_;
  rowcount_t row_count_;
};

堵塞

class Block {
 public:
  Block(const TupleSchema& schema, BufferAllocator* allocator)
      : allocator_(allocator),
        columns_(new OwnedColumn[schema.attribute_count()]),
        view_(schema) {

    }
  }
}
 private:
  BufferAllocator* const allocator_;
  scoped_array<OwnedColumn> columns_;
  View view_;  // Full view on the entire block.
  DISALLOW_COPY_AND_ASSIGN(Block);
};

查看复印机

class ViewCopier : public BaseViewCopier {
 public:
  ViewCopier(const TupleSchema& schema, bool deep_copy);
  ViewCopier(const BoundSingleSourceProjector* projector, bool deep_copy);
};

当我将上述内容用作另一个类中的成员并为它编写一个构造函数时,如下所示

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_;
}

我收到一条错误消息,指出没有定义方法 View::View()。我理解这是因为不需要 View() 类的构造函数,因为它会在 SegmentedTable 构造函数的初始化列表中自动初始化。但是我有2个问题

1)为什么 Block 不需要相同的东西。

2) 为什么我可以用 ViewCopier(NULL, NULL) 初始化 ViewCopier 而我不能为 View 这样做。执行 View(NULL) 还告诉我没有定义方法 View::View(NULL) 。

我知道我没有提供示例中使用的其他一些类定义,但我希望没有它们就可以回答这个问题。

4

3 回答 3

3

这是因为当你写:

View view_;

它不会像在 java 中那样创建空引用,它实际上会尝试构造 View。

因此,您应该使用指针并在以后实例化它,或者构造它并传递所需的参数。

或者向 View 添加一个不带任何参数的构造函数。

同样的事情ViewCopier

于 2013-06-11T15:26:58.337 回答
1

“但是为什么Block不需要相同的东西。”

因为在Block构造函数的初始化列表中,你调用TupleSchema构造函数view_

view_(schema) {

ViewCopier“还有为什么我可以用“初始化ViewCopier(NULL, NULL)

因为NULL可以隐式转换为bool. 您实际上是在调用此构造函数:

ViewCopier(const BoundSingleSourceProjector* projector, bool deep_copy);

为了防止这种情况发生,您可以使用 C++11 的 nullptr 而不是 NULL。如果你试过这个:

ViewCopier(nullptr,nullptr)

你会得到一个编译器错误。那是因为nullptr不会隐式转换为bool.

于 2013-06-11T15:35:17.583 回答
0
  • 由于您声明了一个指向块的指针,因此您在任何时候都没有尝试构造一个(block_ 将被初始化为 nullptr),因此编译器不会抱怨缺少构造函数。

  • ViewCopier(NULL, NULL)会打电话ViewCopier(const BoundSingleSourceProjector* projector, bool deep_copy);;第二个参数被强制转换为 a boolView没有带指针的构造函数;仅供参考。

您不能将 NULL 传递给构造函数或接受引用的函数;你必须通过一些东西。

于 2013-06-11T15:28:57.187 回答