1. ホーム

エラー: 非静的メンバ関数の無効な使用

2022-02-08 14:57:50

学習のために再掲載します。 https://blog.csdn.net/bill_ming/article/details/6872165

#include <iostream>


名前空間std.を使用する
クラスA
{ <未定義
public :
    A (int i)
    { <未定義
        a = i とする。


    }
    int fun(int b)
    { <未定義
        a*c+bを返します。
    }
    int c;
プライベート :
    int a;
};


int main()
{ <未定義
    A×(18)です。
    int A::*pc;
    pc = &A::c;
    x.*pc = 5;
    int (A::*pfun)(int);
    pfun = A::fun;
    A *p = &x です。
    cout << (p->*pfun)(10)<<endl;


    は 0 を返します。

}


error: invalid use of non-static member function 'int A::fun(int)'| エラーが発生します。


int (A::*pfun)(int)=A::fun;
に変更する。
int (A::*pfun)(int)=&A::fun;

C++では、クラス名+コロン2つ+メンバ名(学名は "quilified-id" )からなるもの、例えば A::x の場合、x がクラス A の static メンバでなければ A::x は左値を表すことができない。

また、関数型から関数ポインタ型へのデフォルトの変換については、関数型が左値の場合にのみ機能します。すべての非静的メンバ関数については、関数型から関数ポインタ型へのそのようなデフォルトの変換はなく、したがってコンパイラはこの
p = A::f
立ち上がるために必要なこと

(1) 関数のアドレスが決まるかどうかということですが、非静的メンバ関数ポインタはポリモーフィックな振る舞いをすることがあるので、少なくともコンパイル時にはそのアドレスは実際には決まらない。
(2) すべてのコンパイラは、クラスの非静的メンバ関数のコードのコピーを(コンパイル時か実行時かにかかわらず)1つだけ生成することは確かですが、オブジェクトごとに別々のコピーを持つ非静的メンバ変数と違って、非静的メンバ関数のコードのコピーを生成することはできません。-- しかし、これは言語の特徴ではなく、コンパイラの実装の詳細に過ぎないのではないでしょうか。抽象的な言語機能としては、非静的メンバ関数は、非静的メンバ変数と同様に、オブジェクトのインスタンスがないときは、左の値として整形されないということです。