52
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でエラーがあります:エラー:非静的メンバー参照は特定のオブジェクトに関連している必要があります。

どういう意味ですか?

4

3 に答える 3

67

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

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

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

 CPMSifDlg dlg; //create instance, assuming it has default constructor!
 dlg.EncodeAndSend(/*...*/);   //correct 
于 2012-03-22T08:14:49.547 に答える
12

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

classname::Staicfunction();

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

classname obj;
obj.Somefunction();

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

于 2012-03-22T08:27:58.357 に答える
11

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

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

EncodeAndSendオブジェクトの詳細を使用/関連付けない場合 (つまり) this、一般的な場合は、次のclass CPMSifDlgように宣言しますstatic

class CPMSifDlg {
...
  static int EncodeAndSend(...);
  ^^^^^^
};
于 2012-03-22T08:14:14.197 に答える