2011-05-12 87 views
106
我有一个小麻烦在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

首先,您应该删除.cpp文件中的'static'关键字。 C++不允许它。 – Fezvez 2011-05-12 15:36:36

+0

错误是什么? – 2011-05-12 15:37:19

+9

@Fezvez:或者用'/ * static * /'替换它。我喜欢在.h和.cpp文件中使用相同的修饰符和默认参数。 – 2011-05-12 15:40:18

回答

179

删除方法定义中的static关键字。保持它在你的类定义。

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

+1

啊,明白了,所以方法定义中的'static'意味着只有该类中的其他方法才能访问该静态方法,而不是该类之外的其他方法。 – ABV 2011-05-12 15:42:17

+12

不是其他类方法,而是.cpp文件中的其他函数。无论如何,你不应该在C++中这样做。如果您希望C++函数具有内部链接,则应考虑将其放置在某个匿名名称空间中。在.cpp文件中使用'static'只是为了与C向后兼容。 – x13n 2011-05-12 15:46:08

+1

只是为了好奇...如果我在类中(在.h文件中)直接定义一个静态类成员,我该如何使用静态链接? – lumbric 2013-10-08 09:35:54

9

你并不需要有static在函数定义

32

关键词staticvirtual不应该在定义中重复。它们只应用于类声明中。

-3

静态成员函数必须引用该类的静态变量。所以你的情况,

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

因为你的成员函数CP_StringToPstring是静态的,在该函数的参数,inStringoutString也应该被声明为静态的。

静态成员函数没有引用它正在处理的对象,而是你声明的变量引用了它的当前对象,所以它返回错误。

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

+1

inString和outString是静态函数的参数。他们不是班级成员。没有必要将它们转换为静态。 – 999k 2014-12-09 11:08:24

+0

这是不正确的。您可以将非静态参数放置在静态成员函数中。但是对于类成员,您只能访问/修改函数中的静态元素。 – 2015-03-23 04:12:27