- 1 名前:デフォルトの名無しさん mailto:sage [2012/11/29(木) 00:34:40.07 ]
- エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.80【環境依存OK】 toro.2ch.net/test/read.cgi/tech/1348161305/ ◆ソースのインデントについて 半角空白やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのも手ですが直接貼る場合は、 全角空白か に置換すると見栄えだけはよくなります。 【アップローダー】(質問が長い時はココ使うと便利) codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック) ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用) NG推奨:◆QZaw55cn4c←半角にして登録してくだい
- 24 名前:デフォルトの名無しさん mailto:sage [2012/12/01(土) 15:44:33.95 ]
- 質問です。
class PointTest { private: int m_x; int m_y; public: void Set(int x, int y) { /*省略*/ } }; このようなクラスにGetメソッドを用意する場合 void Get(int &x, int &y) として1つで済ませるのと int GetX() int GetY() の2つを提供するのとではどちらがより一般的なのでしょうか?
- 25 名前:デフォルトの名無しさん mailto:sage [2012/12/01(土) 15:46:36.33 ]
- struct POINT {
int x; int y; }; class PointTest : public POINT
- 26 名前:デフォルトの名無しさん mailto:sage [2012/12/01(土) 15:55:05.36 ]
- >>24
両方いれたらいいじゃん でもよく見るのは各成分getかな
- 27 名前:デフォルトの名無しさん mailto:sage [2012/12/01(土) 16:06:04.13 ]
- 各成分getが多いけど
別に作りたけりゃ両方作ってもいいのよ
- 28 名前:デフォルトの名無しさん mailto:sage [2012/12/01(土) 17:58:53.19 ]
- メンバ変数をpublicにするのはこの場合適切ではないだろ。
- 29 名前:デフォルトの名無しさん mailto:sage [2012/12/01(土) 18:04:33.86 ]
- >>28
変数間で保つべき不変条件でも無けりゃ private にする意味ないでしょ。 点の x, y 座標間に何かそんな関係があるか?
- 30 名前:デフォルトの名無しさん mailto:sage [2012/12/01(土) 18:07:10.58 ]
- 元の>>24でprivateにする意図を示しているのに
publicにしたら質問の意味がなくなるだろう。 馬鹿じゃないの?
- 31 名前:デフォルトの名無しさん mailto:sage [2012/12/01(土) 18:10:08.47 ]
- 他のクラスのメンバで
void SetPoint(const PointTest& pt); PointTest GetPoint(); ならまだ理解できるんだが
- 32 名前:デフォルトの名無しさん mailto:sage [2012/12/01(土) 18:59:14.90 ]
- privateにするのは不変条件のためだけの話じゃないぞ
ブレークはったりデバッグコード仕込んだりできるのも重要
- 33 名前:デフォルトの名無しさん mailto:sage [2012/12/01(土) 19:13:04.66 ]
- やっぱこれだろ。
get、setは余りたくさん書きたくないからx,yくらいなら構造体でまとめる。 struct Point { int x; int y; }; class PointTest { private: Point point_; public: void setPoint(Point &point); Point getPoint(void); };
- 34 名前:デフォルトの名無しさん mailto:sage [2012/12/01(土) 20:00:07.53 ]
- プロパティってなかったっけ?
- 35 名前:デフォルトの名無しさん mailto:sage [2012/12/01(土) 20:19:17.73 ]
- しかしpointごときはprivateにする必要もないと思う
- 36 名前:デフォルトの名無しさん mailto:sage [2012/12/01(土) 20:50:07.77 ]
- >>24
getterが > void Get(int &x, int &y) として1つで済ませるのと この形の一つだけっていうのならそれは間違いなく駄目な設計 そういうクラスを実際に使うとわかるが値の取得に変数が必要ってのは明らかに使い勝手が悪い
- 37 名前:デフォルトの名無しさん [2012/12/01(土) 22:12:03.43 ]
- 同時性にこだわる俺っち、別に潔癖症とは思ってない
C++ の const は性的だし♡
- 38 名前:デフォルトの名無しさん mailto:sage [2012/12/02(日) 00:33:52.24 ]
- 有用を悩む程度のメンバアクセスにはアクセス専用の一時クラス通すんだよ
- 39 名前:デフォルトの名無しさん mailto:sage [2012/12/02(日) 01:39:40.75 ]
- 適当な型を扱う時に
デバッグ用にブレーク貼れるようにする クラステンプレート作ってるわ
- 40 名前:デフォルトの名無しさん mailto:sage [2012/12/02(日) 02:03:49.04 ]
- const Point& GetPoint() const;のがいいきがする
- 41 名前:デフォルトの名無しさん [2012/12/02(日) 02:59:51.42 ]
- 山椒がピリリと引き立つわけですか
- 42 名前:デフォルトの名無しさん mailto:sage [2012/12/04(火) 16:01:02.06 ]
- Pointぐらいならpublicにしてもいい気はするけど、あとで何か処理が追加されるかもしれない事を考えてgetter,setterを用意するほうが良い
- 43 名前:デフォルトの名無しさん mailto:sage [2012/12/05(水) 05:01:08.51 ]
- C++初心者です
cout/wcout/printf/wprintf 全てを共存する一般的な方法はありますか?
- 44 名前:デフォルトの名無しさん mailto:sage [2012/12/05(水) 11:26:48.91 ]
- ラップ
- 45 名前:デフォルトの名無しさん mailto:sage [2012/12/05(水) 12:41:34.33 ]
- 書き込むごとにフラッシュして使い分けるだけだろ
- 46 名前:デフォルトの名無しさん mailto:sage [2012/12/05(水) 17:07:57.34 ]
- Print()を作ってパラッパラッパー♪
- 47 名前:デフォルトの名無しさん mailto:sage [2012/12/05(水) 19:18:22.53 ]
- >>43
そもそも「共存」ってどういう意味なんだ? そこがはっきりしないと答えようがない。
- 48 名前:43 mailto:sage [2012/12/05(水) 21:34:40.59 ]
- 説明するより見てもらったほうが早そうなのでコードを提示します。
ideone.com/WqXlDH ideone.com/zzCBLZ ideone.com/jx3wJU ideone.com/rrhy6C ideone.com/OeHtaM ideone.com/1L9R8J ideone.com/zRmV7N ideone.com/Xdzc9r こんな結果です。 msvcならバッファのflushに注意すれば大丈夫な気もしますが gccでは諦めるしか無い?
- 49 名前:デフォルトの名無しさん mailto:sage [2012/12/06(木) 00:01:47.15 ]
- printfとwprintfは_tprintf
std::coutとstd::wcoutは共存しない
- 50 名前:デフォルトの名無しさん mailto:sage [2012/12/06(木) 01:20:44.81 ]
- >>43
仕様上はstreamにはorientationという概念があってnarrowとwideのI/Oを 同一のストリームに混在させられないことになってる MSVCだと一見平気で混ぜられるけど、_O_U8TEXTみたいなモードは orientationに基づいてるみたいで、その場合は混ぜられないよ
- 51 名前:43 mailto:sage [2012/12/06(木) 01:58:51.49 ]
- >>50
解説したブログが見つかり納得するまでにはいかないけど 理解することは出来ました。 reopenするとかで何とか出来そうなこともなさそうだけど コストが高そうなので諦めます。 ありがとう。
- 52 名前:デフォルトの名無しさん mailto:sage [2012/12/06(木) 02:00:00.98 ]
- >>50
orientationなる単語で検索したところ //←コピペミスで抜けてました。 解説したブログが見つかり納得するまでにはいかないけど 理解することは出来ました。 reopenするとかで何とか出来そうなこともなさそうだけど コストが高そうなので諦めます。 ありがとう。
- 53 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 04:03:55.42 ]
- イクリメント、デクリメントの後置きってどういう動作になってるんですか?
>後置きの場合にはインクリメント演算子による演算以外の処理を先に行います。 ググるとこんな感じの事が書いてあるし、自分でもそうだと思ってたんですが 最後に後置きのイクリメント、デクリメントの処理がされると思ってるとなんかおかしい事になります 環境はwindows7でVC++2010Expressです
- 54 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 07:24:30.05 ]
- >>53
×イクリメント ○インクリメント 例えば、j = i++はj = i, i = i + 1と等価だと考えればいい。
- 55 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 07:34:30.28 ]
- >>52
普通はずっと片方を使い続ける
- 56 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 09:54:07.71 ]
- 副作用完了点(sequence point)で調べな
- 57 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 15:15:31.43 ]
- しれっとstdout/stderrに出力するオープンソースのライブラリは結構あるので
そういうの使う時はorientationには要注意 そういうライブラリはまず間違いなくnarrowで出力していると思うが
- 58 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 15:30:38.44 ]
- MC68000上で開発された名残がそこかしこに。
- 59 名前:デフォルトの名無しさん mailto:sage [2012/12/10(月) 19:28:12.01 ]
- インクリメントでした。恥ずかしい・・・
訂正ありがとうございます 副作用完了点でググったら一つの式で一つのオブジェクトの値の変更は一回しかできない、とありました 自分がやろうとしてたのは一つの式で一つのオブジェクトの値の変更が二回になっていたのでたぶんそのせいですね ありがとうございました
- 60 名前:デフォルトの名無しさん mailto:sage [2012/12/11(火) 01:15:15.61 ]
- >>50
このような手当てが必要な理由はなんでしょうか?
- 61 名前:デフォルトの名無しさん mailto:sage [2012/12/13(木) 23:08:54.71 ]
- tcharの、charの前のtは何から来ているの?
あと L"あ"の時のLは何から来ているの? wide文字だよって示すならwprintf見たいに、w"あ"って感じにしたほうがいいような
- 62 名前:デフォルトの名無しさん mailto:sage [2012/12/13(木) 23:14:44.08 ]
- Lはlong
tはtext wにしなかったのは、多分整数と合わせたんじゃないのかな
- 63 名前:デフォルトの名無しさん mailto:sage [2012/12/13(木) 23:30:37.50 ]
- LPCTSTR lpszText;
- 64 名前:デフォルトの名無しさん mailto:sage [2012/12/13(木) 23:35:00.03 ]
- long pointer constant text string long pointer string zero-terminated text
- 65 名前:デフォルトの名無しさん mailto:sage [2012/12/14(金) 01:25:53.08 ]
- long pointer ってなんですか?
- 66 名前:デフォルトの名無しさん mailto:sage [2012/12/14(金) 01:31:06.42 ]
- 長いポインタです
- 67 名前:デフォルトの名無しさん mailto:sage [2012/12/14(金) 02:43:29.19 ]
- >>65
32ビットのポインタ。従来の16ビットポインタより長いという意味。 昔、16ビットと32ビットのポインタを混在して区別する必要があった時代のなごり。 今じゃ(少なくともWindowsやLinuxでは)サイズの異なるポインタが混在することはないから気にするな。
- 68 名前:デフォルトの名無しさん mailto:sage [2012/12/14(金) 02:51:37.77 ]
- >>67
far とは違うものなの?
- 69 名前:デフォルトの名無しさん mailto:sage [2012/12/14(金) 07:14:47.65 ]
- >>68
同じ
- 70 名前:デフォルトの名無しさん mailto:sage [2012/12/14(金) 08:47:17.38 ]
- >>68
違う。あっちはセグメント。
- 71 名前:デフォルトの名無しさん mailto:sage [2012/12/14(金) 09:02:03.02 ]
- どっちなの?
- 72 名前:デフォルトの名無しさん mailto:sage [2012/12/14(金) 09:12:48.84 ]
- msdn.microsoft.com/ja-jp/library/ff381404%28v=vs.85%29.aspx
P は "ポインター (pointer)"、LP は "ロング ポインター (long pointer)" の略として使われてきました。ロング ポインターはファー ポインター (far pointer) とも呼ばれますが、16 ビット Windows の名残で、現在のセグメント の外にあるメモリ範囲をアドレス指定するのに使用されていました。LP プレ フィックスは、16 ビットのコードを 32 ビット Windows に簡単に移植できる よう、予約されていました。現在ではこの区別は存在せず、単にポインターと 呼ばれています。
- 73 名前:デフォルトの名無しさん mailto:sage [2012/12/14(金) 09:14:13.28 ]
- >>71
far pointerはsegment16bit * 16 + offset16bitで20bit(1MB)のメモリ空間を表すもの。
- 74 名前: ◆QZaw55cn4c mailto:sage [2012/12/14(金) 09:40:06.25 ]
- >>73
しかしリアルモードではCPU 自身がセグメントを16ビット、オフセットを16ビットと持ち、12ビット分を重ねるのはCPU内 したがって記述レベル、たとえばアセンブリ言語で記述するときもセグメント、オフセットそれぞれに word=16bit の領域を準備することが多い 大概のC処理系でもそう。(sizeof(void far *) = 32)
- 75 名前:デフォルトの名無しさん mailto:sage [2012/12/14(金) 10:11:41.90 ]
- >>74
同じことしか言ってないように見える 最後4だし
- 76 名前:デフォルトの名無しさん mailto:sage [2012/12/15(土) 08:37:43.76 ]
- >>73
long pointer は FAR で定義されている FAR を far で定義するか空定義にするかは環境次第
- 77 名前:デフォルトの名無しさん mailto:sage [2012/12/15(土) 09:09:59.58 ]
- farなんていうのは16bit x86(16bit プロテクトモードを含む)の
化石だよね。だから>>74がリアルモードに限定しているのは間違い。 16bit x86の設計は8bitCPU8080のコードをポーティングしやすくする ためにアドレス空間も8080と同じ64KBを基本とした。 この範囲のプログラムはポインタも16bitで良かった。 だが時代が進みコードサイズが爆発的に増えた結果、オフセット だけでは不足してきたので、セグメントとペアで扱うことにした。 だがC言語的にはポインタはポインタでしかないので、ポインタが アドレス可能な範囲は実装依存だった。 でもオフセットのみのポインタとセグメントとペアのポインタは区別して 扱わないと開発上問題になる。そこで予約語farを定義して、farがつく ポインタはセグメントとペア、それ以外はオフセットのみと定義すること にした。 一般的にはfarのつくポインタだけをセグメントとペアのもの、つかない ポインタはオフセットのみという認識だが、あえて両者を区別しやすく するという意味でオフセットのみのポインタを「nearポインタ」と呼ぶ場合 もある。でも今となっては用済みのテクノロジでどうでもいいヨタ話。
- 78 名前:74 ◆QZaw55cn4c mailto:sage [2012/12/15(土) 09:12:44.43 ]
- >>77
概ね同意です。
- 79 名前:デフォルトの名無しさん mailto:sage [2012/12/15(土) 09:29:44.69 ]
- ヨタついでにもう1つ。
昔の16bit x86用Cコンパイラには「メモリモデル」なるものが存在した。 詳しい話は英文だけど ttp://www.c-jump.com/CIS77/ASM/Directives/D77_0030_models.htm このへんを参照。 んで、開発を始める前にプログラム規模をまず見積もり、メモリモデル のどれを採用するかを慎重に決める必要があった。なぜなら途中から メモリモデルを変更するとコード全体に波及する可能性があったから。 大抵のプログラムでは単一コードセグメント、単一データセグメントで 間に合うものだったが、後々の保険にということで複数セグメント前提 にしてポインタを全部farにする、なんていう「大は小を兼ねる」判断も 行われていた。
- 80 名前:デフォルトの名無しさん mailto:sage [2012/12/15(土) 09:47:22.53 ]
- MS-DOS陣営と違い意外に知られていないが、Mac-OSも680x0の時代は
32KBのコードリソースに入るサイズで切り分ける必要があった。 コードリソースと言う制約自体はMac-OSをベースにしていたPalmOSにも受け継がれた。
- 81 名前:デフォルトの名無しさん mailto:sage [2012/12/15(土) 09:51:36.83 ]
- 32KBのコードリソースっていうのはおそらくMC680x0における
ショートジャンプ(PC相対とかレジスタ相対ジャンプ)の範囲で おさめるための策だと思われる。 時代背景から考えて現実的とは言えるけど、単なるウィンドウ システム側の制約なだけ。MC680x0はリニアなアドレス空間で 16MBまでアクセスできた。
- 82 名前:デフォルトの名無しさん mailto:sage [2012/12/15(土) 10:41:58.36 ]
- LPは16-bit時代の遺産だからな
farポインタの存在する環境であればfarポインタになるのだが 32-bit環境以上なら普通のポインタと同じ
- 83 名前:デフォルトの名無しさん mailto:sage [2012/12/15(土) 11:26:29.81 ]
- コードリソースの32kBというサイズはPC相対アドレッシングの制約からきたものかも
知れないが、セグメント間はA5相対JSRでアクセスするようコンパイラが判断するから、 関数ポインタを使いたいような場面でもない限りプログラマが意識する必要はなかったな。
- 84 名前:デフォルトの名無しさん mailto:sage [2012/12/15(土) 21:29:59.09 ]
- 昔のコンパイラは
switchがショートジャンプなので 延々と処理を書くと 適当なとこにジャンプしてた
- 85 名前:デフォルトの名無しさん mailto:sage [2012/12/15(土) 21:35:23.60 ]
- >>84
「適当」って「適切」じゃなくて「いい加減」という意味ですか? 怖いですね。
- 86 名前:デフォルトの名無しさん mailto:sage [2012/12/15(土) 22:08:15.49 ]
- 昔のコンパイラと言うかそのコンパイラが手抜k
- 87 名前:デフォルトの名無しさん mailto:sage [2012/12/15(土) 22:40:53.85 ]
- 飛べねーぞごらぁ って言うのは見たことあるけど、変なとこに飛ぶコードを吐く奴は
さすがに見たことない。
- 88 名前:デフォルトの名無しさん [2012/12/16(日) 02:35:18.51 ]
- 質問させてください。
www.geocities.jp/ky_webid/cpp/language/007.html 上記のURL中に 「デストラクタですが、これはクラスのインスタンスが解体されるときに、 解体の直前で自動的に呼び出されます。 解体されるタイミングは、そのインスタンスのスコープを抜けるときです。 」 とあるのですが、 では IProduct* createFactory(Content* content) { switch( content->id ) { case PARTS_ID_A: return new ProductA( content ); default: return NULL; } } ProductA* product = createFactory(content); のようなコードはなぜ正常に動くのでしょうか?? createFactory内でnewしたProductAはすぐreturnされてスコープを抜けてしまうので その時点でデストラクトされ、 productに代入されるポインタはすでに使えないものになっているのではないのでしょうか? 理屈がよくわからないのですが、教えて頂けると嬉しいです。
- 89 名前:デフォルトの名無しさん mailto:sage [2012/12/16(日) 02:53:01.82 ]
- newで作成したインスタンスはスコープを抜けても勝手にデストラクトされない
- 90 名前:74 ◆QZaw55cn4c mailto:sage [2012/12/16(日) 02:53:57.65 ]
- >>88
new で得たポインタはdeleteしない限り無効にはならない new で得たポインタは関数を超えても生き残り続ける new したものはdeleteせよ、という宗教もここからきているかと
- 91 名前:デフォルトの名無しさん mailto:sage [2012/12/16(日) 03:32:27.84 ]
- C#だとnewばっかで滅多に削除を明示しない
- 92 名前:デフォルトの名無しさん [2012/12/16(日) 03:36:33.83 ]
- なるほど!
ありがとうございますm(__)m
|

|