Phương thức bạn (friend method), hàm bạn (friend function), lớp bạn (friend class) trong C++

theo mình thấy
friend { something } gần như là phá vỡ tính chất bao đóng trong C++ -> không nên lạm dụng

friend method
friend function
friend class

các tài liệu về c++ chỉ nói về hàm bạn, nhưng qua ngâm cứu mình thấy có thể có phương thức bạn
(hay còn gọi là hàm bạn không độc lập, hàm bạn là hàm thành viên )

nhưng còn có 1 số lỗi, mặc dù mình thử build chạy , k báo lỗi, kết quả đúng, nhưng trên text editor có gạch chân và dí vào thì ra 1 lỗi cảnh báo

friend function

#include <iostream>
using namespace std;

class ham_ban{
private:
	int songuyen;
	friend void tang1dv(ham_ban &);	
public:
	ham_ban(int songuyen = 0 ){
		this->songuyen = songuyen;
	}

	friend void xuat(ham_ban a){  
		cout << a.songuyen << endl;
	}
};

void tang1dv(ham_ban &a){
	a.songuyen++;
}

int main(){
	ham_ban a;
	ham_ban b(2);
	xuat(a);
	xuat(b);
	ham_ban c;
	tang1dv(c);
	xuat(c);
	system("pause");
	return 0;
}

friend function multi class

#include <iostream>
using namespace std;

class songuyen;

class sothuc{
private:
	float st;
public:
	sothuc(float st = 1.9){
		this->st = st;
	}
	void xuat(){
		cout << st << endl;
	}
	friend void sosanh(songuyen, sothuc);
};


class songuyen{
private:
	int sn;
public:
	songuyen(int sn = 2){
		this->sn = sn;
	}
	void xuat(){
		cout << sn << endl;
	}
	friend void sosanh(songuyen, sothuc);
};

void sosanh(songuyen a, sothuc b){
	if (a.sn > b.st) cout << "nguyen > thuc" << endl;
	else if (a.sn < b.st) cout << "nguyen < thuc " << endl;
	else cout << "thuc = nguyen" << endl;
}

int main(){
	songuyen snguyen;
	sothuc sthuc;
	snguyen.xuat();
	sthuc.xuat();
	sosanh(snguyen, sthuc);
	system("pause");
	return 0;
}

friend method co doi class la ban truyen vao

#include <iostream>
using namespace std;

class sothuc;

class songuyen{
private:
	int sn;
public:
	songuyen(int sn = 0){
		this->sn = sn;
	}
	void xuat(sothuc);
};

class sothuc{
private:
	float st;
public:
	sothuc(float st = 1.1){
		this->st = st;
	}
	friend void songuyen::xuat(sothuc);
};

void songuyen::xuat(sothuc b){
	cout << sn << endl;
	cout << b.st << endl;   // wanrning
}

int main(){
	songuyen a;
	sothuc b;
	a.xuat(b);
	system("pause");
	return 0;
}

friend method khong co doi class la ban truyen vao

#include <iostream>
using namespace std;

class sothuc;

class songuyen{
private:
	int sn;
public:
	songuyen(int sn = 0){
		this->sn = sn;
	}
	void xuat();
};

class sothuc{
private:
	float st;
public:
	sothuc(float st = 1.1){
		this->st = st;
	}
	friend void songuyen::xuat();
};

void songuyen::xuat(){
	cout << sn << endl;
	sothuc sthuc;
	cout << sthuc.st << endl;
}

int main(){
	songuyen a;
	a.xuat();
	system("pause");
	return 0;
}

friend method multi class

#include <iostream>
using namespace std;

class songuyen;
class sothuc;

class sosanh{
public:
	void ss(songuyen, sothuc);
};

class songuyen{
private:
	int sn  = 2;
public:
	friend void sosanh::ss(songuyen, sothuc);
};

class sothuc{
private:
	float st = 2.0;
public:
	friend void sosanh::ss(songuyen, sothuc);
};


void sosanh::ss(songuyen a, sothuc b){
	if (a.sn > b.st) cout << "nguyen > thuc" << endl;
	else if (a.sn < b.st) cout << "nguyen < thuc " << endl;
	else cout << "thuc = nguyen" << endl;
}

int main(){
	songuyen a;
	sothuc b;
	sosanh c;
	c.ss(a, b);
	system("pause");
	return 0;
}

lỗi cảnh báo khi chạy friend method co doi class la ban truyen vao hoặc friend method khong co doi class la ban truyen vao, kết quả vẫn đúng, build k có lỗi, nhưng có lỗi cảnh báo trên màn hinh

friend class

#include <iostream>
using namespace std;

class songuyen{
private:
	int sn = 1;
	void xuat(){
		cout << sn << endl;
	}
public:
	friend class sothuc;
};

class sothuc{
private:
	float st = 1.2;
	songuyen a;
public:
	void xuat(){
		cout << st << endl;
		a.xuat();
		cout << a.sn << endl;
	}
};

int main(){
	sothuc a;
	a.xuat();
	system("pause");
	return 0;
}
2 Likes

các bạn trên diễn đàn, không quan tâm đến c++ lắm nhỉ :stuck_out_tongue:

This is my topic about Friend method in c++
-> Here

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?