問題タブ [subscript-operator]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
81 参照

visual-c++ - 添字演算子での一時変数の回避

double の配列を動的に割り当てるクラス v があります。Entries は、この配列の先頭へのポインタです。間隔を使用すると、エントリをスキップできます。たとえば、3 つおきのエントリのみを考慮したい場合、間隔は 3 になります。

この添字演算子はコンパイルされますが、ヒープが破損します。私の Web 検索に基づいて、Visual Studio は "entries[n*spacing]" の結果を一時的に格納し、一時的な参照を返していると思います。割り当て解除されたメモリへのこの参照に書き込もうとすると、ヒープの破損が発生します。

誰かが回避策のアイデアを持っていますか?

0 投票する
1 に答える
2522 参照

python - Pythonで2つの引数を使用して添え字を付ける

iとjの2つの属性を持つクラスXがあると仮定します。

欲しい:

私は今、添え字を次のように機能させたいです:

現時点で私はこれを試しています:

ただし、これにより、 getitemが正確に3つの引数を取り、2つが与えられるというエラーが発生し続けます(たとえば、x [1,2]を出力しようとすると)

0 投票する
4 に答える
2391 参照

c++ - std::map メンバー変数を持つクラスの添え字演算子

std::map をラップし、キーが承認された有効な文字列の 1 つであることを確認し、承認されたすべての有効な文字列のデフォルト値を持つようにマップを初期化するクラスを作成しようとしています。添え字演算子、特にその const バージョンを機能させる際に問題が発生しています。

これが私のクラスのプロトタイピングコードです:

これをコンパイルすると (-std=c++0x で g++ を使用)、次のコンパイル エラーが発生します。

私が何をしてもこれを修正するようには見えません。私が試してみました

  • validkeys を std::set および data std::map にする
  • 文字列の代わりに const char * を使用する
  • const double の代わりに const double または double を返す &
  • set の代わりに list と vector を使用して有効なキーを格納する

この問題に正しく取り組んでいるかどうかさえわからないので、この種の機能を可能にするクラスを作成する他の簡単な方法がある場合:

どんな提案でも大歓迎です。

解決

以下はまさに私が望むように機能します。有効なキーのセットにないキーを設定または取得しようとすると、基本的な例外さえあります。

0 投票する
3 に答える
826 参照

c++ - 設計: const アクセサーと非 const アクセサーの相互依存性?

重複の可能性:
同様の const メンバー関数と非 const メンバー関数の間のコードの重複を削除するにはどうすればよいですか?

次の例では:

const と non-constoperator[]は独立して実装されます。

デザインに関しては、次のものが必要です。

  • 1) ここのような 2 つの独立した実装
  • 2) もう一方を呼び出す 2 つの関数の 1 つ

解決策 2) の方が優れている場合、指定された例のコードは何でしょうか?

0 投票する
1 に答える
1139 参照

c++ - 非静的データ メンバー (配列) の無効な使用

私は C++ に非常に慣れていないので、これはかなり初歩的な問題かもしれませんが、解決策を見つけるのに苦労しています。答えを探し回ったところ、TA には論理的に同等でありながら不思議な動作をするコードが含まれているようで、その理由がわかりません。

ヘッダー ファイルで配列 (「配列」という名前) を宣言しようとしていますが、奇妙なエラーが発生し続けます。「int* array;」として公に宣言すると、または「int array[];」、コンストラクターは、これが非静的データメンバーの無効な使用であることを通知します。プライベートと宣言すると、配列の要素がプライベートであると不平を言います。

割り当ては、演算子のオーバーロードを処理し、-3 から 5 などの奇数インデックスの配列を処理します。以下は、問題に関連するコードの一部です。

[i] = 私 * 10; コンパイラが文句を言うところです。

助けてくれてありがとう。

0 投票する
1 に答える
120 参照

c++ - [] をオーバーロードしていますが、その結果は他の演算子と対話する前に解決されません (c++)

すべての演算子を操作するデータ オブジェクトがあります。これは、可変ptrsを含むデータの1つのチャンクであり、さまざまなタイプとサイズなどをいくつでも持っています。型は、列挙型とテンプレート、および switch ステートメントで処理されます。したがって、各 x に対して、d[x] は 1 つの型であり、任意の数を持ち、ベクトルにすることができます。つまり、d[x][y] と d[x][y][z] です。これを支援する内部ヘルパー オブジェクトを作成しました。したがって、[] をオーバーロードしてこのようなことを行うと、正しい型が正常に返されます: (gcc 4.6.1)

[編集: d(x,y,z) でも同じ問題があります。問題は [] 演算子ではありません]

このヘルパー オブジェクトで T() をオーバーロードしています。

したがって、このオブジェクトを返すだけで、その時点で型が解決されます (t->get< char>(d、x、i、j) などに関連付けられたケースで切り替えます)。だから問題は、私がこのようなことをしたいのなら

その後、この一時的な配列ヘルパー オブジェクトを取得するために、すべての演算子をオーバーロードする必要がありました。そして今、一部のオペレーターのために一時的な値を作成しなければならないことがあり、これは苦痛です。

基本的に、コンパイラーがこれらのうちの 2 つを取得して追加しようとする前に、まず演算子 T() を解決する必要があるように感じます。

とにかく、= や += などの演算子に対してこれを行う必要がありますが、これらの他のすべての演算子を定義するのに役立つ膨大な数のマクロを削除したいと思います。

また、どうにかして左辺値演算子をオーバーロードできれば、= 演算子のことは気にならなくなったような気がします。おそらくそれと &() (現在はテンプレート化された ptr を返すだけです)。...?または実際には、少なくとも d[] = 何かについては、これが私が意味することですが、これを機能させることはできません。任意の型の ptr をこの戻り値に変換する方法がわかりません。

私はこれのほとんどを機能させていますが、それは多くのコードです。一時的なことを行うには、すべてのアクセスに追加の if ステートメントを追加する必要があると思いますが、これはやりたくないことです。それで、私は何を逃したのですか?

編集: d(x,i,j) の使用は d[x][i][j] と同じです。投稿されたリンク nm で使用されているものの少なくとも最初の部分を行っていると確信しています。問題は、ステートメントで使用される前に、最後のヘルパー オブジェクトをデータに解決することです。どういうわけか、コンパイラは、ヘルパー オブジェクトを単独で解決する方法を知っているにもかかわらず、ヘルパー オブジェクトを受け入れる演算子を必要としています...と思います。すべてのオペレーターに過負荷をかけるのに数日かかったので、すべての詳細を忘れてしまいました. :)

しかし、現在の主な問題は、次のようなものです。

以下を定義したいのですが、使い慣れていません。それなら、問題が解決するかもしれないと思います。単項演算子 ~、-、および後置 ++、-- についても同様の話です。

しかし、これはすべて、私の T() に何か問題があるためだと思います。これのほとんどは私にとって新しいものなので、何かが欠けているに違いありません。

0 投票する
4 に答える
803 参照

c++ - C++ 二重添え字のオーバーロード: 'type' から 'type &' に変換できません

実際にはベクトルのベクトルであり、両方のクラスがテンプレートである 2D 行列クラスを作成しようとしています。ベクトルクラスで添え字演算子をオーバーロードしました。この問題は、次のエラー メッセージで行列クラスの operator[] をオーバーロードしようとすると発生します: error C2440: 'return' : cannot convert from 'vector' to 'vector &'。私のクラスのコードは次のとおりです。

私はいくつかのグーグルを作成し、同じ例または [] の代わりに () をオーバーロードしているのを見つけました。コンパイラが戻り値Mat[index]を参照として認識できない理由を理解できません(これは参照である必要があると思います)。ただし、単一のベクトルを操作する場合、添え字演算子は問題なく機能します。私の間違いを指摘してください。前もって感謝します!

追加: 非動的ベクトルを使用すると現在の問題は解決するようですが、型の不一致の代わりに、2 つのリンカー エラー (未解決の外部シンボル) が発生しました。vector< vector<h> > Mat;コードにコメントを付けたりコメントを外したりすることで、行またはExtend関数が存在する場合にのみ問題が発生することがわかりました(クラスベクターの空のメソッドです)。ベクトルコンストラクターに何か関係があると思いますが、正確に何が悪いのかわかりません。

matrix.h 内 (まだ別のファイルにはありません):

可能であれば、何か提案を聞きたいです。

0 投票する
2 に答える
2169 参照

c++ - C++は配列添字にどのような型を期待していますか?

C では、配列サブスクリプション:a[b]は、ポインター演算の後の逆参照に相当するシンタックス シュガーにすぎません (ここで*(a+b)説明したように)。

基本型の配列サブスクリプションはC++でどのように解釈されますか? (オーバーロードのセマンティクスがあるクラスではありません)? より具体的には、C++ が下付き文字として期待する型は何ですか? それはptrdiff_tですか?