嵌套类定义和通过文件

时间:2016-01-22 08:23:36

标签: c++ visual-studio

我试图创建类函数,我可以使用其他类,比如嵌套类。我对C ++还是比较陌生的,所以我可能实际上并没有尝试使用嵌套类,但据我所知,这就是我所处的位置。

现在,我刚刚在Chrome中写了这个,所以它没有实际用途,但我想保持代码简短。

我使用Visual Studio 2015在Windows 7上进行编译。

我在file_1.h中有两个类:

#pragma once
#include "file_2.h"
class magic_beans{
public:
    magic_beans();
    ~magic_beans();

    int getTotal();
private:
    double total[2]; //they have magic fractions
}

class magic_box{
public:
    magic_box(); //initiate
    ~magic_box(); //make sure all objects have been executed

    void update();

    magic_beans beans; //works fine
    magic_apples apples; //does not work

private:
    int true_rand; //because it's magic
};

...我在file_2.h中有一个类:

#pragma once
#include "file_1.h"
class magic_apples{
public:
    magic_apples();
    ~magic_apples();

    int getTotal();
private:
    double total[2];
}

现在,我发现我可以简单地改变:

magic_apples apples;

要:

class magic_apples *apples;

在我的构造函数中,我添加:

apples = new magic_apples;

在我的析构函数中,在你问之前:

delete apples;

为什么我必须使用指针引用外部文件中定义的类,而本地定义的类是否正常?

理想情况下,我希望能够像定义magic_beans一样定义magic_apples。我并不反对使用指针,但为了保持我的代码相当统一,我有兴趣找到另一种定义方法。

我在file_1.h中的magic_box类中尝试了一些magic_apples的替代定义,但是我无法使用其他任何东西。

1 个答案:

答案 0 :(得分:3)

您有循环依赖关系,file_1.h取决于file_2.h,这取决于file_1.h等。没有数量的标头包含警卫或编译指示可以解决该问题。

有两种方法可以解决问题,一种方法是使用前向声明指针。指针解决它,因为使用指针不需要完整的类型。

解决它的另一种方法是打破循环依赖。通过查看您显示的结构,似乎magic_apples不需要magic_beans类型,因此您可以通过简单地不包含file_1.h来打破圆圈。所以file_2.h应该看起来像

#pragma once
// Note no include file here!
class magic_apples{
public:
    magic_apples();
    ~magic_apples();

    int getTotal();
private:
    double total[2];
}