web-dev-qa-db-ja.com

「エラー:非静的メンバー参照は特定のオブジェクトに相対的でなければならない」とはどういう意味ですか?

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);
    }
}

return CPMSifDlg::EncodeAndSendエラーがあります:エラー:非静的メンバー参照は特定のオブジェクトに関連している必要があります。

どういう意味ですか?

33

EncodeAndSendは静的関数ではありません。つまり、クラスCPMSifDlgのインスタンスで呼び出すことができます。これを書くことはできません:

 CPMSifDlg::EncodeAndSend(/*...*/);  //wrong - EncodeAndSend is not static

むしろ次のように呼び出す必要があります。

 CPMSifDlg dlg; //create instance, assuming it has default constructor!
 dlg.EncodeAndSend(/*...*/);   //correct 
41
Nawaz

CPMSifDlg::EncodeAndSend()メソッドはnon _staticとして宣言されているため、CPMSifDlgのオブジェクトを使用して呼び出す必要があります。例えば.

CPMSifDlg obj;
return obj.EncodeAndSend(firstName, lastName, roomNumber, userId, userFirstName, userLastName);

EncodeAndSendがオブジェクトの詳細(つまりthis)を使用/関連付けしないが、class CPMSifDlgその後、staticとして宣言します。

class CPMSifDlg {
...
  static int EncodeAndSend(...);
  ^^^^^^
};
8
iammilind

静的関数のみがクラス名で呼び出されます。

classname::Staicfunction();

非静的関数は、オブジェクトを使用して呼び出す必要があります。

classname obj;
obj.Somefunction();

これがまさにエラーの意味です。関数は静的ではないため、オブジェクト参照を使用して呼び出す必要があります。

7