2

此代码未编译。

我可以做哪些修改来达到预期的效果?

ClassOne.h

#ifndef _CLASS_ONE_
#define _CLASS_ONE_

#include <string>
#include "ClassTwo.h"

class ClassTwo;

class ClassOne
{
private:
    string message;     
    friend ClassTwo;
    ClassTwo m_ClassTwo;

public:
    ClassOne();
    void Display();
};

#endif

类二

#ifndef _CLASS_TWO_
#define _CLASS_TWO_

#include <string>
#include "ClassOne.h"

class ClassOne;

class ClassTwo
{
private:
    string message;
    friend ClassOne;
    ClassOne m_ClassOne;

public:
    ClassTwo();
    void Display();
};

#endif

ClassOne.cpp

#include "ClassOne.h"
#include "ClassTwo.h"
#include <iostream>

ClassOne :: ClassOne()
{
    std::cout<<"ClassOne()...called\n";
    this->m_ClassTwo.message = "ClassOne - Message\n";
}

void ClassOne :: Display()
{
    std::cout<<this->m_ClassTwo.message;
}

类二.cpp

#include "ClassTwo.h"
#include "ClassOne.h"
#include <iostream>

ClassTwo :: ClassTwo()
{
    std::cout<<"ClassTwo()...called\n";
    this->m_ClassOne.message = "ClassTwo - Message\n";
}

void ClassTwo :: Display()
{
    std::cout<<this->m_ClassOne.message;
}

主文件

#include "ClassOne.h"
#include "ClassTwo.h"

int main()
{
    ClassOne one;
    one.Display();

    ClassTwo two;
    two.Display();
}

错误信息

1   error C2146: syntax error : missing ';' before identifier 'message'
2   error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
3   error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
4   error C2079: 'ClassTwo::m_ClassOne' uses undefined class 'ClassOne'
5   error C2146: syntax error : missing ';' before identifier 'message'
6   error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
7   error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
8   error C2039: 'message' : is not a member of 'ClassTwo'
9   error C2039: 'message' : is not a member of 'ClassTwo'
10  error C2146: syntax error : missing ';' before identifier 'message'
11  error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
12  error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
13  error C2079: 'ClassOne::m_ClassTwo' uses undefined class 'ClassTwo'
14  error C2146: syntax error : missing ';' before identifier 'message'
15  error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
16  error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
17  error C2039: 'message' : is not a member of 'ClassOne'
18  error C2039: 'message' : is not a member of 'ClassOne'
19  error C2146: syntax error : missing ';' before identifier 'message'
20  error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
21  error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
22  error C2079: 'ClassTwo::m_ClassOne' uses undefined class 'ClassOne'
23  error C2146: syntax error : missing ';' before identifier 'message'
24  error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
25  error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
4

3 回答 3

6

您永远无法编译该代码。您描述了一个系统,其中类型 A 包含类型 B,类型 B 包含类型 A。因此,类型 A 和 B 都递归地无限地包含自己,这是不可能的。你必须从根本上重新设计你的代码来消除这个问题。

另外,您的friend语法错误。

于 2012-02-27T07:51:53.467 回答
3

如前所述,您需要转发声明 ClassOne 或 ClassTwo 中的至少一个。

您的 ClassOne.h 可能看起来像:

#ifndef _CLASS_ONE_
#define _CLASS_ONE_

#include <string>

class ClassTwo;

class ClassOne
{
private:
    string message;
    ClassTwo* m_ClassTwo;

public:
    ClassOne();
    void Display();
};

#endif

如您所见,我们声明了 ClassTwo,但不包含它。我们基本上只告诉编译器是的,我们确实有一个 ClassTwo,但我们现在并不关心它包含什么。

还要看看你的 ClassTwo 成员,这现在是一个指针。原因是成员会要求编译器知道对象的大小,我们目前不知道它是什么。因此,您需要一个指针或一个参考。

接下来,在您的 ClassOne.cpp 中,将需要包含 ClassTwo.h,以获取该类的功能和大小。

但是有几件事:使用前向声明,您不能从 ClassTwo 继承,使用头文件中的前向类的方法(编译器如何知道存在哪些方法?)使用前向类定义函数或方法,即您必须通过引用传递或传递指针。

于 2012-02-27T08:07:10.930 回答
1

1)使用前向声明:

添加

class ClassTwo;

到 ClassOne.h

class ClassTwo;

到 ClassTwo.h

2)您需要使用 operator new 动态创建成员变量(或至少其中一个),或者如果您愿意,可以使用其中一个智能指针,例如boost::shared_ptr来自 boost 库或std::shared_ptr标准库(如果您使用 C++) 11.

于 2012-02-27T07:58:42.703 回答