- ベストアンサー
オブジェクト指向でインターフェースにないメソッドを呼ぶ方法とは?
- C++でポインターを抽象化するために、オブジェクト指向を使用しています。
- インターフェースは同じなのに継承先に内含されている変数のタイプが異なり、それを取得したい場合が出てきました。
- この問題を解決するためには、ポインターを取得するためのメソッドを追加するなどの方法があります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
dynamic_cast します。 #include <iostream> #include <exception> // ポインターを抽象化 class PointerInterface { public: virtual ~PointerInterface() {} }; // 抽象化したクラスを継承して整数型のポインタを作る class IntPointer : public virtual PointerInterface { friend void setIntPointer( PointerInterface* ptr, int value ); private: // int型のポインタ int *p; public: int* get() { return p; } }; // 抽象化したクラスを継承して少数型のポインタを作る class FloatPointer : public virtual PointerInterface { private: float *p; public: float* get() { return p; } }; PointerInterface* CreateInterface( bool flag ) { PointerInterface* result = 0; if( flag ) { result = new IntPointer; } else { result = new FloatPointer; } return result; } void setIntPointer( PointerInterface* ptr, int value ) { IntPointer* ip = dynamic_cast<IntPointer*>(ptr); if ( ip != 0 ) { ip->p = new int(value); } } int getIntPointer( PointerInterface* ptr) { IntPointer* p = dynamic_cast<IntPointer*>(ptr); if ( p != 0 ) return *(p->get()); else throw std::exception(); } void main() { PointerInterface* ptr = CreateInterface( true ); setIntPointer( ptr, 123 ); std::cout << getIntPointer(ptr) << std::endl; }
その他の回答 (1)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> やはりキャストするしかないのですかねぇ・・・ > なんかいいデザインパターンとかあればいいんですが・・・ templateが封じられてるので仕方ないですね。
お礼
今回は速度より安全性をとってdynamic_castを使用することにします。 ありがとうございました。
お礼
ありがとうございます。 やはりキャストするしかないのですかねぇ・・・ なんかいいデザインパターンとかあればいいんですが・・・ 思い浮かばなくて・・・ 参考にします。ありがとうございました。