代码之家  ›  专栏  ›  技术社区  ›  Matthew Scouten

C++静态函数的前行声明

c++
  •  7
  • Matthew Scouten  · 技术社区  · 14 年前

    BigMassiveHeader.h:

    class foo
    {
        static void init_foos();
    }
    

    class foo;
    void foo::init_foos();
    int main(char** argv, int argc)
    {
        foo::init_foos()
    }
    

    此操作失败,出现“error c027:use of undefined type'foo'”

    有没有一种方法可以完成我想做的事情,而不让init\u foos成为一个自由函数,或者包括BigMassiveHeader.h(h对编译时有显著的影响,并且无处不在。)

    8 回复  |  直到 14 年前
        1
  •  14
  •   David Rodríguez - dribeas    14 年前

    不能向前声明类的成员,不管它们是否是静态的。

        2
  •  5
  •   Brian R. Bondy    14 年前

    不能转发声明类的成员,但可以在该名称空间中创建名称空间和函数并转发声明。

    namespace nsfoo
    {
         void init_foos();
    }
    

    如果需要,您的类可以将此函数作为朋友。

        3
  •  2
  •   Björn Pollex    14 年前

    如果你有 BigMassiveHeader 你应该考虑把它分成几个 SmallCompactHeaders . 如果您想表示许多类和函数在语义上属于同一个名称空间,可以将它们放在同一个名称空间中。您总是可以提供一个方便的标题,其中包括所有的小标题。

        4
  •  0
  •   Macke    14 年前

    如果必须使用free函数,或者拆分类。

        5
  •  0
  •   Raphaël Saint-Pierre    14 年前

    不能在C++中部分声明类,所以要么你必须把类的声明放在它自己的、较小的头中,或者…

    BigMassiveHeader.h 并使用预编译头。 http://msdn.microsoft.com/en-us/library/2yzw0wyd%28v=VS.71%29.aspx ,或GCC方式: http://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html .

        6
  •  0
  •   Alexandre Hamez    14 年前

    我知道这不是问题的重点,但是如果BigMassiveHeader.h不太可能随着时间的推移而改变,那么您应该看看 precompiled headers

        7
  •  0
  •   Pete Kirkham    14 年前

    当然,你并不是说你想做什么,而是说你想做什么。如果你想做的是 init_foos 在应用程序启动时调用一次,使用静态对象初始化,而不是在main中调用它。如果你想做的是 初始化foos 在创建所有静态对象之后调用,则更复杂。

    静态对象初始化,我的意思是在一个.cpp文件中,它可以访问 初始化foos 初始化foos 专用以防止多次呼叫:

    struct call_init_foos {
      call_init_foos () { foo::init_foos(); }
    } call_init_foos_on_startup;
    
        8
  •  0
  •   brkeyal    8 年前

    要转发类的单个方法的声明,必须将该方法声明为类的一部分(实际上是这样)。

    例如,在您的示例中,添加到main.cpp:

    class foo
    {
    public:
        static void init_foos();
    }