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

时间:2016-09-29 05:44:22

标签: c++

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

我的听众如下

·H

class Book
{
public:
    Book();
private:
    std::vector<MyListener *> listeners_;
    void Notify();
}

的.cpp

Book::Book() {}

void Book::Notify() {

    MyListener *p_listener;

    for ( int i = 0; i < this->listeners_.size(); i++ ) {

        p_listener = listeners_[i];
        p_listener->Update();  // ERRORS THROWN HERE WHEN NOT INCLUDING LISTENER.H

    }
}

当我包含listener.h文件

时,这一切都正常
#include "listener.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

有没有办法避免包含Listener标题?

2 个答案:

答案 0 :(得分:4)

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

然而,MyListener的实现文件实际上需要update的完整声明,因为它调用了listener.h方法,因此您需要在实现中包含class Book文件#!/bin/bash MONGO_DATABASE="nexgtv_16" APP_NAME="test" MONGO_HOST="127.0.0.1" MONGO_PORT="27017" TIMESTAMP=`date +%F-%H%M` MONGODUMP_PATH="/usr/bin/mongodump" BACKUPS_DIR="/home/mongodbbackups/backups/$APP_NAME" BACKUP_NAME="$APP_NAME-$TIMESTAMP" $MONGODUMP_PATH -d $MONGO_DATABASE mkdir -p $BACKUPS_DIR mv dump $BACKUP_NAME tar -zcvf $BACKUPS_DIR/$BACKUP_NAME.tgz $BACKUP_NAME rm -rf $BACKUP_NAME find /home/mongodbbackups/backups/test/ -mindepth 1 -mtime +7 -delete 而不是头文件。

答案 1 :(得分:1)

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

Listener

注意,编译器如何看到update有一个成员函数update?在编译器看到Listener完整声明之前,无法确定符号update。想想如果你使用update缺少一个参数,编译器是否可以在不看到Listener声明的情况下捕获此问题?因此,它无法翻译代码。如果您提供class Listener { public: Listener() { // some construction } void update() { // dosth } }; 的完整声明,例如

update

编译器可以知道 <Link to="/player" params={{ testvalue: "hello" }} className="btn">watch</Link> 方法,它的参数,返回值等,并愉快地编译它。