在C++(类)中,我是否总是需要在头文件中声明函数?

All*_*uan 4 c++ class member-functions

例如,我有一个markerdisplay.cpp文件.markerdisplay成员函数看起来像下面的代码.

void MarkerDisplay::setMarkerStatus(MarkerID id, StatusLevel level, const std::string& text)
        {
               .....
        }
Run Code Online (Sandbox Code Playgroud)

我可以在markerdisplay.cpp中使用非成员函数吗?

例如,

bool validateFloats(const visualization_msgs::Marker& msg)
        {
              ...
        }
Run Code Online (Sandbox Code Playgroud)

函数validateFloats不是成员函数,我也没有在头文件中声明它.我只在validateFloats.cpp文件中使用此函数.

有人告诉我这可能会引起一些问题.真的吗?

Bau*_*gen 11

如果您不需要该函数.cpp,则在该文件中声明和定义它就足够了.当然,在第一次使用之前你仍然需要声明它,但这是我能想到的唯一"问题".

这是相当不错的主意来的头部声明功能,如果因为你使用了更少的"项目公开"的名称,并使其更容易找到函数的所有用途,从而使代码更易于维护,不需要.

如果你没有在标题中声明该函数,你应该这样做static:

static bool validateFloats(const visualization_msgs::Marker& msg);
Run Code Online (Sandbox Code Playgroud)

或者将它放在匿名命名空间中:

namespace {
    bool validateFloats(const visualization_msgs::Marker& msg);
}
Run Code Online (Sandbox Code Playgroud)

(首选)避免意外的交叉翻译 - 单位名称冲突.

  • @AllenYuan欢迎你!请注意,"谢谢" - 评论是不赞成的,因为计数为噪音.相反,您可以通过单击旁边的复选标记来接受您认为最有用的答案. (2认同)

πάν*_*ῥεῖ 6

我的问题是:我可以在markerdisplay.cpp中使用非成员函数,例如......

是的,你可以这样做.

如果不打算在公共API中使用该功能,那么最好的选择是在实现翻译单元中提供该功能.

您甚至可以在匿名命名空间中完全隐藏它(包括链接器)

namespace {
    bool validateFloats(const visualization_msgs::Marker& msg) {
       // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

或者只是static在翻译单元中定义一个函数应该具有相同的效果:

static bool validateFloats(const visualization_msgs::Marker& msg) {
   // ...
}
Run Code Online (Sandbox Code Playgroud)