2009-03-10 22 views
4

静的メンバー関数で非静的データメンバーを呼び出すことはできますか? また、静的メンバー関数で非静的メンバー関数を呼び出すこともできますか?非静的および静的データおよび関数

あなたはどのようにしますか?

答えて

2

あなたはその非静的メンバ関数またはアクセスその非静的データメンバを呼び出すために、いくつかの既存のオブジェクトが必要になります。

+0

呼び出しが仮想ではなく、メソッドがデータメンバーにアクセスしない場合、オブジェクトは必要ありません。ヌルポインターで十分です。 – sharptooth

+0

確かに、C++は地雷です:)他の人が示唆しているようにローカルオブジェクトを作成することができます – epatel

+0

@sharptooth:いいえ - 任意の関数を呼び出すとnullポインタが不正になります。さらに、少なくとも1つのケース、すなわち仮想関数を呼び出す非仮想関数を呼び出すことができました。それは確かに爆発するでしょう。 – MSalters

0

インスタンスへの静的ポインタがない限り、通常はそうではありません。

問題は、静的メソッドが動作している特定のインスタンスを持たないことです。インスタンスを渡す場合は非静的メンバー関数を呼び出すことができますが、そうでない場合はnoを呼び出すことができます。

4

非静的メンバー関数を呼び出すか、非静的データメンバーにアクセスするには、オブジェクトのインスタンスが必要です。静的関数はそれを持っていないので、一般的にどこからでも得られない限り(静的関数がオブジェクトへのポインタを得るために使用するグローバルテーブルを持っていなければ)、それはできません。

しかし、非静的データにアクセスすることは想定されていません。 。 。彼らがしなければならない場合、彼らは静的であってはならない。あなたがしようとしていることを私たちに見せてもらえますか?

0

いいえ、何とか定義クラスのインスタンスにアクセスできる場合を除き、不可能です。

0

の両方にはい:もちろん

class A { 

    int x; 

    void f() { 
     staticfunc(); 
    } 

    static void staticfunc() { 
     A a; 
     a.x = 42; 
     a.f(); 
    } 
}; 

6

YES :-)上記で相互再帰は、いくつかの問題が発生します - ここにあなたができる、とはどのよう

class Foo 
{ 
    public: 
    static void staticFunc(const Foo & foo) 
    { 
      foo.memberFunc();  

    } 
     void memberFunc() const 
     { 
      staticFunc(*this); 

     } 


}; 
です

これは、静的メンバ関数と非スタティックメンバ関数の両方を呼び出す方法を示しています。

+0

あなたは静的にconst参照を渡しています。メンバー関数はconstでなければなりません。 – dirkgently

+0

ちょうど私が必要な..ありがとう –

+0

私は実装を元のバージョンに変更しました。それが助けてくれることを願っています –

5

人がdownvotingに地獄曲がっているので、ここでは概要です:

あなたは、クラスのインスタンスを渡す提供される静的メンバ関数内から非静的メンバ、またはそのポインタにアクセスすることができますまたは参照。オブジェクトの資格(つまり、静的メンバーの署名)は、内部からconstまたはconstnon-constのメンバー関数のみを呼び出すことができるかどうかを決定します。

非スタティックメンバーのデータ/関数は、基本的にメンバーデータ/関数をアクセス/呼び出すオブジェクトへのポインタであるthisポインタに依存しています。統計はクラスレベルであり、個々のオブジェクトに関連付けられていません。ただし、静的関数にクラスインスタンスまたはインスタンス自体の参照/ポインタを渡すと、呼び出しを行うことができます。

#include <iostream> 
struct Eg { 
Eg() : x(42), y(-42) {} 

static void foo(Eg const&f) { 
    std::cout << "foo\n"; 
    f.bar(); 

    // we are good -- x is mutable 
    std::cout << f.x << std::endl; 
    f.x = 24; 
    std::cout << f.x << std::endl; 

    std::cout << f.y << std::endl; 

    // you need non-const access for the following 
    // so they don't work -- see foo signature 
    //f.y = -24; compile error -- const l-value  

    // f.barbar(); same as above 
} 

void bar() const { // const required since we have a const reference 
std::cout << "bar\n"; 
} 

void barbar() { // const required since we have a const reference 
std::cout << "bar\n"; 
} 

    // note well the members 
    mutable int x; 
    int y; 
}; 

int main() { 
    Eg ex; 

    Eg::foo(ex); // or ex.foo(ex); 
} 

シングルトン/ファクトリメソッドのパターンを見てください - 彼らはあなたに興味があります。

0

これの典型的な使用例は、C++プロジェクトのオブジェクトインスタンスへのC APIコールバックを引き渡すことです。

// declared in some external C API 
typedef void __stdcall EnumDataCallback(void* context, void* data); 
void EnumData(EnumDataCallback* callback, void* context); 

// in consuming C++ Project 
class MyDataManager 
{ 
public: 
    void PollData() 
    { 
     ::EnumData(&MyObject::StaticEnumData, this); 
    } 
private: 
    static void __stdcall StaticEnumData(void* context, void* data) 
    { 
    MyDataManager* instance = (MyDataManager*)(context); 
    instance->EnumData(data); 
    } 
    void EnumData(void* data) 
    { 
    // actual callback code 
    } 
}; 
-1

静的メンバーはクラスの一部です。これらのメンバーは他のクラス変数とは無関係です。他のクラスメンバとは独立しているため、スコープ解決演算子を使用することができます。これらはクラス内のグローバルメンバーです。 クラスのインスタンスごとに非静的メンバーが作成されます。

+1

スペースは_after_の句読点になります。それは文末です。文の終わりではない。また、あなたの答えは、他の人がすでに言っていないことを言いますか? – jogojapan

関連する問題