c++ using 前置声明_C++ 类声明 类前置声明范例
在編寫C++程序的時(shí)候,偶爾需要用到前置聲明(Forward declaration)。下面的程序中,帶注釋的那行就是類B的前置說明。這是必須的,因?yàn)轭怉中用到了類B,而類B的聲明出現(xiàn)在類A的后面。如果沒有類B的前置說明,下面的程序?qū)⒉煌ㄟ^編譯,編譯器將會(huì)給出類似“缺少類型說明符”這樣的出錯(cuò)提示。
代碼一:
// ForwardDeclaration.h
#include
using namespace std;
class B; // 這是前置聲明(Forward declaration)
class A
{
private:
B* b;
public:
A(B* b):b(b){}
};
class B
{
};
// Main.cpp
#include "ForwardDeclaration.h"
int main(int argc, char** argv)
{
B* b = new B();
A* a = new A(b);
delete a;
delete b;
return 0;
}
上面程序可以順利編譯和運(yùn)行(幾乎沒有做什么,也沒有輸出)。
是不是有了前置說明就萬事大吉了呢?我們看看下面的代碼(帶陰影部分的代碼是新增加的):
代碼二:
// ForwardDeclaration.h
#include
using namespace std;
class B; // 這是前置聲明(Forward declaration)
class A
{
private:
B* b;
public:
A(B* b):b(b){}
void someMethod()
{
b->someMethod(); // (1)
}
};
class B
{
public:
void someMethod()
{
cout << "something happened..." << endl;
}
};
// Main.cpp
#include "ForwardDeclaration.h"
int main(int argc, char** argv)
{
B* b = new B();
A* a = new A(b);
a->someMethod(); delete a;
delete b;
return 0;
}
一編譯,發(fā)現(xiàn)代碼(1)處出錯(cuò)。出錯(cuò)提示往往包括(不同的編譯器給出的提示會(huì)有所不同):
1. 使用了未定義的類型B;
2. “->somemethod”的左邊必須指向類/結(jié)構(gòu)/聯(lián)合/泛型類型
原因:
1. (1)處使用了類型B的定義,因?yàn)檎{(diào)用了類B中的一個(gè)成員函數(shù)。前置聲明class B;僅僅聲明了有一個(gè)B這樣的類型,而并沒有給出相關(guān)的定義,類B的相關(guān)定義,是在類A后面出現(xiàn)的,因此出現(xiàn)了編譯錯(cuò)誤;
2. 代碼一之所以能夠通過編譯,是因?yàn)槠渲袃H僅用到B這個(gè)類型,并沒有用到類B的定義。
解決辦法是什么?
將類的聲明和類的實(shí)現(xiàn)(即類的定義)分離。如下所示:
// ForwardDeclaration.h 類的聲明
#include
using namespace std;
class B; // 這是前置聲明(Forward declaration)
class A
{
private:
B* b;
public:
A(B* b);
void someMethod();
};
class B
{
public:
void someMethod();
};
// ForwardDeclaration.cpp 類的實(shí)現(xiàn)
#include "ForwardDeclaration.h"
A::A(B* b):b(b)
{
}
void A::someMethod()
{
b->someMethod();
}
void B::someMethod()
{
cout << "something happened..." << endl;
}
// Main.cpp
#include "ForwardDeclaration.h"
int main(int argc, char** argv)
{
B* b = new B();
A* a = new A(b);
a->someMethod();
delete a;
delete b;
return 0;
}
結(jié)論:
前置聲明只能作為指針或引用,不能定義類的對(duì)象,自然也就不能調(diào)用對(duì)象中的方法了。
而且需要注意,如果將類A的成員變量B* b;改寫成B& b;的話,必須要將b在A類的構(gòu)造函數(shù)中,采用初始化列表的方式初始化,否則也會(huì)出錯(cuò)。關(guān)于這點(diǎn)
見:
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的c++ using 前置声明_C++ 类声明 类前置声明范例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装archlinux_archlinu
- 下一篇: qtextedit 默认文案_QT中常用