在源文件中定义静态方法,并在C++的头文件中声明
Define static method in source-file with declaration in header-file in C++
我在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
中的参数也应声明为静态。
静态成员函数不引用它正在处理的对象,而是声明的变量引用其当前对象,因此返回错误。
您可以从成员函数中删除静态,也可以在将用于成员函数的参数声明为静态时添加静态。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- Cppcheck生成xml转储文件
- 读取文件的最后一行并输入到链接列表时出错
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 如何将内容数组写入文本文件?
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到