■過去ログ置き場に戻る■ 1- 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part44
1 名前:v(^・^)v :2005/10/05(水) 20:45:37
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いします。
IDE(VC++など)などの使い方の質問もその開発環境のスレに
お願いします。

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

過去スレ、関連スレ、関連リンクなどは >>2-20 あたり

2 名前:v(^・^)v :2005/10/05(水) 20:46:09
1 http://mimizun.mine.nu:81/2chlog/tech/piza.2ch.net/tech/kako/980/980175292.html
2 http://pc.2ch.net/tech/kako/996/996640937.html
3 http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
4 http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
5 http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
6 http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
7 http://pc.2ch.net/tech/kako/1021/10217/1021787032.html
8 http://pc3.2ch.net/tech/kako/1025/10250/1025010364.html
9 http://pc3.2ch.net/tech/kako/1027/10273/1027347982.html
10 http://pc3.2ch.net/tech/kako/1029/10293/1029315669.html
11 http://pc3.2ch.net/tech/kako/1032/10323/1032345774.html
12 http://pc3.2ch.net/tech/kako/1035/10350/1035005882.html
13 http://pc3.2ch.net/tech/kako/1038/10380/1038031395.html
14 http://pc5.2ch.net/tech/kako/1041/10413/1041328679.html
15 http://pc5.2ch.net/tech/kako/1043/10436/1043605481.html

3 名前:v(^・^)v :2005/10/05(水) 20:46:59
16 http://pc5.2ch.net/tech/kako/1045/10457/1045746245.html
17 http://pc5.2ch.net/tech/kako/1047/10475/1047560042.html
18 http://pc5.2ch.net/tech/kako/1050/10501/1050177746.html
19 http://pc5.2ch.net/tech/kako/1052/10526/1052625846.html
20 http://pc5.2ch.net/tech/kako/1055/10551/1055162298.html
21 http://pc5.2ch.net/tech/kako/1057/10575/1057580107.html
22 http://pc5.2ch.net/tech/kako/1060/10603/1060361082.html
23 http://pc5.2ch.net/tech/kako/1062/10626/1062690663.html
24 http://pc5.2ch.net/tech/kako/1066/10665/1066546387.html
25 http://pc5.2ch.net/tech/kako/1067/10679/1067949669.html
26 http://pc5.2ch.net/test/read.cgi/tech/1070164402/ (迷子)
27 http://pc5.2ch.net/test/read.cgi/tech/1074454641/ (迷子)
28 http://pc5.2ch.net/test/read.cgi/tech/1077985164/
29 http://pc5.2ch.net/test/read.cgi/tech/1082047479/
30 http://pc5.2ch.net/test/read.cgi/tech/1084030770/

4 名前:v(^・^)v :2005/10/05(水) 20:47:45
31 http://pc5.2ch.net/test/read.cgi/tech/1086185282/
32 http://pc5.2ch.net/test/read.cgi/tech/1088236078/
33 http://pc5.2ch.net/test/read.cgi/tech/1090180012/
34 http://pc5.2ch.net/test/read.cgi/tech/1092018643/
35 http://pc5.2ch.net/test/read.cgi/tech/1093958200/
36 http://pc5.2ch.net/test/read.cgi/tech/1096304546/
37 http://pc5.2ch.net/test/read.cgi/tech/1098543578/
38 http://pc5.2ch.net/test/read.cgi/tech/1101473340/
39 http://pc5.2ch.net/test/read.cgi/tech/1106466303/
39(実質40) http://pc8.2ch.net/test/read.cgi/tech/1106527792/
40(実質41) http://pc8.2ch.net/test/read.cgi/tech/1113408957/
41(実質42) http://pc8.2ch.net/test/read.cgi/tech/1120190961/

5 名前:v(^・^)v :2005/10/05(水) 20:50:08
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq-lite/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****

[禿 Stroustrup]
 http://www.research.att.com/~bs/
[C++ International Standard]
 http://www.kuzbass.ru/docs/isocpp/
 http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf
 http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=38110&ICS1=35&ICS2=60&ICS3=
[JTC1/SC22/WG21 - C++]
 http://www.open-std.org/jtc1/sc22/wg21

[C/C++ Users Journal]
 http://www.cuj.com/
[cppll (ML)]
 http://www.trickpalace.net/cppll/ (日本語)

6 名前:v(^・^)v :2005/10/05(水) 20:51:29
■Books■
amazon.com C,C++関連書籍
 http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/

The C++ Programming Language
 http://www.amazon.com/exec/obidos/ASIN/0201700735/
 http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
 http://www.amazon.com/exec/obidos/ASIN/0201824701/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
 http://www.amazon.com/exec/obidos/ASIN/0201379260/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
 http://www.amazon.com/exec/obidos/ASIN/0201924889/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
 http://www.amazon.com/exec/obidos/ASIN/020163371X/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
 http://www.amazon.com/exec/obidos/ASIN/0201615622/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
 http://www.amazon.com/exec/obidos/ASIN/020170434X/
Exceptional C++ Style
 http://www.amazon.com/exec/obidos/ASIN/0201760428/

7 名前:v(^・^)v :2005/10/05(水) 20:56:17
■Books(Templateまわり)■
Effective STL
 http://www.amazon.com/exec/obidos/ASIN/0201749629/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
 http://www.amazon.com/exec/obidos/ASIN/0201704315/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
 http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
 http://www.amazon.com/exec/obidos/ASIN/0321227255/

8 名前:v(^・^)v :2005/10/05(水) 20:58:23
■Libraries■
[Boost]
 Boost http://www.boost.org/
 (日本語) http://www.kmonos.net/alang/boost/
 (日本語) http://shinh.skr.jp/boost/
[STL]
 STLport http://www.stlport.org/
 SGI-STL http://www.sgi.com/tech/stl/
 STLFilt http://www.bdsoft.com/tools/stlfilt.html
 (日本語) http://www005.upp.so-net.ne.jp/episteme/html/stlprog/
 (日本語) http://www.wakhok.ac.jp/~sumi/stl/
[Loki]
 http://www.moderncppdesign.com/
 LokiPort-MSVC7 http://www.geocities.com/rani_sharoni/LokiPort.html
 LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport

9 名前:v(^・^)v :2005/10/05(水) 20:59:16
■Libraries■
[他]
 ACE http://www.cs.wustl.edu/~schmidt/
 Blitz++ http://www.oonumerics.org/blitz/
 flex++ Bison++ http://www.idiom.com/free-compilers/TOOL/BNF-15.html
[他ライブラリリンク集]
 http://www.trumphurst.com/cpplibs/cpplibs.phtml
 (日本語) http://www.kmonos.net/alang/cpp/lib.html

10 名前:v(^・^)v :2005/10/05(水) 21:00:42
■関連スレ■
【C++】template 統合スレ -- Part6
http://pc8.2ch.net/test/read.cgi/tech/1101384692/
C/C++の宿題を片づけます 51代目
http://pc8.2ch.net/test/read.cgi/tech/1128493272/
C/C++でのWindowsPrograming議論スレ(質問お断り)
http://pc8.2ch.net/test/read.cgi/tech/1049790146/
managed C++ やろうぜ!!
http://pc8.2ch.net/test/read.cgi/tech/1014486422/
ATL/WTL Part3
http://pc8.2ch.net/test/read.cgi/tech/1095442366/

11 名前:デフォルトの名無しさん :2005/10/05(水) 21:03:56
STLつかうと一気に実行ファイルサイズが10倍に?!

12 名前:デフォルトの名無しさん :2005/10/05(水) 21:13:48
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。

13 名前:デフォルトの名無しさん :2005/10/05(水) 21:14:39
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

14 名前:デフォルトの名無しさん :2005/10/05(水) 21:14:53
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

15 名前:デフォルトの名無しさん :2005/10/05(水) 21:36:27
しかしなんでMSはSTLのランタイムDLL作らんのだろう?

16 名前:デフォルトの名無しさん :2005/10/05(水) 22:13:29
>>15
それを実現させようとするとDLLでなくDCL(Dynamic Compile Library)になってしまう。

17 名前:デフォルトの名無しさん :2005/10/05(水) 22:28:43
すいません。
opertor<<=
は C++の構文でこれは、どう解釈するればよいでしょうか?


18 名前:デフォルトの名無しさん :2005/10/05(水) 22:40:40
 << はシフト演算、 a <<= 1; は a = a << 1;

19 名前:デフォルトの名無しさん :2005/10/05(水) 22:49:01
ありがとうございます。
シフト演算は理解できるのですが、
opertor というキーワード(予約語)が気になっています。
特別な意味があるのかと思いますが、よくわかっていません。



20 名前:デフォルトの名無しさん :2005/10/05(水) 23:07:33
struct T {int i;T():i(1){}};
void operator<<=(T& x,const T& y){x.i+=y.i;}; //operator<<= という名の関数
#include <iostream>
int main(){
T x,y;
x <<= y; // ここで「operator<<= 」と定義した関数をつかっている
std::cout << x.i << std::endl;
return 0;
}

21 名前:デフォルトの名無しさん :2005/10/05(水) 23:14:03
ありがとうございます。
誤記でした。opertor(誤) operator(正)
 
演算子ではないのですね。
関数を定義しているという理解でよいでしょうか?
頭が固くてもうしわけありません。


22 名前:デフォルトの名無しさん :2005/10/05(水) 23:22:10
operator<<= は省略記法として <<= の使える演算子関数、と本に書いてある
要するに関数であってると思う。

23 名前:デフォルトの名無しさん :2005/10/05(水) 23:25:06
ありがとうございます。
初心者がコードを読むにはまだまだ、知識が必要。
C++言語はむずかしいことを実感。挫折中です。


24 名前:デフォルトの名無しさん :2005/10/05(水) 23:59:24
>>14
#include <stdafx.h>

あと死ね。

25 名前:デフォルトの名無しさん :2005/10/06(木) 00:00:05
>>24
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。


26 名前:デフォルトの名無しさん :2005/10/06(木) 00:50:08
>>21
構文上はそうなんだけど、実際には演算子を定義していると思え。

27 名前:デフォルトの名無しさん :2005/10/06(木) 03:35:22
これからVC++をはじめようと思っているのですが、初心者にでもわかりやすい本を紹介してください。

一度、サンプルソースをいじろうと思って触ってみたのですが、
フォームに表示する文字のフォントサイズをどうやって帰ればよいのかも判らずそのままになってしまいました。

今度こそしっかりと覚えたいので、よろしくご紹介ください。

よろしければ、フォームに表示する文字(テキスト)のフォントサイズを変える方法もお願いします。

28 名前:デフォルトの名無しさん :2005/10/06(木) 08:26:54
The C++ Programming Language
C++ Primer (3rd Edition)
Effective C++
More Effective C++
Exceptional C++
More Exceptional C++

ちょwどれもさっぱりなんだが
もう一個下なのはありませんか?

29 名前:デフォルトの名無しさん :2005/10/06(木) 09:00:33
>>28
Accelerated C++ はどう?

>>27
スレ違い。

30 名前:デフォルトの名無しさん :2005/10/06(木) 09:33:05
>>29
サンクス!
初心者++スマソw

31 名前:デフォルトの名無しさん :2005/10/06(木) 23:24:08
>>26
ご支援ありがとうございました。

一般的にコンパイル時の警告メッセージの定義はあるでしょうか?
無視してはいけないものと思えばよいでしょうか。

32 名前:デフォルトの名無しさん :2005/10/07(金) 00:14:18
>>31
警告は、そのうちエラーになる前兆だと思うといい。
警告が全く出ないようにするのも一つの楽しみ。

33 名前:デフォルトの名無しさん :2005/10/07(金) 00:15:22
>>32
楽しみじゃなくて常識って言ってくれるかな

34 名前:デフォルトの名無しさん :2005/10/07(金) 00:22:10
質問です。

fstream::get()
などの方法で、ファイルから16ビットの文字、
ひらがなやカタカナなどを直接取得して認識する事は
出来るのでしょうか…?
それともバイナリで処理していかないとダメなのでしょうか?

35 名前:デフォルトの名無しさん :2005/10/07(金) 00:46:35
>>34

char std::fstream::get()だから、環境依存。
wcahr_t std::wfstream::wget()ってのはあったっけ。あればこちらを使うとよい。
今規格書見たけど無かった。

36 名前:デフォルトの名無しさん :2005/10/07(金) 00:47:12
×wcahr_t
○wchar_t

普段使わないとtypoするなorz

37 名前:デフォルトの名無しさん :2005/10/07(金) 00:47:30
std::wstringのgetlineじゃん

38 名前:デフォルトの名無しさん :2005/10/07(金) 00:49:10
コーディングはすきなんだが、コンパイルがいかんせん好きになれない

なにか、ソースをコンピュータに評価されている気分になる

39 名前:デフォルトの名無しさん :2005/10/07(金) 01:02:22
お姉様系美人教師に採点してもらってると思え

40 名前:デフォルトの名無しさん :2005/10/07(金) 01:08:21
ハァハァ 僕をもっとしかってください ハァハァ

41 名前:デフォルトの名無しさん :2005/10/07(金) 01:10:40
コンパイラの擬人化決定

42 名前:34 :2005/10/07(金) 01:38:51
>>35-37
参考に成りました、有難う御座いました。

43 名前:デフォルトの名無しさん :2005/10/07(金) 01:52:04
VC家長女タン - 最先端の難しい問題もそつなくこなし解答の内容も評価が高い。
          典型的優等生。窓組にしか顔が利かない社交性の低さはご愛嬌。
          今ならタダで付き合ってあげちゃうYO!
VC家次女タン - っていうかお前居たっけ?
VC家3女タン  - 難しい問題どころか標準的な問題でも解けずにすぐに泣き出してしまう
          ダメな子。でもダメな子ほど可愛い。
GCCタン - 家庭は貧乏だけれども地道な努力を積み重ね安定した実力を築き上げた
       努力の子。窓組からペンギン組まで顔の広さも天下一品。
       ただ、解かなくてよい問題まで解いてしまういらんことしいな部分も。
ICCタン - 最先端の問題も難なくこなし、解答の内容も一線級。
      お高くとまった高飛車なイメージと、差別的な発言が見られるという噂を
      どうするかが今後の人気を左右する?
DMCタン - 母国語で出される問題が難しくて嫌だと勝手に自分専用のコトバを
       作っちゃった子。その熱意があるなら母国語をもうちょっと頑張りましょう。
BCCタン - っていうかお前超頑張れ。

44 名前:デフォルトの名無しさん :2005/10/07(金) 02:30:49
GJ!

45 名前:デフォルトの名無しさん :2005/10/07(金) 02:44:26
これも付け足してくれ。

MCWタン - 標準的な問題はそれなりにこなし、顔もそれなりに広かった。
       昔はリンゴ組に人気だったけど、今は身売りされてどうなる事やら。
       ゲームは今でも得意。

46 名前:デフォルトの名無しさん :2005/10/07(金) 03:32:40
httpでアクセスして,ページのソースをmyDataBufferに格納しました↓
BOOL bOK = InternetReadFile(hFile,myDataBuffer,(DWORD)(size),&dwSize);

ただヤフーのページのため,EUC-JPでエンコードしないと文字化けします
C#では以下のクラスがありますが,C++ではどのようにしてエンコードするのでしょうか?

//C#の場合
Encoding.GetEncoding("EUC-JP").GetString(myDataBuffer);

47 名前:デフォルトの名無しさん :2005/10/07(金) 03:42:11
>>46
自前。ということで環境依存。以下のスレへ。

【初心者歓迎】C/C++室 Ver.21【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1125743714/

48 名前:デフォルトの名無しさん :2005/10/07(金) 10:07:28
>>47
ありがとうございます
逝ってきます!

49 名前:デフォルトの名無しさん :2005/10/07(金) 10:34:25
class Base {
public:
Base() { }
virtual void func()=0;
};
class Derived : public Base {
public:
Derived() { doSomething(); }
void func() {}
void doSomething() {}
};

Baseから派生するクラスは全て、
コンストラクタでdoSomethingを実行した後に
派生クラス側のfuncを実行させたいのですが……
私の今の知識では「基本クラスに派生クラスの関数を実行させる」ことは出来ないと認識していますが、
なんとか実行するトリックはないでしょうか。
お願いします。

50 名前:デフォルトの名無しさん :2005/10/07(金) 10:48:15
>>49
基底クラス“のコンストラクタ”に派生クラスの関数を実行させることができないだけ。

51 名前:デフォルトの名無しさん :2005/10/07(金) 10:56:52
>>50
なるほど、了解しました。
それは理解したのですが、相変わらずコンストラクタからは実行できずorz
特に「派生クラスのコンストラクタが終了した後に」virtualである関数を実行したいので、
コンストラクタの実行順(基底クラスが先)が壁になっています……

52 名前:デフォルトの名無しさん :2005/10/07(金) 11:57:48
何に困ってるのかがよくわからんのだけど・・・。

53 名前:デフォルトの名無しさん :2005/10/07(金) 12:28:52
>>49 (gcc 3.3.3)
struct base {
 base() {}
 virtual void func() = 0;
 virtual void doSomething() = 0;
 void func_wrapper() { doSomething(); func(); }
};

struct derived : public base {
 derived() {}
 void func() {}
 void doSomething() {}
};

derived d;
d.func_wrapper();


54 名前:デフォルトの名無しさん :2005/10/07(金) 21:15:40
>>53
それでもいいのですが……
・コンストラクト時にdoSomething, funcが完了している保証が必要
・doSomethingはfuncより先に行われる
・doSomethingはDerivedのメンバに依存する
・funcは独立していなければならない(後で別に呼ぶ可能性がある)

……Derivedの作成者に「コンストラクタの最後に必ずfuncを呼ぶ」というルールを強制するしかないのか……
守られるとは限らない訳だが……orz

55 名前:デフォルトの名無しさん :2005/10/07(金) 21:30:06
>>54
class Base {
protected:
 Base() {}
public:
 template <class T>
 static T *create() {
  Base *p = new T;
  p->doSomething();
  p->func();
 }
 virtual void doSomething() =0;
 virtual void func() =0;
};

struct Derived : public Base {
 void doSomething() {}
 void func() {}
};

Base *obj = Base::create<Derived>();

・・・汚いな(;´Д`) スマソ

56 名前:55 :2005/10/07(金) 21:31:34
すっげぇバカな勘違いしてますた orz
無視してけれ(´・ω・`)

57 名前:デフォルトの名無しさん :2005/10/07(金) 23:48:21
>>49
もはやDerivedとBaseが継承関係に無いけど、

class DerivedBase {
protected:
Base *owner_;
public:
DerivedBase() : owner_(NULL) {}
virtual ~DerivedBase(){}
void setOwner(Base *o){ owner_ = o;}
virtual void func(void) = 0;
virtual void doSomething(void) = 0;
};

class Derived : public DerivedBase {
public:
virtual void func(void) {}
virtual void doSomething(void) {}
};

class Base{
std::auto_ptr<DerivedBase> derived_;
public:
Base(std::auto_ptr<DerivedBase> d) : derived_(d) {
derived_->setOwner(this);
derived_->doSomething();
derived_->func();
}
};
つまり、is aとかhas aとかの関係が変なんじゃないの?と言いたい。


58 名前:デフォルトの名無しさん :2005/10/08(土) 00:20:43
>>32 >>33

ご支援ありがとうございました。
みなさん、経験豊富なんですね。すばらしいです。


59 名前:デフォルトの名無しさん :2005/10/08(土) 01:16:33
ふと疑問に思ったのですが,以下のようなプログラムはメモリーリークしないのでしょうか?

char* Log;
Log="123";    //(1)4byte確保
Log="1234567";  //(2)8byte確保

(2)のときに,(1)で確保された4byteはどうなるのでしょうか?
勝手に開放されるのでしょうか?


60 名前:デフォルトの名無しさん :2005/10/08(土) 01:18:06
解放されない。しなくても良い。

61 名前:デフォルトの名無しさん :2005/10/08(土) 01:21:21
>>60
それなら
for(int i=0;i<100000;i++){
  Log="長い文字列";
}
とすると,大量のメモリを消費するということでしょうか?

62 名前:デフォルトの名無しさん :2005/10/08(土) 01:24:09
しません

63 名前:デフォルトの名無しさん :2005/10/08(土) 01:26:36
そもそも、文字列はメモリを動的確保しないじゃろ。

Log = "なにか";

は、文字列リテラルへのポインタを代入してるだけ。

64 名前:デフォルトの名無しさん :2005/10/08(土) 01:32:32
もしかしてこの関数は使えませんか?!

const char* GetMessage()
{
  char* Message;
  Message="関数の中で確保";
  return Message;
}

65 名前:デフォルトの名無しさん :2005/10/08(土) 01:35:31
>>64
試してみたら,問題なく使えました!

66 名前:デフォルトの名無しさん :2005/10/08(土) 01:36:21
となると,文字列にはガーベッジコレクションが実装されているのですか?

67 名前:デフォルトの名無しさん :2005/10/08(土) 01:40:21
されてません。

68 名前:デフォルトの名無しさん :2005/10/08(土) 01:40:26
性的なんだよ。

69 名前:デフォルトの名無しさん :2005/10/08(土) 01:42:05
>>66

int i;
void f(){
  int* p;
  for(1000){
    p = &i;
  }
}

70 名前:デフォルトの名無しさん :2005/10/08(土) 01:43:00
おまえはなにをしたいんだ

71 名前:デフォルトの名無しさん :2005/10/08(土) 01:47:39
あ,分かりました!
コンパイル時にすでにサイズが決まって,実行時のはじめに領域が確保される(=静的)んですね!!
それだとこの場合は無駄なメモリを確保するんですね!

bool bOK=1;
char* Log;
if(bOK) Log="短い文字列"
else  Log="超超長い文字列"

72 名前:デフォルトの名無しさん :2005/10/08(土) 01:49:49
bOKが固定で、最適化で排除されなければね。

73 名前:デフォルトの名無しさん :2005/10/08(土) 01:52:17
分かりました!!!
ありがとうございます!
ってか,よく細かいつまらないことまでご存知ですね!
これでもC/C++歴5年ですが,,,

74 名前:デフォルトの名無しさん :2005/10/08(土) 01:52:22
そうする必要があるのなら、無駄ではないんじゃない。

75 名前:デフォルトの名無しさん :2005/10/08(土) 01:57:41
つーか、5年もなにやってたのかと。

76 名前:デフォルトの名無しさん :2005/10/08(土) 01:58:23
char *str="hoge";
char str[]="hoge";
の違いを勉強する時に一度は目にする内容だけどなぁ。

77 名前:デフォルトの名無しさん :2005/10/08(土) 04:57:58
ここは釣り堀じゃないですよ

78 名前:デフォルトの名無しさん :2005/10/08(土) 05:28:58
名前を指定すると対応する関数を呼び出すようなものをクラス化しようとしているのですが、うまくコンパイルできません。どう書けばよいのでしょうか?
ちなみにコンパイラはBCC++5.5です。以下のソースでは「クラスメンバーを初期化できない」というエラーになりました。
名前から関数への変換に、テーブルを使わずにif()の連続攻撃なら、コンパイルできますが、あまりに愚かしいので・・・

#include <string.h>
class X{
public:
 void FuncA(void);
 void FuncB(void);
 typedef struct tagNAMETOFUNC{
  char* Name;
  void (*Func)(void);
 } NAMETOFUNC;
 NAMETOFUNC NameToFunc[] = {
  {"FuncA", FuncA},
  {"FuncB", FuncB},
 };
 void Select(char *Name){
  int i;
  for (i = 0; i <= 1; i ++){
   if (strcmp(Name, NameToFunc[i].Name) == 0){
    NameToFunc[i].Func();
    return;
   }
  }
 }
};

79 名前:デフォルトの名無しさん :2005/10/08(土) 06:18:23
>>78 std::map< std::string , boost::function< void () > >

80 名前:デフォルトの名無しさん :2005/10/08(土) 06:30:07
class X
{
    typedef void (X::*FUNCTYPE)();

    struct  NAMETOFUNC
    {
        char*       funcName;
        FUNCTYPE    funcPtr;
    };

    static  const NAMETOFUNC funcList[];

    void    FuncA();
    void    FuncB();

};

const X::NAMETOFUNC X::funcList[] =
{
    "FuncA", &X::FuncA,
    "FuncB", &X::FuncB,
};


81 名前:デフォルトの名無しさん :2005/10/08(土) 08:08:48
>>80
うわっ、これメンバ関数を呼び出す時は

X x;

(x.*x.funcList[i].funcPtr)();

なんて奇っ怪な書き方をしないとだめなのか。x.とx.*が一個ずつ出てくる所が
気持ち悪い。

82 名前:デフォルトの名無しさん :2005/10/08(土) 08:28:59
メンバ内からなら、
(this->*funcList[i].funcPtr)();


83 名前:デフォルトの名無しさん :2005/10/08(土) 21:08:15
>>55-57
アドバイスありがとうございます。
アスペクト指向的なトリックは使えそうかも……
確かにis aないしhas aの関係がおかしいかもしれません……
というより過度の一般化を試みていると言った方がいいかも。
もう一度その辺りを見直してみて、身の丈にあった設計を考えてみます。

84 名前:デフォルトの名無しさん :2005/10/09(日) 01:45:19
ファイルへバイナリで書き込むとき、数値を直接記述することは出来ないのでしょうか

int number = 84;
ofstrm.write( (const char*)&number, 4 );


ofstrm.write( (const char*)84, 4 );
として読みやすくしたいなと

85 名前:デフォルトの名無しさん :2005/10/09(日) 02:57:05
>>84
禿げしく遅いけど。boost::format当たりに何かいいのがあると思う。

#include <iostream>
#include <fstream>

class Binary {
 int x, y;
public:
 Binary(int i = 0, int j = 0) : x(i), y(j) {}
 int getx() const { return x; }
 int gety() const { return y; }
};

std::ostream& operator<<(std::ostream& os, const Binary& bin)
{
 const int x = bin.getx();

 for (int i = 0; i < bin.gety(); i++)
  if (!os.put(reinterpret_cast<const char*>(&x)[i]))
  return os;
 return os;
}

int main()
{
 std::ofstream test("test.bin", std::ios::out | std::ios::binary);

 test << Binary(84, 4);
}

86 名前:デフォルトの名無しさん :2005/10/09(日) 03:03:51
あ、やっぱこれまずいわ。
第一に環境依存。
第二に4バイトintでlittle endian(x86等)だと3バイト以下が変。バグあり。

第二の方はfor文の中身をいじれば直る。

for (int i = bin.gety() - 1; i <= 4; i++)

それから i = 0の時はエラーを返さないとだめだね。

87 名前:デフォルトの名無しさん :2005/10/09(日) 03:04:33
for (int i = bin.gety() - 1; i < 4; i++)

だめだ寝ぼけてる。スマン。

88 名前:デフォルトの名無しさん :2005/10/09(日) 03:14:17
>>85
自己レス。little endianでなら
std::ostream& operator<<(std::ostream& os, const Binary& bin)
{
const int x = bin.getx(), y = bin.gety();

if (y == 0)
return os;
for (int i = 0; i < y; i++)
if (!os.put(reinterpret_cast<const char*>(&x)[i]))
return os;
return os;
}
big endianなら

if (y == 0)
 return os;
else
 for (int i = y - 1; i < 4; i++)

かな。うーん汚い。

89 名前:デフォルトの名無しさん :2005/10/09(日) 03:25:10
環境依存でもこれでええやん
write(fd, &number, sizeof(number))

90 名前:デフォルトの名無しさん :2005/10/09(日) 03:30:11
>>89
FILE* 使ってもいいならそれでいいんだが・・・・
多分ストリームを使いたいんじゃないかと。

91 名前:デフォルトの名無しさん :2005/10/09(日) 03:31:28
あ、チゴタ、FILE*じゃなくて、低レベルI/Oか。
もうだめだ寝る。

92 名前:デフォルトの名無しさん :2005/10/09(日) 08:21:34
>>84
というわけで、具体的に何をしたいのか書かないと有効な回答が得られないのです。

93 名前:デフォルトの名無しさん :2005/10/09(日) 08:35:31
>>84
お前がやりたいことはofstrm << '\x54';で十分のような。

94 名前:デフォルトの名無しさん :2005/10/09(日) 21:01:38
int calculation( long long int *f, long long int *a, int n )
{
    int i = 1;
    int j;

    a[1] = f[1];

    while( i < 10 ){
        for( j = 2; j <= n; j++ ){
            a[j] = f[j] - a[j-1] * i;
        }
        if( -1 < a[n] && a[n] < 1 ){
            break;
        }
        else{
            i*= -1;
            if( 0 < i ){
                i++;
            }
        }
    }
    return i;
}

組み立て除法で割り切れる数値を探すプログラムなのですが、
if( -1 < a[n] && a[n] < 1 )
の判定が上手く出来ません。
勿論
if( a[n] == 0 )
も検証してみました。
判定の直前で a[n] の値を出力すると0と出てくるので原因が分かりません。
どなたか助けてください。

95 名前:デフォルトの名無しさん :2005/10/09(日) 21:55:22
もしかして long long int *a の元の配列の大きさは a[n]ではないか?

96 名前:デフォルトの名無しさん :2005/10/09(日) 22:23:47
>>94
x=iで考えて
    while( i < 10 ){
        for( j = 2; j <= n; j++ ){
            a[j] = f[j] + a[j-1] * i;
        }
        if( -1 < a[n] && a[n] < 1 ){
            break;
        }
        i++;
    }

97 名前:94 :2005/10/10(月) 00:43:33
>>95
いや、それは大丈夫です。
配列の要素数は n + 1 となっています。

>>96
?
どういう意味でしょうか?

98 名前:デフォルトの名無しさん :2005/10/10(月) 01:02:29
おせーてください!
constなメンバ変数を持つクラスを自作したわけなんですが、
operator=が必要になりました。デフォルトで済まそうとすると、
constには代入できねえよボユゲと言われてしまいます。
こいつを代入できるようにするにはどうすればいいでしょうか。

99 名前:デフォルトの名無しさん :2005/10/10(月) 01:03:31
>>98
operator=を書く


100 名前:デフォルトの名無しさん :2005/10/10(月) 01:15:19
operator=内でconstメンバの代入はどう処理するつもり?

101 名前:デフォルトの名無しさん :2005/10/10(月) 01:15:43
>>98
コンストラクタ・コピーコンストラクタはconstやリファレンスにも代入できるだろ。
それを利用してoperator=を書く。

102 名前:デフォルトの名無しさん :2005/10/10(月) 01:18:34
間違った
代入ではなくて、初期化リストに書く。

103 名前:98 :2005/10/10(月) 01:20:27
>>99-101
レスありがとうございます。
>それを利用してoperator=を書く
な、なるほど!コピーコンストラクタなら既につくっとります!
これでなんとかやってみます!
どうやるのか全然想像つきませんが!

104 名前:デフォルトの名無しさん :2005/10/10(月) 01:24:38
>>100
const_cast


105 名前:デフォルトの名無しさん :2005/10/10(月) 01:25:01
というか、普通にコンストラクタでnewして、*thisに代入すれば
いいじゃないか。

106 名前:デフォルトの名無しさん :2005/10/10(月) 01:29:18
そもそもconstなメンバ変数をもつクラスに、
代入演算子を定義するのが根本的に設計が間違ってる気がする。

107 名前:デフォルトの名無しさん :2005/10/10(月) 01:33:25
>>105
これをすると新旧インスタンスが2つできることになるけど
この場合どっちを明示的にdeleteするべきなの?


108 名前:デフォルトの名無しさん :2005/10/10(月) 01:33:32
>>98
このように代入演算子中で一時オブジェクトを作り、*thisに代入する。
#include <iostream>

class A {
 const int i; // 例えば
public:
 A(int j = 0) : i(j) {}
 A(const A& a) : i(a.i) {}
 A& operator=(const A& a) {
  return *this = A(a.i);
 }
};

int main()
{
 A a, b;

 a = b;
}


109 名前:98 :2005/10/10(月) 01:33:52
なんか・・いろいろレスありがとうございます
頭こんがらがってきましたがなんとかやってみますorz

>>106
はじめはprivate宣言してたんですが
それをvectorに格納しようとするとoperator=が使えないと
できないよなんて言われまして・・・
ポインタを格納すれば早いんですが
なんとか代入演算子を定義できないものかと

110 名前:デフォルトの名無しさん :2005/10/10(月) 01:34:22
>>107
newはこの場合使うな。メンバにポインタが含まれている時のみ使う。

111 名前:デフォルトの名無しさん :2005/10/10(月) 01:35:37
>>104
そういう技術的な話じゃなくてさ

112 名前:デフォルトの名無しさん :2005/10/10(月) 01:39:45
>>108
> A& operator=(const A& a) {
>  return *this = A(a.i);
> }
これは自分自身を読んでね?


113 名前:デフォルトの名無しさん :2005/10/10(月) 01:44:54
>>108
そいつは永久ループに入ります。
やるとすればこういう風にしないと。

#include <iostream>
#include <new>

class A {
const int i;
public:
A(int j = 0) : i(j) {}
A(const A& a) : i(a.i) {}
A& operator=(const A& a) {
new (this) A(a.i);
return *this;
}
void printi() const {
std::cout << "i = " << i << std::endl;
}
};

int main()
{
A a(123), b;

b = a;
a.printi();
b.printi();
}

114 名前:デフォルトの名無しさん :2005/10/10(月) 01:49:13
>>113
new(this)の前にデストラクタ呼びましょうよ

115 名前:デフォルトの名無しさん :2005/10/10(月) 01:49:46
>113
しかしそれはいろいろ危険性が

116 名前:デフォルトの名無しさん :2005/10/10(月) 01:51:26
>>114
デストラクタも呼ぶなら自分自身が引数のときに代入をスキップするのも忘れるなよ。

117 名前:デフォルトの名無しさん :2005/10/10(月) 01:54:27
おぉ目から鱗だ
完璧なoperator=をコピーコンストラクタ使って書くと結局どう書くのが正解?


118 名前:デフォルトの名無しさん :2005/10/10(月) 01:56:04
というかやはり const メンバを持つクラスに代入を定義するところに難がある気がする
具体的にどういう設計かは書いてないからこれ以上は指摘しようがない

>117
例外を送出しない swap を実装しているとして

A tmp(a);
tmp.swap(*this);
return *this;

っていうか基本

119 名前:デフォルトの名無しさん :2005/10/10(月) 01:58:22
>118
あー、ちなみにこれは const メンバがない場合の話ね。
const メンバがあるクラスの代入については 118 の最初に書いたとおり

120 名前:デフォルトの名無しさん :2005/10/10(月) 02:01:10
簡単な問題のように見えて、意外と難しい問題だな。
C++トリビア1と呼ぶか。まあ>>118さんのおっしゃっておられる
ように、constメンバは基本的に初期化しかできないので、
設計に難があるという事になるな。

121 名前:デフォルトの名無しさん :2005/10/10(月) 02:02:33
>>117
new使うならこんな感じかな。

thisとaが同じインスタンスで、
さらにaがAを多重継承していて且つ、
thisとaでそれぞれ参照しているAが違う場合を考えると不正解だけど。

まぁ、そこまで神経質にならなくてもいいかな。

A& operator=(const A& a) { 
    if(this != &a){
        this->~A();
        new (this) A(a); 
    }
    return *this; 


122 名前:121 :2005/10/10(月) 02:03:53
あとaがthisのメンバ変数になってる場合もアウトか

123 名前:121 :2005/10/10(月) 02:07:16
あ、しまった。
二回コピーコンストラクタ呼び出すと回避できるね。
A& operator=(const A& a) {
    if(this != &a){
        A b=a;
        this->~A();
        new (this) A(b);
    }
    return *this;
}

124 名前:98 :2005/10/10(月) 02:07:16
>>113-116
感動しますた
しかし自分では全く思い浮かばなかったばかりか
コードを見た後も処理がいまいち理解できません。
まあそれはこれから勉強します。ありがとうございました!

>>118
球を表わすclass Ballが、メンバにpos,vel,accと定数mass,radius,rebound
を持っているという感じでして、代入は初め禁止してまして。
それを複数個保持したいなと。vector<Ball>を使おうかな、と。
そうすると>>109という

125 名前:デフォルトの名無しさん :2005/10/10(月) 02:12:26
気持ち悪いC++って。

new (this) A(b);

こういうnewの配置構文初めて見た。ま、確かにコンストラクタから
コンストラクタを呼び出せない(呼び出しても結果が残らない)C++独特の
trickだね。

126 名前:デフォルトの名無しさん :2005/10/10(月) 02:13:33
×newの配置構文
○newの配置構文の使い方

127 名前:デフォルトの名無しさん :2005/10/10(月) 02:13:56
118と123はお互いのコードをどう思う?
ツッコミたいこととか


128 名前:デフォルトの名無しさん :2005/10/10(月) 02:20:58
>121-123
継承云々を抜きにしても、たとえば A のコピーコンストラクタが
例外を送出した場合のことを想像してみてくださいな

>124 については違和感があるけれど言葉がまとまらないなぁ。妥当な気もするけど
誰かヘルプ

129 名前:121 :2005/10/10(月) 02:29:14
>>128
じゃあ、例外を送出しない コピーコンストラクタ を実装しているとして、とかを条件に加えればOK
問題は自分が定義する外に責任転嫁しちまえ。

......ゴメン、例外忘れてたわorz

130 名前:デフォルトの名無しさん :2005/10/10(月) 02:34:04
例外まで考慮すると、今のC++の文法だけでうまく書けるんかいな?

131 名前:デフォルトの名無しさん :2005/10/10(月) 02:40:58
124 については、C++ というのは(上のように配置構文 new を使うなどしない限り)
一つのメンバの定数性がクラスオブジェクト全体の定数性に伝播するような
モデル(それが良いか悪いかはともかくとして)なので、クラスオブジェクト全体を
非定数にしたいなら、メンバは全て非定数として宣言して、クラス内部における定数性は
クラスの実装者が責任を持つしかしようがない、ということなんですかね?
ちょっと強引かなぁ

132 名前:デフォルトの名無しさん :2005/10/10(月) 04:09:14
>>131
> クラスオブジェクト全体を非定数にしたいなら、メンバは全て非定数

これは普通に考えて必然だろ。

メンバ radius が定数であるなら、 radius が 1 のインスタンスに
radius が 2 のインスタンスを代入すること自体が論理的に不可。

133 名前:デフォルトの名無しさん :2005/10/10(月) 04:23:36
>>132
ああ確かにそうだな。やっぱり普通にprivateにしてアクセサ書くか。
クラス内の非constメンバの値の管理は自己責任だというのが
正しいC++の考え方だもんな。

134 名前:デフォルトの名無しさん :2005/10/10(月) 08:52:47
あー、寝る前に変な質問が出てきたと思ったらやっぱりまともな結論に落ちるまでに紆余曲折あったか。

135 名前:デフォルトの名無しさん :2005/10/10(月) 09:08:14
んなどうでもいいことイチイチ書くな

136 名前:デフォルトの名無しさん :2005/10/10(月) 09:18:39
煽らずにはいられない性格

137 名前:デフォルトの名無しさん :2005/10/10(月) 10:05:29
自己顕示欲が強いのに、面白いことがまったく書けない悲惨なセンスしてると、
どうしても煽りに頼った人目の引き方に走ってしまうんだよね。

138 名前:デフォルトの名無しさん :2005/10/10(月) 10:34:56
SFINAEの読み方を教えてください

139 名前:デフォルトの名無しさん :2005/10/10(月) 10:38:50
>>138
セックス・フレンド稲枝

140 名前:134 :2005/10/10(月) 11:31:51
>>137
ん、寝る前だったからうまい突っ込みを思いつかなかった。
素直に「非constにして隠蔽しろ」とでもすればよかったんだが。

141 名前:デフォルトの名無しさん :2005/10/10(月) 11:59:48
>>138
スフォルツァンドいーなー

142 名前:namahage :2005/10/10(月) 18:07:54
logxのテーラー展開するプログラムってどうやったらいいんですか?

143 名前:namahage :2005/10/10(月) 20:31:22
age

144 名前:デフォルトの名無しさん :2005/10/10(月) 21:22:30
>>141-142
どこらへんが C++ の話題なのか説明できるようになってから出直せ。

145 名前:デフォルトの名無しさん :2005/10/10(月) 21:47:53
うるせー馬鹿

146 名前:デフォルトの名無しさん :2005/10/10(月) 22:16:18
BM法の文字列検索の主な部分です。 while(strcmp(koukyou[m].name,"")!=0)のところがループしません。 データはすべてはいっていることは確認しました。 なにがわるいんでしょうか?教えてくださいおねがいします。
ヘッダ部分の宣言
class CSearch :
public CFileData
{ public:
CSearch(char *name);
virtual ~CSearch(void);
int result[300];
int skip[256];
void table(char *key);
char *Search(char *text,char *key);
void str_match(char *key);};


147 名前:デフォルトの名無しさん :2005/10/10(月) 22:17:28
つづきです。
cpp部分。
#include "StdAfx.h"
#include "Search.h"
CSearch::CSearch(char *name) {
file_koukyou(name);
for(int i=0;i<300;i++){
result[i]=0;} }
CSearch::~CSearch(void) { }
void CSearch::table(char *key){
int k,n; n=(int)strlen(key); for(k=0;k<=255;k++) skip[k]=n;
for(k=0;k<n-1;k++) skip[key[k]]=n-1-k; }
char *CSearch::Search(char *text,char *key) {
// return strstr(text, key);
int m,n; char *p;
m=(int)strlen(text); n=(int)strlen(key); p=text+n-1;
while(p<text+m) {
if(*p==key[n-1]) {
if(strncmp(p-n+1,key,n)==0)//右端だけを比較
return (p-n+1);// }
p=p+skip[*p];//サーチ位置をすすめる。 }
return 0; }
void CSearch::str_match(char *key) { char *p;
table(key); int m=0; int j=0; int num;
while(strcmp(koukyou[m].name,"")!=0) {
p=Search(koukyou[m].name,key);
while(p != NULL) {
printf("%s\n",p); p=Search(p+strlen(key),key); result[j]=m; printf("%d\n",result[j]); j++; } m++; } }


148 名前:デフォルトの名無しさん :2005/10/11(火) 01:42:36
ちょっとすいません
enum Bool{TRUE,FALSE};
union T
{
  char a;
  struct
  {
    Bool b :1;
    Bool c :1;
  };
};
でsizeof(T)が4になる理由をおしえてくれ


149 名前:デフォルトの名無しさん :2005/10/11(火) 01:44:13
ageわすれ


150 名前:デフォルトの名無しさん :2005/10/11(火) 01:53:49
パディング

151 名前:デフォルトの名無しさん :2005/10/11(火) 01:56:27
お返事ありがたいんですが,
どうパディングされたらビットフィールドの値を無視して4になるのかわからんのです。

152 名前:デフォルトの名無しさん :2005/10/11(火) 02:08:37
ビットフィールドの値は無視されて無い。
enum Bool が 32bit になる筈だから、sizeof(T) == 4 になる。

153 名前:デフォルトの名無しさん :2005/10/11(火) 02:16:43
よく理解できないんでもう一度考えてみます.
レスありがとうございました。

154 名前:デフォルトの名無しさん :2005/10/11(火) 02:24:14
>>153
ビットフィールドがどう配置されるかは処理系依存だけど、
「オブジェクトの型表現のサイズが指定したビットより大きい場合、余ったビットは詰め物として使われる」
とだけあるから、例えば
struct T {
 int a:1;
};
sizeof(T) == sizeof(int)
になるし、
struct T{
 short a:1;
};
sizeof(T) == sizeof(short)
になることは確か。
でこの場合、Bool b :1;の時点でsizeof(T) >= sizeof(int) (=4)は確定して、あまりのところにcが詰め込まれたんでしょ。

155 名前:デフォルトの名無しさん :2005/10/11(火) 02:25:00
っていうか、普通は enum にビットフィールドを設定することって無いとおもった
上手く動かないことの方が多いんじゃないか

156 名前:デフォルトの名無しさん :2005/10/11(火) 02:28:29
enumの値を保持するのに十分なサイズが指定されている場合には、元の列挙子と同じように使えなければならない
と規格で決まってるから大丈夫。

157 名前:デフォルトの名無しさん :2005/10/11(火) 03:27:27
ってことは、これってsizeof(BOOL)==sizeof(T)を強制できるってことか?

158 名前:148 :2005/10/11(火) 12:48:49
struct S1 { union T; };
struct S2 { T t; };
とすると(ちょっと古いg++ですが)

sizeof(T) == 8
sizeof(S1) == 1
sizeof(S2) == 8
となることが分かりました.

いろいろと腑に落ちない部分がありますが触れてはいけないようなので別の方法を試みることにしました.レスくれた方ありがとうございます.


159 名前:148 :2005/10/11(火) 12:53:08
すいません.嘘書きました(汗
sizeof(T) == 4
sizeof(S1) == 1
sizeof(S2) == 4
の間違いです

160 名前:デフォルトの名無しさん :2005/10/11(火) 22:45:10
>>158
もともと何も問題起きてないと思うんだが、つか、C++/class じゃなくて、
基本的には C言語でのこの種の理解をしてないだけじゃないかしら

161 名前:デフォルトの名無しさん :2005/10/11(火) 23:03:38
>>148
自分で作ってみたら?
サイズがシステムに最適化されるプリミティブなクラスでも。

162 名前:デフォルトの名無しさん :2005/10/12(水) 02:14:41
>>154
> 「オブジェクトの型表現のサイズが指定したビットより大きい場合、余ったビットは詰め物として使われる」
これは規格からの引用?どこ?
9.6.1 だとしたら
「指定したビット数がオブジェクトの型表現のサイズより大きい場合」
の間違いじゃない?

sizeof(T) == sizeof(int) になることも
sizeof(T) == sizeof(short) になることも
確かだと言える根拠は無いでしょ?
全部処理系依存。

163 名前:デフォルトの名無しさん :2005/10/12(水) 02:18:00
>>155
C だと (signed|unsigned) int しか使えなくて、
C++ でその他の整数型と enum が許されるようになったみたいだから、
移植性を気にする人は使わないんだろうね。

164 名前:デフォルトの名無しさん :2005/10/12(水) 03:00:21
各ビットをフラグに使うだけなら論理積で十分だしなぁ

165 名前:デフォルトの名無しさん :2005/10/12(水) 03:59:19
>>158
S1の T ってただの型宣言になってるぞ。
sizeof(S1) == 1 になって当たり前w

166 名前:デフォルトの名無しさん :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]のような物を作りたいのですが、
上手くいかなくて困り果てています…

167 名前:デフォルトの名無しさん :2005/10/12(水) 21:09:28
class CSomething
{
public:
 int getInstance(){ /* なんちゃらかんちゃら */ };
};

int g_N = CSomething::getInstance();

int main()
{
 return 0;
}


グローバル変数を↑こういう風に初期化するのって問題ないですか?

168 名前:デフォルトの名無しさん :2005/10/12(水) 21:12:55
まずはstaticにするべきじゃないかな?

169 名前:167 :2005/10/12(水) 21:14:49
>168 正しくは↓でした('Д`;)

class CSomething
{
public:
 static int getInstance(){ /* なんちゃらかんちゃら */ };
};

170 名前:デフォルトの名無しさん :2005/10/12(水) 21:14:53
>>167
いいけどその例ではgetInstanceが静的メンバでないとCSomethisng::で修飾してのアクセスはできないよ。

171 名前:デフォルトの名無しさん :2005/10/12(水) 21:30:14
どういうプログラム組んでるか分からないから、わざわざ静的メンバ関数で
グローバル変数を初期化する意義が読み取れない。
だからまあ、設計に関しての常套文句が二つ三つ出てヤメレって言うしかないわけだが。

172 名前:デフォルトの名無しさん :2005/10/12(水) 22:04:08
>>166
動的な1次元のプロキシクラスを作って、それの配列クラスという形で、
2次元クラスを作るのが常套手段。

173 名前:167 :2005/10/12(水) 22:11:05
>168-171
コード・文法的に問題あるとかってことはないぽってことですね。
ありがとうございました。

>171
確かにサンプルコードだけ見ると、何しようとしてるんだって感じですね。
実際にはもう少し意義ある形なので、ここはお目こぼしを[・∀・]

174 名前:デフォルトの名無しさん :2005/10/13(木) 03:10:23
void foo(A& a)
{
 bzero(&a, sizeof(a));
}

なんで最初の要素しか0にならんのか
暫く気づかなかった

175 名前:デフォルトの名無しさん :2005/10/13(木) 03:39:31
聞くは一時の恥 聞かぬは一生の恥
うん。がんばろう。

>>174
なんでなん?orz

176 名前:デフォルトの名無しさん :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バイト初期化されるが・・・・・

177 名前:デフォルトの名無しさん :2005/10/13(木) 04:20:07
>>166
自分で作るのが面倒ならboost::multi_arrayがその目的まんまだから使ってしまえ

178 名前:デフォルトの名無しさん :2005/10/13(木) 04:27:57
>>176
>174はポインタを渡して配列を初期化するつもりだったんジャマイカ?

179 名前:デフォルトの名無しさん :2005/10/13(木) 04:35:15
>>178
なんだそういう事か。

180 名前:デフォルトの名無しさん :2005/10/13(木) 05:08:27
>>178
納得

181 名前:hoge :2005/10/13(木) 13:58:22
@boolとintってどっちが高速なんですか?

AテンプレートってC++にしかないんですか?


182 名前:デフォルトの名無しさん :2005/10/13(木) 14:04:31
>>181
@intに0か1を入れてbool代わりに使う という話ならどちらも大差ない
Aジェネリクスの概念は他の言語にもある

183 名前:デフォルトの名無しさん :2005/10/13(木) 18:35:13
>>182
でもC++程強力なテンプレートは

184 名前:デフォルトの名無しさん :2005/10/13(木) 18:44:43
強力……っていうかむしろ大惨事発生装置。

185 名前:181 :2005/10/13(木) 18:52:04
JAVAにありましたっけ?

186 名前:デフォルトの名無しさん :2005/10/13(木) 18:58:12
最近出来た。コレクションからオブジェクト出すときのキャストを省略する目的で。

187 名前:デフォルトの名無しさん :2005/10/13(木) 19:01:11
>>185
一応有る。Java Genericsでググるといっぱい出てくるよ。
JavaSDK1.5に入る予定だったけど、結局入ったのかどうかは知らない。
たしかC++程の強力さはないけど。

188 名前:デフォルトの名無しさん :2005/10/13(木) 19:19:19
c++のテンプレートってさ
Tになにを求められるか−たとえばTは++演算子が使えるインターフェイスでなければならない
ってのがよみとりにくくて不便じゃない?

189 名前:デフォルトの名無しさん :2005/10/13(木) 19:53:04
>>188
そこでC++ 0xではコンセプトを導入してそういうことをコードに書けるようにしようということになっている。

190 名前:174 :2005/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;
ってな感じなわけですよ!!!!

191 名前:デフォルトの名無しさん :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 にしたほうが良いかどうか。。。
あるいは、全く別の構造にしたほうが良いのか。。。
アドバスお願いします。

192 名前:デフォルトの名無しさん :2005/10/14(金) 01:44:17
>>190
で、なんで最初の要素しか0にならんの?

193 名前:デフォルトの名無しさん :2005/10/14(金) 01:45:43
>>191
set<char> にした場合の使い方がわからない。

194 名前:デフォルトの名無しさん :2005/10/14(金) 02:03:45
素朴な疑問なんだが、set<char>同士ってoperator< で比較できるのか?

195 名前:デフォルトの名無しさん :2005/10/14(金) 02:21:04
>>194 できるよ。

196 名前:デフォルトの名無しさん :2005/10/14(金) 02:40:23
>>195
おお、本当だ!ありがとう。

197 名前:デフォルトの名無しさん :2005/10/14(金) 07:14:00
>>190
あーなるほど。
>>192
sizeof(a)

198 名前:デフォルトの名無しさん :2005/10/14(金) 07:30:17
>>197
なにが「なるほど」なのやら。両方ともゼロになるだろ。

199 名前:デフォルトの名無しさん :2005/10/14(金) 07:35:26
>174が書き間違えている悪寒。

200 名前:デフォルトの名無しさん :2005/10/14(金) 08:53:30
>>198
ならない

201 名前:デフォルトの名無しさん :2005/10/14(金) 09:20:31
>>200
なるよ。

202 名前:デフォルトの名無しさん :2005/10/14(金) 09:25:36
今日のム板は初っ端からクオリティの低い書き込みが多いな
それともC++関連だけか?

203 名前:デフォルトの名無しさん :2005/10/14(金) 10:35:27
クオリティって言ってみたかっただけっぽい

204 名前:デフォルトの名無しさん :2005/10/14(金) 14:46:55
>>197
sizeof(A) ならいいけど sizeof(a) だからダメって言うこと?
コンパイラがバグってるだけじゃない?

205 名前:デフォルトの名無しさん :2005/10/14(金) 15:43:58
sizeof(A&) が 4 か 8 か、どっちよ?
って話しだべ?
参照はポインタみたいなもんだから。

どっちが正しいか知らんけど、
VC7.1 じゃ 8 だったな。

206 名前:デフォルトの名無しさん :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になるのが正しい

207 名前:デフォルトの名無しさん :2005/10/14(金) 21:38:04
ギョエー

208 名前:デフォルトの名無しさん :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;
}}}


209 名前:デフォルトの名無しさん :2005/10/14(金) 22:55:51
あ、iterator 使わないと駄目だ↑

210 名前:デフォルトの名無しさん :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++;
}}

211 名前:デフォルトの名無しさん :2005/10/14(金) 23:02:48
実際には automaton から status の中の変数は扱えないので
2段に分けて記述しています。

212 名前:デフォルトの名無しさん :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は変な値になる。


213 名前:デフォルトの名無しさん :2005/10/14(金) 23:29:56
printfは型チェックしないからキャストもされない。

214 名前:デフォルトの名無しさん :2005/10/14(金) 23:34:36
そしてC++のiostreamなら型チェックがあるからoperator intで変換できる、という流れへ。

printfでは自分でstatic_castすればとりあえず動く。
printf("%d, %d", static_cast<int>(val1), static_cast<int>(val2));


215 名前:デフォルトの名無しさん :2005/10/15(土) 00:01:51
なるほど。ありがとうございます。
ってことはほかの場所でも実はちゃんとintにキャストされずに動いてる可能性もあるわけですね。
ちょっと怖いですね。

216 名前:デフォルトの名無しさん :2005/10/15(土) 00:15:06
こういうことがおこるのはprintfみたいに可変個引数を使っている場合だけだがな。

217 名前:デフォルトの名無しさん :2005/10/15(土) 19:47:40
http://kittand.hp.infoseek.co.jp/ihuy/cpp.htm

これC言語知ってる人がC++の補足として使えるかと思って書いたやつで
基本的に本から抜粋しただけのものですけど、
間違いとか不足してるところとかありませんか?


218 名前:デフォルトの名無しさん :2005/10/15(土) 19:56:50
>>217
書いた人ですか?
最初のほうを読んで一つ目だけ。

>高度な型 - C++の構造体
>メンバ関数を持つことができる。(実際のプログラミングでは、使わないこと)
括弧部分が大きなお世話。
関数オブジェクトではstructにメンバ関数を書くのが普通だったりする。


219 名前:デフォルトの名無しさん :2005/10/15(土) 20:00:48
あとは見出しだけざっと見ただけだが、templateやnamespaceの記述が無い・・。
標準C++ライブラリを使うには必須の機構だし、普通に使うものなので
今C++を語るなら書かないのは片手落ちだろうなあ。

220 名前:デフォルトの名無しさん :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使うべき


221 名前:デフォルトの名無しさん :2005/10/15(土) 20:44:13
>void型はC++で創始され、それがANSI Cに反映されたものであり、voidについてC++で正しいことはANSI Cでも正しい。
ダメすぎ。

総じて、よく判っていないながら実務経験だけはある香具師が、経験則から得たメモを書いているだけ。
書いた香具師のプロファイリングを楽しむにはいいが、参考にはならない。

222 名前:デフォルトの名無しさん :2005/10/15(土) 20:47:14
重要な所が結構抜けてるね。

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

あとこういうの書くときはC++の設計と進化を読んで書いて欲しい。

223 名前:デフォルトの名無しさん :2005/10/15(土) 21:42:50
>>217
つっこみどころが多すぎてつっこめません・・・

224 名前:デフォルトの名無しさん :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。

続く

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

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

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

volatileはC由来。

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

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

あと、本文中に1度もオブジェクト指向、ポリモーフィズムと言った言葉が出てこないのが異常。
テンプレート、名前空間、例外が全く出てこないのもどうかと。
しかしこれらを直しても所詮は付け焼き刃、根本的にお前自身がC++をよくわかっていないだろ。

226 名前:デフォルトの名無しさん :2005/10/16(日) 03:30:30
Cにおいてchar型は自動的にintに昇格していたが、
C++においてもintに昇格したのち演算が適用される

8行目にして間違っている解説はなかなかないが
それに気づかない人たちのなにやら難しいつっこみはいっそう無視してよい

227 名前:デフォルトの名無しさん :2005/10/16(日) 07:51:17
いや、3行目の間違いが既に指摘されている。

228 名前:デフォルトの名無しさん :2005/10/16(日) 09:47:43
細かいことだけど、constにbool、参照、ifとwhileの条件での変数宣言なんかも抜けているな。
inlineも説明なしで使われている。

229 名前:デフォルトの名無しさん :2005/10/16(日) 11:47:24
何はともあれ結論はオナヌー文章ウザイってこった

230 名前:デフォルトの名無しさん :2005/10/16(日) 16:46:28
C++とか書いている時点でもうダメダメ。


231 名前:デフォルトの名無しさん :2005/10/16(日) 16:51:41
マトモな感覚のある奴なら全角英数字なんて滅多に使わん

232 名前:デフォルトの名無しさん :2005/10/16(日) 17:25:03
HAGESHIKUDOUI

233 名前:217 :2005/10/16(日) 17:35:35
いろいろ指摘していただいてありがとうございます。
オブジェクト指向の設計については省いた、
C++についてできるだけ簡素にまとめられたドキュメントありませんか?

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

皆さんのバイブルを紹介してもらってもいいですけど。


234 名前:デフォルトの名無しさん :2005/10/16(日) 17:37:04
>233
ttp://www.amazon.co.jp/exec/obidos/ASIN/475611895X


235 名前:デフォルトの名無しさん :2005/10/16(日) 17:37:28
あーでもいまからならJAVAですかね?
JAVA使うならJAVAで使えないC++の仕様とか下手に覚えない方が楽ですよね?


236 名前:233 :2005/10/16(日) 17:44:00
>>234
評価高くてよさそうですが、C++はなにもわからないんでやめときます。

> 個人的には、記述内容の間違いを読みながら補正できる
> 「プロ」レベルの人以外は読むべきではないと思います。
> 少なくともこの翻訳された内容を鵜呑みにするのは問題が多すぎると思います。


237 名前:デフォルトの名無しさん :2005/10/16(日) 17:45:34
ttp://www.amazon.co.jp/exec/obidos/ASIN/4881356194/250-1494518-5036263

238 名前:デフォルトの名無しさん :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


239 名前:デフォルトの名無しさん :2005/10/16(日) 18:00:54
>>233
>>5
> http://www.kuzbass.ru/docs/isocpp/

240 名前:デフォルトの名無しさん :2005/10/16(日) 18:05:07
別のところから>>238のPDFはタダで読める。

241 名前:デフォルトの名無しさん :2005/10/16(日) 18:35:59
>>239
えーご_

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

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

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

C++の設計と進化
http://www.asahi-net.or.jp/~YD8S-HMD/others/bookshelf/bookshelf.htm
これなんかよさそうだな。


242 名前:デフォルトの名無しさん :2005/10/16(日) 18:36:45
>>241
D&EはC++の基礎をある程度知った上で読まないと意味がないかと

243 名前:デフォルトの名無しさん :2005/10/16(日) 18:37:16
>>241
それは読み物。

244 名前:デフォルトの名無しさん :2005/10/16(日) 18:54:07
>>233
これは?
ttp://www.seshop.com/detail.asp?pid=3236

245 名前:233 :2005/10/16(日) 22:17:40
>>244
> C言語を勉強した人向けとなっておりますが、全くその通りです。
なるほど。
これも定番ですがよさそうですね。


246 名前:デフォルトの名無しさん :2005/10/17(月) 12:27:09
大量にあるメンバ変数の内容を他のクラスに伝えたい
場合、何かいい方法はありますか?

247 名前:デフォルトの名無しさん :2005/10/17(月) 12:40:12
クラスでカプセル化してインスタンスの参照を渡す

248 名前:デフォルトの名無しさん :2005/10/17(月) 14:37:07
10の-N乗(N=1のとき0.1、N=2のとき0.01...)を
1.0/pow(10, N);より高速に計算する方法はどうすればいいのでしょうか。


249 名前:デフォルトの名無しさん :2005/10/17(月) 14:43:52
>>248
環境によってやり方は違ってくるだろうなあ

250 名前:248 :2005/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;

のようにしようと考えてみました。これはウンコでしょうか(´д`)


■過去ログ置き場に戻る■ 1- 次250 最新50
DAT2HTML 0.33f Converted.