문제

프로젝트에는 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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top