2016-07-04 3 views
0

У меня возникла следующая проблема: есть ли у кого-нибудь хорошая идея?Ошибка: Недопустимое использование неполного типа

class Vector_2d; 

namespace Utils { 

class Align_vector : public Vector_2d { 
protected: 
    bool check_range(int x, int y); 

public: 
    enum alignment {left, right, up, down}; 

    Align_vector(Alignment alignment); 
    void set_alignment(Alignment alignment); 
    Alignment get_alignment(); 

}; 

} 

ошибка:

error: invalid use of incomplete type ‘class Vector_2d’

Но как есть ошибка?

+0

Вы не можете использовать неполный тип в качестве базового класса: http://stackoverflow.com/questions/553682/when-can-i-use-a-forward-declaration – Pumkko

+0

Вы публично наследуетесь от 'Vector_2d 'так что вам нужен доступ к реализации, поэтому вам нужно« включить »заголовок, где он объявлен, объявление прямого класса не поможет вам здесь – EdChum

ответ

4

class Vector_2d; Это объявление объявляет только класс с таким именем.
Чтобы наследовать от него, должно быть доступно полное определение класса.

class Vector_2d { 
    // Your code goes here 
}; 

class Align_vector : public Vector_2d { 
    // Other stuff 
}; 

Если у вас есть отдельные файлы заголовков для этих классов, обязательно включите их перед определением класса, который наследует.

#include <vector_2d.h> 

namespace Utils { 
    class Align_vector : public Vector_2d { 
     // Other stuff 
    }; 
} 

Проще говоря, когда класс B наследует от класса A, объекты класса B будут иметь A суб-объект как часть их расположения.
Таким образом, вы не можете определить макет B, который зависит от A, если у вас нет полного определения A.

+0

что вы имеете в виду точно? – kellerprogger

+0

@kellerprogger, см. Мое редактирование. – StoryTeller

Смежные вопросы