如何在头文件中声明一个新类并在源文件中定义它而不会出现这种错误
How to declare a new class in the header and define it in the source file without this errors?
我的情况是,我想创建一个新类,然后在另一个创建的类(c++)中使用它,但不使用不同的头文件或源文件:两个类都应该在同一个地方,这样或那样。主类只能包含一个指向"子"类的指针。
现在我知道,在许多情况下,在头文件中定义一个类是完全可能的。事实上,如果一个人想要的不仅仅是一个指向"子类"的指针,而是实际使用头文件中已经存在的一个方法(例如,对于内联方法),他实际上必须在源文件中定义它:
class ChildClass
{
public:
bool myFunctions() { return true; }
}
class MainClass
{
private:
ChildClass* poChildClass;
inline bool getResult() { return poChildClass->myFunctions(); }
}
但是,假设我只想在那里有一个指针,而不需要调用我的ChildClass的方法,所以我应该只能声明ChildClass,然后在定义MainClass的同一个。cpp文件中定义它:
//in .hpp
class ChildClass;
class MainClass
{
private:
ChildClass* poChildClass;
}
//in .cpp
class ChildClass
{
public:
bool myFunctions() { return true; }
}
//etc.
一开始我不知道会有什么问题。但是,在尝试使用我的一个类(基于Qwt的QwtPlotPicker类)这样做时,我得到了一些编译错误(在最后一个版本中):
error: undefined reference to `vtable for Picker'
错误指出以下代码中的位置(在.cpp中):
class Picker : public QwtPlotPicker
{
Q_OBJECT
public:
Picker( QWidget* canvas ) :
QwtPlotPicker( canvas ) //Here lies the error the compiler says
//...
那么问题是什么呢?我得到这个"对'虚表'的未定义引用"问题是什么?
谢谢你的帮助,
Momergil
这是我在使用QT时永远遇到的问题,任何具有Q_OBJECT宏的类必须在运行qmake之前在头文件中列出(据我所知)。这甚至可能意味着将.cpp文件放在HEADERS部分。
相关文章:
- 使用命名空间时出现多个定义错误
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 尝试调用 .h 文件中定义的变量时出现变量未定义错误
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 链接阶段出现多重定义错误
- 避免模板类中的重定义错误
- 即使我没有包含多个文件,C++中的多个定义错误
- 跨多个类的全局变量而不会出现重定义错误?
- 尝试运行 wasm 函数时出现模块未定义错误
- C++ 预期的左大括号以及重定义错误
- C++:成员的越界声明必须是纯虚函数的定义错误
- c++中数组的未定义错误
- Visual C:模板类中的自定义错误消息
- 为什么C++模板不会导致多个定义错误?
- 只有一个定义/声明时标头声明变量的多堆定义错误
- C++ 在多个其他类中使用单个类 - 编译时出现多个定义错误
- 基类未定义.错误 C2504
- Q 斯坦达项重定义错误
- 可视化C++中的结构定义错误
- VC++ C2011 重定义错误 - 未使用的头文件