在C ++中的头文件中声明的情况下在源文件中定义静态方法


142

我在使用C ++中的静态方法时遇到一些麻烦

示例.h:

class IC_Utility {
public:
    IC_Utility();
    ~IC_Utility();

    std::string CP_PStringToString( const unsigned char *outString );
    void CP_StringToPString( std::string& inString, unsigned char *outString, short inMaxLength );
    static void CP_StringToPString( std::string& inString, unsigned char *outString);
    void CP_StringToPString( FxString& inString, FxUChar *outString);

};

示例.cpp:

static void IC_Utility::CP_StringToPString(std::string& inString, unsigned char *outString)
{
    short       length = inString.length();

   if( outString != NULL )
    {
        if( length >= 1 )
            CPLAT::CP_Utility::CP_CopyMemory( inString.c_str(), &outString[ 1 ], length );

            outString[ 0 ] = length;
    }
}

我想打个电话:

IC_Utility::CP_StringToPString(directoryNameString, directoryName );

但是我得到一个错误:

error: cannot declare member function 'static void IC_Utility::CP_StringToPString(std::string&, unsigned char*)' to have static linkage

我不明白为什么我不能这样做。谁能帮助我理解为什么以及如何实现我想要的?


2
首先,您应该static在.cpp文件中删除关键字。C ++不允许这样做。
Fezvez

10
@Fezvez:或者,将其替换为/* static */。我喜欢在.h和.cpp文件中具有相同的修饰符和默认参数。
大卫·桑利

2
TL; DR:保留static在头文件中.h,表示“附加到类,而不附加到任何对象”,static.cpp文件中删除,它具有您在此处不需要的其他含义。
斯蒂芬·古里康

Answers:


228

static在方法定义中删除关键字。将其保留在您的类定义中。

static.cpp文件中的关键字表示某个功能具有静态链接,即。它只能从同一文件中的其他功能访问。


1
嗯,static在方法定义中知道了,这意味着该类中的其他方法只能访问该静态方法,而该类之外的其他方法都不能访问。
ABV

14
不是其他类方法,而是.cpp文件中的其他函数。无论如何,您都不应该在C ++中执行此操作。如果希望C ++函数具有内部链接,则应考虑将其放在某个匿名名称空间中。static.cpp文件中的用法仅用于与C向后兼容
。– x13n 2011年

1
出于好奇...如果我直接在类中(在.h文件中)定义了静态类成员,那么如何使用静态链接?
2013年

你不能 这样做是没有意义的,因为将程序链接在一起会导致出现无法解决的外部问题。
2013年

41

关键字staticvirtual不应在定义中重复。它们只能在类声明中使用。


11

您不需要static在函数定义中


-3

静态成员函数必须引用该类的静态变量。所以就你而言

static void CP_StringToPString( std::string& inString, unsigned char *outString);

由于成员函数CP_StringToPstring是静态的,因此该函数中的参数inStringoutString应声明为静态。

静态成员函数不引用其正在处理的对象,而是您声明的变量引用其当前对象,因此它返回错误。

您既可以从成员函数中删除静态函数,也可以在声明用于成员函数的参数也为静态函数时添加静态函数。


2
inString和outString是静态函数的参数。他们不是班级成员。无需将它们转换为静态。
999k 2014年

那根本是不正确的。您可以将非静态参数放在静态成员函数中。但是,对于类成员,您只能访问/修改函数中的静态成员。
Zachary Kraus 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.