2016-03-24 8 views
3

私はここで不条理なことを尋ねているかもしれませんが(そして私はC++で新しくなっています)、それでもやってみたいと思います。オブジェクトを受け取る関数でクラスのメソッドにアクセスしようとしていますが、同時にクラスを指定する必要がないため、テンプレートを使用しています。これは信じられないほど愚かに聞こえるが、とにかく、それはコードです:テンプレートを使ってクラスの関数を呼び出す

class Dog; 

class Animals{ 
public: 
// initializes all protected variables 
Animals(string fam, string gen, string espec, string subespec); 
~Animals(); 

template <class A> 
void Eat(A &); 

protected: 
    string family; 
    string genre; 
    string especies; 
    string subespecies; 
}; 

template <class A> 
void Animals::Eat(A &obj) 
{ 
    // this is where I don't know what I could do. 
    std::cout << obj.methodOfA(); 
} 

/---

int main() 
{ 
    Dog *myDog = new Dog; 
    myDog->Eat(myDog); 

    //supposing I had class "Cats" 
    Cat *myCat = new Cat; 
    myCat->Eat(myCat); 
} 

これは非常に愚かなことなので、答えに私の愚かさを指摘して自由に感じるかもしれません...誰かがこれに答えるならば。 私はこれが欲しかったのは、Animalsクラスから派生した多くのクラスを持ち、これらのクラスのどれとも無関係に、このメソッドを適切に使用できるようにしたかったからです。

ありがとうございました。

+2

あなたは「クラスの動物の派生している多くのクラスを持っている」とあなたは「彼らはこの方法を使用できるようにしたかった」場合は、このメソッドをしたいように、私に聞こえます純粋な仮想メソッドであり、それは各派生クラスで実装されています。これが仮想メソッドの目的です。 –

+1

Ooooh、ok、ありがとう!あなたの答えを決定的なものにする方法がありますか?再度ありがとう – Barbaroto

+0

いいえ、それは単なるコメントです。あなたは単にそれをupvoteすることができます。それは本当に多くはしませんが、それは問題ありません。 –

答えて

0

問題を解決できる方法の1つは、実行する関数を2番目の引数として渡すことです。次に、operator.*またはoperator->*を使用して関数を呼び出すことができます。これは、このようなものになります

class Animals { 
public: 
// initializes all protected variables 
Animals(std::string fam, std::string gen, std::string espec, std::string subespec); 
~Animals(); 

template <class A, class Fun> 
void Eat(A *&, Fun); 

protected: 
    std::string family; 
    std::string genre; 
    std::string especies; 
    std::string subespecies; 
}; 

template <class A, class Fun> 
void Animals::Eat(A *& obj, Fun function) 
{ 
    std::cout << ((obj->*function)()).c_str(); 
} 


class Dog : public Animals { 
public: 
    std::string TestFunction() { 
     return std::string("I am a dog"); 
    } 
}; 


int main() { 

    Dog *myDog = new Dog; 
    myDog->Eat(myDog, &Dog::TestFunction); 

    //... 
} 

をこのプログラムの出力は次のようになります。

I am a dog 

このラインを明確にする:

((obj->*function)()) 

最初operator->*を適用objに設定し、それにメンバ関数のアドレスを渡しますfunction。このステートメントの周りに括弧を付ける必要があることに注意してください。その後、あなたはそれを呼び出します(())。

上記のコードに関するご質問がある場合は、お気軽にお問い合わせください。

よろしく、

Philinator

関連する問題