2017-12-18 14 views
-7

私はC++での委任を理解しようとしています。私は "委任は関数へのポインタ"であることを読んで、いくつかの例を見ましたが、残念ながら私はそれを手に入れません。試してみるためにコードを作ったのですが、プログラミング中に私が理解するかもしれないと思ったからです。残念ながら私はしませんでした。C++での委任

Olaf = &addNumber::changeAge(10); 

または

addNumber test; 

Olaf = &addNumber::changeAge(10); 

をどちらも動作しません:

#include <iostream> 
using namespace std; 

class person{ 
    private: 
     int age; 
    public: 
     person(age){ 
      this->age = age; 
     } 

     // virtual void changeAge(int arg) = 0; 
}; 

class addNumber { 
    public: 
     int changeAge(int arg) { 
      arg += arg+1; 
     } 
}; 

int main(){ 
    person Olaf; 
} 

は、だから私が試したこのsourceに基づきます。つまり、プログラムはコンパイルされていません。 changeNameaddNumberクラスメソッドを使用して、インスタンスpersonクラスの年齢を変更するpersonオブジェクトを作成します。

+1

* "私は、"委任は関数のポインタ "..."を読んでいます* - どこでそれを読んだのですか? – WhiZTiM

+1

あなたの質問は何ですか? – EvilTeach

+0

"_Both does not work._"という意味を定義してください。 –

答えて

1

まずは、機能のためのtypedefを使ってみましょう:

typedef int agechanger(int); 

これは、関数のインスタンスを周りに渡すためのコードで使用される新しいタイプ、agechangerを、作ります。

personクラスに適切なコンストラクタを与え、ageフィールドを適切に埋め込み、パブリックゲッターを提供する必要があります。次に、関数を引数として受け入れるメソッドを追加します。タイプはagechangerです。

class person 
{ 
private: 
    int age; 
public: 
    person(int age){ 
     this->age = age; 
    } 

    int getAge() const { 
     return age; 
    } 
    void changeAge(agechanger f) 
    { 
     age = f(age); 
    } 
}; 

その後classの内側に、私たちのタイプに合った機能を定義します。関数はstaticとしてマークされ、1ずつインクリメント渡さintを返していること

class addNumber { 
public: 
    static int changeAge(int arg) { 
     return arg + 1; 
    } 
}; 

お知らせ。

のはmainですべてをテストしてみましょう:

int main() 
{ 
    person Olaf(100); //instance of person, the old Olaf 

    Olaf.changeAge(addNumber::changeAge); //pass the function to the person method 

    std::cout << Olaf.getAge() << std::endl; //Olaf should be even older, now 
} 

はのは、クラスouside、この時間を別の関数を作成し、使用してみましょう:

int younger(int age) 
{ 
    return age -10; 
} 

int main(){ 

    person Olaf(100); 

    Olaf.changeAge(younger); 

    std::cout << Olaf.getAge() << std::endl; // Olaf is much younger now! 
} 

私は動作するコードを有するために起こっていることを願っています物事をより良く理解するのに役立ちます。あなたが尋ねる話題は、ここでは一般的に先進的だと考えられていますが、C++の基本的なトピック(例えば、functionsclassesなど)を見直すべきだと思います。

2
C++11

以降をお持ちのclosures(例えばスルーstd::functionなど...)とlambda expressions

(つまりは、anonymous functionsある)しかし、あなたはまたにpointersを持っている場合でも、あなたは正確に、C++でdelegationを持っていません関数とメンバ関数へのポインタ。しかし、閉包とラムダ式は表現の力で、代表団とほ​​ぼ同等です。

あなたはこれらの概念を理解するためにの情報を読んでください。C++ programming