티스토리 뷰
이 포스팅을 보고 공부했습니다.
https://genesis8.tistory.com/98
면접 준비를 하면서 c++ 개념을 공부하던 중, 간단하게 공부하고 넘어갔던 friend keyword에 대해 다시 공부해 보았다.
friend 는 private 로 접근이 제한된 함수나 변수에 접근할 수 있도록 해주는 keyword이다.
아래 예시들은 두찡이 학생과는 친구 이고, 선생과는 친구가 아닌 상태이다.
1. friend class
A class 안에 friend B class 를 선언하면 B는 A의 모든 함수와 변수에 접근 할 수 있다.
Student는 private로 선언된 함수나 데이터에 접근 할 수 있고, Teacher은 접근 할 수 없다.
#include <iostream>
class Dujjing {
private:
int some_data = 0;
void sayHello() { std::cout << "Hello\n"; }
friend class Student;
};
class Student {
public:
Student(Dujjing& dujjing) : dujjing(dujjing) {};
void sayHelloToDujjing() {
std::cout << "Hello Dujjing\n";
// dujjing hello to you
dujjing.sayHello();
// can modify private variable
dujjing.some_data = 4;
}
private:
class Dujjing& dujjing;
};
class Teacher {
public:
Teacher(Dujjing& dujjing) : dujjing(dujjing) {};
void sayHelloToDujjing() {
std::cout << "Hello Dujjing\n";
// dujjing cannot hello to you
dujjing.sayHello();
}
private:
class Dujjing& dujjing;
};
int main() {
Dujjing dujjing;
Student student(dujjing);
Teacher teacher(dujjing);
student.sayHelloToDujjing();
teacher.sayHelloToDujjing();
}
2. friend method (다른 클래스에 선언)
A class 안에 friend method를 B class 만 사용 가능하도록 선언 할 수 있다.
student의 private에 Friend로 선언된 함수는 Dujjing Class만 접근 할 수 있고, 다른 Class들은 접근 할 수 없다.
Student 에 선언된 friend method 는 Dujjing만이 호출 가능하다.
#include <iostream>
class Student;
class Dujjing {
public:
void changeSomeData(Student& student, int data);
};
class Student {
private:
int some_data = 0;
void changeSomeData(int data) {
some_data = data;
}
public:
friend void Dujjing::changeSomeData(Student& student, int data);
};
class Teacher {
public:
void changeSomeData(Student& student, int data);
};
void Dujjing::changeSomeData(Student& student, int data) {
// can call, can access variable
student.changeSomeData(data);
std::cout << "changed data " << student.some_data << '\n';
student.some_data = data + 1;
std::cout << "changed data " << student.some_data << '\n';
}
void Teacher::changeSomeData(Student& student, int data) {
// can not call, can not access variable
student.changeSomeData(data);
student.some_data = data;
}
int main() {
Dujjing dujjing;
Student student;
Teacher teacher;
int changed_data = 3;
dujjing.changeSomeData(student, changed_data);
teacher.changeSomeData(student, changed_data);
}
3. friend method 자신 class 에 적용
class 안에 friend를 넣으면 static한 method처럼 전역에서 접근이 가능하지만,
static과 차이점은 static은 실제 객체에서 값을 얻을 수 있는 것, friend는 실제 객체가 없기 때문에 값이 없다는 것이다.
#include <iostream>
#include <string>
class Dujjing {
public:
Dujjing(std::string name) : name(name) {};
private:
std::string name;
friend void sayHelloRight(Dujjing& dujjing) { std::cout << "Hello " << dujjing.name << '\n'; }
// this will error
friend void sayHelloWrong(Dujjing& dujjing) { std::cout << "Hello " << name << '\n'; }
};
int main() {
Dujjing dujjing("Dujjing");
sayHelloRight(dujjing);
sayHelloWrong(dujjing);
}
'개발 > 일상' 카테고리의 다른 글
2020 KAKAO BLIND 최종면접 합격 및 느낀점 (3) | 2019.10.23 |
---|---|
2020 KAKAO BLIND 1차면접 합격 및 느낀점 (0) | 2019.10.10 |
2020 KAKAO BLIND 1, 2차 합격 및 느낀점 (0) | 2019.10.02 |
코드포스 탑레 1700 달성 (0) | 2019.09.04 |
백준 학교 랭킹 30위 달성 (2) | 2019.08.24 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 우리는 vr핏이라고 부릅니다
- C++
- print shared_ptr class member variable
- Obstacle Avoidance
- 코어 남기기
- hole-punching
- Visual Studio
- red underline
- mysql
- 영상 픽셀화 하기
- 카카오
- Reciprocal n-body Collision Avoidance
- boost
- Golang
- 잘못된 빨간줄
- set value
- vr핏
- ad skip
- chrome-extension
- cockroach db
- RVO
- 봄날에 스케치
- it's called a vrpit
- 면접
- SuffixArray
- shared_from_this
- Quest2
- vrpit
- 클래스 맴버 변수 출력하기
- 에러 위치 찾기
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함