仮引数の数を臨機応変に
仮引数の数を臨機応変に
1. 例えば、引数をn個取ることも(n-x)個取ることも可能な関数の
仮引数はどのように書けばよいのでしょうか?(x<=n かつ 0<n と一応します)
2.変数 = 関数というような式があれば、
変数には戻り値のみが入るのでしょうか?
それとも変数が出るたびに関数と同等の処理等を行うのでしょうか?
(後者だと思っています。)
そして仮に後者だとすると
というようなプログラムと というようなものは二回呼び出すことになりますよね?
間にInitGraph() ;等の破棄・初期化関数をはさむのもふさわしくない気がするのです。
どうすればよいのでしょうか?
3.constと#defineの使い分けなのですが、#defineは解りますが
constは未だに使い慣れず使い時もいまいちわかりません。
関数の仮引数では大活躍のようですが、やはりピンと来ません。
構造体にくっつけた場合などは本当に理由がわかりません。
特に構造体自体につける理由は見当もつきません。
(enumで代用できるかと推測しています。試行したことは無いです。)
理由を教えてください。
仮引数はどのように書けばよいのでしょうか?(x<=n かつ 0<n と一応します)
2.変数 = 関数というような式があれば、
変数には戻り値のみが入るのでしょうか?
それとも変数が出るたびに関数と同等の処理等を行うのでしょうか?
(後者だと思っています。)
そして仮に後者だとすると
というようなプログラムと というようなものは二回呼び出すことになりますよね?
間にInitGraph() ;等の破棄・初期化関数をはさむのもふさわしくない気がするのです。
どうすればよいのでしょうか?
3.constと#defineの使い分けなのですが、#defineは解りますが
constは未だに使い慣れず使い時もいまいちわかりません。
関数の仮引数では大活躍のようですが、やはりピンと来ません。
構造体にくっつけた場合などは本当に理由がわかりません。
特に構造体自体につける理由は見当もつきません。
(enumで代用できるかと推測しています。試行したことは無いです。)
理由を教えてください。
Re: 仮引数の数を臨機応変に
>1
可変長引数を使うとかそれぞれ用意するとかやりようはいくらでもあるとおもいます。
>2
前者です。戻り値を代入しているだけです。
>3
たとえばひとつの翻訳単位・・・cppファイル内で使うだけの定数のために#defineを作ってしまうとプロジェクト全体でその定数が参照できてしまいますがconstならそういうことを防げます。名前空間に入れることができることも大きな利点です。
あと関数の引数のconstと定数におけるconstは同一視しないほうがいいかもしれません。
構造体にくっつけた場合というのはよくわからないのでパスです
可変長引数を使うとかそれぞれ用意するとかやりようはいくらでもあるとおもいます。
>2
前者です。戻り値を代入しているだけです。
>3
たとえばひとつの翻訳単位・・・cppファイル内で使うだけの定数のために#defineを作ってしまうとプロジェクト全体でその定数が参照できてしまいますがconstならそういうことを防げます。名前空間に入れることができることも大きな利点です。
あと関数の引数のconstと定数におけるconstは同一視しないほうがいいかもしれません。
構造体にくっつけた場合というのはよくわからないのでパスです
✜ で C ご ✜
: す + 注 :
¦ か + 文 ¦
: ? Is the は :
✜ order C++? ✜
: す + 注 :
¦ か + 文 ¦
: ? Is the は :
✜ order C++? ✜
糸冬
――――――――
制作・著作 NHK
――――――――
制作・著作 NHK
Re: 仮引数の数を臨機応変に
これは誤解を招きそうな言い方のような気がします。例えばhoge.cppの頭で のように#defineした場合、hoge.cppを他の場所で#includeしない限りは(.cppファイルなのでそんなことはしないと思いますが)、FOOという名前はhoge.cpp外部から見えません。lowe さんが書きました: >3
たとえばひとつの翻訳単位・・・cppファイル内で使うだけの定数のために#defineを作ってしまうとプロジェクト全体でその定数が参照できてしまいますがconstならそういうことを防げます。名前空間に入れることができることも大きな利点です。
もちろん、hoge.cppの頭で#defineの代わりにconst変数を使って と書けば、やはりFOOはhoge.cpp内のみで有効な名前になります。
const変数を#define定数の代わりに使うのは、loweさんが仰るように、定数が有効な範囲(定数のスコープ)や、定数の型が指定できるからではないでしょうか。
Re: 仮引数の数を臨機応変に
1.可変長引数は初めて知りました。
難しそうですが凄く便利だと思いますので参考にさせていただきます。
それぞれ用意するのはシューティングの敵弾の個数のように
多数のパターンが存在する場合は非現実的だと考えました。
2.戻り値を代入しているだけなんですか。 それならこのように書けば一回しか呼ばれないということですね。
3.constなら#includeされても定数が影響を与えたり
受けたりすることがない。という状態に簡単にするわけですね。
namespace関連はヘッダーやライブラリで重要ですね。
ですが定数の型を指定できるというメリットがよくわかりません。
ポインタや構造体に関係することですか?
難しそうですが凄く便利だと思いますので参考にさせていただきます。
それぞれ用意するのはシューティングの敵弾の個数のように
多数のパターンが存在する場合は非現実的だと考えました。
2.戻り値を代入しているだけなんですか。 それならこのように書けば一回しか呼ばれないということですね。
3.constなら#includeされても定数が影響を与えたり
受けたりすることがない。という状態に簡単にするわけですね。
namespace関連はヘッダーやライブラリで重要ですね。
ですが定数の型を指定できるというメリットがよくわかりません。
ポインタや構造体に関係することですか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 仮引数の数を臨機応変に
printfのようなものは良いですが可変長引数は型のチェックの問題とかバグの原因になりかねません。zxc さんが書きました:1.可変長引数は初めて知りました。
難しそうですが凄く便利だと思いますので参考にさせていただきます。
それぞれ用意するのはシューティングの敵弾の個数のように
多数のパターンが存在する場合は非現実的だと考えました。
なので多用される事はまずありません。
呼び出すことでメモリに影響をあたえるような関数は必要最低限の回数しか呼び出してはいけません。zxc さんが書きました:それならこのように書けば一回しか呼ばれないということですね。
そうしないと起動中にどんどんメモリに残存してしまうメモリリークが起こります。
型を指定できることは重要です。zxc さんが書きました: 3.constなら#includeされても定数が影響を与えたり
受けたりすることがない。という状態に簡単にするわけですね。
namespace関連はヘッダーやライブラリで重要ですね。
ですが定数の型を指定できるというメリットがよくわかりません。
ポインタや構造体に関係することですか?
#define HOGE_MAX 1では1と言う値の意味しかなくint型なのか何らかのクラスなのかは区別されません。
const hoge_class hoge_data(1);であればhoge_classのコンストラクトが1と言う値で行われたconstなインスタンスだと明言されますので、コンパイル時に型チェックされミスでおかしな処理をする危険性を減らすことができます。
それとdefineは変数、命令構文など区別なく置き換えますので予想外の置き換えが起こる危険性を常にはらんでいますがconstはその心配はありません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 仮引数の数を臨機応変に
3.
softyaさんが分かりやすく指摘してくださったので補足ですが。。。
std::string型の定数を作りたい! FOOは呼び出すたびにstd::stringのコンストラクタが動いて一時オブジェクトが生成されますが、BARは同じオブジェクトを指し示します。(最適化がかかると変わる可能性はあります)
この利点の他に、まだありました。const定数はクラスのプライベートな定数にしたりできますね。
3.
softyaさんが分かりやすく指摘してくださったので補足ですが。。。
std::string型の定数を作りたい! FOOは呼び出すたびにstd::stringのコンストラクタが動いて一時オブジェクトが生成されますが、BARは同じオブジェクトを指し示します。(最適化がかかると変わる可能性はあります)
この利点の他に、まだありました。const定数はクラスのプライベートな定数にしたりできますね。
3.
この意味が良くわかりませんので、具体的な例を示していただけますか?zxc さんが書きました: 構造体にくっつけた場合などは本当に理由がわかりません。
特に構造体自体につける理由は見当もつきません。
Re: 仮引数の数を臨機応変に
これについてですが、引数の型によって戦略が変わってきます。zxc さんが書きました:1. 例えば、引数をn個取ることも(n-x)個取ることも可能な関数の
仮引数はどのように書けばよいのでしょうか?(x<=n かつ 0<n と一応します)
C互換型なら可変個引数というのも(危険ではありますが)ありがと思いますが、それ以外だと論外です。
同じ型ばかりが可変個なのか、異なる型が混在するのかによっても、変わってきます。
関数ではなく、マクロを使ってもよいのであれば、もう少し実装しやすくなります。
同じ型ばかりであれば、std::initializer_listを使うのも一つの手です。
シンタックスはやや異なりますが、目的は十分果たせるでしょう。
異なる型が混在するのであれば、仮引数をstd::tupleにして、実引数をstd::make_tupleで組み立てれば(やはりシンタックスは異なりますが)同様のことが実現できます。
可変長引数テンプレートで引数を組み立ててもよいでしょう。
マクロを使えば、std::make_tupleに__VA_ARGS__を渡せば何とかなるように思います。
まあ、そこまで難しくしなくても、どうせ何十個も引数が必要になるわけでもないでしょうから、0~16個程度の引数取る関数を多重定義すれば済む気がします。
場合によっては、省略時実引数だけで済むかも...
Re: 仮引数の数を臨機応変に
このようなものをどこかで見たのか勝手に作ったのか覚えてないんですが
斜線部分二箇所がわかりません。成否の条件もあやふやです。
<可変長引数は型のチェックの問題とかバグの原因>
printfやscanfが嫌われる要因となっているわけですか。
<呼び出すことでメモリに影響をあたえるような関数は
必要最低限の回数しか呼び出してはいけません。>
メモリリークを回避しようと考えたので2.のような質問をしたのですが、
自分が考えたプログラムは回避できていないということでしょうか?
<型を指定できることは重要です。>
コンパイラがクラスや変数と勘違いしにくいようにできる。ということですかね。
6~7行目はわかりました。
<const定数はクラスのプライベートな定数にしたりできますね。>
これは最重要といっても過言ではないくらい大事だとはわかるんですが
クラスの知識が乏しいのも相まって後回しにしてます。
可変個数の引数を持つ関数は別のアプローチもあるんですね。
まだ自分には早いんでしょうね。かなり難しいです。
斜線部分二箇所がわかりません。成否の条件もあやふやです。
<可変長引数は型のチェックの問題とかバグの原因>
printfやscanfが嫌われる要因となっているわけですか。
<呼び出すことでメモリに影響をあたえるような関数は
必要最低限の回数しか呼び出してはいけません。>
メモリリークを回避しようと考えたので2.のような質問をしたのですが、
自分が考えたプログラムは回避できていないということでしょうか?
<型を指定できることは重要です。>
コンパイラがクラスや変数と勘違いしにくいようにできる。ということですかね。
6~7行目はわかりました。
<const定数はクラスのプライベートな定数にしたりできますね。>
これは最重要といっても過言ではないくらい大事だとはわかるんですが
クラスの知識が乏しいのも相まって後回しにしてます。
可変個数の引数を持つ関数は別のアプローチもあるんですね。
まだ自分には早いんでしょうね。かなり難しいです。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 仮引数の数を臨機応変に
No.1の質問のコードはBadです。if文内で画像ハンドルを捨てていますので。zxc さんが書きました: <呼び出すことでメモリに影響をあたえるような関数は
必要最低限の回数しか呼び出してはいけません。>
メモリリークを回避しようと考えたので2.のような質問をしたのですが、
自分が考えたプログラムは回避できていないということでしょうか?
No.4のように書けばGoodです。
ただ画像ハンドルはint型に入れているので勝手に捨てられることはありません。
自分で破棄を管理して破棄しない限り同じ画像ハンドルに何も代入しない様に管理する必要があります。
こういうのは検証コードを書いてみるのが一番理解への早道です。
どれがOKでどれがダメか予想しながら検証コードを書いてみて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 仮引数の数を臨機応変に
具体的な状況が明記されていない質問だったので可変長引数なども候補として書きましたが、ほかのかたがおっしゃっているようにあまり率先して使うものではありませんね。
ただそもそもオーバーロードで対応しきれないほどの状況ができてしまうのがあまりよろしくないような気もします。
一例かもしれませんがシューティングの弾のせいで引数が増えているとして、それは弾の抽象クラスを作って多態化させればある程度緩和、あるいは解決するような気がします。
まぁまだC++のクラスに関する知識が乏しいと考えてらっしゃるようなので無理にそうする必要はないですが、いずれにせよオーバーロードで解決するのがもっとも簡単にいくと思います。手間はかかるかもしれませんが。
ただそもそもオーバーロードで対応しきれないほどの状況ができてしまうのがあまりよろしくないような気もします。
一例かもしれませんがシューティングの弾のせいで引数が増えているとして、それは弾の抽象クラスを作って多態化させればある程度緩和、あるいは解決するような気がします。
まぁまだC++のクラスに関する知識が乏しいと考えてらっしゃるようなので無理にそうする必要はないですが、いずれにせよオーバーロードで解決するのがもっとも簡単にいくと思います。手間はかかるかもしれませんが。
✜ で C ご ✜
: す + 注 :
¦ か + 文 ¦
: ? Is the は :
✜ order C++? ✜
: す + 注 :
¦ か + 文 ¦
: ? Is the は :
✜ order C++? ✜
糸冬
――――――――
制作・著作 NHK
――――――――
制作・著作 NHK
Re: 仮引数の数を臨機応変に
納得いたしました。出来るだけconstを使用して慣れようと思います。
if文内で破棄するというのとオーバーロードは凄いですね。知りませんでした。
皆さん回答ありがとうございました。
解決とさせていただきます。
if文内で破棄するというのとオーバーロードは凄いですね。知りませんでした。
皆さん回答ありがとうございました。
解決とさせていただきます。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 仮引数の数を臨機応変に
少し書き方が悪かったので訂正しておきます。zxc さんが書きました: 納得いたしました。出来るだけconstを使用して慣れようと思います。
if文内で破棄するというのとオーバーロードは凄いですね。知りませんでした。
皆さん回答ありがとうございました。
解決とさせていただきます。
の捨てるの意味は画像ハンドルを誰も受け取っていない。つまり新たな画像ハンドルはLodGraphで生成されるが変数に保存されないです。if文内で画像ハンドルを捨てていますので。
なので、ここでメモリリークが発生してプログラムのメモリ内に使われることのない画像情報が蓄えらられる事になります。
最終的にプロセス終了時には解放されますがムダで意味のない行為です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。