代码之家  ›  专栏  ›  技术社区  ›  klew

两个类和内联函数

  •  4
  • klew  · 技术社区  · 14 年前

    我有两个类,它们都使用另一个类中的一些,例如:

    // class1.h
    class Class1;
    #include "class2.h"
    
    class Class1 {
      public:
      static Class2 *C2;
      ...
    };
    
    // class2.h
    class Class2;
    #include "class1.h"
    
    class Class2 {
      public:
      static Class1 *C1;
      ...
    };
    

    当我像上面的例子那样定义它时,它是有效的(我也有一些 #ifndef 以避免无限的报头重复出现)。但是我还想在我的类中添加一些内联函数。我读 here 我应该把内联函数的定义放在头文件中,因为如果我把它们放在cpp文件中并想从其他cpp文件调用它们(当我这样做时,在链接过程中会得到未定义的引用),它就不起作用。但问题是这样的:

    // class1.h
    ...
    inline void Class1::Foo() {
      C2->Bar();
    }
    

    我得到错误:不完整类型struct class2的使用无效。

    那我该怎么做呢?

    3 回复  |  直到 14 年前
        1
  •  8
  •   Community c0D3l0g1c    7 年前

    您需要延迟包括头,但随后包括它并定义内联方法。通过在每个报头中这样做,它们是自给自足的,并且包含一个始终包含另一个 include guards 防止无限递归。

    A.HPP

    #ifndef INCLUDE_GUARD_B9392DB18D114C1B8DFFF9B6052DBDBD
    #define INCLUDE_GUARD_B9392DB18D114C1B8DFFF9B6052DBDBD
    
    struct B;
    
    struct A {
      B* p;
      void foo();
    };
    
    #include "B.hpp"
    
    inline
    void A::foo() {
      if (p) p->bar();
    }
    
    #endif
    

    B.HPP

    #ifndef INCLUDE_GUARD_C81A5FEA876A4C6B953D1EB7A88A27C8
    #define INCLUDE_GUARD_C81A5FEA876A4C6B953D1EB7A88A27C8
    
    struct A;
    
    struct B {
      A* p;
      void bar();
    };
    
    #include "A.hpp"
    
    inline
    void B::bar() {
      if (p) p->foo();
    }
    
    #endif
    
        2
  •  2
  •   GManNickG    14 年前

    你把它弄混了。你想要的是:

    // class1.h
    class Class2;
    
    class Class1 {
      public:
      static Class2 *C2;
      ...
    };
    
    // class2.h
    class Class1;
    
    class Class2 {
      public:
      static Class1 *C1;
      ...
    };
    

    并在源中包含相应的头。线:

    class Class1; // or Class2
    

    声明一个 不完整类型 ,并且可以有指向不完整类型的指针和引用。不过,在使用时,它必须是完整的。所以说“嘿,它会存在的!”在标题和源代码中告诉它是什么。

        3
  •  0
  •   Thomas Matthews    14 年前

    我的建议是将公共方法和成员放入基类中,然后从基类派生c1和c2。这可以解决循环依赖性问题。