簡體   English   中英

在C ++中使用好友功能

[英]Using friend function in C++

剛剛閱讀了有關朋友函數的信息,我試圖通過類B的朋友函數“ Print”訪問類A中的私有變量“ number”。我正在使用Visual Studio。 我的代碼編譯給了我很多各種各樣的錯誤,例如:

C2011:“ A”:“ class”類型的重新定義
C2653:“ B”:不是類或名稱空間名稱

請讓我耐心,並為實現目標提供正確的方法。

這是我的文件啊:

class A
{
public:
    A(int a);
    friend void B::Print(A &obj);
private:
    int number;
};

A.cpp:

#include "A.h"

A::A(int a)
{
    number=a;
}

BH:

#include <iostream>
using namespace std;
#include "A.h"
class B
{
public:
    B(void);
    void Print(A &obj);
};

B.cpp:

#include "B.h"

B::B(void){}

void B::Print(A &obj)
{
    cout<<obj.number<<endl;
}

main.cpp中:

#include <iostream>
#include <conio.h>
#include "B.h"
#include "A.h"

void main()
{
    A a_object(10);
    B b_object;
    b_object.Print(A &obj);
    _getch();
}

...第二,您可能需要在Ah頭文件中對類B進行前向聲明,以將B稱為朋友:

#ifndef _A_H_
#define _A_H_
class B;

class A
{
     friend class B;
};
#endif

UPDATE
我目前不太確定是否可以將成員函數聲明為朋友,我來看一下。

無法創建成員函數friend聲明,可以將全局函數聲明為整個函數,也可以將整個類聲明為friend,另請參見: C ++ ref,Friendship和Inheritance

通常,根本不使用friend並不是一個好設計主意,因為它將多個類緊密耦合在一起。 更好的解決方案是耦合接口(無論如何都不需要公開顯示)。
在極少數情況下,這可能是一個不錯的設計決策,但這幾乎總是適用於內部細節。

首先你需要放

#ifndef A_H
#define A_H
.... your A-class definition
#endif

在您的Ah中和在Bh中相似,因此可以防止同一文件的多個包含(這是您的重復定義錯誤)...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM