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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

Q&A

解決済

1回答

2298閲覧

SetPosやGetPosのような今いる座標を入れたり参照したりするだけの処理文が短い関数はヘッダーに処理を書くべきか否か

.com

総合スコア8

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

0グッド

0クリップ

投稿2021/06/07 21:22

前提・実現したいこと

最近C++の勉強を始めて、元々C言語ベースのプログラムをC++にしようと思い、とりあえずクラスで書き直しています。
そこで、2点悩んだことがあります。

1つ目
SetPosやGetPosという関数の処理をヘッダーに書くか悩んでいます。

SetPosは各ステージごとのプレイヤーなどのキャラクターやオブジェクトの座標を決めるために使っています。
GetPosは当たり判定で使っています。

下記のコードはプレイヤーのcppに書かれたものです。

C

1XMFLOAT3* GetPlayerPos(void) 2{ 3 return vPos; 4} 5 6void SetPlayerPos(XMFLOAT3 pos) 7{ 8 vPos = pos; 9}

2つ目
上記のコードに書いてあるvPosは下記のようにヘッダーファイルでprivateで宣言していますが、変数名は多重定義防止のため、PlayerPosとかに変えたほうが良いでしょうか。
または、構造体化して、その中にvPosやvScl、nStateなどの情報を入れてpPlayer->vPosのように使った方が良いでしょうか。

C

1private: 2  int nState; // 状態 3 XMFLOAT3 vPos; // 座標 4 XMFLOAT3 vRot; // 回転 5 XMFLOAT3 vScl; // 大きさ 6 XMFLOAT3 vVel; // 速度 7 XMFLOAT4X4 g_mtxWorld; // 座標変換データ

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

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

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

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

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

fana

2021/06/08 01:05

> XMFLOAT3* GetPlayerPos(void) 質問の主題に影響はないが,戻り値の型が異なるように見える.
.com

2021/06/08 03:38

ホントですね。 コピペではなく手書きで書いたので間違って書いていました。 正しくは下記です XMFLOAT3* GetPlayerPos(void) { return &vPos; }
fana

2021/06/08 04:16

多くの場合,内側で抱えている物(メンバ)へのポインタ(や参照)を返すのはやめておいた方がよいです. 持ち主の知らないところで,任意のタイミングで,そのポインタを介して勝手にメンバの値を変更できる手段を提供してしまう形になります. また,ポインタのようなものを返すと,ポインタが指す先のメンバの生存期間との兼ね合いに注意しないとバグる形になります. 「XMFLOAT3 という型のコピーのコストがかなりでかいから何とかしたいので…」みたいな理由でもない限りは, 「vPosのコピー」を返しておくのが問題が無くてよいでしょう.
fana

2021/06/08 04:27 編集

XMFLOAT3* 型で メンバvPos を指すポインタを返してしまったら,そのポインタを受け取った側が好き勝手にvPosの値を変更できるわけですから, vPos を private にしている意味が全くなくなってしまいますね. const XMFLOAT3 * 型ならば,その点がマシになりますが, 前述の通り,ポインタ型とする真っ当な理由がないならば,XMFLOAT3 型にするのがよいでしょう.
.com

2021/06/08 05:03

色々とありがとうございます。 GetPlayerPos()に関してはXMFLOAT3の型で参照のみしたいだけです。 使う所は、当たり判定を取る時にオブジェクトの位置を参照する。と言うところくらいです。 とりあえず、提示していただいたconst XMFLOAT3 ✳︎で書いていきます。 調べた所、ポインタにも色々種類があるみたいなので少しずつ理解していこうと思います。
guest

回答1

0

ベストアンサー

1つ目

好きにすればよい.

2つ目

何がどう「多重定義」になる恐れがあるのか? が不明であるが,
vPos等のデータがメンバ変数である以上,その持ち主が存在するわけだから,持ち主::データ という形であるハズ.大抵はそれで十分ではないだろうか.
例えば,

class Player { private: XMFLOAT3 vPos; //座標 };

という形であれば,このvPosは「Playerの座標」だとわかるから,わざわざPlayerPosという変数名にする必要はない.
そうではなくて,

class XXX { private: //なんかいろんな奴のデータをごちゃごちゃと保持している XMFLOAT3 vPos; //これは Player の座標で… XMFLOAT3 vPos2; //これは他のやつの座標で… ... };

みたいな形になっているとかいう話であれば,確かに名称なりデータ構造なりで分かりやすくした方が良い.

投稿2021/06/08 01:00

編集2021/06/08 01:04
fana

総合スコア11996

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

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

.com

2021/06/08 03:55 編集

完全に自分の勉強不足でした。 ヘッダーをインクルードした場合、他のcppファイルでも普通にvPosと置いて使えてしまうものだと思っていて、その際に例えばCollision.cppがあるとするとvPosがPlayerやBullet、Enemyなどにもあるため、そこで定義元がぐちゃぐちゃになり、バグの原因になるのかなと思っていました。 そもそもprivateにしておけば、Player::~の中でしか使えないという事、認識しました。 一つ目に関しては結構どうでも良いという事なので、cppのコード量を少なくするためにヘッダーに書きます。 かなり初歩的なことにお手数をお掛けして申し訳ございません。 ありがとうございました。
fana

2021/06/08 04:19 編集

何をどのようにうまく把握できていない感じなのかが,こちらにはいまいちわからないですが, 複数の要素が複合した塊についてなんとなく認識するのではなく, 個々の要素を1つずつしっかり把握しておいた方がよいのではないかな,とか何とか思います. ・「多重定義」 → 定義とは? 多重とは? ・「インクルード」 → そもそもインクルードとは? ・「private」 → どんな機能か? { private, public, protected }の違いは? ・etc : (型 と インスタンス の違いとか?)
.com

2021/06/08 04:37

そうですね。 完全に説明しろ。と言われたら取り留めの無い事を言うと思います。 書かないと覚えられないタイプなのでコードは書きますが、座学も進めて説明できるようにしておこうと思います。
fana

2021/06/08 04:48

> 1つ目 に関しては,回答が簡素すぎて投げやり感みたいなのが感じられる気もしますので,一応補足しておきます. {メソッドの定義を宣言部分(ヘッダ)に書くか,別のcppに定義を分けて書くか}によって, そのメソッドの定義を変更した際にその型の利用側(ヘッダをincludeしてる側)に再コンパイルの必要が出るか/出ないか,というところに差が生じます. が,今回の例のような(おそらくその実装変更自体が生じることは無かろう,というほど)単純なものならば好きな形でよいかな,と. あと,メソッドの宣言と定義を分けずに書くと,「そいつには inline を付けたことに(暗黙的に)なる」という話があります. 丁度そこらへんの話をしている質問を見つけたので提示しておきます. https://teratail.com/questions/40481
.com

2021/06/08 05:21

ご丁寧にありがとうございます。 感覚的に複雑な処理(計算とかプレイヤー操作とか)はcpp、1〜2行の処理はヘッダーという感覚であながち間違っては無いみたいで良かったです。 再コンパイルが必要か不必要かは処理時間の関係もあるので多少気にかけておこうと思います。 とりあえずSet〜とかGet〜は複雑な処理では無いのでヘッダーに書いておこうと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問