"错误:非静态成员引用必须与特定对象相关"是什么意思?

Osc*_*ata 33 c++ dll compiler-errors member-functions

int CPMSifDlg::EncodeAndSend(char *firstName, char *lastName, char *roomNumber, char *userId, char *userFirstName, char *userLastName)
{
    ...

    return 1;
}

extern "C"
{
    __declspec(dllexport) int start(char *firstName, char *lastName, char *roomNumber, char *userId, char *userFirstName, char *userLastName)
    {
        return CPMSifDlg::EncodeAndSend(firstName, lastName, roomNumber, userId, userFirstName, userLastName);
    }
}
Run Code Online (Sandbox Code Playgroud)

在线return CPMSifDlg::EncodeAndSend我有一个错误:错误:非静态成员引用必须相对于特定对象.

这是什么意思?

Naw*_*waz 44

EncodeAndSend不是静态函数,这意味着它可以在类的实例上调用CPMSifDlg.你不能写这个:

 CPMSifDlg::EncodeAndSend(/*...*/);  //wrong - EncodeAndSend is not static
Run Code Online (Sandbox Code Playgroud)

它应该被称为:

 CPMSifDlg dlg; //create instance, assuming it has default constructor!
 dlg.EncodeAndSend(/*...*/);   //correct 
Run Code Online (Sandbox Code Playgroud)

  • @OscarYuandinata:这意味着,该函数被声明为`private`或`protected`.看来你需要读一本关于C++的入门*书. (3认同)

iam*_*ind 8

CPMSifDlg::EncodeAndSend()方法声明为非static,因此必须使用对象调用CPMSifDlg.例如

CPMSifDlg obj;
return obj.EncodeAndSend(firstName, lastName, roomNumber, userId, userFirstName, userLastName);
Run Code Online (Sandbox Code Playgroud)

如果EncodeAndSend不使用/关联对象的任何细节(即this),但一般用于class CPMSifDlg声明它为static:

class CPMSifDlg {
...
  static int EncodeAndSend(...);
  ^^^^^^
};
Run Code Online (Sandbox Code Playgroud)


Roh*_*ews 8

只使用类名调用静态函数.

classname::Staicfunction();
Run Code Online (Sandbox Code Playgroud)

必须使用对象调用非静态函数.

classname obj;
obj.Somefunction();
Run Code Online (Sandbox Code Playgroud)

这正是您的错误所意味着的.由于您的函数是非静态的,因此您必须使用对象引用来调用它.