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

时间:2017-03-13 23:02:19

标签: c++ class member-functions

例如,我有一个markerdisplay.cpp文件。 markerdisplay成员函数将如下所示。

void MarkerDisplay::setMarkerStatus(MarkerID id, StatusLevel level, const std::string& text)
        {
               .....
        }

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

例如,

bool validateFloats(const visualization_msgs::Marker& msg)
        {
              ...
        }

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

有人告诉我这可能会导致一些问题。这是真的吗?

2 个答案:

答案 0 :(得分:11)

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

如果不需要,在标题中声明函数是一个好主意 not ,因为你使用了更少的“项目 - 公共”名称,并且更容易找到函数的所有用途,从而使代码更易于维护。

如果您未在标题中声明该功能,则应将其设为static

static bool validateFloats(const visualization_msgs::Marker& msg);

或将其放在匿名命名空间中:

namespace {
    bool validateFloats(const visualization_msgs::Marker& msg);
}

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

答案 1 :(得分:6)

  

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

是的,你可以这样做。

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

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

namespace {
    bool validateFloats(const visualization_msgs::Marker& msg) {
       // ...
    }
}

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

static bool validateFloats(const visualization_msgs::Marker& msg) {
   // ...
}