NOVICE ALERT. 나는 다음과 같은 클래스C++ 클래스 초기화
보기를
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() 메서드가 정의되어 있지 않다는 오류 메시지가 나타납니다. SegmentedTable 생성자의 이니셜 라이저 목록에서 자동으로 초기화되기 때문에 필요한 View() 생성자가 없으므로 이해합니다. 그러나 나는 2 개의 질문이있다
1) 블록이 필요하지 않은 이유는 무엇입니까?
2) 내가 ViewCopier (NULL, NULL)로 ViewCopier를 초기화 할 수있는 이유는 무엇입니까? View에서는 그럴 수 없습니다. Doing View (NULL)은 또한 View :: View (NULL) 메서드가 정의되어 있지 않다는 것을 알려줍니다.
나는이 예제에서 사용 된 다른 클래스 정의를 제공하지 않았지만 질문이 그들없이 응답 될 수 있기를 희망한다.
1) 블록에 대한 포인터를 선언 했으므로 블록을 생성하려고 시도하지 않았으므로 ('block_'은 'nullptr'으로 초기화 됨) 컴파일러가 누락 된 생성자에 대해 불평하지 않습니다. – slaphappy
개인 멤버보기 귀하의 클래스의 : view_ 포인터가 아니라 다음 SegmentedTable하지만 만들어집니다 개체를 만들어야합니다 그것은 기본 생성자가 (그것은 당신이 오류)를 가지고 있지 않습니다. block_의 경우 포인터를 저장하기 때문에 작동합니다 (객체 생성은 적절한 생성자를 호출하는 모든 매개 변수를 제공 할 때 연기됩니다) –