1. 程式人生 > >C++ 兩個包含類互相呼叫彼此的類成員變數和方法

C++ 兩個包含類互相呼叫彼此的類成員變數和方法

      在編寫C++程式時,有時候我們想在一個類中呼叫另一個類中的成員變數或方法,比如:兩個類 A和B ,A包含B,一般A中呼叫B中的方法比較簡單,重點是子類B如何呼叫父類A中的成員變數或方法呢?

      如果你選擇在A.h和B.h中互相包含標頭檔案,那麼肯定會報錯,因為檢測的時候會出現迴圈檢測引用,所以這個方法是不可取的。

      正確的方式是:

      1、在A.h標頭檔案中包含B.h

      2、在A.h標頭檔案A類中宣告一個B類的物件,可以是指標,也可以不是指標

      3、在B.h標頭檔案中用extern宣告類A,然後在類B中宣告一個A類的指標物件(必須是指標型)

      4、在A.cpp和B.cpp中都只需要包含A.h,B.cpp不需要包含B.h

      5、然後在A.cpp和B.cpp中分別定義A類的物件和B類的物件

      6、將它們的指標分別傳給對方的物件。如果是在不同的檔案,也可以是this傳值,比如在A.cpp中,給B.cpp中的A類物件傳遞A的當前物件,b->a=this;然後B類中的a就可以呼叫A類的成員方法了。

      7、最後就可以互相呼叫彼此的物件了。

注意:在標頭檔案中最好使用#ifndef #define #endif  ,防止多重定義錯誤。

     上程式碼:

A.h     

#ifndef _A
#define _A
#include "B.h"//A的標頭檔案匯入了B的標頭檔案

class A
{
public:
	int a;
	B* objectb;//A的標頭檔案匯入了B的標頭檔案,在呼叫B的時候就可以不用指標,也可以用指標

public:
	A();
	int geta();
	void handle();
	void hello();
};

#endif _A

B.h
#ifndef _B
#define _B

extern class A;//注意1:需要用extern宣告A

class B
{
public:
	int b;
	A* objecta;//注意2:呼叫A的時候需要用指標
public:
	B();
	int getb();
	void handle();
};

#endif _B

A.cpp

#include <iostream>
#include "A.h"
using namespace std;

A::A()
{
    this->a=100;
}

int A::geta()
{
    return a;
}
void A::hello(){
    this->a=500;
    printf("%d\n",a);
}

void A::handle()
{
    
    cout<<"in A , objectb.b="<<objectb->getb()<<endl;
}

B.cpp
#include <iostream>
#include "A.h"//注意3:在B.cpp裡面匯入A的標頭檔案 ,而不是B的標頭檔案

using namespace std;

B::B()
{
	this->b=200;
}

int B::getb()
{
	return b;
}

void B::handle()
{

	cout<<"in B , objecta->a="<<objecta->geta()<<endl;
}

main.cpp
#include <iostream>
#include <cstdlib>
#include "A.h"
using namespace std;

void main()
{
	A a;
	B b;

	a.objectb = &b;
	b.objecta = &a;
	
	a.hello();
	a.handle();

	b.handle();
	system("pause");
}

最後附上程式碼可以下載,我使用的vs2012。點選開啟連結

有問題和建議希望留言提出或者發郵箱給我,虛心傾聽學習! 郵箱:[email protected]

相關推薦

C++ 包含互相呼叫彼此成員變數方法

      在編寫C++程式時,有時候我們想在一個類中呼叫另一個類中的成員變數或方法,比如:兩個類 A和B ,A包含B,一般A中呼叫B中的方法比較簡單,重點是子類B如何呼叫父類A中的成員變數或方法呢?

java中多型父成員變數方法呼叫問題

class Super { String name = "父類名字"; public void setName(String name) { System.out.println(this.getClass());

C++/Java__中模板中的靜態成員變數靜態成員函式

C++: 類模板例項化的每個模板類(每個模板類指的是對於宣告時候對模板指定的型別,如List<int>,List<double>中的int,double.)都有自己的類模板靜

static方法中,不能訪問內非static成員變數方法

因為我們知道靜態的方法可以在沒有建立例項時使用,而申明為非靜態的成員變數是一個物件屬性,它只有在物件存在時引用,因此如果在物件未建立例項時我們在靜態方法中呼叫了非靜態成員方法自然是非法的,所以編譯器會

使用java反射操作的建構函式,成員變數成員方法

在java.lang.reflect包中有三個類Field,Method,Constructor.分別描述域,方法,構造器。參考API,關於這三個類的說明。 在執行時使用反射分析物件,如果訪問的是私有域或是私有方法,私有建構函式,會丟擲IllegalAccessExce

Java 成員變數方法以及構造方法

       首先要說的是物件,簡單的說,物件是對客觀世界中的實體的對映。通俗地理解就是客觀世界的每一個事物都是一個物件。在java中,我們需要了解到的還有這個物件的屬性和方法,即這個是事物的外觀、大小等可描述的客觀存在(就是所說的屬性)還有這個事物所能實現的功能或者事物的

不同子擁有基的不同的靜態成員變數方法

大家都知道所有子類物件(不管是相同的子類或是不同的子類)擁有基類的相同靜態成員變數。因為靜態變數是屬於類的,而不是屬於某個物件的。所以如下程式碼: #include <iostream> using namespace std; class Base { pu

重寫——上轉型物件不能操作子新增成員變數方法但可以操作子繼承重寫的方法

上轉型物件不能操作子類新增成員變數和方法但可以操作子類繼承和重寫的方法 子類重寫父類的前提是;方法名一樣,引數型別和個數一樣。 舉一例可以說明之:  class Father { public Father() { }public void shout(Object word

C++標頭檔案互相包含

在構造自己的類時,有可能會碰到兩個類之間的相互引用問題,例如:定義了類A類B,A中使用了B定義的型別,B中也使用了A定義的型別class A{    int i;    B b;}class B{    int i;    A* a;}請注意上面的定義內容,一般情況下是不能出

待補遺(6)[C++]如何通過友元宣告互相訪問對方的非公有成員

1.設有類A,和類B兩個類,假定類A的宣告在類B之前(類的宣告總會有先後之分) 2.類A與類B,各自具有一個private許可權的func函式。 一、類A,類B的宣告如下(定義在在同一個原始檔中): #include <iostream> class A{

C++互相引用

A.h #include "A.h" #include "B.h" class A {  ...     B b; }   B.h class A; class B {   ...  

C#共享記憶體程序軟體互相讀寫實現

我在網上找了很多原始碼,沒有一個可以用2個程式實現互相讀寫的共享記憶體功能,一般只能單向傳遞,沒有任何意義,於是我自己封裝了一個類,但是看起來沒任何問題,就是不能共享,現在我把程式碼貼出來,請大神幫忙看看 using System; using System.IO; using System

c++ 互相引用的問題

現在有兩個類要相互應用時,會出現各種各樣的問題,首先看第一個例子: #ifndef AH #define AH class B; class A { B *memb; A() { } ~A() { dele

C 連結串列中資料節點的資料域為一個字母 ,其中L1包含L2,在L1中找出與L2相等的字串,並將其逆置

前面相關操作在這呢,這個函式依託於此 //結構體 typedef struct Node { ElementType data; struct Node * next; } LNode, * LinkNode; //兩個連結串列中資料節點的資料域為一個字母 http

c++相互調用

splay ostream () inf 文件 結果 頭文件 般的 gin 有可能會碰到兩個類之間的相互調用的問題,例如:定義了類A和類B,A中使用了B定義的類型,B中也使用了A定義的類型 class A { B b; }; class B {

C# 進程之間通訊(管道通信 )

click 失敗 != else iss nbsp obj c# cal #region 客戶端 NamedPipeClientStream pipeClient = new NamedPipeClientStream("localhost

C#實體之間相同屬性的映射

per sta pos ping nbsp info != 相同 urn public static R Mapping<R, T>(T model) { R result = Activator.CreateIn

C 二叉樹相似不相似

看下這兩個樹的結構是不是一樣的 //看兩個樹是不相似的 bool isXiangsi(BiThrTree t1, BiThrTree t2){ //相判斷這句,看其是否為空 if (!t1 && !t2) { return tr

C# datatable中的資料快速比較返回交集或差集

轉自: https://www.cnblogs.com/lacey/p/5893380.html 如果兩個datatable的欄位完全一致的話,可以直接使用Except,Intersect //Except()差集var tempExcept = dt1.AsEnumerable().Excep

C# datatable中的數據快速比較返回交集或差集

lac table 快速 數據 lan htm .html tar com 轉自: https://www.cnblogs.com/lacey/p/5893380.html 如果兩個datatable的字段完全一致的話,可以直接使用Except,Intersect //Ex