【问题标题】:In .cpp file, defining methods with "class Foo { void method() {} };" instead of "void Foo::method() {}"?在 .cpp 文件中,使用“class Foo { void method() {} };”定义方法而不是“void Foo::method() {}”?
【发布时间】:2009-12-08 01:34:06
【问题描述】:

当你在头文件中有函数的内联定义,并且你想将函数定义体从头文件中移出并放入 .cpp 文件中时,你不能只是剪切和粘贴函数,因为它们在标题中定义;你必须从这里转换语法:

class Foo
{
void method1() { definition(); }
void method2() { definition(); }
void method3() { definition(); }
};

到这里:

void Foo::method1() { definition(); }
void Foo::method2() { definition(); }
void Foo::method3() { definition(); }

编辑:只是想指出我希望避免的是必须在每个方法名称前面键入类名称。这似乎是一件小事,但是当您将大量函数定义从标头中移出并移入 cpp 文件时,它就会加起来。而当返回类型特别复杂时,你必须在行中找到每个返回类型结束和每个方法名称开始的位置。

所以我的问题是,我必须像上面的第二个代码块那样做吗?如果我这样做了会怎样(以下标准是否符合 C++?):

在 Foo.h 中:

class Foo
{
void method1();
void method2();
void method3();
};

在 Foo.cpp 中:

#include "Foo.hpp"    
class Foo
{
void method1() { definition(); }
void method2() { definition(); }
void method3() { definition(); }
};

【问题讨论】:

    标签: c++


    【解决方案1】:

    这不起作用:编译器将在您重新定义类时看到这一点。恐怕没有办法解决这个问题,这是语言的一部分。

    [ps:我知道这些工作很乏味,但我们都必须在某个时间或另一个时间完成它们。如果这是一项艰巨的工作,您可以考虑编写一个脚本来为您完成这项工作,但它确实必须是一项工作来证明这项工作是正确的,恕我直言,解析 C++ 并不好玩]

    【讨论】:

    • “我知道,我会用正则表达式!”
    • “然后我遇到了两个问题!”
    【解决方案2】:

    没有。我认为这违反了单一定义规则。无论如何,这是不允许的。请记住,编译器本身并没有真正看到#include。包含在源被提供给编译器之前被处理,所以编译器看到的是这样的:

    #line "foo.cpp" 1
    #line "foo.h" 1
    class Foo {
        void method1();
        ...
    };
    
    #line "foo.cpp" 3
    class Foo {
        void method1() {...}
    };
    

    所以它看起来像同一个符号的两个相互冲突的定义。

    【讨论】:

      【解决方案3】:

      是的,您必须按照顶部显示的方式进行操作(您的原始代码),我认为没有什么懒惰的方法。

      【讨论】:

        【解决方案4】:

        您可以将类名放在原始定义中。这总是有效的。不幸的是,对于内联,如果将其放入 cpp 文件中,您通常将不再真正内联,除非它非常简单或您使用编译器指令。

        如果它足够大,可以在大多数情况下移入 cpp,但您不希望它内联。

        另一件事是考虑“帮助”类。在其他地方定义那些,它们做了很多实现细节。然后你可以在派生类中调用它,它会被内联。

        【讨论】:

          猜你喜欢
          • 2020-03-08
          • 2020-06-16
          • 1970-01-01
          • 2010-10-24
          • 2013-11-06
          • 2012-04-04
          • 1970-01-01
          • 1970-01-01
          • 2017-07-28
          相关资源
          最近更新 更多