我在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
我不明白为什么我不能这样做。谁能帮助我理解为什么以及如何实现我想要的?
删除方法定义中的static
关键字。仅将其保留在类定义中。
static
放在文件中.cpp关键字意味着某个函数具有静态链接,即只能从同一文件中的其他函数访问。
static
和virtual
不应在定义中重复。它们只应在类声明中使用。
不需要在函数定义中具有static
也许最好的做法是"像 std lib 那样做"。即:全部内联,全部在标头中。
// in the header
namespase my_namespace {
class my_standard_named_class final {
public:
static void standard_declared_defined_method () {
// even the comment is standard
}
} ;
} // namespase my_namespace
就这么简单...
静态成员函数必须引用该类的静态变量。所以在你的情况下,
static void CP_StringToPString( std::string& inString, unsigned char *outString);
由于成员函数CP_StringToPstring
是静态的,因此该函数、inString
和 outString
中的参数也应声明为静态。
静态成员函数不引用它正在处理的对象,而是声明的变量引用其当前对象,因此返回错误。
您可以从成员函数中删除静态,也可以在将用于成员函数的参数声明为静态时添加静态。