使用头文件在C ++中扩展类

时间:2011-05-24 18:20:21

标签: c++ class header superclass extending

我发现要扩展课程我必须这样做:

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

所以,我在两个单独的文件中创建了两个类:

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

 - program.h -

 class program {
    particle* myParticle;
 };

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

然而,这将要求我在粒子类中包含一个include program.h,并在程序类中包含一个particle.h,让它们相互了解。然而,这创造了一些无法循环,使我无法编译。

有没有办法解决这个问题,或者我做错了什么?

5 个答案:

答案 0 :(得分:3)

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

在program.h中:

class particle;

class program
{
  particle *myParticle;
};

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

答案 1 :(得分:1)

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

class a;

class b { a* ptr; };

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

答案 2 :(得分:0)

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

class particle {
    particle *myParticle;
};

请注意扩展类可能会创建无限循环?我的意思是,这只是我的理解而且我可能是非常错误的,但这是需要考虑的事情。有人告诉我,如果我在这里等了。

答案 3 :(得分: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();行可以解决这个问题。

答案 4 :(得分:-2)

在标题文件中使用包含警示:http://en.wikipedia.org/wiki/Include_guard