2013-06-11 4 views
1

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

1) 블록에 대한 포인터를 선언 했으므로 블록을 생성하려고 시도하지 않았으므로 ('block_'은 'nullptr'으로 초기화 됨) 컴파일러가 누락 된 생성자에 대해 불평하지 않습니다. – slaphappy

+0

개인 멤버보기 귀하의 클래스의 : view_ 포인터가 아니라 다음 SegmentedTable하지만 만들어집니다 개체를 만들어야합니다 그것은 기본 생성자가 (그것은 당신이 오류)를 가지고 있지 않습니다. block_의 경우 포인터를 저장하기 때문에 작동합니다 (객체 생성은 적절한 생성자를 호출하는 모든 매개 변수를 제공 할 때 연기됩니다) –

답변

1

"그러나 블록이 필요하지 않은 이유는 무엇입니까?"Block의 생성자의 초기화 목록에서, 당신은 view_TupleSchema 생성자를

를 호출하기 때문에 :

view_(schema) { 

"NULL이 암시 적으로 변환하기 때문에 또한 왜 ViewCopier(NULL, NULL) "

ViewCopier 초기화하기 수 bool. 실제로이 생성자를 호출합니다.

ViewCopier(const BoundSingleSourceProjector* projector, bool deep_copy); 

이 문제를 방지하려면 NULL 대신 C++ 11의 nullptr을 사용할 수 있습니다. 시도한 경우 :

ViewCopier(nullptr,nullptr) 

컴파일러 오류가 발생합니다. 은 암시 적으로 bool으로 변환되지 않기 때문입니다.

3

당신이 쓸 때 때문입니다 :

View view_; 

그것은 자바와 같은 빈 참조를 생성하지 않으며, 실제로보기를 contruct하려고합니다.

그래서 포인터를 사용하고 나중에 인스턴스화하거나 필수 매개 변수를 전달하여 포인터를 생성해야합니다.

또는 매개 변수를 사용하지 않는 View에 생성자를 추가하십시오. 당신이 블록에 대한 포인터를 선언 한 이후 ViewCopier

0
  • 이, 아니 시점에서 하나의 구성을 시도하기위한

    똑같은 (block_은 nullptr로 초기화됩니다), 그래서 컴파일러는 불평하지 않을 것이다 누락 된 생성자.

  • ViewCopier(NULL, NULL)ViewCopier(const BoundSingleSourceProjector* projector, bool deep_copy);이라고합니다. 두 번째 매개 변수는 bool으로 캐스팅됩니다. View에는 포인터를받는 생성자가 없습니다. 유일한 참조.

생성자 또는 참조를받는 함수에는 NULL을 전달할 수 없습니다. 너 을 전달해야합니다.