operator[/url]の書き方について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
トウラ

operator[/url]の書き方について

#1

投稿記事 by トウラ » 16年前

C++を学び始めて、参考書を読んでいたのですがピンと来ない点があったので質問です。
#include <vector>
using namespace std;

class Hoge
{
public:
	Hoge(const size_t VectorSize , const int InitValue = 0) : vi(VectorSize , InitValue) {}

	const int& operator[/url](const size_t pos) const;
	int& operator[/url](const size_t pos);

private:
	vector<int> vi;
};
const int& Hoge::operator[/url](const size_t pos) const
{
	return vi[pos];
}
int& Hoge::operator[/url](const size_t pos)
{
	return const_cast<int&>(static_cast<const Hoge&>(*this)[pos]);
}
疑問点はoperator[/url]のstatic_cast<const Hoge&>についてです。
const_cast<int&>は、operator[/url]constの戻り値からconstをはずしてint&になる(間違っていたら指摘お願いします)のは
分かるのですが、static_cast<const Hoge&>のHogeをなぜ参照にするのか分かりません。

static_castの&をはずしてビルドすると
warning C4717: 'Hoge::operator[/url]' : すべてのコントロールのパス、関数を回帰するとランタイム スタック オーバーフローが発生します。
という警告が出る(ビルドは成功しているみたいです)のですが、こちらもよく分かりません。

どなたか説明していただけると助かります><

トウラ

Re:operator[/url]の書き方について

#2

投稿記事 by トウラ » 16年前

書き忘れ

環境は
OS:Windows Vista SP1
コンパイラ:Visual C++ 2008 EE

です。

Justy

Re:operator[/url]の書き方について

#3

投稿記事 by Justy » 16年前


>static_cast<const Hoge&>のHogeをなぜ参照にするのか分かりません。

 参照とかポインタにしないと、一時オブジェクトの生成・・・*thisのコピーが発生するからです。
 しかも、そのコピーは returnする段階で破棄されますので、このケースでは作るだけ無駄です。
 その無駄を省くために参照にしているのだと思います。

組木紙織

Re:operator[/url]の書き方について

#4

投稿記事 by 組木紙織 » 16年前

追加して、
*thisのコピーが発生した後、operator[/url]をそのコピーしたオブジェクトに対して適用して、
そうすると
static_cast<const Hoge>がもう一度*thisのコピーオブジェクトをコピーして、、、
と何回も無限回コピーされ続けるので、スタックがあふれるようになります。
operator()を使うときは出来るだけ参照で済ますようにしないと、上記の問題がよく起こります。

#この場合は、return vi[pos];で事足りる気がしますが、

トウラ

Re:operator[/url]の書き方について

#5

投稿記事 by トウラ » 16年前

Justyさん、組木紙織さん

解説していただきありがとうございます。

static_cast<const Hoge>にすると一時オブジェクトの生成、*thisをコピーのループになる
というのは分かりました。
私の勝手な解釈で、キャストすれば自身が変換されるものだと思っていました。
あと、参照をはずし(めちゃくちゃですが)仮にスタックオーバーフローが起きなくても
operator[/url]の戻り値であるint&は何も指していないので、この書き方ではダメ。ってなるでしょうか?

しかし、自身を変換させる書き方(?)を初めて見るので、しっかり流れを追ってみようと思います。


ひとまず解決マークを付けておきます。

閉鎖

“C言語何でも質問掲示板” へ戻る