トップページ⇒tech
1001コメント275KB

C++相談室 part85

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/10/09(土) 20:22:35
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part84
http://hibari.2ch.net/test/read.cgi/tech/1284736187/
0455デフォルトの名無しさん2010/10/24(日) 17:21:28
>>453
あ、普通に参照渡してもコピーされるのね…なんか勘違いしてた
どうもですた
0456デフォルトの名無しさん2010/10/24(日) 17:21:46
>>454
配置new
0457デフォルトの名無しさん2010/10/24(日) 19:06:38
>>455
Java もやってる?Java だと挙動違うから混乱しやすい
0458デフォルトの名無しさん2010/10/24(日) 19:29:59
関数の戻り値以外でポインタを使う場合ってありますか?
0459デフォルトの名無しさん2010/10/24(日) 19:31:31
printfの引数の型を調べてみろ
0460デフォルトの名無しさん2010/10/24(日) 19:33:45
クラス内の別のクラスをメンバとして持たせた場合、
そのメンバのクラスのコンストラクタって実行されますか?
実行されるとしたら、どのタイミングで実行されますか?
0461デフォルトの名無しさん2010/10/24(日) 19:35:15
>>460
クラス内の→クラス内に
が正しいです。
0462デフォルトの名無しさん2010/10/24(日) 19:37:42
やってみたほうがはやくね
0463デフォルトの名無しさん2010/10/24(日) 19:38:57
やったんですが、どうも実行されてない感じなので、確かめたいんです。
0464デフォルトの名無しさん2010/10/24(日) 19:43:43
どんなソース書いたのか晒してみ?
0465デフォルトの名無しさん2010/10/24(日) 19:44:33
実はメンバがポインタだったりしてな
0466デフォルトの名無しさん2010/10/24(日) 19:46:25
DRAW::DRAW()
:now(0),width(0),height(0){}

こんな感じ
0467デフォルトの名無しさん2010/10/24(日) 19:47:43
 こ れ は ひ ど い
0468デフォルトの名無しさん2010/10/24(日) 19:48:57
え?どっかおかしいですか?
0469デフォルトの名無しさん2010/10/24(日) 19:52:51
now,width,heightはクラスなの?
0470デフォルトの名無しさん2010/10/24(日) 19:53:15
別のクラスってのはどれのことなんだ
問題のメンバはどれなんだ
質問してる内容についてのことが何もわからないぞ
0471デフォルトの名無しさん2010/10/24(日) 20:01:09
引っ張る話題でもないので
http://codepad.org/UxA3ZeAX

printf挟むなりデバッガ使うなりしようぜ
0472デフォルトの名無しさん2010/10/24(日) 20:05:24
http://codepad.org/zleOhppG

!?
0473デフォルトの名無しさん2010/10/24(日) 20:08:06
みなさんありがとうございます。
やっぱり実行されますよね。

どっかで値が変わってしまってるようなので、徹底的に調べます。
0474デフォルトの名無しさん2010/10/24(日) 21:37:09
get/setのgetにはひとまず、constを付けておくべきですか?
0475デフォルトの名無しさん2010/10/24(日) 21:40:02
そりゃconst付けられるなら付けたほうがいい
04764742010/10/24(日) 21:40:54
>>475
了解しました
ありがとうございます
0477デフォルトの名無しさん2010/10/24(日) 21:58:31
const付けられるものは全部つけたほうがいい
どのメソッドにconst付けるべきか判断できないなら、
それは設計に失敗しているかもしれない
0478デフォルトの名無しさん2010/10/24(日) 22:04:20
>>458
データ構造を考えるようになると、いろいろと。
0479デフォルトの名無しさん2010/10/26(火) 21:53:18
普通にソフトを作っているだけで、スタックオーバーフローって発生する?
フレームワーク使うと、裏でいろいろやってくれているから発生しな気がするんだけど
0480デフォルトの名無しさん2010/10/26(火) 22:13:03
普通にソフトを作っているだけでは、スタックオーバーフローって発生しません
0481デフォルトの名無しさん2010/10/26(火) 22:51:59
>>480
そうとは限らないぞ
巨大な配列や巨大なクラスをローカル変数に取るとスタックがパンクする事がある
0482デフォルトの名無しさん2010/10/26(火) 22:52:29
スタックオーバーフローなんて経験したのは、再帰の練習問題で変なコード書いちゃった時くらいだな。
0483デフォルトの名無しさん2010/10/26(火) 22:56:07
>>482
俺も再帰覚えたての頃やらかしたわ
0484デフォルトの名無しさん2010/10/26(火) 22:58:14
再帰でやらかす奴そんなにいるか?
それ以前に二次元配列あたりでぶちあたるはずだが
0485デフォルトの名無しさん2010/10/26(火) 22:58:53
そうなんですよね。再帰は難しいから一度は勉強するけど
その後は使わないんですよね?
0486デフォルトの名無しさん2010/10/26(火) 22:59:26
再帰って大抵O(log n)のアルゴリズムの時じゃないとループにしちゃうから
再帰書いても滅多なことではオーバーフロー起こさないよね
0487デフォルトの名無しさん2010/10/26(火) 23:15:05
今まで独学でC++を勉強してきたのですが、
ライブラリを作成してみようとしたところで詰まってしまいました
調べてみても納得いく説明があるサイトが見つからず、他に聞ける人もいなくて困っています
もしかしたらライブラリの解釈も間違っているかもしれないので、1からご教授頂けると助かります

私の中では静的ライブラリ(libファイル)の中には複数のh、cppファイルを内包できて、
ライブラリを利用する関数などの宣言が書かれているhファイルと出来上がったlibファイルをプロジェクトに追加すれば呼び出せる

と考えているのですがどうでしょうか
また、ライブラリの中にクラスを入れたい場合や、ライブラリ内にあるクラス同士での#includeなどの操作、
ひとつのlibファイルに複数のクラスを入れてもいいものなのかどうなのかなど、
全然わからず手探り状態なので、どなたかよろしくお願いします
0488デフォルトの名無しさん2010/10/26(火) 23:23:13
ヘッダは同じものを使わないとだめ
libもリンクしないと使えないし、コンパイルする環境が違うと困る
0489デフォルトの名無しさん2010/10/26(火) 23:51:07
ゲーム製作に関するC++の質問ってどこのスレで質問するのが望ましいのでしょうか?
0490デフォルトの名無しさん2010/10/26(火) 23:57:43
なるほどです

たとえばライブラリ内に以下の4ファイルを含めてあった場合
foo.h //外部用関数宣言&#include "bar.h"
bar.h //クラス宣言
bar.cpp //クラス実装 #include "bar.h"

この場合は使用するプロジェクトへ追加するファイルはfoo.libとfoo.hの二つで、
プロジェクト側でのリンクが必要、ということでいいのでしょうか?
0491デフォルトの名無しさん2010/10/26(火) 23:57:46
C++ の言語自体の質問ならここでよかろう
API の考え方ならその API のスレ
0492デフォルトの名無しさん2010/10/26(火) 23:58:37
ゲームプログラムなら俺に聞けスレ
0493デフォルトの名無しさん2010/10/26(火) 23:59:23
>>490
ミスた、3ファイルの間違いです修正
0494デフォルトの名無しさん2010/10/27(水) 00:02:37
色々廻ってきます。
叩かれて戻ってきたらすいません。
0495デフォルトの名無しさん2010/10/27(水) 00:44:46
リードオンリーなメンバ変数を作ることは可能ですか?
全部にゲッタメンバをつけるのはなんか変なので
0496デフォルトの名無しさん2010/10/27(水) 00:49:32
メンバ変数にconst付ければ
0497デフォルトの名無しさん2010/10/27(水) 01:09:34
クラスのメソッドからは値を変えられるんですよ
内部状態なんで外部から変更されたくないけど、観測する必要があるので
0498デフォルトの名無しさん2010/10/27(水) 01:12:43
じゃあゲッタでいいでしょ
0499デフォルトの名無しさん2010/10/27(水) 01:13:40
>>497
何故、自分で試さないの?
バカなの?死ぬの?
0500デフォルトの名無しさん2010/10/27(水) 01:21:43
無理なら無理って言えばいいのに・・・
0501デフォルトの名無しさん2010/10/27(水) 08:13:30
publicでconstな参照にすれば?
0502デフォルトの名無しさん2010/10/27(水) 09:09:06
vectorで何もまだ値を格納してない状態で、beginとendをよびだしたら
何を返すの?
0503デフォルトの名無しさん2010/10/27(水) 10:15:17
>>582
やってみればいいじゃん
0504デフォルトの名無しさん2010/10/27(水) 10:22:21
特定のメソッドからしか呼び出さないサブルーチン用のメソッドが多いんです
スコープを制限したいんですが、関数内に関数を書くことは出来ませんよね?
なんか近い方法ないでしょうか?
0505デフォルトの名無しさん2010/10/27(水) 10:23:16
そうだぞ。まずはやってみるんだ>>582
期待しているぞ>>582
お前ならできる>>582
0506デフォルトの名無しさん2010/10/27(水) 10:23:58
×>>582
○>>502

実際やってみた

int main()
{
std::vector<int> vi;
std::vector<int>::const_iterator vic = vi.begin(), vic2 = vi.end();

if (vic == vic2)
std::cout << "vic == vic2" << std::endl;
}

この結果が vic == vic2 なので、viの中身は空である事を考慮すれば、vicの指す
要素は無効であるが、vic2は正しく空のコンテナの次を指しており、vicは実質的に
それと等しく初期化されている事がわかる

本当の所はどうなのかは規格票によらなければならないが、まあだいたい予想通り
と言う事が出来る
0507デフォルトの名無しさん2010/10/27(水) 10:28:42
>>504
構造体とかクラスを関数内で定義すれば書ける。
0508デフォルトの名無しさん2010/10/27(水) 10:30:31
>>507
関数オブジェクトという奴でしょうか?
ただそれだとメソッド内クラスから元のクラスのメンバが参照できないため
invaild use of nonstatic data memberエラーになってしまうんです
0509デフォルトの名無しさん2010/10/27(水) 10:36:20
vectorの件ありがとう
プロジェクトを作成する手間が省けたわ
0510デフォルトの名無しさん2010/10/27(水) 10:48:17
>>504
C++0xのラムダ式をmutableにして無理矢理使う
0511デフォルトの名無しさん2010/10/27(水) 11:07:10
>>510
いいですね、これ
コンパイラも対応しているみたいですし
ありがとうございます
0512デフォルトの名無しさん2010/10/27(水) 11:23:20
>>508
もう遅いけどそういう場合はthisポインタ渡しとけばいいんじゃない?
0513デフォルトの名無しさん2010/10/27(水) 11:28:51
それってprivateメンバアクセスできんの?
0514デフォルトの名無しさん2010/10/27(水) 11:29:31
>>508
http://codepad.org/mM6aROvP
foo::func()内でbar::func()を宣言して、bar::func()内でfoo::Valueにアクセスしている。
0515デフォルトの名無しさん2010/10/27(水) 15:09:53
>>495
頭おかしいやつが登場したww

private指定したいわけじゃなくて??
0516デフォルトの名無しさん2010/10/27(水) 15:19:49
>>495
観測したい変数を全部構造体でまとめて、
それをconst参照するゲッタを作ればいい

ようはいちいちゲッタ作るの面倒って話でしょ?
0517デフォルトの名無しさん2010/10/27(水) 15:19:50
問題は、
・雪駄は勿論、下駄は必要なだけで充分。
・基本的に、下駄を公開するのは設計に問題がある場合が多い。本来なら適切な名前のメソッドで置き換えられるだろう。
・当然、雪駄については下駄以上に生で晒すのはおかしい。
という認識がないことじゃないか。

結論:
下駄や雪駄も生足同様、安易に公開するもんじゃない。
0518デフォルトの名無しさん2010/10/27(水) 15:21:41
>本来なら適切な名前のメソッドで置き換えられるだろう
なにかおかしくね?
0519デフォルトの名無しさん2010/10/27(水) 15:25:06
で、でたー!極論で設計に問題あり!
0520デフォルトの名無しさん2010/10/27(水) 15:29:23
下駄を使った場合。
「装備の一覧を見せてくれ。」
「一番いいのはどれだ。」
「そいつを頼む。」

下駄を使わない場合。
「一番いいのを頼む。」
0521デフォルトの名無しさん2010/10/27(水) 15:39:50
すでに持ってる装備を買っちゃうわけですね
0522デフォルトの名無しさん2010/10/27(水) 16:41:43
>>497
内部状態を外部から観測してなにするの?
0523デフォルトの名無しさん2010/10/27(水) 16:41:46
その設計で大丈夫か?
0524デフォルトの名無しさん2010/10/27(水) 16:46:41
大丈夫だ、問題ない。
0525デフォルトの名無しさん2010/10/27(水) 16:46:55
大丈夫だ、問題ない。
0526デフォルトの名無しさん2010/10/27(水) 17:45:13
エスパーで答えるけど、要するにViewの為にReadメソッドだけ公開したいんでしょ
コンパイル防壁も兼ねてProxyでも使っとけばええんちゃうの?
class Logic
{
int x;
public:
class ProxyForView
{
Logic const * mpL;
public:
ProxyForView(Logic const * pL) : mpL(pL) {}
int x(void) const { return mpL->x; }
};
ProxyForView proxy(void) const { return ProxyForView(this); }
};

int main(void)
{
Logic l;
Logic::ProxyForView p(l.proxy());
std::cout << p.x() << std::endl;
return 0;
}
0527デフォルトの名無しさん2010/10/27(水) 17:53:02
コノストンラクタの中で、テクスチャを読み込んだらエラーを返す関数を実行してるんですが、
読み込みに失敗したら強制終了させたいんです。
でもコンストラクタって、戻り値返せないじゃないですか。
そのときって、exit(0)でkillするしかないんですか?
exitした時の動作って、ウィンドウとかちゃんと終了してくれるんですか?
0528デフォルトの名無しさん2010/10/27(水) 17:54:28
・例外
・initメンバ
0529デフォルトの名無しさん2010/10/27(水) 17:54:56
コンストラクタの中で失敗するような処理をしちゃいかん
0530デフォルトの名無しさん2010/10/27(水) 17:55:14
ウインドウを終了って
0531デフォルトの名無しさん2010/10/27(水) 18:05:10
コンストラクタで失敗するような処理をするのはまずいんですか。
考えるしかなさそうだな。わかったよ。
0532デフォルトの名無しさん2010/10/27(水) 18:52:21
>>526
コンパイルエラーが出るんですけど

エラー E2247 readonly1.cpp 19: 'Logic::x' はアクセスできない (関数 Logic::ProxyForView::x() const )
0533デフォルトの名無しさん2010/10/27(水) 19:04:44
>>531
別にまずくないよ。
std::vectorだってコンストラクタで失敗すれば例外投げるだけでしょ。
0534デフォルトの名無しさん2010/10/27(水) 19:19:31
>>495
struct a
{
private: int b;
public: const int& c;
a() : c(b) { }
};

const_cast されたらアウトだけどね
0535デフォルトの名無しさん2010/10/27(水) 19:21:50
>>532
ちゃんとpublicにしてるか?
0536デフォルトの名無しさん2010/10/27(水) 19:24:40
>>535
>>526をコピペしたんですけど

今からEclipse+CDTでもやってみます
0537デフォルトの名無しさん2010/10/27(水) 19:25:07
>>527
環境は?
0538デフォルトの名無しさん2010/10/27(水) 19:27:36
>>535
MinGW4.5.1ではコンパイル出来ました
ECC6.3.0のバグらしいです
0539デフォルトの名無しさん2010/10/27(水) 20:05:45
>>531
コンストラクタで例外は投げてもいいよ。
でも例外のへんな使い方はしないでね。
0540デフォルトの名無しさん2010/10/27(水) 20:48:38
今書いてるプログラムクラス、とか全部ヘッダに書いてるんだけど問題ってある?
今のところ普通に動いてるが、もっとでかくなる予定だから問題あるなら早めに修正しときたい。
0541デフォルトの名無しさん2010/10/27(水) 20:51:11
自分が問題を感じていないなら俺には全く問題ない
0542デフォルトの名無しさん2010/10/27(水) 20:51:21
定義に中身かいちゃうと環境によっては全部インライン展開されちゃう
0543デフォルトの名無しさん2010/10/27(水) 20:52:48
C++にはjavaのstatic イニシャライザみたいなの無いんですか?
0544デフォルトの名無しさん2010/10/27(水) 20:57:04
何故メモリーリークが発生するのですか?
newしたかをosが監視して、プロセスの終了とともにOSがヒープ領域を解放すればいいだけじゃないですか
0545デフォルトの名無しさん2010/10/27(水) 20:58:22
>>544
へぼだから
0546デフォルトの名無しさん2010/10/27(水) 21:00:13
リークの定義による
0547デフォルトの名無しさん2010/10/27(水) 21:03:48
>>544
OS って前提があるようだが
どんな範囲の話がしたいんだ?
0548デフォルトの名無しさん2010/10/27(水) 21:04:07
>>544
> 何故メモリーリークが発生するのですか?
解放してないからです。
> newしたかをosが監視して、プロセスの終了とともにOSがヒープ領域を解放すればいいだけじゃないですか
普通は解放してます。
0549デフォルトの名無しさん2010/10/27(水) 21:05:55
言語仕様上javaのstaticイニシャライザ相当の機能はない
0550デフォルトの名無しさん2010/10/27(水) 21:07:53
>>544
Amiga以外にプロセスの終了時に開放しないOSが有んのかよ
0551デフォルトの名無しさん2010/10/27(水) 21:09:49
リークが「誰も参照していないものが確保されたまま残っている状態」として、誰をどこまで入れるかだよな
0552デフォルトの名無しさん2010/10/27(水) 21:17:41
>>543
言語仕様的に必要性がない
05535432010/10/27(水) 21:17:47
>>549
thx
0554デフォルトの名無しさん2010/10/27(水) 21:25:22
>>538
普通は入れ子のクラスは親のクラスのプライベート領域にもアクセス出来るんだけど
古いコンパイラだと対応してないらしい
そういう時はProxyをfriendにして誤魔化してくれ
■ このスレッドは過去ログ倉庫に格納されています