【问题标题】:Can't access class before other class c++在其他类c ++之前无法访问类
【发布时间】:2012-08-17 17:09:58
【问题描述】:

大家好,我无法按照我需要的方式设置头文件。为了简化我的问题,这里有一个例子:

#ifndef MYHEADER_H
#define MYHEADER_H    

class Parent
{
    Child mykid; //a kid of mine
    void dosomething(void);
};

class Child
{
        Parent * mydad; //pointer back to my dad
        void dosomething(void);
};    

#endif // MYHEADER_H

我基本上需要在编译器知道之前在另一个类中使用一个类。有没有办法在我定义里面之前告诉编译器我的类?

【问题讨论】:

    标签: c++ class function header


    【解决方案1】:

    这个:

    class Parent;
    class Child
    {
            Parent * mydad; //pointer back to my dad
            void dosomething(void);
    };    
    class Parent
    {
        Child mykid; //a kid of mine
        void dosomething(void);
    };
    

    建议:将它们移到单独的标头中,在 Child.h 中声明 Parent 和在 Parent.h 中声明 #include "Child.h"

    Parent 需要Child 的完整定义才能工作,Child 只需要声明。

    我也建议你停止使用原始指针。

    【讨论】:

    • 谢谢,希望它能满足我的需要,感谢您的建议!
    【解决方案2】:

    当然:

    class Parent;
    
    class Child { Parent * dad; };
    class Parent { Child kid; };
    

    要定义一个类,所有类成员都必须有一个完整类型class Parent; 使 Parent 成为不完整类型。但是,对于任何类型T,无论是完整的还是不完整的,T *总是是一个完整的类型。

    【讨论】:

      【解决方案3】:
      class Parent;
      
      class Child
      {
              Parent * mydad; // it's enough to know class exists
              void dosomething(void);
      };  
      
      class Parent
      {
          Child mykid; // We must know size of a class
          void dosomething(void);
      };
      

      【讨论】:

        【解决方案4】:

        Parent 包含一个Child 对象,所以它的定义必须在Child 的定义之后;这是需要完整定义的类型的用途之一。

        Child 只包含一个指向Parent 的指针,因此它只需要一个Parent 类型的声明。

        所以你需要:

        // Declaration
        class Parent;
        
        // Definitions
        class Child
        {
            Parent * mydad; // type can be incomplete
            void dosomething(void);
        };
        class Parent
        {
            Child mykid; // type must be complete
            void dosomething(void);
        };
        

        当一个类型已声明但未定义时,它被称为不完整。您可以对不完整类型做各种事情,包括声明指针和对其的引用,以及在函数声明中将其用作参数或返回类型。您不能创建该类型的对象(包括声明该类型的非静态类成员),因为这需要定义才能了解各种事实,例如其大小。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-12-12
          • 1970-01-01
          • 2012-08-30
          • 1970-01-01
          • 1970-01-01
          • 2013-07-04
          相关资源
          最近更新 更多