【问题标题】:Separate class declaration from definition将类声明与定义分开
【发布时间】:2020-11-05 07:48:12
【问题描述】:

我想将类定义和声明分成 2 个单独的文件:foo.hppfoo.inl

foo.hpp 文件有Foo 类声明及其'描述,并且这个文件还包括foo.inl

/* foo.hpp */

// Foo class description comment
class Foo;

#include "foo.inl"

foo.inl 包含 Foo 定义,没有任何代码描述 cmets。

/* foo.inl */

class Foo {
    Foo() = default;

    void bar() {
        /* do something */
    }
}

我正在尝试在foo.hpp 中为Foo 的方法写评论,使其看起来像这样:

/* foo.hpp */

// Foo class description comment
class Foo;

// This is my default constructor
Foo::Foo();

// This is my very helpful function
Foo::bar();

#include "foo.inl"

但是编译器给出了一个可以理解的错误:invalid use of incomplete type 'class Foo'

那么有什么方法可以声明函数并以这种方式为它们编写 cmets 吗?

【问题讨论】:

  • 什么是.inl 文件?这个约定是从哪里来的?这种风格对我来说真的没有任何意义,它违背了很多 C++ 约定。为什么不像大多数 C++ 代码库那样 .cpp.hpp(或 .h)?
  • Foo::bar(); 是一个函数调用,而不是一个函数定义,并且它被调用的只是一个前向声明,所以它实际上无法编译任何东西。
  • .inl 文件用于将模板类和函数声明与.hpp 文件中的定义分开。所以.hpp 文件包含声明,.inl 文件包含定义。
  • 在您的示例中,声明和定义都在foo.inl 中。 C++ 不允许对类成员进行任何类型的单独声明。
  • 再一次,这个约定是从哪里来的?这不是我以前见过的,也没有任何意义。这里有什么好处?

标签: c++ class declaration


【解决方案1】:

Foo::Foo();void Foo::bar(); 区域成员函数声明,并且不允许在类之外。

你有点落后,在“main”头文件foo.hpp中定义类。然后在“inline”头文件foo.inl中定义函数为inline

大概是这样的:

// Foo.hpp
#pragma once

class Foo
{
public:
    // The default constructor
    Foo();

    // This is my very helpful function
    void bar();
};

#include "Foo.inl"

然后是内联文件:

// Foo.inl
#pragma once

inline Foo::Foo()
{
}

inline void Foo::bar()
{
}

如果内联函数足够简单,请将它们放在主头文件Foo.hppFoo 类定义中。如果它们太复杂而无法真正内联,请将它们放在单独的源文件 Foo.cpp 中,以便与您的应用程序一起构建(但包含在 #include 中)。

【讨论】:

    【解决方案2】:

    如果要拆分类方法的定义和声明,则必须定义类:

    // .h
    
    // That is my class Foo
    class Foo {
        // Constructor
        Foo();
    
        // This is my very helpful function
        void bar();
    };
    

    // cpp
    Foo::Foo() = default;
    
    void Foo::bar() {
        /* do something */
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多