質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

616閲覧

C++のクラスメンバー関数(メソッド)の中の変数の所属が見分けられますか?

insecticide

総合スコア315

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2022/07/14 10:01

C++言語には下記のような幾つかの変数の種類があります。
global変数、class変数、local変数(=stack変数=auto変数 ??)
そして変数をアクセスする時に修飾(限定子)が要らないですね。
同名存在の場合、local変数が優先となってしまいます。

これで不意にミスを引き起こす危険性が高いと思います。
同名変数が存在する場合、区別する方法はないでしょうか。
あれば、是非教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2022/07/14 10:19

質問内容は何か? という点の確認ですが, 「ミスを引き起こさないようにコードを書く方法」ではなくて, 「既に変数名が被っているコードがあって,その変数名が書かれている個所があるとき,どれになるのか?を判断する方法」を尋ねている,ということで合っていますか?
fana

2022/07/14 10:23

上記がYESであれば, 「何かしらのツールの力を借りる」を除いては,「優先順位に基づいて,順番に該当する変数が存在するか否かをちまちまと確認していく」以外に無いように思えますが.
dodox86

2022/07/14 11:07

> これで不意にミスを引き起こす危険性が高いと思います。 「スコープ」を意識すると、メリットこそあれ危険性とかデメリットがあるとは考えたことが無かったですが。
insecticide

2022/07/14 11:39

fanaさま お返答ありがとうございます。 「YES」のほうです。 「ちまちまと確認していく」。。。だから厄介ですね。
insecticide

2022/07/14 11:42

dodox86さま お返答ありがとうございます。 「スコープ」の存在はありがたいですが、 問題にしているのは変数名が被っているのを前提とする場合の対処法です。
maisumakun

2022/07/14 11:42

> これで不意にミスを引き起こす危険性が高いと思います。 そういうコードは書き方が悪いです。どうしてもそういうコードを読まなければならないのですか? (コードによっては規約で、「メンバ変数はthisを明示する」などルール化されている可能性も考えられますし、グローバル変数を積極的に使うコードはそのこと自体で品質を下げています)
Zuishin

2022/07/15 00:15

> これで不意にミスを引き起こす危険性が高いと思います。 それでミスを引き起こすのはよほどの初心者だけなので、数か月経験を積めば大丈夫。
guest

回答3

0

名前の衝突を検出するためには、gcc や clang だと -Wshadow というフラグがあります。VC++ に同等のものがあるかどうかは知りません。

名前の衝突を防ぐには、コーディング規約でローカル変数・データメンバ・グローバル変数の命名規則を変えましょう。

投稿2022/07/14 23:34

int32_t

総合スコア20882

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

insecticide

2022/07/14 23:56

ご意見良く理解できますし、ありがたいです! ただ、これまでの経験からすれば、プロジェクトや会社によって命名規約がまちまちで、すぐ変えられるケースがありました。 個人的でも時代によって好みに変化がありました。 これで、習慣や怠慢、記憶問題等によって不必要なデバッグ時間と苦悩が生じました。 なので、Pythonのように最初から言語処理系的に一律強制規定されるのは好ましいのです。
guest

0

リファクタリングしてローカル変数を削除したら、同名のグローバル変数があり、コンパイルエラーにならないために見落としてバグる、という可能性もあることはあります。

どうしても心配なら、グローバルな名前を使うときは必ず::を前につける、メンバーを使うときは必ずthis->をつける、ローカルにアクセスするときだけ無印で、と習慣づければいいのではないでしょうか。

#include <iostream> int value = 0; class C { int value = 1; public: void method() { int value = 2; std::cout << "global " << ::value << '\n' << "member " << this->value << '\n' << "local " << value <<'\n'; } }; int main() { C c; c.method(); }

実行結果:

global 0 member 1 local 2

名前自体ででどうにかするなら、グローバル変数は名前をgで始める、メンバー変数はm_で、のようなルールは割とよく見かけます。まあ、いろいろバリエーションはあります。


ちなみに、_で始まる external な名前、__を含む任意の名前は、コンパイラが好きに使えるように既に予約されています。

投稿2022/07/14 16:28

Bearded-Ockham

総合スコア430

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

insecticide

2022/07/14 23:56

ご意見良く理解できますし、ありがたいです! ただ、これまでの経験からすれば、プロジェクトや会社によって命名規約がまちまちで、すぐ変えられるケースがありました。 個人的でも時代によって好みに変化がありました。 これで、習慣や怠慢、記憶問題等によって不必要なデバッグ時間と苦悩が生じました。 なので、Pythonのように最初から言語処理系的に一律強制規定されるのは好ましいのです。
fana

2022/07/15 01:02 編集

回答になっていないものと見受けます. ([質問への追記・修正依頼]で真っ先に確認しましたが) コードの書き方「ではなくて」,そういうXXXみたいなコード(←伏字部分は適当な言葉を補ってね)が何者かの手によって既に書かれてしまっており,不幸にもそれを具体実装のレベルで解読せねばならない立場に置かれた場合の話,ということみたいですから, 「命名を考えろよ」とか「this->って書けば」とかいう話は「この質問への回答」としては見当違いですよね.
guest

0

自己解決

むーー、未来のC++標準仕様に願います:
これで大きな社会コストを節約できますし、プログラマーの平均自然寿命を3年前後伸ばす事ができます。
以下"?"は適当な半角記号と意味します。

global変数:先頭に"??"
class変数:先頭に"?"
static変数:全部大文字
local変数、関数名:先頭が小文字で、"??"、"?"を付けない。
Class名:先頭が大文字で、"??"、"?"を付けない。

★★★
現実ではSaitoAtsushi さまの最後のアドバスに準じなければなりません❣❣ 

投稿2022/07/14 13:20

編集2022/07/14 21:52
insecticide

総合スコア315

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SaitoAtsushi

2022/07/14 15:53

先頭にアンダースコアがふたつ付くなどの名前について処理系のために予約されていますのでこの条件にあてはまる名前を言語ユーザは使ってはなりません。 https://timsong-cpp.github.io/cppwp/n3337/reserved.names 先頭に __ が付く名前はまさにグローバルで使ってはいけない名前です。 もしもご自身で名前の規約を決めて衝突しないようにするということであれば別の命名規則を考えてください。 比較的多く参考にされているやり方はグーグルのスタイルガイドだと思います。 https://google.github.io/styleguide/cppguide.html#Naming
insecticide

2022/07/14 21:39

SaitoAtsushi さま 貴重なアドバス心よりお礼申し上げます。  💞 歴史長いに、標準化も遅れ、C言語が色々側面に滅茶苦茶、。。。 非常に素晴らしい言語であるのは変わりませんが。 だから将来一遍革新を期待したいのです。 当然、本質的で、良い処は当然キープしなければなりません。
insecticide

2022/07/14 23:56

ご意見良く理解できますし、ありがたいです! ただ、これまでの経験からすれば、プロジェクトや会社によって命名規約がまちまちで、すぐ変えられるケースがありました。 個人的でも時代によって好みに変化がありました。 これで、習慣や怠慢、記憶問題等によって不必要なデバッグ時間と苦悩が生じました。 なので、Pythonのように最初から言語処理系的に一律強制規定されるのは好ましいのです。
SaitoAtsushi

2022/07/15 01:40

Teratail は質問に対して答えることがコンセプトであり、主義を主張する場ではありません。 あなたの好みを主張することを目的とした投稿はひかえてください。 https://teratail.com/help/avoid-asking
Zuishin

2022/07/15 01:59 編集

まあこの人は自分の感覚が絶対的な判断基準で、それと合わない人は異常者と罵る人ですからね。 自分に合わないコーディング規約は異常者による押し付けで、すべての人は自分に従うべきとでも思っているのでしょう。 https://teratail.com/questions/jqqqaaus0gul2v
fana

2022/07/15 02:17 編集

(拙い個人の経験の範囲の話ですが)名前の衝突による「これはどれなんだよ」とか「こっちだと思ってたら違うのかよ」とかいう事態に遭遇したことがありません. 正直,実世界での遭遇率は0だと仮定しても問題ないような話だと思います. 変数名というのは,ふつー(?)は,意味/用途/etc に即したものになるわけなので,それが「衝突できる範囲で衝突してる」ようなコードが書かれるような事態を危惧しての話をするのであれば, 「命名規則がどうの」とかじゃなくて,もっと根本的なことを改善すべきであるように思えます(変数名さえ被らなければOK! っていうなら別だが). 全く意味も役割も異なる物に同じ名前を付けちゃう奴が実際にいるとは思えない(個人の感想です)ので, そしたら,名前が被ってるってことは「役割被ってるやつがそんな狭い範囲内に複数も!?」っていう話になるわけで.
fana

2022/07/15 02:26

> 変数名というのは,ふつー(?)は,意味/用途/etc に即したものになる 例えば,他の回答に出てきてるような > int value = 0; こんなのは「実際のプログラム」には書かないよね. 「命名規則がどうの」いうのを持ち出してこれを int g_VALUE = 0; //先頭に g_ を付けて,以降は大文字にすること! とか何とか書くように強制すれば満足なのか?
insecticide

2022/07/15 02:37 編集

お返事ありがとうございます。 > とか何とか書くように強制すれば満足なのか? 自由度が高いほうが良いと思いますが、命名規則に関しては、コンパイラーがチェックしてくれれば、余計な神経を使わないくても良いかと思います。 codingする時頭がいつも他の事でいっぱいになっちゃって、疲れる状態もありますので、本質じゃない処について機械が自動的にやってくれればよいのでは?
fana

2022/07/15 02:55

命名規則とかいう 俺ルール/現場ルール の機械的なチェックがしたいなら,それをするものを独自に作ればいいだけの話ではあるまいか. そんな「本質じゃない」事柄をわざわざ言語仕様にいれる必要はないと思うよ.
fana

2022/07/15 03:08 編集

ま,そんなどうでもいい話よりも, この自己回答の内容が,「質問内容に対しての解の話になっていない」という点が問題ではあるまいか. 本件は,コードを書く側の立場の者がどうすべきかという話ではなく,クソコードに出くわした悲劇的な立場の人物が取り得る手段に関するものであったハズ. > 問題にしているのは変数名が被っているのを前提とする場合の対処法 とあなたが述べたように,「クソコードは既に我々の目の前にある」のだ. (その状態において,「将来言語仕様がこうなってくれればこんな苦労をしなくてよくなるのになぁ…」とか考えていても現実逃避にしかならない.目の前の作業はどうするのか?)
insecticide

2022/07/19 11:26 編集

多人数で開発している大きなオブジェクトを考えてくだい。 例えば、大規模な銀行オンラインシステム。 命名規則、コーディング規約の作成だけでも数人で数ヶ月かかります。 不都合発生した場合の訂正によって、全員災難状態に陥り、修正後のシステム再度デバッグ、テストには数週間かかります。 例えば、あるメンバーがグロバル変数xを修正しようとしたら、関数の引数のリストの中に偶然にもxという名前のやつがあったりして、気づかないまま過ごした。 これで、通常問題ないが、たまには数百万円の誤差が生じたら、誰のせいか、どこの原因か、誰も知りません。業務停止して、システム全体再度検査、テスト、、、どれぐらいのコストとリスクの災難だろう。。。 ソフト開発方法論を論ずる場合、あくまで人間がミスを起こす、誤りが必ず発生したりするのを前提にされていて、みんな頭が良いだから、経験が豊かだから、うっかりしないだから、いつも真面目で、精神状態良好で、永遠に集中力が抜群を前提にして議論するのはナンセンスでは? 多くの事を機械的に強制しなければ、人間個人の好み、慣習、いい加減さ、その時の精神状態、集中力、経験によって、メンバーの更新によって、色々潜在なリスクが潜んでいます。 大きなプロジェクトの場合「コード量の災難」が起きるケースもあります。。。 命名規則、コーディング規約が人間によって作成するのをやめるべきばかりか、自動コーディングでさえ必要な時代もなってくるのではないでしょうか。
fana

2022/07/19 09:03

既述したように,この回答内容では質問内容への回答になっていないものと思いますが,そのことは置いとくとして… --- 「異なる意見」な方向性の話を書きましたが,それによって 何かしらの価値観を統一したいわけでもないし,異なる意見の間の優劣を付けたいわけでもないです.(←経験上,teratailではわざわざこんなことを明言する必要性がありそうにも思うので,念のため.) 単に,回答として書かれた内容に対する感想(?)を書いただけです. (そのこと自体が蛇足であったとも思えるので,そこは反省.)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問