2

我发现要扩展一个类,我必须这样做:

class x : public extendsThis { // rest here
};

因此,我在两个单独的文件中创建了 2 个类:

- particle.h -
class particle : public program {
};

 - program.h -

 class program {
    particle* myParticle;
 };

但是,在程序类中我想要粒子对象,然后再次扩展程序类。

然而,这将要求我在粒子类中有一个包含 program.h,并在程序类中包含一个particle.h 以让它们彼此了解。然而,这创建了一些使我无法编译的无限循环。

有什么办法可以解决这个问题,还是我做错了什么?

4

5 回答 5

3

是的,你可以解决这个问题。你可以做一个非常简单的类声明。

在 program.h 中:

class particle;

class program
{
  particle *myParticle;
};

请记住,您需要使用指向粒子的指针。

于 2011-05-24T18:24:15.920 回答
1

在某些情况下,您可以在其中一个包含文件中使用前向声明:

class a;

class b { a* ptr; };

这也可能表明您的设计可能需要重新考虑。一般来说,你的程序应该“知道”它的组件,而不是相反。程序的组件应该是具有简单定义好的功能的小型独立类。如果你纠缠所有的类,你会得到“远处的怪异动作”(错误)。;)

于 2011-05-24T18:28:54.627 回答
0

可能只是我,但似乎你做错了。为什么要用程序类来扩展粒子类?它理论上你会得到这样的东西:

class particle {
    particle *myParticle;
};

请注意扩展类可能会如何创建无限循环?我的意思是,这只是我的理解,我可能大错特错,但这是需要考虑的事情。有人让我知道我是否在这里离开。

于 2011-05-24T18:34:58.293 回答
0

我发布这个答案是为了解释我所说的从默认程序构造函数调用默认粒子构造函数的危险是什么意思。

#include <iostream>

class particle;

class program {
    particle* myParticle;

public:
    program();
};

class particle : public program {
public:
    particle()
    {
        std::cout << "Particle constructor\n" << std::flush;
    }
};

program::program()
{
    std::cout << "Program constructor\n" << std::flush;
    myParticle = new particle();
}

int main()
{
    program *myProgram = new program();
    delete myProgram;
    return 0;
}

当我编译并运行这个程序时,它继续打印“程序构造函数”,因为particle::particle()总是先调用program::program(),导致无限循环。注释掉该行myParticle = new particle();可解决此问题。

于 2011-05-24T18:56:12.890 回答
-2

在头文件中使用包含保护:http ://en.wikipedia.org/wiki/Include_guard

于 2011-05-24T18:23:27.740 回答