C++ 使用指向类的指针时,预定义类不起作用

C++ 使用指向类的指针时,预定义类不起作用,c++,C++,我正在尝试实现一个侦听器。由于有许多交叉引用,我试图避免包含其他类并预先定义它们 我的听众看起来如下 h 但当我预先声明Listener时,它不起作用 class Listener; 它给了我两个错误 C:\CPP\qtTradeSim\qtTradeSim\test\book.cpp:33: error: C2027: use of undefined type 'Listener' C:\CPP\qtTradeSim\qtTradeSim\test\book.cpp:33: error:

我正在尝试实现一个侦听器。由于有许多交叉引用,我试图避免包含其他类并预先定义它们

我的听众看起来如下

h

但当我预先声明Listener时,它不起作用

class Listener;
它给了我两个错误

C:\CPP\qtTradeSim\qtTradeSim\test\book.cpp:33: error: C2027: use of undefined type 'Listener'
C:\CPP\qtTradeSim\qtTradeSim\test\book.cpp:33: error: C2227: left of '->Update' must point to class/struct/union/generic type

有没有办法避免包含侦听器头文件?

类目
的头文件中,您确实应该使用
MyListener
的前向声明,因为标头只定义指向
MyListener
的指针的
std::vector
,不需要知道
MyListener
的完整声明


然而,
类图书
的实现文件实际上需要
MyListener
的完整声明,因为它调用了它的
更新
方法,因此,您应该将
listener.h
包含在
class Book
的实现文件中,而不是包含在头文件中。

class Book
的头文件中,您确实应该使用
MyListener
的转发声明,因为标头只定义指向
MyListener
的指针的
std::vector
,不需要知道
MyListener
的完整声明


然而,
类图书
的实现文件实际上需要
MyListener
的完整声明,因为它调用了它的
更新
方法,因此,您可以将
listener.h
包含在
类书的实现文件中,而不是包含在头文件中。

假设编译器看到以下代码:

class Listener;

std::vector<Listener*> pListeners;

// some code...

for(auto& pListener: pListeners) {
    pListener->update();
}

编译器可以知道
update
方法、其参数、返回值等,并愉快地编译它。

假设编译器看到以下代码:

class Listener;

std::vector<Listener*> pListeners;

// some code...

for(auto& pListener: pListeners) {
    pListener->update();
}

编译器可以知道
update
方法、它的参数、返回值等,并愉快地编译它。

您需要在头文件中向前声明它,但实际上要将它包含在实现文件中。@AmiTavory Right。请将您的意见作为解决方案。@Rene谢谢。如果这是一个重复项,则进行了搜索,但找不到,因此回答。您需要在头文件中转发声明它,但实际上要将其包含在实现文件中。@AmiTavory Right。请将您的意见作为解决方案。@Rene谢谢。如果这是一个重复的搜索,但找不到一个,所以回答。啊,是的,这样做是有意义的。谢谢你的快速回答啊,是的,这样做是有道理的。感谢您的快速回答,预先声明所使用的所有部件是有意义的。不过,打字太多了。太糟糕的是C++不能只是在编译之前的某种预链接……有必要预先声明所有使用的比特和碎片。不过,打字太多了。太糟糕的C++不能只是在编译之前的某种预链接…
C:\CPP\qtTradeSim\qtTradeSim\test\book.cpp:33: error: C2027: use of undefined type 'Listener'
C:\CPP\qtTradeSim\qtTradeSim\test\book.cpp:33: error: C2227: left of '->Update' must point to class/struct/union/generic type
class Listener;

std::vector<Listener*> pListeners;

// some code...

for(auto& pListener: pListeners) {
    pListener->update();
}
class Listener {
public:
    Listener() { // some construction
    }
    void update() {
        // dosth
    }
};