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


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

C++相談室 part54
1 名前:v(^・^)v :2006/10/30(月) 22:34:08
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE(VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

テンプレその他 >>2-15 付近参照

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

2 名前:v(^・^)v :2006/10/30(月) 22:34:41
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq-lite/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 http://www.cppreference.com/ (英語)
 http://www.cppll.jp/cppreference/ (↑の日本語訳だけど最新は反映しない)
[禿 Stroustrup]
 http://public.research.att.com/~bs/
[C++ International Standard]
 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/
  ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。

3 名前:v(^・^)v :2006/10/30(月) 22:35:03
■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/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4894714663/ (翻訳)
C++ Coding Standards
 ttp://www.amazon.co.jp/exec/obidos/ASIN/0321113586/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4894716860/ (翻訳)

4 名前:v(^・^)v :2006/10/30(月) 22:35:30
■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/

5 名前:v(^・^)v :2006/10/30(月) 22:35:50
■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

6 名前:v(^・^)v :2006/10/30(月) 22:36:12
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

7 名前:v(^・^)v :2006/10/30(月) 22:36:32
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/

8 名前:v(^・^)v :2006/10/30(月) 22:36:53
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/

9 名前:v(^・^)v :2006/10/30(月) 22:37:13
46 http://pc8.2ch.net/test/read.cgi/tech/1136690107/
47 http://pc8.2ch.net/test/read.cgi/tech/1139931895/
48 http://pc8.2ch.net/test/read.cgi/tech/1142423595/
49 http://pc8.2ch.net/test/read.cgi/tech/1146185570/
50 http://pc8.2ch.net/test/read.cgi/tech/1149427282/
51 http://pc8.2ch.net/test/read.cgi/tech/1153079297/
52 http://pc8.2ch.net/test/read.cgi/tech/1156525695/
53 http://pc8.2ch.net/test/read.cgi/tech/1159340181/

■関連スレ■
多すぎ。とりあえずスレタイ C++ で検索して。
以下、スレタイで見つからなさそうな関連スレ。

Boostを語れゴラァ part3
http://pc8.2ch.net/test/read.cgi/tech/1158991211/
GCCについて part7
http://pc8.2ch.net/test/read.cgi/tech/1145357824/

10 名前:デフォルトの名無しさん :2006/10/30(月) 22:38:15


11 名前:デフォルトの名無しさん :2006/10/30(月) 22:43:36
>>1
もつかれd。

12 名前:デフォルトの名無しさん :2006/10/30(月) 22:45:43
Boostつかうと一気に実行ファイルサイズが100倍に?!

13 名前:デフォルトの名無しさん :2006/10/30(月) 22:53:45
>Boostつかうと一気にコンパイル時間が100倍に?!
環境によるだろ。
俺はVC++に /Yc オプションを指定して、極力
プリコンパイルヘッダを使用するようにして使っているが、例えばboost::lambdaを
使っても使わない時と比べ10秒ほどしか増えない。

14 名前:デフォルトの名無しさん :2006/10/30(月) 23:05:37
STLつかうと一気に実行ファイルサイズが10倍に?!

15 名前:デフォルトの名無しさん :2006/10/30(月) 23:08:52
>>12
あれ?こんなのあったっけ?

16 名前:デフォルトの名無しさん :2006/10/30(月) 23:12:16
>>15
ないね

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

18 名前:デフォルトの名無しさん :2006/10/30(月) 23:17:47
#include <stdafx.h>
後死ね。

19 名前:デフォルトの名無しさん :2006/10/30(月) 23:18:31
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

20 名前:デフォルトの名無しさん :2006/10/30(月) 23:20:15
プリコンパイル済みヘッダ使っても
自作パーサとSpiritじゃマジでコンパイル時間100倍になるぜ。

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

22 名前:デフォルトの名無しさん :2006/10/30(月) 23:32:40
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

23 名前:デフォルトの名無しさん :2006/10/30(月) 23:36:23
template<C++相談室>は>>50まで続きます



                〜しばらくおまちください〜

24 名前:デフォルトの名無しさん :2006/10/30(月) 23:52:44
任意のタイミングでファイルオープンとファイルクローズが出来るデバックツール探してます。
CreateFileとかCopyFile等の動作チェック用です。
自分で作ってもいんですが、既に多機能な機能やグラフィカルなツールがあるかもしれないので探しています。
VisualStudioパッケージあるかもしれんがようわからん。
誰か知らないか?

25 名前:デフォルトの名無しさん :2006/10/30(月) 23:56:44
>>24
スレ違い。意味が分からんからどこ行っても答えは得られないだろうが。

26 名前:デフォルトの名無しさん :2006/10/31(火) 00:24:29
>>24
メモ帳

27 名前:デフォルトの名無しさん :2006/10/31(火) 01:57:43
;゚д゚)<ここまでテンプレ
                     Σ(゚Д゚;エーッ!!

28 名前:デフォルトの名無しさん :2006/10/31(火) 02:14:54
アフロいきまーす

29 名前:デフォルトの名無しさん :2006/10/31(火) 02:34:57
クラステンプレートにストリーム演算子をオーバーロードさせることは不可能なんですか?

30 名前:デフォルトの名無しさん :2006/10/31(火) 02:37:48
>>29
それだけ聞くとできそうに思う。
何故不可能だと思ったのかね?

31 名前:デフォルトの名無しさん :2006/10/31(火) 02:37:55
>>29
環境による

32 名前:デフォルトの名無しさん :2006/10/31(火) 03:19:33
>>29
こういうやつのことか?

template <typename T>
class A { public: T v; };

template <typename T>
std::ostream& operator<<(std::ostream& os, const A<T>& v)
{ return os << v.v; }


33 名前:デフォルトの名無しさん :2006/10/31(火) 15:14:17
>>32
その通りです

>>31
GCCだと単純に>>32のように書くとコンパイルエラーになります
Tの型が未決定なためエラーになるようです

なんかうまい方法はないでしょうか

34 名前:デフォルトの名無しさん :2006/10/31(火) 15:49:09
>>33
gcc-3.3.6, gcc-3.4.6, gcc-4.0.3, gcc-4.1.1 on Linux でコンパイル通るぞ。
コードの別のところの問題だろう。

手元で通したコード全文はこれ。

#include <iostream>
#include <ostream>

(ここに >>32 を入れる)

int main(void)
{
 A<int> a;
 a.v = 1;
 std::cout << a << std::endl;
 return 0;
}


35 名前:デフォルトの名無しさん :2006/10/31(火) 18:25:41
29ができないようでは、std::basic_stringが入出力できなくなる。
逆に言うとできないわけがない。

36 名前:デフォルトの名無しさん :2006/10/31(火) 23:29:17
class A{
int a
int b
std::string str;
};

class B{
int a
int b
vector<double>v_fat;
};

class C{
int a;
int b;
map<std::string, int>num;
};

こんな似た様なメンバを持つクラスをJavaのArrayListみたいに
扱いたいときはどうするのですか?Objectクラスみたいなのを
作ってキャストすればOK?

37 名前:デフォルトの名無しさん :2006/10/31(火) 23:34:29
boost::variantとか、boost::anyとか、下のページのようにとか。
ttp://www.ksky.ne.jp/~seahorse/cpp/virtualbase.html

どれにしてもテンプレートを使って、1つの型に押し込んでいることには違いない。

38 名前:デフォルトの名無しさん :2006/11/01(水) 01:42:08
>>36
共通部分を基底クラスにくくりだし、その基底クラスへのポインタの配列を作ればいい。
必要に応じて dynamic_cast する。しないでいい設計のほうが好ましいんだけど。

39 名前:デフォルトの名無しさん :2006/11/01(水) 01:49:07
>>37
そこの FruitItem は

template <class T>
class FruitItem : public Fruit, T {
public:
FruitItem() {}
FruitItem(const T& y) : T(y) {}
const char* color() const { return T::color(); }
};

としたほうがよさそうだな。

40 名前:デフォルトの名無しさん :2006/11/01(水) 18:03:37
template <class Target, class Source>
Target lexical_castSource arg)
{
    std::stringstream interpreter;
    Target result;

    if (!(interpreter << arg) || !(interpreter >> result) || !(interpreter >> std::ws).eof()) {
        throw bad_lexical_cast();
    }

    return result;
}
Exceptional C++ Style で上のような記述を見かけたのですが、
>!(interpreter >> std::ws).eof()
の部分は何を行っているのでしょうか?
std::wsというのは初めて見ました
検索しても関係ないページがヒットしてしまい意味がつかめません・・・

41 名前:デフォルトの名無しさん :2006/11/01(水) 18:49:39
>>40
C++標準ライブラリ
§13.1.5 マニピュレータ

wsはistreamに適用して、空白を読み飛ばす

42 名前:デフォルトの名無しさん :2006/11/01(水) 20:45:37
本体はどこで入手できますか?買うのでしょうか?

43 名前:デフォルトの名無しさん :2006/11/01(水) 21:12:53
本体とは?

44 名前:デフォルトの名無しさん :2006/11/01(水) 21:37:20
>>42
ttp://www.google.co.jp/

45 名前:デフォルトの名無しさん :2006/11/01(水) 21:44:59
Visual C++とかの書き込む奴です

46 名前:デフォルトの名無しさん :2006/11/01(水) 22:28:24
スレ違い

47 名前:デフォルトの名無しさん :2006/11/01(水) 22:47:11
ちょっとした質問です。

namespace A
{
 struct X {};
 void *operator new (size_t n, X&) { return 0; }
 void f()
 {
  X c;
  new (c) int; // ←ここ
 }
}

"ここ"で(size_t n, X&)に適合する呼出が見つかりませんと言われてしまいます。
ネームスペースAからグローバルスペース?に移すと難なく通ります。
operator new (...)で呼び出すとネームスペースから外さなくてもエラーになりません。
仕様でしょうか?

ちなみにVS2003です。


48 名前:デフォルトの名無しさん :2006/11/02(木) 00:05:40
質問です。

//敵の生成時に一時的に入れる変数と、敵をまとめて管理する変数
EnemyObj*       enemy;
vector<EnemyObj*>  EnemyArr;

//敵の生成時に呼ばれる関数
enemy = new Enemy1(arg_x, arg_y);
EnemyArr.push_back(enemy);

このようにした場合、例えばこれで敵を三体生成したとして、
(EnemyArr[0], EnemyArr[1], EnemyArr[2])
この中から

delete EnemyArr[1];

としてもオブジェクトが破棄されないので困っています。
一番最後に生成した物(この場合EnemyArr[2])なら破棄できるみたいなのですが・・・。
一体どうしたらいいでしょう。

49 名前:デフォルトの名無しさん :2006/11/02(木) 00:19:22
>>48
本当か?もう一度よく考えてみろ。

50 名前:デフォルトの名無しさん :2006/11/02(木) 00:21:32
>>49
えっと、それはどういう意味でですか?
「破棄できないはずはない」のか、「根本的なミスをしている」のか
どっちの意味でしょう。

51 名前:デフォルトの名無しさん :2006/11/02(木) 00:22:12
逆に聞くけど、破棄されてない事はどうやって確かめてるの?

52 名前:デフォルトの名無しさん :2006/11/02(木) 00:28:04
>>51
オブジェクトが普通に表示されたり、
deleteする前の値(位置情報 xやyなど)
をそのまま持っているかどうかで確認しています。

53 名前:デフォルトの名無しさん :2006/11/02(木) 00:29:46
>>48
> enemy = new Enemy1(arg_x, arg_y);
> EnemyArr.push_back(enemy);
原因の予感。push_back(const T&)じゃなかったか。
ゆえに、push_back(new Enemy1(arg_x, arg_y))で試してみて。

54 名前:デフォルトの名無しさん :2006/11/02(木) 00:34:07
>>52
それって、破棄したオブジェクトをそのまま使ってるんじゃないか?
erase()でvectorの方も縮めておかないとだめだろ。

55 名前:デフォルトの名無しさん :2006/11/02(木) 00:34:33
>>52
deleteしたからって中のデータは直ぐに破壊されん。
そんなん何の参考にならんし確認にもなってない。

56 名前:デフォルトの名無しさん :2006/11/02(木) 00:36:15
まあコンテナにポインタだけを入れるのなら、boost::ptr_vectorの方が
使いやすいぞ。erase()したら自動的にdeleteしてくれるしな。

57 名前:デフォルトの名無しさん :2006/11/02(木) 00:42:11
ちょっと状態遷移にそって処理を行いたいのですが解らないことがあります。
各個別は古典的にstateパターンで処理可能なルールとして実装できると思いますが
文脈を管理するためのクラスはどのように実現するのが一般的なのでしょうか?
ルールはR0 = Aから始まるとします。

A = B | C
B = a b c
C = a | b c
a = ...
b = ...

StateパターンでR0の状態を処理する。

58 名前:デフォルトの名無しさん :2006/11/02(木) 00:42:59
deleteしてもそのポインタの指してる先が0でクリアされるわけじゃないから
ポインタが指してる部分に情報が残ってるだけでは?
デストラクタにstd::cout << "Delete Enemy" << std::endl;って行を入れて動作を確認してみて。

59 名前:デフォルトの名無しさん :2006/11/02(木) 00:44:19
>>57が何を言いたいのか全然わからない

60 名前:デフォルトの名無しさん :2006/11/02(木) 00:45:17
>>54,55
成る程、そういうことでしたか。
eraseする前に破棄されてるか確認したかったのですが、
それでは意味がないですね。

>>53
結局破棄されてないと勘違いしただけだったみたいですが、
その記述で一時的な変数が必要なくなって助かりました。

>>56
そういう便利なものもあるんですね。
ちょっと調べてみたいと思います。

>>58
成る程、デストラクタに入れておけば破棄された確認になりますね。
やってみます。

61 名前:デフォルトの名無しさん :2006/11/02(木) 00:50:43
自分で書いてて意味不明だな。
とりあえず、文法を解析するときに
個別のルールはStateパターンで処理したいけど
文脈はどうやって処理すればいいのか思いつかないから助けて
ほしいだけかもしれない

62 名前:デフォルトの名無しさん :2006/11/02(木) 00:53:03
vectorにポインタを入れておいて、deleteした後その要素を使いたく
ないなら、0を代入しておく方法もある。vectorコンテナは要素数が
大きくなると、eraseにO(N)かかるので高くつく。そこでdeleteした要素
には0を入れておき、後で必要になったらまず0の入っている要素を
再利用するという方法もある。

もちろんプログラム側で要素に0が入っていたら処理をスキップする
必要があるが。

63 名前:デフォルトの名無しさん :2006/11/02(木) 00:54:59
>>61
まずデザパタに頼らず強引に文法解析の骨子を書いてみたら。
その後でStateパターンでまとめると綺麗にまとまるというだけの話。

64 名前:53 :2006/11/02(木) 00:56:07
>>60
ごめん俺が間違ってた。気にするな。
>EnemyObj*       enemy;
もちろんvirtualなデストラクタを持たせてるよね

65 名前:デフォルトの名無しさん :2006/11/02(木) 01:03:50
>>53
push_back(new ...) はあからさまに例外安全じゃないので考え直したほうがいい。

66 名前:デフォルトの名無しさん :2006/11/02(木) 01:20:55
>>58
破棄の確認が取れました。
ちゃんと破棄できていたようです。有難う御座います。

>>62
成る程、そういった利用方法もできるのですかぁ。
勉強になります。

>>64
持たせて破棄の確認をしました。
お騒がせしました。

>>65
それは
push_back(new ...)
にするより、元のコードのままの方がいいということですか?

67 名前:デフォルトの名無しさん :2006/11/02(木) 01:27:11
newが例外を投げる可能性があるからね。
コンテナに対する操作とは分離しておいた方がいいだろう。

それと、コンテナの要素にアクセスする方法が単なるラウンドロビン的な
方法のみで、ランダムアクセスをしないのであればstd::listの採用を考え
るのもよい。こちらはeraseしても反復子が無効にならない上、常にコストは
O(1)だから。

68 名前:デフォルトの名無しさん :2006/11/02(木) 01:27:12
>>47
new に対応する operator new はクラスのメンバとして宣言されたものか、
グローバルなものかのどちらかになる。 (5.3.4 9)

69 名前:デフォルトの名無しさん :2006/11/02(木) 01:28:15
>>67
問題は push_back() が例外を投げた場合なわけだが。

70 名前:デフォルトの名無しさん :2006/11/02(木) 01:29:52
>>66
元のコードも多分例外安全じゃない(いや、まcatchで適切にリソースの解体しているなら別だけど)

auto_ptr<Enemy>enemy(new Enemy(..));
EnemyAry.push_back(enemy.get());
enemy.release();

だいたいこんな感じで書けば例外安全。

71 名前:デフォルトの名無しさん :2006/11/02(木) 01:32:33
>>70
ちょwwwwそれやり過ぎww
まあ業務用ソフトならそこまでするのかもしれんけど

72 名前:デフォルトの名無しさん :2006/11/02(木) 01:40:29
>>67,70
うーむ、まだまだ未熟で理解できない点がありますので、
これから習熟していく上で徐々に理解していきたいと思います。
有難う御座いました。

73 名前:デフォルトの名無しさん :2006/11/02(木) 01:42:36
>>70は別にやりすぎとは思わないな
これくらいがふつう


74 名前:デフォルトの名無しさん :2006/11/02(木) 01:45:22
だよな。
いつの日か、こんなのがリークの原因になってしまったとしたら、見つける自信が無い。
最初に書くときに安全を確保してしまうのが吉。

75 名前:デフォルトの名無しさん :2006/11/02(木) 01:47:45
>>70
これって、もしEnemyAryがptr_vectorだったら例外安全難しくない?
1.
auto_ptr<Enemy>enemy(new Enemy(..));
EnemyAry.push_back(enemy.get());
enemy.release();
→enemy.release()が例外を投げるとptr_vectorとauto_ptrによる二重delete
2.
auto_ptr<Enemy>enemy(new Enemy(..));
EnemyAry.push_back(enemy.release());
→push_backが例外を投げるとリーク

76 名前:デフォルトの名無しさん :2006/11/02(木) 01:51:02
>>75
releaseは例外を投げなーい。
だから安心安心。

77 名前:デフォルトの名無しさん :2006/11/02(木) 01:58:46
>>75
prt_vector なら push_back(new ...) でいいだろ。 >>70 みたいな
コーディングを不要にするためのものなんだから。

78 名前:デフォルトの名無しさん :2006/11/02(木) 02:03:00
push_backが例外投げたらどうすんだよ!

79 名前:デフォルトの名無しさん :2006/11/02(木) 02:08:32
push_backって例外投げたっけ?

80 名前:デフォルトの名無しさん :2006/11/02(木) 02:08:38
>75
auto_ptr::release()は例外投げません……


81 名前:デフォルトの名無しさん :2006/11/02(木) 02:10:45
>>79
少なくともバッファが確保出来ないときは投げるんじゃない?

82 名前:デフォルトの名無しさん :2006/11/02(木) 02:11:44
>>79
配列の拡張時にメモリ確保失敗する可能性があるから投げると思うよ。
ちょっとソース見てくる。

83 名前:82 :2006/11/02(木) 02:21:02
見てきた。
>>77のいうようにptr_*系は直接push_back呼び出して問題ない。
というか内部でauto_ptrつかって実質的に>>70と同じ処理をやってる。
だから、むしろauto_ptr使うと例外時に2重開放になるから使っちゃ駄目。

例外発生時にはpush_backは何もしないと思ってたので、
勝手に引数の開放するのは予想外だったのでちょっと驚き。

これからはptr_*系をちょくちょく使っていくか......

84 名前:デフォルトの名無しさん :2006/11/02(木) 02:23:11
うげ、勝手に引数の状態変えるのかよ・・・

85 名前:デフォルトの名無しさん :2006/11/02(木) 02:29:03
そういえば、失敗したときに勝手に delete するんなら Strong guarantee とは
言えないな。

あれー?
http://www.boost.org/libs/ptr_container/doc/ptr_sequence_adapter.html#modifiers

86 名前:デフォルトの名無しさん :2006/11/02(木) 02:49:00
質問なんですが、関数の実引数や仮引数に auto_ptr<> を頻繁に使うことってあるんでしょうか?

87 名前:デフォルトの名無しさん :2006/11/02(木) 02:53:46
>>86
new したオブジェクトの所有権が関数をまたいで頻繁に移動するならそうなるだろう。

88 名前:デフォルトの名無しさん :2006/11/02(木) 03:22:22
>>87

なるほど。忘れていました。そうですよね。所有権が移動するから使えるんですか。
ありがとうございます。

89 名前:デフォルトの名無しさん :2006/11/02(木) 03:23:08
そもそもauto_ptrって頻繁に使いますか??

使わんとは言わんが、結局目の届く範囲においとかないと怖くて仕方ないので
エラー処理とかでdeleteまとめんのが面倒くさいとかの時くらいしか出番ないですよ。
叩いて叩いて。

90 名前:デフォルトの名無しさん :2006/11/02(木) 03:31:52
リソースリークを防止する一番簡単な方法がauto_ptr

91 名前:デフォルトの名無しさん :2006/11/02(木) 03:43:15
自前でdeleteする手間とほとんど変わらん、便利よりも不便のが増えるで、
あればあったで構わないけど積極的な使用を推奨する気にはなれん代物でFA。

92 名前:デフォルトの名無しさん :2006/11/02(木) 03:46:02
>>89
new があるところに auto_ptr あり。少なくとも new と同じぐらい使う。
boost 使ってるときは、ほとんどそっちになるけど。

93 名前:デフォルトの名無しさん :2006/11/02(木) 03:46:45
>>91
auto_ptr で増える不便って何?

94 名前:デフォルトの名無しさん :2006/11/02(木) 04:00:22
>>91
手動deleteで例外安全確保しようと思ったらauto_ptrの100倍は面倒だろ

95 名前:デフォルトの名無しさん :2006/11/02(木) 04:08:20
例外安全性なんて知ったことじゃありまっせん!

96 名前:デフォルトの名無しさん :2006/11/02(木) 06:42:13
例外発生時点でそこから先計算不能な状態なんで書き込みリソースくらいしか例外安全に気を遣わない。
つか例外でたらabortせざるをえない。


97 名前:デフォルトの名無しさん :2006/11/02(木) 09:30:17
>>68
遅くなりました。
ネームスペースに入れるとクラスのメンバのような扱いになっているって事ですか??
もう少しヒントを・・・

98 名前:デフォルトの名無しさん :2006/11/02(木) 10:44:22
>>96
あー、よく聞くな。そのいいわけ。

99 名前:デフォルトの名無しさん :2006/11/02(木) 10:45:53
>>97
new を使ったときにメモリ確保に使われる operator new の決定方法は規格で
決められているわけだが、(以下 >>68

100 名前:デフォルトの名無しさん :2006/11/02(木) 12:17:19
>>96
始皇帝氏って奴?

101 名前:デフォルトの名無しさん :2006/11/02(木) 15:17:56
template<class T> class Test
{
vector<T> array;
public:
vector<class T>::iterator getBeginIterator()
{
return array.begin();
}
};

こんなクラスを作ったのですが
main関数で
Test<unsigned char> test1;
vector<unsigned char>::iterator itr = test1.getBeginIterator();
とすると
main.cpp(37) : error C2440: '初期化中' : 'std::vector<_Ty>::iterator' から 'std::vector<_Ty>::iterator' に変換できません。
というエラーがでます。
どなたか原因がわかりませんか?

102 名前:デフォルトの名無しさん :2006/11/02(木) 15:26:26
>vector<class T>::iterator getBeginIterator()
typename std::vector<T>::iterator getBeginIterator()

103 名前:デフォルトの名無しさん :2006/11/02(木) 15:27:00
>>101
Tというclassとclass Tという先行宣言の差。
vector<class T>をvector<T>にすれば多分大丈夫

104 名前:デフォルトの名無しさん :2006/11/02(木) 15:50:06
>>83
push_back前の状態にロールバックするのが強い例外保証だからそれでいいんだよ。ていうか開放しないとリークしちゃうし。

newの戻り値をどっかに保存してたりするならそれはユーザー側の使い方が間違い。

abortするしかないとか言ってるやつは例外機構をメモリリーク防止くらいにしか思ってないんだろうなぁ。

105 名前:デフォルトの名無しさん :2006/11/02(木) 16:05:08
リークを防ぐために例外発生時にも、
引数のオブジェクトの所有権を奪うという副作用を行っているんでしょ?
その副作用のロールバックが出来ていないと思うけど、俺の解釈の仕方が間違っている?

いや、ま、利便性考えればこの仕様が自然なんだけどね。
例外時にいちいち開放したくないし。

106 名前:デフォルトの名無しさん :2006/11/02(木) 16:09:58
いや、コンテナにポインタを入れるという行為そのものが所有権の委譲なんだよ。

107 名前:デフォルトの名無しさん :2006/11/02(木) 16:11:31
すまん。今のなしorz

108 名前:デフォルトの名無しさん :2006/11/02(木) 16:17:12
問題は開放しないことにしてしまうと今度は基本的保証がされなくなってしまうことだね。強い保証がされてるかどうかは考え方の問題な気がする。

109 名前:デフォルトの名無しさん :2006/11/02(木) 16:22:42
>>98
仮想記憶無い環境だとnewできない時はもうどうしようもねぇんだよ。


110 名前:デフォルトの名無しさん :2006/11/02(木) 16:28:14
根本的には、
所有権の移動と配列の拡張という別個の事象を、
一つの関数で行うから、起きる問題だな。

stackのpop,topみたいに綺麗に二つに分けれると良いんだけど、
そもそも二つをくっつける為のptr_vectorというジレンマ

111 名前:デフォルトの名無しさん :2006/11/02(木) 16:36:24
int x[3] = {3,5,1};
vector<int> a(&(x[0]), &(a[2]) + 1);
a.sort(not2(less<int>() ) ); //

関数アダプタ not2() を入れた場合、エラーはでないのですが、実行した場合に強制終了となってしまいます。
なぜ、強制終了してしますんでしょうか?
ソフトはVC++EEです。

112 名前:デフォルトの名無しさん :2006/11/02(木) 16:37:23
>>111
&(x[0]), &(a[2])+1
 

113 名前:デフォルトの名無しさん :2006/11/02(木) 17:00:17
>>112
a(&(x[0]), &(x[2]) + 1);

です。

114 名前:デフォルトの名無しさん :2006/11/02(木) 18:20:38
std::vectorのメンバ関数にsortなんてあったっけ?

115 名前:デフォルトの名無しさん :2006/11/02(木) 18:24:40
>>114
少なくともうちのVC8には無い。
int x[3] = {3,5,1};
vector<int> a(&(x[0]),&(x[2])+1);
sort(a.begin(),a.end(),not2(less<int>()));//

ちなみにこれなら普通に実行できたが。
どこのvector使ってるんだろう?


116 名前:デフォルトの名無しさん :2006/11/02(木) 18:43:31
失礼しました。
listです。

117 名前:デフォルトの名無しさん :2006/11/02(木) 19:38:09
>>116
もう信用できない。問題の発生するコードをコピペしろ。

118 名前:デフォルトの名無しさん :2006/11/02(木) 19:50:31
#include "stdafx.h"
#include <list>
#include <functional>
#include <iostream>
using namespace std;
template<class InputIterator> void Display(InputIterator first, InputIterator last){
for(InputIterator i = first; i != last; i++)cout << *i << " ";
}
template<class T> struct MyGreater : public binary_function<const T, const T, bool> {
bool operator() (const T &t1, const T &t2) const { return t1 > t2;}
};
void main(){
int a[8] = {5,8,4,2,41,6,9,7};
int b[14] = {9,9,4,2,1,0,5,6,7,1,1,1,1,1};
list<int> lst1(&(a[0]), &(a[7]) + 1);
list<int> lst2(&(b[0]), &(b[13]) + 1);
list<int>::iterator w = lst1.begin();
advance(w, 3); lst1.splice(w, lst2);
Display(lst1.begin(), lst1.end());//3
lst1.sort(); Display(lst1.begin(), lst1.end());//4
lst1.sort(not2(greater<int>() ) );//-------ココです
Display(lst1.begin(), lst1.end());//5
}


119 名前:デフォルトの名無しさん :2006/11/02(木) 20:08:02
>>118
試したらデバッグモードのチェックで "invalid operator<" と言われたが、
「強制終了してします」ってのはこれのことか?

not(greater<int>()) つまり <= は比較関数に要求される
strict weak ordering の要件を満たさないってこと。

120 名前:デフォルトの名無しさん :2006/11/02(木) 20:15:33
not2(greater_equal<int>()かless<int>()つかえって話だな。

121 名前:デフォルトの名無しさん :2006/11/02(木) 20:21:56
>>119
>>120

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

122 名前:デフォルトの名無しさん :2006/11/03(金) 00:19:41
>>99
また遅くなってしまい、スイセン
理解しました。まさしく文章通りでしたね。
確かにnew ヘッダも定義はstdの外でやっていました。
これで納得して進めることが出来ます。どうも有難う御座いました。

123 名前:デフォルトの名無しさん :2006/11/03(金) 01:29:51
最近(というより数年前から)C++でもdoSomething()のような
Java風の命名を良く見かけるのですが、何か理由はあるのですか?

124 名前:デフォルトの名無しさん :2006/11/03(金) 01:31:10
>>123 名前付けた奴に聞けよ。

125 名前:デフォルトの名無しさん :2006/11/03(金) 01:41:46
>>123
バカは氏ね

126 名前:デフォルトの名無しさん :2006/11/03(金) 02:12:57
>>123
典型的なところで、XercesみたいにJava出身のライブラリは当然、Java風になるね。

127 名前:デフォルトの名無しさん :2006/11/03(金) 03:43:18
>>123
C++風の命名ってどういうものなんでしょう?
JavaからOOPL入ったので良くわかりません...

128 名前:デフォルトの名無しさん :2006/11/03(金) 03:48:05
C/C++
class_name
func_name
Java
ClassName
funcName
確かにJavaスタイルをよく見かける。このスレ(板)でも。


129 名前:デフォルトの名無しさん :2006/11/03(金) 04:20:34
それをC++風だとか、Java風とか分類するのがナンセンスなんだよ

130 名前:デフォルトの名無しさん :2006/11/03(金) 04:48:46
C/C++
fuck_cpp
Java
fuckJava

コーディングスタイルは他でやれよ

131 名前:デフォルトの名無しさん :2006/11/03(金) 05:14:52
確かに、最近WindowsAPI風の関数名をよく見るね

132 名前:デフォルトの名無しさん :2006/11/03(金) 05:21:23
それはDoSomething()
まあ、どうでもいいけどね

133 名前:101 :2006/11/03(金) 09:24:27
>>102, >>103 サンクス。
>typename std::vector<T>::iterator getBeginIterator()
でいけました。


134 名前:デフォルトの名無しさん :2006/11/03(金) 09:34:13
仮の型指定のあるテンプレート前方宣言はどう宣言したらいいのでしょうか?
仮の型指定がない次のような場合は通るのですが
template < typename _T > class A; // 前方宣言
typedef A< int > B;
template < typename _T > class A // 定義
{
};

main( void )
{
B b;
}

以下のケースのように定義側に仮の型指定がある場合の前方宣言の仕方がわかりません。

template < typename _T = int > class A; // 前方宣言 無理 ERROR
// template < typename _T > class A; // 前方宣言 無理 ERROR
// template < > class A; // 前方宣言 無理 ERROR

typedef A< > B;
template < typename _T = int > class A // 定義
{
};

main( void )
{
B b;
}


135 名前:デフォルトの名無しさん :2006/11/03(金) 09:55:10
>>93
> auto_ptr で増える不便って何?

頭悪い子が付いていけない。


136 名前:デフォルトの名無しさん :2006/11/03(金) 10:37:34
templateの機能を1から学ぼうと思うとどれ読めばいいの?
Moden C++とか読むと書いてあることは解るけどなんでそんなこと
思いつくのよこの変態とか思うわけで....

137 名前:デフォルトの名無しさん :2006/11/03(金) 10:39:28
書いてあることが分かるなら一から学ぶ必要は無い。

138 名前:デフォルトの名無しさん :2006/11/03(金) 10:57:52
>>137
いやそれだと狭い知識しかみにつかんからもし
機能を体系的に勉強できるような資料があればうれしいのよ

139 名前:デフォルトの名無しさん :2006/11/03(金) 11:02:23
>>138
lisp, Haskell, etc,,

140 名前:デフォルトの名無しさん :2006/11/03(金) 11:07:13
>>136
機能を学ぶ以前に、想像力(or創造力)を鍛えた方が医院で内科医?

141 名前:デフォルトの名無しさん :2006/11/03(金) 11:16:17
>>136
もう読んでいるのかもしれないけど、
>>4のC++ Templates

142 名前:デフォルトの名無しさん :2006/11/03(金) 12:11:56
このtemplateが永遠にコンパイルできません。助けてください

template<int Depth, int A, typename B>
struct K17 {
static const int x =
K17<Depth+1, 0, K17<Depth,A,B> >::x
+ K17<Depth+1, 1, K17<Depth,A,B> >::x
+ K17<Depth+1, 2, K17<Depth,A,B> >::x
+ K17<Depth+1, 3, K17<Depth,A,B> >::x
+ K17<Depth+1, 4, K17<Depth,A,B> >::x;
};
template<int A, typename B>
struct K17<16,A,B> {
static const int x = 1;
};
static const int z = K17<0,0,int>::x;

143 名前:デフォルトの名無しさん :2006/11/03(金) 12:16:47
K17<Depth,A,B>の中にK17<Depth+1, 0, K17<Depth,A,B> >::x があると
その実体化にまたK17<Depth,A,B>が必要になるから
struct A{ A a;};と同じことになるんじゃね?


144 名前:デフォルトの名無しさん :2006/11/03(金) 12:16:58
内部構造がスッタクオーバーフローしましたとかいう
意味不明なエラーが出て困ってます。

145 名前:デフォルトの名無しさん :2006/11/03(金) 12:22:06
たった7600億回インスタンス化するだけでスタックオーバーフローするって
やっぱC++って腐りきってるよね、C#とかJAVAがいいんだろうな

146 名前:デフォルトの名無しさん :2006/11/03(金) 12:26:35
>>145
5^16≒1526億回じゃなかろか?

147 名前:デフォルトの名無しさん :2006/11/03(金) 12:31:40
>>135
そうなると C++ 自体が使えないね。

148 名前:デフォルトの名無しさん :2006/11/03(金) 13:44:38
どっかで見たことあるいぢめテンプレートだな〜


149 名前:デフォルトの名無しさん :2006/11/03(金) 15:36:24
素直に関数型言語使えばいいじゃん。

150 名前:デフォルトの名無しさん :2006/11/03(金) 15:47:27
つ elisp

151 名前:デフォルトの名無しさん :2006/11/03(金) 17:06:07
>>142
ふつうに再帰関数でもフリーズ。
関数の呼び出し回数が190734863281回にもなるから当たり前だけどな

152 名前:デフォルトの名無しさん :2006/11/03(金) 17:09:38
そこでgotoですよ

153 名前:デフォルトの名無しさん :2006/11/03(金) 17:42:50
まぁC++は使えない言語だと証明されてしまったってことか

154 名前:デフォルトの名無しさん :2006/11/03(金) 18:08:54
RUBYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

155 名前:デフォルトの名無しさん :2006/11/03(金) 18:49:53
お前らがC++を使えないの間違いだろ。

156 名前:デフォルトの名無しさん :2006/11/03(金) 21:43:30
はっきり言ってC++は使えるか使えないかは2極化しやすいよね。

157 名前:デフォルトの名無しさん :2006/11/03(金) 22:13:34
何?他の言語ならそんなに呼び出しても大丈夫なの?w

158 名前:デフォルトの名無しさん :2006/11/03(金) 22:16:10
>>156
まったくできず挫折する人。
深く理解して高度に使いこなす人。
そして第3の勢力… 俺C++ばっちりだぜ、と言いつつ実はベターCとしてしか使ってない人。

159 名前:デフォルトの名無しさん :2006/11/03(金) 22:17:30
iostreamのマニピュレータの実装ってどうなってるんですか?


160 名前:デフォルトの名無しさん :2006/11/03(金) 22:19:36
ソース嫁

161 名前:デフォルトの名無しさん :2006/11/03(金) 22:22:27
>>160
概略だけでいいので…
それに、すぐにソース読めというのもあまり教育的ではないでしょう…

162 名前:デフォルトの名無しさん :2006/11/03(金) 22:22:46
>>158
C++をBetter Cとして使うのってCでゴリゴリ書くより楽じゃね


163 名前:デフォルトの名無しさん :2006/11/03(金) 22:37:04
>>161 独習C++の 9.1 独自マニピュレータの作成 とか

164 名前:デフォルトの名無しさん :2006/11/03(金) 22:38:35
>>163
dクス。明日本屋で立ち読みしてくる

165 名前:デフォルトの名無しさん :2006/11/04(土) 00:08:14
ベターCする人ってCだとメモリ管理ガタガタうるさいけど
C++で一時オブジェクト作るからやめればっていわれるとファビョる
え?え?え?なんでなんで問題ないでしょそんなのえ?え?え?え
おいおい勝手に言うなよじゃあ証拠見せろとふぁびょります
JISのC++企画書をサルでも解る日本語でいうとふーんまぁレアケースだね
とかほざきます助けてくださいもう死にたい

166 名前:デフォルトの名無しさん :2006/11/04(土) 00:12:45
>>165
遠慮無く死んでください

167 名前:デフォルトの名無しさん :2006/11/04(土) 00:13:06
お前も十分ファビョってるよ。

日本語学んでから書き込んでね。

168 名前:デフォルトの名無しさん :2006/11/04(土) 00:30:16
ふぅ、今日は冷えるな。
残念ながら暖房は無しだ。

169 名前:デフォルトの名無しさん :2006/11/04(土) 00:34:46
>>134
遅レスだけど、それ解決方法ないはず、
C++の継ぎはぎ構文の負の遺産の一つ。
構文解析の問題で、出来なければならないのに出来ない事例を集めたサイトがどこかにあったはず。

C言語のスーパーセットとして登場して十数年、
言語の拡張という意味ではC++はもういっぱいいっぱいです。


170 名前:デフォルトの名無しさん :2006/11/04(土) 00:36:57
十数年どころじゃなかったわ。
歳をとるわけだ。

171 名前:デフォルトの名無しさん :2006/11/04(土) 00:46:17
>>169
甘い。まだtr1が待っている

172 名前:デフォルトの名無しさん :2006/11/04(土) 00:50:27
>>134,169
何を問題としているのかわからない。
宣言と定義の両方にデフォルト引数指定してるから、
再定義でエラーになるってだけじゃないの?

173 名前:デフォルトの名無しさん :2006/11/04(土) 00:59:11
boost::spritの作り方解説してるところないでしょうか?
自分であれを作ってみたい

174 名前:デフォルトの名無しさん :2006/11/04(土) 00:59:18
>>172
通常、定義はサードパーティーやら何やらのヘッダに書かれていて手をつけれない。
これを前提にした場合。
定義ヘッダ側に仮引数がないテンプレートクラスの先行宣言は通るけど、
定義ヘッダ側に仮引数がある場合は先行宣言そのものが出来ないってこと。

175 名前:デフォルトの名無しさん :2006/11/04(土) 01:04:53
>>173 sprit? 作る?

176 名前:デフォルトの名無しさん :2006/11/04(土) 01:08:41
>>174
あーそういうことか。
でかいテンプレートコンポーネントの前方宣言は <iosfwd> みたいに
実装者が提供しないといけないってことになるかな。
覚えておこう。

177 名前:デフォルトの名無しさん :2006/11/04(土) 01:11:27
boost::spiritだぉごめんお

178 名前:デフォルトの名無しさん :2006/11/04(土) 01:18:34
そうだなぁ、まず禿げてみたらどうだい?

179 名前:デフォルトの名無しさん :2006/11/04(土) 01:19:24
>>174
×定義ヘッダ
○定義

×仮引数
○デフォルト引数

×テンプレートクラス
○クラステンプレート

△先行宣言
○前方宣言

たて続けに気になったんで、な。

180 名前:デフォルトの名無しさん :2006/11/04(土) 01:20:33
>>173
使い方の解説ならあるんだろうけど、作り方はないだろうなぁ。
ソース読めば。

181 名前:デフォルトの名無しさん :2006/11/04(土) 02:25:11
forward declaration の訳語って、公式なものは無いの?
前方宣言のほうが先行宣言より正しいような気はする。

182 名前:デフォルトの名無しさん :2006/11/04(土) 03:23:05
http://www.bohyoh.com/CandCPP/FAQ/FAQ00057.html
free(*ptr); なのか
free(ptr); なのかどっちですか?

183 名前:デフォルトの名無しさん :2006/11/04(土) 03:24:46
>>182
free(*ptr) じゃコンパイル通らんだろ。 free(ptr) だな。

184 名前:デフォルトの名無しさん :2006/11/04(土) 13:06:30
じゃあ何故 free(*ptr) と書かれてるんですか?
ここのptrはint **なんでしょうか

185 名前:デフォルトの名無しさん :2006/11/04(土) 13:18:47
>>184
誤記だろう。
ptr は int* のはず。

186 名前:デフォルトの名無しさん :2006/11/04(土) 13:40:28
ptrはvoid************:だぉwwwwwwwwwwwwwwwwwwww

187 名前:デフォルトの名無しさん :2006/11/04(土) 14:20:54
http://hp.vector.co.jp/authors/VA000092/jokes/strup.html

188 名前:デフォルトの名無しさん :2006/11/04(土) 14:54:02
>>187
もういいよ

現場で使う言語がC++なんだから・・・

189 名前:デフォルトの名無しさん :2006/11/04(土) 15:14:22
オブジェクト指向なんて意味ないからね

190 名前:デフォルトの名無しさん :2006/11/04(土) 15:36:22
>>190げt

191 名前:デフォルトの名無しさん :2006/11/04(土) 15:50:19
C/C++プログラマの休日の過ごし方について教えてください。

起床時間:
就寝時間:
食事:
行動:
など

192 名前:デフォルトの名無しさん :2006/11/04(土) 15:56:17
>>191
仕様なら仕様らしく書いてください
そんなのじゃ仕事できまんせ

193 名前:デフォルトの名無しさん :2006/11/04(土) 16:06:14
>>190
正直に聞くが其れをゲットしてうれしいか?


194 名前:デフォルトの名無しさん :2006/11/04(土) 16:35:01
>>191
さーて今起きたことだし、コンビニで弁当かってC++FAQでも読みながらたべよ

195 名前:デフォルトの名無しさん :2006/11/04(土) 16:55:15
どれ、ドラフト行ってくるか・・・今日も欝だ死のう

196 名前:デフォルトの名無しさん :2006/11/04(土) 18:33:49
ふぅ、禿に向かってお祈りしないと

197 名前:デフォルトの名無しさん :2006/11/04(土) 19:15:20
今日もSFINAEがコンパイル通らなかったなぁ・・・

198 名前:デフォルトの名無しさん :2006/11/04(土) 19:22:04
禿に餌やってきた。茄子が好物のようだ。
頭のテカりも良くなってきているから凶から茄子をやろう。うへへ。

199 名前:デフォルトの名無しさん :2006/11/04(土) 19:23:00
>>198
ちょっ!、意味もなく笑っちまったぢゃないか!


200 名前:デフォルトの名無しさん :2006/11/04(土) 21:06:58
http://www.open-std.org/jtc1/sc22/wg21/
News 2006-11-04: The C++ Standard Library Issues List (Revision 45) is available

201 名前:デフォルトの名無しさん :2006/11/04(土) 22:48:26
>>129
いやJavaには推奨される命名規則あるだろ。
C++には無いからどんなの?と聞いただけで。

202 名前:デフォルトの名無しさん :2006/11/04(土) 22:49:40
>>201
無いんだよ。わかってるじゃないか。

203 名前:デフォルトの名無しさん :2006/11/04(土) 23:11:45
C++やってて思うんだ
言語仕様を覚えようと必死な俺だが、
C++は道具であって目的じゃない。と

204 名前:デフォルトの名無しさん :2006/11/04(土) 23:44:13
>>203
C++の言語仕様を完全に把握しようというのは、とても難しいよね。
自分がやりたいことを実現するために必要な範囲を覚えたら、道具としては十分使える。
それで足りなくなったらまた覚えればいい。

知識が足りないうちは、大丈夫だと分かっていることだけを使おうとしても
知らずにまずい書き方をすることもあるだろうけど、
ある程度のレベルに達すれば、自分が大丈夫だと分かる範囲の機能だけを
正しく使えるようになると思う。


205 名前:デフォルトの名無しさん :2006/11/04(土) 23:51:15
>>201
boostをまねておけばいい
STLの実装はまねちゃ駄目だぞ

206 名前:デフォルトの名無しさん :2006/11/05(日) 02:36:48
>>202
>>123にあるような、数年前以前はどうなってたの?

207 名前:デフォルトの名無しさん :2006/11/05(日) 03:05:20
>>206
数年前も十年前も今でも、 C++ で推奨される命名規則など無い。
そして標準ライブラリの命名規則はずっとある。

何か不満か?

208 名前:デフォルトの名無しさん :2006/11/05(日) 03:10:16
>>206
>>128のC/C++風がほとんどだったと思う

209 名前:デフォルトの名無しさん :2006/11/05(日) 03:11:56
>>206
C++ Coding Standards: 0項の一部を勝手に要約。
「一貫性のある規約を自分で定義し管理せよ」

まあ世の流行ってのはあるが、関連がないなら合わせる意味はない。


210 名前:デフォルトの名無しさん :2006/11/05(日) 03:14:34
というか最早命名規則でどーのと悩む時間すら惜しいわけで…
>>209の言うとおり馴れたのがあればそれが一番適当だと思うな

211 名前:デフォルトの名無しさん :2006/11/05(日) 10:48:49
そんなわけで取り合えずJavaのに合わせてる俺がいきなり全裸。

212 名前:デフォルトの名無しさん :2006/11/05(日) 10:50:58
書く時の「指先の理想」と、読む時の「目の理想」はまた別なのが奥深い。
書く上ではShiftキーを押すのがどうも「踏み切り前の一時停止」みたいで野暮ったいw
だからアンダーバーもちょっと抵抗あって、hoge-fugaみたいに書けるLispのやり方が好き。
でもそれは、読む際の事情はまた別なんだよな。

213 名前:デフォルトの名無しさん :2006/11/05(日) 11:01:42
>>212
つまり、ほんの僅かな手間を惜しんで事故の可能性を増大させるわけですな。

214 名前:デフォルトの名無しさん :2006/11/05(日) 12:24:37
>>213
君、ちょっと読めなさすぎ。

215 名前:デフォルトの名無しさん :2006/11/05(日) 12:47:12
hogeクラスとfooクラスがあったとして

class foo
{
hoge *A;
void test();
}

void foo::test()
{
// Aの中身は0x00000000のまま
A->hoge_func();
}

でA::hoge_funcのなかではグローバルなりソースか、hoge_func内で宣言した
関数内のローカルなリソースしか使っていなくて、hogeクラスのメンバは一切使ってない
のですが、これってA->hoge_func読んだ時点でnull参照で落ちるんですよね???

VC2005でコンパイルしたんですが、これでずっと動いてたのですが、
デバッグで動かしてもちゃんとA::hoge_funcのなかに飛ぶので、不思議なのです。。
これは実は落ちないものなんでしょうか?

216 名前:デフォルトの名無しさん :2006/11/05(日) 12:48:17
↑AはInitInstanceでNULLに初期化されていました

217 名前:デフォルトの名無しさん :2006/11/05(日) 12:58:06
>>215
コンパイル時にクラスhogeのメンバ関数hoge_funcは解決されるから呼び出せる、ってだけじゃね?

218 名前:デフォルトの名無しさん :2006/11/05(日) 13:15:47
メモリが足りなくて困ってます。
ただ同じことを繰り返してるだけなので、
試行が終わるたびにテキストで出力すればあとは手作業で済ませます。
どうすれば、試行の度に出力することができますか?
ファイル名をその度に変える必要があるんどえしょうか?

219 名前:デフォルトの名無しさん :2006/11/05(日) 13:19:47
>>215
hogeの定義次第じゃね?

>>218
スレ違い。
アップローダにソースを載せて、初心者スレ辺りで質問しなおせば誰かヒントをくれるかもしれない。

220 名前:デフォルトの名無しさん :2006/11/05(日) 13:21:04
>>219
ありがとうございます

221 名前:デフォルトの名無しさん :2006/11/05(日) 13:35:31
>>217
そういうものなんでしょうか。コンパイル時の解決関係で調べてみます。

>>219
hogeはCDialogの継承クラスなんですが、そういうのも関係してるのかなあとか。。
自分が作ったんじゃないんですが、たぶんダイアログをリソースエディタで作ったときに
当時VC6.0でクラスの追加メニューで作ったんだと思います。。

222 名前:デフォルトの名無しさん :2006/11/05(日) 13:40:33
>>221
それは非仮想メンバ関数が第一引数の前にthisポインタを渡す関数として実装されることが多いからで(ry

223 名前:デフォルトの名無しさん :2006/11/05(日) 13:58:56
>>222
す、すいません、よく理解できませんでした。。
第一引数の前にthisポインタを渡す関数
というのは、第一引数を渡す前に、thisポインタを渡すので暗黙のうちに場所がわかるということでしょうか?
それはメンバ関数内で別の自分と同じクラスのメンバ関数呼ぶときに、実体を指定せずに関数名だけで呼べるみたいな
ことでしょうか?
しかし今回hogeの実体は一度も作られていないので、thisポインタすら無いように思います
fooのほうは、実体はあるのですが。。
なんか間違ってるかもしれません

224 名前:デフォルトの名無しさん :2006/11/05(日) 14:06:21
>>223
A->hoge_func()がhoge_func(A)に変わるとしたら
thisに0入ってるんじゃねーの?

225 名前:デフォルトの名無しさん :2006/11/05(日) 14:13:49
ますます意味がわからなくなってきました。勉強不足でスイマセン。
今手元にソースがないので来週試してデバッグしてみます。。

226 名前:デフォルトの名無しさん :2006/11/05(日) 14:14:18
>>215
未定義動作。修正必須。

227 名前:デフォルトの名無しさん :2006/11/05(日) 14:23:53
未定義だけど、コンパイラのおかげ??で偶然動いてるんですね。。
とりあえずロジックとしてはおかしい?とおもうのでとにかく直しておきます。
ありがとうございます。

228 名前:デフォルトの名無しさん :2006/11/06(月) 08:29:45
strdupってcでもc++でもfreeしなきゃダメなんですか?
deleteじゃダメですか?

229 名前:デフォルトの名無しさん :2006/11/06(月) 08:42:37
使っているCランタイムライブラリのドキュメントを読め

230 名前:デフォルトの名無しさん :2006/11/06(月) 14:54:23
>>228
deleteはnewされたオブジェクトに対してのみ。
strdup()は内部的にmalloc()を呼び出しているので、free()を使う。

231 名前:デフォルトの名無しさん :2006/11/06(月) 15:54:54
vectorに多数のクラスを格納した場合、クラスの中のメンバ変数を検索する場合どうしたらよいのでしょうか?

232 名前:デフォルトの名無しさん :2006/11/06(月) 16:13:57
>>231
for_each()って事?
添え字がわかっているならoperator[]でアクセスできるけど

233 名前:デフォルトの名無しさん :2006/11/06(月) 16:17:03
関係ないけどメンバ変数が降順もしくは昇順にソートされているなら
lower_bound()も使える。

234 名前:デフォルトの名無しさん :2006/11/06(月) 16:41:44
>>231

template< class T, typename V > struct my_predicate
: public binary_function< T, V, bool > {
 bool operator()( T const & t, V v ) const {
  /* TODO:比較処理 */
 }
};

...

vector<T> vt;
vector<T>::iterator it = find_if( vt.begin(), vt.end(), bind2nd(my_predicate<T,int>(),1) );


235 名前:デフォルトの名無しさん :2006/11/06(月) 16:45:27
ある値を使いたいのですが、その値を1.2.5.10.20.50.100.200・・・・のように
出力したいのですがそのようなプログラムになるのでしょうか?よろしくお願いします。

236 名前:デフォルトの名無しさん :2006/11/06(月) 16:47:56
>>235
質問が抽象的すぎ
ある値がどこにあるのかとか。
それ以前に丸投げってやつは(ry


237 名前:デフォルトの名無しさん :2006/11/06(月) 16:53:08
>>235-236
たとえばある一次式のxの値に1.2.5.10.20.50.100.200・・・・と順にその答えを出したいのですが、
1.2.5.10.20.50.100.200・・・・をどうやって出力するのかってことかな?

238 名前:デフォルトの名無しさん :2006/11/06(月) 16:54:25
単に、数字をピリオドで区切っていくつも出力したいだけなのでは・・・


239 名前:デフォルトの名無しさん :2006/11/06(月) 17:06:33
順番に出力だとちょっと面倒だなぁ

240 名前:デフォルトの名無しさん :2006/11/06(月) 17:10:39
単に{1,2,5}の配列に*10しつづけながら出力するだけじゃないの?

241 名前:デフォルトの名無しさん :2006/11/06(月) 17:13:03
考え方はそれで良いと思うけど、プログラムにするとちょい面倒・・・

242 名前:デフォルトの名無しさん :2006/11/06(月) 17:15:24
それのどこが面倒なのか

243 名前:デフォルトの名無しさん :2006/11/06(月) 17:25:51
よくわからないけどこういうこと?

#include <stdio.h>

void main(void){
int x[] = {1, 2, 5};
int i;

for(i = 1; 1; i *= 10)
printf("%d.%d.%d.", x[0]*i, x[1]*i, x[2]*i);
}

244 名前:デフォルトの名無しさん :2006/11/06(月) 18:43:29
struct c
{
c(){cout << "c ctor" << endl ;}
//c( const c &obj ){cout << "c copy ctor" << endl ;}
~c(){cout << "c dtor" << endl ;}
} ;

c func( c obj )
{
cout << "func" << endl ;
return (obj) ;
}

func( c() ) ;
と実行すると
c ctor
func
c dtor
c dtor
c dtor

//をとってコピーコンストラクタを実装すると
c ctor
func
c copy ctor
c dtor
c dtor

コピーコンストラクタの定義の有無で
デストラクタの呼び出し回数が変わるものなのでしょうか?

245 名前:デフォルトの名無しさん :2006/11/06(月) 18:53:08
>>244
きちんとした実験結果があるのになぜ質問しているのか不明ですが、
現に変わってるでしょう?

なぜこういう動作になるかは、コピーコンストラクタがある場合と無い場合とで
引数(と戻り値)の受け渡しがどう変わるかを調べればわかると思います。

246 名前:デフォルトの名無しさん :2006/11/06(月) 19:00:08
for(;;) {
printf("%d.%d.%d.", x[0]*=10, x[1]*=10,x[2]*=10);
}
のほうがよくね?

247 名前:デフォルトの名無しさん :2006/11/06(月) 19:48:05
>>244
コンパイラはコピーを最適化して除去できるので
変わっても不思議ではない。実際、GCCではどちらも2回だった

248 名前:デフォルトの名無しさん :2006/11/06(月) 21:10:23
C++関係のサイトをみていると
"Move Semantics"
という単語がでてくるんですが、コレは
std::auto_ptrの様にオブジェクトの所有権が移動する
事を指している
という認識でいいんですか?

249 名前:デフォルトの名無しさん :2006/11/06(月) 21:13:57
>>248
文脈にもよるけど、たぶんC++0xの機能のこと。
その機能の目的はauto_ptrのような所有権の移動を楽に記述するような機能と思えば大体OK

250 名前:デフォルトの名無しさん :2006/11/06(月) 21:25:54
>>249
ありがとうございます。
具体的にどういう仕組みかわからないので、ググってきます


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