【问题标题】:Extending a class in C++ using header files使用头文件扩展 C++ 中的类
【发布时间】:2011-09-01 04:20:47
【问题描述】:

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

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

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

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

 - program.h -

 class program {
    particle* myParticle;
 };

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

然而,这需要我在粒子类中包含一个包含 program.h,并在程序类中包含一个粒子.h,以让它们彼此了解。然而,这造成了一些让我无法编译的无限循环。

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

【问题讨论】:

  • 为什么要这样做?如果一个程序有一个程序成员变量和一个程序成员变量和一个程序成员变量等等,你将永远能够实例化你的类。我想你可以使用 pointer 指向一个粒子(isa program),只要你不在构造函数中启动它,但这仍然看起来像一个真是个坏主意。
  • 是的,我很抱歉,行:“particle myParticle”应该是:“particle *myParticle”
  • @Ruddie 不要以使所有现有答案无效的方式编辑问题!
  • 哦,好吧,我很抱歉。虽然在你发表评论之后 - 我发现我忘记了它确实是一个指针。
  • @Ruddie 这些答案是否解决了您的问题?

标签: c++ class header superclass extending


【解决方案1】:

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

#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(); 行可以解决这个问题。

【讨论】:

    【解决方案2】:

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

    class particle {
        particle *myParticle;
    };
    

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

    【讨论】:

    • 你离这儿很远。 OP 在他的程序中需要一个指向粒子的指针,而不是一个实例。
    • 我知道,当我回答时,我只是放下他的东西。看起来他改变了它,我也会:) 否则,它会按照我的想法做吗?
    【解决方案3】:

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

    在program.h中:

    class particle;
    
    class program
    {
      particle *myParticle;
    };
    

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

    【讨论】:

    • 顺便说一句,我认为您应该考虑为什么需要这样做。也许你可以避免这种奇怪的相互依赖。
    • 不是还要保证粒子的构造函数不被程序的构造函数调用吗?
    • @Chris 不,你没有。事实上,鉴于上述“设计”,粒子的构造函数几乎肯定应该被程序的构造函数调用,如果它有的话。
    • @Neil 哦,对,对不起。程序的构造函数可以调用粒子的构造函数,只要后者不将其自己的 myParticle 成员变量分配给new particle。不过,这仍然很奇怪。
    • @Neil 我发布了一个带有示例代码的答案,该示例代码说明了我的意思要说什么
    【解决方案4】:

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

    class a;
    
    class b { a* ptr; };
    

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

    【讨论】:

    • 是的,我明白了。虽然我只是想让“程序”类保存我的 SDL_Surfaces(它们只是图像)。这些可以在粒子类中使用(我发现它很有用),尽管我也可以简单地将它们从程序类传递给粒子类。这会是一个更可行的选择吗?
    • 这听起来像是一个“更干净”的选项。那么这些类就不会相互依赖了
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      相关资源
      最近更新 更多