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

C++相談室 part44

■ このスレッドは過去ログ倉庫に格納されています
0001v(^・^)v2005/10/05(水) 20:45:37
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いします。
IDE(VC++など)などの使い方の質問もその開発環境のスレに
お願いします。

前スレ
C++相談室 part43
http://pc8.2ch.net/test/read.cgi/tech/1124113879/

過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
01591482005/10/11(火) 12:53:08
すいません.嘘書きました(汗
sizeof(T) == 4
sizeof(S1) == 1
sizeof(S2) == 4
の間違いです
0160デフォルトの名無しさん2005/10/11(火) 22:45:10
>>158
もともと何も問題起きてないと思うんだが、つか、C++/class じゃなくて、
基本的には C言語でのこの種の理解をしてないだけじゃないかしら
0161デフォルトの名無しさん2005/10/11(火) 23:03:38
>>148
自分で作ってみたら?
サイズがシステムに最適化されるプリミティブなクラスでも。
0162デフォルトの名無しさん2005/10/12(水) 02:14:41
>>154
> 「オブジェクトの型表現のサイズが指定したビットより大きい場合、余ったビットは詰め物として使われる」
これは規格からの引用?どこ?
9.6.1 だとしたら
「指定したビット数がオブジェクトの型表現のサイズより大きい場合」
の間違いじゃない?

sizeof(T) == sizeof(int) になることも
sizeof(T) == sizeof(short) になることも
確かだと言える根拠は無いでしょ?
全部処理系依存。
0163デフォルトの名無しさん2005/10/12(水) 02:18:00
>>155
C だと (signed|unsigned) int しか使えなくて、
C++ でその他の整数型と enum が許されるようになったみたいだから、
移植性を気にする人は使わないんだろうね。
0164デフォルトの名無しさん2005/10/12(水) 03:00:21
各ビットをフラグに使うだけなら論理積で十分だしなぁ
0165デフォルトの名無しさん2005/10/12(水) 03:59:19
>>158
S1の T ってただの型宣言になってるぞ。
sizeof(S1) == 1 になって当たり前w
0166デフォルトの名無しさん2005/10/12(水) 20:45:23
動的に変化する2次元配列の配列を作りたいのですが、
どうすればよいのでしょうか?
普通にnew演算子を使って作るのはできるのですが
vectorを使った方が都合が良いです。

例えば
std::vector< std::vector<int> > matrix;
matrix.push_back(std::vector<int>(4));
…
という具合にmatrix[*][4]は作れますよね。

こんな感じで
matrix[*][9][4]のような物を作りたいのですが、
上手くいかなくて困り果てています…
0167デフォルトの名無しさん2005/10/12(水) 21:09:28
class CSomething
{
public:
 int getInstance(){ /* なんちゃらかんちゃら */ };
};

int g_N = CSomething::getInstance();

int main()
{
 return 0;
}


グローバル変数を↑こういう風に初期化するのって問題ないですか?
0168デフォルトの名無しさん2005/10/12(水) 21:12:55
まずはstaticにするべきじゃないかな?
01691672005/10/12(水) 21:14:49
>168 正しくは↓でした('Д`;)

class CSomething
{
public:
 static int getInstance(){ /* なんちゃらかんちゃら */ };
};
0170デフォルトの名無しさん2005/10/12(水) 21:14:53
>>167
いいけどその例ではgetInstanceが静的メンバでないとCSomethisng::で修飾してのアクセスはできないよ。
0171デフォルトの名無しさん2005/10/12(水) 21:30:14
どういうプログラム組んでるか分からないから、わざわざ静的メンバ関数で
グローバル変数を初期化する意義が読み取れない。
だからまあ、設計に関しての常套文句が二つ三つ出てヤメレって言うしかないわけだが。
0172デフォルトの名無しさん2005/10/12(水) 22:04:08
>>166
動的な1次元のプロキシクラスを作って、それの配列クラスという形で、
2次元クラスを作るのが常套手段。
01731672005/10/12(水) 22:11:05
>168-171
コード・文法的に問題あるとかってことはないぽってことですね。
ありがとうございました。

>171
確かにサンプルコードだけ見ると、何しようとしてるんだって感じですね。
実際にはもう少し意義ある形なので、ここはお目こぼしを[・∀・]
0174デフォルトの名無しさん2005/10/13(木) 03:10:23
void foo(A& a)
{
 bzero(&a, sizeof(a));
}

なんで最初の要素しか0にならんのか
暫く気づかなかった
0175デフォルトの名無しさん2005/10/13(木) 03:39:31
聞くは一時の恥 聞かぬは一生の恥
うん。がんばろう。

>>174
なんでなん?orz
0176デフォルトの名無しさん2005/10/13(木) 04:18:15
>>174
class A { int i; };

std::cout << std::showbase << std::hex << &a << ' ' << std::noshowbase << sizeof(a) << std::endl;

俺の環境では
0x0023ff77 4

どう考えても最低4バイト初期化されるが・・・・・
0177デフォルトの名無しさん2005/10/13(木) 04:20:07
>>166
自分で作るのが面倒ならboost::multi_arrayがその目的まんまだから使ってしまえ
0178デフォルトの名無しさん2005/10/13(木) 04:27:57
>>176
>174はポインタを渡して配列を初期化するつもりだったんジャマイカ?
0179デフォルトの名無しさん2005/10/13(木) 04:35:15
>>178
なんだそういう事か。
0180デフォルトの名無しさん2005/10/13(木) 05:08:27
>>178
納得
0181hoge2005/10/13(木) 13:58:22
�@boolとintってどっちが高速なんですか?

�AテンプレートってC++にしかないんですか?
0182デフォルトの名無しさん2005/10/13(木) 14:04:31
>>181
�@intに0か1を入れてbool代わりに使う という話ならどちらも大差ない
�Aジェネリクスの概念は他の言語にもある
0183デフォルトの名無しさん2005/10/13(木) 18:35:13
>>182
でもC++程強力なテンプレートは
0184デフォルトの名無しさん2005/10/13(木) 18:44:43
強力……っていうかむしろ大惨事発生装置。
01851812005/10/13(木) 18:52:04
JAVAにありましたっけ?
0186デフォルトの名無しさん2005/10/13(木) 18:58:12
最近出来た。コレクションからオブジェクト出すときのキャストを省略する目的で。
0187デフォルトの名無しさん2005/10/13(木) 19:01:11
>>185
一応有る。Java Genericsでググるといっぱい出てくるよ。
JavaSDK1.5に入る予定だったけど、結局入ったのかどうかは知らない。
たしかC++程の強力さはないけど。
0188デフォルトの名無しさん2005/10/13(木) 19:19:19
c++のテンプレートってさ
Tになにを求められるか−たとえばTは++演算子が使えるインターフェイスでなければならない
ってのがよみとりにくくて不便じゃない?
0189デフォルトの名無しさん2005/10/13(木) 19:53:04
>>188
そこでC++ 0xではコンセプトを導入してそういうことをコードに書けるようにしようということになっている。
01901742005/10/13(木) 21:54:52
struct A {
 int m1;
 int m2;
};
A a;
a.m1 = 1;
a.m2 = 2;
foo(a);
cout << a.m1;
cout << a.m2;
ってな感じなわけですよ!!!!
0191デフォルトの名無しさん2005/10/13(木) 22:46:58
趣味で正規表現をテストするオートマトンなんか書こうとしてます。

class abstract_status
{
};

class status : public abstract_status
{
string name;
map<set<char>,abstract_status*> transition_map;
};

class automaton
{
status *start;
status *accept;
status *current;
list<status*> status_list;
};

ってな感じで進めているのですが、transition_map の set<char>
のところは単なる char にしたほうが良いかどうか。。。
あるいは、全く別の構造にしたほうが良いのか。。。
アドバスお願いします。
0192デフォルトの名無しさん2005/10/14(金) 01:44:17
>>190
で、なんで最初の要素しか0にならんの?
0193デフォルトの名無しさん2005/10/14(金) 01:45:43
>>191
set<char> にした場合の使い方がわからない。
0194デフォルトの名無しさん2005/10/14(金) 02:03:45
素朴な疑問なんだが、set<char>同士ってoperator< で比較できるのか?
0195デフォルトの名無しさん2005/10/14(金) 02:21:04
>>194 できるよ。
0196デフォルトの名無しさん2005/10/14(金) 02:40:23
>>195
おお、本当だ!ありがとう。
0197デフォルトの名無しさん2005/10/14(金) 07:14:00
>>190
あーなるほど。
>>192
sizeof(a)
0198デフォルトの名無しさん2005/10/14(金) 07:30:17
>>197
なにが「なるほど」なのやら。両方ともゼロになるだろ。
0199デフォルトの名無しさん2005/10/14(金) 07:35:26
>174が書き間違えている悪寒。
0200デフォルトの名無しさん2005/10/14(金) 08:53:30
>>198
ならない
0201デフォルトの名無しさん2005/10/14(金) 09:20:31
>>200
なるよ。
0202デフォルトの名無しさん2005/10/14(金) 09:25:36
今日のム板は初っ端からクオリティの低い書き込みが多いな
それともC++関連だけか?
0203デフォルトの名無しさん2005/10/14(金) 10:35:27
クオリティって言ってみたかっただけっぽい
0204デフォルトの名無しさん2005/10/14(金) 14:46:55
>>197
sizeof(A) ならいいけど sizeof(a) だからダメって言うこと?
コンパイラがバグってるだけじゃない?
0205デフォルトの名無しさん2005/10/14(金) 15:43:58
sizeof(A&) が 4 か 8 か、どっちよ?
って話しだべ?
参照はポインタみたいなもんだから。

どっちが正しいか知らんけど、
VC7.1 じゃ 8 だったな。
0206デフォルトの名無しさん2005/10/14(金) 15:50:25
>>205
ISO/IEC 14882:1998
5.3.3 sizeof
2. When applied to a reference or a reference type, the result is the size of the referenced type.

8になるのが正しい
0207デフォルトの名無しさん2005/10/14(金) 21:38:04
ギョエー
0208デフォルトの名無しさん2005/10/14(金) 22:54:12
>193

void automaton::tick(char input_char)
{
for(i=0; i<(current->second).size(); i++) {
if (((current->second)->first).count(input_char) > 0) {
current = (current->second)->second;
return;
}}}
0209デフォルトの名無しさん2005/10/14(金) 22:55:51
あ、iterator 使わないと駄目だ↑
0210デフォルトの名無しさん2005/10/14(金) 23:01:35
void automaton::tick(char input_char) {
map<set<char>,abstract_status*>::iterator tmitr = (current->second).begin();
int i;
for(i=0;i<tmitr->size();i++) {
if ((tmitr->first).count(input_char) > 0) {
current = tmitr->second;
return;
}
tmitr++;
}}
0211デフォルトの名無しさん2005/10/14(金) 23:02:48
実際には automaton から status の中の変数は扱えないので
2段に分けて記述しています。
0212デフォルトの名無しさん2005/10/14(金) 23:24:04
class CVal
{
public:
 CVal(int val, char * name)
 {
  v = val;
 }
 ~CVal()
 {
 }
 operator int ()
 {
  return v;
 }
 private:
 int v;
 char * n;
};
というクラスがあるのですが、このクラスを次のように使うとintにキャストされてうまくいきます。
CVal val(1, "なんか");
if(val == 1){...

しかし次のようにprintf系に渡すとおかしくなってしまうようです。この場合どう扱われてるのでしょう?
CVal val1(1, "foo");
CVal val2(2, "boo");
printf("%d, %d", val1, val2);
↑
最初の1は正しく出るがval2は変な値になる。
0213デフォルトの名無しさん2005/10/14(金) 23:29:56
printfは型チェックしないからキャストもされない。
0214デフォルトの名無しさん2005/10/14(金) 23:34:36
そしてC++のiostreamなら型チェックがあるからoperator intで変換できる、という流れへ。

printfでは自分でstatic_castすればとりあえず動く。
printf("%d, %d", static_cast<int>(val1), static_cast<int>(val2));
0215デフォルトの名無しさん2005/10/15(土) 00:01:51
なるほど。ありがとうございます。
ってことはほかの場所でも実はちゃんとintにキャストされずに動いてる可能性もあるわけですね。
ちょっと怖いですね。
0216デフォルトの名無しさん2005/10/15(土) 00:15:06
こういうことがおこるのはprintfみたいに可変個引数を使っている場合だけだがな。
0217デフォルトの名無しさん2005/10/15(土) 19:47:40
http://kittand.hp.infoseek.co.jp/ihuy/cpp.htm

これC言語知ってる人がC++の補足として使えるかと思って書いたやつで
基本的に本から抜粋しただけのものですけど、
間違いとか不足してるところとかありませんか?
0218デフォルトの名無しさん2005/10/15(土) 19:56:50
>>217
書いた人ですか?
最初のほうを読んで一つ目だけ。

>高度な型 - C++の構造体
>メンバ関数を持つことができる。(実際のプログラミングでは、使わないこと)
括弧部分が大きなお世話。
関数オブジェクトではstructにメンバ関数を書くのが普通だったりする。
0219デフォルトの名無しさん2005/10/15(土) 20:00:48
あとは見出しだけざっと見ただけだが、templateやnamespaceの記述が無い・・。
標準C++ライブラリを使うには必須の機構だし、普通に使うものなので
今C++を語るなら書かないのは片手落ちだろうなあ。
0220デフォルトの名無しさん2005/10/15(土) 20:32:11
C++では値の比較時(if文などの条件で)に、intより小さいサイズの型はintに昇格する
よってunsigned char a=b=200;のときunsigned char c = (a+b > 255) : 255 : a+b;と書いても、予期したとおり動く
Cでも同じなのかもしれんけど。
strstreamよりstringstream使うべき
0221デフォルトの名無しさん2005/10/15(土) 20:44:13
>void型はC++で創始され、それがANSI Cに反映されたものであり、voidについてC++で正しいことはANSI Cでも正しい。
ダメすぎ。

総じて、よく判っていないながら実務経験だけはある香具師が、経験則から得たメモを書いているだけ。
書いた香具師のプロファイリングを楽しむにはいいが、参考にはならない。
0222デフォルトの名無しさん2005/10/15(土) 20:47:14
重要な所が結構抜けてるね。

・参照
・メンバ初期設定リスト
・仮想基本クラス

あとこういうの書くときはC++の設計と進化を読んで書いて欲しい。
0223デフォルトの名無しさん2005/10/15(土) 21:42:50
>>217
つっこみどころが多すぎてつっこめません・・・
0224デフォルトの名無しさん2005/10/15(土) 23:32:18
>>217
wchar_tはCでもtypedefで用意されている。そしてC++では組み込み型になっている。

> 列挙変数を enum キーワードを使わずに宣言できる。Cでは必要だった
構造体と共用体も同じくstructとunionが不要になったことが書かれてない。

>if (x < 100)
>    double g = sin(x);
>else
>  double g = cos(x);
この後でgが使えないのは、ifとelseの中身はそれぞれブロックが作られているからのはず。

forの構文は正しくはfor (宣言文または式文 式 ; 式 ) 文 となる。

今はprotectedはC++固有ではない。JavaとかC#とかみんなC++由来だけど。

>基底クラスと派生クラスの代入
本文の基底と派生を入れ替えると正しくなるw。

続く
0225デフォルトの名無しさん2005/10/15(土) 23:36:12
続き

<iostream.h>は古い。今は<iostream>。stdiostreamは非標準。
strstreamは標準にはあるが非推奨。<sstream>のistreamstream/ostringstreamがある。
iostream_with_assign類も非標準。

多重定義の解決には5番目に可変個引数 ... もある。
まあ、知らずとも大体想像通りに解決されるとでも書けばいい。
そういう目標でC++の多重定義解決の規則は作られた。

volatileはC由来。

ファイル内スコープの意味でのstaticは非推奨、無名名前空間が推奨されている。

使うべきでない機能として挙げるだけでなく理由も書け。

あと、本文中に1度もオブジェクト指向、ポリモーフィズムと言った言葉が出てこないのが異常。
テンプレート、名前空間、例外が全く出てこないのもどうかと。
しかしこれらを直しても所詮は付け焼き刃、根本的にお前自身がC++をよくわかっていないだろ。
0226デフォルトの名無しさん2005/10/16(日) 03:30:30
Cにおいてchar型は自動的にintに昇格していたが、
C++においてもintに昇格したのち演算が適用される

8行目にして間違っている解説はなかなかないが
それに気づかない人たちのなにやら難しいつっこみはいっそう無視してよい
0227デフォルトの名無しさん2005/10/16(日) 07:51:17
いや、3行目の間違いが既に指摘されている。
0228デフォルトの名無しさん2005/10/16(日) 09:47:43
細かいことだけど、constにbool、参照、ifとwhileの条件での変数宣言なんかも抜けているな。
inlineも説明なしで使われている。
0229デフォルトの名無しさん2005/10/16(日) 11:47:24
何はともあれ結論はオナヌー文章ウザイってこった
0230デフォルトの名無しさん2005/10/16(日) 16:46:28
C++とか書いている時点でもうダメダメ。
0231デフォルトの名無しさん2005/10/16(日) 16:51:41
マトモな感覚のある奴なら全角英数字なんて滅多に使わん
0232デフォルトの名無しさん2005/10/16(日) 17:25:03
HAGESHIKUDOUI
02332172005/10/16(日) 17:35:35
いろいろ指摘していただいてありがとうございます。
オブジェクト指向の設計については省いた、
C++についてできるだけ簡素にまとめられたドキュメントありませんか?

できれば言語仕様とオブジェクト指向設計、STLやらライブラリがからむのは
分けてかかれたものがいいんですけど。

皆さんのバイブルを紹介してもらってもいいですけど。
0234デフォルトの名無しさん2005/10/16(日) 17:37:04
>233
ttp://www.amazon.co.jp/exec/obidos/ASIN/475611895X
0235デフォルトの名無しさん2005/10/16(日) 17:37:28
あーでもいまからならJAVAですかね?
JAVA使うならJAVAで使えないC++の仕様とか下手に覚えない方が楽ですよね?
02362332005/10/16(日) 17:44:00
>>234
評価高くてよさそうですが、C++はなにもわからないんでやめときます。

> 個人的には、記述内容の間違いを読みながら補正できる
> 「プロ」レベルの人以外は読むべきではないと思います。
> 少なくともこの翻訳された内容を鵜呑みにするのは問題が多すぎると思います。
0237デフォルトの名無しさん2005/10/16(日) 17:45:34
ttp://www.amazon.co.jp/exec/obidos/ASIN/4881356194/250-1494518-5036263
0238デフォルトの名無しさん2005/10/16(日) 17:45:57
>>236
じゃあ、これでも読んでろ。
ttp://www.webstore.jsa.or.jp/webstore/Com/FlowControl.jsp?lang=jp&bunsyoId=JIS+X+3014%3A2003&dantaiCd=JIS&status=1&pageNo=0
0239デフォルトの名無しさん2005/10/16(日) 18:00:54
>>233
>>5
> http://www.kuzbass.ru/docs/isocpp/
0240デフォルトの名無しさん2005/10/16(日) 18:05:07
別のところから>>238のPDFはタダで読める。
0241デフォルトの名無しさん2005/10/16(日) 18:35:59
>>239
えーご�_

>>237
>Cを使っていて何故オブジェクト指向がいるのか?と思われる方向けです。
>他言語使いであれば買っても言い内容です。

>内容に若干古く臭さを感じる初級本と言える。

よさげですね。
ていうか憂鬱な・・・は昔から評価高いか。

C++の設計と進化
http://www.asahi-net.or.jp/~YD8S-HMD/others/bookshelf/bookshelf.htm
これなんかよさそうだな。
0242デフォルトの名無しさん2005/10/16(日) 18:36:45
>>241
D&EはC++の基礎をある程度知った上で読まないと意味がないかと
0243デフォルトの名無しさん2005/10/16(日) 18:37:16
>>241
それは読み物。
0244デフォルトの名無しさん2005/10/16(日) 18:54:07
>>233
これは?
ttp://www.seshop.com/detail.asp?pid=3236
02452332005/10/16(日) 22:17:40
>>244
> C言語を勉強した人向けとなっておりますが、全くその通りです。
なるほど。
これも定番ですがよさそうですね。
0246デフォルトの名無しさん2005/10/17(月) 12:27:09
大量にあるメンバ変数の内容を他のクラスに伝えたい
場合、何かいい方法はありますか?
0247デフォルトの名無しさん2005/10/17(月) 12:40:12
クラスでカプセル化してインスタンスの参照を渡す
0248デフォルトの名無しさん2005/10/17(月) 14:37:07
10の-N乗(N=1のとき0.1、N=2のとき0.01...)を
1.0/pow(10, N);より高速に計算する方法はどうすればいいのでしょうか。
0249デフォルトの名無しさん2005/10/17(月) 14:43:52
>>248
環境によってやり方は違ってくるだろうなあ
02502482005/10/17(月) 16:33:18
想定しているNの範囲は1-20程度なので、テンプレートの特殊化を使い:

template <typename T, int N>
struct decimal_place {
 static const T type = 1/std::pow(10, static_cast<T>(N));
};
template <> struct decimal_place<float, 1> { static const float type = 0.1f; };
template <> struct decimal_place<double, 1> { static const double type = 0.1; };
template <> struct decimal_place<long double, 1> { static const long double type = 0.1L; };
...(以下20まで)

としておいて、

double X = decimal_place<double, 1>::type;

のようにしようと考えてみました。これはウンコでしょうか(´д`)
0251デフォルトの名無しさん2005/10/17(月) 16:38:49
>>250

Nが整数で20程度ならテーブル参照がいい気がします
0252デフォルトの名無しさん2005/10/17(月) 17:51:59
>>250
何でもいいけどtypeじゃなくてvalueにしとけよ気持ち悪い
0253デフォルトの名無しさん2005/10/17(月) 18:58:23
スレ違いだけど、ウンコは苦いよ。
0254デフォルトの名無しさん2005/10/17(月) 19:00:13
>>253
既出
0255デフォルトの名無しさん2005/10/17(月) 19:28:24
>>250
それってコンパイルしなのでは。
02562552005/10/17(月) 19:43:54
このへんかな。
ttp://www.kuzbass.ru/docs/isocpp/class.html#class.static
0257デフォルトの名無しさん2005/10/17(月) 21:47:37
>>250
もういっそのこと
各型での結果をそれぞれ float.csv, double.csv, ldouble.csv にでも保存しといて

const float decimal_place_float[] = {
#include "float.csv"
};
const double decimal_place_doulbe[] = {
#include "double.csv"
};
const long double decimal_place_long_doulbe[] = {
#include "ldouble.csv"
};

とかってしたら?
02582482005/10/18(火) 00:34:50
>>250はマクロを使って定義自体はそれなりに簡潔に書けました。typeは糞ですなスマンコ
gccで-O3オプションをつければ、特殊化した1-20については
アセンブラファイルを見る限りコンパイル時に定数にしてくれるっぽいです。
テーブル参照も試してみます。
csvも面白いアイディアです。thxです。
■ このスレッドは過去ログ倉庫に格納されています