5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

C++相談室 part49

1 :v(^・^)v:2006/04/28(金) 09:52:50
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE(VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

  → テンプレその他 >>1-15 付近参照 ←

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


2 :v(^・^)v:2006/04/28(金) 09:54:57
1 http://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:2006/04/28(金) 09:55:29
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:2006/04/28(金) 09:57:35
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/
43 http://pc8.2ch.net/test/read.cgi/tech/1124113879/
44 http://pc8.2ch.net/test/read.cgi/tech/1128512737/
45 http://pc8.2ch.net/test/read.cgi/tech/1133007604/
46 ttp://pc8.2ch.net/test/read.cgi/tech/1136690107/
47 ttp://pc8.2ch.net/test/read.cgi/tech/1139931895/
48 ttp://pc8.2ch.net/test/read.cgi/tech/1142423595/


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

[禿 Stroustrup]
 http://public.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:2006/04/28(金) 09:59:04
■Books■
amazon.com C,C++関連書籍
 http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/

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

7 :v(^・^)v:2006/04/28(金) 09:59:53
■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:2006/04/28(金) 10:00:52
■Libraries■
[Boost]
 Boost http://www.boost.org/
 (日本語) http://www.kmonos.net/alang/boost/
 (日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
 SGI-STL http://www.sgi.com/tech/stl/
 STLport http://stlport.sourceforge.net/
 GNU libstdc++ http://gcc.gnu.org/libstdc++/
 Apache STDCXX http://incubator.apache.org/stdcxx/
 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://sourceforge.net/projects/loki-lib/
 LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport

9 :v(^・^)v:2006/04/28(金) 10:04:03
■関連スレ■
【初心者歓迎】C/C++室 Ver.26【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1143601166/
【C++】STL(Standard Template Library)相談室 5
http://pc8.2ch.net/test/read.cgi/tech/1143608073/
C/C++の宿題を片付けます 63代目
http://pc8.2ch.net/test/read.cgi/tech/1143405137/
C/C++でのWindowsPrograming議論スレ(質問お断り)
 http://pc8.2ch.net/test/read.cgi/tech/1049790146/
managed C++ やろうぜ!! 002
 http://pc8.2ch.net/test/read.cgi/tech/1139043535/
C++/CLI について語ろうぜ Part2
 http://pc8.2ch.net/test/read.cgi/tech/1142147319/
くだすれC++/CLI(初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1142144110/
ATL/WTL Part4
 http://pc8.2ch.net/test/read.cgi/tech/1134388951/
【雑談】C/C++【その1】
 http://pc8.2ch.net/test/read.cgi/tech/1098817686/

10 :v(^・^)v:2006/04/28(金) 10:07:38
STLつかうと一気に実行ファイルサイズが10倍に?!

>>10
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。

>>11
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

11 :v(^・^)v:2006/04/28(金) 10:13:17
地鎮祭終わり。後、Effective C++の新刊とか、他に有益な情報があったら
ぜひ教えてください。

D&Eも書いておくか。

The Design and Evolution of C++
http://www.amazon.co.jp/exec/obidos/ASIN/0201543303/
C++の設計と進化
http://www.amazon.co.jp/exec/obidos/ASIN/4797328541/ (翻訳)

12 :デフォルトの名無しさん:2006/04/28(金) 10:15:46
洋書はこっちの方がいいか。
http://www.amazon.com/gp/product/0201543303/102-8306451-1796138?n=283155

13 :デフォルトの名無しさん:2006/04/28(金) 11:29:41
きましたよ

14 :デフォルトの名無しさん:2006/04/28(金) 12:26:03
結局 CUJ のリンクはそのままか。

15 :デフォルトの名無しさん:2006/04/28(金) 17:59:09
CUJって何?

16 :デフォルトの名無しさん:2006/04/28(金) 18:05:55
>>15
Effective with the March 2006 issue, the C/C++ Users Journal has merged with Dr. Dobb's Journal, which will now feature expanded C and C++ coverage.

ってことで、CUJはDr. Dobb's Journalと合併
>>5のリンクも修正した方がいいんじゃないの、ということ

次スレで修正だな

17 :デフォルトの名無しさん:2006/04/28(金) 22:09:10
typedef void (*Function)(void);
typedef std::map<std::string, Function> _map;
このようにして、std::string型をキーとして引数を取らないvoid型の関数を格納できますが

ここで、格納したい関数の戻り値がそれぞれ違うものであったり
引数の個数や型がバラバラの場合でも同じmapに格納する方法がありましたら教えて頂きたいです

18 :デフォルトの名無しさん:2006/04/28(金) 22:25:42
>>17
関数オブジェクト

19 :デフォルトの名無しさん:2006/04/28(金) 22:26:43
なんかboostでそんなんなかったっけ

20 :デフォルトの名無しさん:2006/04/28(金) 22:27:43
>>17
関数呼び出し式の形が同じにできるのであればboost::functionが使える。

21 :デフォルトの名無しさん:2006/04/28(金) 22:28:45
boost::anyで何とかなる希ガス

22 :デフォルトの名無しさん:2006/04/29(土) 09:01:37
>>17
それ、取り出したときにどうやって使うの?

23 :デフォルトの名無しさん:2006/04/29(土) 17:29:54
>>17です。アドバイスありがとうございます。boost::functionとboost::bindでどうにかなりました。
これだけではあれなので、詳細を書かせて頂きたいと思います。

>>22さんの鋭い質問で深く考えさせられました。取り出すというか、引数がバラバラなのにどうやって使うんだ、と。
結果的に、考え付いたのが
CApp p; std::map< std::string, boost::function0< void > > map;
map["aaa"] = boost::bind(&CApp::FuncA, &p, "aiueo");
このようにすることで、どんな引数の数、内容でもキー毎に固定できれば
map["aaa"](); と同じ呼び出し式を使う事ができ、>>17の目的は達成されました。boostすげえ。
では、長文すいませんでした。

24 :デフォルトの名無しさん:2006/04/29(土) 20:55:30
rand()%100の場合、同じ数字が出ることはありますか?

25 :デフォルトの名無しさん:2006/04/29(土) 20:56:25
あります

26 :24:2006/04/29(土) 21:01:44
>>25
ありがとうございます。
スレ違いですよね、失礼しました。
初心者スレで聞いてきます。

27 :デフォルトの名無しさん:2006/04/30(日) 01:21:08
>>26
いやまてw 初心者スレで聞いてもまったく同じ答えだぞw

28 :24:2006/04/30(日) 01:44:20
>>27
あ、同じ数字を出さない方法が知りたいので初心者スレで聞いてこようかな、と思いましてw


29 :デフォルトの名無しさん:2006/04/30(日) 02:46:57
エスパー的には、
srand((unsigned)time(NULL));
のことだと予言。

30 :デフォルトの名無しさん:2006/04/30(日) 03:03:52
>>29
俺のエスパー能力だと、
0から99まで、100個の、重複しないランダムな乱数列が欲しいんじゃないかと。

31 :デフォルトの名無しさん:2006/04/30(日) 03:09:56
まあ、0から99まで配列に入れてシャッフルしろと言うことだな。

32 :デフォルトの名無しさん:2006/04/30(日) 03:11:08
>>30
なるほど。そっちの方があってそうだな。

0〜99までの値をランダムシャッフルでおkだな。
ランダムシャッフルのアルゴリズムは定番のがあるから
ググれば出てくるだろう。

33 :デフォルトの名無しさん:2006/04/30(日) 03:16:17
このスレ、エスパー多いな。

34 :デフォルトの名無しさん:2006/04/30(日) 03:35:55
シャッフルはstd::random_shuffleで事足りるとみた


35 :24:2006/04/30(日) 03:37:29
どうもありがとうございます。
srand((unsigned)time(NULL)); は使っています。
配列ですね。
分かりました。
皆さんスレ違いなのにどうもありがとうございました。

36 :デフォルトの名無しさん:2006/04/30(日) 03:41:19
スレ違いってわけでもないが、
本当に質問したいことをはっきりさせるべきだと思われ。

37 :24:2006/04/30(日) 03:51:45
>>36
そうですね。
確かに説明不足で何が知りたいか分からない文章でした。
乱数 配列とランダムシャッフルでググったら両方知りたいソースコードが見つかりました。
本当にありがとうございました。

38 :デフォルトの名無しさん:2006/04/30(日) 11:12:08
世の中にここまで自分の意志を伝えられない人間がいるってことが
ものすごく不思議だ。
教育され損なうって恐ろしいことだな。

39 :デフォルトの名無しさん:2006/04/30(日) 11:57:53
エスパーにならないと立派なSEにはなれません

40 :デフォルトの名無しさん:2006/04/30(日) 12:01:07
>>39
それはクライアントに恵まれていないのです、オー人事でも無理です。

だけど実際にそういう目に遭うことはたまにあります orz


41 :デフォルトの名無しさん:2006/04/30(日) 12:15:40
>>40
それは運がいいだけです。現実は、そんなクライアントばかりです。

42 :デフォルトの名無しさん:2006/04/30(日) 14:19:41
もっとも近い整数へ変換する関数ってありますか

4.9->5
6.2->6

43 :デフォルトの名無しさん:2006/04/30(日) 14:23:55
double value = 4.9;

int answer = (int)(value + 0.5);

44 :デフォルトの名無しさん:2006/04/30(日) 15:19:01
>>43
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#566

45 :デフォルトの名無しさん:2006/04/30(日) 15:26:29
>>44
言葉のあやを挙げられても……。

46 :デフォルトの名無しさん:2006/04/30(日) 15:30:53
>>44みたいなレスする人間は不要

47 :デフォルトの名無しさん:2006/04/30(日) 16:11:00
負の数の場合は気をつけろってことだろ。
素直に知っとけばいいじゃないか >>45-46

48 :デフォルトの名無しさん:2006/04/30(日) 23:21:53
#include <iostream>
using namespace std;

template <typename T>
bool less(const T &ref1, const T &ref2) {
  return ref1<ref2;
}

int main()
{
  cout << less<char>('A', 'B') <<endl;
}

これをg++でコンパイルすると、less undeclared (first use this function)
とエラーになってしまいます。どこがいけないんでしょうか?



49 :デフォルトの名無しさん:2006/04/30(日) 23:29:30
>>48
lessは標準ライブラリに定義されている(std::less)。
多重定義エラー。

50 :デフォルトの名無しさん:2006/04/30(日) 23:30:51
>>42
四捨五入って言葉を知らないの?
それとも敢えて使ってないの?

51 :デフォルトの名無しさん:2006/04/30(日) 23:32:36
負数の時、「もっとも近い整数」をどっちによせるかによる

52 :デフォルトの名無しさん:2006/04/30(日) 23:48:17
そもそも、 0.5 にもっとも近い整数は一意に定まらないよな

53 :デフォルトの名無しさん:2006/05/01(月) 00:24:55
>>48
g++は知らないけど'A'とか'B'とかをint型と認識してるのかな?
C++では文字定数はcharのはずなんだけど…。

VC++6ではちゃんとコンパイルできて動くね。

>>49
less undeclared(lessは宣言されていない)って書いてるじゃん。
多重定義エラーってのはなかろ。

54 :デフォルトの名無しさん:2006/05/01(月) 00:26:39
>>48
とりあえず
-less<char>('A', 'B')
+less('A', 'B')
でも通らないか?

55 :48:2006/05/01(月) 00:37:01
less を aless とか適当に名前を変えてみたら通り、動きました。
また、::less() とスコープ演算子を付けてみたら通り、動きました。
うーん、やはり多重定義エラーなんでしょうか?

このスコープ演算子をつけた場合、どちらのlessを見に行ってる
のかなと悩んでいたんですが、自作の方のless()を見に行っている
ようです。うーん。


56 :48:2006/05/01(月) 00:42:19
>>54
そのように書き直してコンパイルしてみたらどちらも
no matching function for call to 'std::less<char>::less(char, char)'
といわれますた。

57 :デフォルトの名無しさん:2006/05/01(月) 00:57:15
どちらも?

58 :48:2006/05/01(月) 01:06:47
すみません。違うエラーメッセージをコピペしてしまった。

正しくは、
cout << less<char>('A', 'B') <<endl;
これを
cout << -less<char>('A', 'B') << endl;
cout << +less('A','B') << endl;
の各々でやった場合、どちらも
'less' undeclared (first use this function)
と怒られますた。

おとなしくテンプレート関数名を変えときますです。
ありがとうございました。


59 :デフォルトの名無しさん:2006/05/01(月) 01:22:06
-と+の扱いも次からテンプレに追加すべきだな、これは……。

60 :デフォルトの名無しさん:2006/05/01(月) 01:39:09
クマー

61 :デフォルトの名無しさん:2006/05/01(月) 01:57:39
namespace N { struct f; }
using namespace N;
int f();
int main() { return f(); }

これでも
:4: error: `f' undeclared (first use this function)
だと。
ちなみに cygwin の gcc 3.4.4 ね。
エラーになるのはいいんだが、このエラーメッセージはひどい。

62 :デフォルトの名無しさん:2006/05/01(月) 02:12:08
VC8でコンパイルすると、「あいまいなシンボルです」ってちゃんと言うね。

63 :デフォルトの名無しさん:2006/05/01(月) 07:09:31
>>61
G++の3.4.6, 4.0.3は、

foo.c: In function `int main()':
foo.c:4: error: use of `f' is ambiguous
foo.c:3: error: first declared as `int f()' here
foo.c:1: error: also declared as `struct N::f' here
foo.c:4: error: `f' was not declared in this scope

64 :デフォルトの名無しさん:2006/05/01(月) 07:14:01
やはりメジャーバージョンより高くないとダメだな>gcc

65 :デフォルトの名無しさん:2006/05/01(月) 07:18:13
>>63
なんか最後に余計なのが残ってるな。

66 :デフォルトの名無しさん:2006/05/01(月) 09:24:06
f()に適切なのが見つからないと、4行目のエラー出力処理に落ちていくんだろう。

no suitable `%s' in this scope

にするといい具合いだと思われ。

67 :デフォルトの名無しさん:2006/05/01(月) 09:30:39
MinGWバージョンアップマダーチンチン

68 :デフォルトの名無しさん:2006/05/01(月) 23:26:29
質問です。

一年ちょっと前にC言語の本を読んでプログラムの勉強を初めて、自分でコードを書いて、
その次にアルゴリズム本等を読んで、またコードを書いて、
今はC++の勉強に取り組みつつコードを書いているという段階なんですが
次に買う本について相談があります。

標準ライブラリの使い方や、基礎的なアルゴリズムを解説している本ではなく、
クラスの上手な作り方、C++プログラミングの常識を勉強できるような本を探しています。
そこで C++ FAQ と Effective C++ に目をつけたのですが、まずどちらを買うべきか迷っています。
自分の希望としては、(どちらも難しい本だろうけれども)少しでも読みやすい方を買いたいのですが
何かアドバイスして頂けないでしょうか

69 :デフォルトの名無しさん:2006/05/01(月) 23:29:12
>>68 禿本読破。マジお勧め。

70 :デフォルトの名無しさん:2006/05/01(月) 23:36:33
Effective > C++ FAQ

71 :デフォルトの名無しさん:2006/05/01(月) 23:45:24
C++ FAQとMore Effective C++は日本語訳が腐ってる。

Effective C++を買うか、これの3rdの日本語版(もうすぐ出る?)
が出るまで待つか。C++ Coding Standardもなかなか良い。

72 :デフォルトの名無しさん:2006/05/01(月) 23:56:41
>>68
CエキスパートがC++を業務で使い始めて半年間で蓄積したノウハウが全てEffectiveC++に書かれていた。
つまり、EffectiveC++はその位有用だと言うことだ。

73 :68:2006/05/02(火) 00:23:05
レスありがとうございます

ぐぐって調べてみました。
Effective C++ 第三版 もう出てるみたいです。amazon に今日付けのレビューが一件だけ入ってました。
他の本にも興味はありますが、悩んでも仕方ないし
何か縁を感じたのでとりあえず Effective C++ にしておきます

74 :デフォルトの名無しさん:2006/05/02(火) 00:28:53
Effective C++ 第三版は日本語訳がひどくないよな・・・
明日でもちょっくら立ち読みして、良さそうだったら買ってくるか。

誰か既に突撃した人いる?

75 :デフォルトの名無しさん:2006/05/02(火) 00:42:21
Effective C++第三版の訳者はAccelerated C++の人だから大丈夫だろ
まぁ俺は改訂二版が手元にあるから第三版は買ってないので断言はできないが

76 :デフォルトの名無しさん:2006/05/02(火) 01:12:57
禿本って何だゴラァ

77 :デフォルトの名無しさん:2006/05/02(火) 01:21:06
"禿本 C++" で調べたら判った

78 :デフォルトの名無しさん:2006/05/02(火) 01:26:03
禿本は正直薦めにくい
禿本を活用できるレベルの人は既に禿本を読んでいる
禿本を活用できるレベルでない人には、もっと適した本が一杯ある


79 :デフォルトの名無しさん:2006/05/02(火) 01:55:45
C++FAQも実は隠れた名著であることはあまり知られていないようだな。
EffectiveC++が有名すぎて。

80 :デフォルトの名無しさん:2006/05/02(火) 02:32:38
C++FAQってwebで公開されてなかったっけ?

81 :デフォルトの名無しさん:2006/05/02(火) 03:07:27
「C++再考」もいいよ。
最新C++ではないけれど、設計の考え方が参考になる。

82 :デフォルトの名無しさん:2006/05/02(火) 10:31:30
>>81
俺はその本で、引数付きマニピュレータの定義の仕方を初めて知った。
それから、テンプレートと関数オブジェクトの組み合わせとか、ぱっと見
は簡単そうだが、じっくり読むと深い内容まで突っ込んだ事が書いて
あるね。

83 :デフォルトの名無しさん:2006/05/02(火) 11:27:21
著者がKoenig&Mooだからな…

それぞれCFrontのテスタ、マネージャ。
初期のC++設計&処理系開発の中心にいた人たち。

「C++の設計と進化」のKoenigの登場回数と言ったら…
禿の次くらいにC++設計への貢献が大きいんじゃないか?

84 :デフォルトの名無しさん:2006/05/02(火) 12:05:57
まずは、C++ Coding Standards を読むのがベストだと思う。
Exceptional C++ の sutter 氏と、Modern C++ Design の Andrei 氏が
さまざまな書籍から要点をピックアップしてくれていて、読みやすい。
一通り読んだあとで、Effective や、Exceptional を読むとより分かりやすいし。


85 :デフォルトの名無しさん:2006/05/02(火) 12:16:51
逆に最後に手元に置くのを C++ Coding Standards がいいんじゃないかな?
あれ説明がないから、最初は辛い。

86 :デフォルトの名無しさん:2006/05/02(火) 13:00:42
自分から情報を求める姿勢があるなら大丈夫じゃね

87 :デフォルトの名無しさん:2006/05/02(火) 15:48:01
ただいま帰還。
Effective C++ 第三版は今回はアスキーではなくてピアソンだそうだ。

http://www.amazon.co.jp/exec/obidos/ASIN/4894714515/qid=1146552307/sr=1-4/ref=sr_1_10_4/249-1722344-5945958
来週頭から本屋に配送予定だと。もちろん予約してきた。

88 :デフォルトの名無しさん:2006/05/02(火) 16:57:14
ていうかとっくに届いてる
中が2色刷りなのにびっくり
高いだけある(のか?)

89 :デフォルトの名無しさん:2006/05/02(火) 17:13:13
>>85
同意。

90 :デフォルトの名無しさん:2006/05/02(火) 18:19:41
近所の大型書店では
4月29日発売とは言っても、東京の問屋に卸すのが29日の場合は今日書棚にあるとは限らない、
GW明けまでずれこむ恐れもある、と言われたよ

梅田まで出て行ったら見つかったけど

91 :デフォルトの名無しさん:2006/05/02(火) 19:12:42
Effective C++3版買った奴に聞きたいんだが、改訂2版持ってても3版買う価値ある内容?

92 :デフォルトの名無しさん:2006/05/02(火) 19:42:07
内容変えてしまうならいっそ続編みたいな形で出してほしいな。
同じ書名で版が違うだけなのに内容がかなり違うとかなんか本として微妙。

93 :デフォルトの名無しさん:2006/05/02(火) 19:48:41
>>91
俺もそこが知りたい。
改訂前の第一版を持ってる俺としては。

94 :シャビ:2006/05/02(火) 21:38:22
仮想関数テーブルポインタを含んだクラスをまるごとfwriteやfread等できる方法はありますでしょうか?
ファイルからデータ読み込んだ時に、仮想関数テーブルポインタが壊れないようにしたいのですが…
各メンバ別個に読み書きしたり、メンバを構造体にするのはなるべく避けたいので、何か良い方法があれば教えて下さい。

95 :デフォルトの名無しさん:2006/05/02(火) 21:40:21
>メンバを構造体にするのはなるべく避けたい
構造体にしたほうがわかりやすいんじゃないかなあ。利用側としては。

96 :デフォルトの名無しさん:2006/05/02(火) 22:28:49
>>94
Boost.Serializationはだめか?

97 :デフォルトの名無しさん:2006/05/02(火) 22:53:22
char buf[10] = {0};

とかした場合、buf[1]〜buf[9]まで0で初期化される保証はあったっけ?
構造体の場合と同様に、初期値の指定が無い残りの部分は0で埋められると考えていいのかな?

98 :デフォルトの名無しさん:2006/05/02(火) 23:01:33
>>97
その保障はある。
足りないところは0初期化される。

99 :シャビ:2006/05/02(火) 23:23:15
>>95-96
サンクス!
Serializationについて調べてみる事にします。

普通は構造体にするのかな?

100 :デフォルトの名無しさん:2006/05/02(火) 23:48:12
ハンドでガリガリ行きたいなら、
fprintfの値渡し書きして、scanfのパラメータ&の参照渡し機能使って読むって手もあるが、
環境が分からないから何出せばいいか分からないけど、シリアライズオブジェクト使うのがいいと思う。

101 :デフォルトの名無しさん:2006/05/03(水) 00:07:01
scanf>fscanf

102 :シャビ:2006/05/03(水) 00:38:23
ありがとうございます!
確かにfread、fwriteよりはずっと楽ですねー

103 :デフォルトの名無しさん:2006/05/03(水) 01:05:53
あるstreamの一部分を別のstreamへ切り出したいんだけどいい方法ない?
rdbuf()からいろいろいじってみたんだけど、頭は指定できてもケツが決まらくて難航中。
具体的な状況としては、複数のファイルがその行数と共に詰まってるアーカイブもどきから
一つのファイル分だけ取り出して、パーサーに渡そうとしている所。

104 :デフォルトの名無しさん:2006/05/03(水) 03:01:07
あの、MFCでActiveXコントロールを作ってたら
http://f42.aaa.livedoor.jp/~imawaka/imgboardphp/src/1146577850180.jpg
のエラーが出るんですが、

ダイアログに「ActiveXコントロールの挿入」をした際に出ます。

なぜでしょうか?


105 :デフォルトの名無しさん:2006/05/03(水) 03:05:16
>>104
スレ違い。
以下、スレ名検索だけで誘導。

MFCではじめるActiveXプログラミング
http://pc8.2ch.net/test/read.cgi/tech/1143185353/

■MFC相談室 mfc16d.dll■
http://pc8.2ch.net/test/read.cgi/tech/1146117893/

106 :デフォルトの名無しさん:2006/05/03(水) 03:08:42
>>103
行数で決まるんだろ。普通に書けるじゃないか。何が不満だ?

107 :デフォルトの名無しさん:2006/05/04(木) 00:00:24
>>106
普通にといわれてもなぁ。

108 :デフォルトの名無しさん:2006/05/04(木) 01:16:46
fmemopenみたいなのがほしいの?

109 :デフォルトの名無しさん:2006/05/04(木) 22:19:06
質問なんですが、関数のリファレンスってどこを見れば良いんでしょうか?
例えば、ですけど、
std::getlineの引数にはどんな型が来て、戻り値の型がこうで・・・
みたいなことが知りたいんです。
Cのときはmanを参考にしたりしていたんですが、
何かリファレンス本を買った方が良いですかね?

110 :デフォルトの名無しさん:2006/05/04(木) 22:24:04
>>109
規格票

111 :デフォルトの名無しさん:2006/05/04(木) 22:25:53
>>109
この当たりでもいいかもしれんな。
http://volga.eng.toyama-u.ac.jp/~mii/lab/manual/fujitsu/C++/

112 :デフォルトの名無しさん:2006/05/04(木) 22:37:10
>>110
勘弁してくださいorz

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



いまこんなの見つけたんですが、
ちょっとこれを参考にしてみようと思います。
さっき結構探したのになんでここが見落としてたんだろう・・・すみません。
http://web.archive.org/web/20050227093643/http://www.shibu.jp/cppreference/all_cpp.html

いまはwww.shibu.jpが落ちてるのか、
直接はアクセスできないみたいですけど。

113 :デフォルトの名無しさん:2006/05/04(木) 22:43:49
>>109
libstdc++のmanをインストールして、

$ man 3 std::iostream

doxygenで生成しているからhtml版もあるよ。

114 :デフォルトの名無しさん:2006/05/04(木) 22:46:03
>>112
おなじサーバで運用中(?)の swig.jp とか unittest.org もずっと死んだままス。つд`)
なんか渋チン、社会人になってからサーバのメンテを放棄してる?

115 :デフォルトの名無しさん:2006/05/05(金) 00:18:07
>>113
どうもありがとう!
インストールってどうやったらいいのかよく分かんなかったので、
適当にlibstdc++-man-20051007.tar.bz2をDLしてきて
中身を既存のman3にコピーしたら
なんかうまく行ったっぽいです。

>>114
できたら復帰して欲しいですね。
さしあたって
http://www.shibu.jp/cppreference/cppreference.zip
がArchive.orgにあったら良かったんだけどそれも無いし・・・

116 :デフォルトの名無しさん:2006/05/05(金) 00:32:21
>>115
捨てメアドでも晒してくれたメールで送るよ。

117 :デフォルトの名無しさん:2006/05/05(金) 00:39:36
VS.NET で以下のソースをコンパイルしたら実行時にエラーが起きました。

#include <iostream>
using namespace std;

int sub( int* p_num )
{
p_num = new int;
*p_num = 10;
cout << *p_num << endl;
return 0;
}

int main()
{
int* p_num = 0;
sub( p_num );
cout << *p_num << endl; // * を外してアドレスを表示すると 0 となる
delete p_num;
return 0;
}

最初はどこで引っかかっているのか判りませんでしたが、今はとりあえず
呼び出し側の main 関数に p_num = new int; が反映されておらず
存在しないものを delete しようとしているからエラーが起きることが判りました。

しかし sub 関数の側では 10 という値が確かに表示されているし
なぜポインタで渡してるのに呼び出し元に 10 が伝わってこないのかが判りません。

new 演算子で用意したメモリは delete で明示的に捨てるまで確保されたままだと思っていたのですが
もしかしてこれが勘違いだったのでしょうか

118 :デフォルトの名無しさん:2006/05/05(金) 00:41:35
>>117
ポインタを勉強しる

119 :デフォルトの名無しさん:2006/05/05(金) 00:50:30
上げてしまった。すまん。

120 :デフォルトの名無しさん:2006/05/05(金) 00:52:37
>>117
趣旨が真逆だけどこれでも読んで勉強しれ。
http://www.01-tec.com/document/without_pointer.html

121 :デフォルトの名無しさん:2006/05/05(金) 00:53:42
確かに不勉強。
>>117
>なぜポインタで渡してるのに呼び出し元に 10 が伝わってこないのかが判りません。
なぜ渡されたポインタを new で潰してるのかが判りません。

122 :デフォルトの名無しさん:2006/05/05(金) 01:00:01
>>117
自分が分かった部分だけだけど、欠陥が2箇所見つかった。
>int* p_num = 0;
&p_numに0x00000000が入ってしまっている。
intprep=0;
int* p_num = &prep;
こうダミーを使ってやれば解決する。
>int sub( int* p_num )
>{
>p_num = new int;
これは是非、デバッガを使って、intの前にブレークポイント置いて、ステップオーバでp_numの値に注目してもらいたいのだけど、
この関数は参照で、int*p_numでアドレスを受け取っている。
次にnewして新たにp_numにアドレスを割り当てている。この時点で受け取ったアドレスと内容はゴミとしてメモリ上に浮くことになる。
そして、main側(sub( p_num );を発した側)はアドレスが変わったことを知るすべもなし、ゴミのアドレスと値を参照することになる(元々の値)。
実行時、エラーがでなくとも、たまたま短かっただけで、新たなスタックがそこに侵食してくると、もしp_numアドレス参照すると、
AccessViolationかMemoryAssertionかなんらかのエラーがでると思う。

123 :デフォルトの名無しさん:2006/05/05(金) 01:02:40
やっぱ、C関連やるにはデバッガ必須だね。
うまくいかなかったとき、デバッガなしだと、脳内妄想で終わってしまう。
自分もうやむやのまま進んで、何度も初歩に戻ったしなあ。

124 :デフォルトの名無しさん:2006/05/05(金) 01:03:17
>>116
まじですか!お言葉に甘えていいですかね?
suteasdf@hotmail.co.jp
よろしくお願いします。

125 :デフォルトの名無しさん:2006/05/05(金) 01:09:17
阿呆な質問かもしれませんが。。。

std::strlen等と、strlen等は同じなんですか?

#include <iostream>としておけば、
Cだとそれぞれ別にヘッダファイルをincludeしておかないと使えない関数も含め、
ほとんどのCの標準ライブラリ関数が使えるようですが・・・

std名前空間のメンバである
Cの標準ライブラリ関数と同じ名前の関数は、
Cの標準ライブラリ関数とまったく同じものだと考えて良いんですか?
std::strlenと書いても、ただstrlenと書いても同じように動作するわけですが、
これはどういうことなんでしょうか?

あと、試してみた中では数学関数はstd空間にないみたいで、
これはmath.hをincludeしないと使えないようですが、
なんでこんな風になってるんですかね?

126 :デフォルトの名無しさん:2006/05/05(金) 01:12:32
>>124
送ったお。

127 :デフォルトの名無しさん:2006/05/05(金) 01:15:24
>>125
コンパイラ書けよ。俺のコンパイラの挙動と違うぞ。俺のはVC8ね。

128 :デフォルトの名無しさん:2006/05/05(金) 01:17:23
>>116
届きました。
本当にありがとうございました!


129 :125:2006/05/05(金) 01:21:13
>>127
すんません、gcc(g++)使ってまして、
gcc_selectの結果は
Current default compiler:
gcc version 4.0.0 20041026 (Apple Computer, Inc. build 4061)
なんですが。

130 :デフォルトの名無しさん:2006/05/05(金) 01:25:48
>>125
#include <cmath> だろ。

131 :125:2006/05/05(金) 01:28:17
>>130
Cで#include <〜.h>として使っていたものに関しては、
#include <c〜>となるわけですね。わかりました。

132 :125:2006/05/05(金) 01:32:03
std名前空間のメンバになってる関数については、
自分の環境では#include <cstring>等々することなく
std::strlenとか単にstrlenと言った風に使えてしまうんですが、
これは問題でしょうか?ちゃんと#include <cstring>とすべきですか?

また、std::strlenという風に使うのと、単にstrlenという風に使うのとでは、
まったく同じことだと思っていいのかどうなのか分からないんですが、
その点についてはどうなんでしょうか?

133 :デフォルトの名無しさん:2006/05/05(金) 01:40:49
>>132
あーそれどっかで問題になってたな。
std付けないと見えないはずなのに、見えてしまうという問題。
どこでだっけ・・・

134 :デフォルトの名無しさん:2006/05/05(金) 01:41:32
>>125
>#include <iostream>としておけば、
>Cだとそれぞれ別にヘッダファイルをincludeしておかないと使えない関数も含め、
>ほとんどのCの標準ライブラリ関数が使えるようですが・・・

たまたま<iostream>内で間接的に#includeしてるだけで
使いたい関数があったらちゃんと対応するヘッダを#includeすべき。

135 :デフォルトの名無しさん:2006/05/05(金) 01:45:24
>>115のC++リファレンスが欲しいんですが、どなたかupして頂けませんか

136 :125:2006/05/05(金) 01:47:26
>>133, >>134
ありがとうございます。

ということは、
使いたい関数があるときは
#include <cmath>なり、#include <cstring>なり、
きちんとincludeして、std::〜という形で使うのが正解、
ということですね?

ちなみに、includeするときにcmathとかcstringとか
頭にcが付いているってことは、
その動作はCの標準ライブラリ関数とまったく同じと考えても良いんですよね?


137 :デフォルトの名無しさん:2006/05/05(金) 01:49:09
規格票も持ってない奴ばっかかよ・・・・

138 :125:2006/05/05(金) 01:51:45
持ってないです・・・阿呆な質問の繰り返しでごめんなさいorz

139 :デフォルトの名無しさん:2006/05/05(金) 01:55:43
規格読めで済むならこんなスレいらなくね

140 :デフォルトの名無しさん:2006/05/05(金) 01:56:30
>>137
おまえ、あれはコンパイラを作るヤツやC++の解説書を書くヤツなんかの為にあるもんだぞw

141 :126:2006/05/05(金) 02:00:20
つ ttp://www.cppll.jp/cppreference/

そういえばミラーがあったの忘れてたw

142 :デフォルトの名無しさん:2006/05/05(金) 02:32:40
>>140
「規格読め」はそもそも言った本人が読んだことなくて
しかも質問にきちんと答えられないときに使うセリフなんで
真に受けちゃダメよ

143 :デフォルトの名無しさん:2006/05/05(金) 02:39:44
>>142
言われて悔しい思いをした経験がおありで?

144 :140:2006/05/05(金) 02:54:30
>>142
コンパイラ云々ではなくC++の仕様的にどうなのかって質問なら「規格嫁」が正論だろ。
コンパイラの挙動ではなくC++の厳密な仕様を気にするぐらいなら規格票を購入すべき。
規格票も持たず、基本的な仕様すら規格上でどうなってるかも知らないのに
部分的な仕様だけを知ろうとするのはナンセンス。

145 :デフォルトの名無しさん:2006/05/05(金) 03:08:22
要するに、「規格票読め」は避けて、規格票の該当部分をそのまま
コピペして、簡単な説明を付けろって事だな。

著作権の問題とかはどうなるのかはよくわからないが、少なくとも、
貼り付けた本人が「実は質問に答えられないのでただ言ってみた」
わけではない事がわかるだろう。

146 :デフォルトの名無しさん:2006/05/05(金) 08:10:36
>>141 d

147 :デフォルトの名無しさん:2006/05/05(金) 10:58:17
>>113
libstdc++もmanあるのね知らんかった
Thanks!


148 :デフォルトの名無しさん:2006/05/05(金) 12:19:01
そもそも規格を読むだけでは分からないような質問が
このスレでされたことは一度もないぞ

149 :デフォルトの名無しさん:2006/05/05(金) 12:22:42
>>148
ウソつくな。そんな質問いくつもされてきたぞ。
で、そのたびに「スレ違い」というレスが返されてきた。

150 :デフォルトの名無しさん:2006/05/05(金) 15:56:58
自他共に認める無知、あるいは、自分では一応知識があるつもりだけど
それが本当に試される状況は怖いから避けたい人、
そういう人種が「そのくせ偉そうにしたい」時には便利ですよね<○○読め

151 :デフォルトの名無しさん:2006/05/05(金) 16:03:07
>>150
>>145

152 :113:2006/05/05(金) 16:21:19
つーか今回の発端は>>109なわけで、
「規格票読め」もあながち外した答えとは言えないような…

まずは>>113>>141でいいと思うけどね。他にいいのある?

ちなみに>>113のHTML版公開しているのは↓ここ。
http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-3.4/index.html
http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/index.html

http://gcc.gnu.org/onlinedocs/libstdc++/documentation.html より

俺は自宅のマシンで全文検索エンジンでインデックス作ってる。boostも。

153 :デフォルトの名無しさん:2006/05/05(金) 16:33:30
C か C++で正規表現をするにはどうしたらよいでしょうか。
サードパーティのは利用せず(?)に、標準のもので実現したいのですが。

154 :デフォルトの名無しさん:2006/05/05(金) 16:37:11
標準だけでやりたいなら、自分で書くしかない。
boost::regexが次の標準に入る奴に近い。

155 :デフォルトの名無しさん:2006/05/05(金) 16:37:13
>>152
boost ならここやね。

http://boost.cppll.jp/HEAD/
http://boost.cppll.jp/HEAD/libs/libraries.htm

>>153
boost::regex じゃだめ?
boost はまだ準標準というべきものだが。

156 :153:2006/05/05(金) 16:46:58
>>154-155

http://www.s34.co.jp/cpptechdoc/article/regexpp/
を見ているのですが、スキルが足りないためぱっと見理解できないです。
サンプルのとおりにやってみようと思います・・

157 :デフォルトの名無しさん:2006/05/05(金) 16:47:55
見ただけで理解できないのは普通。
とりあえず触って覚えろ。

158 :153:2006/05/05(金) 18:37:08
今boostのインストール中ですが、最終的に作るアプリをほかのPCで
動かしたいと課題を出した人が言うと思うので、自分で書こうと思います。

あとインストールに時間がかかるというのと、いくつかインストール方法の載ってる
サイトを検索したけども、そこにある用語すら分からず正常にインストールできている
か不明のため

159 :デフォルトの名無しさん:2006/05/05(金) 18:42:22
boost ってテンプレートライブラリだから、
余計なもの入れなければ
ヘッダだけあれば動くんじゃないの?

160 :デフォルトの名無しさん:2006/05/05(金) 18:42:39
boost使っていようがいまいが、
他のPCでも動くと思うが。。。

161 :デフォルトの名無しさん:2006/05/05(金) 18:42:52
boost::regex の使い方をサンプルで理解できないのに
自分でパーサを書くという意味?それは無茶があると思う。
boost を用いたプログラムを書いても、特別な dll 等は必要ないし
そのままやった方が早いかと。

162 :デフォルトの名無しさん:2006/05/05(金) 18:49:35
まぁ、boost が準標準ライブラリだとしても、初めて触る者にとっては
得体の知れないモノなわけで、そんなモノに頼りたくないって気持ちは
わかるが騙されたと思って boost 使っとけ。

163 :デフォルトの名無しさん:2006/05/05(金) 19:10:05
boost使うと実行サイズが大きいし、速度が遅いし、という難点があるけどね。

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

165 :デフォルトの名無しさん:2006/05/05(金) 19:37:09
>>164
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。


166 :デフォルトの名無しさん:2006/05/05(金) 19:40:55
STLつかうと一気に実行ファイルサイズが10倍に?!

167 :デフォルトの名無しさん:2006/05/05(金) 19:48:25
いいえ、3倍です。

168 :デフォルトの名無しさん:2006/05/05(金) 20:29:32
棒読みw

169 :側近中の側近 ◆0351148456 :2006/05/05(金) 20:30:23
>>167
(っ´▽`)っ
ついでに赤くなるんだよな?

170 :デフォルトの名無しさん:2006/05/05(金) 21:33:21
Boostつかうとコンパイルが遅すぎ

171 :デフォルトの名無しさん:2006/05/05(金) 21:45:09
>>170
君に取って置きの秘策をお教えしよう。

パ ソ コ ン グ レ ー ド ア ッ プ。

172 :デフォルトの名無しさん:2006/05/05(金) 22:02:49
VC++6.0stdで最適化コンパイルできますか?

173 :デフォルトの名無しさん:2006/05/05(金) 22:06:13
古いコンパイラでコンパイルできるかどうかは保証しない。

174 :デフォルトの名無しさん:2006/05/05(金) 22:07:58
VC++ならプリコンパイルドヘッダとか使えば多少速くなるんじゃね?

175 :デフォルトの名無しさん:2006/05/05(金) 22:10:54
>>170
まあ、ソースが全部ヘッダに含まれてるわけだからな・・・。
早く export 実装しろよー。

176 :デフォルトの名無しさん:2006/05/05(金) 22:27:25
禿がもっと禿れば各ベンダーも実装してくれるだろうよ。

177 :デフォルトの名無しさん:2006/05/06(土) 02:49:55
>>158
なんか変な流れでかわいそうなのでwマジレスしておくと
静的リンクしておけばDLLはいらんし、そもそもヘッダインクルードだけで使えるライブラリも多い。
ダイナミックリンクにしてもDLLを一緒に配ればすむ話だ。

178 :デフォルトの名無しさん:2006/05/06(土) 09:59:41
filesystem系とかスレッド系とかunittest系以外はヘッダだけで大丈夫じゃなかったっけ


179 :デフォルトの名無しさん:2006/05/06(土) 11:40:08
>>170
unix系ならdistccもおすすめ


180 :デフォルトの名無しさん:2006/05/07(日) 02:30:20
ff

181 :デフォルトの名無しさん:2006/05/07(日) 09:41:16
質問で〜す

同名でconst、非constなメソッドがあったとして、
そのメソッドを非constなオブジェクトから呼んだ場合、
どちらのメソッドが呼ばれるのでしょうか?

具体的には下記のようなコードで、func2の中のa.hoge()は
const、非constどちらのメソッドが呼ばれるのか?

とりあえずvc7だと非constメソッドが呼ばれるようですが、
これってどの処理系でも必ず保障されます?

class A {
public:
  void hoge() const {
    cout << "const" << endl;
  }
  void hoge() {
    cout << "not const" << endl;
  }
};

viod func1(const A &a) {
  a.hoge() // => const
}

viod func2(A &a) {
  a.hoge() // => not const ?
}



182 :デフォルトの名無しさん:2006/05/07(日) 09:49:10
non constに決まってるだろ
constの意味を理解してから書けボケ

183 :デフォルトの名無しさん:2006/05/07(日) 09:50:19
>>181
Overload Resolutionのルールによって、保障されている。

詳しく説明すると長くなるけど、
staticでないメンバ関数は、thisを隠れた引数として取るが、
このthisも、オーバーロードされている際のbest candidateを決定するにあたって考慮される。
さらに、thisはcv-qualifiersの影響を受けるので、constなメンバ関数では、thisはconst修飾される。

constなオブジェクトから呼び出した場合は、constなメンバ関数、
constでないオブジェクトから呼び出した場合は、constでないメンバ関数のほうが、
よりbest candidateになる。

184 :デフォルトの名無しさん:2006/05/07(日) 10:07:45
×保障
○保証

185 :デフォルトの名無しさん:2006/05/07(日) 10:09:09
>>183
const なオブジェクトから呼び出した場合は const でないメンバ関数は
candidate にもならないんじゃないか?

186 :183:2006/05/07(日) 10:15:06
>>185
そういえばそうでした。

187 :181:2006/05/07(日) 10:15:46
>>183
ためになる解説どうもありがとうございました。
Overload Resolutionについて勉強してみようと思います。

188 :デフォルトの名無しさん:2006/05/07(日) 10:20:12
>>187
あまり深く勉強しても、実際に役に立つことは少ないと思うけど。
こんなに複雑なのも、人間にとってより自然な挙動にしようと議論された結果だし。


//! boostのtype traitsを実装しようというなら、話は別だけど。

189 :デフォルトの名無しさん:2006/05/07(日) 14:43:24
>>182
constの意味とか、この質問にはまるで関係ないじゃんw

あとあとまともな回答があっただけに、大恥さらしちゃったねww

190 :デフォルトの名無しさん:2006/05/07(日) 14:55:51
>>181

189 名前: デフォルトの名無しさん [sage] 投稿日: 2006/05/07(日) 14:43:24

>>182
constの意味とか、この質問にはまるで関係ないじゃんw

あとあとまともな回答があっただけに、大恥さらしちゃったねww

191 :デフォルトの名無しさん:2006/05/07(日) 20:13:40
お前の方が恥じ書いてるっての

192 :デフォルトの名無しさん:2006/05/07(日) 20:20:08
constの意味は大いに関係あるだろ

途中でconst外されちゃまいっちんぐ

というルールなわけだし


193 :デフォルトの名無しさん:2006/05/07(日) 20:24:30
>>192
非 const なオブジェクトなら const メンバ関数も、非 const メンバ関数も安全に呼び出せる。
どっちでもよさそうだが、その場合にどっちになるのか?という質問だ。
const の意味は十分理解しているものと思われる。

194 :デフォルトの名無しさん:2006/05/07(日) 21:17:22
詭弁君キター

195 :デフォルトの名無しさん:2006/05/07(日) 21:49:47
char *c;
*c = '\0';

と、

char *c = NULL;

って同じ意味?

196 :デフォルトの名無しさん:2006/05/07(日) 21:51:59
>>195 ぜんぜん違う。

197 :デフォルトの名無しさん:2006/05/07(日) 21:53:46
俺も違うと言いかけたが
必ずしも違うとは言い切れない気もしてきた

198 :デフォルトの名無しさん:2006/05/07(日) 21:54:59
>>195,197
どう考えたら同じだと思えるの?

199 :デフォルトの名無しさん:2006/05/07(日) 21:55:43
>>198
文字コードにASCIIを使っている場合。

200 :デフォルトの名無しさん:2006/05/07(日) 21:58:43
>>197
もしかしてNULLと'\0'の違いがどーとか考えてないか?

char *c;
c = 0;

と、

char *c = NULL;

ならお前の悩みも解らなくもないが・・・

201 :200:2006/05/07(日) 22:00:15
あ、キャストせんとコンパイルエラーでっかな?


char *c;
c = 0


char *c;
c = (char *)0;


202 :デフォルトの名無しさん:2006/05/07(日) 22:03:56
いや、0はどんなポインタ型へも変換できる。

203 :デフォルトの名無しさん:2006/05/07(日) 22:04:24
>>199
その前提で、もうちょっと変形すれば動作が同じになると思えなくも無いが、
やっぱり意味はぜんぜん違う。

204 :デフォルトの名無しさん:2006/05/07(日) 22:08:19
ポインタの説明読んでると、ミスするとシステムを壊してしまう可能性があるらしいんですが
みなさんミスしないでやれるんですか?
ポインタ勉強したいけど怖くて・・・><

205 :デフォルトの名無しさん:2006/05/07(日) 22:16:46
>>204
まともなOSが走っているマシンで実行するなら大丈夫。
安心してポインタいじれ。

206 :デフォルトの名無しさん:2006/05/07(日) 22:17:52
>>204
そんなうんこは死ねばいいと思うよ

207 :デフォルトの名無しさん:2006/05/07(日) 22:19:38
1.例外拾えればアプリケーションがズッコケ
2.例外逃すとプロセスがぼよよーん
3.最悪はシステム(OS)が凍てつく

208 :デフォルトの名無しさん:2006/05/07(日) 22:23:05
>>207
それ、まともじゃないOSの話だろ。

209 :デフォルトの名無しさん:2006/05/07(日) 22:33:44
まともじゃないOSって具体的になんだ?OS/2とか?

210 :デフォルトの名無しさん:2006/05/07(日) 22:37:23
MSX-DOS とか

211 :デフォルトの名無しさん:2006/05/07(日) 22:46:38
Windows 1.0 〜 3.x 〜 9x

212 :デフォルトの名無しさん:2006/05/07(日) 22:53:38
ぼよよーんにふいた

213 :デフォルトの名無しさん:2006/05/07(日) 23:07:52
自分で throw した例外以外( 一般保護例外,ゼロ除算,等々 )は catch(...) でも拾えずに
コアを吐く Unix/Linux のヘタレっぷりを初めて知った時にはワロタ。

214 :デフォルトの名無しさん:2006/05/07(日) 23:14:33
>>213
catch(...) で一般保護例外を拾ってしまうのは、それはそれで問題なわけだが。

215 :デフォルトの名無しさん:2006/05/07(日) 23:14:59
>>213
個人的に、そういう種類の例外は、環境依存の方法でキャッチすべきだと思っているんだけど。
まあ、VC++ならどういう例外が投げられてきたかを知る方法だけはあるから、まだましか。

216 :デフォルトの名無しさん:2006/05/07(日) 23:20:20
>>214-215
これができるとできないとでは大きな差があることぐらいはわかるよね?

217 :デフォルトの名無しさん:2006/05/07(日) 23:25:01
>>216
できるできないの問題ならいいんだが、強制されてしまうぶんには
どっちが有利ともならないなぁ。

218 :デフォルトの名無しさん:2006/05/07(日) 23:38:19
>>217
例外処理の使い方を考えれば強制されるという概念を持つ事は変だと思う。
が、その「強制された」としてなんか困ることや嫌なことが具体的にあるの?

俺はこの件に関しては Unix/Linux はダメダメと結論している( もちろん
そんな一点の問題で Unix/Linux 自身がダメダメと結論づけるようなつもりは
毛頭無い。 )が、そうでない意見があるなら聞いておきたい。

219 :デフォルトの名無しさん:2006/05/07(日) 23:51:59
>>218
「C++の例外処理」「unixのsignal」「WindowsのSEH」を混同してませんか?
C++の例外風に処理を記述できるWindowsのSEHは便利だよね、というだけの話。
まぁSEHには「知識や権限に関わらず、早く例外を捕まえた人が処理できてしまう」
という問題があるため結局VEHが導入されたわけだが。

220 :デフォルトの名無しさん:2006/05/08(月) 00:01:19
>>218
よく知らないんだが throw() と考えられる関数からも一般保護例外は飛んでくるよね?
ちゃんとそれ考慮して、スタックの巻き戻しができるようにコード生成してくれるの?

try{
 std::auto_ptr<T> p(new T);
 strcpy(0,0);
}catch(...){
 // ここにくるまでに p の delete は行われるの?
}

行われるとしたら、とても非効率なコードが生成されてしまいそうなんだけど。

221 :デフォルトの名無しさん:2006/05/08(月) 00:01:45
>>219
一応知ってはいるが、混同はあるかも知れん。が、結局どこがどう問題なの?

自分が知っている例外についてはそれぞれ型を明記してそれぞれに合わせた処理をして、
その他の例外がきたらまとめて処理する。この「その他の例外」に「unixのsignal」 or
「WindowsのSEH」が含まれることは全然welcomeだと思うんだが。

222 :デフォルトの名無しさん:2006/05/08(月) 00:04:32
>>220
それはダブルフォールトになって落ちる。
これはまた別の問題だと思う。

223 :222:2006/05/08(月) 00:05:26
あ、適当なこと言った。
ダブルフォールトじゃなかったかも。
とにかく落ちる。

224 :デフォルトの名無しさん:2006/05/08(月) 00:30:19
VC++ 2005 Express で↓のコード動かしたけど、キャッチできないお?

#include <cstdio>
int main()
{
 try{
  struct T { ~T(){ puts("~T()"); } } x;
  puts("causing access violation");
  char* p = 0;
  *p = 0;
 }catch(...){
  puts("catch(...)");
 }
}

225 :デフォルトの名無しさん:2006/05/08(月) 00:33:27
コードが最適化で消えてるとか?

226 :デフォルトの名無しさん:2006/05/08(月) 00:33:50
WindowsのSEHはそのままじゃC++のEHじゃ捕まえられないよ。
VC++なら_set_se_translator()使わないと自分で throw した例外以外
( 一般保護例外,ゼロ除算,等々 )は catch(...) でも拾えずに
Dr.WatsonをよぶWindows のヘタレっぷりを初めて知った時にはワロタ。

227 :デフォルトの名無しさん:2006/05/08(月) 00:35:49
他のosだと捕まえられるのか?

228 :デフォルトの名無しさん:2006/05/08(月) 00:39:00
>>224
コンパイルオプションを調べれ。
>>226がなんか言ってるけど、そんなことしなくても拾える。
( まぁ、明示的か裏でやってくれるかの違いでしかないかもしれんが。 )

229 :デフォルトの名無しさん:2006/05/08(月) 00:42:34
>>226
何をやっても拾えない Unix/Linux はヘタレ以下ってことでおk?

230 :224:2006/05/08(月) 00:43:36
>>228
/EHa にしたらキャッチできた。 ~T() も呼ばれたみたい。

でもデフォルトじゃないってことは、やっぱり何か問題があったっぽいな。

231 :デフォルトの名無しさん:2006/05/08(月) 00:45:34
>>217
というわけで、強制じゃないってことだな。
それなら便利に使えることもあるだろう。

232 :デフォルトの名無しさん:2006/05/08(月) 00:49:06
>>230
問題と言っても Unix/Linux で動かした時と同じ挙動にさせたいとか
そーゆー互換性の類の問題かも。本当のとこはどーなのか知らんけど。

233 :デフォルトの名無しさん:2006/05/08(月) 00:55:08
>>224
VC7.1だと、/EHsでもキャッチできてしまう。
問題だったんだろうな。

234 :デフォルトの名無しさん:2006/05/08(月) 00:55:46
>>229
本当に何をやっても拾えないの?


235 :デフォルトの名無しさん:2006/05/08(月) 00:56:14
>>232
SEHに対応してなかった頃のプログラムの挙動を変えないようにする為に1票。

236 :デフォルトの名無しさん:2006/05/08(月) 00:56:39
>>221
記述が楽なだけで、出来ることも不便なところもsignalと大差ないでそ?
VEHなら強力で応用範囲が広いので Windows マンせーもわかるけど、
高々SEHは記述がラクってだけで unix はダメ風に言うのはどうか、と言いたかった。

237 :229:2006/05/08(月) 00:57:29
>>234
俺はWindows使いだから知らね。

238 :デフォルトの名無しさん:2006/05/08(月) 01:00:56
>>237は低脳ということが判明した。
知らない環境に対して口を出すなよ。

239 :デフォルトの名無しさん:2006/05/08(月) 01:02:11
>>236
catch(...)って記述だけで全部拾えるのは単に記述がラクって言うのとは違うとは思う。
全てのプログラマが Unix/Linux でのプログラミングに精通してるわけじゃないないんだから。

240 :デフォルトの名無しさん:2006/05/08(月) 01:07:52
>>230
デフォルトじゃないのは、パフォーマンスのためらしい。
http://msdn2.microsoft.com/ja-jp/library/7f10tsf4(en-us,vs.80).aspx

241 :デフォルトの名無しさん:2006/05/08(月) 01:08:14
>>239
確かに簡単というか難しくないアプリ開発とかならそのとおりなんだけど、
signalさえわからん奴に勝手に拾われても・・・ってな話もあると思うよ。
結局SEHではそれが問題でVEHが出てきたわけだし。

242 :デフォルトの名無しさん:2006/05/08(月) 01:12:04
窓使いなのでよく分からないのだけど、Unix/Linuxでシグナルがcatchできないってのは
特定の言語処理系の問題なの? それともUnix/Linuxのしくみ自体がそれを許さないってことなの?


243 :デフォルトの名無しさん:2006/05/08(月) 01:17:47
ま、>>242 が窓使いって奴の限界なのかね。

244 :デフォルトの名無しさん:2006/05/08(月) 01:20:00
>>242
いや別にLinuxにもUnixにも、それを不可能とするような制限は無いよ。
例えば HP C++ なんかではSEH同様の機構が実装されている。
あんまり欲しい人がいないせいか、gccに採用されてないだけ。

245 :242:2006/05/08(月) 01:25:23
>>244
サンクス。よかった、そりゃそうだよね。

それじゃ、そもそも>>213は「GCC(等の対応していない処理系の)のヘタレっぷりにワロタ」ってことなのかな。


246 :237:2006/05/08(月) 01:26:41
>>238
ゴメンなさい。

247 :デフォルトの名無しさん:2006/05/08(月) 01:27:19
>>245
実際はそういうことなんだろうが、 OS の優劣と混同していると思われ。

248 :デフォルトの名無しさん:2006/05/08(月) 06:05:17
cygwin の gcc でSEHを拾えるか試してみたんだけど拾えんかった。
なんかググってみたところ、SEHに対応させるパッチを作ってる人がいるみたいだけど
gcc みたいにそれなりの頻度でバージョンアップがあり且つバージョンが変わったら
ゴロっと中身が変わってしまうようなプログラムでパッチがあってもあんまりうれしくないなぁ。

249 :デフォルトの名無しさん:2006/05/08(月) 06:24:51
>>230
> ~T() も呼ばれたみたい。

これ、例外の種類によっては、うまくいかないことがある。
特にコンストラクタの中で例外が起きた時。
だからSEHは強い例外安全じゃない。過信は禁物。


250 :デフォルトの名無しさん:2006/05/08(月) 10:58:46
>>249
コンストラクタが完了しないとデストラクタは呼ばれません。基本です。

251 :デフォルトの名無しさん:2006/05/08(月) 16:53:56
>>153
亀レスだが、VC++6.0 を使っているなら、Greta の利用を検討してはどうか。
Boost.Expressive の作者が作ったもので、STL のアルゴリズムに似せた
デザイン。Microsoft のサイトでダウンロードできる。

http://research.microsoft.com/projects/greta/

252 :デフォルトの名無しさん:2006/05/08(月) 17:07:50
>>251
お前がぐれたのは、こういう物を使ったためだったのか。

253 :デフォルトの名無しさん:2006/05/08(月) 17:32:40
int main()
{
Damepo moudamepo;
moudamepo.mandokuse('A');
}

254 :デフォルトの名無しさん:2006/05/08(月) 20:32:35
え?C++って正規表現すらろくに標準装備されてないの?ショボw

255 :デフォルトの名無しさん:2006/05/08(月) 20:35:25

 .          ┌┬┬┬┐
  .―――――┴┴┴┴┴―――、       ______________
 || ̄ ̄ ̄||  ̄||| ̄ ̄ ̄|| | ̄ ̄ヽ     /
 || アヒャヒャ| |  ||| アヒャ || |_∧  ヽ   / では>>254
 ||(・∀・)_| |・∀||(・∀・)|| |  )  [ ] <  引き取らせていただきまーす
 ||_ ̄ ̄_|_|_/ | ̄ ̄ ̄.|| | ̄ ̄ ̄ ||  \_____________
  l O| ―-.|O゜| 東京精神病|.|院 ニニ .||
  |_  ̄口 ̄  l_l⌒l|____|.|l⌒l_||_|__|  ブロロ-‥‥
   `ー' ̄ ̄ ̄`ー'  `ー'   `ー'

256 :デフォルトの名無しさん:2006/05/08(月) 20:35:38
>>254
え?>>254は標準ライブラリしかろくに扱えないの?ショボw

257 :デフォルトの名無しさん:2006/05/08(月) 21:02:09
>>256
いちいち他人の作ったもん探して、自分のソフトに組み込むのが嫌なんだよ
ほんとショボいなC++は。他人にだっこしながらでないと開発できないなんて

258 :デフォルトの名無しさん:2006/05/08(月) 21:05:03
>>257
そういう考えは捨てた方がいいよ。


259 :デフォルトの名無しさん:2006/05/08(月) 21:07:16
今年のGWはやけに長いな

260 :デフォルトの名無しさん:2006/05/08(月) 21:10:12
>え?C++って正規表現すらろくに標準装備されてないの?ショボw

>ほんとショボいなC++は。他人にだっこしながらでないと開発できないなんて

261 :デフォルトの名無しさん:2006/05/08(月) 21:15:59
>>258
嫌だね。全部自分で作りたい
なんか、他人のもん使うってせこい感じで嫌
効率悪くても自分で作りたい
だからって、どのソフトでも標準である機能をわざわざ自分で作成するのも損した気がするし
やっぱ、C#かVBのほうがいいね

262 :デフォルトの名無しさん:2006/05/08(月) 21:22:42
C#の正規表現もVBの正規表現も他人が実装したもんじゃね?

263 :デフォルトの名無しさん:2006/05/08(月) 21:23:04
>>261
で、君が使っているコンパイラは「他人のもん」ではないのか?

264 :デフォルトの名無しさん:2006/05/08(月) 21:24:29
>>262
>>263
そんな屁理屈でしか言い返せないわけだw
図星だったなw

265 :デフォルトの名無しさん:2006/05/08(月) 21:26:49
で、boostが標準に取り込まれたらころっと態度を変えるのかね君は。

266 :デフォルトの名無しさん:2006/05/08(月) 21:29:56
>261
だったらコンパイラから自分で作れば?

267 :デフォルトの名無しさん:2006/05/08(月) 21:30:35
M$以外が作ったなんの保障もない糞ライブライリなんてイラネ

268 :デフォルトの名無しさん:2006/05/08(月) 21:31:18
>>266
だからって、どのソフトでも標準である機能をわざわざ自分で作成するのも損

日本語も理解できねーのかよカス

269 :デフォルトの名無しさん:2006/05/08(月) 21:33:12
けっきょく標準を策定した人間に対してはおんぶにだっこか

270 :デフォルトの名無しさん:2006/05/08(月) 21:34:01
おまいら釣られすぎ

271 :デフォルトの名無しさん:2006/05/08(月) 21:34:21
>>269
当たり前だろアホか

272 :デフォルトの名無しさん:2006/05/08(月) 21:35:01
今年はGW直後から5月病患者が大暴れだな。

273 :デフォルトの名無しさん:2006/05/08(月) 21:40:41
C++の盲点をついたら病気扱いかよw
都合の悪いこと言われるとみんな異常者か?
ほんと異常者のおまえらの思考はとんでもないなw

274 :デフォルトの名無しさん:2006/05/08(月) 21:46:34
正規表現が使えないくらいでオロオロすんな
FSMの練習だと思って作ればいいじゃんよ

・・ところで盲点って何?

275 :デフォルトの名無しさん:2006/05/08(月) 21:46:53
どこが盲点なんだ?C、C++と受け継がれる設計思想そのものだぞ。

276 :デフォルトの名無しさん:2006/05/08(月) 21:52:38
正規表現使いたいだけで>>251みたいな英語のサイト行かないとだめだし
てか、そんなものがあるかどうか知るすべなんてないし

それに比べてVBはLIKEがある。簡単
C#ならregexがある。簡単
C++は標準ではまともな関数がない
どうやってみ探せばいいかもわからない。
説明サイトもない。書籍もない。誰が好きこのんでC++なんかやるんだよ
時代錯誤もいいところ

277 :デフォルトの名無しさん:2006/05/08(月) 21:53:57
最初からそう言ってくれればよかったのに。
なかなか正しい意見だからC#勉強したほうがいいよ。

278 :デフォルトの名無しさん:2006/05/08(月) 22:00:41
>>276
そのとおりだ
C#とかJavaとかオススメ

279 :デフォルトの名無しさん:2006/05/08(月) 22:05:22
なに変な方向に盛り上がってんの?
「正規表現使いたいんなら正規表現ライブラリ使え」以上、終了。
じゃダメなんか?

280 :デフォルトの名無しさん:2006/05/08(月) 22:06:36
いいよ。

281 :デフォルトの名無しさん:2006/05/08(月) 22:07:37
>>279
そのライブラリはどこにあるんですか?

282 :デフォルトの名無しさん:2006/05/08(月) 22:08:46
全部自分で作りたいんじゃなかたのか

283 :デフォルトの名無しさん:2006/05/08(月) 22:09:21
自分でプログラミング言語つくれ

284 :デフォルトの名無しさん:2006/05/08(月) 22:09:23
boost等にあるよ
C++ 正規表現で検索すれば出てくるのに

285 :デフォルトの名無しさん:2006/05/08(月) 22:12:57
>>284
やっぱboostかよ
なんでVBに正規表現あるのに
C++にはないわけ?
C++使う奴は、VBじゃ文字列処理やポインタなど細かい処理ができないから
C++に来てるのに、正規表現もないってなんだそれ?
一体どういう奴を対象にしてんだよ!まったく
てか、どうせ、正規表現だけじゃなくて、ほかにもVBならあるのにC++にはない
関数とかが大量にあって、その度に、検索しまくって探しまくったりするんだろ?
あーめんどくせ

286 :デフォルトの名無しさん:2006/05/08(月) 22:16:54
そりゃお前がVBから始めたってだけの話だろ
愚痴ならチラシの裏かブログへ

287 :デフォルトの名無しさん:2006/05/08(月) 22:21:07
  ┏┳┳┓     ハイ.     ┏┳┳┓
┏┫┃┃┃池沼と遊ぶのは ┃┃┃┣┓
┃┃┃┃┣┓  ここまで ┏┫┃┃┃┃
┃      ┃┃┏━━━┓┃┃      ┃
┃ 池沼   ┣┫ . ・∀・ ┣┫. STOP!┃
┗━━━━┛┗┳━┳┛┗━━━━┛
            ┏┻┓┃
        ┏━┛  ┣┻┓
        ┗━━━┫  ┗━┓
.             ┗━━━┛


288 :デフォルトの名無しさん:2006/05/08(月) 22:24:48
スレが伸びてると思ったら・・・なんだこりゃ?

289 :デフォルトの名無しさん:2006/05/08(月) 22:27:22
また基地外か。

290 :デフォルトの名無しさん:2006/05/08(月) 22:40:12
いい加減↓行ってくれないか。
ttp://pc8.2ch.net/test/read.cgi/tech/1141400056/l50

291 :デフォルトの名無しさん:2006/05/09(火) 01:52:48
応用編:
 なんで C に複素数あるのに
 C++ や VB には(ry

 なんで x86 マシン語にはローテートあるのに
 C には(ry

まあなんつーか、これが所謂「ヴビチュウ」という生き物か。

292 :デフォルトの名無しさん:2006/05/09(火) 02:03:21
>>291
C++には複素数あるし、
ローテートも Intel C++ Complier とか使えば組み込み関数で提供されてるだろ。

293 :デフォルトの名無しさん:2006/05/09(火) 02:15:09
組み込み型としての複素数が無いってことだろう。
まあ、処理系独自に組み込み型の複素数作って、
complex はそれを inline で使ってるだけ・・・
な実装な処理系もあるけどね。

294 :デフォルトの名無しさん:2006/05/09(火) 02:15:14
忘れられた<complex>……。

295 :デフォルトの名無しさん:2006/05/09(火) 07:06:33
組み込み型かよ、Stop! 池沼だな。

296 :デフォルトの名無しさん:2006/05/09(火) 07:17:54
組み込み型なら専用の最適化がある可能性がある。

297 :デフォルトの名無しさん:2006/05/09(火) 08:22:37
VBに正規表現あったっけ?
.netの間違いじゃないか?
それならC++も同じですが

298 :デフォルトの名無しさん:2006/05/09(火) 08:24:46
http://msdn2.microsoft.com/ja-JP/library/4384yce9.aspx
C++ の正規表現
.NET Framework SDK で正規表現クラスを使用する

299 :デフォルトの名無しさん:2006/05/09(火) 08:59:09
>>276
>>281
VB や C# を話しにあげているなら、Visual Studio .NET 以降だろう。
なら、標準でついている ATL に正規表現ライブラリがくっついてる。
Microsoft 純正で、VCなら標準だ。文句ないだろ


300 :デフォルトの名無しさん:2006/05/09(火) 09:40:36
自分で標準化委員会でも立ち上げて、
自分が使いたいものについてはすべて標準ってことにしちゃえばいいじゃない

301 :デフォルトの名無しさん:2006/05/09(火) 14:17:45
組み込み型?ただでさえ基地外のように巨大な言語仕様になって
しまったC++なのに、まだ肥大化させるつもりかよ。

302 :デフォルトの名無しさん:2006/05/09(火) 14:25:24
おまえが基地外だから
基地外のように巨大に感じるだけ。

303 :デフォルトの名無しさん:2006/05/09(火) 14:37:39
組み込み型は別に多くないが、
言語仕様は大きいのはまあ大きい。
もっと大きなのもあるけど。

より良い言語を作ろうとすると
どうしても言語仕様がデカくなって、
それが為に理解できる人が減ってしまうのは
何か遣る瀬ないな。

304 :デフォルトの名無しさん:2006/05/09(火) 14:38:19
>>302
自己紹介乙。

305 :デフォルトの名無しさん:2006/05/09(火) 14:49:38
・馬鹿の一つ覚え
・ありきたり
という表現がぴったりくるな。

306 :デフォルトの名無しさん:2006/05/09(火) 15:03:31
RVOの時代に組み込み型で最適化とはね。
標準化委員会の方向とは完全な逆方向だな。

307 :デフォルトの名無しさん:2006/05/09(火) 15:29:27
「C++の言語仕様はさまざまな変更を経て複雑怪奇なものに〜」
ってよく聞くけどVBやJavaってそんなに楽なのか

308 :デフォルトの名無しさん:2006/05/09(火) 15:46:45
キーワードを無闇に使い回ししたせいで
文脈毎に意味が変わったりする、って点では複雑だが
まあコンパイラ開発者に比べたら利用者の流す汗と涙なんか
知れたものよね。

309 :デフォルトの名無しさん:2006/05/09(火) 15:54:57
>>307
・generic function系は、大抵適当な奴を選ぶ規則が複雑。
・Javaはinstance methodはvirtualのみ。
・templateの(部分)特殊化
・Cとの互換

310 :デフォルトの名無しさん:2006/05/09(火) 16:30:28
Javaはなぁ・・・あれを使うことによって楽になるのは馬鹿だけだから。
天才、凡人、馬鹿、すべての層の開発コストが抑えられる言語・環境ではなく、
C++では「馬鹿お断り」だった領域に、馬鹿でも加われるようになる言語・環境なんだよ。

喩えるなら、Javaの利便性は人工呼吸器みたいなもの。
それによって助かる人もいるけど、健常者なら苦もなくやれるところを手助けしてるだけ。
健常者にとっては、それ使って生活するのは何かとうざったい。

311 :デフォルトの名無しさん:2006/05/09(火) 16:35:06
Javaは多重継承がないのが耐えられない。
特殊化がないのも辛い。

312 :デフォルトの名無しさん:2006/05/09(火) 16:43:07
>>310
それじゃVB.netはICUか。

313 :デフォルトの名無しさん:2006/05/09(火) 17:31:36
多重継承禁止するなら mix-in は欲しいよね。

314 :デフォルトの名無しさん:2006/05/09(火) 18:36:47
言語の機能として欲しいね。自分で書くんじゃなくて。

315 :デフォルトの名無しさん:2006/05/09(火) 20:15:17
>>307
本格的なものをつくろうとするとそんなにラクでもない。
簡単なものを作る場合には C++ より楽なことが多い。

316 :デフォルトの名無しさん:2006/05/09(火) 22:31:06
全角文字列(2バイト文字)をあるデリミタで(2バイト文字)分解したいと思ってます。
C言語のstrtok()みたいなものです。C++にこのような機能を持った関数はありますか?
g++でコンパイルでき外部のライブラリは使わないという条件なのですが。


317 :デフォルトの名無しさん:2006/05/09(火) 22:32:46
>>316
ワイド文字へ変換してwcstokを使ったらどうか?

318 :デフォルトの名無しさん:2006/05/09(火) 22:34:13
wchar_t 使って wcstok とか?

319 :デフォルトの名無しさん:2006/05/09(火) 22:34:24
2バイトずつ文字を拾うイテレータをでっちあげて find する。

320 :デフォルトの名無しさん:2006/05/09(火) 22:36:58
>>317
ありがとうございます。それでできそうな感じです。
strtokを含めてC言語の機能みたいですがstringクラスみたいなC++クラス版は実装されてないんでしょうか?

321 :デフォルトの名無しさん:2006/05/09(火) 22:38:12
>>320 wstring

322 :デフォルトの名無しさん:2006/05/09(火) 22:41:07
ありがとうございます。
いろいろ手がかりができたので調べてみます。

323 :デフォルトの名無しさん:2006/05/09(火) 22:42:39
wcstok を wstring に使うのはマズいなぁ。
wstring 使うなら、
find したり substr するなりして拾う事になるかな。
俺はそうやって strtok みたいなのを自分で実装して使ってる。

324 :デフォルトの名無しさん:2006/05/09(火) 22:57:01
>>323
findでデリミタの場所探してsubstrでできそうですね

325 :sage :2006/05/09(火) 23:06:47
Cで正規表現なんてつかわないでしょ
とっかしたパーサかけ

326 :デフォルトの名無しさん:2006/05/09(火) 23:10:32
>>325
スレ違い。

327 :デフォルトの名無しさん:2006/05/09(火) 23:15:50
boost::tokenizerはどう?

328 :デフォルトの名無しさん:2006/05/09(火) 23:19:27
そっか。ここは boost アリなんだったな。

329 :デフォルトの名無しさん:2006/05/09(火) 23:21:41
このスレに標準C++限定などと言った縛りは無い。

330 :デフォルトの名無しさん:2006/05/09(火) 23:24:21
>>329
VC6という糞コンパイラについて語ろうか。

331 :デフォルトの名無しさん:2006/05/09(火) 23:24:24
でもライブラリ自体の話は専用のスレにどうぞ。
http://pc8.2ch.net/test/read.cgi/tech/1139266461/

332 :デフォルトの名無しさん:2006/05/09(火) 23:25:15
C スレは厳しいからな。
ちょっとビクビクしてしまう。

333 :デフォルトの名無しさん:2006/05/09(火) 23:29:55
>>331
まだ落ちていなかったのかw

334 :デフォルトの名無しさん:2006/05/10(水) 02:25:39
typedef struct S S;
struct T { S* S; };

VC++ 2005 Express の cl.exe (VC8?) だと通るこのコードが、
cygwin の gcc 3.4.4 ではエラーになりました。
> 2: error: declaration of `S*T::S'
> 1: error: changes meaning of `S' from `typedef struct S S'

gcc の言ってることはわからんでもないのですが、
規格としてはどっちなんでしょうか?( ill-formed? well-fromed? )

335 :デフォルトの名無しさん:2006/05/10(水) 02:34:45
レベルの低い質問すいませんが

"AABBAAACCCCAAADDDEEAAA"
このような文字列を処理するにはistringstreamwを使用すればいいことは解ったのですが
今何文字目を処理しているかを知るには自分で数えるしかないのでしょうか?また
先を読みをしたい場合はどうすればいいのでしょうか?

336 :デフォルトの名無しさん:2006/05/10(水) 02:43:13
>>335
文字列を処理するには string 使えばいいと思うんだけどね。

istream について、
何文字目ってのは tellg() とか gcount() とか使う。
読み出すには read() とか operator >> とか使う。

337 :334:2006/05/10(水) 02:47:41
後付になりますが、 typedef 無しで
struct S;
struct T { S* S; };
としても同様の結果になりました。
ただ、実際の問題は C のソースを C++ に持ってきたときに
エラーになってしまうことがあるということなんで、ちょっと別件っぽいです。

S* S を struct S* S に変えると C でも2つの C++ コンパイラでも
どっちでも通るので、タイプ量をケチるための typedef struct S S を
辞めるべきなのかな?と迷ってます。

338 :335 :2006/05/10(水) 03:03:12
>>336
あ〜なるほどなるほど
ファイルから読み込んで、istreamにアタッチして読み込み
判別していくという感じになるのです。解りました。

もう1つ聞きたいのですがC++でこのような文字判別を行う場合
例えば'A'を判別するケースとして
C言語のようにif文無いし関数を用いて判断するべきなのか
それともoperator >>のような新しい演算子を作るべきなのでしょうか

339 :デフォルトの名無しさん:2006/05/10(水) 03:08:35
>>337
S* S; の2つ目の S で問題が発生してるようだ。
何でもかんでも同じ名前にするのはやめとけ。
S* s; で通る。

340 :デフォルトの名無しさん:2006/05/10(水) 03:23:16
VCだと、クラス名と変数名がかぶっても、できるみたいだな。
仕様を読んでみたら、typedefで意味を変えるな、とは書いてある気がする。

class Foo {} ;

typedef Foo Foo ; //OK
typedef int Foo ; //ERROR


でもこの問題は、typedefじゃない気がする。
どっちにしろ、名前がかぶるといいことはない。

Foo Foo ; //VCではOK
Foo & f = Foo ;

このコードは、VCでは、
変数 Foo と変数 fに対して、&演算子を適用し、変数 Fooを代入する意味になるらしい。
変数 Fooを参照する、Foo &型の変数 fにはならないらしい。


341 :デフォルトの名無しさん:2006/05/10(水) 03:29:47
>>338
string に読み込んで find() する。

342 :デフォルトの名無しさん:2006/05/10(水) 03:33:36
typedef struct S S; の2つの S は名前空間が違うから問題ない。
これはよく言われる事だから確実かと。

で、S* S; の2つの S は名前空間同じなんじゃないかな。
VC++ で通るのは処理系独自の拡張?

343 :335 :2006/05/10(水) 03:34:35
うーんそれだとちょっと意味が違ってきてしまいます
字句解析を将来するための事前勉強なので
findを連発するのはふさわしくないと思うのですがどうなのでしょうか

344 :デフォルトの名無しさん:2006/05/10(水) 03:39:20
>>343
最初に十分な情報を出さずに質問しておいて、答えが帰ってきた後に
自分の都合を小出しにして文句を垂れる。そんな人は嫌いです。

345 :335 :2006/05/10(水) 03:42:24
申し訳ございませんでした。

346 :デフォルトの名無しさん:2006/05/10(水) 03:42:40
 >VC++ で通るのは処理系独自の拡張?
単にチェックしてないだけなんじゃないかという、
大胆な予想を思いついてしまった。

347 :デフォルトの名無しさん:2006/05/10(水) 03:49:07
そういや struct T の内部だから、
S* S; の2つの S は名前空間違うな。
なら、通る方が正しいのか?

まあ、そう何度も同じ名前を使うべきじゃないと思うから、
S* s; の方がいいと思うがな。

348 :デフォルトの名無しさん:2006/05/10(水) 03:52:15
ドンブラコッコ、ウンコッコ

349 :334:2006/05/10(水) 03:59:23
S という名前はサンプル用に作ったやつで、実際には全部小文字の名前が使われてたりします。
さらに問題のコードは移植元のソースなんであんまりいじりたくないんですけどね。

まぁ型名をそのまま変数名にしてるのが悪いのだとは思いますんで、今後気をつけることにします。

まだきっちり読みきっていませんが、こんなのを見つけました。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#407
標準でもまだ確定していない部分に踏み込んでしまったようです。

Cとの互換性なんて初心者を釣るための餌だったのかと思えてきました。

350 :デフォルトの名無しさん:2006/05/10(水) 04:54:37
親クラスCMaterialがCMaterial型のポインタNextMaterialを持ってて、CMaterialを継承したCBlockクラスがあるとき、CMaterialのメソッドを使ってNextMaterialをCBlockとしてnewする方法ない?

351 :デフォルトの名無しさん:2006/05/10(水) 06:16:56
あるよ。

352 :デフォルトの名無しさん:2006/05/10(水) 08:45:20
>>334
typedef struct S S;
struct T { ::S* S; };


353 :デフォルトの名無しさん:2006/05/10(水) 08:53:28
>>352 「C のソースを C++ に持ってきた」(>>337)

354 :デフォルトの名無しさん:2006/05/10(水) 09:47:42
そんなことは読んでます。

355 :デフォルトの名無しさん:2006/05/10(水) 10:11:37
>>350
template < class T > class CMaterial {
  CMaterial* NextMaterial;
public:
  T* CreateNext() { return NextMaterial = new T; }
};
class CBlock : public CMaterial<CBlock> {};

/* または */

class CMaterial {
  CMaterial* NextMaterial;
protected:
  virtual CMaterial* Factory() const { return new CMaterial; }
public:
  CMaterial* CreateNext() { return NextMaterial = Factory(); }
};
class CBlock : public CMaterial<CBlock> {
protected:
  virtual CMaterial* Factory() const { return new CBlock; }
};

356 :デフォルトの名無しさん:2006/05/10(水) 10:13:34
ふたつめのCBlockの宣言は class CBlock : public CMaterial { … だorz

357 :デフォルトの名無しさん:2006/05/10(水) 12:40:34
>>355
ありがとう(_ _)
でもそれだと生成するオブジェクトがCMaterialならCMaterial、CBlockならCBlockしかNextMaterialに生成できないですよね?
CMaterial型のオブジェクトのNextMaterialにCBlockを生成するようなことはできないでしょうか。

358 :デフォルトの名無しさん:2006/05/10(水) 13:16:12
CMaterial *CMaterial::CreateNext()
{
return new CBlock;
}


359 :デフォルトの名無しさん:2006/05/11(木) 00:20:17
>>357
template < class T > CMaterial* CMaterial::CreateNext() {
  return NextMaterial = new T();
}

  CMaterial mate;
  CBlock blo = mate.CreateNext< CBlock >();

360 :デフォルトの名無しさん:2006/05/11(木) 00:20:51
template < class T > T* CMaterial::CreateNext() {

だった

361 :デフォルトの名無しさん:2006/05/11(木) 00:30:03
>>360 そうするとコンパイルとおらないだろ?

362 :デフォルトの名無しさん:2006/05/11(木) 03:27:02
>>359
そんな方法が!コンパイル通るならそれで行こうと思います。何度も有難う御座います。
>>361
まだ試してないのですがCMaterialの前にCBlockを先行宣言すればとおり・・・ませんか?

363 :デフォルトの名無しさん:2006/05/11(木) 04:52:36
>return NextMaterial = new T();

T *ret = newT();
NextMaterial = ret;
return ret;

364 :デフォルトの名無しさん:2006/05/11(木) 07:30:20
質問なんだが
C++でクラス図とコードを相互変換できるソフトとか知らないか?
できればフリーで。クラス図のモデリングが出来ればなおよし

365 :デフォルトの名無しさん:2006/05/11(木) 09:38:55
スレ違い

366 :デフォルトの名無しさん:2006/05/11(木) 09:49:25
スレ違いの指摘には誘導を併記したいところだ。
これは、ここらへん?

おまえらUMLのモデリングツール何つかってますか?
http://pc8.2ch.net/test/read.cgi/tech/1046441663/

367 :デフォルトの名無しさん:2006/05/11(木) 14:45:44
質問します。
STLのVECTORを用いた構造体の配列に関するプログラムで
typedef struct{
int a1,a2,b1,b2;
}Mat;
vector<Mat> Matrix;
void func(Mat *dat){
dat->b1 = 3; dat->b2 = 5;
}

void main(void){
int i;
for(i=0;i<10;i++){
a1 = 1*i; a2 = 2*i+3;
} //--------------------------★1
for(i=0;i<10;i++){
func(&Matrix[i]);
} //--------------------------★2
return;
}
とまぁこういうプログラムがあったとして(実際はもっと複雑な事やってるのですが)
★1の時にはしっかり値をセットできているのに、
★2の時にはVECTOR配列Matrixのメンバ値全てが-8123456といったヘンな値をとるようになってしまいました。
また、関数の引数をポインタではなく構造体そのものにすると(func(Mat dat)とし、"->"の代わりに"."を使う)途中で例外エラー
hoge.exe の 0x00424dd4 でハンドルされていない例外が発生しました : 0xC0000005: 場所 0x4b55c568 を読み込み中にアクセス違反が発生しました。
が発生します。
このような時にしっかり値を構造体配列にセットするにはどう修正すべきでしょうか。
御教授下さい。

368 :デフォルトの名無しさん:2006/05/11(木) 15:02:24
ファクトリ関数というのを作ろうとしています。
試しにVC++7で以下のようなコードを書いてみました。
今のところエラーも出ず、きちんと動いてるように見えるのですが
こんな書き方で問題ないのでしょうか(主に、メモリリークが起きないかどうか)

class Base{};
class Advance : public Base {};
// 戻り値なし・引数ありパターン
void createv( Base* &rp_a ){
 rp_a = new Advance;
}
// 戻り値あり・引数なしパターン
Base* createb(){
 return ( new Advance );
}

int main()
{
 // 基底クラス型ポインタ
 Base* p_b1;
 Base* p_b2;
 // オブジェクトを生成
 createv( p_b1 );
 p_b2 = createb();
 // オブジェクトを破棄
 delete p_b1; p_b1 = 0;
 delete p_b2; p_b2 = 0;
 return 0;
}


369 :デフォルトの名無しさん:2006/05/11(木) 15:02:40
>>367
値をセットするとかそういうところの問題ではありません。
vector は明示的に要素数を指定してあげなくてはなりません。
vectror<Mat> Matrix(10) とするか、main の頭でMatrix.resize(10) としてください。

基本知識が少し不安・・・

370 :デフォルトの名無しさん:2006/05/11(木) 15:04:21
>>367
>実際はもっと複雑な事やってるのですが
最低再現するプログラムを貼りましょう

- Matrixのサイズは0でいいの?
- ★1のa1,a2ってなに?


371 :デフォルトの名無しさん:2006/05/11(木) 15:08:54
>>368
Baseのデストラクタはvirtualにした方がいいよ
Advanceがそのままメンバ変数を持たなければ問題はないだろうけど
あるいは生のポインタじゃなくてboost::shared_ptr使うとか


372 :デフォルトの名無しさん:2006/05/11(木) 15:45:43
>>369
vectorは動的にサイズを変更できると聞いていますが、要素数は指定しなければいけないのでしょうか。
何しろ格納するデータ数が未定なので、STLを使ってみたのです。
先ほど、要素数を vector<Mat> Matrix(0); と指定して

for(i=0;i<10;i++){
Matrix.resize(i+1);
a1 = 1*i; a2 = 2*i+3;
} //--------------------------★1
のように行っても直りませんでした。
>>370
最低再現するプログラム…
OPENCVで画像を読み込んである行列計算をしてその結果を放り込むプログラムです。
計算部分はデバッグを行い、ウォッチで値を確認して動作は確認したため貼らなかっただけです。
再現したい部分は>>367に書いた通りです。

373 :デフォルトの名無しさん:2006/05/11(木) 15:49:58
Matrix.resize(10);
for(i=0;i<10;i++){
 Matrix[i].a1 = 1*i; Matrix[i].a2 = 2*i+3;
}
の写し間違いだよね?
人に質問できるレベルに達してないよ・・・

374 :デフォルトの名無しさん:2006/05/11(木) 15:52:51
>>373
すみません、その通りです。少々慌ててました。

375 :デフォルトの名無しさん:2006/05/11(木) 15:59:28
>>362
あのさ、>>359でいいなら(呼び出し側がNextMaterialにセットする型が分かってるなら)

CMaterial::SetNext(CMaterial* next) {
  NextMaterial = next;
}

mat.SetMaterial(new CBlock);

でいいじゃん…

376 :デフォルトの名無しさん:2006/05/11(木) 16:00:32
>>374
370は373と同じことを言ってるのに、372のようなレスをすることからも
かなり慌ててるのがわかる。

午後4時から研究室の発表とかいうのでなければ
まずはコーヒーでも飲んでくることをお勧めする。


377 :デフォルトの名無しさん:2006/05/11(木) 16:05:08
つーかさぁ、Matの一時変数に代入してpush_back()すればいいじゃん。

378 :デフォルトの名無しさん:2006/05/11(木) 16:09:29
…申し訳ありませんでした。本当の所を書きます。

void main(void){
int cnt=0;
char buf[256];
char *tp;
FILE *fp
FolderPath1 = "csvファイル1のパス"
FolderPath2 = "画像フォルダのパス"
fp = fopen(FolderPath1,"r");

while(!feof(fp)){
Matrix.resize(i+1);
fgets(buf,sizeof(buf),fp1);
tp = strtok(buf,",");
temp = atof(tp);
Matrix[i].a1 = temp;
Matrix.resize(i+1);
fgets(buf,sizeof(buf),fp1);
tp = strtok(NULL,",");
temp = atof(tp);
Matrix[i].a2 = temp;

cnt++; //ここでデータ件数をカウントする
}

379 :デフォルトの名無しさん:2006/05/11(木) 16:10:25
>>375
全然気づきませんでした

それが一番スマートで楽ですね。そうします。
皆様ありがとうございました。

380 :デフォルトの名無しさん:2006/05/11(木) 16:10:37
//main関数の続き
//画像データを格納

char imgpath[512];//画像のパス
char tempstr[32];//画像ファイル名
for( i=0 ; i<cnt ; i++ ){

//連番ファイル名の画像ファイルパスを作成する
sprintf( tempstr, "%05d.jpg", i+1 );
strcpy( imgpath, FolderPath );
strcat( imgpath, tempstr );
//格納処理
IplImage *image = cvLoadImage( imgpath, -1 );//読み込み
SetTex(image,&Block_Mat[i]); ←この関数の定義は次に書きます(main関数の前に定義してある)
}

381 :デフォルトの名無しさん:2006/05/11(木) 16:15:56
void SetTex(IplImage *img, BLOCK_IMAGE *dat)
{
int size = sizeof(dat->tex);//行列サイズ
size = sqrt((double)size);

CvSize r_size = cvSize( size, size );//リサイズ後の座標
IplImage *res_img = cvCreateImage( r_size, IPL_DEPTH_8U, 3 );//テクスチャ画像
cvResize( img, res_img, CV_INTER_CUBIC );

//テクスチャ作成
int w, h;
for (w=0;w<size;w++) {
for (h=0;h<size;h++) {
//青
if(0 <= res_img->imageData[h * res_img->widthStep + w * res_img->nChannels])
dat->tex[w][h][2] = (GLubyte) res_img->imageData[h * res_img->widthStep + w * res_img->nChannels];
else
dat->tex[w][h][2] = (GLubyte) (256 + res_img->imageData[h * res_img->widthStep + w * res_img->nChannels]);
//緑
if(0 <= res_img->imageData[h * res_img->widthStep + w * res_img->nChannels + 1])
dat->tex[w][h][1] = (GLubyte) res_img->imageData[h * res_img->widthStep + w * res_img->nChannels + 1];
else
dat->tex[w][h][1] = (GLubyte) (256 + res_img->imageData[h * res_img->widthStep + w * res_img->nChannels + 1]);
//赤
if(0 <= res_img->imageData[h * res_img->widthStep + w * res_img->nChannels + 2])
dat->tex[w][h][0] = (GLubyte) res_img->imageData[h * res_img->widthStep + w * res_img->nChannels + 2];
else
dat->tex[w][h][0] = (GLubyte) (256 + res_img->imageData[h * res_img->widthStep + w * res_img->nChannels + 2]);
}
}

}

382 :デフォルトの名無しさん:2006/05/11(木) 16:18:30
おいおい今度は丸投げかよw(ないよりはいいけど)

貼るのは「最低限の再現するプログラム」にしてくれよ
その最低限を探す過程で大抵は自己解決するんだからさ


383 :デフォルトの名無しさん:2006/05/11(木) 16:19:36
>>372
最低再現するプログラム
= コンパイルが通る完全なコードで、質問する実行時エラーが発生するコード
≠ 作成中のプログラム全体
必要十分な部分を抜き出すか、新たに同一の問題が起こるサンプルを書く。
その過程で、何が間違いか気づくことも多い。

要は、こういうことがしたいのか?
#include <iostream>
#include <vector>

struct matrix_t { int a1, a2, b1, b2; };
std::vector<matrix_t> matrixes;
void func(matrix_t& target) { target.b1 = 3; target.b2 = 5; }

int main() {
 for (int i = 0; i < 10; ++i) {
  matrix_t tmp;
  tmp.a1 = 1*i;
  tmp.a2 = 2*i+3;
  matrixes.push_back(tmp);
 }

 for (int i = 0; i < 10; ++i) {
  matrix_t& m = matrixes[i];
  func(m);
  std::cout << "[" << i << "] = (" << m.a1 << " " << m.a2 << " " << m.b1 << " " << m.b2 << ")" << std::endl;
 }

 return 0;
}


384 :デフォルトの名無しさん:2006/05/11(木) 16:19:59
すみません、>>378のMatrixはBlock_Matに置き換えてください。
//構造体BLOCK_IMAGE
typedef struct{
GLubyte tex[64][64][3];
double a1;
double a2;
double b1;
double b2;
}BLOCK_IMAGE;

385 :367:2006/05/11(木) 16:25:34
皆様、お騒がせしました…
今一度頭を冷やした方がいいかもしれません。
整理して出直します…

386 :デフォルトの名無しさん:2006/05/11(木) 16:32:27
↓試したけどちゃんと動いたよ。本当に頭を冷やした方がいいかも。
#include <iostream>
#include <vector>
using namespace std;

typedef struct{
int a1,a2,b1,b2;
}Mat;

void func(Mat *dat){
dat->b1 = 3; dat->b2 = 5;
}

int main(void){
int i;
vector<Mat> Matrix;
Matrix.resize(10);
for(i=0;i<10;i++){
func(&Matrix[i]);
}
for(i=0;i<10;i++){
cout << Matrix[i].b1 << Matrix[i].b2;
}
return 0;
}

387 :367:2006/05/11(木) 17:46:19
頭を冷やしてきました。一つ一つ値を追いかけていき、値の狂いだした場所を突き止めたところ
するとバグの起きていた場所が自分の想像していた場所とは違う場所にありました。
int size = sizeof(dat->tex);//行列サイズ
size = sqrt((double)size);
の部分で,sizeの値が構造体メンバのサイズではなく、構造体一個丸々のサイズが出力されていたことが全ての元凶でした。

間違っていると思われていた箇所は問題なく動いておりました…
自分のデバッグ力の無さを反省しながら首吊って死んできます

388 :383:2006/05/11(木) 18:44:17
漏れのコードは闇に葬られたか('A`)

389 :デフォルトの名無しさん:2006/05/11(木) 21:45:12
すいません、終わったところで>>368お願いしてもいいですか・・・

390 :デフォルトの名無しさん:2006/05/11(木) 21:46:01
無い。以上。

391 :デフォルトの名無しさん:2006/05/11(木) 21:52:09
戻り値返す方はスマートポインタを返す様にすると
呼び出し側が戻り値を受けとらなくても安全かも
まぁその時点でバグなんだけど

392 :変なところで終わっているけど…:2006/05/11(木) 21:56:21
>>342
> typedef struct S S; の2つの S は名前空間が違うから問題ない。
> これはよく言われる事だから確実かと。

間違いです。
「C++設計と進化」の名前ルックアップのところが良くまとまっていると思います。

393 :デフォルトの名無しさん:2006/05/11(木) 22:13:57
本を嫁はすぐ可能な事ではないのでよろしくない。

C だとそうだけど C++ だと違うとかいう類いのものなのかな。

394 :デフォルトの名無しさん:2006/05/11(木) 22:31:02
おまいら頭悪スレ逝ってくれ

395 :デフォルトの名無しさん:2006/05/11(木) 22:33:41
2つの S は同じ名前空間にあるはずなんだけど、その宣言の後、
プログラムに現れた S がどっちを指すか、規格できっちり決まっていない。
っていうのが >>349 のリンク。

396 :デフォルトの名無しさん:2006/05/11(木) 22:34:41
なるほど。

397 :デフォルトの名無しさん:2006/05/11(木) 23:32:28
>>393
なぜだろう、ここで晒される本は全部持ってる。

398 :デフォルトの名無しさん:2006/05/11(木) 23:49:08
持ってても斜め読みするだけじゃ、糞のカスにもならない。

手垢がついてボロボロになる位にまで読まなきゃ。

399 :デフォルトの名無しさん:2006/05/11(木) 23:53:44
というかD&Eも読まずに何を言っているんだという感じだけどな。

400 :デフォルトの名無しさん:2006/05/12(金) 00:25:39
禿本は持ちすぎて手の汗でカバー中央がグズグズだ

401 :デフォルトの名無しさん:2006/05/12(金) 01:18:04
>>395
違うぞ。

>>334のケースは決まってる。駄目。
name lookupのthe reevaluation ruleってやつだ。

Mike Millerは、その新しいやり方(this approach)にしても、
やっぱり駄目じゃん(but doesn't eliminate the incompatibility with C)と言っている。



402 :デフォルトの名無しさん:2006/05/12(金) 01:23:14
mixiでkusakabeに聞けば良いんじゃね?
間違ってたら「ボケ」って言ってくれるよ。
正解は教えてくんないけどな

403 :395:2006/05/12(金) 01:57:39
>>401
俺は >>334 が well-formed だなんて言ってないよ。
決まってないのは typedef struct S S の後に現れる S が
クラス名なのか typedef 名なのかってところ。

404 :335 :2006/05/12(金) 02:05:08
char * dataっていうの中身が"HOGEHOGEHOGE"だったとして

char *buf = data + 3;
char *result = new char[4];
memcpy(resutl, buf, 4);

こうすると、EHOGがresultにコピーされますがこのようなデータを
<list>や<vector>内に格納してitするのはまずいですよね?


;

405 :デフォルトの名無しさん:2006/05/12(金) 02:07:12
>>404
「このようなデータ」「itする」の意味がわからない。

406 :デフォルトの名無しさん:2006/05/12(金) 02:08:24
>>404 >>344
学習しない人も嫌いです。

407 :デフォルトの名無しさん:2006/05/12(金) 03:39:42
エスパー的には iterate するってことだとおも

408 :401:2006/05/12(金) 08:36:43
>>403
ああ、そういうことね。スマン誤読した。

409 :デフォルトの名無しさん:2006/05/12(金) 09:00:15
>>335
何を言ってるのかさっぱりわからん。研究室の先輩にでも聞いたらどうだ?
memcpyの第一引数のスペルミスといい、お前本当にサンプルコードで試してるのか?

410 :デフォルトの名無しさん:2006/05/12(金) 09:03:52
書いてからエスパーが働いたが、もしかして、resultを、char*を要素にもつコンテナに格納してもいいかという質問か?
それなら問題はない。ただし、delete[]を忘れないこと。

411 :デフォルトの名無しさん:2006/05/12(金) 14:16:07
境界を出ると例外を投げてくれるiteratorってないですか?
std::list<int> li;
li.push_back(0);
std::list<int>::const_iterator it(li.end());
++it; // ここで例外を投げてほしい

412 :デフォルトの名無しさん:2006/05/12(金) 15:00:54
std::list<int> li;
li.push_back(0);
std::list<int>::const_iterator it(li.end());
*it; // end()ならここで投げる予感
++it;


413 :デフォルトの名無しさん:2006/05/12(金) 15:36:55
operator++()が呼ばれるたびに、毎回範囲内かどうかテストするってことか?
あんまりうれしい処理じゃないな。

++it;
if (it == li.end()) throw XXX;
とでも書けばいいんじゃないの。

414 :デフォルトの名無しさん:2006/05/12(金) 16:02:57
>>411
昔のプログラミング言語CLUみたいだな。

boost::iterator::iterator_facadeで、
std::list<int>::const_iteratorから生成すれば?
void increment()の中でcheckしてthrowするようにすればいい。
20行くらいで書ける。

415 :411:2006/05/12(金) 18:46:03
やりたいことは何個か先の値を見て条件分岐することです。
例えば三個先の値を見て分岐する場合
std::list<T> li;
std::list<T>::const_iterator it(li.begin());
...
if (boost::next(it, 3)->getHoge() == ...) { // 3個先の要素のgetHoge()の値で分岐させたい
}
else {
}
こんな感じになるわけですが、boost::nextでイテレータが三回インクリメント
されるときに、[li.begin(), li.end())を超えてしまうと未定義の動作になってしまいます。
かといって、
if (++it != li.end() && ++it != end() && ++it != end() && it->getHoge() == ....) { ... } // @
とするのはソースが読みにくくなり、また書くのも面倒でしかも使いにくいと思ったわけです。
インクリメントごとに境界チェックするのは>>413さんと同じようにうれしくはないのですが、
@のコードよりはマシかなと思った次第です。他に方法があればいいのですが・・・

416 :デフォルトの名無しさん:2006/05/12(金) 18:48:30
>>415
ループ内で list<T>::iterator::next(3) なんてするくらいなら、
見た目は悪いけど 3つ先のiteratorも作って一緒に回した方が良いよ。

417 :デフォルトの名無しさん:2006/05/12(金) 18:49:07
ごめんなさい。
ループじゃないんですね。

418 :デフォルトの名無しさん:2006/05/12(金) 19:03:58
その目的で例外を使うのは得策じゃないなぁ。
正常動作中でも比較的頻繁に発生しそうじゃないか。
イテレータを3個進める関数を作るのが一番無難な希ガス。
#その関数の中は>415の(1)みたくなっちゃうけど。

419 :デフォルトの名無しさん:2006/05/12(金) 21:20:31
質問です。
参照とポインタの大きな違いは何ですか?
というか、参照>ポインタ なメリットってなんですか?
ポインタのように振舞える?ってことはポインタで十分補えるってことですよね?
使いどころがよくわかりません。
見た目の違い・・・?

420 :デフォルトの名無しさん:2006/05/12(金) 21:23:47
データベースのプログラム作ってみると分かるかもな

421 :デフォルトの名無しさん:2006/05/12(金) 21:41:47
>>419
歴史的に言えば、演算子オーバーロードをスマートに書くために実装された。
例えばユーザ定義クラスHoge同士を
Hoge a, b, c;
c = a + b;
と書けるようにするには
operator+(Hoge& lhs, Hoge& rhs);
が必要になる。
これをポインタでやろうとすると、
(つまり operator+(Hoge

422 :デフォルトの名無しさん:2006/05/12(金) 21:43:08
(´・ω・`)途中で送信しちまったい
operator+(Hoge *lhs, Hoge *rhs)
と実装してしまうと、
c = &a + &b;
と書かなければいけなくなるけれど、
Cでは &a + &b はポインタの加算であって、演算子オーバーロードと意味が被ってしまう。

423 :デフォルトの名無しさん:2006/05/12(金) 21:53:33
な、なるほど・・。
じゃぁ、オブジェクト指向にするために実装されたわけか・・・。
苦し紛れの friend 制約と似てる気がする。
ま、使っても使わなくてもどっちでもいいってことか。

データベースはちょっと作る機会が当分なさそうですな・・。

424 :デフォルトの名無しさん:2006/05/12(金) 21:56:08
>>419
メリットどうこうよりも、
中身が絶対無いとダメな場合は参照。
中身が無い事(NULL)もありうる場合はポインタ。
この2つで使い分けると良い。

とりあえずconst参照渡しから使い始めてみるのがいいかと。
ポインタを使う場合よりスッキリ書ける。

425 :デフォルトの名無しさん:2006/05/12(金) 21:56:56
>>423
その後色々使い方が出てきたけれどね。
例えば、「参照は必ず初期化されなければならない」という制約があるから、
引数のNULLチェックが必要なくなる。

void foo(int *p)
{
 if (p == 0) return; // 必要
 *p = 10;
}

void foo(int &p)
{
 p = 10; // 特殊な例外を除いて、NULLではない
}

など。
参照をムリに使う必要もないし、ポインタだけで済ませることもできるけど
オーバーロードの例のように、ポインタであることを意識させたくない場合や
参照を使った方が便利になる場合は参照を使えばいいかと。

426 :デフォルトの名無しさん:2006/05/12(金) 21:58:17
>>423
>じゃぁ、オブジェクト指向にするために実装されたわけか・・・。
オブジェクト指向とオペレーターオーバーロードは直接関係ない。
もうちょっとC++勉強すれば参照の良さがわかってくるよ。

427 :デフォルトの名無しさん:2006/05/12(金) 22:03:56
ことC++に関しては後から追加された機能が多いからな
そういう機能を「C++っぽいから」という理由で無理に使ってワケわからんプログラムを書くよりは
便利さを実感できるようになってから使った方がいい

428 :デフォルトの名無しさん:2006/05/12(金) 22:04:49
ふむ、にわかプログラマじゃちょっと難しい使い方ですね。
もっと、経験を積んで再度参照の使いどころを検証してみます。
ありがとうございました。

429 :デフォルトの名無しさん:2006/05/12(金) 22:11:38
VC++でプログラムしている学生です。
マインスイーパの画面を色を読み取って、
それをプログラムの中で行列にしたいのですが、
どういったコマンドを使えば良いのでしょうか?
・画面の読み取り方
・画像から行列データの変換の仕方など
教えてください。

430 :デフォルトの名無しさん:2006/05/12(金) 22:17:21
それってWindowsのAPI関係の話題じゃないのか?
そっち行った方が良くね?

431 :デフォルトの名無しさん:2006/05/12(金) 22:19:33
あ、すいません

432 :デフォルトの名無しさん:2006/05/12(金) 22:27:18
コンパイラ : Borland C++Compiler 5.5
IDE : BCC Developer

VBアプリからBCC Developerで作成したDLLを呼び出したいです。
VBのソースに書く装飾名が知りたいんですが、VC++がインストール
されている環境でないと知ることはできないのでしょうか。

433 :デフォルトの名無しさん:2006/05/12(金) 22:56:00
>>432
tlibでインポートライブラリからリストファイルを作成。

自作のDLLならextern "C"しとけば?

434 :デフォルトの名無しさん:2006/05/12(金) 23:01:43
>>432
tdump -ee

435 :デフォルトの名無しさん:2006/05/12(金) 23:37:36
質問です。
あるクラスで構造体BBOXを宣言しました。
そして、そのクラスの中で、
BBOX GetBox(void){
return m_bbox;
}
のようにボックスを返すメンバ関数を作りました。
そして、別のクラスで呼び出そうとしたところ、

BBOX box;
と変数を宣言したら定義されていないとされました。

BBOX構造体を宣言したクラスのヘッダファイルはインクルードしてあります。
なにが問題でしょうか?


436 :デフォルトの名無しさん:2006/05/12(金) 23:43:06
>BBOX構造体を宣言したクラスのヘッダファイルはインクルードしてあります。
「BBOX構造体を宣言したクラス」のヘッダファイルをインクルードしたんだな?
「BBOX構造体を宣言した」ヘッダファイルをインクルードしたわけじゃないんだな?

437 :デフォルトの名無しさん:2006/05/12(金) 23:46:42
>>436
そうです。
やはり、他のクラスでも使えるようにするには共通のヘッダで宣言するってことですか?
クラス内で宣言した場合はクラス内でしかつかえないのでしょうか?



438 :デフォルトの名無しさん:2006/05/12(金) 23:53:30
そのクラスの名前::BBOX box;

439 :デフォルトの名無しさん:2006/05/13(土) 00:04:36
>>438
解決しました。ありがとうございます

440 :デフォルトの名無しさん:2006/05/13(土) 01:36:42
>>419
この質問は昔からあるFAQだな…。

コピーコンストラクタとか、例外とか、深くわかってくると参照じゃないと非常に問題があることがわかってくるよ。
ていうかポインタってやつは言語仕様的にはマジ腐ってる。

でも参照も実は中途半端で、コンテナに突っ込んでおくとオブジェクトの生存期間の管理がややこしくなったりする。
生存期間、つまりdeleteするタイミングを任意にコントロールしたければ、腐っていてもポインタを使うしかない。

そんなわけでポインタも参照もなるべく使わず、C++/CLIのハンドル(^)を使うのが最強ってことで。

441 :デフォルトの名無しさん:2006/05/13(土) 01:38:24
>>440
C++ 使ってるんなら、実行速度を無視して最強を決めるんじゃない。

442 :デフォルトの名無しさん:2006/05/13(土) 01:47:09
>>419
参照は「初期化されずに使用されるポインタ」「(意図せずに)NULLを指すポインタ」
なんてのを排除しつつ見た目を多少整える程度の存在。

別の言い方をするなら、
指し示す先を「領域が確保され初期化されている既存オブジェクト(等)」に
限定したポインタのような存在。

443 :デフォルトの名無しさん:2006/05/13(土) 01:49:14
>>441
昔はC++は遅いってよく批判されたものだけどね。

10年前はマイナーな言語だったのに、今は詳しい人がこんなにいるってのが、
おじさんには驚きですよ。いい時代になったものだね。
誰にも理解されなかったあの頃が懐かしい。

C++/CLIのネイティブコンパイラが現れる時代もそんなに遠くないでしょ。
ネイティブでガベコレってのはD言語でもやってるしね。

444 :デフォルトの名無しさん:2006/05/13(土) 01:52:50
>>443
C++ のポインタが遅いとか、>>440 が書き込まれた時点で C++ のポインタの変わりに
C++/CLI のハンドルが使える(しかもそうすることを推奨)とか、
そういうことを本当に信じてますか?

初学者に適当なこと言って惑わすのって面白いですか?

445 :デフォルトの名無しさん:2006/05/13(土) 01:54:20
ポインタ演算はなんだかんだ言って高速でシンプルなイテレーションに使えるしな。
# ここで禿が言う「オブジェクト指向に過度に毒された人」はイテレータのクラスを作れ!とか言うんだろうが

446 :デフォルトの名無しさん:2006/05/13(土) 01:54:45
>>443
ところでガベコレってなんで必要なのかいまいちわからんな
スマートポインタ使ってれば必要なくね?


447 :デフォルトの名無しさん:2006/05/13(土) 02:05:18
>>446
D&Eの最新の邦訳を持っているなら、第-1章のxxviiiを参照するといいかも

448 :デフォルトの名無しさん:2006/05/13(土) 02:32:13
>>447
情報Thanks!
ということはガベコレにもいいことがあるだなぁ
今度見てみます


449 :デフォルトの名無しさん:2006/05/13(土) 02:44:27
>>446,448
http://www.kmonos.net/alang/d/garbage.html

450 :デフォルトの名無しさん:2006/05/13(土) 04:52:43
C++エキスパーツなおまいらから見てDってどうよ


451 :デフォルトの名無しさん:2006/05/13(土) 05:15:33
エキスパーツじゃないけど、C++にいくつかのライブラリとマクロを組み合わせれば
Dの優位性はあまり感じられない、というのが正直な感想。

DがC++に対して優位である証明として、次の比較があるけれど:

D vs その他の言語
http://www.kmonos.net/alang/d/comparison.html

C++のように、ライブラリでの実装を推奨したとすれば、上記の比較表はかなり違ったものになる。
この比較は、標準ライブラリでの実装を否定し、言語仕様に組み込むことを善とする考えに基づいている。
その理由として:

言語の機能 vs ライブラリによる実装
http://www.kmonos.net/alang/d/builtin.html

を挙げている。漏れには、これらの「利点」が、ライブラリでの実装を否定するほどのものではないように見える。
その他のDの機能も、C++でできることを、Dは少し簡易にできるというだけにしか見えない。

結論:C++で必要十分。

452 :デフォルトの名無しさん:2006/05/13(土) 10:04:52
>>446
シングルスレッドなプログラムならスマートポインタでほとんど大丈夫。
でもコンテナにポインタを入れるときに面倒なことがおきがち。

マルチスレッドで、オブジェクトをスレッド間でやり取りするなら、
ガベコレは非常に欲しい。かなり楽になるよ。

453 :デフォルトの名無しさん:2006/05/13(土) 10:44:27
>>450
Dの関数の入れ子やデリゲート、無名関数は欲しい。
でもtemplateはC++のがいい。これがあるから俺は他の言語へ移る気にならない。

454 :デフォルトの名無しさん:2006/05/13(土) 10:47:42
言語を作るための言語ができれば最強じゃね

>>419
関数に巨大な構造体を引数として渡す時に値渡しではなくconst参照で渡して
パフォーマンスアップ、以外の使い方見たこと無いけどね

455 :デフォルトの名無しさん:2006/05/13(土) 11:31:18
>454
> 関数に巨大な構造体を引数として渡す時に値渡しではなくconst参照で渡して
それはconstポインタでもできる
ってか,巨大な構造体を値渡しなんてCでもせんだろw

456 :デフォルトの名無しさん:2006/05/13(土) 12:29:29
相談ごと

VC6 で、
デバッグビルドではさくっと動くのに、
リリースビルドではさくっとこける。

て言う現象が起こったとき、
どこを疑えばいいのかどなたかご教授くださいお願いします orz

457 :デフォルトの名無しさん:2006/05/13(土) 12:38:43
変数の初期化

458 :335 :2006/05/13(土) 12:44:38
みんな細かいテクニックはどこから学んでるの?
EffectiveC++とか?

459 :456:2006/05/13(土) 12:53:42
>>457
解決しました!
(初期化されてない関数へのポインタ変数を使ってたらしい)
ありがとうございました。


460 :デフォルトの名無しさん:2006/05/13(土) 15:15:36
>>455
参照ならポインタと違ってわざわざ呼ぶ側が&演算子を使う必要が無くなる。
こと構造体(やクラス)では値渡しだと非効率と言うコンピュータの勝手な都合だから、
そんなポインタを使っていることを意識させないほうがよろしい。

461 :デフォルトの名無しさん:2006/05/13(土) 15:31:29
コンピュータに都合なんかねえよ
応答速度やメモリ原価でイライラするのは結局人間の都合

462 :デフォルトの名無しさん:2006/05/13(土) 15:36:12
コンピュータの特性と言えばよかったのにね☆

463 :デフォルトの名無しさん:2006/05/13(土) 16:41:22
new をオーバーロードしたいのですがオーバーロードしたnewが呼ばれません…

class A
{
void* operator new(size_t t)
{
void* mem;
mem = malloc(t);
return mem;
}
}

class B : public A
{
int* i = new int;
}

464 :デフォルトの名無しさん:2006/05/13(土) 16:42:30
すみませんクラスBがあれですが気にしないでくださいorz

465 :デフォルトの名無しさん:2006/05/13(土) 16:46:51
>>463-464
頭脳が間抜けか?
それがよばれるのは、class A および class Bをnewしたときだ。

それがしたいなら、グローバルなnewをオーバーロードしなければならない。

void * operator new(size_t size, std::nothrow_t const &) throw()
{
  std::cout << "new called : " << size << std::endl ;
  return malloc(size) ;
}



466 :デフォルトの名無しさん:2006/05/13(土) 16:50:16
なるほど解りました、ありがとうございます。

467 :デフォルトの名無しさん:2006/05/13(土) 16:54:19
>>466
あと、std::nothrow_tを引数に取らないnewをオーバーロードするときは、ちゃんと例外を投げておくこと。
とくにグローバルなnewをオーバーロードしたいなら。

厳密にまったく同じ動作をしたいなら、さらにset_new_handlerをトリッキーに使う必要があるけど、
そこまでするかどうか状況によると思う。


468 :デフォルトの名無しさん:2006/05/13(土) 18:59:29
ありがとうございます。

もう1つ聞きたいのですが、
operator new[]の方をオーバーロードした時の中の処理は
malloc(size);でもいいのでしょうか?

469 :デフォルトの名無しさん:2006/05/13(土) 19:03:56
callocでないといけないとかと思ってたんですが、
すみません自己解決しました。

470 :デフォルトの名無しさん:2006/05/13(土) 19:49:33
>>468 >>467

471 :デフォルトの名無しさん:2006/05/13(土) 20:36:22
>>458
「細かいテクニック」って何のことだ?
その表現からは、「所詮は枝葉末節であり、仕事に関係しない・知らなくてもいい技法」というニュアンスを感じるが。
Effective C++では、設計・実装の「常識」は説明されているが、「小細工」の類は書かれていない。

472 :デフォルトの名無しさん:2006/05/13(土) 21:16:04
Effective C++に書かれてる内容は理解してて当然じゃないと仕事ふれないよな…

473 :デフォルトの名無しさん:2006/05/13(土) 21:27:39
std::string に pop_back がないのですが、どうすれば良いのでしょうか…?

474 :デフォルトの名無しさん:2006/05/13(土) 21:30:09
[end() - 1] じゃだめなん?size()も一減らさないとあかんの?

475 :デフォルトの名無しさん:2006/05/13(土) 21:32:51
>>473
> erase( size() - 1, 1 )
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#534

476 :デフォルトの名無しさん:2006/05/13(土) 21:32:57
>>473
っresize
っerase


477 :デフォルトの名無しさん:2006/05/14(日) 01:00:21
#include <iostream.h>
#include <malloc.h>
struct KATA{
int ab;
int cd;
};
int MyFunction(int x, struct KATA *y)
{
y = (struct KATA *)calloc(x, sizeof(struct KATA));
if(y == NULL){
return(1);
}

for(int i = 0;i <= x -1;i++){
y[i].ab = 2;
y[i].cd = 3;
}

return(0);
}


478 :デフォルトの名無しさん:2006/05/14(日) 01:00:48
void main()
{
struct KATA *y;
cout << "MyFunctionの戻り値 = " << MyFunction(2, y) << endl;


for(int i = 0;i <= 1;i++){
cout << "y[" << i << "].ab = " << y[i].ab << endl;
cout << "y[" << i << "].cd = " << y[i].cd << endl << endl;
}
}

関数に作りたい構造体の数と、構造体変数へのポインタを渡して、
関数の中で、領域を確保して値を格納して、格納した値をmainで参照
したいのですができません。これはできないものでしょうか。


479 :デフォルトの名無しさん:2006/05/14(日) 01:07:00
>>477-478
http://www.kouno.jp/home/c_faq/c4.html#8

あと、
× #include <iostream.h>
× #include <malloc.h>
× void main()

480 :デフォルトの名無しさん:2006/05/14(日) 01:23:34
△ × void main()

481 :デフォルトの名無しさん:2006/05/14(日) 01:34:41
>>480 何のつもりだ?

482 :デフォルトの名無しさん:2006/05/14(日) 01:36:48
>>478
int MyFunction(int x, struct KATA *&y)
それから、C++ では calloc より new とコンストラクタを使え

なお、479 は C++ スレで C の解説サイトへ誘導を試みてるアフォなんで (・∀・)ニヤニヤ しとけばいい
参照渡しやオブジェクトの初期化方法を差し置いて × と書いている理由も
おそらく根拠が C の仕様で、かなり重度に気が狂ってる模様

483 :デフォルトの名無しさん:2006/05/14(日) 01:36:51
>>480
馬鹿はスルーでお願い

484 :デフォルトの名無しさん:2006/05/14(日) 01:40:06
>>480
3.6.1 - Main function の 2 より。
"It shall have a return type of type int, but otherwise its type is implementation-defined."

485 :デフォルトの名無しさん:2006/05/14(日) 01:41:31
>>484
なるほど、お前が英文が読めないことはよくわかった

486 :デフォルトの名無しさん:2006/05/14(日) 01:42:34
>>482
479 の×の理由の根拠が C の仕様って、おまえも狂ってんじゃね?

487 :デフォルトの名無しさん:2006/05/14(日) 01:43:40
なになに? void main() が OK とか言ってるやつがいるの?

488 :デフォルトの名無しさん:2006/05/14(日) 01:44:19
>>486
main についてはそうかもね

489 :デフォルトの名無しさん:2006/05/14(日) 01:47:31
________.  |  ・・・「ひでもん」?
|||          | \____ __
|||          |  )\       ∨
|||    英  文.   <⌒ヽ ヽ
|||         \ ( ´ー`)    ∧∧
|||_________V(   丿V^  ●Д゚,,)
|,,|          |,,| ヽ (      と  ,)
              ノ )     |  |〜
            ∧          .し`J,,.
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
なんか、たった1行の英文が読めてない奴多いなー

490 :デフォルトの名無しさん:2006/05/14(日) 01:48:45
MTGで鍛えた英文力でも大丈夫だったぜ

491 :デフォルトの名無しさん:2006/05/14(日) 01:54:49
まあ欧米のネイティブど素人が読んでわかる文面でもないが・・・

492 :デフォルトの名無しさん:2006/05/14(日) 01:55:13
So if one's compiler's documentation happens to say anywhere
that main may have the return type void then
main may indeed have the return type void
and a program with void main() is a conforming program.

↓これをどう取るかで宗教論争

493 :デフォルトの名無しさん:2006/05/14(日) 02:00:15
禿の一声で論争終了。
http://www.research.att.com/~bs/bs_faq2.html#void-main

494 :デフォルトの名無しさん:2006/05/14(日) 02:05:55
禿の所有物みたいに思ってる化石がまだいたか

495 :デフォルトの名無しさん:2006/05/14(日) 02:08:47
>>494
必死だな。 ISO で決まってるんだからその指摘も的外れだが。
> See the ISO C++ standard 3.6.1[2] or the ISO C standard 5.1.2.2.1.

496 :デフォルトの名無しさん:2006/05/14(日) 02:09:30
>>495
>>484

497 :デフォルトの名無しさん:2006/05/14(日) 02:09:32
ISO の所有物みたいに思ってる化石がまだいたか

498 :デフォルトの名無しさん:2006/05/14(日) 02:11:22
>>496 なに?日本語に訳してほしいの?

499 :デフォルトの名無しさん:2006/05/14(日) 02:11:33
>>497
それならまだマシ
奴は ISO の文書が読めてない

500 :デフォルトの名無しさん:2006/05/14(日) 02:12:11
>>498
お前がだろ

501 :デフォルトの名無しさん:2006/05/14(日) 02:12:50
仕事の憂さ晴らしなら雑談スレでしてほしいところだ

502 :デフォルトの名無しさん:2006/05/14(日) 02:13:01
>>499
意味わからん。 ISO の文書読んだら、戻り値は int 以外無いだろ?

503 :デフォルトの名無しさん:2006/05/14(日) 02:14:09
最初のレスで何に噛みついたかでカテゴリ1に分類されているわけだが

504 :デフォルトの名無しさん:2006/05/14(日) 02:14:53
>>502
ほらな
484 を君は何と読んだんだい (ニヤニヤ

505 :デフォルトの名無しさん:2006/05/14(日) 02:15:30
日本語が怪しい人がいますね

506 :デフォルトの名無しさん:2006/05/14(日) 02:16:34
え……?

507 :デフォルトの名無しさん:2006/05/14(日) 02:16:57
>>505
それは仕方ないよ、処理系定義という日本語を日本人全員が知ってるわけでもないのと同じ
問題はプログラム技術板で鼻息を荒くしてることであって

508 :デフォルトの名無しさん:2006/05/14(日) 02:19:11
誰の鼻息が荒いの?

509 :デフォルトの名無しさん:2006/05/14(日) 02:19:12
ちょっと頭の悪い方がいるようです

510 :デフォルトの名無しさん:2006/05/14(日) 02:20:10
>>507
あれを「戻り値の型は実装定義」と読んでるようだな。
実装異存なのは main 関数の型だよ。

511 :デフォルトの名無しさん:2006/05/14(日) 02:21:41
otherwiseの意味が若干とりにくいですけれどね

512 :デフォルトの名無しさん:2006/05/14(日) 02:22:31
>>510
おーい、訳が無茶苦茶で通じてねえぞ

513 :デフォルトの名無しさん:2006/05/14(日) 02:26:47
>>512
ここはひとつ、あなたの解釈を書いてみてもらえますか?

514 :デフォルトの名無しさん:2006/05/14(日) 02:27:42
>>513
あっかんべー
どうしても教えて欲しければ有料だよ乞食さん

515 :デフォルトの名無しさん:2006/05/14(日) 02:29:25
意味の通るところで改行するという定義に合わせるなら
あの文章の前後の文もないとつらくないか?

516 :デフォルトの名無しさん:2006/05/14(日) 02:32:44
>>512の訳が知りたい。

>>510以外のどういう解釈があるのかと。

int main()
{
  std::cout << typeid(main).name() << std::endl ;
}

517 :デフォルトの名無しさん:2006/05/14(日) 02:36:11
今時あっかんべーも無いだろう。釣りにしてもあからさますぎ。

518 :デフォルトの名無しさん:2006/05/14(日) 02:38:45
>>516
聞き方が収束したようだな

519 :デフォルトの名無しさん:2006/05/14(日) 02:43:55
しょうがないから JIS の訳を引用してあげる。
> 関数 main は多重定義してはならない。その返却値の型は, int とする。
> これを除いて,関数 main の型は,処理系定義とする。

520 :デフォルトの名無しさん:2006/05/14(日) 02:57:20
鼻息野郎は逃げたようだな。いやよかった。

521 :デフォルトの名無しさん:2006/05/14(日) 03:23:15
オブジェクトの初期化だの引数の渡し方だのを C の話でやろうとしたことを棚に上げて
main の話に逃げ込んだのがどっちかは明らかだがな

522 :デフォルトの名無しさん:2006/05/14(日) 03:26:40
まだいたのか、この超ロングヘアーのフサフサ

523 :デフォルトの名無しさん:2006/05/14(日) 03:27:25
>>522 スレ限定の罵倒だな

524 :デフォルトの名無しさん:2006/05/14(日) 03:29:21
main には 「型」 があるそうだが、こんなのが型かよまったく

extern "C++" typedef int f1();

extern "C" typedef int f2(int, char *[]);


extern "C" f1* p1;

extern "C++" f2* p2;


extern "C++" int main()

{

p1 = &main;

(*p1)();

}


extern "C" int main(int, char *[])

{

p2 = &main;

(*p2)(0, 0);

}

525 :デフォルトの名無しさん:2006/05/14(日) 03:46:37
>>524
> main には 「型」 があるそうだが、こんなのが型かよまったく

そうだ。 C/C++ の関数には型がある。君はそれを知らなかったんだ。覚えておけばいい。
間違いを偉そうに撒き散らしたのを謝って反省するともっといいね。

526 :デフォルトの名無しさん:2006/05/14(日) 03:52:47
>>525
言いたいことが通じてないようだが
int 以外の返却値を認めてない背景にある問題が
スタートアップモジュールとのスタック構造の一致にあり
それこそが型に他ならないと指摘している

オブジェクトの初期化だの引数の渡し方だのを C の話でやろうとした奴だからこそ
main の結合が処理系定義とか言う話にも何の疑問も感じないんだろうが
そういうレベルの輩と真面目に話しているつもりは最初からないんで
何が間違いかがあんたらとは認識ちがいそうだよ

527 :デフォルトの名無しさん:2006/05/14(日) 03:56:53
>>525
俺に知らなかったと言うあんたは 524 のプログラム片に含まれる ill-formed を全て指摘できるのか

528 :デフォルトの名無しさん:2006/05/14(日) 03:57:25
スーパークラスにサブクラス型のメンバを持たせたいのですが
方法ありませんか?どなたかよろしくお願いします。

class SuperClass{
ExtendClass* ec;
};

class SubClass:public SuperClass{
};

529 :C・アズナブル:2006/05/14(日) 03:59:02
見苦しいものだな
苦し紛れの言い訳とは。

530 :デフォルトの名無しさん:2006/05/14(日) 03:59:05
>>528
実体を持たせようとするとサイズが無限になることくらいはわかるか?
やるならポインタで指すだな

531 :デフォルトの名無しさん:2006/05/14(日) 03:59:45
>>529
自分が根に持っているものに疑問を感じたら態度違うさ

532 :デフォルトの名無しさん:2006/05/14(日) 04:02:59
超先生がいるスレはここですか?

533 :デフォルトの名無しさん:2006/05/14(日) 04:03:18
>>526
関数の型は、戻り値と引数リストで決まる。スタック構造の一致は実装の都合。

引数の渡し方については C の話で問題ない。
>>477 が誤解しているのは明らかに値渡しの理解。これを理解せずに
>>482 のようにコードを変更してうまくいったとしても、同じ間違いを繰り返す。

オブジェクトの初期化だのについては、君以外だれも何も言っていない。

534 :デフォルトの名無しさん:2006/05/14(日) 04:03:25
言い負かすのに失敗したからといって、それがイコール自分の間違いとは認識しないことがある
527 をスルーで煽りに転じるだけな者に型を語られても説得力がないことに変わりがないように

535 :デフォルトの名無しさん:2006/05/14(日) 04:04:00
>>527 main 関数のアドレス取っちゃだめですぅ

536 :デフォルトの名無しさん:2006/05/14(日) 04:06:17
>>533
>関数の型は、戻り値と引数リストで決まる。スタック構造の一致は実装の都合。
違う
結合は明白に関数の型の一部である
gcc などで試した結果のみが根拠な者がそのような誤解をするのは当然

>引数の渡し方については C の話で問題ない。
よってこれも誤り


>オブジェクトの初期化だのについては、君以外だれも何も言っていない。
そのとおり、重要なことを放置したまま話が逸れていったんだよ

537 :デフォルトの名無しさん:2006/05/14(日) 04:06:33
>>535
他には?

538 :デフォルトの名無しさん:2006/05/14(日) 04:07:13
何かに似てると思ったらエンコリ翻訳ににてるのか

539 :デフォルトの名無しさん:2006/05/14(日) 04:08:46
>>537 main 関数は多重定義しちゃだめですぅ

540 :デフォルトの名無しさん:2006/05/14(日) 04:09:02
>>539
他には?

541 :デフォルトの名無しさん:2006/05/14(日) 04:11:17
>540
レスがワンパターンになってるぞ。もう終わりか?

542 :デフォルトの名無しさん:2006/05/14(日) 04:12:27
>>541
>>527 からの流れを参照されたし

543 :デフォルトの名無しさん:2006/05/14(日) 04:13:14
>>540 main の多重定義に付随していろいろ出てくるが、それも全部挙げさせるつもりか?

544 :デフォルトの名無しさん:2006/05/14(日) 04:17:13
// 配列のテスト
//
#include <iostream>
using namespace std;

int main()
{
 char c[10] = "あいう";
 char *s = "abcd";
 char ch[10] = "わをん";

 cout << " s:" << s << endl;
 cout << " c:" << c << endl;
 cout << "ch:" << ch << "\n" << endl;

 s = (char*)c;
 cout << "c => s:" << s << "\n" << endl;

 cout << "現在のch:" <<ch << endl;
 cout << "現在の s:" << s << "\n" << endl;

 // @
 for (int i=0; i<10; i++)
  s[i] = ch[i];
 cout << "ch => s:" << ch << "\n" << endl;

 return 0;
}

文字列を各配列に納めるテストをしていたのだけれど
目印@でのキャスト処理を for構文つかわずに
s = (char*)c; のように簡略化できる方法ありますか?

545 :デフォルトの名無しさん:2006/05/14(日) 04:18:48
>>543
ill-formed に対する処理系独自の解釈に起因する連鎖で出るエラーはいいよ
直接的に ill-formed な箇所がわからない者には説得力がないと言っているだけなんで

546 :デフォルトの名無しさん:2006/05/14(日) 04:21:27
>>536
明白ってのは根拠があって言ってるのか?

規格を読む限りでは、戻り値型と引数リストの型が関数型の構成要素だよ。
非staticメンバ関数について型修辞子が追加される。
デフォルト引数や、例外仕様は含まれないことも明記してある。
リンケージについての記述は見当たらないが、 static つけたら型が変わられちゃ
困るんで、そんなものは関数型の一部ではない。

どうも「関数の型」が規格上に定義されたものだという前提が無いようだな。

> よってこれも誤り
「よって」が前の文と繋がってないよ。

> >オブジェクトの初期化だのについては、君以外だれも何も言っていない。
> そのとおり、重要なことを放置したまま話が逸れていったんだよ
どうでもいいから誰もタッチしてないんだよ。

547 :デフォルトの名無しさん:2006/05/14(日) 04:22:22
>>544
std::string 使え。

548 :デフォルトの名無しさん:2006/05/14(日) 04:23:24
>>546
static は型の一部ではない
extern "C" は関数の型の一部である

>どうでもいいから誰もタッチしてないんだよ。
どうでもよくないが、ここであんたに考えを改めてもらう必要もないんで放っておく

549 :デフォルトの名無しさん:2006/05/14(日) 04:23:38
>>545 じゃぁ ISO の規格的にはもう無いと思うよ。君の脳内にはなんかあるみたいだけど。

550 :デフォルトの名無しさん:2006/05/14(日) 04:25:29
>>549
ご苦労様
不合格ね

551 :デフォルトの名無しさん:2006/05/14(日) 04:27:30
>>530
すみません。コード間違えました。やりたいのは
class SuperClass{
SubClass* sc;
};

class SubClass:public SuperClass{
};

です。
>実体を持たせようとするとサイズが無限になることくらいはわかるか?
分かりません。でもポインタで指しているつもりです。

コンパイルを通したいのですが、どう宣言したら良いものか。

552 :デフォルトの名無しさん:2006/05/14(日) 04:31:57
class BaseClass {
public:
virtual ~BaseClass();
};

class SuperClass{
BaseClass* pSubClass;
};

class SubClass:public SuperClass{
};

とやっておいて、dynamic_cast とか

class SubClass;

class SuperClass {
SubClass* sc;
};

class SubClass : public SuperClass {
};

のように不完全型を使うとか・・・

553 :デフォルトの名無しさん:2006/05/14(日) 04:52:07
>>548
> extern "C" は関数の型の一部である

これは正しいようだ。 7.5.1 に書いてある。

ということは、 >>524 での p1, p2 への代入が関数型の不一致ってことか?
p1, p2 の宣言に付いてる extern "" は関数型には影響しないんじゃね?
↓こうなってればダメってのはわかるんだけどね。
extern "C" int (*p1)();
extern "C++" int (*p2)(int, char*[]);

554 :デフォルトの名無しさん:2006/05/14(日) 04:52:36
>> 552
ありがとうございました。下の方法でうまくいきました。
ダイナミックキャストは勉強しておきます。

555 :デフォルトの名無しさん:2006/05/14(日) 04:57:23
>>554 dynamic_cast 使わない方法をさがそうね。

556 :デフォルトの名無しさん:2006/05/14(日) 04:59:05
dynamic_castってなあに?

557 :デフォルトの名無しさん:2006/05/14(日) 05:01:36
>>556 http://www.google.co.jp/search?q=dynamic%5Fcast

558 :デフォルトの名無しさん:2006/05/14(日) 05:10:25
>>553
うん、そこは影響しないように頑張るならこうだという意図で書いた
スタートアップがどうやって両方に対応するのかに対する疑問を提起するために

559 :デフォルトの名無しさん:2006/05/14(日) 05:11:50
>>558
ん?スタートアップは両方に対応する必要はないでしょ?

560 :デフォルトの名無しさん:2006/05/14(日) 05:12:38
>>558 じゃぁ >549 が不合格なのはなんで?やっぱりまだなんかあるの?

561 :デフォルトの名無しさん:2006/05/14(日) 05:12:55
>>559
すくなくとも int main() と int main(int, char *[]) に対応できなければならない

562 :デフォルトの名無しさん:2006/05/14(日) 05:14:15
>>560
結合指定が合ってるのを確認したうえで 「以上」 と言ってたならごめんよ
話についてこれてないのと見分けがついてなかった

563 :544:2006/05/14(日) 05:15:48
string (s = ch);

とすることで解決出来たのですが
<string> を include しなくても使えたので
この string の扱いは basic_string で良いのでしょうか?

564 :デフォルトの名無しさん:2006/05/14(日) 05:16:53
日本語がおかしければ正確に伝わらないのは当然

565 :デフォルトの名無しさん:2006/05/14(日) 05:21:17
>>561
それ、両方 extern "C++" だから関係ないでしょ。

566 :デフォルトの名無しさん:2006/05/14(日) 05:27:00
extern "C++" とは?

567 :デフォルトの名無しさん:2006/05/14(日) 05:27:38
>>565
どちらか一方のみが extern "C" という実装もありうるし
main に結合指定を記述することも許されている
これは返却値のみについて int であることを強弁することが空疎であると主張する根拠の1つである

568 :デフォルトの名無しさん:2006/05/14(日) 05:27:44
>>566
extern "C" と同様に使えるが、デフォルトと同じなのであまり使わない。

569 :デフォルトの名無しさん:2006/05/14(日) 05:30:38
>>567
それを許可する処理系は、その定義を正しく処理する。
できなければ処理系の欠陥。処理系定義ってのはそういうことだ。

main の戻り値が int なのは規格で決まってる。
C++ で void main() が無効なのは変わらない。

570 :デフォルトの名無しさん:2006/05/14(日) 05:48:28
>>569
正しく処理するように画策するのは曲がった話を通すためだろうがよ
1つの関数が extern "C" と extern "C++" の両方で同じ結合を持つなんて多重定義ができずかつ複数の型で定義できる関数だけだろ?
そのために main の型が処理系定義なのは結構だが、だったら「返却値を除く」必要性こそ処理系固有の事情によるはずで
引数の渡し方や動的記憶の使い方よりも優先するほどの重要度を持つ話ではないし
それしか指摘できない者がおこがましくも回答者面してたわけだ

571 :デフォルトの名無しさん:2006/05/14(日) 05:51:13
関数とは名ばかりな特殊な規定の権化 >main

572 :デフォルトの名無しさん:2006/05/14(日) 05:51:25
>>570
規格に文句言いたいなら勝手にすればいいが、ここで同意を求めるのはやめてくれ。

573 :デフォルトの名無しさん:2006/05/14(日) 05:55:24
extern "C" "C++" の不一致、 gcc で試してもエラーにならんね。残念。
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=8680

574 :デフォルトの名無しさん:2006/05/14(日) 05:57:30
書籍関係のスレでぼろくそ書かれた著者か?

575 :デフォルトの名無しさん:2006/05/14(日) 06:05:41
>>570
英語の一文を誤訳してたやつがおこがましくも回答者面しているわけだが。

576 :デフォルトの名無しさん:2006/05/14(日) 06:15:10
>>572
あんたの話そらす腕は認めるよ、大したものだ
だがあいにくと文句の主たる矛先は規格ではなく 471 でな
残念だったな

577 :デフォルトの名無しさん:2006/05/14(日) 06:15:41
576 訂正
s/471/479/

578 :デフォルトの名無しさん:2006/05/14(日) 06:19:47
>>576
規格に従うつもりがあるなら、 void main() がダメなのぐらい素直に認めとけよ。

俺は >479 はまっとうな指摘だと思うけどね。
あんたがさんざん噛み付いてる main の話も、おまけでつけてるだけだし。

579 :デフォルトの名無しさん:2006/05/14(日) 06:19:50
持論展開したいなら。
スレ立てして、最初に自分がどういう認識なのか全て書け。
気が向いた奴が相手してくれるだろ。

580 :デフォルトの名無しさん:2006/05/14(日) 06:24:24
>>578
盲従はしないってだけさ
従う/従わないの2値的な考えしてる者には通じなさそうだが

ところで main に噛みついてるのは俺じゃないぜ
くだらねえつってるだけだ

581 :デフォルトの名無しさん:2006/05/14(日) 06:26:17
>>575
C++ についてロクな回答できない奴よりまし
なんだい、あのコードに対してヘッダに main て・・・

582 :デフォルトの名無しさん:2006/05/14(日) 06:32:30
OOP でございと言いながら main に固執してる奴ほど大事らしいけどな

583 :デフォルトの名無しさん:2006/05/14(日) 06:35:29
>>477
参照好きの漏れが修正するとこうなる。こういう関数にはもっといいパターンがあるけど、そこは気にしない方向で。
#include <iostream>

struct KATA { int ab, cd; };
int MyFunction(int x, KATA*& y) {
 y = new KATA[x];
 if (!y) return 1;

 for (int i = 0; i < x; ++i) {
  y[i].ab = 2;
  y[i].cd = 3;
 }
 return 0;
}
int main() {
 using namespace std;
 KATA* y = 0;
 cout << "MyFunctionの戻り値 = " << MyFunction(2, y) << endl;
 for (int i = 0; i < 2; ++i) {
  cout << "y[" << i << "].ab = " << y[i].ab << endl;
  cout << "y[" << i << "].cd = " << y[i].cd << endl << endl;
 }
 delete[] y;
 return 0;
}


584 :デフォルトの名無しさん:2006/05/14(日) 06:42:24
>>583
new の戻り値をヌルチェックしても意味無いよ。

585 :デフォルトの名無しさん:2006/05/14(日) 06:42:59
おっと、しまった。議論を呼ぶことをしてしまった。
> KATA* y = 0;
としていながら参照で渡しているのは酷かったな。MyFunction()のあたりに次のコメントを追記:

// 引数 KATA* への参照は、null ポインタを指している可能性がある。右辺値としてアクセスする前に、必ず代入を行うこと

586 :デフォルトの名無しさん:2006/05/14(日) 06:45:56
>>585
そんな些細なこと気にするぐらいだったら、「もっといいパターン」に書きかえるよな。

587 :デフォルトの名無しさん:2006/05/14(日) 06:48:08
bad_alloc投げてくれるんだっけ。
あー寝起きはだめすぎるなー。つっこみどころ多すぎる...orz
もう一眠りしてくる

588 :デフォルトの名無しさん:2006/05/14(日) 06:48:44
もう二度と起きるなw

589 :デフォルトの名無しさん:2006/05/14(日) 08:41:42
void mainは、
・CはC99から適合、
・C++はC++03でも駄目
ってことを知らない人がスレを混乱させてるな。


590 :デフォルトの名無しさん:2006/05/14(日) 09:28:21
混乱?してないだろ?

591 :デフォルトの名無しさん:2006/05/14(日) 11:32:18
>551
template<class T>
class SuperClass{ voif foo() { static_cast<T>(this)->submethod() };
class SubClass : public SuperClass<SubClass>{};
だな。俺は

592 :デフォルトの名無しさん:2006/05/14(日) 11:50:14
初心者のvoid main()にいちいち噛み付いて
age厨と100レス近く論争するのを規格を遵守するって言うんですか

593 :デフォルトの名無しさん:2006/05/14(日) 12:02:15
何でこんなに伸びてるんだよ

594 :デフォルトの名無しさん:2006/05/14(日) 12:05:30
厨房は沸点が低いから

595 :デフォルトの名無しさん:2006/05/14(日) 12:37:21
>>589
C99でも駄目だったと思うが。

596 :デフォルトの名無しさん:2006/05/14(日) 15:46:11
CreateInstance関数ってWIN32APIなんですか?
それともCOMでしか使えない関数なんですか?

597 :デフォルトの名無しさん:2006/05/14(日) 15:49:06
CoCreateInstanceは、COMヘルパーなWIN32API。
IClassFactory::CreateInstanceはCOMのメソッド

598 :デフォルトの名無しさん:2006/05/14(日) 15:49:09
>>596
少なくともC++言語に関する話題ではないな

599 :デフォルトの名無しさん:2006/05/14(日) 20:14:25
あの、そのあのそのごごめんなさい

600 :デフォルトの名無しさん:2006/05/14(日) 21:10:38
C++でEJBみたいなことがやりたいんですけど、そういったツールはありますか?

601 :デフォルトの名無しさん:2006/05/14(日) 21:29:34
低級の質問です(・ω・`
半径を入力すると円の面積と円周を出すプログラムを作りたいんですが

\include<iostream>
using namespace std;
double main()
{const double pi = 3.14;
double hankei;

cout << "円の面積と演習を求めます。" <<'\n';
cout <<"半径を入力してください:
cin >> hankei;
cout << "円の面積は" << hankei*hankei*pi << "です。" <<'\n';
cout << "演習は << 2*pi*hankei << "です。" ; <<'\n';

return 0;
}

このようにしたら
エスケープシーケンスの使い方が正しくありません
';' が '<' の前にありません。
型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
'cout' : 定義されていない識別子です。
定数が 2 行目に続いています。
';' が、識別子 'cin' の前に必要です。
'0x3000': この文字を識別子で使用することはできません

というエラーが出ました。「:」が「<」の前にないだのと良く分からないのですが何が問題なのでしょうか?

602 :デフォルトの名無しさん:2006/05/14(日) 21:35:36
とりあえず色々間違っているのはわかるが
コピペミスなのかもしれない
\include
double main
"半径を入力してください:



603 :デフォルトの名無しさん:2006/05/14(日) 21:36:22
\include<iostream>
double main()
cout <<"半径を入力してください:
cout << "演習は << 2*pi*hankei << "です。" ; <<'\n';
ここまでバカなんだったらムリしてプログラムなんてするなよ

604 :デフォルトの名無しさん:2006/05/14(日) 21:56:45


#include<iostream>
using namespace std;

int main()
{
const double pi = 3.14;
double hankei;

cout << "円の面積と演習を求めます。\n";
cout << "半径を入力してください:\n";
cin >> hankei;
cout << "円の面積は" << hankei*hankei*pi << "です。\n";
cout << "演習は" << 2*pi*hankei << "です。\n";

return 0;
}

これでも駄目なんですが何がいけないんでしょう?

605 :デフォルトの名無しさん:2006/05/14(日) 22:08:48
それだとどう駄目なの?

エラーが変わってないなら変わってないと、
変わったなら新たなエラーの内容くらい書けよ・・・回答者に言語以外の頭を回させるな。

606 :デフォルトの名無しさん:2006/05/14(日) 22:10:21
>>604

> cout << "半径を入力してください:\n";
> cout << "円の面積は" << hankei*hankei*pi << "です。\n";

全角スペースになってるぞ

607 :デフォルトの名無しさん:2006/05/14(日) 22:10:42
>>604
そのソースをプリントアウトしたものを見ながら
新しい main.cpp ファイルに打ち直してみましょう。
それでコンパイルできたら、なぜコンパイルできるようになったのか考えながら首吊りませう

608 :デフォルトの名無しさん:2006/05/14(日) 22:13:03
>>604
(´ω`)何だかナツカシす

609 :デフォルトの名無しさん:2006/05/14(日) 22:16:09
そもそもs/演習/円周/だと思うのだが。

610 :デフォルトの名無しさん:2006/05/14(日) 22:16:53
>>601>>604
初心者スレに行けよ。

611 :デフォルトの名無しさん:2006/05/14(日) 22:18:44
>>610
どうでもいいが
初心者で検索すると将棋スレになってワロタwww

612 :デフォルトの名無しさん:2006/05/14(日) 22:35:26
>>611
???

613 :デフォルトの名無しさん:2006/05/14(日) 23:44:00
C++はvoid *禁止ですよね?
そうすると型を無視したポインタの配列確保するときはどうすればいいのでしょうか?

Intやcharや他の構造体がいっぱい入ってくる場合どのように書けばいいのでしょうか

614 :デフォルトの名無しさん:2006/05/14(日) 23:48:57
>>613
別に禁止じゃないが。推奨すべき理由もないが、それが最良と判断したのなら躊躇わずに使えばいい。

615 :デフォルトの名無しさん:2006/05/14(日) 23:51:55
>>613
べつに禁止されてないので型を無視したいのなら使えばいいっしょ
型を無視せずにいろんな型を突っ込むなら
RTTIでdynamic_cast使ったりとか仮想関数とか適当に

616 :デフォルトの名無しさん:2006/05/15(月) 00:07:33
グローバルな new のオーバーロードをしていて、
処理の中では malloc でメモリ確保しているのですが
どうやれば new と同じようにコンストラクタを呼び出せるのでしょうか?

617 :デフォルトの名無しさん:2006/05/15(月) 00:07:41
>>613
プログラマにリスキーな手段を採る裁量を認めているのがC++の思想。

618 :デフォルトの名無しさん:2006/05/15(月) 00:08:16
>>616
placement newすればいいんでね

619 :デフォルトの名無しさん:2006/05/15(月) 00:09:52
>>616
確か勝手によばれるだろ?
明示的に呼び出したい場合は

char hoge[sizeof(hoge_type)];
new (hoge) hoge_type();

こんな感じで呼び出せる。

620 :デフォルトの名無しさん:2006/05/15(月) 00:11:48
>616
オーバーロードできるのはoperator newであって、newはそもそもオーバーロードできない。

621 :デフォルトの名無しさん:2006/05/15(月) 00:13:37
そうですかどうもありがとうございました。
Cのインターフェイスがvoid **になっていて果てさて
どうしたものかと悩んでしまいました。教えていただきありがとうございました。

622 :デフォルトの名無しさん:2006/05/15(月) 00:16:47
>>616
D&Eを嫁…といいたいとこだが、
Hoge *h = new Hoge();
というコードが実行される際の動作は、

1.sizeof(Hoge)のメモリがoperator newによって確保される
2.Hogeのコンストラクタが実行される

operator newはあくまでメモリを確保する役割しか持ってない。
あとは>>619-620

623 :デフォルトの名無しさん:2006/05/15(月) 00:18:11
>>618
>>619
>>620
ありがとうございます。

624 :デフォルトの名無しさん:2006/05/15(月) 10:53:16
void foo(){
  static int a=0;
  a++;
  if(a==5)return;
  foo();
}

みたいなコードを書いたとき、aは再帰で呼び出すたびに0になるの?それとも一番呼び出し元の最初だけ?

625 :デフォルトの名無しさん:2006/05/15(月) 10:56:28
>>624 最初だけ。

626 :デフォルトの名無しさん:2006/05/15(月) 10:59:06
即レスサンクス

やっと謎がとけた

627 :デフォルトの名無しさん:2006/05/15(月) 15:54:28
virtualなメンバー関数は非仮想関数でオーバーロード禁止なのでしょうか?

class B
{
public:
virtual void F();
};

class D :public B
{
virtual void F();//これではなく、
void F( int );//このようなもの。
}

628 :デフォルトの名無しさん:2006/05/15(月) 16:08:42
>>627
いえ


629 :デフォルトの名無しさん:2006/05/15(月) 16:54:27
いえ〜い

630 :627:2006/05/15(月) 18:43:13
C++標準的コーディング技法って本を読んで、
そこに
「オーバーロードを悪いコードとして目立たせている理由に、1つは仮想関数をオーバーロードすることが望ましくないこと」
と書いてあったので気になったのですが・・

631 :デフォルトの名無しさん:2006/05/15(月) 18:46:23
禁止ではあるが、望ましくはない。
それだけの話。

632 :デフォルトの名無しさん:2006/05/15(月) 18:47:18
間違えた。

 禁止ではないが、望ましくはない。

だ。

633 :デフォルトの名無しさん:2006/05/15(月) 19:00:05
紛らわしいから止めとけ、ってだけのはなし

634 :デフォルトの名無しさん:2006/05/15(月) 19:38:56
ぁぁ。別に禁じ手ってわけじゃないんですね。安心しました

635 :デフォルトの名無しさん:2006/05/15(月) 19:41:09
禁じ手・・・かもしれないな。

636 :デフォルトの名無しさん:2006/05/15(月) 20:04:22
個人でプログラム書いてて、絶対に他人が見ないならいいけど
他人と共有するときにそんなコード書いたら、「ああ、この程度か」って思われると思うよ。
少なくともEffectiveC++は読んでないなと。


637 :デフォルトの名無しさん:2006/05/15(月) 20:08:12
effectiveC++に仮想関数はオーバーロードするなってありましたっけ?

638 :デフォルトの名無しさん:2006/05/15(月) 20:10:12
連続すいません。
こんな安易な発想で実際にクラス書かないですけど、
>>627のを
class D :public B
{
virtual void F();
virtual void F( int );
};

なら別に紛らわしくない?

639 :デフォルトの名無しさん:2006/05/15(月) 20:12:57
横からすいません、
なぜ仮想関数をオーバーロードしてはいけないのか
なぜオーバーロードさせたくない関数にvirtualを付けるのか
解説または、そのような記述のあるサイトがありましたら
教えて頂けるとうれしいです。

640 :デフォルトの名無しさん:2006/05/15(月) 20:13:31
>>638
B にもあるなら紛らわしくない。

641 :デフォルトの名無しさん:2006/05/15(月) 20:28:48
片方は B からの仮想関数で、
もう片方は D からの(仮想)関数となると、
紛らわしい。
まあそんだけ。

642 :デフォルトの名無しさん:2006/05/15(月) 20:40:15
>>637
第38項「継承したデフォルトパラメータを再定義してはならない」というのならあるね。

643 :デフォルトの名無しさん:2006/05/15(月) 20:48:12
それはちょっと違うなぁ。

644 :デフォルトの名無しさん:2006/05/15(月) 22:16:50
>>637
Effective3版の33項(2版だと9項?)には、
「基底クラスのオーバーロードした関数が隠蔽される」って話があるけど、
するなとは書いてないから違うかな?
個人的にはとてもわかりにくい仕様だと思った。

645 :デフォルトの名無しさん:2006/05/16(火) 00:55:51
>627
C++ STANDARDにこんなのあった。
10.3.3
[Note: a virtual member function does not have to be visible to be overridden, for example,
struct B {
virtual void f();
};
struct D : B {
void f(int);
};
struct D2 : D {
void f();
};
the function f(int) in class D hides the virtual function f() in its base class B; D::f(int)
is not a virtual function. However, f() declared in class D2 has the same name and the
 same parameter list as B::f(), and therefore is a virtual function that overrides the
function B::f() even though B::f() is not visible in class D2. ]

可視性の観点からややこしいことになるみたいね。


646 :デフォルトの名無しさん:2006/05/16(火) 02:23:50
>>639
オーバーロードとオーバーライドがごっちゃになってるだろ。

647 :デフォルトの名無しさん:2006/05/16(火) 02:27:19
>>639
そりゃあんたやw

648 :デフォルトの名無しさん:2006/05/16(火) 02:28:29
>>646だったorz

649 :デフォルトの名無しさん:2006/05/16(火) 02:39:58
ごっちゃにでもなってなけりゃ、これの意味がわからない。
> なぜオーバーロードさせたくない関数にvirtualを付けるのか

650 :デフォルトの名無しさん:2006/05/16(火) 02:40:08
>>639
仮想関数は関係ない。これは継承を挟んだオーバライドの問題。

親クラス(またそれ以上の先祖クラス)のメンバ関数と偶然名前が衝突した時、
子クラスのメンバ関数を呼んだつもりが、親クラスのメンバ関数を呼んでいた
なんてことになるを避ける為、継承を挟んだオーバーロードは親クラスのメンバを
隠蔽する決まりになってる。親クラスのメンバを隠蔽させたくない時は using を
使って隠蔽させたくない親クラスのメンバを指定する。

651 :デフォルトの名無しさん:2006/05/16(火) 06:21:17
>>650
一行目の「オーバーライド」は「オーバーロード」の間違い?

652 :650:2006/05/16(火) 07:21:53
>>651
そうです。orz

653 :デフォルトの名無しさん:2006/05/16(火) 08:57:36
usingでベースクラスのをインポートすればOKじゃない?
普通に>>627みたいなこと俺やってるけど・・・

ていうかもう9時だorz

654 :デフォルトの名無しさん:2006/05/17(水) 18:05:27
C++で書かれたオープンソースソフトウェアで有名なのって
どんなのがありますか?
特にFirefoxとApacheはC++ですか?

655 :デフォルトの名無しさん:2006/05/17(水) 18:52:22
自分でみてみりゃいいじゃん

656 :デフォルトの名無しさん:2006/05/17(水) 20:34:02
Apacheは主にC
FirefoxはC++

657 :デフォルトの名無しさん:2006/05/17(水) 23:43:47
>>654
C++ Applications
http://www.research.att.com/~bs/applications.html

658 :654:2006/05/18(木) 00:45:12
>>656
thx!

>>657
very thx!

659 :デフォルトの名無しさん:2006/05/18(木) 00:58:48
>>658 いちばんまっとうな 655 には礼もなしか。

660 :デフォルトの名無しさん:2006/05/18(木) 01:24:24
>>655,659
悪かったな、市ね


661 :デフォルトの名無しさん:2006/05/18(木) 01:44:10
ワラタ

662 :デフォルトの名無しさん:2006/05/18(木) 02:07:27
//Foo.hpp
class Foo
{
public :
  //テンプレートなメンバ関数
  //これはヘッダで定義
  template <typename T>
    void f() { std::cout << typeid(T).name() << std::endl ; }

  //普通のメンバ関数
  //これはヘッダ以外の別の場所(Foo.cpp)で定義
  void g() ;
} ;

//Foo.cpp
void Foo::g() { std::cout << "Foo::g()" << std::endl ; }


//main.cpp
int main()
{
  Foo foo ;
  foo.g() ;

  foo.f(0) ;
  foo.f(0.1) ;
}

インスタンス化に必要な部分だけは、main.cppから見えているので、ちゃんとコンパイル&リンクができるのですが、
やはりこういう書き方はやめたほうがいいのでしょうか。
export ほすぃ……

663 :デフォルトの名無しさん:2006/05/18(木) 02:16:51
>>662
inline にしたいのでなければ、とりあえずクラス外に移したほうがいいだろうな。
いつか export がサポートされるのを夢見て、 template の定義を別ファイルにわけて

// Foo.hpp の最後に
#ifndef COMPILER_SUPPOTS_EXPORT_KEYWORD
#define export /* removed */
#include "Foo_template.cpp"
#undef export
#endif

// Foo.cpp に
#if COMPILER_SUPPOTS_EXPORT_KEYWORD
#include "Foo_template.cpp"
#endif

とかいう話は聞いたことがある。メンドクサイ上にメリットの期待値が極小。

664 :デフォルトの名無しさん:2006/05/18(木) 04:53:40
質問です。
namespace MyClass
{
class Exception{ Exception( Exception &E ); };
}

というクラスを作っていたんですが、Exception( Exception &E )をException( const &E )に変えたところ、
throw Exception( "〜〜〜" );
と例外を出してるクラスほとんど(全部ではない)から
Exception( class Exception &E )は未解決〜とエラーが出てしまいました。
( Exception( Exception &E )と宣言してたときにはエラーは出てない )

で、そのエラーが出たクラス内に
using namespace MyClass;
と書き加えたところでなくなりました。
namespace MyClass
{
//ここにusing namespace MyClass;と付け加えたら出なくなった。←MyClass内なのに。
void Func(){ throw Exception( "〜〜〜" ); }
}
で、さらにその後、追加したusing namespace MyClass;を削除してリビルドすると、
未解決エラーが出なくなりました。
今は正常にリンクできるのですが、後味が悪いので質問させていただきました
これはなぜなんでしょうか?

665 :デフォルトの名無しさん:2006/05/18(木) 05:49:03
オブジェクトファイルの更新がうまくいってなかったんじゃまいか?
例えばそのヘッダをA.cpp, B.cpp, C.cppから参照していたとして、
constに書き換えた時、何らかの理由でA.cppのみ再コンパイルされてしまったとか。

そうすると、Aのオブジェクトはconstを引数に取るコンストラクタを参照しようとするけれど、
B,Cのオブジェクトファイルは今まで通りconstのないコンストラクタを参照しようとして、未解決エラー。
で、エラーが出たクラスに変更を加えたことで、B,Cのオブジェクトファイルも更新され、正常にリンクされるようになる。
(加えた修正には意味がなく、修正を加えたことで更新されたのが解決の原因)

VC++のようなIDEを使っていればまず起きえない問題だけど、
もしMakefileでコンパイルを制御しているなら、各オブジェクトがヘッダの更新に対応しているかどうか
依存関係の記述を見直してみるといいかと。

666 :655:2006/05/18(木) 08:41:45
>>660
俺もワロタ

667 :デフォルトの名無しさん:2006/05/18(木) 16:29:33
ところでBjarneはカタカナ表記だとビョーンでいいのかな?

668 :デフォルトの名無しさん:2006/05/18(木) 16:59:47
ビョーン・ソレ・シランカットッテンチントンシャン

669 :デフォルトの名無しさん:2006/05/18(木) 17:35:34
>>667
FAQの最初にあるのも笑えるが。
ttp://www.research.att.com/~bs/bs_faq.html#pronounce

自分の脳内では、ビャーネ・ストロォストルップなんだが

670 :664:2006/05/18(木) 18:28:56
>>665
返信ありがとうございます。
実はVC++使ってます(汗・・・

671 :デフォルトの名無しさん:2006/05/18(木) 19:34:34
>>668
細野ー!

672 :デフォルトの名無しさん:2006/05/18(木) 21:02:10
>>667
ハゲ

673 :デフォルトの名無しさん:2006/05/18(木) 23:56:43
やっと正解が出たか

674 :デフォルトの名無しさん:2006/05/19(金) 00:09:48
某氏がブジャーナ ストラウストラップって書いてたから
影響されて俺もそういってるけど、検索しても全然でてこねえな

675 :デフォルトの名無しさん:2006/05/19(金) 00:20:04
とりあえずWikiにはこう載ってる。URL長杉。
ttp://ja.wikipedia.org/wiki/%E3%83%93%E3%83%A3%E3%83%BC%E3%83%8D%E3%83%BB%E3%82%B9%E3%83%88%E3%83%AD%E3%83%B4%E3%82%B9%E3%83%88%E3%83%AB%E3%83%83%E3%83%97


676 :デフォルトの名無しさん:2006/05/19(金) 01:11:51
とっさに発音できないからハゲでいいや。

677 :デフォルトの名無しさん:2006/05/19(金) 01:13:01
とっさに発音することなんてあるのかよ

678 :デフォルトの名無しさん:2006/05/19(金) 01:38:02
道ばたで出くわした時
「やあ、禿」なんて言うわけにいかないだろ

679 :デフォルトの名無しさん:2006/05/19(金) 01:44:42
やあ、禿、C++0xにevalを導入する件、よろしく頼むよ。

680 :デフォルトの名無しさん:2006/05/19(金) 15:57:48
や、友達にC++のことを話すとき
「ビャールネ・ストロヴストルップ氏が〜〜って書いてた。」
って言うよりは、
「ハゲが〜って書いてた。」
って言うほうが早いなと。


681 :デフォルトの名無しさん:2006/05/19(金) 16:01:38
>>680
あんまりそんな事言ってると自分が偉くなって氏に直接会う機会とかで「ハゲ」って言いかねないからなぁ。

習慣って怖いし、「ハゲ」とか言ってると上司ににらまれたりもするし(w


682 :デフォルトの名無しさん:2006/05/19(金) 16:28:23
>>681
前者 → ないないw
後者 → …もの凄い気まずかったが、何か?

683 :デフォルトの名無しさん:2006/05/19(金) 19:13:57
STLに的を絞って勉強しようと本を探しているのですが、何かおすすめはないでしょうか

できれば、必要な知識の解説&リファレンスが3:7ぐらいの割合で入っているものが欲しいです

684 :デフォルトの名無しさん:2006/05/19(金) 19:19:28
>>683
ttp://www005.upp.so-net.ne.jp/episteme/html/stlprog/index.html

685 :デフォルトの名無しさん:2006/05/19(金) 19:45:36
>>683
解説:EffectiveSTL
リファレンス:>684のサイト
詳細情報:適当な実装

686 :デフォルトの名無しさん:2006/05/19(金) 19:49:27
STLPortがいいんじゃね

687 :デフォルトの名無しさん:2006/05/19(金) 22:35:02
>>683
Apacheのstdcxxリファレンスもお勧め。

ttp://incubator.apache.org/stdcxx/

688 :デフォルトの名無しさん:2006/05/20(土) 19:13:38
WinXPでコンパイラはVisual C++ 4.0を使っているのですが

#include <iostream>

int main()
{
  std::cout << "wake waka ran";
}

をコンパイルするとエラーがでます。
1.インクルードファイルがオープンできないといわれるから,
<iostream.h>にすると
2.戻り値が指定されていないといわれる。
だから return 0;をつける。
けれど
3.std識別子がクラス名ではないときます・・
なにが原因なのでしょうか

689 :デフォルトの名無しさん:2006/05/20(土) 19:15:03
きついのが来たな...

690 :デフォルトの名無しさん:2006/05/20(土) 19:18:22
>>688
<iostream>と<iostream.h>の違いはstd名前空間に入っているかいないか
(iostream.hはとっくにdeprecatedだけれど)
だからiostream.hにするならstd::をつける必要はない
というかVC4.0を使うぐらいならVC2005EEにした方が数百倍マシな気がするが…

691 :デフォルトの名無しさん:2006/05/20(土) 19:28:50
std::をけして<iostream.h>にしたら問題なくコンパイルできました。

コンパイラですが,VC2005EEは使ったけれど使いにくかった(使い慣れていない)ので,アンインストしましたが,
そうならもう一度入れてVC2005EEを使用することにします。

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

692 :デフォルトの名無しさん:2006/05/20(土) 19:54:06
>>688
基本的なことだが、C++ の規格票に書いてある
        制定年度
          ↓
ISO/IEC14882:xxxx

と、VC4 の出荷時期を比べてみるといい

あの当時の事実上の標準はこれ
http://www.research.att.com/~bs/arm.html

693 :デフォルトの名無しさん:2006/05/20(土) 19:56:09
しかもその事実上の標準にも適合してないし。

694 :デフォルトの名無しさん:2006/05/20(土) 19:58:42
VC2005はなんか使いにくいというか、重くて、UIの色使い(?)に
抵抗感があるよね・・・
一生VC2003と付き合っていくことになりそうだ

695 :デフォルトの名無しさん:2006/05/20(土) 20:01:02
>>694
俺もVC2003から乗り換えた当初は「なんだこの分かりづらくてケバい色遣いは」と思ったが
しばらく使ってると慣れて、むしろ見やすく感じるようになった。
住めば都とはこのことか。

696 :デフォルトの名無しさん:2006/05/20(土) 20:16:01
コンパイラだけ入れ替えてくれ。

697 :デフォルトの名無しさん:2006/05/20(土) 21:35:06
2003も2005も、キーボードだけでクラスの頭出しが出来ないから
一生VC6と付き合っていくことに……なるのは嫌だな。なんで退化するのよ。

698 :デフォルトの名無しさん:2006/05/20(土) 22:19:49
何を言ってるかわからんがインテリセンス?
まぁいずれにせよスレ違いということで

699 :デフォルトの名無しさん:2006/05/20(土) 22:31:25
いやインテリセンスじゃなくて、そこに飛ぶの。もの凄い便利よ。良く皆あれ無しでやっていけるなと思う。まぁスレ違いか。

700 :デフォルトの名無しさん:2006/05/20(土) 22:42:55
>>699
右クリック→Go to definition じゃダメなの?
右クリックはコンテキストメニューキー、Go to definitionはGキーで代用できるから、
実質2回キーを押すだけで飛べるんだが、それじゃ不満なのかね。
別にマクロ組んでショートカット割り当てても同じだと思うが…

というかスレ違いだな、うん。

701 :デフォルトの名無しさん:2006/05/20(土) 22:47:47
>>700
レスしてーw
違う、違うんだ!でもスレ違いだw

702 :デフォルトの名無しさん:2006/05/20(土) 22:55:09
VC++2005にはマクロ機能が無い!!!。これ最悪。

スレ違いでごめん。

703 :デフォルトの名無しさん:2006/05/20(土) 23:15:54
>>701
気になるじゃまいか

704 :デフォルトの名無しさん:2006/05/21(日) 00:44:20
オーバーロードに関して質問です。
void f(int) {}
void f(float) {}
template<class T> void g(T) {}
g(f); // 曖昧
これを g(なんとか); の呼び出しで解決する方法はありますか?

705 :デフォルトの名無しさん:2006/05/21(日) 00:45:12
>>704
g(f<int>);とg(f<float>);でできたような。違ったらすまん。

706 :デフォルトの名無しさん:2006/05/21(日) 00:47:10
>>705
f()はテンプレート関数じゃないように見えるんだが……。

どうやるんだろう。

707 :デフォルトの名無しさん:2006/05/21(日) 00:47:20
>>704 static_cast

708 :705:2006/05/21(日) 00:49:12
>>706
これはおおぼけをかましてしまった。
_| ̄|○

709 :デフォルトの名無しさん:2006/05/21(日) 00:52:25
>>707
通りました。
一応確認ですが
g(static_cast<void (*)(float)>(f));
でvoid f(int); が void f(float)にキャストされてしまう心配は無いですか?

710 :デフォルトの名無しさん:2006/05/21(日) 00:54:28
>>709
そんな無茶な変換をstatic_castが通すわけがない。

711 :デフォルトの名無しさん:2006/05/21(日) 00:56:24
>g(f); // 曖昧

曖昧なのは本当はコンパイラのチェックのタイミングで
PG の設計じゃないのにな

712 :デフォルトの名無しさん:2006/05/21(日) 00:56:50
>>704
g<void (int)>(f);なんかはだめ?
static_castよりも少ない文字数だよ。

713 :デフォルトの名無しさん:2006/05/21(日) 01:04:13
>>710
ありがとう御座います。
密かに
void (*p)(float) = f;
g(p);
しか無いのかなと思っておりました。

>>711
趣味でやっているもんでして

>>712
上の例はかなり簡略した例でして
実際のはfor_eachに渡すんで第二引数になってしまうんですよね。
第一引数を指定するのも面倒なんで>>707の方法で逝きます。
ありがとうございました

714 :デフォルトの名無しさん:2006/05/21(日) 01:05:42
しかし、オーバーロードの利点がなくなりそうなコードだが……。

715 :デフォルトの名無しさん:2006/05/21(日) 01:11:29
>>714
確かにそうなんですが destroy_int とか destroy_float ってやるのもどうかと思いまして。。。
当然中身はただ delete オペレータ読んでるだけじゃないっす。float 以外の型も増えそうな感じなんで。

716 :デフォルトの名無しさん:2006/05/21(日) 01:26:12
テンプレートで出来ないのかと思ってやってみたけど、無理なのか……。
古き良きマクロでも使うしかないのかねぇ……。

template <typename T>
void (T) make_f()
{ return static_cast< void (T)>(f) ; }

template <typename T>
void (*)(T) make_f()
{ return static_cast< void (*)(T)>(&f) ; }

template <typename T>
struct make_f
{
  typedef ????……無理か……
}

717 :デフォルトの名無しさん:2006/05/21(日) 01:26:41

具体的な用途は知らんけど、こんな感じにしたら?

#include<iostream>
using namespace std;
template<typename T> struct g_impl;
template<> struct g_impl<int> {static int do_it(){cout << "int" << endl;} };
template<> struct g_impl<float> {static int do_it(){cout << "float" << endl;}};

template<class T> void g(T) {g_impl<T>::do_it();}

int main()
{
g(5);
g(5.5f);
}

718 :デフォルトの名無しさん:2006/05/21(日) 01:28:46
>>717
for_eachに渡したいといっているんだから、
関数オブジェクトにすべきでは?

719 :デフォルトの名無しさん:2006/05/21(日) 01:33:30
既に g(なんとか); の呼び出しで解決してないのでありますが…

720 :デフォルトの名無しさん:2006/05/21(日) 01:38:10
汎用関数に,オーバーロードされた関数へのコールバックを
明示的なキャストなしで引き渡したい場合,確かに
(operator()がオーバーロード/テンプレート化された)関数オブジェクトにするしか
方法がないとは思いますけれど,そうすると今度は関数オブジェクトを
わざわざ作る手間とのトレードオフになってしまうんですよね.

721 :デフォルトの名無しさん:2006/05/21(日) 01:42:51
template <typename T> struct destroy ;

template <> struct destroy<int>
{
  void operator () (int *p){ delete p ; }
} ;
template <> struct destroy<float>
{
  void operator () (float *p){ delete p ; }
} ;



int main()
{
  int * ptr_array[32] ; //

  for (int i = 0; i != 32 ; ++i)
    ptr_array[i] = new int ;

  std::for_each( &ptr_array[0], &ptr_array[32], destroy<int>() ) ;

}

そんなに手間かな?
むしろ関数オブジェクトのほうが使いやすいと思うのだが。


722 :721:2006/05/21(日) 01:49:39
じつは特殊化を使う必要もなかったり……

723 :デフォルトの名無しさん:2006/05/21(日) 01:51:55
C++の厄介なところはあれでも出来るこれでも出来るって所に有りまして・・・
趣味でやってると時間の制限が無い分、あれこれ試してるだけで1日終わったり…。
今はなるべく、行数が少ない方が良いと思ってプログラムしております。
変更するのに時間掛からないんで。
どうでもいいですよね

724 :デフォルトの名無しさん:2006/05/21(日) 01:54:20
>>721
>>722
関数オブジェクトクラスに型パラメータを持たせずに
済ませることすらできるようになりますね.

struct destroy{
template< class T > operator()( T *p ){ delete p; }
};

ただ for_each のような例なら関数呼び出し構文の戻り値の型を
全く必要としないのでその手間で済むんですが,一般には汎用関数内で
戻り値の型を必要とする場合がしばしばあるので,
そうすると戻り値の型計算をちゃんと書かないといけなくなるので.
(いわゆる Polymorphic Function Object)

725 :721:2006/05/21(日) 01:56:22
template <typename T> struct destroy
{
  void operator() (T *p) { delete p ; }
} ;

オーバーヘッドが気にならないんだったら、
boostのsmart_ptrあたりをコンテナに放り込んだほうが楽そう。

>>723
禿曰く、「マルチパラダイム」らしいけど。

726 :721:2006/05/21(日) 01:57:49
>>724
それは思いつかなかった。
自分はまだ未熟かOrz

727 :デフォルトの名無しさん:2006/05/21(日) 02:45:48
うは、トラックバックしてぇ

728 :デフォルトの名無しさん:2006/05/21(日) 02:48:04
Effective STLに載っていたような気がする。


729 :デフォルトの名無しさん:2006/05/21(日) 03:18:40
>>704
         ,. -‐'''''""¨¨¨ヽ
         (.___,,,... -ァァフ|          あ…ありのまま 今 起こった事を話すぜ!
          |i i|    }! }} //|
         |l、{   j} /,,ィ//|       『関数ポインタを返す関数をコンパイラに読ませたと
        i|:!ヾ、_ノ/ u {:}//ヘ        思ったらいつのまにか自分では読めないコードがそこにあった』
        |リ u' }  ,ノ _,!V,ハ |
       /´fト、_{ル{,ィ'eラ , タ人        な… 何を言ってるのか わからねーと思うが
     /'   ヾ|宀| {´,)⌒`/ |<ヽトiゝ        おれも何をしたのかわからなかった…
    ,゙  / )ヽ iLレ  u' | | ヾlトハ〉
     |/_/  ハ !ニ⊇ '/:}  V:::::ヽ        頭がどうにかなりそうだった…
    // 二二二7'T'' /u' __ /:::::::/`ヽ
   /'´r -―一ァ‐゙T´ '"´ /::::/-‐  \    催眠術だとか超スピードだとか
   / //   广¨´  /'   /:::::/´ ̄`ヽ ⌒ヽ    そんなチャチなもんじゃあ 断じてねえ
  ノ ' /  ノ:::::`ー-、___/::::://       ヽ  }
_/`丶 /:::::::::::::::::::::::::: ̄`ー-{:::...       イ  もっと恐ろしいものの片鱗を味わったぜ…

template<typename T>
inline void (*select_f())(T) { return f; }

g(select_f<int>());

730 :デフォルトの名無しさん:2006/05/21(日) 06:06:45
http://java.sys-con.com/read/45250.htm?CFID=284001&CFTOKEN=8D1F3492-114D-12D2-748B749EEAB77345

731 :デフォルトの名無しさん:2006/05/21(日) 07:44:42
>>724をそのまま使うのだったらboost::checked_deleteを使えば良いと思う。

732 :デフォルトの名無しさん:2006/05/21(日) 14:58:09
>>729
こういう風に調べたのだろうか……。

//関数ポインタ
typedef void (*ptr_type)(int) ;

//関数ポインタを返す関数
ptr_type foo() ;

//人間の読める文字列を得る。
std::cout << typeid(foo).name() << std::endl ;

//VC7.1だと、void (__cdecl*__cdecl(void))(int)
これを元にテンプレート関数へ
template <typename T>
inline
void ( *make_f(void) ) (T) { retuirn f ; }

将来、絶対に書きたくないし読みたくもないコードだ……。

733 :デフォルトの名無しさん:2006/05/21(日) 18:24:15
>>732
ふつーに K&R でも読めばどうとでも・・・

734 :デフォルトの名無しさん:2006/05/21(日) 19:27:31
K&R吹いた

735 :デフォルトの名無しさん:2006/05/21(日) 20:09:03
>>729
typedef しろ

736 :デフォルトの名無しさん:2006/05/21(日) 20:30:05
>>735
あれを typedef 使って書き直そうとすると、 template のせいで意外と大変な罠。

737 :デフォルトの名無しさん:2006/05/21(日) 20:43:04
脊髄反射してしまった。スマン。

738 :デフォルトの名無しさん:2006/05/21(日) 20:58:36
>>734
関数ポインタを返す関数について K&R と C++ の相違を述べよ

739 :デフォルトの名無しさん:2006/05/21(日) 21:11:17
K&R C との比較か?

740 :デフォルトの名無しさん:2006/05/21(日) 21:15:49
>>738
違いはない。一人吹いたぐらいで突っかかるな。

741 :デフォルトの名無しさん:2006/05/21(日) 21:57:51
「違い」 と、わざと曖昧な聞き方をしてみたが
返ってきたのは 739 程度

742 :デフォルトの名無しさん:2006/05/21(日) 21:59:22
変な煽りあいは他所でやってくれ。

743 :デフォルトの名無しさん:2006/05/21(日) 22:00:51
じゃ、おまえは二度と煽るなよ

744 :デフォルトの名無しさん:2006/05/21(日) 22:39:11
はあ?何でだよwww意味不明すぎww
論理的思考のできない平成生まれが脊椎反射でレスてんじゃねーよwwww

745 :デフォルトの名無しさん:2006/05/21(日) 22:50:07
脊髄による反射でレスできるならしてみろドアホ

746 :デフォルトの名無しさん:2006/05/21(日) 22:56:02
カックン

747 :デフォルトの名無しさん:2006/05/21(日) 22:56:36
カックン

748 :デフォルトの名無しさん:2006/05/21(日) 23:04:35
>>738
C++にしかないtemplateと併用する場合typedefを使うとかえって面倒なため(>736)、
>729のような複雑な宣言を強いられるが、
Cであればtypedefですっきりした宣言にできる。
あんたはCでもtypedefせずに>729みたいに書いてるのか?

つかまさかK&Rに>729みたいな書き方を読めるようになりなさいって書いてあるんだろうか

749 :デフォルトの名無しさん:2006/05/21(日) 23:08:39
>あんたはCでもtypedefせずに>729みたいに書いてるのか?

まあ、そうだね
職場でもスタイルについては頻繁に議論するけど
これに不満を訴える人はいないし

750 :デフォルトの名無しさん:2006/05/21(日) 23:12:07
他所でやってもらえませんでしょうか?

751 :デフォルトの名無しさん:2006/05/21(日) 23:12:36
>>749
後半はまったく意味を成していない件について

752 :デフォルトの名無しさん:2006/05/22(月) 00:03:39
こんなことはできない?
template<typename T> type
{
  typedef T type;
};

template<typename T>
inline type<void (*)(T)>::type select_f {return f;}

753 :デフォルトの名無しさん:2006/05/22(月) 00:22:44
>>752
できるだろうな。そのままじゃコンパイルできないけど。

754 :デフォルトの名無しさん:2006/05/22(月) 01:18:59
struct つければいいだけか。いいね。

755 :デフォルトの名無しさん:2006/05/22(月) 01:21:54
うんにゃ typename も要る

756 :デフォルトの名無しさん:2006/05/22(月) 01:27:56
ああ、そうか。そうだな。

757 :デフォルトの名無しさん:2006/05/22(月) 01:53:08
template <typename T>
struct identity
{
  typedef T type ;
} ;


template <typename T>
inline
identity<void (*)(T)>::typename
  type select_f()
{
  return f ;
}


VC7.1ではコンパイルが通らない。
何かおかしいのかな。

758 :デフォルトの名無しさん:2006/05/22(月) 02:00:18
typename identity<void (*)(T)>::type select_f()

だろ?
VC7.1で試してはいないが。

759 :757:2006/05/22(月) 02:04:37
そうだったOrz

760 :757:2006/05/22(月) 02:07:32
template <typename T>
struct make_type
{
  typedef void (*type)(T) ;
} ;

template <typename T>
inline
typename make_type<T>::type
  make_f()
{
  return &f ;
}

こうしたほうがわかりやすいかな。

761 :デフォルトの名無しさん:2006/05/22(月) 02:17:08
>>760
return &f;←このfはどこから?

762 :デフォルトの名無しさん:2006/05/22(月) 02:20:07
>>761 >>704,729 から

763 :デフォルトの名無しさん:2006/05/22(月) 06:21:18
>>750
ここで喧嘩売るあんたこそ一番の荒らしだよ

764 :デフォルトの名無しさん:2006/05/22(月) 06:24:15
売ってもいない喧嘩を売ってると言い張るパターンは、
あらゆる難癖の中でも「自分がキレイなつもりでいる」分悪質だな。

765 :デフォルトの名無しさん:2006/05/22(月) 06:26:44
と、メール欄で罵倒しておいて喧嘩売るつもりじゃなかったと言い張る腑抜けが申しております

766 :デフォルトの名無しさん:2006/05/22(月) 06:27:12
そんなにここで暴れたいか

767 :デフォルトの名無しさん:2006/05/22(月) 06:31:50
template<class T>
void f(T);

template<>void f<int>(int){....}
template<>void f<float>(float){...}


768 :デフォルトの名無しさん:2006/05/22(月) 07:08:37
>>765
ほら、喧嘩したいのは他ならぬ自分なのが丸わかり。

769 :デフォルトの名無しさん:2006/05/22(月) 07:10:30
整合性が2ターン保たない人ってたまにいるんだよね :-)

770 :デフォルトの名無しさん:2006/05/22(月) 11:24:04
>>704 の場合、f は g に対する visitor なので、
そのまま visitor として実装すればいいだけだろうと思うが。
function_traits でいちいち型を調べる必要も無い。

// STL のアルゴリズムに渡すためには、
// result_type を定義しないといけないので、
// とりあえず static_visitor から派生させておく
struct fx : public ::boost::static_visitor<void> {
 template< typename T > void operator()( T val ) const {
  // すでにある関数 f の呼び出し
  f( val );
 }
};

g(fx());



771 :デフォルトの名無しさん:2006/05/22(月) 11:44:35
>>770 それって >>724 と同じことだよね?

772 :デフォルトの名無しさん:2006/05/22(月) 20:54:20
>>768
あんたが煽る限りいくらでもやり返すぜ
最後まで何か言う気なら結果は1つだ

773 :デフォルトの名無しさん:2006/05/22(月) 21:36:52
std::auto_ptr<ChanStatus> TChanStatusPtr;
この様に宣言されているスマートポインタをノーマルポインタに宣言し直すにはどうのようにすればいいのでしょうか?



774 :デフォルトの名無しさん:2006/05/22(月) 21:39:22
ChanStatus *TChanStatusPtr;
じゃないの?

775 :デフォルトの名無しさん:2006/05/22(月) 22:06:06
>>774
即レス感謝です。ありがとうございました

776 :デフォルトの名無しさん:2006/05/22(月) 23:35:57
>>772
ほんとに血の気が多いね。頭が悪いのに。
あ、ズバリ書くとまた煽られちゃうかもー(コワイコワイ

777 :デフォルトの名無しさん:2006/05/23(火) 21:55:45
本当に他所でやってくれよ
質問しづらいだろ

778 :デフォルトの名無しさん:2006/05/24(水) 00:29:06
ある本のC++のサンプルを見ていたら、
{
if(なんちゃら)
if(なんちゃら)
if(なんちゃら)
}
ってあったんだけど、
{
}
↑これなに?
カッコだけでくくると何か特別な意味あるのかな?
ただ、見やすくするため?

779 :デフォルトの名無しさん:2006/05/24(水) 00:37:55
>>778
それだけ見るとあんまり意味は無い。
変数の定義があれば、スコープがひとつできることになる。

780 :デフォルトの名無しさん:2006/05/24(水) 00:56:22
変数なくてもスコープになるんじゃないの?
意味ないのは変わりないと思うけど。

781 :デフォルトの名無しさん:2006/05/24(水) 01:01:47
変数なくてスコープという意味が分からん。

782 :779:2006/05/24(水) 01:05:49
>>780
あーそうだな。書き直そう。
- 変数の定義があれば、スコープがひとつできることになる。
+ スコープがひとつできるので、変数の定義があれば何か意味があるかも。

783 :デフォルトの名無しさん:2006/05/24(水) 01:09:55
スコープとは変数に対して使うもんだと思っていた
ブロックの事を言っている?

784 :782:2006/05/24(水) 01:16:31
>>783
今確認した。そのとおりだ。

785 :779:2006/05/24(水) 01:30:04
>>783 などをふまえて、さらに書き直そう。
- 変数の定義があれば、スコープがひとつできることになる。
+ ブロックができるので、変数などの宣言があればそこでスコープが切れることになる。

786 :デフォルトの名無しさん:2006/05/24(水) 01:46:04
中で何も変数は宣言していない。
ただ
if(ほにゃらら) return FALSE;
が3列ならんでるだけですね。
見やすくするだけなのか?あまり意味はなさそうですね。

787 :デフォルトの名無しさん:2006/05/24(水) 01:57:54
while()

}
とかだったりしてな。

788 :デフォルトの名無しさん:2006/05/24(水) 04:07:24
説明のために一部分切り出したとか、誤植で1行目だけ飛んでるとかもありそう。
正直、778のレス内容だけでは何とも言いがたい。

789 :デフォルトの名無しさん:2006/05/24(水) 07:29:49
{
if(なんちゃら) { T x = XXX; …
if(なんちゃら)
if(なんちゃら)
}

ってのがあれば、デストラクタ呼び出しが}で行われる。Cとの違い。


790 :デフォルトの名無しさん:2006/05/24(水) 08:53:38
>>789
その例だと外側のBracesは要らない。
無い知恵絞った積もりなのだろうけど、その点に関してはCと違わない。

791 :デフォルトの名無しさん:2006/05/24(水) 13:41:38
そんな深い理由じゃなくて、>>787 の言うとおり、

if( どーたら )
{
 if(なんちゃら)
 ...
}

とあったのが、何らかの理由で「if( どーたら )」
だけ削ったんじゃねーの?

792 :デフォルトの名無しさん:2006/05/24(水) 14:57:21
>>790
>無い知恵絞った積もりなのだろうけど
やめろってば

793 :デフォルトの名無しさん:2006/05/24(水) 14:58:35
>>789
> {
> if(なんちゃら) T x = XXX;

だとどうなの?


794 :デフォルトの名無しさん:2006/05/24(水) 16:06:29
>>793
Cだと(C99でも)エラー。
C++だとスコープがif () の後の一文に限定される。
#だったと思う。

795 :デフォルトの名無しさん:2006/05/24(水) 16:28:09
for (int i = 0; i < N; i++) {
  …
}
のiのscopeは結局どうなったの?

if (i == N) { // not found

はまずい仕様になった?

796 :デフォルトの名無しさん:2006/05/24(水) 16:30:27
for (int i = 0; i < N; i++) {
  //iはここで使える。
}
//VC6のような腐ったコンパイラだと、何故かここで使える。

797 :デフォルトの名無しさん:2006/05/24(水) 16:58:26
VC6を叩いて優越感にひたる奴が急に増えたな
時代背景も知らずに

798 :デフォルトの名無しさん:2006/05/24(水) 17:01:26
>>797
時代背景→歴史的経緯


799 :デフォルトの名無しさん:2006/05/24(水) 17:06:58
>>798
どっちでもいいがなw

800 :デフォルトの名無しさん:2006/05/24(水) 17:08:55
>>797
知ってても今となっては(今さら使うなら)腐ってるといえる
でもまあ今VC6を使ってるとかいう話なわけでもないのに
唐突にVC6のことを書くのは余分だな
VCとしては7以降でちゃんとその後の規格に合わせて対応してるし

>>795
規格としては >>796 でいうVC6で採用されていたスコープルールとは
異なるものが採用された

801 :デフォルトの名無しさん:2006/05/25(木) 02:13:36
class A
{
bool F(){ delete this; retrun true; }
};
--
A *a = new A;
a->F();

これあり?

802 :デフォルトの名無しさん:2006/05/25(木) 02:24:35
>>801
古典的
ttp://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.15

1.オブジェクトは100パーセント絶対確実にnewによって作られていなければならない。
new[]やPlacement newだとダメ。ローカル、静的なオブジェクトもNG

2.これ以降、そのオブジェクトは使えない。

3.delete thisをしたあとは、メンバ関数はそのオブジェクトに属するメンバを使ってはならない。

4.クラスの外部でも操作不可。



とりえず、100パーセント絶対確実に、自信を持って出来るならば、やればいいんじゃない。

803 :デフォルトの名無しさん:2006/05/25(木) 02:52:39
標準ライブラリでもfacetとか、標準から離れればIUnknownの実装なんかで、
delete this;は当たり前のように使われている。

804 :デフォルトの名無しさん:2006/05/25(木) 06:12:39
boost::intrusive_ptrなんか、我々がその辺を自前で用意するもんな。

805 :デフォルトの名無しさん:2006/05/25(木) 11:24:54
tr1::shared_ptrには削除子があるのに、何故auto_ptrにはそれがないのでしょうか?

806 :デフォルトの名無しさん:2006/05/25(木) 13:32:22

type_info::operator =
type_info::before
による型チェックを行ってるのですが、何故か照合できない型があります。
そして、別の型名なのに true になってしまう事もあります。

type_info による型チェックは信頼性が低いのでしょうか?


807 :デフォルトの名無しさん:2006/05/25(木) 13:44:43
>>806
問題を再現する最低限のソースを貼ってみましょ


808 :デフォルトの名無しさん:2006/05/25(木) 14:19:11
class FixObj : public Obj {
  contents...
};
class Block : public FixObj {
  contents...
};
class Step : public FixObj {
  contents...
};
こういうクラス構造で・・・

bool test (const type_info& TYPE, Obj* OBJ) {
  return typeid(OBJ) == TYPE || typeid(OBJ).before(TYPE);
}
こういう型判定メソッドがあり・・・

Obj* obj = new Block;
test(typeid(Block*), obj);
こうしても結果がfalseになってしまいます。
しかし、dynamic_cast<Block*>(obj)では、NULLになりません。
何故なんでしょうか?

ただ、Stepインスタンスはちゃんと照合できるのです。
環境はVisualC++です。何故なんでしょうか?
type_info による型照合は信頼性が低いのでしょうか?


809 :デフォルトの名無しさん:2006/05/25(木) 14:27:29
Objに仮想関数ないだろ

810 :デフォルトの名無しさん:2006/05/25(木) 14:37:37
ポインタ渡しによるスライシングが起きている。
参照渡しにすれば問題なし。

811 :デフォルトの名無しさん:2006/05/25(木) 15:18:36
>>810
おお、どうもです。しかし・・・・

bool test (const type_info& TYPE, Obj& OBJ) {
  return typeid(OBJ) == TYPE || typeid(OBJ).before(TYPE);
}
として、参照渡しにして
Obj* obj = new Block;
test(typeid(Block), *obj);

としたら、照合はされたのですが、今度は
typeid(Step)でもtrueになってしまいます・・・・
しかも、ポインタ型だとどんなものでもtypeid(string*)でも、trueに
なってしまうのです・・・・

内部で勝手に、何かが共有(スライシング)されてるのでしょうか?
もうイライラして死にそうです・・・

812 :デフォルトの名無しさん:2006/05/25(木) 15:28:30
>>811
うちはちゃんと動いてるようだけどなぁ
$ cat test.cpp && c++ -o test test.cpp && ./test
#include <iostream>
using namespace std;
struct Obj {virtual ~Obj () {}};
class FixObj : public Obj {};
class Block : public FixObj {};
class Step : public FixObj {};
bool test (const type_info& TYPE, const Obj& OBJ) {
// return typeid(OBJ) == TYPE || typeid(OBJ).before(TYPE);
return typeid(OBJ) == TYPE;
}
int main () {
{
Obj* obj = new Block;
cout << test(typeid(Block), *obj);
cout << test(typeid(Step), *obj);
}
{
Obj* obj = new Step;
cout << test(typeid(Block), *obj);
cout << test(typeid(Step), *obj);
}
cout << endl;
return 0;
}
1001


813 :デフォルトの名無しさん:2006/05/25(木) 16:30:03
>>812
すみません。説明不足でした・・・・

実際のプログラム中では、「Obj*」データはコレクションクラスに格納されており、
Objを仮想基本クラスにした様々なインターフェースを、それぞれが実装してるのです。

その格納庫の中から任意のインターフェースを実装してるObj*データを
随時取り出して処理を行わせる流れにしてるのですが、そのインターフェースの
型チェックで上記のtest関数が上手くいかないのです・・・・

コレクションから取り出したObj*は、dynamic_castだと正確に照合できますが
typidチェックだと照合できなかったり、他の型でもtrueになったりしてしまうのです・・・
もうどうすればいいのか・・・

814 :デフォルトの名無しさん:2006/05/25(木) 16:56:32
>>813
testに渡す前とtestの中で
type_info::nameを見てみれば?


815 :デフォルトの名無しさん:2006/05/25(木) 17:04:15
>>814
それが「class Block」となってるんです・・・・
しかし、そのObj*データは、ポインタ型だとどんなものであっても

typeid(obj) == typeid(string*) || typeid(obj).before(typeid(string*))

これで true になってしまうのです・・・・

816 :デフォルトの名無しさん:2006/05/25(木) 17:15:51
/GRオプションは?

817 :デフォルトの名無しさん:2006/05/25(木) 17:26:19
画面上にある図形を与えられた座標を中心に円運動させるにはどうしたらいいのか
どなたか知恵をかしてください。
ヒントは"三角関数をつかう"なんですけど...

式の立て方がわからないです

818 :デフォルトの名無しさん:2006/05/25(木) 17:29:21
/GRはつけてます・・・・
まとめると
Obj* pobj; として、それにBlockインスタンスを代入して

typeid(pobj)だと、その「Block*」との照合が false となり、
typeid(*pobj)だと、「Block」だけなく同じ仮想基本クラスを持つ型(Step)と、
更に全ポインタ型(string*)との照合でも true になってしまうのです・・・
何がなんだか・・・orz

819 :デフォルトの名無しさん:2006/05/25(木) 17:36:09
>>817
座標(cx, cy)を半径rで回るとすると
int i = 0;
while (true) {
  i = (i + 1) % 360;
double rad = (double) i * 3,14 / 180;
double x = cos(rad) * r;
double y = sin(rad) * r;
drawImage(cx + x, cy + y);
}

820 :デフォルトの名無しさん:2006/05/25(木) 17:39:19
>>818
これの出力をコピペしてみて(文章による報告じゃなくて)
#include <iostream>
using namespace std;
struct Obj {virtual ~Obj () {}};
class FixObj : public Obj {};
class Block : public FixObj {};
class Step : public FixObj {};
bool test (const type_info& TYPE, const Obj& OBJ) {
cout << typeid(OBJ).name () << ' ' << TYPE.name ()
<< ' ' << typeid (string *).name ()
<< ' ' << typeid (int *).name () << endl;
return typeid(OBJ) == TYPE;
}
int main () {
Obj* obj = new Block;
cout << typeid (*obj).name () << endl;
cout << typeid (Obj).name () << ' ' << typeid (Block).name ()
<< ' ' << typeid (Step).name () << endl;
cout << test(typeid(Block), *obj) << endl;
cout << test(typeid(Step), *obj) << endl;
return 0;
}


821 :デフォルトの名無しさん:2006/05/25(木) 17:49:30
>>819

アドバイスありがとうございますY(>_<、)Y


今からさっそく実行してみます!!

822 :デフォルトの名無しさん:2006/05/25(木) 17:49:56
>>813
dynamic_castが使えるならdynamic_castでいいだろ。

823 :デフォルトの名無しさん:2006/05/25(木) 17:55:00
>>820
わざわざどうもです。

class Block
struct Obj class Block class Step
class Block class Block class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > * int *
1
class Block class Step class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > * int *
0

結果は正確なのですが、上でも述べましたが
Obj* obj = への代入は、実際のプログラムの中ではコレクションクラスから
取り出したObj*データ(Blockインスタンスなど)なのです・・・

824 :デフォルトの名無しさん:2006/05/25(木) 18:05:37
>>822
一つの希望クラスを指定してのtest関数だけなら、そうするのですが
実は、複数のtype_infoオブジェクトをvectorで渡して、その複数タイプの内
どれか一つを実装してるインスタンスを判別する為のmultiTest関数もあり
そっちがメインなのです。
ですから、何とかtype_infoで型チェックを行いたいのです。

825 :デフォルトの名無しさん:2006/05/25(木) 18:07:51
trueになるのはbefore()のせいじゃないの? >>815
beforeが判定するのはクラス継承関係じゃないよ(わかってたらごめん)

826 :デフォルトの名無しさん:2006/05/25(木) 18:08:01
>>823
実行結果最後の行の0は

>>818
>typeid(*pobj)だと、「Block」だけなく同じ仮想基本クラスを持つ型(Step)
><中略>との照合でも true になってしまうのです・・・
の報告と矛盾してるようだけど


827 :デフォルトの名無しさん:2006/05/25(木) 18:12:42
>>824
>>実は、複数のtype_infoオブジェクトをvectorで渡して、その複数タイプの内
type_infoオブジェクトはコンテナに入れてはいけないよ
Loki::TypeInfoなどを使いましょう


828 :デフォルトの名無しさん:2006/05/25(木) 18:13:31
>>825
自分の認識ではbeforeは、そのインスタンスの全スーパークラス「だけ」との
照合で true になると思ってるのですが・・・・
違うのですか?

>>826
単純に、Obj* obj = new Block と代入するなら正確な結果になるのですが
実際のプログラムの中では、obj = iterator->second などと
コレクションクラスから代入してるのです。

829 :デフォルトの名無しさん:2006/05/25(木) 18:19:31
>>827
正確には、type_info のアドレスをvectorに入れてるのですが
これでもまずいのですか?

830 :825:2006/05/25(木) 18:19:32
>>828
単にtypeidの配列をソートしたい場合とかに使う順序関係であって、
クラス継承とは無関係だと思ったけど…。
いざ探そうと思うとドキュメントが見つからない

831 :デフォルトの名無しさん:2006/05/25(木) 18:22:44
int main(){
  int i = 0;
  i = i++;
  printf("%d\n", i);
}

このようなコードを書いた際、C/C++では1が表示されますが
C#で同じコードを書くと0が返ってきます。
演算子の優先順位を確認するとC#のほうが正しいような気がするのですが、正しいのはどっちでしょうか。
気になって夜も眠れません。

832 :デフォルトの名無しさん:2006/05/25(木) 18:23:51
>>830
げー!!!
じゃあC++の標準ではスーパークラスをチェックする方法はないんですか?
MFCみたいに、クラス毎にマクロを記述するのはどうしても避けたいのですが・・・
インターフェースが多すぎて

833 :831:2006/05/25(木) 18:24:45
すみません。忘れてましたorz
C/C++のコンパイラはVisual C++ 2005とgcc4.0.3で確認しました。
C#のコンパイラはVisualC# 2005で確認しました。

834 :デフォルトの名無しさん:2006/05/25(木) 18:30:02
>>832
>18.5.1
>1. The class type_info describes type information generated by the
>implementation. Objects of this class effectively store a pointer to
>a name for the type, and an encoded value suitable for comparing two
>types for equality or collating order. The names, encoding rule, and
>collating sequence for types are all unspecified and may differ
>between programs.
>
>bool before(const type_info& rhs) const;
>
>5. Effects: Compares the current object with rhs.
>6. Returns: true if *this precedes rhs in the implementation’s collation order.


835 :デフォルトの名無しさん:2006/05/25(木) 18:31:53
>>831
これは演算子の優先順位でなく、コンパイラの解釈上の問題のような。
シンプルに考えると1の方が正しい。iへの後置演算をキャンセルした
♯のアセンブルが正しいかどうかは、人によって意見が分かれると思う。

836 :デフォルトの名無しさん:2006/05/25(木) 18:36:46
>>831
少なくともC/C++ではそれがどうなるかは未定義。
2つの副作用完了点の間に、2度も同一のオブジェクトに書き込むことになるから。

837 :デフォルトの名無しさん:2006/05/25(木) 18:40:18
>>832
dynamic_cast<>すればいいだろ。

838 :デフォルトの名無しさん:2006/05/25(木) 18:42:05
>>831
gcc3.3.5は-Wallで警告が出るね


839 :831:2006/05/25(木) 18:44:56
int main(){
  int i = 0;
  i = (i++);
  printf("%d\n", i);
}

ちなみにこのように括弧をつけても共に同じ挙動を示します。

840 :831:2006/05/25(木) 19:06:25
さらに追加です。以下のコードで実行した場合の出力を書きます。
<C++>
int main(){
 int h = 0;
 int i = 0;
 int j = 0;
 int k;
 printf("%d ", h++);
 printf("%d ", i = i++);
 printf("%d ", k = j++);
 printf("%d\n", i);
 return 0;
}
<C#>
static void Main(string[] args)
{
 int h = 0;
 int i = 0;
 int j = 0;
 int k;
 Console.Write("{0} ", h++);
 Console.Write("{0} ", i = i++);
 Console.Write("{0} ", k = j++);
 Console.WriteLine("{0}", i);
}
出力
<C++>
0 0 0 1
<C#>
0 0 0 0

841 :デフォルトの名無しさん:2006/05/25(木) 19:19:05
>>831
だから未定義って言ってるだろ。
コンパイラによっても違うかもしれないし、
最適化オプションによっても違うかもしれないし、
鼻から悪魔が出るかもしれないし、
そんなコードは書いちゃいかん。

842 :デフォルトの名無しさん:2006/05/25(木) 19:51:08
>>802
ありがとうございますー

843 :デフォルトの名無しさん:2006/05/26(金) 02:04:44
>>839->>840
副作用完了点って意味ワカンなかったらググれよ、屑。



844 :デフォルトの名無しさん:2006/05/26(金) 02:18:12
なんかWin32APIスレにも同じような流れが

845 :デフォルトの名無しさん:2006/05/26(金) 02:19:10
まちがえたスレ立てるまでもないだったw

846 :デフォルトの名無しさん:2006/05/26(金) 16:31:29
日本語でおk

847 :デフォルトの名無しさん:2006/05/26(金) 19:45:02
>>846
スレ一覧を見ろ

848 :デフォルトの名無しさん:2006/05/26(金) 20:59:45
どこかのサイトに
「mainより先に処理を呼ぶ方法がある」
と書いてあって、
方法としては確か
mainの書いてあるファイルと
同じファイルに無名namespaceで囲んだクラスを定義して・・・

以下どうだったか忘れました

・詳しくはどうやるんだっけ?
・どうしてそうなるのか

の二点が疑問なんですが、どなたかご存知の方いらっしゃいますか

849 :デフォルトの名無しさん:2006/05/26(金) 21:20:27
>>848
>同じファイルに無名namespaceで囲んだクラスを定義して・・・
その後で無名namespaceでインスタンスをつくるとかかなぁ


850 :デフォルトの名無しさん:2006/05/26(金) 21:53:13
>>848
・適当なクラスのコンストラクタにmainより前で実行させたい処理を書く。
・そのクラスのインスタンスを静的変数として定義

全ての静的変数の初期化はmainより前で行われるのでmainの前で処理が行える。
ついでに言うと静的変数のデストラクタはmainの終了後に行われる。


851 :848:2006/05/26(金) 21:59:20
>>849
>>850
なるほど!
静的変数の初期化を利用するんでしたか

という事は
・mainより先に処理したいクラス定義はmainの書いてあるファイルと
別ファイルにしてはいけない
・mainより先に処理したいクラス定義は複数書くと順番は保障されない

という認識になるんですかね
あとは調べながら試してみます

ありがとうございました

852 :848:2006/05/26(金) 22:13:55
>>851
>・mainより先に処理したいクラス定義は複数書くと順番は保障されない
同一ファイル内なら書いた順番みたいですね

853 :デフォルトの名無しさん:2006/05/26(金) 22:22:39
>>831
演算子の優先順位を確認するとC#のほうが正しいような気がするのですが

int main(){
  int i = 0;
int n;
  n = i++;
  printf("%d\n", n);
}

これでどうなる? 0 がでるだろ、演算子の優先順位処理は正しく行われている。
もとの式
i=i++;
左のiにゼロが代入される
その後i++でiがインクリメントされて、printfに渡される、何が問題なのか不明だなw


854 :デフォルトの名無しさん:2006/05/26(金) 22:53:36
グローバル変数とか静的変数のコンストラクタ/デストラクタに処理書くのって
なんかメリットあるのか?正直デメリットしか思いつかないんだが。

855 :デフォルトの名無しさん:2006/05/26(金) 23:07:55
>>854
cout の初期化を明示的に書かずに済むことくらいか
・・・これも怪しいが

856 :デフォルトの名無しさん:2006/05/26(金) 23:58:29
>>854
Singleton系
allocatorの初期化

857 :デフォルトの名無しさん:2006/05/27(土) 00:40:37
C++でthread-specific strageをやってくれるスレッドライブラリはないでしょうか?

858 :デフォルトの名無しさん:2006/05/27(土) 00:47:27
boostにthread_specific_ptrとかあったような気がする

859 :デフォルトの名無しさん:2006/05/27(土) 00:53:06
>>857
g++ならinfoみて
__pthreadとか

860 :デフォルトの名無しさん:2006/05/27(土) 07:07:42
コードのある範囲内で、グローバル名関数へのアクセスを禁止したいのですが・・・

#include <stdio.h>

namespace x
{

fread(...) { ... }

xmain()
{
  fread(...);
  fwrite(...);
}

}

main()
{
  fread(...);
}

上のxmain()内でのfread()の呼び出しはx::fread()ですが、fwrite()の呼び出し先を::fwrite()でなく、エラーにしたいのです。何かいい方法はありますか?

861 :デフォルトの名無しさん:2006/05/27(土) 07:12:07
>>860
名前の隠蔽を利用して、宣言だけをx名前空間の中に置いておけばいいんじゃまいか?

namespace x {
fread(...) { ... }
size_t fwrite(...);

xmain() {
 fread(...); // x::fread
 fwrite(...); // エラー:x::fwriteは定義がない
}
}

862 :デフォルトの名無しさん:2006/05/27(土) 13:14:43
>>860
#define fwrite do_not_call

863 :デフォルトの名無しさん:2006/05/27(土) 17:34:56
C++って初心者向きではないですよね?

864 :デフォルトの名無しさん:2006/05/27(土) 17:55:13
>>863
わざわざそんな質問をするような暇人向けではない。

865 :デフォルトの名無しさん:2006/05/27(土) 18:12:11
いや暇人向けかも
将来使う予定があるなら暇なときに習得するべし


866 :デフォルトの名無しさん:2006/05/27(土) 18:17:43
ある意味じゃ初心者向けかもな
線形リストもコーディングできないような奴とか
配列の境界チェック怠ってBOF起こさせる奴とか

867 :デフォルトの名無しさん:2006/05/28(日) 06:33:42
確かに STL の存在は大きいだろうね。

868 :デフォルトの名無しさん:2006/05/28(日) 13:57:27
http://www.uploda.org/uporg402552.zip.html

このコードなのですが、コンパイルできないので知恵をおかしください。
多分35行目の

OSStatus err = FSRefMakePath(&appBundleRef,mPathString, PATH_MAX);

のmPathStringに問題があると思うのですが、どこを変更すればいいのか分かりません。

869 :デフォルトの名無しさん:2006/05/28(日) 14:17:36
エラーメッセージも張らない莫迦はお断りだし環境依存スレに池。

870 :デフォルトの名無しさん:2006/05/28(日) 23:25:59
テンプレートメタプログラミングについて
お母さんの様にやさしく教えてくれるサイト・本等あったら教えてください

boost,Lokiのソースを見てみましたが
「何の処理をしているか」はなんとなく分かるんですが
「なぜそうしているのか」かがいまいち汲み取れてないのが現状です

871 :デフォルトの名無しさん:2006/05/28(日) 23:26:02
STLの本を探してたら、中古 \298,000 の本を見つけた
誤表記ですよね、定価 \6,000 だし・・・
ttp://www.amazon.co.jp/gp/product/4756137156/250-9284646-5949012?v=glance&n=465392

872 :デフォルトの名無しさん:2006/05/28(日) 23:29:38
>>870 http://www.boost.org/libs/mpl/doc/

873 :870:2006/05/28(日) 23:34:04
>>872
なるほどソース読むよりまずはドキュメントを熟読せよと

英語なのでお母さんの様にやさしいかは不明ですが、
ますはチュートリアルから頑張って読んで見ます。

874 :デフォルトの名無しさん:2006/05/28(日) 23:41:35
>>871
29800だろ?それが高いのはかなり前から推薦図書スレで既出
良書の上、絶版になったので高騰してる

875 :デフォルトの名無しさん:2006/05/29(月) 00:35:53
>>870
Modern C++ Design(邦訳あり)
C++ Templates
C++ Template Metaprogramming



876 :デフォルトの名無しさん:2006/05/29(月) 01:29:16
時々std::tr1
という名前空間をみかけますが、
TR1の名前空間は暫定的なものなんでしょうか

C++0xになったらstdに格上げされるとか?

877 :デフォルトの名無しさん:2006/05/29(月) 01:51:50
互換性の問題から、std名前空間になることはないと、思うんだけどね。
だいぶ仕様が変わっているから、そのままだと既存のコードが動かないし。

878 :デフォルトの名無しさん:2006/05/29(月) 01:55:10
>>876
↓これ見たらわかるかも。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf

879 :デフォルトの名無しさん:2006/05/29(月) 07:41:15
>>877
互換性のため、std::tr1を維持するのは構わないけど、(そのための'1'なんだから)
標準に入ったら、stdにも加わるに決まってるだろ。

880 :デフォルトの名無しさん:2006/05/29(月) 23:29:00
>>871
ttp://www.amazon.co.jp/exec/obidos/ASIN/0201379260/qid=1148912665/sr=1-1/ref=sr_1_2_1/249-9107367-7476308
訳書じゃないなら、日本のアマゾンで8300円少々で買える
ま、29万はありえんが2万9800円も異常な値段だな


881 :デフォルトの名無しさん:2006/05/30(火) 06:31:53
private継承、protected継承について詳しく解説している書籍・ページはありますか?
ExceptionalC++等で断片的な知識は得た物の、
言語仕様上の違いがいまいちハッキリ分からずに悩んでおります。

882 :デフォルトの名無しさん:2006/05/30(火) 06:40:54
>>881
規格票

883 :デフォルトの名無しさん:2006/05/30(火) 06:44:49
>>882
おkおk、書店で売っている大量の、
自称C++入門書とやらは、全部詐欺本だな。
規格票ひとつあれば、あんなものいらねーもんな。

アルゴリズムや特定のアーキテクチャ、ライブラリの解説書以外は不要だよな。


884 :デフォルトの名無しさん:2006/05/30(火) 06:53:15
>>883
まあ必要かどうかということならそうだね。
教科書だけあれば参考書は必要ではない
だがあれば理解の助けになるので、意義はあるけどな

885 :デフォルトの名無しさん:2006/05/30(火) 08:47:03
>>881
継承関係なしに private と protected の違いさえわかればいいと思うんだが。

886 :デフォルトの名無しさん:2006/05/30(火) 09:34:02
>>885
例えばDerivedがBaseをprivate継承していたら
BaseのポインタにDerivedのポインタを代入できなかったりと
クラス内のアクセス制御とはちょっと違う制約があるからな

887 :デフォルトの名無しさん:2006/05/30(火) 09:37:48
>>886
それも継承関係が private であることの結果でしょ?何が違うとも思わないな。

888 :デフォルトの名無しさん:2006/05/30(火) 09:40:50
>>887
「クラス内からのみアクセスできる」と「ポインタが代入不可」にどうして違いがないのか理解できない

889 :デフォルトの名無しさん:2006/05/30(火) 09:56:06
>>888
「クラス内からのみアクセスできる」ことによって
「クラス内からのみポインタが変換(代入)できる」ことになる。
前者が private の効果。後者はその結果の一つ。

890 :デフォルトの名無しさん:2006/05/30(火) 14:16:34
エディットからコンパイルまで備えたフリーのエディタってありますか?

891 :デフォルトの名無しさん:2006/05/30(火) 14:18:35
VC++2005EE

892 :デフォルトの名無しさん:2006/05/30(火) 14:27:44
フリーなの?

893 :デフォルトの名無しさん:2006/05/30(火) 14:55:10
フリーだよ

894 :デフォルトの名無しさん:2006/05/30(火) 15:13:57
d。
ダウンロードしてみます。

895 :デフォルトの名無しさん:2006/05/30(火) 17:59:15
d。
ダウンロードしてみます。

896 :デフォルトの名無しさん:2006/05/30(火) 19:08:10
d。 
ダウンロードしています。 

897 :デフォルトの名無しさん:2006/05/30(火) 19:17:23
d。
ダウンドードしています。

898 :デフォルトの名無しさん:2006/05/30(火) 19:19:10
d。
ダウンロードしてきます。

899 :デフォルトの名無しさん:2006/05/30(火) 19:25:52
>>890
emacs


900 :ホアキン:2006/05/30(火) 22:34:33
ある2つのクラスを用意して、相互にもう一方のクラスをメンバとすることはできますか?
要するにこうしたいのです↓

class ClassA{
 ClassB b;
};

class ClassB{
 ClassA a;
};

よろしくお願いします。

901 :デフォルトの名無しさん:2006/05/30(火) 22:36:12
そんな金太郎飴みたいなこと出来るわけねーだろアホが

902 :デフォルトの名無しさん:2006/05/30(火) 22:40:44
>>900
どちらか一方或いは両方がポインタや参照などを持つようにするならば可能。

903 :デフォルトの名無しさん:2006/05/31(水) 00:50:11
class a{
protected b{
any function()
....
}

}

インナークラスBのインスタンスをクラスAで宣言する場合の記述方法を教えてください

const a::b _b&;
こんな感じだっけ?

904 :デフォルトの名無しさん:2006/05/31(水) 01:08:02
>>903
インナークラス=ネストされたクラス
クラスAで宣言=クラスAのメンバとして宣言
として、
class A { class B {}; B b; };
こんな感じ。

905 :ホアキン:2006/05/31(水) 01:15:24
>>902
サンクス

906 :デフォルトの名無しさん:2006/05/31(水) 01:18:58
B b;やるとg++4.1だとエラー出るんですよ
新しいg++だとダメみたいで正確な書式知りたいんだけど
どなたか知りませんか?

907 :デフォルトの名無しさん:2006/05/31(水) 02:25:12
>>906
エラーメッセージも貼らずに聞かれちゃぁ、エスパー募集するしかないねぇ。

908 :デフォルトの名無しさん:2006/05/31(水) 03:42:13
class A { class B{ ... }; B &b; };
だったら出来るんじゃないの?


909 :デフォルトの名無しさん:2006/05/31(水) 04:50:37
>>906
問題ないよ。4.1.1 20060511

>>908
おいおい

910 :デフォルトの名無しさん:2006/05/31(水) 22:07:21
>>900
ちょっと興味深いコードだね。
しかし>>900のようにしてしまうとコンパイル時にサイズが決定できなくなる
っつーか無限大になっちまうから、ポインタや参照にする必要がある。

911 :デフォルトの名無しさん:2006/05/31(水) 22:34:12
class B;

class A{
    B* b;
public:
    A();
};

class B{
    A* a;
public:
    B()
    {
        a = new A;
    }
};

A::A()
{
    b = new B;
}

いくらコンパイル通るからってこういうことするなよ

912 :デフォルトの名無しさん:2006/05/31(水) 22:40:15
>>910
参照を理解してないなw

913 :デフォルトの名無しさん:2006/05/31(水) 22:54:54
イテレータには、ランダムアクセスや双方向アクセスなど5種類あるそうですが
プログラマーが明示的に区別しなくても
vector<int>::iterator p;
の様に書くだけで、後はコンパイラが適切なものを自動で選んでくれるのでしょうか?

914 :デフォルトの名無しさん:2006/05/31(水) 22:55:46
何かを大きく勘違いしちゃってるな

915 :デフォルトの名無しさん:2006/05/31(水) 23:21:38
>>913
vectorの場合はランダムアクセスイテレータ。
そういう風にコンテナによって必然的に決まる。

コンテナとは関係ないイテレータでも、その目的によってやはり必然的に決まる。

916 :デフォルトの名無しさん:2006/05/31(水) 23:24:49
template<typename T>
class Hoge
{
  friend T;
};

こういうことをしたいのですが、VC++ 7.1ではこれでコンパイルできたのですが、
GCC 3.4.4ではコンパイルエラーになりました。試しにfriend class T;としてもだめでした。

もしかしてこんなことを標準C++ではやれないのですか?

917 :デフォルトの名無しさん:2006/05/31(水) 23:28:29
型を返す関数ないかな

vector<int> a;
iterator(a) i = a.begin();

みたいな

918 :デフォルトの名無しさん:2006/05/31(水) 23:52:16
>>916
C++標準 7.1.5.3 の 2
>《詳述型指定子》中の《識別子》は,名前検索によってその表すものを見つけ出す
>(これを,名前検索が解決するという。)。名前検索の処理は,3.4.4に規定する。
>《識別子》が《クラス名》 又は 《列挙体名》 と解決された場合,《単純型指定子》が
>その型名を導入するのと同じように,《詳述型指定子》は,その《識別子》をその
>宣言に導入する。
>《識別子》が《型定義名》 又はテンプレート《型仮引数》と解決された場合,その
>《詳述型指定子》は不適格とする。
>
>参考 したがって,《型仮引数》Tというテンプレートをもつクラステンプレートの中では,
>次の宣言は,不適格となる。
>  friend class T;


919 :デフォルトの名無しさん:2006/05/31(水) 23:53:13
>>917
auto i = a.begin();
ってのが標準化されるかも。

920 :デフォルトの名無しさん:2006/05/31(水) 23:54:28
型推論ってやつ?
C#に搭載されるという

921 :デフォルトの名無しさん:2006/06/01(木) 00:00:02
>>919
C++0xに入ってるみたいだけど
まだ正式な規格になってないから「かも」レベルではあるか

922 :デフォルトの名無しさん:2006/06/01(木) 00:01:22
そのautoってのはイテレータだけ?

923 :デフォルトの名無しさん:2006/06/01(木) 00:05:09
>>919
それはすごいな
初期化子からオブジェクト自体の型を推論か・・・

いやふつーに a.iterator i = a.begin(); でもいいんだけどさ
たまーにコンパイラがアフォすぎって感じることあるんだよ

別に :: と . と -> の使い分けとかポインタの存在なんかそのままでいいんだけど
そういうところを受け入れたうえでもコンパイラのロジック自体の直交的に見えないところを整理して欲しい今日この頃でさ

924 :デフォルトの名無しさん:2006/06/01(木) 00:06:08
初期化子から、型を確定できるものはなんでも。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1894.pdf

925 :デフォルトの名無しさん:2006/06/01(木) 00:08:45
>>917
typedef使っとけばいいじゃん

926 :デフォルトの名無しさん:2006/06/01(木) 00:09:02
>>923
まあ今でも関数templateの実引数から型を決定すること自体はやってるわけでさ。

927 :デフォルトの名無しさん:2006/06/01(木) 00:10:11
>>923
関数テンプレートの型パラメータの省略だけじゃなくて、
クラステンプレートのコンストラクタの型パラメータの省略とか、
改善して欲しい所はたくさんあるね。


928 :デフォルトの名無しさん:2006/06/01(木) 00:16:45
>>924
面白そうだな
じっくり読んでみるよ
thx!!

929 :デフォルトの名無しさん:2006/06/01(木) 00:17:46
C++初心書のためのお勧めの本を教えてくださいm(_ _)m

930 :デフォルトの名無しさん:2006/06/01(木) 00:21:17
しらんがな

他の言語は何かマスターしてるのか?
アドバイスが欲しかったらちゃんと自分の状況を書け

931 :デフォルトの名無しさん:2006/06/01(木) 00:25:37
C言語は初級〜中級レベルです。
わかりやすく解説してる良書、お勧め書はありますか?

932 :デフォルトの名無しさん:2006/06/01(木) 00:29:40
B言語以来の予約語autoがついにリンケージ指定子の立場を追われるのか。
既存の予約語を使いまわす辺りがC直系らしいと思うが
なんとまあ都合いい予約語が余ってたもんだなw auto。

933 :デフォルトの名無しさん:2006/06/01(木) 00:31:44
省略不可になるだけで意味が変わるわけじゃあるまい

934 :デフォルトの名無しさん:2006/06/01(木) 00:42:38
>>931
憂鬱なプログラマのためのオブジェクト指向開発講座

935 :デフォルトの名無しさん:2006/06/01(木) 00:57:07
>>933
auto i = 1.0; が

Cでは、int i = 1;のこと。(BCPL以来のint(WORD型)の省略可能)
>>924が規格に入ったC++ではfloat i = 1.0;になるんじゃないかな。

936 :デフォルトの名無しさん:2006/06/01(木) 01:25:39
>>935 double だよ。

937 :デフォルトの名無しさん:2006/06/01(木) 01:43:59
auto の仕様が変わった所で
誰も困りそうにないのが凄いな。

938 :デフォルトの名無しさん:2006/06/01(木) 01:46:47
%cat auto.cpp
int main(){
auto i = 0;
return i;
}
%g++ -Wall auto.cpp
auto.cpp: In function `int main()':
auto.cpp:2: error: ISO C++ forbids declaration of `i' with no type

939 :デフォルトの名無しさん:2006/06/01(木) 01:49:13
autoの仕様変わるの?
auto i = 0; // type-specifier
auto int i = 0; // storage-class-specifier type-specifier
auto auto i = 0; // storage-class-specifier type-specifier
名前に意味ダブらすの得意だし>C++

940 :デフォルトの名無しさん:2006/06/01(木) 02:00:08
だから、そもそも3番目はエラーだってば。
>cl auto.cpp
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86
auto.cpp(2) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++
は int を既定値としてサポートしていません

941 :デフォルトの名無しさん:2006/06/01(木) 03:37:44
autoは初期化しようとした型にあわせて自動的に型が決定されるようになるんじゃなかったか?
for (auto it = v.begin(); it != v.end(); ++it) { ... }
規格が確定するのが2008年頃としても、コンパイラがサポートするにはあと3,4年かかりそうだなぁ…

942 :デフォルトの名無しさん:2006/06/01(木) 05:28:52
でもautoってださいよなww

943 :デフォルトの名無しさん:2006/06/01(木) 06:52:03
autoの仕様が変更されたら、>>939の例はどうなるんだろう。
autoキーワードそのものが>>941の目的に特化されて、
>>939の2、3番目はエラーになるのかな。

944 :デフォルトの名無しさん:2006/06/01(木) 08:37:00
>>941
型推論はいくつかの関数型言語ですでに実装されてる機能だし
実装自体にもそれほど難しい点はないので3、4年ってことはないと思われ

というか、初期化子だけで型が決まるんだから関数型言語の型推論よりよっぽど簡単

>>943
禿のことだから必死に互換性を保つだろう、その点は大丈夫そうだ
# 3番目はそもそもエラーらしいけどナ (規格に当たってないから本当かどうかは知らん)

945 :デフォルトの名無しさん:2006/06/01(木) 10:18:29
auto 単独なら型推論するけど、
auto の他に型を書いていたら
その型になるとかいう仕様になるんじゃね?

946 :デフォルトの名無しさん:2006/06/01(木) 10:57:05
どちらにせよauto autoの扱いが気になるな

947 :デフォルトの名無しさん:2006/06/01(木) 11:00:19
static auto i = v.begin();
なんてのはちゃんと解釈されるの?

948 :デフォルトの名無しさん:2006/06/01(木) 11:02:11
>>917のようなのは、g++だと、今のところ、

vector<int> a;
typeof(a.begin()) i = a.begin();

で何とかなります。
>>927のコンストラクタ呼び出しの冗長化で悩ましいので、typeof使ったマクロで処理してます。
まあ標準外れちゃうんだけど。>typeof



949 :デフォルトの名無しさん:2006/06/01(木) 11:02:57
されるんじゃね?要は右辺値の型を見ればいいだけだから
コンパイル時に決定できれば何でも大丈夫かと

950 :デフォルトの名無しさん:2006/06/01(木) 11:03:34
>>924のn1894.pdfによれば、
storage class 'auto'は廃止の提案です。

951 :950:2006/06/01(木) 11:05:22
間違えました。
storage class 'auto'の廃止じゃなくて、
storage class specifier 'auto'の廃止です。
「3.Proposed wording」のところ。

もちろん暗黙に指定した'auto' storage classはなくなりません。

952 :デフォルトの名無しさん:2006/06/01(木) 11:06:47
もともと互換性のために残されてたようなもんだしな

953 :デフォルトの名無しさん:2006/06/01(木) 12:35:33
このスレに、誰か auto の仕様変わったら困るって人いる?

954 :デフォルトの名無しさん:2006/06/01(木) 13:13:29 ?#
あるとすれば組み込み系とか?
デフォルトでregisterなのを明示的にautoにしたいとか。

955 :デフォルトの名無しさん:2006/06/01(木) 13:35:51
そんなコンパイラあるの?

956 :デフォルトの名無しさん:2006/06/01(木) 13:56:39
autoじゃ最適化の抑止にはならんだろ。。


957 :デフォルトの名無しさん:2006/06/01(木) 14:32:27 ?#
>>955
昔、組込用コンパイラでそんなのがあった。OptimizeC-86だったかな。

>>956
最適化を抑止というか、レジスタを別の用途(インラインアセンブラとか)に使いたいからとか。

958 :デフォルトの名無しさん:2006/06/01(木) 16:16:17
そういうのは、処理系依存の利用方法だから、
規格からautoがなくなっても、今まで通りの処理系使うだけだな。
そもそもC++じゃなくてCっぽいし。

959 :デフォルトの名無しさん:2006/06/01(木) 19:05:29
弊害も結構ありそうだと思うのは俺だけか?
いやautoが無くなる事じゃなくて型推論が追加される事に関してだが。

960 :デフォルトの名無しさん:2006/06/01(木) 19:36:23
>>959
例えば?

961 :デフォルトの名無しさん:2006/06/01(木) 20:54:51
const auto n = 4;
const auto a = 6.3;
const auto m = n * sizeof(a);
auto a[m];

こんな奇怪なコーディングが可能になる、とかか?
すまんあまり良い例(悪い例?)が思いつかない。

962 :デフォルトの名無しさん:2006/06/01(木) 21:05:59
>>961
一番下の式は初期化式がないからアウトだな。

963 :デフォルトの名無しさん:2006/06/01(木) 21:10:47
普通の型推論じゃなくて、
あくまで初期化式と同じ型にするだけなのね。

964 :デフォルトの名無しさん:2006/06/01(木) 21:31:38
確かにイレテータとか書くのめんどいもんな
vector<int>::itrator it = v.begin();
とか

965 :デフォルトの名無しさん:2006/06/01(木) 21:38:52
大抵は typedef するけど、名前考えるのが面倒い。

966 :デフォルトの名無しさん:2006/06/01(木) 21:41:50
boost::any
ほぼどんな型でも格納できる

967 :デフォルトの名無しさん:2006/06/01(木) 21:57:58
この手の関数オブジェクトをauto無しで書くと死ねる。

auto is_test = not1(bind2nd(std::ptr_fun(strcmp),"test"));
std::cout << is_test("Test") << " " << is_test("test");

まぁ、多少の非効率を無視してboost::functionで誤魔化してもいいけどね。

968 :デフォルトの名無しさん:2006/06/01(木) 22:27:29
autoなしで書くとどうなるのそれ?

969 :デフォルトの名無しさん:2006/06/01(木) 22:33:48
>>968
std::unary_negate<std::binder2nd<std::pointer_to_binary_function<const char*, const char*, int> > >

boost::lambdaを使うともっと、ありえない型になるw
using namespace boost::lambda;
auto is_test = ! bind(strcmp,_1,"test");
と書いたとして実際の型は
using namespace boost::lambda;
using namespace boost::tuples;
const lambda_functor<lambda_functor_base<logical_action<not_action>,
    tuple<lambda_functor<lambda_functor_base<action<3,function_action<3> >,
    tuple<int (&)(const char*, const char*),const lambda_functor<placeholder<1> >,
    const char (&)[5]> > > > > >


970 :デフォルトの名無しさん:2006/06/02(金) 00:06:43
>>969
boostのlambdaをそんな風に使うコードなんて、autoがあったとしても読みたくない。

971 :デフォルトの名無しさん:2006/06/02(金) 00:48:59
autoがあれば、今よりずっと手の込んだコードが書けるから大歓迎。
できれば新しい予約語にして欲しかったけどね。
// けどそっちの方が互換性に問題が出やすいかな。

972 :デフォルトの名無しさん:2006/06/02(金) 05:33:09
autoは仮引数には使えないのかね?

void func(auto n)
{ ... }

templateとバッティングするから恐らく不可だろうなぁ…

973 :デフォルトの名無しさん:2006/06/02(金) 06:04:15
>>972
新しいtemplateの表記法として採用されなくはないんじゃないのか?

974 :デフォルトの名無しさん:2006/06/02(金) 06:12:21
これが採用されれば、生まれて初めてC++のコーディングで
autoって打つことになりそうだw

975 :デフォルトの名無しさん:2006/06/02(金) 06:16:34
でも結構前から予約語なんだな

976 :デフォルトの名無しさん:2006/06/02(金) 07:02:30
C時代からautoには意味があったからな
今回の提案で意味が変わりそうってだけで

977 :デフォルトの名無しさん:2006/06/02(金) 10:26:14
>>974
そういや C ではとりあえず auto を使ってみた事はあるけど、
C++ では使った事無いな。

978 :デフォルトの名無しさん:2006/06/03(土) 14:57:38
bitwise copyってどういうコピーですか?

979 :デフォルトの名無しさん:2006/06/03(土) 15:04:13
>>978
memcpyのようなコピー。単に全ビットの並びが複写されるだけ。

980 :978:2006/06/03(土) 15:42:29
>>979
理解できました。ありがとうございました。

981 :デフォルトの名無しさん:2006/06/04(日) 13:11:07
恥ずかしながらはじめて聞いた
シャロウコピーなら聞いた事あるけど

982 :デフォルトの名無しさん:2006/06/04(日) 13:50:44
単純なコピーなのにwiseなのな

983 :デフォルトの名無しさん:2006/06/04(日) 13:56:55
◆-wise
《名詞の語尾につけて》〜のように、〜の方向に、〜の点で、〜に関しては、〜的に、〜風に、〜の観点で

984 :デフォルトの名無しさん:2006/06/04(日) 14:22:14
type-safeの意味について確認したいんですが、
int型にstring型を入れようとするとコンパイルエラーになる
というのをtype-safeという、という理解で合っていますか?

985 :デフォルトの名無しさん:2006/06/04(日) 14:23:58
#includeディレクティブについてなんですが

#include <hoge>
という書き方の他に
#include "hoge"
という書き方もあるようなのですがどこか違いがあるのですか?

986 :デフォルトの名無しさん:2006/06/04(日) 14:35:46
>>984 http://en.wikipedia.org/wiki/Type_safety

987 :デフォルトの名無しさん:2006/06/04(日) 14:36:38
>>985
検索方法がちがう。実際の検索方法はコンパイラ依存。

988 :デフォルトの名無しさん:2006/06/04(日) 15:12:33
>>985
適当に説明する。
<>はシステム側からフォルダ探す。
""はユーザー側からフォルダ探す。
だいたいの""は分割コンパイルするときの関数定義やらグローバル変数
を入れとくヘッダー。要は自作ヘッダー。
ま、言っても、色んなコンパイラ使ったことあるわけじゃないから
詳しくはしらね。


989 :デフォルトの名無しさん:2006/06/04(日) 16:45:11
「 :: 」と「 -> 」の意味が分かりません
教えてください

990 :デフォルトの名無しさん:2006/06/04(日) 16:50:02
本に書いてある通り。

991 :デフォルトの名無しさん:2006/06/04(日) 17:52:49
>>989
JavaとかC#の人?
::はスコープ解決、主に名前空間の中の名前にアクセスしたり、静的メンバにアクセスしたり。
->はポインタからの間接参照、p->xは(*p).xに等しい。

992 :985:2006/06/04(日) 17:53:58
>>988
ありがとうございます
ということは<>はSystem32フォルダとかから
ヘッダファイル探索するけど
""だとプログラムのカレントディレクトリから
探索を始めるということですね

993 :デフォルトの名無しさん:2006/06/04(日) 18:04:09
>>992 違う。 >>987 が正解。コンパイラのマニュアル見ろ。

994 :デフォルトの名無しさん:2006/06/04(日) 18:23:41
まぁ「「だいたいは」」<>がライブラリのヘッダで""が自分で作ったヘッダだな

995 :デフォルトの名無しさん:2006/06/04(日) 18:47:56
>>992
システムにもいろいろなシステムがある。

996 :デフォルトの名無しさん:2006/06/04(日) 20:21:32
コピーコンストラクタみたいに
オブジェクトのセマンティクスを考えて行うコピーとの対照で良く、
bitwise copyと言われる。

例えば、参照カウンタを持つオブジェクトへのポインタは、
bitwise copyするとオブジェクトの整合性を壊してしまう。

997 :デフォルトの名無しさん:2006/06/04(日) 21:10:51
それよりも誰か次スレ立てろ

998 :デフォルトの名無しさん:2006/06/04(日) 21:50:53
立ててみる

999 :996:2006/06/04(日) 21:51:57
>>997
それよりとはなんだズサー

1000 :デフォルトの名無しさん:2006/06/04(日) 21:52:40
ごめん。無理だった。

↓に避難。
【初心者歓迎】C/C++室 Ver.27【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1147183708/

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

253 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)