[英]declare extern class c++ in hpp file and use it cpp file
我有兩個類:Individu 和 Cite,如您所見,Individu 是之前定義的
//file.hpp
#include <iostream>
#include <stdexcept>
#include <vector>
extern Cite CITE;
class Individu {
protected:
static int id;
TYPE t;
public:
Individu();
virtual ~Individu();
static int & getCompteur();
virtual void afficher(std::ostream& ) const;
virtual TYPE getType() const;
};
class Cite {
std::vector<const Individu *> tab;
public:
Cite();
~Cite();
void addPersonne(const Individu *);
int size() const;
};
std::ostream& operator<<(std::ostream&, const Individu& );
#endif
我需要添加一個 Individu 一個,它被實例化到 Cite 的選項卡向量中,並且只有一個 Cite 我聲明 Exctern CITE Cite 可以像這樣使用:
// file.cpp
#include <algorithm>
#include "file.hpp"
int Individu::id = 0;
Individu::Individu() {
CITE.addPersonne(*this);
id++;
}
Individu::~Individu(){
}
int& Individu::getCompteur() {
return id;
}
void Individu::afficher(std::ostream& o) const{
o << id;
}
void Personne::afficher(std::ostream& o) const {
o << nom << " " << id;
}
std::ostream& operator<<(std::ostream& o, const Individu& i ){
i.afficher(o);
return o;
}
TYPE Individu::getType() const {
throw IllegalException();
}
Cite::Cite(){
}
Cite::~Cite() {
}
void Cite::addPersonne(const Individu * i){
tab.push_back(i);
}
int Cite::size() const {
return tab.size();
}
當我編譯時,我得到了這個錯誤:
file.hpp:13:8: error: ‘Cite’ does not name a type
13 | extern Cite CITE;
| ^~~~
file.cpp: In constructor ‘Individu::Individu()’:
file.cpp:30:5: error: ‘CITE’ was not declared in this scope
30 | CITE.addPerconne(*this);
| ^~~~
make: *** [makefile:15 : build/deviant.o] Erreur 1
我知道 Cite 尚未定義,所以這就是我收到該錯誤的原因,那么我該如何修復它?
您的代碼中有兩個問題:
extern Cite CITE
在定義 class Cite
之前聲明,因此編譯器此時不知道Cite
是什么。 您應該將此聲明移到Cite
的定義之后。CITE
。 extern
變量聲明是編譯器的 promise,您稍后將定義該變量。 您實際上是在說“我 promise 一個名為CITE
的Cite
object 存在,即使您現在看不到它”。 您從未真正創建 object,從而破壞了 promise。 您需要在某處定義Cite CITE
(最有可能在 file.cpp 中)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.