Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果没有object=C++;_C++_Function_Compilation - Fatal编程技术网

C++ 如果没有object=C++;

C++ 如果没有object=C++;,c++,function,compilation,C++,Function,Compilation,我再次刷了一遍,发现一个错误: 无法在没有对象的情况下调用成员函数 我是这样打电话的: FxString text = table.GetEntry(obj->GetAlertTextID()); FxUChar outDescription1[ kCP_DEFAULT_STRING_LENGTH ]; IC_Utility::CP_StringToPString(text, &outDescription1[0] ); 行:IC_Utility::CP_stringtoStr

我再次刷了一遍,发现一个错误:

无法在没有对象的情况下调用成员函数

我是这样打电话的:

FxString text = table.GetEntry(obj->GetAlertTextID());
FxUChar outDescription1[ kCP_DEFAULT_STRING_LENGTH ];

IC_Utility::CP_StringToPString(text, &outDescription1[0] );
行:IC_Utility::CP_stringtoString(text,&outDescription1[0]);是不是得到了错误

我的职能是:

void IC_Utility::CP_StringToPString( FxString& inString, FxUChar *outString)
{
}

我知道我缺少的一定是一些简单的东西。

您需要在类声明中声明函数
static
。e、 g

class IC_Utility {
   // ...

   static void CP_StringToPString(FxString& inString, FxUChar *outString);

   // ...
};

您的方法不是静态的,因此必须从实例调用它(有点像错误所说的)。如果您的方法不需要访问任何其他实例变量或方法,那么您可能只想将其声明为静态的。否则,您必须获得正确的实例并在该实例上执行该方法。

如果您编写了
CP\u stringtoString
函数,则需要将其声明为static:

static void IC_Utility::CP_StringToPString( FxString& inString, FxUChar *outString)
或者,如果它是第三方代码中的函数,则需要声明一个
IC\u实用工具
对象来调用它:

IC_Utility u;
u.CP_StringToPString(text, &outDescription1[0] );

必须使用“static”关键字声明函数:

class IC_Utility {
    static void CP_StringToPString( FxString& inString, FxUChar *outString);
“静态”是正确的答案。或者,如果函数中未使用此指针,则可以向其传递NULL“this”指针:

((IC_Utility*)NULL)->CP_StringToPString(...);

声明静态,因为我没有像IC_实用程序那样首先创建对象;u、 xxx();等你有什么链接可以阅读吗?这里有一些值得一读的东西:但是,它确实是C++的一个非常基本的特性。你可能想拿起一本好的C++书籍/教程。不要这样做。@ GMMN如果它可以被静态化,那么当它被调用时不会有任何未定义的行为。至少显示一个反汇编列表,证明我错了。反汇编与任何事情有什么关系?在C++语言中,这会导致未定义的行为。在某些条件下,某些实现的某些输出与C++无关。@ GMN:AFAIK,在C++中,成员函数使用了y~这个调用调用约定,并接收了一个附加参数,即“这个”指针,它们可以使用。静态成员函数使用_cdecl调用约定,与C函数完全相同。这两种类型的函数都在类的命名空间中声明。对于非虚函数,该名称空间在编译时推导,在这两种情况下都使用静态链接。现在,如果函数不需要“this”中的任何内容,则可以将其声明为静态函数。那么,未定义的行为在哪里呢?
\uuu thiscall
,`uuu cdecl
等等。。。这些都是实施细节。同样:某些实现在某些条件下的某些输出与C++无关。当你假设一些实现细节时,我们并不是在谈论C++,而是在某个平台上讨论一些编译器。语言不是由编译器如何实现定义的,而是由标准定义的。标准说它会导致未定义的行为,事实也是如此。(换言之:该标准并不能保证
\uuThisCall`和朋友甚至存在,所以你怎么能与他们争论定义的行为?)