• ベストアンサー

オペレーターの使い方がよくわかりません。

 Var に対して、int型変数を受け渡すのわかったのですが int型変数に、Varの内容を受け渡す方法が良くかわかりません。 (こんなことはできない?) class CMtcmOleVariant : public tagVARIANT { const CMtcmOleVariant& operator=(int x); // Ok int operator=(const CMtcmOleVariant& var); // NG } CMtcmOleVariant Var; int ix = 999; Var = ix; // OK ix = Var; // NG よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>ix = Var; // NG というのがしたいなら、operator=() でなくて operator int() を定義する必要があるでしょう。あんまりしないけど。

noname#192260
質問者

お礼

 ありがとうございます。m(__)m

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.2

 こんにちは。tagVARIANTは確か共用体でしたね。以下参考程度に。 class CMtcmOleVariant : public tagVARIANT { public: CMtcmOleVariant() { intVal = 0; /*その他のメンバの初期化*/ } CMtcmOleVariant(const CMtcmOleVariant& r) { intVal = r.intVal; /*その他のメンバのコピー*/ } CMtcmOleVariant& operator = (const CMtcmOleVariant& r) { if(this != &r) new (this) CMtcmOleVariant(r); return *this; } template<class T> CMtcmOleVariant(const T& v){ ((T&)intVal) = v; } template<class T> operator T&(){ return (T&)intVal; } template<class T> operator const T&() const { return (const T&)intVal; } }; int main() { CMtcmOleVariant Var; void* pv = 0; IUnknown**ppunk= 0; short s = 0; Var = pv; pv = Var; Var = ppunk; ppunk = Var; Var = s; s = Var; return 0; }

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • オペレータ定義について

    すみません、オペレータ定義について教えてください。 ■以下のようなクラスに、[] が定義されていて、 class String { public:       ・       ・ (メンバ関数がいくつかあり)       ・       // num 番目の文字を返す       char operator[](int num) const;       char& operator[](int num); private:       char* string; }; ■関数はこのように書かれていて、 char String::operator[](int num) const {     // 文字列の num 番目の文字を返す 1     return string[num]; } char& String::operator[](int num) {      // 文字列の num 番目の文字を返す 2      return string[num]; } ■これを →[] main() から使うにはどのようにしたらいいのでしょうか?

  • operator代入演算子のやり方で疑問が

    C++の勉強をしています。 そこでoperatorを使うことをやっているんですが、この演算子、引数を二つつけるとエラーになります。クラス内で定義するとこうなります。 ですがグローバルで定義するとエラーが出力されません。 何故なんでしょうか? 戻り値の関係でしょうか?  class Complex { public: Complex() { } public: // これはエラー、この演算子関数のパラメータが多すぎますと出力される const Complex operator+(const Complex x, const Complex y) { } }; // これはでない・・・ const Complex operator+(const Complex x, const Complex y) { } 上記のプログラムだと、下に書いてある代入演算子は問題ありません。 なぜこうなるんでしょうか? ご教授お願いします。

  • template 参照 operator について

    「ゲームプログラマになる前に覚えておきたい技術」という書籍を読みながらC++でプログラミングの学習をしているのですが、template class と 参照 と operator の組み合わさったクラスでわからないところがあります。 自分で出来る限り調べてみましたが、解決できなかったので、答えていただけると幸いです。 Cの学習はひととおり済んでおりますが、まだC++は学習を始めたばかりなので理解が浅いです。 質問内容にいたらない点があるとは思いますが、お願いします。 以下のようなクラス定義文がありました。 template< class T > class Array2D{ public: Array2D() : mArray( 0 ){} ~Array2D(){ delete[] mArray; mArray = 0; } void setSize( int size0, int size1 ){ mSize0 = size0; mSize1 = size1; mArray = new T[ size0 * size1 ]; } T& operator()( int index0, int index1 ){ return mArray[ index1 * mSize0 + index0 ]; } const T& operator()( int index0, int index1 ) const { return mArray[ index1 * mSize0 + index0 ]; } private: T* mArray; int mSize0; int mSize1; }; この定義文の以下の部分 T& operator()( int index0, int index1 ){ return mArray[ index1 * mSize0 + index0 ]; } において、T&という記述がなければ、()という演算子のはたらきを再定義していて、 mArrayを2次元的に利用できるように値を返しているように見えるのですが、 T&がつくことによって、なにがどうなっているのでしょうか。 それと、参照というのは、利用するときには必ず初期化が必要、と学習したのですが、 この場合、初期化の処理になっているのでしょうか。 今までに出てきた参照では、簡単な例でいうと int n; int& m = n; というように、型名&別名=参照先 と、即初期化して使っていました。 これなら初期化されているのはわかりますが、今回のように、 「別名」の部分がoperatorになっていると、どのアドレスが「別名」が指すアドレスになるのでしょうか。 さっぱりわかりません。 質問の連続になってしまって申し訳ありません。 ほんとに困ってます。 おねがいします。

  • ヘッダーファイル内でconst変数を初期化する時にエラー

    ヘッダーファイル内でconst変数を初期化する場合、 以下のようにしているのですが、エラーが出てしまいます。 どのようにすればうまくいくのでしょうか? 環境はVisualC++.NETです。 class abc{ private:  const int x; public:  abc(){   x = 10;  } }

  • テンプレートクラスでのクラス変数

    テンプレートから生成したクラスごとにクラス変数を設けて、 かつ、クラス変数の初期化をいちいちやらなくてもよい という状況を作りたいと考えています。 そこでたとえば template <int N> class test { public: static int class_var() { static int class_var_ = N; return class_var_; } }; としたとき test<1>::class_var() と test<2>::class_var() はどのような値になるのでしょうか? VC++ではテンプレート全体で class_var_の値が同じになってしまうようのなのですが。。。 そもそも、こういうクラス変数自体を つくろうという考えが間違っているのでしょうか? どなたかご存知でしたらお教えください。

  • C++ operatorの使用について

    C++初心者で、現在オペレーターの使用方法について勉強しています。 下記プログラムの「 x = x + z;」箇所の処理について、理解できず行き詰っています。 初期化した際のx, y, zそれぞれの値が x = Help y = !e z = M となったところまでは、理解できています。 その後、x = x + zの処理に入る際、 1.abc operator+(abc) 2.void operator=(abc) の順でオペレーターの処理を行うと思います。 その際、1.はzを使用して処理をするところまでは分かるのですが、 return value: HelpM\n(\:バックスラッシュ)がx, y, zのどこに入るのか、 その後どのオブジェクトを持って2.の処理に入るのかどうか 理解できておりません。 初心者のため、文章がわかりづらい点等あるかと思いますが、 アドバイス頂けたら幸いです。 宜しくお願いいたします。 ========================================================================== #include <cstdio> #include <cstring> class abc { char def[21]; public: abc(void) { strcpy(def, "Help"); } abc(const char s[ ]) { strcpy(def, s); } abc(char c) { def[0] = c; def[1] = '\0'; } void operator=(abc); // redefines = between abc's!!! abc operator+(abc); void out( ) { printf("%s\n", def); } }; void abc::operator=(abc x) { int i, n = strlen(x.def); for(i = 0; i < n; i++) def[i] = x.def[n - (i + 1)]; def[n] = '\0'; } abc abc::operator+(abc a) { int i = 0; abc c; strcpy(c.def, def); while(c.def[i] != '\0') i++; for(int j = 0; a.def[j] != '\0'; j++) { c.def[i] = a.def[j]; i++; } c.def[i] = '\0'; return c; } int main( ) { abc x, y("!e"), z('M'); x = x + z; x.out( ); y = y + x; y.out( ); return 0; }

  • 違うクラスからの変数の共有化

    一つのクラスの中にある変数の値を、二つの別なクラスから呼び出して、その二つのクラスのどちらから変数を参照しても同じ値が帰ってくるようにしたいのですが、いろいろ調べてもできなかったので質問させていただきますm(_ _)m // 共有化させたい変数を持つクラス // Var.java public class Var{  public static int i;  public Var(int i){ this.i = i; }  public Var(){}  public static void getI(){   return i;  } } //クラス1 //Class1.java public class Class1{  Var var = new Var(1); } //クラス2 //Class2.java public class Class2{  Var var = new Var();  System.out.println(var.getI()); } とした場合、Class1を実行し、次にClass2を実行すると、クラス1で定義した変数の値である 1 が戻ってくるようにしたいのですが、上記の方法では、Class2を実行すると結果は 0 になってしまいました。 まだまだ習い始めたばかりでいまいちstaticを使い切れていないと思います・・・ たとえば、PrintStreamクラスの public static final PrintStream out というのはどこから参照しても同じ結果なのでそのようなやり方で大丈夫だろうと思ったのですが・・・ このような方法では共有化させることはできないのでしょうか?またできないのでしたらほかのやり方がもしあった場合は教えていただきたいと思います。 どうかお願いします。

    • ベストアンサー
    • Java
  • C#での変数スコープ?

    Net 2.0のC#で同一名の変数を使う場合について質問いたします。 以下のHoge1の場合には「 ローカルの変数 'x' をこのスコープで宣言することはできません。これは、'親またはカレント' スコープで別の意味を持つ 'x' の意味が変更されるのを避けるためです。」と怒られます。 一方、Hoge2の場合には怒られません。 Hoge2内でx=1;ではなくint x=1;と再宣言しているにもかかわらず怒られないのは、Hoge1が厳格にスコープ管理している点からみると意外に感じられます。 http://www.atmarkit.co.jp/ait/articles/0210/16/news001_5.html の記述を見ると、この記事が書かれた2002年ごろにはHoge2もNGだったような印象を受けるのですが、変化があったのでしょうか? この辺りの事情に詳しい方がおられましたらよろしく、お願い申し上げます。 class Class1 {    private void Hoge1()    {       int x;       {          int x = 2; // これはNG!。「ローカルの変数 'x' をこのスコープで宣言することはできません。これは、'親またはカレント' スコープで別の意味を持つ 'x' の意味が変更されるのを避けるためです。」と怒られる。       }    }    int x;    private static void Hoge2()    {       int x=1; //これはOK!親にぶらさげた変数が通る。    } }

  • global operatorについて

    特定のクラスのポインタの比較(less)をオーバーライドしたいのですが、 1. そのような処理は実装可能か? 2. 実装可能とした場合、operatorの宣言は どのように書いたらよいのか? 具体的には以下のようなコードになります。 ---- class Test { public: float m_Priority; Test(const float p) { m_Priority = p; } }; Test* a = new Test(0); Test* b = new Test(1); if(a < b){ a = a; } ---- 試しに bool operator < (const Test* const l, const Test* const r) { return l->m_Priority < r->m_Priority; } と書いてみましたが、コンパイルエラーが出てしまいました。 補足 ・ポインタのオーバーライドが非常に危険なこと ・組み込み方のオーバーライドが禁止されている 上記の2点は確認済みです。 ポインタを格納するクラスを別途作成し、 その中で比較をすればよいのでしょうが、 高速化のためにどうしてもポインタ比較の オーバーライドが必要になりました。

  • operator * について

    掛け算ではない方の operator * についての質問です。 下のソースを見てください。関数func()内で、(*this)[idx]というやり方と、直接operator [] を呼び出すやり方を試しています。(*this)[idx]は自分のコピーを作ってしまわないでしょうか?このようなやり方は正しいでしょうか。というのが第1の質問です。 さらに、CTestで operator * を定義していますが、(*this)[idx]で呼び出されません。なぜなのでしょうか。というのが第2の質問です。 どうぞよろしくお願いいたします。 class CTest : public vector<int> { public: CTest() : vector<int>() { push_back(1); push_back(2); push_back(3); } void func() { #if 1 // 質問1 この書き方をしてもコピーが作られないかどうか? cout<<(*this)[0]<<endl; cout<<(*this)[1]<<endl; cout<<(*this)[2]<<endl; #else cout<<operator[](0)<<endl; cout<<operator[](1)<<endl; cout<<operator[](2)<<endl; #endif } CTest& operator * () { // 質問2 なぜこのオペレータが呼び出されないのか cout<<"???"<<endl; return *this; } }; void main(void) { CTest inst; inst.func(); }

このQ&Aのポイント
  • EP-808AWで白黒印刷をすると、インクの残量が十分にあるにもかかわらず、ブラックの文字がほとんど見えないほどかすれてしまいます。
  • ヘッドクリーニングやノズルチェックを行っても改善されず、カラーコピーも黒部分が薄すぎてうまく印刷できません。
  • この問題の原因は何であり、どのような対策ができるのでしょうか?
回答を見る