2

私は2つのクラスを持っています。それぞれに、他のクラスを指すポインターがあります。そのため、そのうちの 1 つで前方クラス宣言を使用する必要があります。このメソッドは、テンプレートで関数を使用する必要があるまでは問題なく動作します (ヘッダー ファイルに宣言と実装の両方を記述する必要があります)。

より具体的には、私のコードは次のファイルのようなものです。これらのファイルは、Windows では MS Visual Studio 2010 によって問題なくコンパイルされました。しかし、XCode 4.3.2 によって Mac でコンパイルすると、ファイル ClassA.h で「不完全な型 'ClassB' へのメンバー アクセス」のエラーが発生しました。

XCodeを使用してMacでコンパイルできるようにする方法を誰か教えてもらえますか?

ファイル ClassA.h

#ifndef CLASS_A
#define CLASS_A

//#include "ClassB.h"

class ClassB;

class ClassA
{
public:
    ClassA();
    template <typename T> 
    void funcA(T *t);

    int iNum;
    ClassB *pB;
};    

template <typename T> 
void ClassA::funcA(T *t)
{
    iNum = *(int*)t;
    iNum += pB->iNum;
}

#endif

ファイル ClassA.cpp

#include "ClassA.h"

ClassA::ClassA()
{
    iNum = 1;
}

ファイル ClassB.h

#ifndef CLASS_B
#define CLASS_B

#include "ClassA.h"

class ClassB
{
public:
    ClassB();
    template <typename T> 
    void funcB(T *t);

    int iNum;
    ClassA *pA;
};

template <typename T> 
void ClassB::funcB(T *t)
{
    iNum = *(int*)t;
    iNum -= pA->iNum;
}

#endif

ファイル ClassB.cpp

#include "ClassB.h"

ClassB::ClassB()
{
    iNum = 2;
}

メインファイル

#include <stdio.h>
#include "ClassA.h"
#include "ClassB.h"

int main(void)
{
    ClassA objA;
    ClassB objB;

    objA.pB = &objB;
    objB.pA = &objA;

    int a = 11;
    int b = 22;
    objA.funcA(&a);
    objB.funcB(&b);

    printf("Class A: %d, %d\n", objA.iNum, objA.pB->iNum);
    printf("Class B: %d, %d\n", objB.iNum, objB.pA->iNum);

    return 0;
}    
4

1 に答える 1

2

pB->iNumを含めていないため、 A クラスからは不明な関数定義にアクセスしますclassB.h

前方宣言は、クラスを定義するのに役立ちます。その後、ヘッダー ファイルを含めることができます。次のようなことを試してください:

#ifndef CLASS_A
#define CLASS_A

class ClassB;

class ClassA
{
public:
    ClassA();
    template <typename T> 
    void funcA(T *t);

    int iNum;
    ClassB *pB;
};    

#include "ClassB.h"

template <typename T> 
void ClassA::funcA(T *t)
{
    iNum = *(int*)t;
    iNum += pB->iNum;
}

#endif

そして、同じことをしますclassB.h

于 2012-10-16T22:41:02.257 に答える