[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 05/14 14:02 / Filesize : 217 KB / Number-of Response : 865
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part71



1 名前:デフォルトの名無しさん [2009/07/18(土) 02:54:58 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part70
pc12.2ch.net/test/read.cgi/tech/1244942050/l50

321 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 07:05:25 ]
無名namespace内でのtypedefについてなんですが、以下のコードは正しいでしょうか?

#include <iostream>
namespace{
typedef unsigned long ulong;
typedef unsigned int uint;
typedef unsigned short ushort;
typedef unsigned char uchar;
}
ulong a() { return 1; }
uint b() { return 2; }
ushort c() { return 3; }
uchar d() { return 4; }
int main(int argc, char** argv)
{
a(); b(); c(); d();
return 0;
}

これをCygwinのg++ 3.4.4でコンパイルすると
error: `uint' does not name a type
error: `ushort' does not name a type
というエラーが出ます(ulong, ucharについては何もエラーが出ません)。
ただし、#include <iostream> の行をコメントアウトするか、関数 a(), b(), c(), d() を無名namespace内に入れると
コンパイルが通ります。

これはCygwinのg++がおかしいのか、それともコードに問題があるのか、どっちなんでしょうか?

322 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 08:11:30 ]
無名namespaceって

::ulong

で参照しなかったっけ。

323 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 08:19:57 ]
今の時代Cygwinでファーストコード通してる人が居るんだなぁと
ちょっと意外に感じた。

324 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 08:23:24 ]
>>322
それはグローバルnamespaceじゃないですか?

325 名前:phenix mailto:sage [2009/08/08(土) 09:45:36 ]
>>301
boost::spiritを使うと簡単

326 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 10:03:46 ]
>>322
それはグローバルだな。
無名は特に外部から参照は出来ない。
その翻訳単位内でのみ参照可能。

327 名前:314 mailto:sage [2009/08/08(土) 10:12:26 ]
>>315
日立SR8000の最適化コンパイラ
って言っても縁ないでしょ。

328 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 10:26:48 ]
>>327
確かに縁がなさ過ぎるw

329 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 13:46:31 ]
>>327
縁がないから言ってもしょうがないでしょって思ってんのかな



330 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 17:58:04 ]
return で返される値は
返り値
戻り値
など色々呼び名があると思いますが、
C++用語としてはどれが正しいでしょうか?

331 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 18:28:25 ]
>>321
gcc -E してみたら、 /usr/include/sys/types.h でグローバルに uint と ushort の typedef が
あった。どうもこいつらが影響してるみたい。

ちなみに、ソース先頭で #define _POSIX_SOURCE しとくとこれらの typedef が無くなるんで、
ふつうに通るようになる。

というわけで、問題を縮小していくと以下の3行で同じ問題が発生する。

typedef int I;
namespace{ typedef int I; }
I i;

> :3: error: `I' does not name a type
> :3: error: extra `;'

typedef に限らず、グローバルスコープと無名名前空間の中に同じ名前の宣言があると、
宣言自体は通るのに、その後で実際には宣言された名前が使えなくなるみたい。

gcc のバグっぽいけど、標準ではどうなるべきなんだろうか?
2つの宣言のどっちを使うのか曖昧だからエラーになってほしいところ。

332 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 18:31:18 ]
>>330
いちおう、 JIS 規格では「返却値」。
ほとんどの場合はどれでも通じるから、どれが正しいとも正しくないとも思わないけどね。

333 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 18:33:05 ]
>>332
返却値ですか。
ありがとうございました。

334 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 18:46:09 ]
>>331
検証サンクスです。グローバルnamespaceと無名namespaceで重複するとおかしくなるんですね。
どっちが優先されるべきなのか少し調べてみましたが、よくわかりませんでした。
というか、宣言の時点でエラーなり警告なり出して欲しいですね。

とりあえずtypedefについては無名namespace外でも使う場合はグローバルスコープに置くことにしようと思います。

335 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 18:51:42 ]
でも、仮にグローバルnamespaceが無名namespaceより優先されるとしたら
名前の重複が起こった場合、無名namespaceの方には外側からアクセスできなくなっちゃいますね。
とすると本来は無名namespaceが優先されるべきなのかな??

336 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 00:39:45 ]
An unnamed-namespace-definition behaves as if it were replaced by
namespace unique { /* empty body */ }
using namespace unique ;
namespace unique { namespace-body }

つまり

typedef int Integer;
namespace{
typedef long Integer;
Integer l; //OK:long
}

Integer i; //NG
::Integer i; //OK:int

グローバルと重複したとき無名名前空間外から参照する方法はない
無名名前空間内では無名名前空間側が優先

337 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 01:27:03 ]
MyClassは自作のクラスで、そのコピーコンストラクタは重いとします。

MyClass foo()
{
//とても重い処理
return 〇〇;
}
この関数を呼び出した側で返り値を長く使いたい(ただし変更はしない)場合、
const MyClass retval
=foo();
とするべきか、
const MyClass& retval
=foo();
とするべきか
どちらが望ましいでしょうか?
コンパイラによる「戻り値最適化」が行われないとすれば前者は後者より重いと推測されますが、
コンパイラによる「戻り値最適化」が行われるとすれば前者は後者より参照の解決が不要な分 速いのではと思っているのですが、この理解で正しいでしょうか?

338 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 01:38:44 ]
>>337
戻り値最適化を行うような、処理速度について配慮されたコンパイラであれば、
テンポラリを束縛した参照について「参照の解決」などという処理に時間をかけることは
無いだろう。

339 名前:314 mailto:sage [2009/08/09(日) 02:42:42 ]
>>329
ひねくれたやっちゃな。
コンパイラ個別の特徴じゃないしな。
if文があったらループの最適化をサボるってのは。
それを3項演算子で抜けられる可能性があるってのは一般論として知っておいて損はないだろ。
具体的なコンパイラの名前が必要な話か?



340 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 02:53:37 ]
縁がないだろって思ってるコンパイラでしか有効じゃない機能をわざわざ紹介する理由は確かに分からん

341 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 03:59:56 ]
一般論に対して例外の存在を補足しただけじゃねーの。

342 名前:337 mailto:sage [2009/08/09(日) 10:12:42 ]
>>338
ということは、最適化が出来るコンパイラなら
どちらも同じだろうと言うことですね。

ありがとうございました。

343 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:39:44 ]
struct B
を継承するときに、
class cD : B
struct sD : B
これら二つの違いは何でしょうか?

cDはBをprivate継承していて、sDはBをpublic継承しているだけだと
いう理解でよろしいでしょうか?

344 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:40:38 ]
はい

345 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:40:57 ]
>>343 はい。

346 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:41:38 ]
ごめん

347 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:48:53 ]
えっ?

348 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:49:51 ]
えっ?

349 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:50:17 ]
えっ?



350 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:51:36 ]
えっ?

351 名前:343 mailto:sage [2009/08/09(日) 15:53:36 ]
ありがとうございました。

352 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:54:23 ]
いえいえ、どういたしまして。

353 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 16:10:44 ]
numeric_limits - C++ Reference
ttp://www.cplusplus.com/reference/std/limits/numeric_limits/
ここを読んでみましたが、
staticメンバ関数の
min()
epsilon()
この二つの違いが分かりません。
std::numeric_limits<double>::min()
std::numeric_limits<double>::epsilon()
の例で違いを教えていただけませんでしょうか?

なお、私の環境
Windows XP SP2
g++ (TDM-1 mingw32) 4.4.0
では
std::numeric_limits<double>::min() = 2.22507e-308
std::numeric_limits<double>::epsilon() = 2.22045e-016
となりました。


354 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 16:20:14 ]
>>353
min() は浮動小数点で表現できる最小の数
epsilon() は「機械イプシロン」を調べていただければわかるが、数値 1.0 とそのとなりにある実数との差
この二つは異なる概念なんですね。

355 名前:353 mailto:sage [2009/08/09(日) 16:21:31 ]
>>354
理解出来ました。
ありがとうございます。


356 名前:デフォルトの名無しさん [2009/08/09(日) 16:26:04 ]
>>353
minというのは、その名の通り、double型で表現できる(絶対値が)最小の値。
epsilonというのは、double型で表現できる、「1の次の」値から1を引いた値。

詳しくはIEEE754をよく読んで欲しいんだけど、要するにdouble型で表現できる値っていうのは
0付近では密で、絶対値が大きくなればなるほど疎になる性質がある。
例えばdouble型は0〜1の間には10億個ぐらいの表現できる値があるけど、
1〜2の間には800万個ぐらいしかない。

357 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 16:42:12 ]
みなさんありがとうございます。
申し訳ないのですが、

quiet_NaN()
Representation of quiet (non-signaling) "Not-a-Number", if available.
signaling_NaN()
Representation of signaling "Not-a-Number", if available.

この二つの違いも教えていただけますでしょうか。
前者が「静かな」というのが今ひとつ分かりません。

358 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 17:06:50 ]
>>357
一般的に、NaNというのはなんかエラーな感じの数のこと。
NaN+普通の数とか、普通の数÷NaNとか、とにかくNaNがどっかに含まれる演算を行なったとき、
・Quiet NaNを使ったときは、演算結果としてNaNを返す
・Signaling NaNを使ったときは、浮動小数点例外が発生する(0除算を行った時みたいに、プログラムの実行が停止する)

359 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 17:11:27 ]
多分だけど計算中にNaNが現れたときsignalを発生するかしないかじゃないかな?



360 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 20:46:22 ]
プログラム技術2ch掲示板のC++のスレ見ても、dynamic_cast演算子を使ったソース
がほとんど見掛けないな。皆そんなに使わないのかいな。大変な努力をして、
C++を学習したのに、それを使う機会が無いって、物足りないな、困ったもんだ。

361 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 20:49:16 ]
ダウンキャストかクロスキャストの時しか使わないじゃん

普通は仮想関数だけで十分

362 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 21:27:55 ]
>>360
goto と似たようなもんだ。使わないで済むならそれでいい。

363 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 21:31:35 ]
C++には多用しちゃいけない機能もあるからな
dynamic_castやtypeidもそうだし、あと例外指定とか

364 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 21:39:06 ]
>>363
mutable もだな。
reinterpret_cast 級の危険機能だと思う。

365 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 21:53:38 ]
使い方を間違えなければmutableは非常に役立つよ。

366 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 21:54:10 ]
いざという時に、せめて可能な限り安全にわかりやすく
ダーティーなやり口に手を染めるためのもの、という感じかな。

漫画によくある場面で喩えるなら、主人公が出発前に
「できればこれを使わずに済ませたいものだが・・・」
とか言いながら見つめてる武器みたいな。

367 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 21:55:31 ]
それ絶対使うじゃんw

368 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 21:55:41 ]
もうCでいいじゃん。

369 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 21:58:44 ]
>>367
この手の場面に相当するような「デカい仕事」では、実際結構な確率で
いま出ているような物を使うことになると思う。



370 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 22:02:12 ]
危険な機能を使わないためと言って変な黒魔術で無理矢理回避する方がよっぽど危険だしな

371 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 22:25:27 ]
Windowsでプログラムしていると
reinterpret_cast と dynamic_cast のオンパレードですよ^^

372 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 22:30:33 ]
>>371
キャストが必要になるのはわかるが、オンパレードはおかしいだろ。
同じ意味のキャストはてきとうにラップしろよ。

373 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 22:39:44 ]
ダウンキャストの意味わかってるのか?
存在しないメンバにアクセスして鼻から悪魔が出るのを承知で
使わないといけないんだぞ

374 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 22:43:35 ]
HWND(構造体へのポインタ)をCWndクラスにキャストさせたり、Windowsプログラミングは楽しいなぁ^^

375 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:12:24 ]
C++やりたての頃はこういう鼻から悪魔の意味もわからなかった

#include <iostream>

class Base {
int i;
public:
virtual void print() const {
std::cout << "Base" << std::endl;
}
};

class Derived : public Base {
public:
void print() const {
std::cout << "Derived" << std::endl;
}
};

int main()
{
Base *p;

p = dynamic_cast<Derived*>(new Base);

p->print(); // ouch!
}

376 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:17:31 ]
>>375
これはどの辺が鼻から悪魔?


377 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:18:56 ]
>>376
BaseにはDerived::print()がない

実行してみればわかるが正しく動かない

378 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:20:46 ]
>>376
dynamic_cast<Derived*>(new Base) この結果がヌルポインタになる。
その後の p-> でヌルポインタをデリファレンスして未定義動作。

379 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:21:39 ]
>>377 えっ?



380 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:25:38 ]
ごめんこういう場合に使うんだったね

#include <iostream>

class Base {
int i;
public:
virtual void print() const {
std::cout << "Base" << std::endl;
}
};

class Derived : public Base {
public:
void print() const {
std::cout << "Derived" << std::endl;
}
};

int main()
{
Base* p;

p = dynamic_cast<Base*>(new Derived);

if (!p)
std::cout << "dynamic_cast failed." << std::endl;

p->print(); // ouch!
}

381 名前:376 mailto:sage [2009/08/09(日) 23:27:43 ]
すみません
>>377

>>378
はどちらが正しいですか?

382 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:29:07 ]
>>381
>>378が正しい
ダウンキャストはポインタが正しい本体を指している時にのみ成功する

383 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:37:32 ]
>>380
これは何でouch!なの?

384 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:38:21 ]
>>380
いや、 Derived* → Base* は暗黙変換で通るから、 dynamic_cast の出番じゃない。

しかも、せっかく dynamic_cast の結果にチェックを入れたのにメッセージ表示の後に
結局 p-> してたらダメじゃん。

385 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:40:07 ]
わかんね
dynamic_castの正しい使い方知ってる人教えて

386 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:48:07 ]
DerivedがBaseとBase2を継承してるとして

・Derived* → Base* (アップキャスト)
常に成功し、Baseのポインタが得られる

・Base* → Derived* (ダウンキャスト)
DerivedのBase部分を指してるポインタだったら正しいDerivedのポインタが得られる
そうでなければヌルポインタが返ってくる

・Base* → Base2* (クロスキャスト)
DerivedのBase部分を指してるポインタだったら正しいBase2のポインタが得られる
そうでなければヌルポインタが返ってくる

・Base* → int* (無関係)
常にヌルポインタが返ってくる

参照の場合は、以上の「ポインタ」を「参照」、「*」を「&」、
「ヌルポインタが返ってくる」を「std::bad_cast例外が投げられる」に読み替えればいい

387 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 00:01:23 ]
よく見ろよw
>>375のは
p = dynamic_cast<Derived*>(new Base);
どこにもDerivedのインスタンスは生成されない
そりゃNULLが帰ってくるだろうって


388 名前:357 mailto:sage [2009/08/10(月) 00:18:37 ]
>>358-359
ありがとうございます。
NaNについてはもっと勉強してきます。


389 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 00:45:20 ]
>>369
そういう話ではなく
> 「できればこれを使わずに済ませたいものだが・・・」
といったらそれは使うフラグ



390 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 01:35:06 ]
>>389
まさにそういう話だと思うが。

391 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 02:23:56 ]
仕事のデカさは関係ないってことじゃないの?

392 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 12:33:39 ]
dynamic_castの意味を今まで勘違いしてたわ
ダウン・キャストしても安全に使用できるかどうかの判定なのね

393 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 15:40:20 ]
VS2008のVC++MFCで
ボタンクリックでピクチャーコントロールにjpgファイルの画像をサイズを変えて表示しています。

以下ソース
CImage img;
CImage img2;
HDC hdc;
img2.Create(80,60,24);
img.Load("jpgファイルのフルパス");
hdc = img2.GetDC();
SetStretchBltMode(hdc, HALFTONE);
img.Draw(hdc, 0, 0, 80, 60);
img2.ReleaseDC();
m_xcPic01.SetBitmap( (HBITMAP)img2 );
img.Destroy();
img2.Detach();
img2.Destroy();

jpgファイルが変わる毎に、画面上の画像も切り替えたいので
上の処理を呼び出して、画面を切り替えてます。
しばらく動かしていたところで気付いたのですが、
メモリの使用量がかなり多くなっていました・・・
ファイルロード側のDestroyやリサイズ後側のDetach、Destroyだけでは解放してくれないのでしょうか?
わかる方、または参考になるサイトやスレをご存知の方、よろしくお願いします。

394 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 15:45:28 ]
Detachしてしまったビットマップは削除されないのでは

395 名前:デフォルトの名無しさん [2009/08/10(月) 15:48:42 ]
ヘッダーに変数を定義することって出来たんでしたっけ?
いや、さっき書いてみたら出来たんで、ちょっとびっくりしたんですが。
インクルードガードしてないとエラーが出るってだけなのかな。Cではどうなんでしょう。
まあ、作法としてはインクルードガードしててもやっちゃダメなのかもしれないですけど。ですよね?



396 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 15:54:56 ]
本当ならリンカが多重定義のエラーを吐くはずだが、デフォルトでは吐かない奴もいる

397 名前:393 mailto:sage [2009/08/10(月) 15:58:12 ]
>>394
レスありがとうございます
Detach後にDestroyすると、メモリ上に残る・・・
つまり、リサイズ後用のimg2がどんどん溜まっている状態
ってことでしょうか?

ためしにimg2.Detach();をコメントアウトして動作させると、
別ウィンドウの後ろに隠れると画像が消えると言う症状がでました。
私、根本的に作り方を間違えているのかも・・・

398 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 16:18:59 ]
>>397
MFCスレでやってくれ

399 名前:393 mailto:sage [2009/08/10(月) 16:28:29 ]
>>398
MFC相談室の方に移動させていただきます。
スレ汚しすみませんでした。



400 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 16:45:42 ]
>>395
ヘッダだからできない事というのはないよ
やるべきじゃないことは、ある。

401 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 17:42:52 ]
>>400
>ヘッダだからできない事というのはないよ

へー、そうなんですか。
逆に、ソースだとできないことってのはありますよね?
テンプレートの定義とか。


402 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:00:51 ]
>>401
.hも.cppもC++の上では本質的には変わりないんだよ。
テンプレートの定義だって、別に.cppの上でやったっていい。
その定義が他の.cppから見えるかどうかは別問題だがな。

403 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:06:33 ]
>>401
だからできないことはないって。
逆に聞くが、ヘッダとソースってどうやって区別してんの?

404 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:08:23 ]
定義そのまま他の.cppに丸ごとコピペすればいいわけだが、
後々修正する際に全部直して回るのが面倒だからそういうことはやらないだけだ

405 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:09:46 ]
#include "header.cpp"
この場合、header.cpp はヘッダなのかソースなのか

406 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:38:26 ]
>>405
いわゆるクソコードってやつだよ。

407 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:46:46 ]
オブジェクト指向について質問なんだけど。

クラスAのインスタンスをクラスBで作り
クラスBのメソッドからクラスAのprivateにあるメンバ変数をゲッターセッターを使って弄る(クラスBのメンバ変数にも同期させる)。
そして、又クラスCのメソッドからクラスBにあるメンバ変数を参照して、判定なりをする。

そういう風に包含を重ねて行くのがオブジェクト指向なの?
C++をやって間もないんだけど、俺のプログラムはこんな感じなんだ。
良いのか悪いのか分からない、アドバイスお願い

408 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:48:16 ]
>>405
学生の時にバイトしていた会社のコードにそういうのがあった
日本のロケットがクソ高くて落ちるわけだ、と思った

409 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:54:57 ]
クソコードでバグを入れて、
そのバグを取るのが仕事ですから
それでいいんです。



410 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:56:03 ]
>>407
俺はメソッドとかC++標準にない用語を使われても起こらない。
しかし
>>クラスAのインスタンスをクラスBで作り
これはどういう意味だい?

411 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:58:28 ]
>>410
えっと
クラスBのprivate領域に、クラスAの実体を包含するって意味で書いたつもりだった

412 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 19:03:01 ]
>>406
クソかどうかは関係ない。
できないことがあるのかどうかが論点であり、やるべきではないことはまた別の話

413 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 19:44:54 ]
>>407
>又クラスCのメソッドからクラスBにあるメンバ変数を参照して、判定なりをする。
クラスBでクラスBのメンバ変数を参照して判定するようにして、外からメンバ変数を
見せないように隠蔽するのが、オブジェクト指向のカプセル化の基本かな。
セッタ/ゲッタはそれを破ってしまうから避ける様に設計するのがお勧め。

414 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 20:12:31 ]
雪駄とか下駄はオブジェクト指向じゃないと個人的には思う。
単一責任原則をはたすためにも、
メソッドは単に状態を書き換えるだけでは十分でないと思うから。


415 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 20:15:25 ]
セッタ/ゲッタは最終手段であり、
それに突入した瞬間からクソコードが始まると考えて
「一般には」さしつかえないくらい。


416 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 20:33:13 ]
C++ code - 95 lines - codepad
ttp://codepad.org/xR4PHa3G
この
std::numeric_limits
の明示的特殊化のコードは、
g++ 4.4.0では問題無くコンパイル・実行できました。
しかし
Microsoft Visual Studio 2008
Version 9.0.30729.1 SP
では
 error C2910: 'std::numeric_limits<MyTempl<MyInt>>' : 明示的な特殊化にすることはできません。
となり、コンパイルエラーとなってしまいます。
VCでも通す方法はありませんでしょうか?

Compiler Error C2910
ttp://msdn.microsoft.com/en-us/library/cx7k7hcf(VS.71).aspx
このあたりを読んでみましたが、よく分かりませんでした。
よろしくお願いします。



417 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 20:52:34 ]
stdの中を無理矢理いじくってるからかなあ
多分ヘッダーlimitsのどこかとぶつかってるよ

418 名前:416 mailto:sage [2009/08/10(月) 20:56:41 ]
std名前空間は
新しい物を追加したりすれば未定義の動作となる。
しかし関数・クラステンプレートの特殊化のみ
認められる。

ということは知っているのですが、
私のやり方がまずいのでしょうか。。。



419 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 20:57:14 ]
template <typename MyInt>
この行いらない



420 名前:416 mailto:sage [2009/08/10(月) 21:04:44 ]
すみません。
その辺確かにまずかったです。

C++ code - 95 lines - codepad
ttp://codepad.org/yovzUoIJ

これはどうでしょうか?
やりたいことは
template <typename hoge_t>
struct numeric_limits< MyTempl<hoge_t> > : numeric_limits< hoge_t >
の部分で現れていると思います。


421 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 21:07:00 ]
template <typename hoge_t>
の前の
template <>
が要らないんじゃ






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<217KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef