• 締切済み

comのidlにおけるオーバーロード

VC++2005を利用しています。 comのidlにおけるオーバーロード・オーバーライドは未サポートと聞いたのですが本当でしょうか? comで生成する自前クラスのオブジェクト比較を行いたく、 比較演算子(==)をオーバーロードしたいのですが、 他に方法があるのでしょうか?

みんなの回答

回答No.1

 こんばんは。  的外れでしたらご勘弁を。  operator系のオーバーロードは不可能な筈です。  I???インターフェースがClassAなのかClassBなのか、と言う事でしたら、当方の手元にあるCOM/OLEの書籍では、ピザの種類を見抜くため(クラスの比較とは違うのですが)にtypedef enumを使用して送り返しています。 interface I??? : public IDispatch { HRESULT STDCALL ClassIsA(TypeOfClass* pType) = PURE; }; //IDL側 typedef enum { ClassA, ClassB } TypeOfClass; [propget, id(?), helpstring("property get type of class")] HRESULT ClassIsA([out, retval] TypeOfClass* pType); //利用する時 TypeOfClass toc1; TypeOfClass toc2; p1->ClassIsA(&toc1); p2->ClassIsA(&toc2); if(toc1 == toc2) { //クラスの型が一致 }

hir0627
質問者

お礼

machongola様 ご回答ありがとうございました。 オブジェクト同士を比較する場合には やはり1クッション操作を入れないと駄目ですね。 今回の目的は、JavaScript側で if(toc1 == "ClassIsA") { } というようにObjectと文字列を比較したいので、 どうすれば良いのかと・・・

関連するQ&A

  • オーバーロード、オーバーライド、コンストラクタについて

    オブジェクト指向と言われているオーバーロード、オーバーライドの違いを詳しく教えてください。また、コンストラクタがオーバーライドするってことはあるのでしょうか?? 一応、スーパークラス・サブクラスという言葉は知っています。

    • ベストアンサー
    • Java
  • オーバーロードはオブジェクト指向プログラミングの枠組みで語られるべきか

    一部の書籍やサイトでは、オーバーロードがオブジェクト指向プログラミングの特徴であるかのような記述が見受けられるのですが、私はそれに疑問を感じます。 オーバーライドはクラス・継承に関わるためOOP特有のものであると思うのですが、オーバーロードはクラスとは全く切り離して考えられるからです。 確かにオーバーロードはクラスを作るときに有用な技術ではありますが、例えばC言語のような非オブジェクト指向言語でオーバーロードが使えたとしても、それなりに機能するはずです。 ひょっとしたら 「オーバーロードもオーバーライドもポリモーフィズムだろう」 ↓ 「ポリモーフィズムといえばオブジェクト指向」 のような話の展開でしょうか(いや、さすがに無理があるか…)。 皆様はどうお考えでしょうか。 ご意見お聞かせ下さい。

  • オーバーロード

    以前の質問「質問:参照渡し」 http://oshiete1.goo.ne.jp/kotaeru.php3?q=708770 の続きななですが Javaで演算子のオーバーロードの方法はわかりました。 ところでStringを他の関数に引数で渡したときは StringBufferで新しいインスタンスが作成されると教わりました。 同じように自作のクラスで、関数に値を渡したとき 独自の定義をすることって可能でしょうか? また可能な場合どのようにするのでしょうか? 自作クラスでオブジェクトを引数で渡すとき値渡しのように見せかけたいのです。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • 演算子のオーバーロードについて

    []演算子のオーバーロードでつまづきました。 代入文で左辺、右辺、両方ともに[]演算子を使う場合 int &operator[](int i) { return a[i]; } int &operator[]のようにして、戻り値を参照型にしています。 このとき、main関数内で、 ob1[2]=ob2[2];(ob1,ob2はoperator[]関数が関連付けられているクラスのオブジェクト) のようにすると、左辺(ob1)にちゃんと代入されています。 つまりこの場合、main()関数内で、 (int &)型の(this->a[i])(元のオブジェクトは、ob1) に (int &)型の(this->a[i])(元のオブジェクトは、ob2)を代入しているのでしょうか?

  • C++で>>演算子のオーバーロード

    C++学習者です。 Visual Studio Community 上で、ある教本を使って勉強しています。 現在Stringというクラスを作って、文字列に対して連結や部分文字列の取り出しなどができるようにするための色々な演算子のオーバーロードをする関数を定義していますが、疑問点がありますので、お聞きしたいと思います。 Stringクラスのプライベート変数は、文字列の長さを表すlength と、new 演算子で動的に確保するメモリー領域の始まりのアドレスを表す *sPtr の二つです。 クラス内ではパブリックなメンバー関数としていろいろな演算子がオーバーロードされていて、これらについてはよく理解できるのですが、friend 関数として定義されている入力演算子(>>)について納得がいかない部分があります。 その関数は次のようになっています。 istream &operator>>(istream &input, String &s) { char temp[100]; input >> setw(100) >> temp; s = temp; return input; } わからないのは s = temp; の部分です。 sはStringクラスのオブジェクトで、temp は単なる文字列なのに、なぜ代入できるのでしょうか? 代入演算子=のオーバーロード関数も下に挙げますが、この中でも単なる文字列をStringクラスのオブジェクトに代入できるようにはなってないように見えます。 const String &String::operator=(const String &right) { if (&right != this){ // avoid assignment of itself delete [ ] sPtr; length = right.length; sPtr = new char[ length + 1]; strcpy(sPtr, right.sPtr); } else cout<< "attempted to assign a String to itself \n\n"; return *this; } どなたか答えて頂けると有難いです。

  • 抽象クラスのオブジェクトを生成できない理由は?

    ・抽象クラスは、なぜ(オーバーライドしないと)オブジェクトを生成できないのでしょうか? ・インタフェースみたいに、抽象メソッドしか宣言することができないなら話は分かるのですが… ・抽象メソッドでない普通のメソッドを実装できるのなら、オブジェクトを生成してくれても良いと思うのですが… ・そういう問題ではない?

    • ベストアンサー
    • Java
  • フレンド関数を利用したオーバーロードでコンパイルエラー

    独習C++(第3版)で学習していますが、書籍通りに入力してもコンパイルエラーが出てしまい、困っております。 P.199 6.5.フレンド演算子関数の使用にあるソースコードをそのままコピーしただけです。 フレンド関数を利用し、演算子オーバーロードをすると、コンパイルエラーが発生してしまうようです。 (10): friend coord operator+(coord ob1,int i); C:\jsp\tools\samp13\XXXX.cpp(10) : fatal error C1001: 内部コンパイラ エラー (コンパイラ ファイル 'msc1.cpp', 行番号 1786) Visual C++ のサポート情報 コマンドを選択してください ヘルプ メニュー、 またはサポート情報のヘルプ ファイルを参照してください 少し検索したところVC++6.0だとバグで起こってしまうとのことですが、この状態からコンパイルエラーを無くすには何をしたらよいのでしょうか?

  • COMコンポーネントの構造の本質的理解ができない

    プログラミングを始めて間もない初心者です。 windowsアプリケーションを制御対象として扱おうと、win32oleライブラリをrequireしてCOMコンポーネントを扱う方法をネット上で色々調べてみたのですがどうも腑に落ちない点・分からない点があるので質問します。 rubyリファレンスマニュアルからリンクされているサイト(http://jp.rubyist.net/magazine/?0003-Win32OLE)において、以下のような記述があります。 >COM ではインスタンスを生成するときに「COM コンポーネント」を指 >定するための ProgID を引数として WIN32OLE.new メソッドを実行し >ます。 COM コンポーネントとは、Windows に登録された、ある機能 >(たとえば、IE や MS Office の制御機能) を提供するためのもので >す。この「COM コンポーネント」を利用して作成したインスタンス を>「COM オブジェクト」とこの記事では呼んでいます。 COM オブジェク>トを作成した後は、その COM オブジェクトで定義されている「メソッ>ド」を実行することでそのコンポーネントが提供する機能を実現する >ことができます。 この文に従えば、作成したCOMオブジェクトを扱う方法を知るためにはCOMオブジェクトで定義されているメソッドを参照すれば良いこととなります。そこで自分もWIN32OLE.new("InternetExplorer.Application") によって得たCOMオブジェクトにWIN32OLE.ole_methodsを適用することでメソッドの一覧を取得しましたが、前述のサイトで紹介されているie.document.all.Item()というメソッドを探してみてもどこにも見つかりません。 これはどういうことなのかと思い、ネット上で色々とCOMとは何か、タイプライブラリとは何かなどを調べて見ましたが、いまだCOMの全体像の把握ができません。 たとえばrubyの場合、あるオブジェクトに対して使えるメソッドというのはそのオブジェクトが該当するクラスに於いて定義されているメソッド((1))及びkernelモジュールで定義されている組み込みメソッド((2))ですよね。 (初心者なのでこの理解にも間違いがあるかもしれませんがその場合はご指摘お願いします) このような考え方でいくとWIN32OLE.ole_methodsによって取得したメソッドの一覧は(1)にあたり、document.all.Item()というのは(2)にあたるのではないかという考えもできるかと思うのですが誰か正しい理解をご教授いただきたいです。 質問が長くなってしまいましたがie.document.all.Item()というメソッドがどこに定義されているのか、そういったメソッドの定義場所はCOMにおいてどのように見つけるのか、そこだけでもいいのでよろしくお願いします。

    • ベストアンサー
    • Ruby
  • 【VC++2008】オブジェクトの利用法

    お世話になります。 VC++2008の使い方について質問があります。 ゲームを作成するため、よく使うメソッドなどをクラス化し一度外部に吐き出して、他のプロジェクトからもカプセル化したオブジェクトを利用できるようにしたいと考えています。 私は普段VBを中心に利用していてそちらでは簡単に出来るのですが、VCでのやり方が分からず困っています。 どのようにすれば良いのか本当に最初の部分から細かく教えていただけるとありがたいです。 ホームページなどがありましたら紹介していただけると助かります。 よろしくお願いします。

  • オーバーロードしたメンバ関数が継承後,利用できない

    オーバーロードしたメンバ関数のクラスを継承後,そのメンバ関数と同名のメンバ関数を定義すると,オーバーロードしたメンバ関数が呼び出せなくなります.何故でしょうか? 質問を一言で正確に表現できてないと思いますので,状況を順を追って説明します. まず,クラスT1にメンバ関数m(int)があったとします. そのメンバ関数をオーバーロードしてm(float)を作ったとします. そして,T1を継承してT2を定義し,その中でメンバ関数m(int)をオーバーライドすると,T2のオブジェクトではm(float)が呼び出せなくなってしまいました. 何故この様なことをするかといいますと,m(string)はstringの引数をある関数で変換して整数にしてから,intでm(int)を呼び出しているとします. T2でも,stringによってm(int)を呼び出すので,T1で定義したm(string)をT2でもそのまま使いたいのです. 例です class T1{ public: virtual void m(int i){cout<<i<<"T1\n";} void m(string s){m((int)s[0]);} }; class T2{ public: virtual void m(int i){cout<<i<<"T2\n";} }; int main(){ T2 t; string s("a"); // t.m(s); /*error*/ t.T1::m(s); } 出力 97T2 T1のm(string)はT2のm(int)を呼び出してます. 何か解決策ありますでしょうか? また,言語の仕様がこの様になってるのは,この様なことをすると問題があるからだと思うのですが,どのような問題が起こるので禁止されてるのでしょう? それとも実は,この様なことはできるのでしょうか? (つまり,単に私のプログラムが間違ってる)

専門家に質問してみよう