我可以创建函数而无需在头文件中定义它们吗?

时间:2010-04-21 20:41:16

标签: c++

我可以在类中创建一个函数而不在该类的头文件中定义它吗?

5 个答案:

答案 0 :(得分:4)

你为什么不试着看?


[ʇʇ,uɐɔnoʎ'oᴎ]

更新:为了反思下面的注释,重点是C ++语言对智能编译的重视,编译器需要知道类的大小(因此需要声明所有成员数据)和类接口(因此需要所有函数和类型声明)。

如果您希望在不需要更改类标题的情况下灵活地向类添加函数,请考虑使用pimpl idiom。但是,如果每次调用或使用您添加的功能或数据,这将花费您额外的取消引用。实施pimpl有各种常见原因:

  • 减少编译时间,因为这允许您更改类而不更改依赖它的所有编译单元(#include it)
  • 减少类的依赖关系和一些经常改变的类的实现细节之间的耦合。
  • 正如Noah Roberts在下面提到的,pimpl也可以solve exception safety问题。

答案 1 :(得分:3)

没有。但是,你可以模仿这样的:


struct X
{
  void f();

  X();
  ~X();

private:
  struct impl;
  impl * pimpl;
};

// X.cpp
struct X::impl
{
  void f()
  {
    private_function();
    ...
  }
  void private_function() { ...access private variables... }

};

//todo: constructor/destructor...

void X::f() { pimpl->f(); }

答案 2 :(得分:2)

简答:不,你不能。

但是,如果您尝试将私有函数注入到仅在该类的实现中使用的类中,则可以在该类的.cpp文件中的匿名命名空间中创建一个函数,该文件接受该类型的对象通过引用或指针。

请注意,您将无法直接使用传递的对象内部状态(因为类没有办法声明与该匿名函数的友谊),但是如果该函数只是聚合来自公共接口的操作它应该工作得很好。

答案 3 :(得分:0)

不,你不能。反正它没有多大意义。包含头文件的类用户应该如何知道这些函数并使用它们?

答案 4 :(得分:0)

我不知道你想要做什么,但我有一种奇怪的直觉,即指向实现(pImpl)成语可能会有所帮助。如果要在cpp文件中添加公共方法,并且该方法未在标题中的类定义中声明,则不能这样做,并且没有意义。