C/C++ Coding Style Thread

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C言語、C++言語のコーディングスタイルについて
クールに語るスレッドです
2デフォルトの名無しさん:04/10/02 12:32:32
特にこれから学習する人は、まだ独自の癖が付く前に
ゴラァされにくいコーディングスタイルを身につけましょう
3デフォルトの名無しさん:04/10/02 12:41:43
#include <2c.h>

main(){
return 0;
}
4デフォルトの名無しさん:04/10/02 12:44:41
int count, temp, data;
カンマの後にスペースを置き、空白の美を堪能する

if (foo > 10){
if, whileの直後もスペース推奨。関数との差別化を図る
5デフォルトの名無しさん:04/10/02 12:53:32
if (...)
{
}
else
{
}

と書く奴はキモイ
6デフォルトの名無しさん:04/10/02 12:58:03

>>4
int count, temp, data;
これは以下のようにするように推奨しているけど少数派かね。
int count= 0; //変数の意味を記述
int temp = 0;
int data = 0;
理由は、編集のし易と
int *a,b;とあったときにbをポインタと勘違いするミスを防ぐため。
7デフォルトの名無しさん:04/10/02 12:58:19
if (...) {

} else if (...) {

} else {

}

クール。グルービー
8デフォルトの名無しさん:04/10/02 13:26:35
if (...)
{ // ここにコメント
}
else
{ // ここにコメント
}
9デフォルトの名無しさん:04/10/02 13:32:21
>>6
私もそのようにすることを推奨している。
10デフォルトの名無しさん:04/10/02 13:32:50
>>6
ちなみに、ポインタは
int *a;
よりも
int* a;
を推奨している。
11デフォルトの名無しさん:04/10/02 13:36:22
>>10
変数宣言構文の意味を勉強してから出直しな。
12デフォルトの名無しさん:04/10/02 13:36:51
>>10
へ? なんで?
13デフォルトの名無しさん:04/10/02 13:37:03
>>11
出直すのは君の方ね。
14デフォルトの名無しさん:04/10/02 13:37:50
if( ){

}
else if( ){

}
else{

}

これ、知ってからずっと愛用。
カッコの対応関係が見やすい。
15デフォルトの名無しさん:04/10/02 13:38:05
まさか
int *a;
で、aの型は?って聞かれたらint型だなんて言わないよね。
16デフォルトの名無しさん:04/10/02 13:45:11
if () {
 hoge; // 詰まってて見にくい
}

if () {
       // 空いてて見にくい
 hoge();
}

if ()
{
 hoge(); // 安心
}
17デフォルトの名無しさん:04/10/02 13:48:44
>>10
そういうやつがいるから
int* a,b;
のbをポインタだと勘違いするやつが出てくるんだよ・・・
18デフォルトの名無しさん:04/10/02 13:52:41
>>17
だから、
int a, b, c;
という書き方はせず、
int a;
int b;
int c;
という風に書くというルールの下、
int* a;
int* b;
int* c;
という風に全て書けばaが何型か明記したことになる。
int *a;
int *b;
int *c;
という書き方はaが何型か明記していない。
ちなみに、このルールから言うと、
int* a,b;
という書き方は許されないから、間違うことはない。
19デフォルトの名無しさん:04/10/02 13:54:24
int*a
は a が int* 型だという意味ではなく
*a が int 型だということは理解してる?
20デフォルトの名無しさん:04/10/02 13:57:32
>>19
それは理解しているが、ポインタは用途が違う事が多いので、
扱いを変える必要がある。
ゆえに明記する。
21デフォルトの名無しさん:04/10/02 14:12:13
>>18
そのルールを守っているプロジェクト内ではそれで完結できるが、
そいつが別のルールの(一行で複数宣言を許す)プロジェクトに移ったとき、
17みたいのを見て勘違いしないか?
文法を理解してないそいつが120%悪いが、世の中出来るやつばかりじゃないからな・・・。
22デフォルトの名無しさん:04/10/02 14:16:31
>>21
もちろん、int* a;のような記述もコーディングルールの一部だから、
別のルールに従う必要があるときはそのルールに従うべきだよ。
int *a;と書かないといけないルールだったらそうすればよい。
23デフォルトの名無しさん:04/10/02 14:18:32
勘違いしててもコンパイラの型チェックで引っかかるんで気づくんじゃない?

引っかからないようなコンパイラ使ってるプロジェクトなら、それこそ「アホはコード触るな」で。
24デフォルトの名無しさん:04/10/02 14:19:49
だれかemacs用の2chスタイルを定義してください。
25デフォルトの名無しさん:04/10/02 14:22:41
>>16
でも、そんなお前でもループは

while(1){
}

とか 

for(;;){

}

だろ?
26デフォルトの名無しさん:04/10/02 14:27:48
if ( hoge ) {
;
} else {
;
}
27デフォルトの名無しさん:04/10/02 14:28:28
>>25
ときどきスペース空けてくれ
28デフォルトの名無しさん:04/10/02 14:29:30
っていうか、これに従え
http://www.sra.co.jp/wingnut/standards-j_toc.html#Top
29デフォルトの名無しさん:04/10/02 14:34:38
俺も昔は>>8派だったけど、コードコンプリート読んでからぶらさがり型に変えたよ。
30デフォルトの名無しさん:04/10/02 14:50:52
>>25
Java では if や while もそう書いてるが
C++ では全部>>16
31デフォルトの名無しさん:04/10/02 16:12:35
for (int i=1; i<10; i++)
1+2-3*4/5

  ↑
どっちが見やすいですか?
  ↓

for (int i = 1; i < 10; i++)
1 + 2 - 3 * 4 / 5
32デフォルトの名無しさん:04/10/02 16:19:08
>>31
for (int i=1; i<10; i++) 1+2-3*4/5 ;
33デフォルトの名無しさん:04/10/02 16:20:05
>>31
後者
34デフォルトの名無しさん:04/10/02 16:23:07
>>31
+ - の前後はスペース入れる
* / の前後は入れない。
35デフォルトの名無しさん:04/10/02 16:25:45
>>34
それいいな
36デフォルトの名無しさん:04/10/02 16:27:54
for ( int i = 1; i < 10; i ++ ) 1 + 2 - 3*4/5;
37デフォルトの名無しさん:04/10/02 16:30:45
f(void)
f()
どっち?
Cでは意味が異なるんだっけ。
C++限定で。
3810の主治医:04/10/02 16:32:58
10=18は重度な精神疾患です
以下処方箋

int* aでもかまわないのですが

int* a, b, c;
とか書かれるとその人はbやcもint*型と誤解しているのでは?と悪い印象をあたえます

素直に
int *a, b, c;
と書きなさい
39デフォルトの名無しさん:04/10/02 16:37:05
宣言数が少ないならそれでいいけど、その他変数とポインタ変数とは使い道が
違うので、結果的に分けて宣言することが多くなると思う。

ただポインタは全部分けて書くっていうのはちょっとわからん。
> http://pc5.2ch.net/test/read.cgi/tech/1095180315/971
40デフォルトの名無しさん:04/10/02 16:39:34
C++だと変数は必要になったタイミングで宣言できるから、
複数まとめて宣言する必要が無いんだよな。
41デフォルトの名無しさん:04/10/02 16:41:29
Cだってブロック作ればどこにだって宣言できるもん!
42デフォルトの名無しさん:04/10/02 16:42:12
>>38
全く直されるいわれはない。
これはスタイルの問題であり、開発者がコード見た時により見やすくするためのもの。
一行ごとに一つの変数を定義するというあらかじめ定義されたルールがある以上、
int *a,b,c;
なんていう書き方は許さないのだから、当然
int* a,b,c;
などとは書けない。
と何度も同じ事を書かないといけないのか?
int *a;なんていう書き方の方が全然素直ではない。
int型のポインタとint型を同じ行で定義するのは意味的に良くない。
43デフォルトの名無しさん:04/10/02 16:43:17
↑ヴァカ?
44デフォルトの名無しさん:04/10/02 16:45:23
>結果的に分けて宣言する
>int型のポインタとint型を同じ行で定義するのは意味的に良くない

まあ要するにこういうことだわな。
たまたま出来るからやりたければやればいいんじゃないのという。
45デフォルトの名無しさん:04/10/02 16:46:53
int a, b, c;

と宣言しておいて
aは使う段階になったら

*(int *)a

とする
これで完璧
46600:04/10/02 16:46:55
int *a = NULL;
*a がintなのにNULLで初期化というのも妙だしな。
int* a = NULL;
ならばしっくりくる。
47デフォルトの名無しさん:04/10/02 16:47:55
>>44
>>42>>39をいっしょにするなよ
>>39はポインタ変数の役割が他のIntと違うから別個に宣言すると言ってるだけ
>>42のほうは int と int* が別物だと考えている
48デフォルトの名無しさん:04/10/02 16:49:02
>>47
全く理解できない
それより、病院いけ?
49デフォルトの名無しさん:04/10/02 16:50:55
46=47
そんな理解でC/C++使わないでくれ
50600:04/10/02 16:51:52
>>49
>46=47
そんな理解でレスしないでくれ
51デフォルトの名無しさん:04/10/02 16:56:47
とりあえず >>43,48,49 はトリップつけてよ。
面倒だから。
52デフォルトの名無しさん:04/10/02 17:00:32
>>int* a;
えー?!
じゃ、関数ポインタは
int(*) a(void) = NULL;
って書くんですか?
53デフォルトの名無しさん:04/10/02 17:04:37
「変数名」と「他のもの」は離して書くよ。
関数ポインタならこうする

int (* fncptr)(void) = NULL;
54デフォルトの名無しさん:04/10/02 17:09:08
>>53
> 「変数名」と「他のもの」は離して書くよ。
じゃあ
int * a;
って書けばいいんじゃない?
55デフォルトの名無しさん:04/10/02 17:11:54
CとC++ならスタイルも変わってくると思う
Cなら
int *a, *b, *c;

C++なら使うときにひとつずつ
int* a = new int(hoge);
56デフォルトの名無しさん:04/10/02 17:18:18
>>50
で、君はどこスレの600?
57デフォルトの名無しさん:04/10/02 17:25:22
>>56
バカ、このスレの未来から来たんだよ。
58デフォルトの名無しさん:04/10/02 17:28:33
もしかしてドライもんのおともだちだったりするんだ…
59デフォルトの名無しさん:04/10/02 18:39:00
int a = val; を
int a; と a = val; を一緒にした書き方の延長線上で見てしまうと、

int *a = ptr; が
int *a; と *a = ptr; では、辻褄が合わなくなるので、

int* a = ptr; と書くようにすることで、
int* a; と a = ptr; が 最初のと同様の見方が出来るからじゃないの?

宣言時の *a と 代入時の *a では
括弧を省略できるため見た目同じでも
意味するところは異なるのが原因だと思うけど...

代入時は *(a) とでもする?
60デフォルトの名無しさん:04/10/02 18:51:41
int* a, b, c;
61デフォルトの名無しさん:04/10/02 18:59:02
>>59
>宣言時の *a と 代入時の *a では
>括弧を省略できるため見た目同じでも
>意味するところは異なるのが原因だと思うけど...

アフォ。
ではこれをどう説明するんだよ。

int a[] = {123, 345, 567};
62デフォルトの名無しさん:04/10/02 19:35:01
今時int *aなんて書いてるのはおっさんCプログラマでしょ。
C++の勉強のためにWebでいろんなコード見てきたけど、ほとんどint* aだよ。
参照もint &aなんて書いてるのかな?
63デフォルトの名無しさん:04/10/02 19:59:00
昔はint* aだったけど最近はint *aにするようにしてる
昔は単純なプログラムしか組めなかったからどっちでもよかったけど
constとか関数ポインタ、多重ポインタとか使うようになるとint *aのほうが都合がよくなる
64デフォルトの名無しさん:04/10/02 20:54:19
int * a;
最強。
65デフォルトの名無しさん:04/10/02 20:58:59
const int*と int const*って違いがよく分からん
66デフォルトの名無しさん:04/10/02 21:12:49
a[b]とb[a]の違いみたいなもんだ。
俺はint constだけど、世間一般ではconst intのほうが主流かな。
67デフォルトの名無しさん:04/10/02 21:31:14
constの位置が違うと全然違う意味だから
68デフォルトの名無しさん:04/10/02 21:34:13
>>67
( ・∀・)ニヤニヤ
69デフォルトの名無しさん:04/10/02 21:41:47
char *const
char const*
70デフォルトの名無しさん:04/10/02 21:42:38
最強は
char const * const
71デフォルトの名無しさん:04/10/02 21:44:38
最強はvoid const*だろ
72デフォルトの名無しさん:04/10/02 21:48:03
int *a,b,c;
決定
73デフォルトの名無しさん:04/10/02 22:59:11
>>70
> 最強は
> char const * const

だな。const char * const だと、どうしてよ?って思っちゃうし。
74デフォルトの名無しさん:04/10/03 01:04:37
突然ですが、三項演算子
(cond)
 ? foo
 : bar;
です。ハテナとコロンは揃えます。
いじょ。
75デフォルトの名無しさん:04/10/03 01:08:22
3項演算子って結局はif文と同じコンパイル結果になるから、一行で書かないなら
if文で書いた方がわかりやすいと思う。
3項演算子の利点は一行で最小限の文字数で書けるところだと思っているけれど。。
76デフォルトの名無しさん:04/10/03 01:13:19
俺もそう思う。
77デフォルトの名無しさん:04/10/03 01:24:24
if-else文と違って値を返すのが三項演算子の特徴なんじゃないの?
フロー制御だけならif-elseでいいけど。
78デフォルトの名無しさん:04/10/03 01:27:58
値を返すならなおさら一行で書かないとややこしくなる気がする…
7974:04/10/03 01:47:19
失礼。値は返します。
一列だと コロン が埋もれてしまい見た目に探すのがつらいです。
(異論あるんだろーな。。)
80デフォルトの名無しさん:04/10/03 01:59:37
>>74
> です。ハテナとコロンは揃えます。

演算子の記号が行先頭にくるように改行するのはGNUコーディングスタンダードの
条件文の書き方に通じるものがあるね。
if (condA
&& condB
&& condC)
ってやつ。
81デフォルトの名無しさん:04/10/03 08:02:51
>>42

> int型のポインタとint型を同じ行で定義する
間違い。


>>45
最悪。
82デフォルトの名無しさん:04/10/03 09:03:09
>>45
最高。
83デフォルトの名無しさん:04/10/03 09:17:54
>>77
禿同
値を使わないのなら三項演算子ではなく if-else を使うべし。
値を使う場合、if-else で書いた場合についても考えてみて、
複雑さが同程度だったら if-else を使う方が好ましい。
84デフォルトの名無しさん:04/10/03 09:31:48
代入する値をわける場合とか、
if だと分岐したとき代入し忘れがあって怖い。
?:なら確実に代入できるので極力?:にしてる。
長くなりそうなら関数に抜き出して?:でディスパッチする。

checkstyle で使うなと起こられるのがつらい。
85デフォルトの名無しさん:04/10/03 09:49:14
printf("....%c", .... eol?'\n':',');
みたいな使い方は?
86デフォルトの名無しさん:04/10/03 10:03:58
>>85
便利だよねえ。
87デフォルトの名無しさん:04/10/03 10:18:19
三項演算子使わないとreturnが増殖したりする所で使わないのはアフォだ
88デフォルトの名無しさん:04/10/03 10:20:01
引数が長いときは
rhs.assign(
    make_transform_iterator(lhs.begin(), thef)
   , make_transform_iterator(lhs.end() , thef));←最後の「);」これをここにいつも書いてんだけどどうよ?

vector< vector<int> >←「vector<int>>」のエラー対策の為に空けるスペースを先頭にも空けるて揃えるのがお気に入り。
89デフォルトの名無しさん:04/10/03 10:23:41
漏れなら
rhs.assign
(
  make_transform_iterator(lhs.begin(), thef),
  make_transform_iterator(lhs.end() , thef)
);
90デフォルトの名無しさん:04/10/03 10:24:40
でも引数2個くらいなら
rhs.assign(make_transform_iterator(lhs.begin(), thef),
  make_transform_iterator(lhs.end() , thef));
91デフォルトの名無しさん:04/10/03 10:41:10
ぶっちゃけ、*の位置や改行なんかどうでもいい。
変数・関数名やスコープの最小化のほうが重要。
9288:04/10/03 10:44:01
>>89
最初そう書こうかなと考えたこともあったんだけど
やたらと空白が目立って全体を眺めたら関数名との繋がりが希薄にかんじて・・・・却下したんですよね。

>>90
それでも悪くは無いんですけど、
make_の開始位置が上と下じゃ揃わないから途中から書くのをやめました。ここじゃズレてましたけど・・・

最後の「));」を「) );」こうしてもいいですけどなんかしっくりこないんですよね。
じゃ改行か?と言ったら>>89に言ったような美徳センスが付きまとっていまいちなんですよね。

やっぱり個人差なのかな。
93デフォルトの名無しさん:04/10/03 10:45:52
>>91
お前はナ。
94デフォルトの名無しさん:04/10/03 10:53:17
ttp://www.01-tec.com/document/code_design/vol01.html
ここを参考にしながら書くのがよろしいかと
95デフォルトの名無しさん:04/10/03 10:55:46
>>94に書いてあった
ブラケットでスコープわけって普通に使われてんの?

func()
{
 {
  int a, b;

 }

 {
  int c;

 }
}
96デフォルトの名無しさん:04/10/03 11:10:26
>>95
俺は普通に使ってるけど
97デフォルトの名無しさん:04/10/03 11:12:46
私もふつうに使っていますよ
98デフォルトの名無しさん:04/10/03 11:16:30
ほんとだ。スコープ分けてるYo。
96 名前:デフォルトの名無しさん[sage] 投稿日:04/10/03(日) 11:10:26
>>95
俺は普通に使ってるけど

97 名前:デフォルトの名無しさん[sage] 投稿日:04/10/03(日) 11:12:46
私もふつうに使っていますよ
99デフォルトの名無しさん:04/10/03 11:16:46
わたくしも使っております    (21歳 家事手伝い)
100デフォルトの名無しさん:04/10/03 11:17:22
また山崎か。
101デフォルトの名無しさん:04/10/03 11:18:43
>>95
普通だけど、私は使っていない
102デフォルトの名無しさん:04/10/03 12:39:59
クラシックCの場合
int get_hoge_fuge(args...)
みたいな関数の命名ですが、特にget,setで始まる場合は
アンダースコア _ 入れるかどうか迷うんですよね。
私はいちおう「入れる派」なんですが
ライブラリにあるやつとか ex.) getchar, gethostbyname, ...
のきなみ続けて次の単語書いちゃってるし、
外は雨降りだし、Javaの人はいいなぁって思う今日この頃。
103デフォルトの名無しさん:04/10/03 12:52:27
getHogeFugeって書けば解決
104デフォルトの名無しさん:04/10/03 12:56:21
Shift同時押しは微妙にタイプ速度を下げるので大文字禁止、アンダーバーも禁止。
括弧は仕方が無いがもっと打ちやすいところにほしい。
105デフォルトの名無しさん:04/10/03 12:59:47
>>104
シフトキーを使うのも億劫になる程の
タイピング量が必要になるコードの方を
まずは禁止すべきだな。
106デフォルトの名無しさん:04/10/03 13:34:56
>>103
ラクダ記法はJavaコーディングスタイルだったっけ。
107デフォルトの名無しさん:04/10/03 13:40:37
コメントの
/*
*
*/

/*
 *
 */
どっち?
アスタリスクが縦に揃うほうがいいなあ。
108デフォルトの名無しさん:04/10/03 13:48:33
>>107
CやC++ではDoxygenに対応したコメント記法をするのが良いと思います。
後でDoxygenにかけることも考慮して。
109107:04/10/03 13:57:08
>>108
doxygenって初めて知ったよ!
いいじゃん!
俺もこれからそうする!!
110デフォルトの名無しさん:04/10/03 14:24:57
>>107
/*
comment
*/

Doxygen なら

/*!
\brief comment
*/
111デフォルトの名無しさん:04/10/03 14:25:25
スペースが抜けてた
/*
  comment
*/

Doxygen なら

/*!
  \brief comment
*/
112デフォルトの名無しさん:04/10/03 14:29:41
doxygenはjavadocスタイルの方が宮須行きがする。
\や!より@の方が目に優しい気がするような気がしないでもないかもしないかな、という気がした気がした。
113デフォルトの名無しさん:04/10/03 15:00:36
自分も@派。
JISだと'¥'になるのが悪いのかな。
'\'なら'/'との組み合わせで見やすいのかも。
114デフォルトの名無しさん:04/10/03 15:06:34
日本以外の人たちって \ が \なんだよな・・・。
目立たないし、文字列のなかでエスケープに使われてると激しく見にくくないかな・・・。
115デフォルトの名無しさん:04/10/03 15:28:36
>>114
慣れるとそうでもない。TeXとか使っていると\の方が違和感があるかも
116デフォルトの名無しさん:04/10/04 01:52:56
visualC++もバックスラッシュだよね(?)
確か...?
117デフォルトの名無しさん:04/10/04 17:15:41
\よりもバックスラッシュのが好きだなあ。
特にパスの区切り文字としては見た目、\より直感的な気がします。
Win では \\ の代わりに / もパスの区切り文字として
使えるんですよね。タイプが楽だし気に入っているんだけど
ソースのポータビリティを考えたら、使わんほうがいいんでしょうね…。
118デフォルトの名無しさん:04/10/04 17:50:38
>>117
一部のAPI(PathXXX系)が対応してないから使わないほうが無難だね。
Perlとかだと /\r\n/\n/ とか読みにくくね?
119デフォルトの名無しさん:04/10/04 20:35:15
別に読みにくくないよ?
日本のユーザ以外は皆バックスラッシュなわけだし。
むしろ、¥に慣れた人が英語情報を見るとそんなとこでもひっかかったりして
余計にとっつきが悪くなるんじゃないかと変な心配してしまうんだけど。

Unicodeで文字コード世界統一のはずなのに、日本だけ世界と一部違うものが
Unicodeとされているというのもなんだか悲しいよう。
120デフォルトの名無しさん:04/10/04 21:11:37
為替レートとか外国で表示するとき\どうしてんだろう?
121デフォルトの名無しさん:04/10/04 21:25:59
大体の場合0xA5がYEN SIGNだから、
122デフォルトの名無しさん:04/10/04 22:07:37
今に至っては\の役割はもう無いね。
これからはバックスラッシュに変えていくべきだと思うんだけど。
123デフォルトの名無しさん:04/10/05 02:24:18
Unicode?
たんにフォントの問題だろ
124デフォルトの名無しさん:04/10/05 02:28:44
文字集合。
125デフォルトの名無しさん:04/10/05 04:33:16
0x5CがYEN SIGNとして使われてしまうのはフォントの問題では済まないよ。

そのように使われないならその問題なくて
「日本人はなぜかバックスラッシュが見たくもないほど嫌いらしい。
どれくらいかというとバックスラッシュの代わりに円記号を表示させるくらい
嫌いらしい。」という程度の話になるけど。
126デフォルトの名無しさん:04/10/05 05:53:06
アホですな。
127デフォルトの名無しさん:04/10/22 02:31:16
みなさん、キャストは、

static_cast とか、reinterpret_cast とか、使ってますか?

C++的に言えば、使った方がいいんだが、どう考えてもCキャストのほうが読みやすい。
128デフォルトの名無しさん:04/10/22 03:41:06
使ってはいる。けれども同意。
129デフォルトの名無しさん:04/10/23 02:08:15
>>127
Cスタイルキャストは禁止してる。
理由は以下のとおり。
・Cスタイルキャストは強力すぎる
・Cスタイルキャストは見つけにくすぎる
・Cスタイルキャストは dynamic_cast できない

ちなみに、どう考えたらCスタイルキャストのほうが読みやすいことになるのかわからない。
130デフォルトの名無しさん:04/10/23 02:47:22
書きにくいってのならわかるね。
字数多いし。むしろ書きにくいから(ry
131デフォルトの名無しさん:04/10/23 09:23:45
Cスタイルキャストに警告を出すコンパイラってあるかね?
132デフォルトの名無しさん:04/10/23 11:17:07
あるよ。
133デフォルトの名無しさん:04/10/26 23:47:46
dynamic_castをほとんど使ったことがない俺は
たぶん何か間違ってるんだと思う。
134デフォルトの名無しさん:04/10/26 23:54:04
>>133
そんなことないと思う。
C++ の危険な領域に入り込んでいない健全な姿だよ。
135デフォルトの名無しさん:04/10/27 01:16:55
キャストなんて使わないで済ますのが一番。
dynamic_cast の出番は、時間さえあれば設計を見直すべきところがほとんど。
136デフォルトの名無しさん:04/11/17 15:23:26
protected データ メンバを宣言してはいけない
------------------------------------------------------------
ルールの理由:
private ではなくprotected としてデータ メンバを宣言すると、
メンバ関数中にカプセル化できたはずのメンバが派生クラスから見えてしまいます。


//
// protected データ メンバを宣言してはいけない
//
class A
{
  protected:
  int i;   // 違反
};
137デフォルトの名無しさん:04/11/17 16:08:10
>>136
素人でつか?
138デフォルトの名無しさん:04/11/17 16:21:57
>>136
「俺様ルールの違反」とちゃんと書け。
139デフォルトの名無しさん:04/11/17 16:40:47
コンストラクタから直接グローバル データにアクセスしてはいけない
--------------------------------------------------------------------------------

ルールの理由:
異なるコンパイル単位中の静的オブジェクトの初期化順序は、
C++ の言語定義では定義されていません。
そのため、コンストラクタからグローバル データへのアクセスは、
未初期化オブジェクトからの読み取りになる場合があります。


//
// コンストラクタから直接グローバル データにアクセスしてはいけない
//

int a;
class A
{
public:
  A();
private:
  int b;
};
A::A()
{
  b = a; // 違反
}
140デフォルトの名無しさん:04/11/17 21:16:46
かわいく書く。

for(i=0; i<100; i++){  // 100回がんばる

}
141デフォルトの名無しさん:04/11/17 21:37:06
かわいくに反応して“がんばる”が…くそっ俺の脳みそがぁぁ




かわいいじゃねぇか
142デフォルトの名無しさん:04/11/17 22:25:44
>>129
const void *p;
const_cast<int *>(static_cast<const int *>(p));
こんなんだったらCスタイルキャストの方が読みやすいかもしれない
143デフォルトの名無しさん:04/11/17 22:31:40
>>129
画像演算とか。
一つの式中にキャストが10個くらい現れたりする。
C++キャストでは長すぎて意図が分からなくなってしまう。
const_castはさすがにCキャストで代用しようとは思わないが、
PODに対するreinterpret_castやstatic_castはCキャストのほうが分かりやすい時もある。
144デフォルトの名無しさん:04/11/18 00:54:49
>>142-143
カッコ悪いプログラムがカッコ悪いソースになる。それがいいんじゃねぇか。
145デフォルトの名無しさん:04/11/18 03:37:33
>>139
いずれにしても a の初期化し忘れ。
146デフォルトの名無しさん:04/11/18 10:06:12
>>145
aは0で初期化される
147デフォルトの名無しさん:04/11/19 23:20:36
コボラーと大してレベル変わらんなお前ら
148デフォルトの名無しさん:04/11/19 23:52:23
int *a, *b; // ポインタ
int a, b;

これ最強
149デフォルトの名無しさん:04/11/20 20:28:56
C++ の const Class & や Class* は必ず typedef してから使う。

typedef const Class & ClassRef;
typedef Class* ClassPtr;
150デフォルトの名無しさん:04/11/21 06:52:22
>>149
ウザ
151デフォルトの名無しさん:04/11/21 10:12:08
二重インクルードヘッダーは、
"__" + プロジェクト名+ファイル名
にする。

【例】
HelloWorld プログラムの Hello.h ファイルは、
#ifndef __HELLOWORLD_HELLO_H
#define __HELLOWORLD_HELLO_H
...
#endif
とする。
152デフォルトの名無しさん:04/11/21 10:33:02
何が言いたいんだ…?
文句を言いたいのか、上記のように統一しろと主張しようとしてるのかわからんぞ
153デフォルトの名無しさん:04/11/21 10:46:19
>>151
ISO/ANSI規格では識別子の初めに _ が2つ続く物はコンパイラ・ライブラリ関数のために予約されているので駄目だ。
154デフォルトの名無しさん:04/11/21 11:27:42
>>153
"_" がふたつだけじゃなくて、ひとつでも予約されてるんじゃなかったっけ?
(つまり "_" で始まる名前はすべて標準ライブラリ用に予約されてる)
155デフォルトの名無しさん:04/11/21 11:51:19
漏れのインクルードガードは、ファイル名 (ピリオドを '_' に
変換したもの) + '_' だな。大文字/小文字はそのまんまだ。

 #ifndef MotherHacker_h_
 #define MotherHacker_h_

ここで気になるのが #endif なんだけど

 a. #endif // !MotherHacker_h_ ( '!' あり )
 b. #endif // MotherHacker_h_ ( '!' なし )
 c. #endif  ( なんもなし )

てめーらはどれ派?
漏れは昔は c.,以前は b. だった。でも今は a. 派。
156デフォルトの名無しさん:04/11/21 12:10:00
漏れは
#ifndef MOTHER_HACKER_H__
#define MOTHER_HACKER_H__

#endif// MOTHER_HACKER_H__

最後の_が2つなのがミソ
157デフォルトの名無しさん:04/11/21 12:38:30
>>154
本当だ。
今まで'_'の次に英大文字か'_'の場合だけが予約かと思っていた
158158=157=153:04/11/21 12:41:55
>>156
インクルードガードのときだけ例外的にb派。
#ifdef HOGEに対しては#endif // defined HOGEとしている。
159デフォルトの名無しさん:04/11/22 00:07:48
漏れは
#endif // !defined( _suffix_hoge_h_included_ )
160デフォルトの名無しさん:04/11/22 02:18:33
漏れは//にスペース入れない
   #ifndef MotherHacker_h_
   #define MotherHacker_h_
   #endif//MotherHacker_h_
なぜって識別子の位置が揃うから
161デフォルトの名無しさん:04/11/22 03:21:50
>>160
> なぜって識別子の位置が揃うから
うーん、気持はわからなくはないけど。
#elseや#endifに条件式をコメントとして入れとくのは、そもそも#ifの位置が
遠く離れてて把握できなくても条件式をすぐに理解できるようにするためでしょ?
そんな状況なら桁の位置が揃ってるかどうかなんて、どうでもいいと思うんだけど。
桁揃えが気になるような距離なら、そもそも条件式をコメントに書かなくてもいいし。
162デフォルトの名無しさん:04/11/22 10:14:40
163デフォルトの名無しさん:04/11/23 17:04:27
>>156
残念だがそのミソは予約されている。
164デフォルトの名無しさん:04/11/23 20:52:14
【規約】
プリプロセッサ命令は #if や #ifdef の中ではインデントさせる。
ただし # は必ず行頭に配置せよ。

例:
#ifdef HOGE
# include <hoge.h>
# ifdef FOO
#  #include <foo.h>
#endif
#endif
165デフォルトの名無しさん:04/11/23 20:56:26
>>164 なんで?なんかいいことあるの?
166デフォルトの名無しさん:04/11/23 20:57:35
入れ子が複雑になっても、読みやすい、修正しやすい。
入れ子をベタで書くのはよくない作法だろ。
167デフォルトの名無しさん:04/11/23 21:07:49
>>164
↓こんなんも、#だけ行頭に動かすの?
{
 while(...)
 {
  if(...)
  {
  #if HOGE
   ...;
  #endif
   ...;
  }
 }
}
168デフォルトの名無しさん:04/11/23 23:12:29
1カラム目以外に'#'があるとディレクティブと見做さないコンパイラがあったなぁ。
169デフォルトの名無しさん:04/11/24 19:40:17
基本的に if 文は>>5のスタイルで書いているがキモいのか・・・?
>>7>>14も嫌いではない。
170デフォルトの名無しさん:04/11/24 20:01:33
俺は14の方がキモいと思う。
同じく普段は5を使っているが、行数制限があるときは7スタイルも使う。
171デフォルトの名無しさん:04/11/24 20:04:22
このあたりはもう好みの問題でしょ。
個人的には>>14で書いてる。
>>5は、if の次に { だけの行がくるのがスカスカな感じでちょっといや。
172デフォルトの名無しさん:04/11/24 22:49:23
>>5 のスタイルの方がネストしたときの括弧の対応がわかりやすいと思うけどなぁ・・・

Windows 2000 のコードとか、FFFTP なんかは、 >>5 のスタイルで書かれてるね

まぁ、>>14 の書き方でも絶対に間違わないって言う地震があるのならいいんじゃないの

好みの問題
173デフォルトの名無しさん:04/11/24 22:51:59
私は>>7だな。
174デフォルトの名無しさん:04/11/25 13:50:53
つまり>>5のやつが言葉を間違えたんだろ。キモイは言いすぎ。好みの問題でしかない。
俺は>>14だが。
175デフォルトの名無しさん:04/11/25 20:13:12
>>14はなんだか中途半端な気がして、気持ち悪い。
なんか、切れそうで切れない生首のような、ほとんど首無しニックのような、気持ち悪さ。
176デフォルトの名無しさん:04/11/26 14:38:36
>>5使ってるよ。
177デフォルトの名無しさん:04/11/26 14:52:04
>5も好きじゃないんだが、
if (...)
 {
  ...;
 }
else
 {
  ...;
 }
って書かれるとどうもね。
#2段も下げるなって感じ?
178デフォルトの名無しさん:04/11/26 14:59:41
>>177
GNUスタイルですな。慣れればいいのかもしれないが、


俺は>>7でタブは8カラム。以前までタブでなくスペース派
だったんだが、今はまあいいかなと思えるようになった。
タブを行頭にしか使わなければ環境依存も(ある程度)
許容できるし。
179デフォルトの名無しさん:04/11/26 17:58:51
TABを使ったソースを別の環境で見たときに見た目が違うということがあっても
別に大した問題ではないだろう。
TABをスペースに置き換えるなんてエディタの機能で一発だったりするでしょ。
手間は大したこと無いから全然気にしないで、自分の環境で一番やりやすいやりかた
ですれば良いと思うよ。
180デフォルトの名無しさん:04/11/29 23:35:29
CodeWizard とかの静的解析ツール使えばいいんじゃないの
181デフォルトの名無しさん:04/11/30 01:45:33
流儀違うとCVSに落としたりするとき困るよな
全部2TAB→スペース変換してコミット
182デフォルトの名無しさん:04/12/02 00:19:30
>>45

*(int *)&a

じゃないのか?
183デフォルトの名無しさん:04/12/02 08:39:54
>>182
それじゃ a と同じになっちゃうだろ。
184デフォルトの名無しさん:04/12/02 18:12:23
長いprintfのカンマは左側に書く。

printf(
"compless : %s\n"
"code : %xh\n"
"codesize : %xh\n"
"entry offset : %xh\n"
"begin offset : %xh\n"
"end offset : %xh\n"
,isompless?"true":"false"
,code
,codesize
,main_entry
,begin_entry
,end_entry
);
185デフォルトの名無しさん:04/12/02 18:56:09
printfに限らず俺はインデントした上で右側にカンマ付けるけどな。
こうしている人の方が多いと思っているし。
186デフォルトの名無しさん:04/12/03 18:44:42
継続行はCodeCompleteに倣って演算子を右に書く。

全体はApacheスタイルに近い。
タブは4カラムで、スペースじゃないけど。
187デフォルトの名無しさん:04/12/08 09:12:31
ここは重複スレです

Cのマナーいろいろ
http://pc5.2ch.net/test/read.cgi/tech/1029584140/
188デフォルトの名無しさん:04/12/08 09:17:24
>>187
仕切り厨ウザイ
189デフォルトの名無しさん:04/12/08 09:31:06
こいつぼけ
190デフォルトの名無しさん:04/12/08 10:21:59
>>189
おまえがな。
191デフォルトの名無しさん:04/12/13 04:22:13
voidで返す関数はreturn書く?
192デフォルトの名無しさん:04/12/13 04:35:34
voidで返す?
193デフォルトの名無しさん:04/12/13 04:49:17
C++ならreturn void;
194デフォルトの名無しさん:04/12/13 04:50:45
返り値がvoidならreturnは省略した方がコードが短くなって読みやすくなると思うんだけど。
195デフォルトの名無しさん:04/12/13 05:17:00
そもそも値を返さないのがvoid
196デフォルトの名無しさん:04/12/13 22:29:28
>>191
条件 return の場合以外書かない。
197デフォルトの名無しさん:04/12/16 23:24:30
>>191
関数であると明確にするために、書いておく。
198デフォルトの名無しさん:04/12/16 23:25:42
関数以外のものがあるわけじゃないのに…
199デフォルトの名無しさん:04/12/16 23:47:17
pascalの癖が抜けないんだろう
200197:04/12/17 03:16:35
>>199
悪いが、Pascalなんぞやったことないんだが。
201デフォルトの名無しさん:04/12/17 03:24:20
>>200
無学を自慢するな
202デフォルトの名無しさん:04/12/17 03:25:12
じゃ、VBか。
203デフォルトの名無しさん:04/12/17 03:26:55
そもそも返り値がvoidの関数を作る事自体が間違えなんじゃないの?
処理は全部副作用だけなんて…
204197:04/12/17 03:33:40
>>201
どこがどう自慢だったんだね?
むしろ謝っているとしか言えないが。
205デフォルトの名無しさん:04/12/17 03:38:25
>>204
石黒級の馬鹿だな。まず日本語をなんとかしろよ。
206デフォルトの名無しさん:04/12/17 03:46:05
>>205
何か日本語の使い方でおかしいところなんてあったか?
お前こそなんとかして反論しようとして
無理やり絞り出したようにしか見えんな。
207デフォルトの名無しさん:04/12/17 03:57:40
もまいらもちつけ
208デフォルトの名無しさん:04/12/17 04:03:40
低級な言い合いは止めてくれ
209デフォルトの名無しさん:04/12/17 04:16:36
アセンブリはやっておくべきだよ
210デフォルトの名無しさん:04/12/17 04:21:58
>>209
うまい
211デフォルトの名無しさん:04/12/17 05:33:41
mov ax, 4c00h
int 21h
212デフォルトの名無しさん:04/12/17 05:42:25
>>206
それ本気で言ってる?
もう必死すぎだなw
213デフォルトの名無しさん:04/12/17 07:24:00
>>212
あまり強く言いすぎると、釣りってことにして逃げちゃって興醒めだよ。
真綿で首を絞めるみたいにイジらないと。
214デフォルトの名無しさん:04/12/17 09:20:59
>>213
多分それ以前に>>212が釣りなんでは
215デフォルトの名無しさん:04/12/17 09:21:21
そういうことは真綿で首を絞めてから言ってくれ。
216デフォルトの名無しさん:04/12/17 09:38:18
日本語って言うならおれは>>203が気になるな。他でも見るが
「間違い」だろ?
217デフォルトの名無しさん:04/12/17 12:06:40
>>216
本人だが同意
218デフォルトの名無しさん:04/12/17 12:22:36
>>217
単純にtypo?
219デフォルトの名無しさん:04/12/17 19:49:43
「Pascal やったことないと無学」ってことにしたい >>201
キチガイだったということで。
220!=201:04/12/17 22:41:14
そりゃ無学だろ
221デフォルトの名無しさん:04/12/17 23:06:33
http://www.page.sannet.ne.jp/mtoga/lang/c/text/bih-c_tf.txt
たまたま見つけた最悪なコードの見本。
222デフォルトの名無しさん:04/12/17 23:09:32
アセンブラやったことないよ
パスカルやったことないよ
スクイークやったことないよ
シーシャープやったことないよ
セックルやったことないよ

一番ダメなプログラマーはどれ?
223& ◆QWv3R1XL8M :04/12/17 23:11:52
15日C++とSTLとテンプレ使えるようになる苦行教えてくれ。
耐えて、使えるようになりたい。
224デフォルトの名無しさん:04/12/17 23:12:25
>>223
AC++というつまらない本を熟読する
225デフォルトの名無しさん:04/12/17 23:24:40
>>222
パスカルやったことないよ
226デフォルトの名無しさん:04/12/17 23:38:50
Ruby知らないというのは致命的・
227デフォルトの名無しさん:04/12/17 23:43:08
>>224
MC++ はどう?
228デフォルトの名無しさん:04/12/18 01:10:52
pascalが何の単位か分からない奴は無学
229デフォルトの名無しさん:04/12/18 01:32:21
ヘクトパスカル?
230デフォルトの名無しさん:04/12/18 01:35:44
>>229
メガバイトって言っているのと同じだよ
231874:04/12/18 15:54:20
>#define unint unsigned int /* 型名の 別名を定義します。 */
>#define unlong unsigned long

ワロタ
232デフォルトの名無しさん:04/12/18 16:16:00
>>221>>231のサイトって、中学生に教えている積もりなのか?
余りに痛々しいんだが。
233デフォルトの名無しさん:04/12/21 00:22:46
234デフォルトの名無しさん:04/12/21 00:47:17
switch〜caseのインデントってどうしてる?
俺は

switch(n){
case 0:
  cout << "0" << endl;
  break;
default:
  break;
}

caseとswitchのインデントレベルは同じにしてるけど。
235デフォルトの名無しさん:04/12/21 02:55:19
>>234
タブを4として、スペース2個を入れる。
236デフォルトの名無しさん:04/12/21 04:57:49
>>235
K&Rと同じにしてる。
つまり同じレベル。
237デフォルトの名無しさん:04/12/21 06:01:18
同じにしてる。
基本的にインデントが一気に2段下がることが無いように頑張っている
238デフォルトの名無しさん:04/12/22 00:36:28
俺は>>235と同じだな。
239デフォルトの名無しさん:04/12/24 15:14:41
switch(n)
{
case 0:
  cout << "0" << endl;
break;
default:
break;
}
240デフォルトの名無しさん:04/12/24 17:47:57
俺はこう。
switch (n) {
case FOO:
  foo();
  break;

case BAR: {
  int x = bar(n);
  baz(x);
  break;
}

default:
  /* NEVER REACH HERE */
  abort();
}
241デフォルトの名無しさん:04/12/24 18:45:23
switch (n)
{
case FOO:
  foo();
  break;

case BAR
  {
    int x = bar(n);
    baz(x);
    break;
  }
}
俺のスタイル。
242デフォルトの名無しさん:04/12/25 13:37:04
switch (n)
{
case FOO:
  foo();
  break;

case BAR
  {int x = bar(n);
  baz(x);
  break;
  }
}
俺のスタイル。
243241:04/12/25 18:46:13
そう言えばswitchとclassのインデントの付け方は同じになっている。
244デフォルトの名無しさん:04/12/25 23:17:43
>>243
それがpublic、protected、privateのことなら俺も同じ。
245デフォルトの名無しさん:05/01/30 14:52:51
b
246デフォルトの名無しさん:05/02/03 22:24:32
switch (...) {
 case 1 : {
  foo();
 } break;
 case 2 :
 case 3 :
 case 4 : {
  foo();
 } break;
 case 5 :
  foo();
  // Fall Through
 default : {
  foo();
 } break;
}
俺のスタイル。
switchは滅多に使わんがなー
247デフォルトの名無しさん:05/02/04 20:26:43
↑馬鹿発見
248デフォルトの名無しさん:05/02/04 20:31:31
>>246
そうかそうか、それは素晴らしい書き方だな。よーくわかったぞ。
249デフォルトの名無しさん:05/02/27 15:11:54
>>247-248
必死だなwwww
250デフォルトの名無しさん:05/03/02 12:56:35
switch (n)
{
case FOO:
  foo();
  break;
case BAR
{
  int x = bar(n);
  baz(x);
}
  break;
}
251デフォルトの名無しさん:05/03/05 03:57:03
>>250
おお、なんと感動的な書き方なんだ。正直、俺は感動した。
252デフォルトの名無しさん:05/03/05 19:25:32
俺スタイルは>241に酷似。

switch (n)
{
case FOO:
  foo();
  break;

case BAR:
  // baz(int&) の引数のために実体となる変数が必要 ← みたいに、なんかコメントしとく
  {
    int x = bar(n);
    baz(x);
  }
  break;
}
253デフォルトの名無しさん:05/03/06 00:00:51
漏れは>>250に似てるけどこうかな
switch(n)
{
case FOO:
{
  foo();
  break;
}
case BAR:
{
  int x = bar(n);
  baz(x);
  break;
}
  
}
254デフォルトの名無しさん:05/03/06 03:32:58
禿は禿本で
case FOO:
    foo();
    break;
case BAR: {
    int x;
    bar();
    break;
}
こう書いてたっけ?
個人的には{で改行しない方が若干見やすいかなぁ
255デフォルトの名無しさん:05/03/08 00:16:03
いまやC++は(boostの)シリアライズを持っているので
メンバ変数にhoge_と尻尾に_を付けるのではなく
一時変数に_を付ける
spiritのサンプルにあった。
メンバに堂々と何もつけないのはなかなか気持ちがよいな
256デフォルトの名無しさん:05/03/08 00:45:46
>>255
> 一時変数に_を付ける

激しく受け入れ難い。
257デフォルトの名無しさん:05/03/08 19:00:08
てかメンバもローカルも_無しでよくね?
258デフォルトの名無しさん:05/03/08 20:56:40
↑禿同
this->が付いてたらメンバ。
259デフォルトの名無しさん:05/03/09 06:37:01
>>258
技術的なメリット、デメリットでは this-> が最強なんだよな。
・クラステンプレートのコードでは付けないと恐ろしい罠に嵌りかねない。
・bool Is〜() な関数を自分で呼ぶときも this->Is〜() が読みやすい。
・無節操にメンバに触りまくって最適化を台無しにする糞コードが減る。

問題は、一般性が皆無なことだな。

this-> と等価な . (単項ドット演算子)を作って、
省略不可にすれば、・・・どうなっていただろう?
260デフォルトの名無しさん:05/03/09 13:37:06
this必須でもいいけど、初期化リストのとこではthisつけられないよね?確か。
261デフォルトの名無しさん:05/03/09 13:47:48
初期化リストならメンバか継承元であることが自明だから医院で内科医?
262デフォルトの名無しさん:05/03/09 18:57:55
class AAA {
  int size;
public:
  AAA (int size)
    : size(size) // この行
  {}
};

こんなコードが通るのが微妙に気持ち悪かったり。
かといってメンバ名と仮引数名にうまく別の名前をつけられる妙案がない……。
this->size(size) って書ければ多少気持ち悪さも減るかと思ったの。そんだけ。
263デフォルトの名無しさん:05/03/09 19:03:41
>259の案を採用して、
class AAA {
int size;
public:
AAA(int size) : .size(size) {}
};
はどう?
これも気持ち悪い?
264デフォルトの名無しさん:05/03/09 19:04:38
> this-> と等価な . (単項ドット演算子)を作って、
> 省略不可にすれば、・・・どうなっていただろう?

視認性が悪いものを必須にするのはちょっとなぁ。
いっそPythonよろしく、メンバ(変数|関数)の参照はthis必須の方がまだまし。

それに、visitor.visit(this)があるから、thisキーワードを
なくせるわけじゃなし、見づらい構文糖衣の意味しかないと思われ。
265デフォルトの名無しさん:05/03/09 19:47:29
this必須がコンパイラで強制できればそれでもいいんだけど、
そうじゃないならm_プレフィクスの方がいいな。
266デフォルトの名無しさん:05/03/10 00:49:11
流れ斬り!

クラス内のメンバ関数の実体を書く順番は
a)宣言と同じ順に
b)重要なもの、呼ばれる頻度などの順に書き、宣言と順番が違う

c)宣言から b) の順で、実体はその順
d)んなもん気にしてない


他にオレ流あるなら追記ヨロ
あと、protected とかの種類別に分けてる or 分けてない?
267デフォルトの名無しさん:05/03/10 01:32:35
>>266
漏れ的には、
1) public -> protected -> private の順で宣言も実装も行う
2) コンストラクタとデストラクタは全てのメンバ関数に先駆けて書く
という感じ。
268デフォルトの名無しさん:05/03/10 02:59:05
全部宣言のところに実装も書く
269デフォルトの名無しさん:05/03/10 11:46:21
メンバ関数の実装ではお互いに他のクラスの定義を必要とすることがよくあるので、
基本的に宣言は宣言だけ。
実装は別ファイル。
テンプレートを除いてインライン関数も使わない。

例外は3つあって、一つは単に値を返すgetter系。
もう一つはシグネチャの違う他のメンバ関数を呼ぶだけのようなもの。
3つめは初期化リストだけで済んでしまって中身が何もないコンストラクタ。
これらは宣言のところに実装も書いてしまう。

実装のファイルでは意味的なグループごとに関数を近接させる。
public等のアクセス修飾は関係なし。
270デフォルトの名無しさん:05/03/16 10:55:25
メンバ変数だからって、特に目印はつけないのですか?
271デフォルトの名無しさん:05/03/16 10:57:20
とりあえず >>257- は読んだのか?
272デフォルトの名無しさん:05/03/18 06:34:51
漏れの場合、条件付きインラインとかの為にも、
ヘッダーには宣言だけ書いてる。インライン関数は全部.inlに。
見た目もすっきりするし、最適化とかデバッグの時に有利かと。
273デフォルトの名無しさん:2005/04/03(日) 01:17:18
age
274デフォルトの名無しさん:2005/04/06(水) 11:06:38
void
hoge()



void hoge()

275デフォルトの名無しさん:2005/04/06(水) 12:47:11
識別子がクソ長かったら適当にこんな感じでバラしていく
return_type
  function_name
    (argument1_type argument1_name,
    argument2_type argument2_name)
{
}
276デフォルトの名無しさん:2005/04/06(水) 12:50:11
template <typename T>
void hoge(T arg)
277デフォルトの名無しさん:2005/04/06(水) 22:21:12
>>276 の書き方もしくは、

template<typename T>
ReturnType
FunctionName(
  ArgType1 arg1,
  ArgType2 arg2)
{
}
278デフォルトの名無しさん:2005/06/12(日) 05:19:09
for(int i = 0; i < n; i++) {
}

for(; ; ) {
}

無限ループでも、例外なく ; の後にスペースを空ける。
279名無しさん@そうだ選挙に行こう:2005/09/11(日) 14:42:07
hoge
280デフォルトの名無しさん:2005/09/17(土) 11:31:43

marudasi(lambda() {baka;} );
と書ける処理系作ったおれはスゴイ
281デフォルトの名無しさん:2005/09/18(日) 20:12:33
まあシンタックスで困ることはほとんどないな
こだわる人は勉強してる人が多いけど
282デフォルトの名無しさん:2005/11/08(火) 00:30:45
>>270
付けない
無くて困ると言う事は、クラスが巨大過ぎる気がする
283デフォルトの名無しさん:2005/11/08(火) 08:18:16
>>282
付けてる人同士のソースの相互理解容易度の高さを知らないんだね
どんなに小さいクラスでも有用だよ。
284デフォルトの名無しさん:2005/11/08(火) 20:46:40
俺はm_プレフィクス派だな。
1. 見てわかる
2. リファクタリング用の機能がなくても一気に置換できる
3. this->は長い上にどこかのメンバ関数の中でつけ忘れててもコンパイルでき
処理系で強制できない。

285デフォルトの名無しさん :2005/11/09(水) 23:53:23
>>283
まあ、美意識の問題が大きいので(慣れもかな)
m_は、個人的に、異様に汚く見える(あくまで主観)
ローカル変数は、宣言即初期化派&&
それが追い辛くなるほどメソッドを大きくしない派
なので、メンバ変数と区別が付かない||相互理解が不便なんて事は無い
286デフォルトの名無しさん:2005/11/10(木) 00:33:08
>>285
きこえてアムロ?メンバ変数とローカル変数を見分けるまでの作業量が全然違うのよ。
単純化するためにグローバル変数とかスタティック変数とかは抜きにして説明すると

■メンバ変数とローカル変数に命名方法の区別をしない場合
1) ある変数を見る。
2) その変数より前の部分を関数のはじめまでみる
3) 途中に宣言があればローカル変数、引数に指定されてれば引数、どちらでもなければローカル変数と決定できる。

■プリフィックス又はサフィックスでメンバ変数のみ印付けをしている場合
1) ある変数を見る
2) その変数に印付けがされていればメンバ変数、そうでなければローカル変数か引数

上下方向への視点の動きがまったく発生しなくなるのがおわかりいただけて?
287デフォルトの名無しさん:2005/11/10(木) 01:36:47
俺も、m_ はマイクロソフト系ツール使うまで、全く不要と思っていたが、使い始めるとやめられなくなる。
288デフォルトの名無しさん:2005/11/10(木) 02:25:02
>>286
否、だから・・・
>上下方向への視点の動きが
そんな事が邪魔になる様なコードを書かないって話。
逆に、それで解りづらくなると、メソッドの構成とかを見直すから
無い方が良い気もしないでもない。。

見分けが解りやすいと、その辺が鈍感になる


それから
>1) ある変数を見る。
>2) その変数より前の部分を関数のはじめまでみる
こんな追い方しなきゃいかんと言う事は
メソッドが長すぎるんでないかい??

さらに、それから、別にm_を否定してる訳ではない、念の為
289デフォルトの名無しさん:2005/11/10(木) 02:38:10
>>288
視点って目が見てる部分のことだよ?
速読術でもやってる人ならわからないけど
普通の人間は"面"全体を注目することはできない。
文章の中やコードの中であれば、一行しか注目はできないの。
ここまでOK?

ある変数名に注目してしまった時、
コードが2行以上ならばもう他の行は同時には注目できないでしょう?
そのある変数名に注目した段階で判別できる方法が
何らかのプリフィックスやサフィックスを使う方法で、
一度別の部分に注目する場所を移してから判別するより
遥かに効率がいいの。

あなたのコードが全てベーマガに掲載されそうな一行コードならいいんだけど。
290デフォルトの名無しさん:2005/11/10(木) 02:49:00
>文章の中やコードの中であれば、一行しか注目はできないの。

人間の視点って「"面"全体」は見ること出来ないけど
「ある程度のかたまり」で認識できると思うけど
逆に、「一行しか」って注目は難しい気がする
横だけの集合だけ注目度が高くなるのも
ちょっと不思議な気がしないでもない
291デフォルトの名無しさん:2005/11/10(木) 02:59:28
標準の set を実装する場合など、自然な命名だと
メンバ変数に size なんてのが置きたくなって
メンバ関数の size() と被ってしまう。
m_ はそんな時にも助けになる。
292デフォルトの名無しさん:2005/11/10(木) 03:04:20
size_
293デフォルトの名無しさん:2005/11/10(木) 03:13:09
>>292 流れを読むようにしような。
294デフォルトの名無しさん:2005/11/10(木) 07:56:03
>>290
結局"おれはm_とか付けたくない"っていう結論ありきで
相手の話を理解しようとして聞いてないじゃない
あんたはソースの中に縦書きでも探してれば?

それとも縦書きに釣られすぎて横方向に文字読みながら
縦方向にも縦書きを探せるなんてかわいそうな
特殊技能でも身に着けちゃってるのかね
295デフォルトの名無しさん:2005/11/10(木) 08:49:37
まあしょせんハンガリアン命名記法だから、いまさら論争自体がなあ。
コードレビューとして考えて意味の把握のしやすさのほうが問題で、
個人的には単純に視点の移動を作業量と考えるのはメリットが無い。
絶対的な利便性があるわけでもなく、強制はナンセンス。
そうしたい人だけそうすれば。
296295:2005/11/10(木) 08:51:58
>そうしたい人だけそうすれば。
訂正、そういう規約がある/必要な場合にその人が守ればいいだけ。
297デフォルトの名無しさん:2005/11/10(木) 10:51:06
m_ プリフィックスをハンガリアンとか言ってる時点で見識のレベルの低さが露呈してるんだけどね。
298デフォルトの名無しさん:2005/11/10(木) 11:18:22
所詮、ローカルルールでしょ
299デフォルトの名無しさん:2005/11/10(木) 12:00:32
わたしも、所詮ローカルルールと言う意味などでハンガリアンみたいなもの
と言ってるのだが、
>>297
ほう、見識が高いと、m_ プリフィックスはハンガリアンではないと?
それはそれで言い分があるかもしれないから、まともに見識のあることを
喋ってごらん。喋れるなら。通じない根拠や相手の非難だけにすり替えないで。
300デフォルトの名無しさん:2005/11/10(木) 12:05:00
>>299
別におれは297じゃないんだけどさ。

もとの書き込み(>295)では「みたいなもの」などと言わずに、そのものだと言い切っている。
「ハンガリアンはプリフィックス」は真だと思うが、
「プリフィックスはハンガリアン」とは言えないだろう。

「ごめんなさい」が言えない人ですか?
301300:2005/11/10(木) 12:07:43
> 「ハンガリアンはプリフィックス」は真だと思うが、
> 「プリフィックスはハンガリアン」とは言えないだろう。

ごめん、「m_ プリフィックス」ってなってるのを見落としてた。
「m_ プリフィックス」はハンガリアンじゃなくて
ただのメンバ変数を表すプリフィックスだから
言いたいことは同じだけどね。
302297:2005/11/10(木) 12:40:51
>>299
m_プリフィックスがハンガリアンだという資料があれば俺に教えて欲しいくらいだ。
まず君はここらへんから読みたまえ。
http://www.radiumsoftware.com/hungarian_notation.html
メンバ変数か否かというのはC/C++言語における"型"かね?
そうではないだろう?
303295:2005/11/10(木) 13:39:17
>>300-302
なんだ、見識どうこうといって、やはりその話なんだ。
もちろん m_ がオリジナルな意味での Hungarian Notation でないのは
ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs600/html/hunganotat.asp
もともと否定しない。しかし(少なからぬ人と同じように)スコープを示す
一種の拡張ハンガリアンとしてのローカル規約であると捉えるので、
ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/stg/stg/coding_style_conventions.asp
m_ どうこうの強制や論争自体がナンセンスであると。
(たいてい賛成派もきちんと理由を挙げられない)
で、別に m_がハンガリアンであろうとなかろうと論旨には全く関係無いが、
そういうところを見識といって揶揄するぐらいしかできないと?
304デフォルトの名無しさん:2005/11/10(木) 14:20:48
>>303
なんかスレが伸びてると思えば。もう頭悪いね君としか言いようがないな。

1. m_ はcoding style convensionであって、属性をコード化するハンガリアン
とは関係ない(ハンガリアンの延長線上と看做す向きもあるが見解の分かれる
ところであるし、個人的には牽強附会と思う)。
論争が意味ないとかいうのは一連の議論を否定するただの煽りでしかなく、
m_プレフィクスの無用性について意味のある主張をしたいのなら命名法で
区別することによるメリットがないことを示せ。もしくは>>295
> コードレビューとして考えて意味の把握のしやすさのほうが問題で、
というのがm_プレフィクスにより激しく損われるという論拠でもよい。
(それが他人にとってm_プレフィクスの有用性に優越するかどうかは別の問題だ
が、個人・場合による問題なので異なる見解が両立し得る)
一般のハンガリアン記法の適用を否定する主張としては一理あるが、我々は
m_プレフィクスについての議論をしているのであり、ハンガリアンの延長線上と
君が看做したからといって盲目的に適用するのは無茶と言うもの。

2. ただの煽りでしかなければ見識がないと言われるのは必然である。しかも
> で、別に m_がハンガリアンであろうとなかろうと論旨には全く関係無いが、
という主張は
> まあしょせんハンガリアン命名記法だから、
で始まる>>295自体の意味を否定する。即ち>>295が無意味な煽りであり、295には
見識がないということを自分で立証している。

3. ちゃんと理由は挙げられているのに個別に反証することなく
> (たいてい賛成派もきちんと理由を挙げられない)
と書いているのは他人のレスをろくに読みもしていないことを立証している。
305295:2005/11/10(木) 15:23:50
>1.
>ハンガリアンの延長線上と看做す向きもあるが見解の分かれる
>ところであるし、
>(それが他人にとってm_プレフィクスの有用性に優越するかどうかは別の問題だ
>が、個人・場合による問題なので異なる見解が両立し得る)
つまりどちらかの立場をとること自体に問題は無い。
>区別することによるメリットがないことを示せ。
すでに>>288等(295とは別人)も繰り返してるだろう。
結局"おれはm_と付けてる"っていう結論ありきで
相手の話を理解しようとして聞いてないじゃない
#288等補足:
#コードレビューとして考えて意味の把握のしやすさのほうが問題で、
#個人的には単純に視点の移動を作業量と考えるのはメリットが無い。
#(個人的には可読性が落ちるケースが少なくない。m_をつけて
#よしとして全体としての意味をとりにくい名前のままの事があるから、
#とも思っている)
>2.
煽られたと思うところ、喰いつきやすそうな所だけ問題にしたい、と。
<絶対的な利便性があるわけでもなく、強制はナンセンス。
<そういう規約がある/必要な場合にその人が守ればいいだけ。
>3. ちゃんと理由は挙げられているのに個別に反証することなく
ええと、そのちゃんとというのは >>286,289 あたりですか?
(直後にも反論(?)ついてるようですが)
306デフォルトの名無しさん:2005/11/10(木) 17:05:51
君、謝っちまったほうが楽になるよ。
自分の価値が下がるわけじゃない。むしろ上がるさ。
307デフォルトの名無しさん:2005/11/10(木) 17:51:58
>>306
"おれはm_と付けてる"から揶揄に終始しますと。ご苦労様です。
別にまともな論が無かろうと、そういう規約がある/必要な場合に
そうするのは止めやしない。まこといまさら論争自体がナンセンス。
308306:2005/11/10(木) 18:34:58
俺、どっちが悪いとか言って無いのになぁwww
食いついた方が、実は自分が不利だと悟ってる方だと思って
書き込んでみたがこううまくいくとは思わなかった。
309デフォルトの名無しさん:2005/11/10(木) 20:46:47
ほほーぅ、それでそれで?
310デフォルトの名無しさん:2005/11/10(木) 22:16:15
結論: 295はアフォ。
そろそろ次の話題行きましょ。
311デフォルトの名無しさん:2005/11/10(木) 22:47:43
305はあれで反論したつもりになってるんだろうか。
自分で相手の主張を肯定していることに気がつかない頭の弱さカワイソス。
312デフォルトの名無しさん:2005/11/19(土) 03:13:19
>>274
後者。grep で関数名引いた時、返す型が表示されないってのは
かなり痛い。
313デフォルトの名無しさん:2005/11/22(火) 00:59:22
>>312
つ grep -B 1
314デフォルトの名無しさん:2005/11/23(水) 17:13:43
>>308
レス先書かなきゃ、直前のレス宛だと考えるのが普通ですよ。

こういうのがわからない人のコードって、さぞ自分勝手なんだろうな :-)
315デフォルトの名無しさん:2005/11/26(土) 02:31:31
m_とかg_とか付けるとかってさぁ、自分だけでプログラムしてるならいいけど
多人数で作ってると付けて欲しいんだよね。
人によってスタイル違うしクラスからグローバル変数使いまくりな
タココード書く奴が足引っ張って大変。
メンバ関数内で何も付けずにローカル、メンバ、グローバル変数が
入り乱れた他人のコードを追うのはきついぞ。
そんなので新人がマルチスレッドのコード書くもんだからたまらん。
何も付けない派の奴らにお見舞いしたいコードだ。
316デフォルトの名無しさん:2005/11/26(土) 04:43:41
>>315
それはプレフィクスごときで解決する問題じゃないと思うが……
317デフォルトの名無しさん:2005/11/26(土) 13:15:48
多人数で作るならある程度のコンベンションを決めるのは当たり前だと思う
m_ でも g_ でも付けないでもいいから、とにかく揃えておくというのが重要かと

タココードを書くやつがいるというのは別問題だな
318デフォルトの名無しさん:2005/11/26(土) 13:36:21
グローバル変数はそれなりに存在価値がある。
staticメンバ変数として隠蔽されていた方が、かえって追跡しにくい場合もある。
タココードの場合は、独自の名前空間にいれるよう強要すれば問題解決でしょ・・・多分。
319デフォルトの名無しさん:2005/11/26(土) 13:43:54
ま、手軽に、using namespace xxx を
グローバルスコープで宣言された日には手も足もでないんだけどね。
320デフォルトの名無しさん:2005/11/26(土) 14:07:00
>>318
> グローバル変数はそれなりに存在価値がある。
> staticメンバ変数として隠蔽されていた方が、
> かえって追跡しにくい場合もある。

具体的にどんな場合?
321デフォルトの名無しさん:2005/11/26(土) 14:56:06
>>318
タコかどうかなんて、ほぼ書き上げられたソースを見るまで
判らん場合もあるわけで
322デフォルトの名無しさん:2005/11/26(土) 15:17:25
Socketまわりなんかタコどころか糞コードだからな
323デフォルトの名無しさん:2005/11/26(土) 20:49:16
逆に言えば(当然のことながら)
ネーミングルールを決めただけでタココード/糞コードがそうでなくなることなど無い
324デフォルトの名無しさん:2005/11/26(土) 22:37:23
>>323
・・・確かに。
タコのタコたる所以は、命名ルール無視などという生易しいものではない罠。
325デフォルトの名無しさん:2005/11/26(土) 23:53:51
タココードでもネーミングルール守っていてくれれば、まだマシなのでは?
326デフォルトの名無しさん:2005/11/27(日) 00:31:43
グローバルやstatic変数にコールバック関数が入り乱れる自分にしか
理解できないコードを書く奴を抑止できる状況にもっていけない
場合は多々ある。せめてg_だけでもいいから付けてくれ。
予期せぬ不具合はグローバルがらみが多すぎる。
327デフォルトの名無しさん:2005/11/27(日) 04:42:19
蛸コード書く香具師のプレフィックスほど当てにならないものはない。
結局、自分で検索してマーキングした方が間違いなかったりする。
328デフォルトの名無しさん:2005/11/27(日) 16:37:26
>>325
タココード見たことないのか?
お前がタコじゃないか?
329デフォルトの名無しさん:2005/11/27(日) 17:08:41
>>328
おまえのように1か0かしか言わない奴っているよな
そして何も状況は変わらない
そりゃタコを育てる時間があったり、タコを入れ替えて優秀なマを入れる
余裕のある所はそうするのが最善だろうが
330デフォルトの名無しさん:2005/11/27(日) 19:44:03
   __ , −、/:::::::::::::::::::::l  ヽ::::、:::::::::::::',::::::::::ヽ::::::::::::::::ヽ:::::::::::ヽ
  /:::::::::::::t.- 、ノ::::::::::l::::::::|::|   ヽ::::i、:::::::::::、::::::::__ヽ:::::::::::::::`、:::::::::::',
. /   ::::::〃  }:::::::|:::l!::::::l|::|    丶:l.\::::::::i<:::::: ̄`ヽ::::l:::::l::::::::::::i
 i:::::::::::::;イ/`ーr':::::::::!::|!::::::|lィ´    ヽ  \:::゙、 丶::::ヽ\:::::l:::::l::::::::::::l
 |::::::::::/ li   l::::::::::l:::l|:/ !|      \  \:ヽ \::', ゙、:::l:::::l::::::::::::!
. !:::::;:/ l!   |::::::::::|::|イ:::| l:!           ヽ__ \ ヽ::!、::l::::l::::::|
  l::::l:!  |    |::::::::::l::| l:::! l   __        〃, ̄::`ヽ、  ',::ヘ:!-、:::::!
.  ヽ|!     |::::::::l:| l:|  ! ,, ==、       {::::::::::ハ ヽ Y ,ヘ !:::|
            !::!:::::l:l|  l! 〃/´:::::ヽ         い-‐ク    〈ヽ. ハ{
           l:l|:::::l:lヘ   i! {:;、_;;:::、}         `¨´      !' ,.イ
          l| l::::ト.{. `、 l! `ー-- ′                 ,'r'´ l{
             ! ヽ:| ヽ. ヘ           '          /i{
               `iー、                     〃  おっちゃんら
                   }ハ         _       ィl;{_   悲観的な事ばっかやなぁ
                     `  、       ‘ ′  ,. '´ ヽ: :`ー- 、 そんな人生おもろいかぁ?
                          `j丁`i¬ー、‐ '´       \: :、: : :ヽ
                      ,{ { : :∨   }       _`_y: : : :.}_
                    /:! ヾ、 : :',    _,.-‐'´ ̄: : : : :`:ー--'j
                  /: : :|   ヽ: }  /: : : :_;.-‐'´ ̄`ー- :___;ハ
                 / : : :!   `f‐'´:_;.-‐'´           i
331デフォルトの名無しさん:2005/12/04(日) 11:56:55
そんな瑣末な方言の議論はさておき、メンバ変数のためだけに
set_xxxx,get_xxxx関数を作るのがコーディングに真の勝者なのだ。
332デフォルトの名無しさん:2005/12/05(月) 02:24:34
全部インラインにしておけよ。遅いから。
333ハーピィ:2005/12/05(月) 02:45:57
E・∇・ヨノシ <333ゲット♫
334デフォルトの名無しさん:2006/01/01(日) 15:46:50
>>330
なんでオマエ関西風味よ?w
335デフォルトの名無しさん:2006/01/05(木) 09:59:06
>>331
プロパティ
336デフォルトの名無しさん:2006/02/03(金) 16:12:47
節分です
337デフォルトの名無しさん:2006/03/15(水) 06:14:52
STLの名前って最初がみんな小文字だから矢田
俺のクラスとか変数とか関数とか皆最初大文字なのに
統一できない
338デフォルトの名無しさん:2006/03/15(水) 06:25:39
>>337
いっそ、std::find()→StdFind()みたいな置き換えインクルードファイルでも作ればいいじゃん。
#一度作ればずっと使えるわけだし。
339デフォルトの名無しさん:2006/03/15(水) 21:16:58
>>338
自分の名前空間に入れろよ。
340338:2006/03/16(木) 01:16:41
>>339
漏れに言うなよ。
341デフォルトの名無しさん:2006/03/18(土) 17:51:12
>>338
言い方が冷たいよ…もっとお母さんみたいに言ってくれ。
342338:2006/03/19(日) 17:05:02
すまん、言葉には聞いたことがあるのだが、それがどんなものなのか知らないんだ。
343デフォルトの名無しさん:2006/03/20(月) 14:14:29
お母さんを知らずに育ったのか…(´・ω・) カワイソス
344デフォルトの名無しさん:2006/05/01(月) 07:35:44
インライン関数は淫乱なのですか?
345デフォルトの名無しさん:2006/05/01(月) 07:47:46
そうでもないよ。
346デフォルトの名無しさん:2006/05/01(月) 09:18:33
クラスの変数をprotectedにするかprivateにするかで先輩と議論しなりました。

僕は派生されるクラスからもアクセスできるようにprotectedに入れたいのですが、
先輩はprivateにいれてアクセス用の関数を作るべきだといいます。
その方が変数名が変わったとき、派生クラスを直さなくてよいから、
というのが理由だそうですが、どうも納得行きません。
どうにか説得できないでしょうか?
347デフォルトの名無しさん:2006/05/01(月) 09:21:05
>>346
protected は中途半端。
方針としては中途半端。
「見えちゃ嫌だけどちょっとは見えたほうが」
そんなの微妙すぎ。
348デフォルトの名無しさん:2006/05/01(月) 09:28:09
>>346
protected な変数が必要になるのはカプセル化が弱いせいではないか?
よく考えることだ。

たとえば、変数を protected にするということは、何かしら
特別な意味を持った操作を想定しているのではないか?
そうだとしたら、変数は private にしてその操作を関数にするべきだ。

逆に見えてもいいってことは、どういじったところで問題ないんじゃないか?
そうだとしたら、その変数は public でいい。

どちらにも当てはまらないときだけ、 protected を使う根拠になる。
349デフォルトの名無しさん:2006/05/01(月) 09:55:29
>>346
↓こんなのがエラーになるから嫌だ。
class B { protected: int n; };
class D : public B { int f(B& b) { return b.n; } };
350デフォルトの名無しさん:2006/05/01(月) 09:58:46
>>1
Sleep(∞)
351デフォルトの名無しさん:2006/05/01(月) 10:00:52
(・,J・)
352デフォルトの名無しさん:2006/05/01(月) 12:47:56
派生クラスが親の変数にアクセスできなきゃ不便でしょうがなくない?
全部Set/Get関数使うの〜?
353デフォルトの名無しさん:2006/05/01(月) 13:16:38
>>352
だからそれは設計が悪いんだって。
354デフォルトの名無しさん:2006/05/01(月) 14:50:36
いや設計とかじゃなくて…
355デフォルトの名無しさん:2006/05/01(月) 15:19:07
// もしwings_がprotectedだとKiwiの羽が存在してしまうってことか?
class cBird {
cWings wings_;
public:
cWings const & wings() const {return wings_;}
void flap() const { ...; }
void fly() const { ...; flap(); ...; }
};
class cKiwi : public cBird {
public:
cWings const & wings(); // kiwi have no wings.
void flap() const; // kiwi can't flap.
};
class cPenpen : public cBird {
public:
void fly() const; // penpen can't fly.
};
// 書いてて知恵熱が出てきた
356デフォルトの名無しさん:2006/05/01(月) 18:25:35
>>352
ユーザーがクラスのメンバにアクセスできなきゃ不便でしょうがなくない?
全部Set/Get関数使うの〜?

って聞かれてる気分だ。
357デフォルトの名無しさん:2006/05/01(月) 18:59:59
Personクラスに「名前」があって、もしprivateに置かれてたら
Personから派生したStudentは名前無しって事か。
学生は辛いな。
358デフォルトの名無しさん:2006/05/01(月) 19:06:32
>>357
Person の「名前」が private なら、 Person に「名前」があることは
Person 以外だれも知らないから問題ない。

Person に「名前」ある(と外部が知っている)ということは、
Person の「名前」は public であるから Student が Person を
public 継承していれば何も問題ない。
359デフォルトの名無しさん:2006/05/01(月) 19:18:41
>>355
private だとメンバ変数が消えるとでも思ってんの?
360355:2006/05/01(月) 19:25:54
>>359
アクセスする手段がなければ存在しないのと大差ないでしょ。
見えなくするってのはそういうことかと思ったのだけど。
361デフォルトの名無しさん:2006/05/01(月) 19:37:07
カプセル化ちゃんと学んだらどうだ。
362デフォルトの名無しさん:2006/05/01(月) 19:38:22
>>360
アクセスする手段はそのメンバを持ってるクラスが提供するんだよ。
363355:2006/05/01(月) 19:49:51
>>362
漏れが書いたコード見て言ってる?
規定クラスにはそういうI/Fを用意したけど、派生クラスで敢えてオーバーロードで潰しているんだけど。

もしかして>359=>361=>362?
喪前様のレスからは意味のある情報が一つも引き出せないのだけれど。
364デフォルトの名無しさん:2006/05/01(月) 19:54:57
>>363
潰してる?アップキャスト一発で破綻するだろ?
365デフォルトの名無しさん:2006/05/01(月) 19:57:17
>>358
>Person の「名前」が private なら、 Person に「名前」があることは
>Person 以外だれも知らないから問題ない。


StudentはPersonなんだから名前がある事を知っていた方がよくない?
privateだとStudentからも見えないわけだが。

Person has-a Name.
Student is-a Person.

よって、Student has-a Name.
366デフォルトの名無しさん:2006/05/01(月) 20:09:16
>>365
> StudentはPersonなんだから名前がある事を知っていた方がよくない?
> privateだとStudentからも見えないわけだが。

そこで public にしないのは何故だ?
367デフォルトの名無しさん:2006/05/01(月) 20:10:15
Person の「名前」って言っても、実際はデータメンバと参照用メソッドがあって
それぞれにアクセス制限を選ぶことが考えられる。
private なデータメンバと、 public な参照用メソッドがあるのが一般的だな。
protected の出番はなかなか思い当たらない。
368デフォルトの名無しさん:2006/05/01(月) 20:48:09
ちなみにここで議論されていることって
何かにまとめられているの?

関係ないけどCをオブジェクト指向っぽくできないものかと
思案中・・・
一応組み込み向けの本でそれらしきのがあったのでそれを参考にしてますが・・・
369デフォルトの名無しさん:2006/05/01(月) 20:56:01
>>368
「カプセル化」という基本事項にまとめられると思ってる。
クラスを作る意義のひとつだな。

C でオブジェクト指向なんてメンドクサイから C++ 使えよ。
370デフォルトの名無しさん:2006/05/01(月) 21:16:24
pythonつかえ。
悩みから開放されるぞ。

「みんな大人だ」
371デフォルトの名無しさん:2006/05/02(火) 02:38:05
「Cをオブジェクト指向っぽく」なら、せっかくだから Objective C 使え
C++ よりずっとセクシーだぞ
372デフォルトの名無しさん:2006/05/02(火) 08:18:54
>>367
>protected の出番はなかなか思い当たらない。

派生クラスだけにアクセスさせたい変数はprotectedでいいのでは?
そうゆう変数って普通に沢山あると思うけど。

373デフォルトの名無しさん:2006/05/02(火) 08:20:43
374デフォルトの名無しさん:2006/05/02(火) 08:23:13
> そうだとしたら、変数は private にしてその操作を関数にするべきだ。

その関数を protected にするなら同じやん
375デフォルトの名無しさん:2006/05/02(火) 08:25:42
>>374
同じだと思うなら private にしとけよ。
protected なデータメンバだと派生クラスから変更できてしまうからカプセル化が崩れる。
376デフォルトの名無しさん:2006/05/02(火) 08:43:35
D&Eにもprotectedな変数を使うと駄目だというような事が書いてある。
377デフォルトの名無しさん:2006/05/02(火) 10:41:38
378デフォルトの名無しさん:2006/05/02(火) 11:15:14
某別スレで以前、なんでもかんでもprivateにする奴はC++のど素人…みたいな事を
言ってる奴いたな
会社でそういうソースを見て頭がいたくなったとかなんとか
たいそうな達人ですなw
379デフォルトの名無しさん:2006/05/02(火) 12:42:20
>>375
セオリーと現実の違いだと思う。
すべてをカプセル化するのは現実的にはオーバーヘッドが大きすぎる。
熟練したC++プログラマならprivateとprotectedをきちんと使い分できる。
380デフォルトの名無しさん:2006/05/02(火) 12:47:08
>>379
きちんと使い分けた場合 protected の出番はごく稀になると思うんだが、どうかね?
特にデータメンバにおいては皆無になるだろう。
381デフォルトの名無しさん:2006/05/02(火) 12:49:28
>>379
inine がある C++ ではオーバーヘッド無しでカプセル化を実現可能じゃないか?
382デフォルトの名無しさん:2006/05/02(火) 12:55:46
つまり、ここは一部の「熟練していると思い込んでいるC++プログラマ」が一人(或いは数人で)
強硬にカプセル化を否定しているのを、普通にC++を使えているプログラマ連中が
ニヨニヨしながら構っているのを、慣れてないC++プログラマが困惑しながら見守っている
スレだということで宜しいか。
383デフォルトの名無しさん:2006/05/02(火) 12:56:17
いや全然違うけど。
384デフォルトの名無しさん:2006/05/02(火) 14:45:25
>>381 ×inine ○inline
385デフォルトの名無しさん:2006/05/02(火) 19:44:07
protectedを使う事が熟練C++マだと勘違いする子が右往左往するスレ
386デフォルトの名無しさん:2006/05/02(火) 20:26:09
俺もちょっと興味あるな。
誰か識者の人解説してくれないかな。
protectedとpublicの概念に、明確な違いがあるのなら。
387デフォルトの名無しさん:2006/05/03(水) 08:01:23
public=公共の場で全裸
protected=自分ちで全裸
private=風呂で全裸

家族になら見られてもいいって人はprotectedもアリだと思うよ。
388デフォルトの名無しさん:2006/05/03(水) 08:08:33
継承を使わない奴にはprotectedは必要ない。
389デフォルトの名無しさん:2006/05/03(水) 08:09:10
protectedだとうっかり窓から外の人に全裸が見えてアウチ。
390デフォルトの名無しさん:2006/05/03(水) 08:21:25
>>389
具体例をきぼん
391デフォルトの名無しさん:2006/05/03(水) 08:55:59
>>390
卑猥なやつだな。しかもageてるし。恥ずかしいだろ。
392デフォルトの名無しさん:2006/05/03(水) 09:43:29

恥ずかしいなら手術すればいいのに。
393デフォルトの名無しさん:2006/05/03(水) 09:49:47
NVIパターンの話だな
394デフォルトの名無しさん:2006/05/03(水) 12:40:52
protectedの使い道分かってない人って結構多いんだね…
ビクーリ
395デフォルトの名無しさん:2006/05/03(水) 13:20:15
>>394
じゃあお前が誰でも納得できるように説明してみろやカス
396デフォルトの名無しさん:2006/05/03(水) 13:41:15
ヒント:継承
397デフォルトの名無しさん:2006/05/03(水) 13:44:39
つーかツマンネ。
全部privateで書いて、とうしても必要になったらprotectedに変えればいいじゃん。
もっと面白いコーディングスタイルの話題は無いのか?
398デフォルトの名無しさん:2006/05/03(水) 14:03:52
>>388
プ 設計が悪い事に気づいてない奴が一人
399デフォルトの名無しさん:2006/05/03(水) 14:08:56
もうgetterとsetter書くの面倒だし全部publicで良くね?
eclipseのJDTみたいに、チェックボックスにチェック入れるだけで
getterとsetter書ける開発環境があればprivateにしてやるよ。
400デフォルトの名無しさん:2006/05/03(水) 14:46:10
>>399
そんな奴がいるから VB とか C# にはプロパティなるものがあって、
Visual Studio にはプロパティ生成機能が付いてる。
401デフォルトの名無しさん:2006/05/03(水) 14:58:28
>>397
自分が理解できない事には「ツマンネ」で終わらす気ですか?
402デフォルトの名無しさん:2006/05/03(水) 15:54:37
EA買ってソース自動生成すれば?
403デフォルトの名無しさん:2006/05/03(水) 15:59:26
そこまでいくとスレ違いじゃね
もう「コーディング」じゃなくなるから
404デフォルトの名無しさん:2006/05/03(水) 20:13:12
そんなに手間を惜しみたいのなら#defineでゲッターセッター作れカス
405デフォルトの名無しさん:2006/05/03(水) 21:55:12
コーディングスタイルを統一するためC/C++用のsource code formatter/beautifierを
使いたいんですが、Windows用でおすすめがあれば教えて下さい。
406デフォルトの名無しさん:2006/05/03(水) 23:27:26
オブジェクトコンポジションで単純な委譲を使うとき、
移譲先が同じ翻訳単位内なら直にリンクしてくれたりするんですかね?
407デフォルトの名無しさん:2006/05/04(木) 07:35:21
継承元は継承先にとって自分自身なんだから好きに出来て当然。
でも他人にはおれが分からないんだから、おれにアクセスするならコミニケーション取ってねって事でしょ。
だからおれは継承元クラスでは protected は結構使ってるな。
カプセル化を理由になんでもかんでも Set,Get なんでうざいだけじゃね?
408デフォルトの名無しさん:2006/05/04(木) 07:36:25
コミュニケーションだな(/ω\)
409デフォルトの名無しさん:2006/05/04(木) 08:23:38
Gettter/Setterは単に値を読み書きして実装詳細を隠すだけではなく、
そこで値の検査をするなどと言ったこともできる、って当たり前のことだよな?
410デフォルトの名無しさん:2006/05/04(木) 08:40:09
>>409
当たり前のことだな。カプセル化を否定してる訳じゃないよ。
でも値チェックするまでもないようなメンバとかも結構あるでしょ。
必要だと思う物はカプセル化してる。
使い勝手は人それぞれだけど、おれは直接アクセスできる方が便利だと思える箇所はそれなりにあるな。
こんなこと言うと、設計が甘いって言う人が出てくるんだけどな(´∀`)
411デフォルトの名無しさん:2006/05/04(木) 09:44:53
おれ的ルールはどうでもいい
412デフォルトの名無しさん:2006/05/04(木) 10:02:59
おれを信じよ
413デフォルトの名無しさん:2006/05/04(木) 12:58:12
おk
414デフォルトの名無しさん:2006/05/06(土) 15:44:31
>>407
今までで一番まともな見解。
やっぱり仕事としてプログラマしてる人は分かってるね。
415デフォルトの名無しさん:2006/05/06(土) 15:46:58
>>407
さすがプロの人の意見は参考になります(><)
416デフォルトの名無しさん:2006/05/06(土) 15:49:23
>407の人気に嫉妬
417デフォルトの名無しさん:2006/05/06(土) 16:17:20
なにこの自作自演
418デフォルトの名無しさん:2006/05/06(土) 23:06:40
抽象クラスのメンバ変数とか場合によってprotectにしてる
419デフォルトの名無しさん:2006/05/06(土) 23:28:13
>>418
抽象クラスにメンバ変数はねーべ?
420デフォルトの名無しさん:2006/05/06(土) 23:46:18
え?
421デフォルトの名無しさん:2006/05/06(土) 23:50:35
な、なんだってー!
422419:2006/05/07(日) 00:05:46
あーごめん。勘違いしてた。
423デフォルトの名無しさん:2006/05/07(日) 16:02:23
なにこのジサカーの巣窟www
424デフォルトの名無しさん:2006/05/07(日) 21:46:24
>>418
すればいいんじゃね?
425デフォルトの名無しさん:2006/05/07(日) 21:48:34
抽象クラスだからって、 protected データメンバの出番が無いことに変わりはないね。
426デフォルトの名無しさん:2006/05/07(日) 22:54:46
>>425
それはお前だけ。
427デフォルトの名無しさん:2006/05/07(日) 23:13:03
>>426
じゃぁ抽象クラスと protected データメンバの関連って何なのさ?
428デフォルトの名無しさん:2006/05/08(月) 07:17:41
まずは自分で調べようよ。
いつまでも教えて君のままじゃ進歩しないよ。
429デフォルトの名無しさん:2006/05/08(月) 11:01:15
調べると >>376-377 みたいなのが出てくるわけだが。
430デフォルトの名無しさん:2006/05/08(月) 12:06:18
こんなのもある。
http://www.gotw.ca/gotw/070.htm
> protected data is evil (this time with no exceptions). Why is it evil? Because...
431デフォルトの名無しさん:2006/05/08(月) 20:10:15
確かに初心者には使わせない方がいいね。
protectedやfriendは上級者向き。
432デフォルトの名無しさん:2006/05/08(月) 23:24:22
実装継承も上級者向き。
無茶なキャストも上級者向き。
goto も上級者向き。

上級者向きって言葉は便利だね。
433デフォルトの名無しさん:2006/05/08(月) 23:44:23
上級者向きってことは、もっと経験をつめってことだからな。
婉曲表現大好き日本人。
434デフォルトの名無しさん:2006/05/09(火) 00:39:01
>>431
リンク先読んだか?上級者とか関係ないよ。
435デフォルトの名無しさん:2006/05/09(火) 00:49:36
private public は低級者向き。
436デフォルトの名無しさん:2006/05/09(火) 01:42:20
議論がループしてる。
もうこのスレも終わりだなw
他の話題ないのかよwww
437デフォルトの名無しさん:2006/05/09(火) 01:46:27
過則勿憚改

自分の過ちを認める勇気も、技術者には必要だ。
438デフォルトの名無しさん:2006/05/09(火) 02:28:36
過則勿憚改

自分の過ちを認める勇気も、技術者には必要だ。
439デフォルトの名無しさん:2006/05/09(火) 15:52:40
過ぎたるは則ちフンドシ改めることなかれ
440デフォルトの名無しさん:2006/05/09(火) 18:16:18
データも仮想関数も全く同じ理由でpublicにすべきではない
二つは同じ歴史をたどっている
データに関しては周知の通りだがそれが分かるには時間がかかった
Javaでさえ失敗している。仮想関数についても同じことになるだろう。
要するに一つの関数/クラスに一つの機能。
これを守るのはすごく難しい。たとえばconst_iterator。
これは明らかに一つのクラスが二つの機能を持っておりC++のコードを倍に増やした
名前が形容詞で修飾されていたらその関数/クラスの設計はたいてい間違っている
441デフォルトの名無しさん:2006/05/09(火) 18:19:46
>>440
お前は何を言っているんだ?(ミルコ風
442デフォルトの名無しさん:2006/05/09(火) 19:21:18
>>440

443デフォルトの名無しさん:2006/05/10(水) 00:26:10
>>440
const_iterator が間違いだったとして、どうすれば正解だったの?
444デフォルトの名無しさん:2006/05/10(水) 07:53:09
>>443
ヒント:protected
445デフォルトの名無しさん:2006/05/10(水) 08:03:25
   ∩___∩         |
   | ノ\     ヽ        |
  /  ●゛  ● |        |
  | ∪  ( _●_) ミ       j
 彡、   |∪|   |        J
/     ∩ノ ⊃  ヽ
(  \ / _ノ |  |
.\ “  /__|  |
  \ /___ /
446デフォルトの名無しさん:2006/05/10(水) 09:37:44
そもそも >>440 は論旨が不明瞭。
447デフォルトの名無しさん:2006/05/10(水) 21:37:28
>>440
const_iterator が持ってる二つの機能って何?
448デフォルトの名無しさん:2006/05/10(水) 22:15:58
constとiterator
449デフォルトの名無しさん:2006/05/10(水) 22:22:03
>440
NVIは言いたいことは解らないでもないが、
今のところ、わざわざそうするべき状況に出会った事がないから実感が持てない。

>const_iterator
要素のconst性とコンテナのconst性のこと?
450デフォルトの名無しさん:2006/05/20(土) 12:35:41
Cで組み込み系(ファーム開発など)をやってる人は
これを読んだらどう?
ttp://www.amazon.co.jp/gp/product/4789833399/503-6690732-8287916?v=glance&n=465392
451デフォルトの名無しさん:2006/05/20(土) 12:55:52
>>450
面白そうな本だね。俺、別に組み込み系とかやってるわけじゃないけど、
今度、本屋に行った時に読んで良さそうだったら買ってみるよ。
452デフォルトの名無しさん:2006/06/01(木) 23:25:48
>>450
MMSといったら悪名高きDシリーズじゃないか。
453デフォルトの名無しさん:2006/06/29(木) 06:20:08
>127あたり
vc++使っててchar(...)みたいなキャストができることを知って多用してます。
ほかでもOK?
454デフォルトの名無しさん:2006/06/29(木) 06:23:13
アクセッサとメンバ。get〜set〜とかくのが面倒なのでこんな感じ
class Foo
{
int m_hoge;
int hoge() { return m_hoge; }
void hoge(h) { m_hoge = h; }
};
455デフォルトの名無しさん:2006/06/29(木) 06:30:29
>>347 面白いんだけどスルーされてる?
456デフォルトの名無しさん:2006/06/29(木) 08:01:47
>>453
関数型キャストはいつでも使えるわけではないし、折角C++には濫用防止の戒めを兼ねて
テンプレート型キャストがあるのでそちらを使うべきです。

実数値を整数値に丸めるときなんかは(仕様を承知で) int(sin(...))なんて使うのはありだと思いますが。
457デフォルトの名無しさん:2006/06/29(木) 08:02:23
>>455
コピペに反応しろと?
458デフォルトの名無しさん:2006/06/29(木) 09:59:51
>>457
あれってコピペなの?的確なレスだと思うけど。
459デフォルトの名無しさん:2006/06/29(木) 11:28:34
460デフォルトの名無しさん:2006/06/29(木) 11:42:48
>>459
それは知ってる。っていうか、それ知らないと面白くない。
461デフォルトの名無しさん:2006/06/29(木) 12:07:07
cは限りなく正解に近いw
462デフォルトの名無しさん:2006/06/29(木) 18:12:19
>>453
その形式のキャストも標準C++のうち。正確にはコンストラクタ呼び出しの構文。

いまさらだけど、>>127
D&E読め、static_castの類はわざと読みにくく作られている。
463デフォルトの名無しさん:2006/07/01(土) 17:36:38
実務でCのソースみると、グローバル変数を多用する
人がほとんどなんだけど、どうして?
構造体も使わないし、自分でやってて分け分からなく
ならないのかな?

グローバル変数多用派のご意見をお聞きしたい。
464デフォルトの名無しさん:2006/07/01(土) 17:38:43
関数に引数を渡したりするのが面倒くさいんだろう。
465デフォルトの名無しさん:2006/07/01(土) 18:32:19
>>463
過去の汚物を引き継いでるプロジェクトほどその傾向が強い。
一部の教条主義者はローカル変数は遅い、構造体は遅い、と信じていたりするし。
466デフォルトの名無しさん:2006/07/01(土) 19:30:01
>>463
別言語がメインの開発者
467デフォルトの名無しさん:2006/07/01(土) 21:42:19
あえて言語を特定しないのですね
468デフォルトの名無しさん:2006/07/02(日) 20:55:31
>>454
趣味グラマ的には思いっきり環境依存してる‥‥
class Foo
{
int m_hoge;
int get_hoge() { return m_hoge; }
void set_hoge(h) { m_hoge = h; }
__property int hoge = { read=get_hoge, write=set_hoge };
};
469デフォルトの名無しさん:2006/07/02(日) 23:46:12
>>468
他の環境に移植することが予め無いってわかってるんだったら仕事でも
処理系依存の機能を積極的につかってもいいと思うぞ。
470デフォルトの名無しさん:2006/07/04(火) 19:09:54
スレッド間のフラグとか、めんどくさい時は
外部変数にしちゃってるわ。
471デフォルトの名無しさん:2006/07/05(水) 11:12:03
>>463

プロジェクトの規模が小さいのでは?

まぁ、品質管理が最低なことには変わらんが・・・。
472デフォルトの名無しさん:2006/07/29(土) 20:30:38

473デフォルトの名無しさん:2006/08/19(土) 16:27:01
474デフォルトの名無しさん:2006/08/19(土) 16:28:24
>>472 >>473
保守乙
475デフォルトの名無しさん:2006/08/23(水) 08:51:36
空行,どんな感じで使う?
476デフォルトの名無しさん:2006/08/23(水) 09:05:45







477デフォルトの名無しさん:2006/08/23(水) 09:17:46
>>475
・複数行にわたる宣言(および定義)が連続する場合は
 1行以上の空行で区切りを見つけやすくしておく。
・1行以上を占めるコメントの前には空行を置き、コメントが
 後続のコードに関するものであることを明らかにする。

言葉にするのは難しいな。
478デフォルトの名無しさん:2006/08/23(水) 09:45:59
printf("hello"); と
printf( "hello" ); と
printf ("hello");
479デフォルトの名無しさん:2006/08/23(水) 12:26:32
ケースバイケース
480デフォルトの名無しさん:2006/08/29(火) 15:55:23
基本的に使わない。
関数/メソッドの区切りにのみ使う。
481デフォルトの名無しさん:2006/11/15(水) 13:30:42
EmacsでCのソース書いてるが、コーディングスタイルは
gnu, k&r, bsd, stroustrup, linux 等が設定できる。
我流コーディングスタイルの癖を付けたくないんでとりあえず
好みに近いstroustrupを選んでるが・・・


gnuスタイルはキモイ。(さすがrms...)
482デフォルトの名無しさん:2007/02/06(火) 17:04:51
if (ptr != NULL) ...;
if (ptr == NULL) ...;

if (ptr) ...;
if (!ptr) ...;
はどっちがいい?
483デフォルトの名無しさん:2007/02/06(火) 17:49:23
他人に見せる可能性がある場合は後者。
484483:2007/02/06(火) 17:54:12
じゃなくて前者。ごめん。
485デフォルトの名無しさん:2007/02/06(火) 18:44:13
if (ptr) が好きなんだけど ptr != NULL の方が多数派なんだよなぁ
486デフォルトの名無しさん:2007/02/06(火) 22:10:20
>>482
プログラムの動作を口に出して読んでみれば、前者のほうが自然だと感じられる。
487デフォルトの名無しさん:2007/02/06(火) 23:37:07
if (ptr != NULL)   if ptr is unequal to NULL
if (ptr == NULL)   if ptr is equal to NULL
if (ptr)           if ptr is valid
if (!ptr)          if ptr is invalid
488デフォルトの名無しさん:2007/02/06(火) 23:41:12
ヌルで無いことと valid であることは同値ではないぜ。
489デフォルトの名無しさん:2007/02/06(火) 23:47:22
だから?
490デフォルトの名無しさん:2007/02/06(火) 23:57:56
if ptr points something
if ptr points nothing
491デフォルトの名無しさん:2007/02/07(水) 00:33:08
で?
492デフォルトの名無しさん:2007/02/07(水) 02:04:50
if(ptr->isValid())
isValidはNULLとかinvalidポインタでも動くようにstaticメンバ関数で
493デフォルトの名無しさん:2007/02/07(水) 02:26:16
それどうやって使うの?
494デフォルトの名無しさん:2007/02/07(水) 02:40:02
>>493
おまいが訊いてのは使い方? それとも作り方?
使い方なら、そのまんま >>492 の通りなんだが。

って、よくみたら>>492はアホなこと書いてるな。
staticメンバ関数にしたら意味がねぇだろが。
495デフォルトの名無しさん:2007/02/07(水) 05:06:30
だから?
496デフォルトの名無しさん:2007/02/07(水) 06:08:34
このナポリタンは高速移動をしていないと言える。
497デフォルトの名無しさん:2007/02/07(水) 06:11:08
それからどした?
498デフォルトの名無しさん:2007/02/07(水) 11:25:10
>>492
ヌルに -> した時点で未定義動作。
499デフォルトの名無しさん:2007/02/07(水) 20:56:17
>>498
そんなことはないだろ。これは普通に動くし。
#include <iostream>
class null {
public:
bool isnull() const {return this;}
};
int main() {
null* ptr;
if(ptr->isnull()) {
std::cerr << "null !" << std::endl;
}
return 0;
}
500デフォルトの名無しさん:2007/02/07(水) 21:13:48
いいえ、未定義です。あなたの処理系が動くようなコードを偶然吐いているだけです。
501デフォルトの名無しさん:2007/02/08(木) 02:25:41
>>499
NULLどころか、ポインタを初期化すらしていない件について。
502デフォルトの名無しさん:2007/02/08(木) 05:48:05
馬鹿な>>499がいるスレはここですか?
503デフォルトの名無しさん:2007/02/08(木) 10:38:16
499のコンパイラは警告すらはかないのか
504デフォルトの名無しさん:2007/02/08(木) 13:52:54
>>499の書いたプログラムは怖くて実行できません。
505デフォルトの名無しさん:2007/02/08(木) 15:24:24
初期化しないポインタがヌルにならないのは大問題のような気がしてきた
Javaみたいにぬるぽガッってなってくれたほうが安心だな
499みたいなのを見るとそう思う。
506デフォルトの名無しさん:2007/02/08(木) 15:53:19
>>505
C/C++ の本質は高級アセンブラだから、パフォーマンスが犠牲に
なるようなことは原則として勝手にやらない。
まぁ、お前みたいなヤツはJavaなりC#なりでも使ってなさいってこった。
507デフォルトの名無しさん:2007/02/08(木) 18:36:29
C++ならスマポ使うから無問題
508デフォルトの名無しさん:2007/02/08(木) 21:13:22
そうか、そうなのか。うーん、なるほど。
509499:2007/02/08(木) 21:44:32
>>500
ああ、ごめんごめん。ptr = 0 の初期化と return this == 0 に直してね。
それはともかく、単純なクラスの非静的メンバなら、暗黙の this 引数を 0 に
しても呼び出せるのは自明だ、ということが言いたかったんだけど、それ
すらも未定義ということ?
510デフォルトの名無しさん:2007/02/08(木) 21:48:10
コンストラクター

コンスという名前のトラクター
511デフォルトの名無しさん:2007/02/08(木) 21:49:57
どうなんだろうね。
どっちにしてもお行儀が良いとは言えないけど。
512デフォルトの名無しさん:2007/02/08(木) 21:51:04
>>509
最初から未定義だって言ってるだろ。
513デフォルトの名無しさん:2007/02/08(木) 21:59:13
>>509
ほぼすべて環境で問題なく動作すると思われるが、
それとこれとは関係ない話で、未定義は未定義。
514デフォルトの名無しさん:2007/02/08(木) 22:06:16
>>499のように動かない実装上の理由は想像しにくいが、
ある日ある時ある環境でカーネル破壊して落ちてもそれは「正しい動作」となる。
未定義というのはそういうことじゃないかね。
515499:2007/02/08(木) 22:55:56
>>513-514
そうだね。つまらんことに粘着してスレ違いネタを続けてすまんかった。
516デフォルトの名無しさん:2007/02/08(木) 23:44:52
>>515
やっぱりお前は馬鹿だな。
517デフォルトの名無しさん:2007/02/09(金) 08:25:54
>>506
でも現実として、「変数は必ず初期化しろ」みたいなTipsが解説書に書かれる訳で、
パフォーマンスの為にコンパイラが自動でやらないことを
結局プログラマがコードで書くのは馬鹿馬鹿しい気がするよ。
518デフォルトの名無しさん:2007/02/09(金) 08:57:01
>>517
初期化してない変数を勝手に 0 で初期化して
実行時コストを伴いながらプログラマの選択肢を
奪うことには議論の余地がある。

言語デザインの面で考えるのであれば、
未初期化な変数定義を認めないのが正解だと思う。
519デフォルトの名無しさん:2007/02/09(金) 11:04:28
「変数は必ず初期化しろ」の類はナンセンスにしか思えない

そもそも未初期化でバグるようなコードは
必要な前処理を怠っているという点でそれ自体が潜在的なバグであって、
盲目的な初期化をさせたところで、(必要な前処理をやっていなければ)
バグの顕在化を遅れさせるだけだと思う

あとこういうケースで初期化させるのも無意味だと思う
int a /* = 0 */;
if (ある条件) {
  長い処理;
  a = 何か;
} else {
  他の処理;
  a = 違う何か;
}
ここでaを使う;
520デフォルトの名無しさん:2007/02/09(金) 12:15:43
int a = ある条件 ? (長い処理 , 何か ) : (他の処理 , 違う何か);
ここでaを使う
521デフォルトの名無しさん:2007/02/09(金) 16:03:45
もっと簡単にローカル関数を定義できれば便利なんだけどと
思うことはよくある。
522デフォルトの名無しさん:2007/02/09(金) 19:10:06
別に今のままでも支障はないんだけど、
初期化不要宣言をしたときだけ
初期化されない仕様でもいいかもしれない。
523デフォルトの名無しさん:2007/02/09(金) 19:27:23
>>520
長い処理って書いてるやん。お前それ一行で書く気かよ。
第一whileとかが入ってたら展開できないぞ。
関数化するってのは無しな。
524デフォルトの名無しさん:2007/02/10(土) 01:19:41
>>523
なんで無しなの?
関数にしとけばaをconstにできるし、
長い処理ってのはそれ自体のコストが大きい可能性が高いから、
一回だけの関数呼び出しのコストなんて気にする状況じゃないと思うが。
525デフォルトの名無しさん:2007/02/10(土) 02:04:51
関数化してもしなくても単純に読みづらい。
最後の値が代入されると直感的に理解しにくい式になることが予測できる。
526デフォルトの名無しさん:2007/02/16(金) 12:35:32
ヘッダーで using namespace std するのは、よくないよね。
527デフォルトの名無しさん:2007/02/16(金) 12:36:18
うん。
528デフォルトの名無しさん:2007/02/16(金) 12:59:28
int *p1, *p2, *p3;
529デフォルトの名無しさん:2007/04/16(月) 02:32:39
int a;
{
int a;
/*hogehoge no syori*/
}

なんてのはよく使う
530デフォルトの名無しさん:2007/04/16(月) 17:25:11
shadowは嫌いだなあ
531デフォルトの名無しさん:2007/06/08(金) 04:18:53
保守age
532デフォルトの名無しさん:2007/06/08(金) 05:05:16

533デフォルトの名無しさん:2007/06/09(土) 07:52:10
プロパティ欲しい。
534デフォルトの名無しさん:2007/06/09(土) 16:47:05
結局protectedってどうやって使ったらいいんでしょう(´・ω・`)
friendはファクトリクラスからのみ作成するようにする場合に保険の意味も兼ねて
テンプレートのファクトリクラスに対して指定してつかってますが…
535デフォルトの名無しさん:2007/06/09(土) 16:57:00
>>534
必要だと思うまで使わなくていいよ。
536デフォルトの名無しさん:2007/06/09(土) 21:51:07
ポリシークラスのデストラクタはprotectedにすべし、とかあったような
537デフォルトの名無しさん:2007/06/09(土) 22:28:36
自然とprivate基本じゃなくてprotected基本で作るようにならねえか?
538デフォルトの名無しさん:2007/06/09(土) 22:30:16
>>537
そんなバカな。カプセル化壊れまくりんぐじゃねーか。
539デフォルトの名無しさん:2007/06/10(日) 13:27:45
>>537
中卒溶接工童貞DQNハッケソ!
540デフォルトの名無しさん:2007/06/10(日) 16:21:33
まだカプセル化なんて、宗教信じてんのか。
醍醐味は、ポリモーフィズムとdynamic_cast
〜COM/ActiveXだろ。

日本で書かれた糞本読んでるとそうなります
541デフォルトの名無しさん:2007/06/10(日) 23:31:38
それもJava教っぽいなあ
542デフォルトの名無しさん:2007/06/14(木) 01:33:36
コンストラクタで初期化リストを書き並べるのは、どう書くのが正しいんだろうか?

class Hoge {
Foo foo_;
Bar bar_;
FooBar foobar_;
public:
Hoge(Foo const& foo, Bar const& bar)
: foo_(foo)
, bar_(bar)
, foobar_(foo, bar)
{
// 処理
}
};

自分はこんな感じでコロンとカンマを並べてるんだが、果たして変だろうか
543デフォルトの名無しさん:2007/06/14(木) 02:10:16
英文を見慣れた人間にとっては、単純に気持ち悪い。
日本語で読点を先頭に書くようなもんだからね。
544デフォルトの名無しさん:2007/06/14(木) 03:08:49
キモいんだけど、このスタイルのほうが理に適ってるんだよねぇ。
545デフォルトの名無しさん:2007/06/14(木) 04:18:26
外人でも:先頭で書く人いるから英文云々はあまり関係ないんじゃないの?
546デフォルトの名無しさん:2007/06/14(木) 04:34:38
>>545
>544
547デフォルトの名無しさん:2007/06/14(木) 12:08:22
>>546
>547
548デフォルトの名無しさん:2007/06/14(木) 23:13:12
最近 カプセル化 って言葉を発することが恥ずかしいと
思うのだが、
俺だけ?
549デフォルトの名無しさん:2007/06/14(木) 23:17:20
なんでだよ。
550デフォルトの名無しさん:2007/06/16(土) 11:15:09
行末のコメントってどうしてますか?
タブで揃えた場合、タブのスペース数が変わるとずれてしまうし・・・
551デフォルトの名無しさん:2007/06/16(土) 11:25:16
揃えようとするのが間違い。
しかし世の中にはおかしな風習が残っている会社もあって、
行内コメントは必ず45カラムから始めて79カラムまでと決められていたりもする。
552デフォルトの名無しさん:2007/06/16(土) 14:21:04
>>550
タブはコードの前までしか使わない。
(ここだけタブ)x: (ここにはスペース) // コメント

まあ、手動でスペース調整してコメントの位置そろえても、
最近は Visual Studio の整形機能とかでスペース消されちゃうけどね。
>>551 の言うとおり、そろえようとするのが間違いかと。
553デフォルトの名無しさん:2007/06/17(日) 16:29:39
そこでマクロですよ
554デフォルトの名無しさん:2007/06/17(日) 16:30:46
そもそも行末にコメントを置かなければいいわけだ。
555550:2007/06/17(日) 17:19:59
なるほどー。
色々アドバイスありがとうございます。
556デフォルトの名無しさん:2007/06/22(金) 11:36:38
>>544
配列の初期化や enum の最後に余分なカンマがあってもいいのは
何でだと思う?
(enum のは C だけか。)
557デフォルトの名無しさん:2007/06/22(金) 22:36:06
>>556
なんか例えが変な気が。

enum の最後とかは、
例えばスクリプトで自動生成したりするときに、
最初または最後の行だけ特別扱いしなくてもいいから。

>>544 が言いたいのは、
, が行頭にある方が、
前の行から続いてることがわかっていいんじゃね?

ってことでは。
558デフォルトの名無しさん:2007/06/22(金) 23:11:13
話が逸れるが

関数のオーバーロードとかtemplate引数の数で擬似オーバーロードとかなら
Boost.Preprocessorで量産したりするけど、
enumを自動生成したりする機会なんてあるかな。

コード上ではほとんどトークンの列挙だけだから、
普通手打ちでやるんじゃね?
559デフォルトの名無しさん:2007/06/23(土) 02:24:36
>>558
なんかのデータベースからデータを抽出して、そいつらの ID を列挙するときとか。
560デフォルトの名無しさん:2007/06/24(日) 09:53:20
Boost.Preprocessorってググったんだけど、どっか
詳しいページない?
561デフォルトの名無しさん:2007/06/24(日) 11:16:38
>>558
手打ちでやるにしても、最後の行だけ特別扱いってのを気持ち悪がる人いるよ。
562デフォルトの名無しさん:2007/06/24(日) 15:09:48
563デフォルトの名無しさん:2007/11/07(水) 21:08:54
int *a, b, *c, &d; // OK?
564デフォルトの名無しさん:2008/02/24(日) 17:29:08
#include ""は.cppに#include<>は.hファイルに書くでOK?
565デフォルトの名無しさん:2008/02/24(日) 17:31:02
NG
566デフォルトの名無しさん:2008/02/24(日) 17:48:04
仕事でSymbian使い始めてからSymbianのコーディングスタイルに毒された。
引数はaFooで内部変数はiFooとか。
567デフォルトの名無しさん:2008/02/24(日) 18:07:47
>>564
標準インクルードファイルは<>で括って、ローカルインクルードファイルは""で括る。
それらの中間に当たる、非標準の汎用インクルードファイルやプロジェクト外の共通インクルードファイルは適宜決めること。
568デフォルトの名無しさん:2008/02/25(月) 00:38:01
ふむふむ
569デフォルトの名無しさん:2008/02/25(月) 12:22:58
標準のいんくを""でくくってもOKだったり、検索パスも同じ?機能的な違いが判らん。
570デフォルトの名無しさん:2008/02/25(月) 12:35:27
>>569
""で括った場合は、先ずカレントディレクトリを探す。それ以外は<>と同じ。

つまり、間違って"stdio.h"なんてファイルを作ってカレントに置いたとしても、
<stdio.h>でインクルードしていたらそんなの関係ない。

汎用ライブラリのインクルードみたいなものは、<>で括ってサーチパスに追加するのが無難。

厄介なのは、自分のプロジェクト外だが標準ではなくて、更新の可能性もありそうなファイルかな。
仮に、プロジェクトから見て"../common/include/someHeader.h"だるとして、次のどれかを採用することになると思う。
・#include <someHeader.h>してサーチパスに"../common/include"を追加。
・#include <include/someHeader.h>してサーチパスに"../common"を追加。
・#include "../common/include/someHeader.h"する。
# 絶対パス指定はするべきではない。
Unix系なら、こんな手段もある。
・#include "common/someHeader.h"して、ln -s ../common/include commonする。
571デフォルトの名無しさん:2008/02/26(火) 01:18:53
>>570
一般的には処理系依存だよ。どのコンパイラの解説をしてくれているのか明示してくれ。
572デフォルトの名無しさん:2008/02/26(火) 04:32:09
一般的にはどの処理系でも当て嵌まりそうだが。つーか、最後の一行についてはunix系と明示しているし。
573デフォルトの名無しさん:2008/02/26(火) 07:27:29
>>572
「どの処理系にでも〜」っていう根拠は何かあるの?
規格にあるのは、 "" に対する処理系依存の検索で見つからなかったときには
<> と指定されたかのように処理しなおすこと。そして <> の検索方法もまた処理系依存。

あと、最後の一行がそれより上の説明をUnix系の話に限定するわけじゃないだろ。
574570:2008/02/26(火) 13:53:08
>>571
一般的なコンパイラの話。
私の知る限り、よく使われるコンパイラで大きく逸脱しているものは無いと思うので。
違う例があるなら、指摘してくれれば嬉しく思います。
575571:2008/02/27(水) 00:30:15
>>574
とりあえず gcc は明示的にオプションで指定されない限りカレントディレクトリを
探したりしない。 -iquote なんてオプションもあって、 >570 とはまるで挙動がちがう。
http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html

gcc を含めずに「一般的なコンパイラ」というのはさすがにあんまりだと思うよ。
576デフォルトの名無しさん:2008/02/27(水) 00:47:59
一般的なコンパイラって何?
577デフォルトの名無しさん:2008/02/27(水) 00:59:10
gcc が違うとなると、それも聞きたいな。
578デフォルトの名無しさん:2008/02/27(水) 01:50:16
gccでは、""で括ったインクルードファイルをカレントから探してくれないと言う
素っ頓狂なことを>575は言いたいらしい。
では聞くが、カレントにあるインクルードファイルをインクルードするにはどうしたらいいのかね?
579デフォルトの名無しさん:2008/02/27(水) 01:59:07
>>578
カレントにあるソースをコンパイルするとか、 -I. を指定するとか。
リンク先読んでないの?
580デフォルトの名無しさん:2008/02/27(水) 02:00:11
なんだろ、>575=>571は単純な読み違いをして駄々を捏ねているのか、
それともなにやら深い勘違いをしているのだろうか。或いは単純に、
>570が「カレントファイルのあるディレクトリ」を「カレントディレクトリ」としたことが気に入らないのだろうか
581デフォルトの名無しさん:2008/02/27(水) 02:01:02
あーなんだ、3行目だったかw
582デフォルトの名無しさん:2008/02/27(水) 02:25:33
なんだ、そういうことか。その意味でカレントディレクトリと言うのはやめといたほうがいいよ。
http://www.google.co.jp/search?q=%e3%82%ab%e3%83%ac%e3%83%b3%e3%83%88%e3%83%87%e3%82%a3%e3%83%ac%e3%82%af%e3%83%88%e3%83%aa

で、「カレントファイルのあるディレクトリ」を検索してくれないコンパイラなら、
一気にマイナーになるけど、ルネサスのコンパイラがそう。こっちは逆に
特に指定しない限り一般的な意味での「カレントディレクトリ」しか見ない。
583デフォルトの名無しさん:2008/03/25(火) 23:00:17
unsigned int はどんな風にtypedefしてますか?
1. typedefしない
2. BSD風に u_int
3. Windows風に UINT
4. その他?
584デフォルトの名無しさん:2008/03/25(火) 23:06:29
1. typedefしない
585デフォルトの名無しさん:2008/03/25(火) 23:23:26
必要ならstdintを使う。それ以外は1.
586デフォルトの名無しさん:2008/03/26(水) 00:23:09
4. intを省略する。
static const unsigned FooVal = 0;
unsigned func(unsigned foo) {return foo;}
for (unsigned ic = 0; ic < sizeof(array) / sizeof(* array); ++ic) {
unsigned rtn = func(array[ic]);
std::cout << unsigned(sizeof(rtn));
}
// などなど
587デフォルトの名無しさん:2008/03/26(水) 11:28:51
<windows.h>をインクルードしていたらUINTは使うけど、
そうでないときはunsignedにする。自分でtypedefはしない。
588デフォルトの名無しさん:2008/03/26(水) 20:35:47
サイズが予測できるべきならcstdintの適当な型。
メモリに依存する値、または数や大きさを表すならstd::size_t。
大きさの上限を仮定すべきでないならunsigned。
longは使わない。
589583:2008/03/26(水) 23:54:12
皆さん、ありがとうございます。
やはり、統一的な定義はないのですね。
stdintは使っていたのですが、普通の数値までいちいちサイズ指定するのも変かと思いまして。
int省略でいこうと思います。(今まで省略できることを知らなかったなんて言えないよな…)
590デフォルトの名無しさん:2008/03/27(木) 01:24:06
>>589
int の省略は一般的じゃないから、あんまりおすすめできないなー。
省略できるのを知らない人はざらに居るよ。初めて目にした人を
いちいちびっくりさせるのはよくないと思う。

サイズ指定するのが変だと思うなら、 unsigned int って書いても
問題は解決してるでしょ。
591デフォルトの名無しさん:2008/03/27(木) 07:43:36
でも、unsigned short int と書く香具師は少ない。
592583:2008/03/27(木) 23:23:24
>>590
ついこの間までWindowsばっかりでUINT慣れしてたせいか、長く感じてしまうんですよ。
たしかにunsigned単体って見かけないし、4文字しか減らないし、
省略しない形に慣れた方がいいような気がしてきました。
593デフォルトの名無しさん:2008/03/27(木) 23:23:47
そもそもshort intと書かない
594デフォルトの名無しさん:2008/03/27(木) 23:26:01
typedef unsigned uint;
595デフォルトの名無しさん:2008/03/27(木) 23:36:16
C++で、void a(void)とvoid a()はどっちがお勧め?
596デフォルトの名無しさん:2008/03/28(金) 00:38:01
void a()
コンストラクタも同じ表記だから
597デフォルトの名無しさん:2008/03/28(金) 00:41:24
どっちを呼びたいの?
598597:2008/03/28(金) 00:55:47
_| ̄|○ >596 に一票入れとく。
599デフォルトの名無しさん:2008/03/28(金) 02:19:32
a(void)きもい→a()にしようって過去があるからa()を推す。
600595:2008/03/28(金) 12:39:12
>>596-599
回答ありがとう。満場一致でvoid a()なのね。俺もvoid a()に統一するよ。
Cからの流れで(void)って書いてただけだから、書かなくていいC++では違和感を常々感じてましたです。
601デフォルトの名無しさん:2008/03/28(金) 22:06:19
その表現には違和感を覚えるな。
602デフォルトの名無しさん:2008/04/06(日) 20:30:40
頭の頭痛が痛くなってしまうな。
603デフォルトの名無しさん:2008/05/10(土) 17:20:40
if( Func( GetUnko( a ), reinterpret_cast< void * >( b[ c + d ] ) ) );

こんな感じの書き方が好きです。
604デフォルトの名無しさん:2008/05/11(日) 13:43:30
>>600
自分はa(void)派。
理由は一目で関数呼び出しと区別できるからかな。
そんなに強い理由じゃないし、こだわりはあまりないけどね。
605デフォルトの名無しさん:2008/05/11(日) 13:47:03
>>603

あ〜自分もそう。一時変数はなるべく作りたくない。
でも意味がわかりにくいと思ったら、一時変数作るか関数にする。
606デフォルトの名無しさん:2008/05/11(日) 16:58:42
>>604
やめて。コンパイル通らないから
607デフォルトの名無しさん:2008/05/11(日) 19:17:32
そうなの?どの環境で?
608デフォルトの名無しさん:2008/05/11(日) 22:07:01
C++
609デフォルトの名無しさん:2008/05/11(日) 22:09:55
>>608
C++ の関数宣言でも (void) は引数リストとして有効だよ。

C とは違って typedef された void は受け付けないらしいが。
610デフォルトの名無しさん:2008/05/12(月) 01:37:52
あら そうやった?
VC++のバージョンとが上がると急にエラーになったりする
ことになるから、
書かない方がいいと思うよ<(void)
611デフォルトの名無しさん:2008/05/12(月) 07:36:49
何か勘違いしている悪寒。
612デフォルトの名無しさん:2008/05/12(月) 07:54:49
>>610 ねーよ。
613607:2008/05/12(月) 20:41:19
>>610
ないな。いまのところ。6〜9はOKと思われ。
言語仕様は正確に知らないが。
614デフォルトの名無しさん:2008/05/12(月) 21:03:09
8.3.5 関数
...
<<仮引数宣言節>>が空の場合、その関数は実引数を受け取らない。
仮引数並びが(void)の場合、空の仮引数並びと同等とする。...

だそうだ
615デフォルトの名無しさん:2008/05/13(火) 01:42:22
そうか俺の勘違いだった。すまぬ。
互換上の仕様だけど今後も残りそうな仕様だな
616デフォルトの名無しさん:2008/05/13(火) 12:18:02
(void)のコードが山のようにあるからそうそう消せないだろうし、弊害がるわけでもないしって所じゃないかな。
617デフォルトの名無しさん:2008/05/13(火) 12:42:46
>606 は、604が戻り値を省略したからコンパイルが通らないと主張しているのだと思ってた。
618デフォルトの名無しさん:2008/05/13(火) 13:08:24
>>617 それだと戻り値省略で void になるとかいう話になっちゃうだろ。さすがにそれは無い。
619デフォルトの名無しさん:2008/05/31(土) 17:55:53
仮引数の命名規則というものを見たことが無いのですが、
普通は考えないものなのでしょうか?

例えば引数で値を返す関数の場合
bool func( int* val_ ){
 *val_ = 0; // 取り合えず 0
 int val;

 .. ローカル変数 val をいじる処理 ..

 *val_ = val; // 返却
return true; // 成功
}
みたいにすると分かりやすいと思っているのですが
こんな事考えてるのは自分だけ?

どうでも良いけどメンバ変数は m_ 派です
620デフォルトの名無しさん:2008/05/31(土) 19:15:58
引数はたまたま宣言場所がちょっと上の方にあるだけのローカル変数みたいな感じだからなぁ。 ローカル変数と全く同じ命名だわ。
621デフォルトの名無しさん:2008/05/31(土) 19:29:57
仮引数の命名規則と実装の話がどう繋がっているのかわからない。

val_が関数利用者側から意図を汲みやすい名称かという話なら
意味不明ぐらいの感想しかない。ヘッダのみ提供ならなおさら。

val_が失敗成功に関わらず0で初期化される、成功時に結果が設定されるという話なら
ヘッダに利用上の注意としてコメントを残しておくだけだろう。
622デフォルトの名無しさん:2008/05/31(土) 19:52:01
失敗なのに0クリアされるような関数は嫌いだ。
623デフォルトの名無しさん:2008/05/31(土) 23:20:10
ちゃんとコメント書くからそんなことする必要ない
dest という変数名は使うことはあるけど
624デフォルトの名無しさん:2008/06/01(日) 10:35:46
>>621
実装者視点の話と思うよ。(関数利用者側のメリットはなさそう)
619の例だとローカル変数と衝突しなくてすむ。

自分は前はp_(pはパラメータの意)をつけたり
619のように最後に_つけたりしてたけど
今は何もなし(ローカル変数と同じ)だな。
ちなみに_最後につける方法はメンバ変数にする場合も見かけるね。
625デフォルトの名無しさん:2008/06/01(日) 11:20:04
関数のプロトタイプの一覧だけ渡されたときに、仮引数にわけの分からん修飾がしてると気持ち悪い。
626デフォルトの名無しさん:2008/06/01(日) 11:34:07
そんなの宣言と実装で名前変えられるじゃん。
実装は接頭辞付きって規則で統一した上で。
627デフォルトの名無しさん:2008/06/01(日) 12:06:18
果たしてそこまでして接頭辞をつけるほどの利点はあるのだろうか
628624:2008/06/01(日) 13:53:55
他人のソースを読むときに、あったほうがいいと思ったことがある。
でも関数が長いとか変数名が変とか、設計上の問題のせいかも知れない。

設計が良い場合は思わなかった気がするな。
629デフォルトの名無しさん:2008/07/31(木) 02:40:40
ほす
630デフォルトの名無しさん:2008/08/27(水) 13:04:03
++i;
i++;
どっち
631デフォルトの名無しさん:2008/08/28(木) 02:08:49
i++;
632デフォルトの名無しさん:2008/08/28(木) 02:19:05
演算子多重定義があるから++i;
633デフォルトの名無しさん:2008/08/28(木) 21:37:45
>632
はしょりすぎじゃね?
i++ だとインクリメント前の値を返す無駄な処理が発生する→最適化されたら同じじゃね?
→演算子多重定義があるから一般には最適化できない
634デフォルトの名無しさん:2008/08/28(木) 21:57:51
→それに合わせて、組込型であることが明白な状況でも++i使うようになる
635デフォルトの名無しさん:2008/08/28(木) 23:22:15
後置である必要がなければ前置を使おう
636デフォルトの名無しさん:2008/08/29(金) 06:15:46
203++;
637デフォルトの名無しさん:2008/09/07(日) 02:09:53
つまりC++ではなく++Cだと言いたいわけだね
638デフォルトの名無しさん:2008/09/07(日) 03:19:20
もともとCへのトランスレータだったから、返ってくるのがインクリメント前のCなのが正しいのだ。
639デフォルトの名無しさん:2008/09/07(日) 03:25:48
++C++
640デフォルトの名無しさん:2008/10/05(日) 01:21:30
>>639
error C2105: '++' には左辺値が必要です。
641デフォルトの名無しさん:2008/10/05(日) 13:33:11
Д-C-Д
642デフォルトの名無しさん:2008/10/05(日) 13:50:32
+(+C++)
643デフォルトの名無しさん:2008/10/26(日) 01:53:44
644デフォルトの名無しさん:2008/10/26(日) 01:56:27
関数ポインタの配列を返す関数へのポインタを引数に取り、
関数ポインタの配列を返す関数ポインタの配列を返す関数について、
どのように書くのがよいですか?
1. typedef使う場合
2. typedef使わない場合
でよいので記述せよ。
645デフォルトの名無しさん:2008/10/26(日) 02:17:14
宿題スレ行け
646デフォルトの名無しさん:2008/10/27(月) 00:03:46
>>645
ぷぷ(w
解らないやつ発見(w
647error C743: 名前がありません。:2008/10/27(月) 00:05:10
「デフォルトの名無しさん」ってだっさくない?
ダサいよ。うんダサい。

ということで、
  [error C743: 名前がありません。]
にしようぜ。というか、しろ。

さっさと変更依頼だせ。
648デフォルトの名無しさん:2008/10/27(月) 00:09:42
ここ自治スレとかの類ではないよ。
649error C743: 名前がありません。:2008/10/27(月) 03:17:17
>>645,>>646
痛いな、関数は配列を返せません。
void (* (* (* function(void (* (* var(void)) [])(void)) [])(void)) [])(void);
当然、配列返そうとしているから、間違えだけど。
void (* (* (* functionz(void (* (* var(void)) [])(void)) [])(void)) [])(void);
たしかに、この名前いいな。
650デフォルトの名無しさん:2008/10/27(月) 14:11:35
関数は配列を返せるだろ。
651デフォルトの名無しさん:2008/10/27(月) 14:43:29
配列の先頭要素を指すポインタなら返せる
それで充分かどうかは場合による
652デフォルトの名無しさん:2008/10/27(月) 14:55:05
十分ていうより配列なんか値で返すのは非効率じゃね?
でも、構造体でくるんだら値でも返せる。
653デフォルトの名無しさん:2008/12/28(日) 16:53:21
上の方でprotectedの変数アクセス云々の話があったが

例えばsinを子に公開しているクラスがあったとして、
class A
{
protected:
 static double sin[0x10000];
};
初め高速化の為に配列で準備していたのをWindowsCEなんかの
低リソース環境に移植するために
class A
{
protected:
 static double sin(double);
};
にしたくなった。そいう時子class全域に広まる影響はどうするんだろう?
初めから、関数アクセスに限定してれば何にも危惧すること無いのにな。

話は変わるが、趣味範囲でプログラムを書くとき
class T
{
 int value;
public:
 int Value(void)const;  //getter
 int Value(int);      //setter
};
見たいな感じでよくね?と思う。まず、setterとgetterを間違えることないし、
テンプレート関連で多少融通が効いて便利。

あと、Mozila関連の規約はなかなか面白いね。
https://developer.mozilla.org/Ja/C___Portability_Guide
654デフォルトの名無しさん:2008/12/28(日) 18:00:48
>>653
その下駄は兎も角、雪駄は何故intを返すんだ?
655デフォルトの名無しさん:2008/12/28(日) 18:10:14
元の値じゃね?
656デフォルトの名無しさん:2008/12/28(日) 19:21:51
T a;
int b;
b=a.Value(5)+3;
てな事をするため。
まぁ、T&を返してもいいんだけど。
b=a.Value(5).Value()+3;
ってなんだよなぁ。
657デフォルトの名無しさん:2008/12/28(日) 20:44:08
>>653
protected メンバ変数なんて使わない。
広まる影響については、自業自得ということでがんばれとしか言えない。

getter/setter にルールを決めるなんてナンセンス。
普通に、クラスに必要なインターフェースをクラスごとに考えろ。

Mozzila のそれはいい加減に古すぎるし、大量のコンパイラを
想定する必要なんてないことがほとんど。
658デフォルトの名無しさん:2008/12/28(日) 21:12:44
そもそも下駄雪駄を無駄に作るのは、privateの意義を半分くらい失うってことだしね。
659デフォルトの名無しさん:2008/12/28(日) 21:13:55
もっずぃら
660デフォルトの名無しさん:2008/12/28(日) 21:33:45
Mozilla 、な。
661デフォルトの名無しさん:2008/12/28(日) 21:46:39
オープンソースではとりあえず private にされるとめんどい。
あるクラスを使っている別のファイルでその変数にアクセスしたい時、
setter/getter を作らなければならなくなるので、
その別ファイルだけの diff だけではなく、クラスのファイルの diff も必要になる。
662デフォルトの名無しさん:2008/12/28(日) 21:48:51
なんでこうカプセル化を堂々とぶち壊すアホが後を絶たないかね。
663デフォルトの名無しさん:2008/12/28(日) 22:08:14
カプセル化のメリットを理解してないからじゃね?
664デフォルトの名無しさん:2008/12/28(日) 22:12:25
>>661
>>653見たいな事になったらどうすんの?
例えば、時間を管理するとしてlongの変数一つで扱うか
hour,minuts,secondと3つに分けて扱うとか
いくらでもprivate領域は変えられるんだからね。
665デフォルトの名無しさん:2008/12/28(日) 22:53:31
誰でも若い時分には他人の培ってきたノウハウに対して懐疑的になり、
例えばグローバル変数を利用してピンポイントの効率化を行なって悦に入り、
そうはしない他人よりも自分の方が能力があると錯覚してしまう時期があるもんだよ。
斯く言う私も、10代の頃はそうだった。
666デフォルトの名無しさん:2008/12/28(日) 23:09:32
カプセル化のメリットよりも、パッチを投げにくいデメリットのほうがでかいことがある。
カプセル化のデメリットを考えずにメリットだけを信じるというのは思考の停止である。
偉い人が唱えたアイデアを盲信せずに、自分なりにメリット、デメリットを考えてみる。
そういうステップを踏んでみると、メリット、デメリットの「度合い」というものも状況によって異なることに気付けるはずだ。
あえてカプセル化を採用しないコーディングスタイルもありうるかもしれない、と気付けるはずだ。
>>662-664 君達はそこまで考えたことがないのだろう。


カプセル化至上主義ですか…。try{} catch{} のエラー処理は常に使用すべきですか?
667デフォルトの名無しさん:2008/12/28(日) 23:10:58
>>665 そういうステップを踏んできたのならいいだろうね。
668デフォルトの名無しさん:2008/12/28(日) 23:16:46
つまり、自分勝手な改修を行ないたいがためにカプセル化のデメリットがあるとほざいているのか。
もっと真っ当な解決策がそこにあるかもしれないのにそれを模索しようとしない姿勢こそが思考停止ではないのかな?
669デフォルトの名無しさん:2008/12/28(日) 23:17:00
オープンソースにおいて、
関数は可能な限り private メンバ関数にすべきですか?
それとも全て public メンバ関数にすべきですか?
メリット、デメリットを一緒に教えてください。
自分なりの解答はありますが、皆さんの意見を教えてください。
できれば議論の形になっていただけるとうれしいです。
670デフォルトの名無しさん:2008/12/28(日) 23:19:38
オープン開発なら、能う限りprivateにすべきだと思うがね。
671デフォルトの名無しさん:2008/12/28(日) 23:28:21
いや、オープンとか関係ないから。
672デフォルトの名無しさん:2008/12/28(日) 23:40:19
>>661
その理屈で public にしてるとさ、元のクラス側の実装を変更しようと思った時には
逆に使ってる側の別ファイルも合わせて書き換えないといけなくなるんでしょ?

詭弁だよ。もしくは元クラスを書き換える可能性を無視した、浅はかで自分勝手な考え。
673664:2008/12/29(月) 08:00:55
>>666
昔、嫌々VB6.0で組まされたことがある。それもチームで。
アレには、Classとモジュールと言うのがあって一応カプセル化は
できるようにはなってんだ。一つの規約として「変数だけはpublicに
するな」を設けた。しかし、メンバーのレベルが低すぎて勝手に変数共有。
そしてカプセル化が破しどこで勝手に変更されてるのか分からない。
依存コードの除去に苦労したよ・・・。
あんな事2度とごめんだ。

オプソでも似たようなもん。勝手に変数共有なんかされるとみんなが困る。
人のことを考えろよ。
674デフォルトの名無しさん:2008/12/30(火) 11:38:17
>>666
様々な試行錯誤を経てカプセル化については メリット>>>デメリットという結論なんだな。
俺も昔はメンバ変数はprotectedで勘弁してよって思ってたが、今ではしっかり設計をすればprivateでokであることが解ってきた。
諦めてカプセル化を壊すことこそが思考停止だとおもう。もう少し設計を見直すべきだな。

カプセル化を壊すのは設計が妥当ではないといういい指標となると思う
675デフォルトの名無しさん:2009/01/10(土) 11:08:35
メソッドは基本public。理由があればprivate/protected
676デフォルトの名無しさん:2009/01/10(土) 11:50:10
俺は必要になるまではなんでもprivateだな。
677デフォルトの名無しさん:2009/01/10(土) 14:55:09
外にサービスを提供するのがpublic
内部で使うものはprivate
カスタマイズに使うものはprotected
678デフォルトの名無しさん:2009/01/17(土) 18:58:19
非公開から公開は簡単。逆は難しい。
だから最初に公開するものはとっても悩む。

他人が使うものを作ると実感する。
679デフォルトの名無しさん:2009/01/17(土) 20:46:29
提供されているクラスで(こっちは手を入れれない)でなんでこれが
privateなんだよってことがよくある。
あったまくる。最悪。どうしようもない。
680デフォルトの名無しさん:2009/01/17(土) 20:58:31
>>679 提供元に文句言えよ。
681デフォルトの名無しさん:2009/01/17(土) 21:00:18
>>679
触って欲しくないからだろ。
682デフォルトの名無しさん:2009/01/17(土) 21:25:49
>こっちは手を入れれない
この頭の悪さが物語っているな。
683デフォルトの名無しさん:2009/01/17(土) 22:24:57
おまいらつまらんやつらだな。
仲良しとしか組んだことないだろ
684デフォルトの名無しさん:2009/01/18(日) 07:25:17
どうしようもないときはprivateメンバだろうが何だろうがアクセスすればいいだけだよ。
privateだからとかバイナリしかないとかは大した障害にならないね。
685デフォルトの名無しさん:2009/01/18(日) 07:37:09
#define private public
686デフォルトの名無しさん:2009/01/18(日) 12:42:28
>>685
一応それはillegalだよね?
だいたいそれでうまくいくけど。
プリプロセッサの段階でそれをdenyする実装ってあるんだっけ?
687デフォルトの名無しさん:2009/01/18(日) 13:32:31
いやまったく合法だ
688デフォルトの名無しさん:2009/01/18(日) 17:53:19
↑↑VCだと、privateとpublicではマングリングが違うため、ソースが(リコンパイルが)必要になる罠
689デフォルトの名無しさん:2009/01/21(水) 01:21:34
>>688
何が言いたいのかさっぱりわからん。
アクセス修飾変えるんだからリコンパイルが必要なのは当然だが、そこでなんでマングリング?
686の話とどう繋がるのか教えてくれ。
690デフォルトの名無しさん:2009/01/21(水) 01:35:49
>>689
アクセス指定子によってマングル名が変わるからコンパイルはできるけどリンクできないってことだろ。
リンクするためにはライブラリ?も同じアクセス指定子でリコンパイルが必要ってこと。
691デフォルトの名無しさん:2009/01/21(水) 11:02:28
いつも思うけど、マングリングってエロいよなw
692デフォルトの名無しさん:2009/01/21(水) 11:12:31
おまいは中学生か!
でも確かにエロいよなぁ
693デフォルトの名無しさん:2009/01/21(水) 19:54:11
>>690
そうそう。代理での回答ありがとうん
694デフォルトの名無しさん:2009/01/21(水) 19:57:09
どう書いてる?
char ch; //もしかしたら誰かがint chに変えちゃうかも知れない

style A) printf("%c", ch);
style B) printf("%c", int(ch));
style C) printf("%c", char(ch));

AとCはintへの自動昇格目当てな
695デフォルトの名無しさん:2009/01/21(水) 22:51:10
>>690
いや、マングリングが変わらなくてもコンパイラがVCじゃなくてもコンパイルとリンクは発生する。(勿論例外はあるけど)
なぜ686にそれを指摘するのかが俺には理解できなかったんだわ。

>プリプロセッサの段階でそれをdenyする実装ってあるんだっけ?
これ俺も知りたかったから689が何か言おうとしてるっぽいんで理解しようと思ったんだが・・・意味不明だったんで質問してみた。
696デフォルトの名無しさん:2009/01/21(水) 23:17:31
プリプロセッサ様を妨げるものなんていないよ
697デフォルトの名無しさん:2009/01/22(木) 02:34:11
プリプロセッサさんマジパネェっす
698デフォルトの名無しさん:2009/01/22(木) 04:21:35
>>694 A 以外に意味が見出せないんで、何を迷ってるのかわからん。
699デフォルトの名無しさん:2009/01/22(木) 20:33:31
>>697
わろたw

>>698
%c に対する引数は int を与えないといけないので、明示的にキャストするかどうか。
さもなくば可変引数における暗黙の型ルールを把握しておかないといけない。
700デフォルトの名無しさん:2009/01/23(金) 00:18:37
>>699
そんなもん、%cを学んだ段階で把握できることだろ。
それとも何か、入門書と言う奴はそんなことも書かれていないのか?
だとしたら、マニュアルページに補足されているといいかも知れないな。
駄菓子菓子、そのキャストは余りに神経質に過ぎると思うぞ。
それを言い出すと例えば、ch == '\t'なんてのもそのまま書けなくなってしまう。
701デフォルトの名無しさん:2009/01/23(金) 00:45:50
>>699
キャストしてもしなくても、「可変引数における暗黙の型ルール」を把握しておかないと
いけないことに変わりはないはずなんで、何を迷ってるのかわからん。
702デフォルトの名無しさん:2009/01/23(金) 07:57:59
入門書は可変引数の場合の型昇格書いてないやん
703デフォルトの名無しさん:2009/01/23(金) 08:06:17
入門書を書く奴は、知識がないのに書いているか、判りきっていてて説明できないか、どっちかだろうからな。
704デフォルトの名無しさん:2009/01/24(土) 13:25:54
template内で使用するなら、可変長引数で型変換の
オーバーロードが通じないぶん意味があるかもな。
type a;
printf("%c",static_cast<int>(a));
でもまぁ、だったら最初からstd::cout使っとけやって話だが。
705デフォルトの名無しさん:2009/01/30(金) 09:37:33
どこに改行/空白入れる? typedef/usingする?
std::list<mylib::common::MyClass<charT>* > container;
std::vector<std::basic_string<CharT> >
もにょもにょ・・・
std::transform(
boost::make_indirect_iterator(container.begin()),
boost::make_indirect_iterator(container.end()),
std::back_inserder(strs),
boost::bind(&mylib::common::MyClass<charT>::format,_1,"%1:%2:%3");
);
706デフォルトの名無しさん:2009/01/30(金) 09:44:12
なんかひどいから書き直す
template<class CharT>
func(std::list<mylib::common::MyClass<CharT>*> container,
std::vector<std::basic_string<CharT> > &strs)
{
もにょもにょ・・・
std::transform(
boost::make_indirect_iterator(container.begin()),
boost::make_indirect_iterator(container.end()),
std::back_inserder(strs),
boost::bind(&mylib::common::MyClass<charT>::format,_1,"%1:%2:%3") );
}
707デフォルトの名無しさん:2009/01/30(金) 10:03:06
template<class CharT>
func(std::list<mylib::common::MyClass<CharT>*> container,
std::vector<std::basic_string<CharT> > &strs)

この3行は改行しないで一列にしちゃうな。
なんでかっていうと、VC++2008では、{ }内全体を隠す機能があって
1関数/1クラスが1行にまとまって検索しやすくなるので。
708デフォルトの名無しさん:2009/01/30(金) 10:40:16
小まめに改行してるソース読むと、いい加減モニタ買い換えろよと思う
709デフォルトの名無しさん:2009/01/30(金) 11:07:24
80桁ルールを守る価値はそれなりにあるぞ
710デフォルトの名無しさん:2009/01/30(金) 12:17:05
今となっては80桁は窮屈だぞ。
711デフォルトの名無しさん:2009/01/30(金) 12:37:23
Unix系の端末で快適にソースを閲覧できる状態というのは確かに必要なこともあるし、
80桁ってのはデファクトとしてそれなりの意味があるんじゃないのかな。
事実色んなオープンソースプロジェクトが80桁ルールを守って書かれてるし
やろうと思えば全然難しくないしね。

まあ80桁は狭いと思うにしてもせいぜい100桁か120桁くらいが限界じゃないかな。
あまり横に突き出してしまうと、結局折り返しが発生する環境が出てきて、
可読性が損なわれてしまう。
自分が読めればいいだけならいくらでも横に伸ばせばいいけど。
712デフォルトの名無しさん:2009/01/30(金) 14:42:11
713712:2009/01/30(金) 14:42:57
714デフォルトの名無しさん:2009/01/30(金) 17:10:00
エディタ横2列で見ることもあるから80桁は守ってる(厳密ではないが)
715デフォルトの名無しさん:2009/01/31(土) 00:45:27
自宅と会社のWindowsでは、xyzzyでバッファ2枚取ると丁度100カラム。
客先と会社のLinuxでは、端末エミュレータを3枚並べると丁度100、100、80カラム。
なので80-100で収まるようにコーディングしている。
716デフォルトの名無しさん:2009/01/31(土) 07:39:44
teratermだろどうせ
無理すんな
717デフォルトの名無しさん:2009/01/31(土) 10:06:10
端末エミュレータと聞いて、teratermを連想する馬鹿発見。

まぁ、客先の現場に行くとサーバがSunだしLinux端末がないから使っているけどさw
718デフォルトの名無しさん:2009/01/31(土) 14:53:56
俺、Xでもだいたいターミナルエミュレータいくつか並べる使い方しかしないから、
最近はもっぱらWindowsからTeraTermでつないで使ってる。
719デフォルトの名無しさん:2009/01/31(土) 17:25:33
色づけ厨なのでputtyしか使わない
720デフォルトの名無しさん:2009/01/31(土) 23:06:17
仮想化おいしいです。
721デフォルトの名無しさん:2009/10/10(土) 03:00:50
ソースコードがMacで保存されているとかいうエラーが出るのだけど、どういうこと?
722デフォルトの名無しさん:2009/10/10(土) 03:33:25
>>721 きっと、ソースコードがMacで保存されているんだと思う。
723デフォルトの名無しさん:2009/10/11(日) 22:31:03
LF
724デフォルトの名無しさん:2009/10/18(日) 17:03:53
今時そんなエラー吐くエディタは要らんな。
725デフォルトの名無しさん:2009/10/18(日) 18:12:05
for ( ; ; )/*~~~~ \(; ; )*/


無限ループはこうかく
726デフォルトの名無しさん:2009/10/18(日) 23:37:59
こうだろ

#define _

for(;_;)
727デフォルトの名無しさん:2009/10/19(月) 00:18:53
#define は反則だろ・・。

#define do_ob (for)
#define p_q (;;)

do_ob (p_q)
728デフォルトの名無しさん:2009/10/19(月) 00:25:14
>727
展開すると

 (for)((;;))

コレが通るコンパイラを教えてクレ。
729デフォルトの名無しさん:2009/10/19(月) 21:38:33
>>728


defineのあとのカッコ()は無視されます
730デフォルトの名無しさん:2009/10/20(火) 00:48:44
>729

#define A (1+2)
#define B (3+4)

printf( "%d\n", A * B );
731デフォルトの名無しさん:2009/10/20(火) 12:02:05
>>729
むしろ>>730のようにカッコを無視してもらっては困る場合が多いんだけど
732デフォルトの名無しさん:2009/10/20(火) 12:07:05
>>729
だから、どのコンパイラがそんな挙動をするのかと。
733デフォルトの名無しさん:2009/10/20(火) 17:47:26
>>730

11
734デフォルトの名無しさん:2009/10/20(火) 18:07:49
>>733
>732
735デフォルトの名無しさん:2009/10/20(火) 23:16:03
「コメントは無視される」と間違えてる気ガス。

#define A 1 // コメント書いてもちゃんと通るYO!
printf( "%d\n", A );
736デフォルトの名無しさん:2009/10/21(水) 02:42:12
香ばしいな
737デフォルトの名無しさん:2009/10/21(水) 09:36:17
>>735
>「コメントは無視される」と間違えてる気ガス。
誰が?
738デフォルトの名無しさん:2009/10/21(水) 09:42:54
>>737
>735は日本語が不自由なんだよ。>735は、
「>729はコメントが無視されることと同様にと括弧も無視されると勘違いしているのじゃないか」
と言いたいのだろ。

まぁ、普通はそんな間の抜けた勘違いはしないがな。
739デフォルトの名無しさん:2009/10/21(水) 19:34:08
俺の書いた>>325のせいで殺伐としてるなw
740デフォルトの名無しさん:2009/10/21(水) 19:35:12
#define 325 735
741デフォルトの名無しさん:2009/10/21(水) 19:35:56
上記2つ725の間違いです><
742デフォルトの名無しさん:2009/10/21(水) 20:18:01
スタイルの前にまともに動くコードを書けって感じ、、、
743デフォルトの名無しさん:2009/10/21(水) 22:36:02
#define good ;;
744デフォルトの名無しさん:2010/11/12(金) 22:53:49
お?
745デフォルトの名無しさん:2010/12/29(水) 23:38:20
String ToString()
{
return ( this->Type == HogeType.A ) "A" :
( this->Type == HogeType.B ) "B" :
( this->Type == HogeType.C ) "C" :
( this->Type == HogeType.D ) "D" :
( this->Type == HogeType.E ) "E" :
( this->Type == HogeType.F ) "F" :
( this->Type == HogeType.G ) "G" :
( this->Type == HogeType.H ) "H" :
( this->Type == HogeType.I ) "I" : "";
}
746745:2010/12/29(水) 23:39:55
「?」付けるの忘れた・・・orz
747デフォルトの名無しさん:2011/01/08(土) 01:49:46
>>745
きもいw 許せないw
俺ならハッシュ使って返すw
748デフォルトの名無しさん:2011/01/21(金) 19:55:39
MFCみたいに継承つかったら?
749デフォルトの名無しさん:2011/01/21(金) 20:22:09
クラスの頭にCつけるのなんでかと思ってたけど、
public:
 const CHoge&Hoge()const{return hoge;}
ができるのね。
ちょっと惹かれる。
750デフォルトの名無しさん:2011/01/21(金) 23:21:04
GetHogeにするのは嫌なのか・・
751デフォルトの名無しさん:2011/01/22(土) 00:14:39
>>749
頭のC要らないよ。クラスであることを表すってことなら class ってふつうに書けばいいんだよ。
public:
 const class Hoge&Hoge()const{return hoge;}
752デフォルトの名無しさん:2011/01/22(土) 00:19:55
>>750
単に値を取り出すだけなのに動詞とかキモイ。
「x の hoge」は x.Hoge() が自然。 x.GetHoge() ってなると自然に読み下せない。
取り出した値を使った式を書いた場合にさらに読みづらくなる。
753デフォルトの名無しさん:2011/01/22(土) 00:37:47
>>751
コンストラクタと名前被るからって意味じゃないかとエスパー。
754デフォルトの名無しさん
それでは読み出し専用なのか書き込み専用なのか読み書き両用なのかわからないじゃないか!

…などと、どうでもいいことをぐりぐり掘り返してみた。
個人的にはどっちでもいいやって感じ。