2011-12-10 4 views
8

だから、私は他の日に試験を持っていた、との質問の一つは、この非常によく似たものだった:static_castのオーバーロードはありますか?

私たちは、変数int sideを保持しているSquareというクラスを持っています。 cout << static_cast<int>(aSquare) <<endl;がaSquareの領域をプリントアウトすることは、どうすれば可能になりますか?

これは可能ですか?

答えて

18

これを行うことはできますが、オーバーロードを経由することはできません。static_cast<>()あなたは、型キャスト演算子をオーバーロードによってそう:

class Square 
{ 
public: 
    Square(int side) : side(side) {} 
    operator int() const { return side * side; } // overloaded typecast operator 
private: 
    int side; 
}; 

// ... 

// Compiler calls Square::operator int() to convert aSquare into an int 
cout << static_cast<int>(aSquare) <<endl; 

がより頻繁に良いよりも害を行う傾向があるではないよりも、その過負荷に型キャスト演算子を注意してください。彼らは無意味な暗黙のキャスト操作を可能にします。以下のコードスニペットを読むと、「aはsの領域を得ようとしている」と思いますか?

Square aSquare; 
int a = aSquare; // What the heck does this do? 

私は確かにしません。これは、道より理にかなっているとはるかに読みやすいです:

Square aSquare; 
int a = aSquare.GetArea(); 

通常、あなたがGetSide()GetApothem()またはGetPerimeter()または何のように、Squareに関するその他の情報にアクセスできるようにしたいことは言うまでもありません。 operator int()は明らかにintを1つだけ返すことができ、クラスのメンバーとして複数のoperator int()を持つことはできません。

Square s; 
if(s > 42) {} // Huh?! 

それが42以上であることがSquareにとって何を意味する:ここで

operator int()はまだコンパイルするコードは全く意味をなさない作る別の状況は?それはナンセンスですが、operator int()ではShapeintに変換され、intの値は4と比較されるため、上記のコードはコンパイルされます。

このような型キャスト演算子は記述しないでください。実際、型キャスト演算子をオーバーロードしている場合は、何をしているのかを二度考えてもよいでしょう。実際には、型キャスト演算子のオーバーロードが現代のC++で役に立ちます(例:the safe bool idiom)。

+0

+1:Squareクラスはさらにいくつかのメソッドを使用できます。 'int GetSideLength()const'、' int GetPerimeter()const'、そして 'GetArea()'に名前付きメソッドを使わなければならないという曖昧さ回避のためです。 – rwong

+0

精巧な答えをありがとう。 – Radix

+2

@In silico:C++ 11では、変換演算子のためのキーワード 'explicit'をサポートしているので、安全なboolイディオムはもはや必要ありません。 – smerlin

1

あなたは広場クラスの変換演算子を提供することができます:

struct square { 
    operator int() const { 
    return (side * side); 
    } 
    int side; 
}; 

唯一の問題は、それが暗黙的に使用されることがあり、そしてdoesnのキャスト:

class Square 
{ 
public: 
    operator int() 
    { 
     return side * side; 
    } 
private: 
    int side; 
}; 
+0

側面ではなく領域を返します。 – Dani

+2

非常に小さい正方形のインスタンスの場合に適用されます。 –

+2

@ダニ:私はあなたがそのポイントを見逃していたと思います。私はOPがエリアを計算する方法を知っていると確信しています。質問は、質問の技術的な部分である正方形のオブジェクトからintを得る方法に正しく答えました。 –

4

あなたはキャスト演算子をオーバーロードすることができますここでは意味をなさない。あなたはキャストを使用する必要がある場合

struct square { 
    int get_area() const { 
    return (side * side); 
    } 
    int side; 
} 

は、Cを使用して:あなたはまた、キャストの異なる種類(static_castを、Cスタイルなど)

これは、物事を行うための好ましい方法で区別することはできません++ 11の機能を選択し、explicitとマークします。これにより、暗黙のキャスト間違いが防止されます。

関連する問題