원형 C ++ 헤더가 포함됩니다
-
16-09-2019 - |
문제
프로젝트에는 2 개의 수업이 있습니다.
// mainw.h
#include "IFr.h"
...
class mainw
{
public:
static IFr ifr;
static CSize=100;
...
};
// ifr.h
#include "mainw.h"
...
class IFr
{
public float[mainw::CSize];
};
그러나 나는이 코드를 컴파일 할 수 없으며 static IFr ifr;
선. 이런 종류의 교차 포함은 금지되어 있습니까?
해결책
이런 종류의 교차 침입은 금지되어 있습니까?
예.
MainW의 IFR 멤버는 참조 또는 포인터라고 말하면서, 다음과 같은 전체 선언을 포함하는 대신 앞으로의 선언이 수행 될 수 있습니다.
//#include "IFr.h" //not this
class IFr; //this instead
...
class mainw
{
public:
static IFr* ifr; //pointer; don't forget to initialize this in mainw.cpp!
static CSize=100;
...
}
또는 별도의 헤더 파일에서 csize 값을 정의하십시오 (따라서 ifr.h는 mainw.h를 포함하는 대신이 다른 헤더 파일을 포함 할 수 있습니다).
다른 팁
이 방법으로 서로를 포함시키는 두 개의 수업을 가질 수 없습니다. 당신은 그들 중 하나를 포인터로 만들 수 있습니다.
class foo;
class bar
{
foo* fooPtr;
}
당신은 foo를 구성하고 바의 생성자에있는 fooptr에 할당하고 파괴자에서 그것을 자유롭게해야합니다. 그것은 확실히 조금 더 많은 일입니다.
또는이 경우, 주석가 중 한 명이 제안한 것처럼 Mainw :: 크기를 정의하고 공통적 인 어딘가에 넣습니다.
당신은 이와 같은 재귀를 포함 할 수 있지만 일반적으로 어떤 종류의 헤더 가드 트릭을 사용해야합니다. 그렇지 않으면 전처리 기는 무한 재귀로 들어갑니다. 이렇게하면 근본적인 문제를 해결하는 데 실제로 도움이되지 않습니다. 본질적으로 두 개의 클래스가 있기 때문에 각각 상호 상호 상호 다른 클래스가 필요하기 때문입니다.
class mainw
{
public:
static IFr ifr; // needs to see the full declaration of the Ifr class in order to know the size
...
class IFr
{
public float[mainw::size]; // needs to see the full declaration of mainw in order to know what size is
어떤 것을 먼저 놓았는지 상관없이 다른 것들에 대한 자세한 내용을 알아야하기 때문에 컴파일 할 수 없습니다.
이러한 종류의 원형 포함은 C ++에 의해 허용되지 않지만 이것은 작동해야합니다.
IFR.H를 포함하는 대신 선언문을 사용하십시오.
class IFr;
class mainw
{
//...
};
이것은 만들 것입니다 mainw
잘 컴파일하지만 ifr
회원도 IFR.H를 포함해야합니다.
이것은 단지 작동하기 때문입니다 ifr
a static
회원. 그렇지 않으면 컴파일러는 정확한 크기를 알아야합니다. ifr
.
또한 다른 많은 사람들이 말했듯이, 동일한 헤더를 두 번 포함하는 오류를 피하기 위해 두 헤더 주변의 경비원을 포함해야합니다.
#ifndef IFR_H
#define IFR_H
//...
#endif
넌 할 수있어:
// mainw.h
#include "IFr.h"
class mainw {
public:
static const size_t CSize=100;
static IFr<CSize> ifr;
...
};
// IFr.h
template <size_t Sz>
struct IFr {
float sz_[Sz];
};
또는 런타임에 CSIZE가 변경 해야하는 경우 @chrisw 답변이 표시되는 것처럼 포인터 솔루션을 사용하십시오.
당신이 있다면
#ifndef __MYHEADER_NAME_WHICH_IS_RANDOM_PER_FILE_H
#define __MYHEADER_NAME_WHICH_IS_RANDOM_PER_FILE_H
//... Code..
#endif
코드를 감싸면 괜찮을 것입니다. :)
편집] 코드 철자 : o : p