그래서 나는 어떤 클래스 B 함수를 호출하고자하는 클래스 A를 가지고있다. 그래서 "b.h"를 포함합니다. 그러나 클래스 B에서는 클래스 A 함수를 호출하려고합니다. "a.h"를 포함하면 무한 루프가됩니다. 그것에 대해 무엇을 할 수 있습니까?두 클래스가 C++을 사용하여 서로를 볼 수 있습니까?
답변
각 클래스 (A와 B)에는 헤더 파일과 구현 파일이 있어야합니다.
각 헤더 파일 (예를 들어 A.h
) 다른 헤더 파일을 포함 할 수 없습니다 (예 : B.h
)하지만 (예를 들어 class B;
같은 문) 다른 클래스에 대한 전방 참조를 포함 할 수 있으며, 다음에 포인터 및/또는 참조를 사용할 수 있습니다 그 선언의 다른 클래스 (예 : class A
)는 데이터 멤버 및/또는 메소드 매개 변수로 B*
을 포함 할 수 있습니다.
각 CPP 파일 (예 : A.cpp
)은 두 개 이상의 헤더 파일 (예 : A.h
및 B.h
)을 포함 할 수 있습니다. 각 CPP 파일에는 자체 헤더 파일이 먼저 포함되어야합니다 (예 : A.cpp
에 A.h
이 포함되어야하고 B.h
이 포함되어야합니다). B.cpp
에는 B.h
, 그 다음에 A.h
이 포함되어야합니다.
각 헤더 파일에는 클래스의 정의가 아닌 선언 만 포함해야합니다. 예를 들어 클래스의 메소드의 서명은 나열되지만 메소드의 본문/구현은 나열되지 않습니다 (메소드 본문/구현은 헤더 파일에없는 .cpp
파일). 헤더 파일에는 구현 세부 사항이 포함되어 있지 않으므로 다른 클래스의 세부 정보를 참조하지 않아도됩니다. 많아야 그들은 예를 들어, B
이 클래스의 이름임을 알아야합니다. 즉, 헤더 파일을 다른 헤더 파일에 포함하는 대신 전달 선언문에서 가져올 수 있습니다.
헤더 (.h) 파일에 멤버 함수 선언 만 넣고 멤버 함수 정의는 구현 파일 (.cpp)에 넣습니다. 그런 다음 헤더 파일은 서로를 포함 할 필요가 없으며 두 구현 파일 중 하나에 헤더를 모두 포함 할 수 있습니다. , 이것은 당신이 포인터와 참조 유형 (A*
및 A&
)를 사용할 수 있습니다
class A;
아니지만 :
경우에당신은뿐만 아니라 회원 서명에 다른 클래스를 참조 할 필요가, 당신은 앞으로 선언을 사용할 수 있습니다 A
그 자체. 또한 회원에게 전화를 걸지도 않습니다.
예 :
// a.h
struct B; // forward declaration
struct A {
void foo(B* b); // pointers and references to forward-declared classes are ok
};
// b.h
struct A; // forward declaration
struct B {
void bar(A& a); // pointers and references to forward-declared classes are ok
};
// a.cpp
#include "a.h"
#include "b.h"
void A::foo(B* b) {
b->bar(*this); // full declaration of B visible, ok to call members now
}
// b.cpp
#include "a.h"
#include "b.h"
void B::bar(A& a) {
a.foo(this); // full declaration of A visible, ok to call members now
}
또한 문제를 해결하기 위해 forward declarations를 사용할 수 있습니다.
, #define
및 #endif
을 .h 파일에 넣으십시오.
- 1. 두 클래스가 서로를 참조하는 생성자가 있습니까?
- 2. 얼랑 노드는 서로를 볼 수 없습니다.
- 3. 2 개의 싱글 톤 클래스가 서로를 참조 할 수 있습니까?
- 4. 두 클래스가 서로 친구가 될 수 있습니까?
- 5. 두 클래스가 서로 액세스 할 수 있습니까?
- 6. TFS 프로젝트는 서로를 참조 할 수 있습니까?
- 7. 서로를 참조하는 파이썬 클래스
- 8. Joda-Time을 사용하여 전날을 볼 수 있습니까?
- 9. pycurl을 사용하여 오류 메시지를 볼 수 있습니까?
- 10. NHibernate에서 서로를 참조하는 두 객체를 매핑하는 방법은 무엇입니까?
- 11. 설명서를 볼 수 있습니까?
- 12. 클래스가 두 개 이상의 클래스를 확장 할 수 있습니까?
- 13. 인터페이스의 메서드를 볼 때 "최종"C# 코드를 볼 수 있습니까?
- 14. 모델은 뷰를 볼 수 있습니까?
- 15. 어떻게 두 개의 클래스가
- 16. C/C을 찾고 ++ 언어와 표준 라이브러리 사양
- 17. 한 번에 두 명 이상의 CAEAGLLayer를 볼 수 있습니까?
- 18. Android에서 동시에 두 개의 XML을 볼 수 있습니까?
- 19. jQuery 슬라이더가 서로를 제어합니다.
- 20. android map 두 점을 볼 수 없습니다
- 21. 어떻게 장면을 볼 수 있습니까?
- 22. 성능 향상을 볼 수 있습니까?
- 23. SSMS에서 이미지를 볼 수 있습니까?
- 24. BufferedReader를 들여다 볼 수 있습니까?
- 25. 서로를 알고있는 객체들의 집합
- 26. git을 사용하여 특정 파일의 변경 집합을 볼 수 있습니까?
- 27. 들어오는 요청을 IIS7에서 어떻게 볼 수 있습니까?
- 28. 서로를 참조하는 클래스에서의 메모리 누수
- 29. 두 트랜잭션이 서로를 차단하는 것 같지만 아무도 대기하지 않습니다.
- 30. lan에서 서로를 감지하는 소프트웨어
이 게시물은 질문에 대답하지 않습니다. –