我正在尝试实现一个监听器。由于许多交叉引用,我试图避免包括其他类并预先定义它们
我的听众如下
·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标题?
答案 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>
方法,它的参数,返回值等,并愉快地编译它。