5

わかりましたので、「弱い型付け」IEを持つクラスがあり、次のように定義されたさまざまな型を格納できます。

#include <string>

class myObject{
   public:
      bool isString;
      std::string strVal;

      bool isNumber;
      double numVal;

      bool isBoolean;
      bool boolVal;

      double operator= (const myObject &);
};

次のように代入演算子をオーバーロードしたいと思います。

double myObject::operator= (const myObject &right){
   if(right.isNumber){
      return right.numVal;
   }else{
      // Arbitrary Throw.
      throw 5;
   }
}

私がこれを行うことができるように:

int main(){
   myObject obj;
   obj.isNumber = true;
   obj.numVal = 17.5;
   //This is what I would like to do
   double number = obj;
}

しかし、それを行うと、次のようになります。

error: cannot convert ‘myObject’ to ‘double’ in initialization 

課題で。

私も試しました:

int main(){
   myObject obj;
   obj.isNumber = true;
   obj.numVal = 17.5;
   //This is what I would like to do
   double number;
   number = obj;
}

私が得たもの:

error: cannot convert ‘myObject’ to ‘double’ in assignment

足りないものはありますか?または、オーバーロードによってそのような変換を行うことは単に不可能ですかoperator=?

4

5 に答える 5

12

オーバーロードは、クラス タイプのオブジェクトoperator=に代入するときの動作を変更します。

他の型への暗黙的な変換を提供したい場合は、変換演算子を指定する必要があります。

operator double() const
{
    if (!isNumber)
        throw something();
    return numVal;
}
于 2010-01-15T22:42:15.203 に答える
7

本当に必要なのは変換演算子です。

operator double() const { return numVal; }
operator int() const { ...

そうは言っても、おそらくboost::variantが必要です。

于 2010-01-15T22:43:06.923 に答える
2

それが機能するには、オブジェクトから double に変換できるものへの変換演算子を実装する必要があります

于 2010-01-15T22:42:57.173 に答える
2

あなたが実証しようとしたように、の戻り値はoperator=()使用できません。オーバーロードされた演算子をそれ自体が関数と考えると、より理にかなっているかもしれません。

例えば:

int main() {
  myObject obj, obj2;
  obj.isNumber = true;
  obj.numVal = 17.5;
  obj2.operator=(obj); // equivalent to obj2 = obj
}

うまくいかない理由number = obj;は、あなたが を定義したためですがmyObject::operator=()、 whilenumberを使用しているからですdouble::operator=()(技術的にはdouble::operator=()はありません。これはクラスではなく基本的な型であるためです...ここで私と一緒に作業してください)。

興味深いことに、この関数は、return right.numval;使用されていない場合は戻り値 ( ) が無視されるという点で、他の関数と同じように動作します。ただし、戻り値は他の関数の戻り値と同じように割り当てたり使用したりできるため、本当に必要な場合は次のようにすることができます。

int main() {
  myObject obj, obj2;
  obj.isNumber = true;
  obj.numVal = 17.5;
  double number;
  // number = obj; still won't work.
  number = obj2 = obj; // equivalent to number = obj2.operator=(obj)
}

これはとても便利です。他の人が述べたように、オブジェクトを基本型に割り当てようとするときは、変換演算子を実際に調べたいと考えています。myObject

于 2010-01-15T23:20:47.187 に答える
-1

クラスを double に割り当て可能にするには、operator= を別の方法で定義する必要があります。

double operator=(myclass&)間違っている。

うまくいくのは、double と myclass& を受け入れるクラス外のフレンド operator= です。

于 2010-01-15T22:44:02.990 に答える