[ad_1]
class myClass { public: static int sFunc(); int iAdd(int a, int b); }; int myClass::sFunc() { return iAdd(124,142); // ERROR apears here ; a nonstatic member reference must be relative to a specific object }
それはなぜですか、そしてエラーを防ぐ方法は?
解決策 1
クラス内の静的関数は、基本的にクラス外の関数と同じです。
class myClass { public: int iAdd(int a, int b); }; int sFunc() { return iAdd(124,142); }
かなり奇妙ですね。
静的メソッドとクラス外の関数の唯一の違いは、静的メソッドはクラスのプライベート メンバーを参照できますが、外部関数は参照できないことと、クラス外のコードは外部関数にアクセスでき、静的メソッドは外部関数にアクセスできることです。外界のほとんどからそれを隠して保護または非公開にします。
静的メソッド内では、指定されたクラスのプライベート メンバーにもアクセスできますが、最初にそのクラスのインスタンスを何らかの方法でその関数に渡す必要があります (静的メソッドは、クラス インスタンスへの this ポインターを持たない通常の関数と同様であるため)。 たとえば、myClass のインスタンスをグローバル変数としてインスタンス化すると、静的メソッドがそれにアクセスできます。または、myClass インスタンスをパラメーターとして静的メソッドに渡すことで this ポインターをシミュレートできます。または、単にインスタンスを作成することもできます。マイヤーのシングルトン パターンのような静的メソッドの内部:
class myClass { public: // meyers singleton, works fine static myClass& GetInstance() { static myClass g_Instance; return g_Intance; } private: myClass() {} }; // This wouldn't work because this GetInstance() doesn't see the private constructor of the class. myClass& GetInstance() { static myClass g_Instance; return g_Intance; }
解決策 2
メソッド iAdd も静的でなければなりません。
静的メソッドから非静的メソッドを呼び出すことはできません。
C++ の本を読んで、静的メソッドとインスタンス メソッドの違いについて少し読むことをお勧めします。 その過程で、インスタンスとは何かを学ぶ必要があります。
myClass a;
-> a は myClass のインスタンスです
-> a.iAdd(5,5); 動作しますが、10 を返す場合は、myClass クラスを何も使用しないため、通常のメンバーにする意味がありません。 したがって、iAdd(int a, int b) が a+b を返す場合。 の場合は、静的にするのが正しいです。
しかし、これを行うにはいくつかの読み物が必要です。これはすべて非常に基本的なものです。
解決策 3
sFunc は静的であるため、クラスの特定のインスタンスとは関係ありません。
iAdd は静的ではないため、呼び出すにはクラスのインスタンスが必要です。
次のコードを検討してください。
myClass::sFunc();
これは通常は有効ですが、クラスのインスタンスなしで sFunc() が iAdd() を呼び出す方法を考えてみてください。 答えは; できません。 そのため、エラーが発生します。
それが役立つことを願っています。
[ad_2]
コメント