C++相談室 part87

このエントリーをはてなブックマークに追加
1ゆとり
みなさん、こんばんわ、ゆとりです。
このスレはゆとりのためのC++相談室 part87です。

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

前スレ
C++相談室 part86
http://hibari.2ch.net/test/read.cgi/tech/1288976595/

http://hibari.2ch.net/test/read.cgi/tech/1289292155/l50
このスレもよろしくね。

ついでに壁紙にしてね。
http://www.research.att.com/~bs/Bjarne.jpg
2ゆとり:2010/12/09(木) 19:32:59
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 http://www.cppreference.com/ (英語)
 http://www.cppreference.com/wiki/jp/ (↑の日本語訳だけどまだ未完)
[Stroustrup大聖人]
 http://www2.research.att.com/~bs/
[C++ International Standard]
 http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110
[JTC1/SC22/WG21 - C++]
 http://www.open-std.org/jtc1/sc22/wg21/
  ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
[JIS X3014]
 http://www.jisc.go.jp/app/pager?id=15868
  ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
3ゆとり:2010/12/09(木) 19:34:23
■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 C++ Standard Library (STDCXX) http://stdcxx.apache.org/
 STLFilt http://www.bdsoft.com/tools/stlfilt.html
 (日本語) http://episteme.wankuma.com/stlprog/ (※1999年発行注意)
[Loki]
 http://sourceforge.net/projects/loki-lib/
 LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
4ゆとり:2010/12/09(木) 19:35:36
5ゆとり:2010/12/09(木) 19:37:03
■長いソースを貼るときはここへ。■
 http://codepad.org/
 http://ideone.com/

では、ゆとりの皆さん相談どうぞ。
6ゆとり:2010/12/09(木) 19:39:58
7デフォルトの名無しさん:2010/12/09(木) 20:27:06
おっつ
8v(^・^)v:2010/12/09(木) 21:01:22
STLつかうと一気に実行ファイルサイズが10倍に?!

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

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

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

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
9デフォルトの名無しさん:2010/12/09(木) 22:36:58
javaではpublic class{}と出来ますが、C++はクラスの修飾子が無いんですか?
10デフォルトの名無しさん:2010/12/09(木) 22:47:47
ありません
11デフォルトの名無しさん:2010/12/09(木) 23:04:13
名前空間が後付けだから必要なかったのかなー。
12デフォルトの名無しさん:2010/12/09(木) 23:11:40
enum A { a, b, c } に d を動的に増やすことはできますか?
13デフォルトの名無しさん:2010/12/09(木) 23:16:13
enumってコンパイル時定数だよね。
14デフォルトの名無しさん:2010/12/10(金) 00:39:08
gccで開発しているのですが、
コマンドライン引数をmain関数以外で取得する方法はありますか?
BCBのParamCount()のようなものを探しています。
15質問:2010/12/10(金) 00:40:53
VC++2005でコンパイルするとVC++2005再頒布可能パッケージがどうして必要になるのでしょうか?
16デフォルトの名無しさん:2010/12/10(金) 00:42:11
そういう仕様だから
17デフォルトの名無しさん:2010/12/10(金) 00:44:15
A n = (A)3;
18デフォルトの名無しさん:2010/12/10(金) 00:46:11
>>15
ランタイムライブラリを動的リンクしてるから
静的リンクすれば必要ない
19質問:2010/12/10(金) 01:02:00
>>16
無駄なレスで貴重なスレを消耗しないでください。
20デフォルトの名無しさん:2010/12/10(金) 01:12:14
>>19
>>1 スレ違い
21デフォルトの名無しさん:2010/12/10(金) 04:08:48
そういやいつの間にか>>8は1レスにまとめられるようになってたんだな
22デフォルトの名無しさん:2010/12/10(金) 10:42:46
てか>>8って毎度貼られるけど何なの?
part80くらいからしか見てないからわからん。
23デフォルトの名無しさん:2010/12/10(金) 11:31:41
>>22
かなり前に面白い流れだからって新スレを立てた人が次スレにも貼ったのが
始まりだったと記憶している
24デフォルトの名無しさん:2010/12/10(金) 12:52:49
過去ログを漁ってみた。

「STLつかうと〜」の初出が part16 (2003/02/21) で、 part17 にデジャブネタとして
コピペされたときにテンプレ指定され、隣接していた「C1010: プリコンパイル済みヘッダーの〜」の
くだりまでまとめて part18 で貼られ、その後長らくテンプレとして毎度貼られていた。
25デフォルトの名無しさん:2010/12/10(金) 12:56:44
同じように過去ログを、ぐぐるさんで調べてみた。
http://mimizun.com/2chlog/tech/pc2.2ch.net/tech/kako/1045/10457/1045746245.html
なんとか16を見つけたところだった。
26デフォルトの名無しさん:2010/12/10(金) 13:05:56
初代C++相談室のスレ建てが 2001/01/22 だった。
もうすぐ10周年になるようだ。
27デフォルトの名無しさん:2010/12/11(土) 12:58:14
wmain てマイクロソフトの拡張なんですか?
28デフォルトの名無しさん:2010/12/11(土) 16:47:55
はい
29デフォルトの名無しさん:2010/12/11(土) 20:01:50
整数型なんですけど、-1,0,1のようにある特定の範囲以外を代入しようとするとエラーを吐くような型(クラス)を作りたいのです
どうすればよいでしょう?
30デフォルトの名無しさん:2010/12/11(土) 20:10:30
クラスに Set用の関数とget用の関数つくるしかないんじゃね?
31デフォルトの名無しさん:2010/12/11(土) 20:14:11
class Int
{
public:
int operator =( int val ){ return this->val = val; }
private:
int val;
};

これでなんとかしろ
32デフォルトの名無しさん:2010/12/11(土) 20:17:32
operator int(){return val;}も必要じゃね?
33デフォルトの名無しさん:2010/12/11(土) 20:26:22
34デフォルトの名無しさん:2010/12/11(土) 21:14:23
ttp://cpplover.blogspot.com/2010/12/stdsizet.html
sizeof演算子の戻り値の型は、std::size_t型であるとされている。
std::size_tは、ライブラリ18.2[support.types]で定義されている。
そこでは、size_tはC規格で定義されているとしている。
C規格では、size_tはsizeof演算子の結果の型であると定義されている!



要するに、何型なの?
35デフォルトの名無しさん:2010/12/11(土) 21:25:23
コンストラクタ/デストラクタで特に何もしないときに、
わざわざコンストラクタ/デストラクタを宣言しますか?
36デフォルトの名無しさん:2010/12/11(土) 21:25:46
>>34
The value of the result of both operators is implementation-defined, and its type (an
unsigned integer type) is size_t, defined in <stddef.h> (and other headers).

要するに処理系定義の符号なし整数型
37デフォルトの名無しさん:2010/12/11(土) 21:51:04
inlineを付けると関数呼び出しのオーバーヘッドが減るらしいですね
でも、インラインと非インラインの関数の違いがイメージ出来ません

説明お願いします
38デフォルトの名無しさん:2010/12/11(土) 21:56:53
int i = 0;
++i;
これと
void increment(int& i) { ++i; }
int i = 0;
increment(i);
これ
どっちも同じことしてるけど後者の方が遅いっていうのは分かるよな?
それでinlineを付けるとコンパイル時に前者に置換されるわけだ
3937:2010/12/11(土) 22:13:18
>>38
理解できました
ありがとうございます
40デフォルトの名無しさん:2010/12/11(土) 22:17:20
>>38
> どっちも同じことしてるけど後者の方が遅いっていうのは分かるよな?
わかんねーだろjk

37 も何納得してんだ。

アセンブリレベルのコードで比較しないと意味無い。
41デフォルトの名無しさん:2010/12/11(土) 22:18:43
>>40がアセンブリレベルのコード比較でinlineがどんなものか教えてくれるらしいぞ
42デフォルトの名無しさん:2010/12/11(土) 22:18:47
普通にわかったけど
43デフォルトの名無しさん:2010/12/11(土) 22:33:11
関数呼び出しがなくなる分
スタック積む?処理がなくなるから
オーバーヘッドがなくなるってことなんじゃないの?

C++ はじめてまだ15分ほどなんでよくわからないですけど。
Cは未経験です。
童貞って意味じゃないです。
いや、まぁ童貞なんですけどね。
44デフォルトの名無しさん:2010/12/11(土) 23:15:31
>>29
目指しているものと一致してるかはわからんが
演算子をオーバーロードして範囲チェックを行うやり方があるね
範囲そのものはポリシーで挿げ替えるという実装
オライリーの本だかに載ってたと思う
45デフォルトの名無しさん:2010/12/12(日) 00:44:41
>>36
ありがとうございます。
46デフォルトの名無しさん:2010/12/12(日) 01:14:03
>>39
おいおい安易に納得するな
inlineはregister指定と同じで、コンパイラはこれを無視する事が出来る
本当にインラインになっているかどうかは>>40の言う通りで逆アセンブル
画面を出して見てみないと分からないぞ
47デフォルトの名無しさん:2010/12/12(日) 01:15:04
だれもそういうことを聞いているんじゃないんだよね。
48デフォルトの名無しさん:2010/12/12(日) 02:03:42
>>38
これ見て後者が遅いと思い込むなんてのは、 for の中で変数宣言したら
遅くなるから外で(なんならグローバルで)とか言うのと同じような勘違いだ。
C++ 上の字面とパフォーマンスを直結させるべきじゃない。
49デフォルトの名無しさん:2010/12/12(日) 03:30:57
>>47
必ずinline展開されると思い込んでいる馬鹿もどうかと思うけどね
50デフォルトの名無しさん:2010/12/12(日) 03:43:34
誰がそんなこと言ってるんだ?
51デフォルトの名無しさん:2010/12/12(日) 10:20:09
現代のコンパイラは最適化の上ではinlineキーワードの有無をほぼ確実に無視する。
inlineはリンカに関数定義の重複を無視するように指示するものだと考えた方が
実用上は便利だ。
52デフォルトの名無しさん:2010/12/12(日) 10:48:55
inline展開の早くなる仕組みを聞いてるのに実際展開されるかどうかは別の問題なんだよね
53デフォルトの名無しさん:2010/12/12(日) 10:55:58
>>48
質問の意図を履き違えて関係ないことをべらべら喋り出すアホの典型
54デフォルトの名無しさん:2010/12/12(日) 13:47:58
class Super {
string &m_str;
public:
Super(string &s) : m_str(s) {};
}

class Sub : public Super {
public:
Super(): Super("string") {};
}

スーパークラスの&m_strを使う事は危険ですか?
55デフォルトの名無しさん:2010/12/12(日) 13:56:59
>>54
そもそもprotectedでないと派生からはm_strは使えない
それとなぜに参照?""で渡すと
一時オブジェクトが破棄されて存在しないものの参照が出来上がるんじゃないか?
5654:2010/12/12(日) 14:11:20
>>55
結局、ダメってことですね
感謝
57デフォルトの名無しさん:2010/12/12(日) 14:12:20
class SubにSuper()ある
5854:2010/12/12(日) 14:32:54
std::string &s = std::string("hellow");
って怒られるんだね
知らなかった
59デフォルトの名無しさん:2010/12/12(日) 14:54:14
コンパイルしてから聞けよ
60デフォルトの名無しさん:2010/12/12(日) 15:03:45
>>59
したよ
61デフォルトの名無しさん:2010/12/12(日) 15:05:44
const string&s なら一時変数も束縛できる、って知ってたよな
62デフォルトの名無しさん:2010/12/12(日) 15:22:52
これどこ間違ってるん?表示が滅茶苦茶なんだが

class Super {
protected:
const std::string& m_str;
void write() const {
std::cout << m_str << std::endl;
}
public:
Super(const std::string& s) : m_str(s) {};
};

class Sub : public Super {
public:
Sub() : Super(std::string("string")) {};
void write() const {
Super::write();
}
};

int main()
{
Sub* s = new Sub;
s->write();
delete s;
}
63デフォルトの名無しさん:2010/12/12(日) 15:26:42
>>46
そういえばコンパイラが無視していいものの中には volatile もあるな

>>51
単一定義規則は inline がついていても見逃してもらえないぞ
64デフォルトの名無しさん:2010/12/12(日) 16:05:40
>>62
class Superのm_strが束縛する責任があるのはコンストラクタのsのみ
コンストラクタのsを束縛する必要があるのはSubのコンストラクタの一時変数のstringのみ
したがってm_strはSubのstringを束縛する責任がない

つまり、Superのコンストラクタの実行が完了した時点でSubのstringの一時変数は解体
されてしまうので、m_strの参照は実体が無くなる

これを防ぐには

class Super {
protected:
const std::string m_str; // 参照にしない
void write() const {
std::cout << m_str << std::endl;
}
public:
Super(const std::string& s) : m_str(s) {}
};

のようにコピーを保持しなければならない
65デフォルトの名無しさん:2010/12/12(日) 16:10:12
>>64
なるほど、const参照のconst参照という風に2段以上に重ねると
問題が生じるようですね

これは盲点でした

これから気を付けます
ありがとうございました
66デフォルトの名無しさん:2010/12/12(日) 19:12:28
何を面白いことを言っているのだ。

Super s ( std::string("string") );

の時点でアウトなんだよ。
SuperとかSubとか書いてたり、仮想関数を知らなかったりするあたりJava使いだと思うんだが、
Javaの発想は全部捨てないとCやC++はぜんぜん挙動が違うぞ?
67デフォルトの名無しさん:2010/12/12(日) 20:11:51
>>63
volatile は無視しちゃいかんだろう。
inline で単一定義規則の制限が少し楽になるのは確かだろう。
68デフォルトの名無しさん:2010/12/12(日) 20:13:34
>>66
なんでアウトなんだよ
ただの一時オブジェクトじゃないか
それに今回は仮想関数は必要ないだろう
69デフォルトの名無しさん:2010/12/12(日) 20:15:28
>>68 >>62 の状態での話だろう。
70デフォルトの名無しさん:2010/12/12(日) 20:19:48
>>69
だから具体的にどうアウトなんだよ?
71デフォルトの名無しさん:2010/12/12(日) 20:21:56
>>70
一時オブジェクトを指して初期化された参照は、 Supuer の初期化が完了した時点ではすでに
無効になっている。 >>66 にある初期化の後、 s を使ったあらゆる操作が未定義動作になりうる。
72デフォルトの名無しさん:2010/12/12(日) 20:22:42
>>71
だからお前の言ってる事は>>64で全部書いてあるだろう
なぜ同じ事を二度も言うんだ?
73デフォルトの名無しさん:2010/12/12(日) 20:23:48
>>65 が「なるほど」とか言いながらさっぱり理解してないからだろう。
74デフォルトの名無しさん:2010/12/12(日) 20:26:07
>>73
どうして>>65が「さっぱり」理解してない事がお前にわかるんだ?
75デフォルトの名無しさん:2010/12/12(日) 20:29:46
>>74
65 が理解している問題発生の条件は「const参照のconst参照という風に2段以上に重ねると」
となっているが、実際には2段重ねなくたって同じ問題は発生する。

struct S { std::string const& s } s = { std::string("string") };
76デフォルトの名無しさん:2010/12/12(日) 20:30:44
>>75
だったら最初からそのようにシンプルに書けばいいだろう
ネチネチと厭らしいんだよてめえの書き方は
77デフォルトの名無しさん:2010/12/12(日) 20:32:34
>>75
だいたいコンパイルが通らないコードを書いてどうするつもりなんだよ?
78デフォルトの名無しさん:2010/12/12(日) 20:34:11
>>74 そうだな。すまんかった。
79デフォルトの名無しさん:2010/12/12(日) 20:35:30
>>77 そうだな。すまんかった。
#include <string>
struct S { std::string const& s; } s = { std::string("string") };
80デフォルトの名無しさん:2010/12/12(日) 20:38:27
>>79
「コンストラクタがありません」と言われますけど?
81デフォルトの名無しさん:2010/12/12(日) 20:44:01
>>80
codepad では通るようだが、環境は?
http://codepad.org/WVPBNYkZ
82デフォルトの名無しさん:2010/12/12(日) 20:49:11
>>81
BCC(ECC)6.3.1だ

エラーメッセージは「リファレンス メンバ 'S::s' があるクラスにコンストラクタがない」だ
当然だと思うが?
gccの拡張だろう
83デフォルトの名無しさん:2010/12/12(日) 20:51:31
>>62は継承とか使っているが、根本的に
一時オブジェクトと参照がどういうもかと言う基礎的ことを知らないってのが原因じゃね
恐らく、>>62はポインタ使ったのでも一時オブジェクトを気合を入れて指すコード書くんだろうな
84デフォルトの名無しさん:2010/12/12(日) 20:52:29
>>83
だからお前のは単なる憶測に過ぎないから
なんでそう自分の価値観を人に押しつける?
うぬぼれが強すぎるんと違うか?
85デフォルトの名無しさん:2010/12/12(日) 20:57:28
>>82
codepad は -std=c++98 -pedantic-errors だから gcc 拡張の線は薄いな。
http://codepad.org/about

暗黙宣言のデフォルトコンストラクタが使われれば暗黙定義で S::s が初期化されて
いないことが問題になるだろうが、この例では { ... } による初期化が行われているので
問題にならないほうが正しいと思う。
86デフォルトの名無しさん:2010/12/12(日) 21:10:40
>>85
§12.6
4 If a given nonstatic data member or base class is not named by a mem-initializer-id (including the case
where there is no mem-initializer-list because the constructor has no ctor-initializer), then
? If the entity is a nonstatic data member of (possibly cv-qualified) class type (or array thereof) or a base
class, and the entity class is a non-POD class, the entity is default-initialized (8.5). If the entity is a nonstatic
data member of a const-qualified type, the entity class shall have a user-declared default constructor.
? Otherwise, the entity is not initialized. If the entity is of const-qualified type or reference type, or of a
(possibly cv-qualified) POD class type (or array thereof) containing (directly or indirectly) a member of
a const-qualified type, the program is ill-formed.

お前さんの言っている事はデタラメである事がはっきりしている
87デフォルトの名無しさん:2010/12/12(日) 21:15:11
>>86
念のためにこれも付け加えておくか

After the call to a constructor for class X has completed, if a member of X is neither specified in the
constructor’s mem-initializers, nor default-initialized, nor value-initialized, nor given a value during execution
of the body of the constructor, the member has indeterminate value.

はっきりと「メンバの値は不定」と書いてあるだろう

つまりgcc拡張である事が明らかだ
88デフォルトの名無しさん:2010/12/12(日) 21:15:25
>>86
いや、だからさ、それは暗黙定義のデフォルトコンストラクタで問題になるわけで、
>>79 では暗黙定義のデフォルトコンストラクタは使われていないから問題ないだろ。
89デフォルトの名無しさん:2010/12/12(日) 21:18:29
>>88
お前英語が読めないんだろう

the program is ill-formed.

の意味が分かるか?
リファレンスをメンバに持っていてそれがコンストラクタで初期化されない時は
そのプログラムは不適格とすると書いてあるだろう

つまりコンパイルが通らないので正しいわけだ
90デフォルトの名無しさん:2010/12/12(日) 21:21:53
>>87
それも関係ない。参照型メンバは初期化リストで初期化されなければコンパイルエラーに
なるから、当該のコンストラクタが実行されることもないし、もちろん完了することも無い。
91デフォルトの名無しさん:2010/12/12(日) 21:23:02
>>89
コンストラクタ定義の中で >>86 の条件に合えば ill-formed なんだよ。
>>79 では問題のコンストラクタ定義が無い。

何度言わせるんだ?お前は日本語が読めないのか?
92デフォルトの名無しさん:2010/12/12(日) 21:27:15
>>91
もう好きなようにしろ
規格を呈示しても難癖付ける奴にはもう言う事はないよ
自分独自の世界でプログラムでもしてろ
93デフォルトの名無しさん:2010/12/12(日) 21:31:22
>>92
規格を提示って言っても、関係ないところ提示されて話になるわけないだろ。
94デフォルトの名無しさん:2010/12/12(日) 21:32:40
最後に一つ
「英語が読めない奴はJIS規格でも読んでろ」
95デフォルトの名無しさん:2010/12/12(日) 21:35:47
英語の規格がちゃんと読めてもダメな人ってのはいるもんだな。
96デフォルトの名無しさん:2010/12/12(日) 21:43:03
>>81をVC2005でやったがコンパイル通った
よく分らんが、
struct S { std::string const& s; } s = { std::string("string") };は
"{" std::string("string") "}";
{}あるからSはクラスじゃなくC的な構造体ととらえられてるんじゃない?
C++のstructはpublic class扱いのみで、データをまとめるC的structとしては扱えないの?
クラス扱いでs = { std::string("string") }; はありえる?
9766:2010/12/12(日) 21:44:53
こんばんわ。java厨のガラスのハートに傷をつけてしまいましたか?w

>なるほど、const参照のconst参照という風に2段以上に重ねる

これに対して「何を面白いことを」ですよ^^
>>64のいってることはあってますよ^^
98デフォルトの名無しさん:2010/12/12(日) 21:47:25
>>96
> {}あるからSはクラスじゃなくC的な構造体ととらえられてるんじゃない?
逆。 aggregate として扱われているから { ... } による初期化ができる。

> C++のstructはpublic class扱いのみで、データをまとめるC的structとしては扱えないの?
問題なく扱える。

> クラス扱いでs = { std::string("string") }; はありえる?
あり得る。


エラーが発生しているのは BCC(ECC) のバグ。
99デフォルトの名無しさん:2010/12/12(日) 22:06:01
参照メンバを持つクラスの集成体で初期化とかやったことないな
100デフォルトの名無しさん:2010/12/12(日) 22:32:19
参照メンバというのが実用上あまり使わない →過剰なポインタ嫌悪の権化
Cスタイルの初期化でコンストラクタとかもう聞いただけで汚らわしい
101デフォルトの名無しさん:2010/12/12(日) 22:39:15
集約の規則に参照型のデータメンバがあっちゃだめって規定はないから問題なし。
むしろ、ユーザー定義のコンストラクタがあるほうがだめ。
102デフォルトの名無しさん:2010/12/12(日) 23:17:22
>>101
それはstructの時だけだよね
classでできる?
103デフォルトの名無しさん:2010/12/12(日) 23:23:37
>>102 class { public: .. } とすれば同じこと。
104デフォルトの名無しさん:2010/12/12(日) 23:24:34
>>103
public:の時だけだよねやっぱり
105デフォルトの名無しさん:2010/12/12(日) 23:28:51
集約の規定に「privateまたはprotectedの非静的データメンバを含まないこと」ってある。
classかstructであるかは問題ではない…が、結局いっしょ。
10696:2010/12/13(月) 00:34:59
>>98 トンクス
aggregateって知らない言葉に戸惑ったが、配列初期化の
int array[3] = {1,2,3}; と同じ{}ってことか
int array[3]がaggregateだから{}で初期化ができると
aggregateはここが参考になった
http://www.bohyoh.com/CandCPP/FAQ/FAQ00067.html

BCC、ダメポ
107デフォルトの名無しさん:2010/12/13(月) 00:49:40
まぁ、BCCは準拠度低過ぎで随所でダメだしされてるわね。
テンプレート使うと大爆発するし。
108デフォルトの名無しさん:2010/12/13(月) 01:21:14
規格を晒してキリッと断言してる人、道化師でワロタ
109デフォルトの名無しさん:2010/12/13(月) 05:04:11
switchのなかにswitchってぱっと見でごちゃっとしてて見にくいけど、
普通にやってることなんだよね?
110デフォルトの名無しさん:2010/12/13(月) 08:17:27
普通にってほどじゃないけど、まぁある。
関数化すれば?
111デフォルトの名無しさん:2010/12/13(月) 09:43:21
bccとか使ってる人いまだにいるんだ
112デフォルトの名無しさん:2010/12/13(月) 13:30:03
自らの意思で選んでいる人もいるし
組織の力学で決まってしまっている人もいる
113デフォルトの名無しさん:2010/12/13(月) 15:00:18
constでないstd::vectorインスタンスを途中からconst扱いに変えることはできますか?
初期値を代入した後は変更できないようにしたいんですが。

std::vector<int> foo;
for(int i=0; i<n; i++){ foo.push_back( hoge(i) ); }
const std::vector<int> bar = bar; //←コンパイルエラー(当然か)


一旦 std::vector<int> temp; あたりに初期値を作って
const std::vector<int> bar = temp;
とかやるしかないでしょうか?
114デフォルトの名無しさん:2010/12/13(月) 15:31:45
変えたいと思ったあたりを関数化できないか検討してみる。
だめなら、その方法しかないかなと。const参照にすればいいよ。
115デフォルトの名無しさん:2010/12/13(月) 15:35:48
>>113
vectorをメンバに持ち、const参照を返すメンバ関数とコンストラクタのみをpublicに持つクラスでも作れば。
116デフォルトの名無しさん:2010/12/13(月) 16:14:02
初めからconst付きにして、初期値を入れるときだけconst_castする
117113:2010/12/13(月) 18:10:50
>>114-116

アドバイスありがとうございます。

const_castが最小限の変更ですっきり書けそうですね。
多用して慣れきっちゃうのも怖いですけど。

それぞれ試してみます。参考になりました。
118デフォルトの名無しさん:2010/12/13(月) 22:20:59
揚げ足取りだけど、constで「定義」されたものをconst_castして状態を変更
したら規格的には未定義動作になるお。
std::vector について言えば多分平気だと思うけど
119デフォルトの名無しさん:2010/12/13(月) 22:37:41
C++0xではconst な vectorメンバを定義する新しいコンストラクタの記述法が導入されるとかされないとかビッグなうわさがあったと思うんだけど・・・どうだっけ?
120デフォルトの名無しさん:2010/12/14(火) 01:39:41
const std::vector<int>bar = std::move(foo);
でいいじゃん
121デフォルトの名無しさん:2010/12/14(火) 01:45:42
>>119 今でも普通にできるんだから、何か勘違いしてるんだろう。
122デフォルトの名無しさん:2010/12/14(火) 02:09:40
static const mapとかは初期化がめんどいけど、それが解消されるという話があったかもしれない
123デフォルトの名無しさん:2010/12/14(火) 09:24:56
巨大なルックアップテーブルを static const map で書ければいいなあ。実行時にせこせこ代入していく生活はやめたい。
124デフォルトの名無しさん:2010/12/14(火) 09:30:58
0xなら楽勝
125デフォルトの名無しさん:2010/12/14(火) 09:32:06
テンプレートでmapって作れんのかな
作れそうだけどすごいめんどくさそうだな
126デフォルトの名無しさん:2010/12/14(火) 19:33:01
mapってテンプレートじゃね?
127デフォルトの名無しさん:2010/12/14(火) 20:12:03
巨大なテーブルをstd::mapで作りたくはないな。std::lessでキーの比較してるだけでしょ。
やっぱ連想配列はハッシュしてからless比較だべ。
128デフォルトの名無しさん:2010/12/14(火) 20:15:03
unordered_mapでやれ
129デフォルトの名無しさん:2010/12/14(火) 20:44:50
typedef Map<
1, 5,
4, 6,
...
> map;

cout << get<map, 4>::value; // 6

こんな感じならできそうだけど、整数だけ扱えてもあんま嬉しくないよなぁ
130デフォルトの名無しさん:2010/12/14(火) 22:10:22
0xのstd::arra::operator[]ってvectorと同じく範囲チェック無いのな。
今時、範囲チェックぐらい全部入れろよと思う。ar.at(16) = 100なんて書いてられん。
せめて天ぷら引数で範囲チェックありなしのポリシーを指定するとか考えなかったのか。
131デフォルトの名無しさん:2010/12/14(火) 22:14:19
それぐらい自前でやるかat使え低能
132デフォルトの名無しさん:2010/12/14(火) 22:30:56
at()は典型的な例外の誤用だろう。配列の添字のチェックなんてことはassert()でやるのが筋だ。
133デフォルトの名無しさん:2010/12/14(火) 22:32:46
operator[]の範囲チェック無いのは0xじゃなくても結構あるな。くそったれが。
134デフォルトの名無しさん:2010/12/14(火) 22:36:44
なんでそんなにコストを増やしたがってるのか分からん。配列にアクセスするたびに範囲チェックされるとか考えたくもない
135デフォルトの名無しさん:2010/12/14(火) 22:37:34
Releaseビルドではオフになればいいだけだろが
136デフォルトの名無しさん:2010/12/14(火) 22:37:54
>>133
お前が糞
137デフォルトの名無しさん:2010/12/14(火) 23:03:02
範囲間違えてアクセスするような人はC++向いてないのでRubyでもつかっててください
138デフォルトの名無しさん:2010/12/14(火) 23:07:37
で、でたー!バグは出さなければいい理論!
139デフォルトの名無しさん:2010/12/14(火) 23:09:55
範囲チェックでパイプラインが詰まったとして、それが一体何ナノ秒のロスなんだよ。
コストが本当に問題なら先頭要素のアドレス取ってポインタで操作するのが当たり前だろ?
危険な動作をデフォルトにするんなんて、今時の言語からしたら仕様のセンスが疑われる。
140デフォルトの名無しさん:2010/12/14(火) 23:10:54
>>139
お前はC/C++向けじゃないんでLL言語かJavaかC#でも使っててください
141デフォルトの名無しさん:2010/12/14(火) 23:11:42
>>140
お前、仕事したことないだろ
142デフォルトの名無しさん:2010/12/14(火) 23:13:28
へぇ、特にオーバーロードされていない添え字演算子よりもポインタ操作の方が速いんだ
143デフォルトの名無しさん:2010/12/14(火) 23:13:36
つーか範囲外アクセスを検知できてうれしいことなんて無いだろ
144デフォルトの名無しさん:2010/12/14(火) 23:16:34
検知できればオーバーランした時点で落とすことができるから、別に悪いことでもないと思うよ。
ただ、コストが無駄だと思う。
Releaseビルドでオフになっていいと思ってる人にはそれでいいと思う。

ただ、>>130はReleaseビルドでも残ってほしいんだろ。at使うんだから。
145デフォルトの名無しさん:2010/12/14(火) 23:19:11
>>143
配列操作でバグによるメモリ破壊が起こらないことが保証されてるってのは
とても大きいと思うが。Releaseビルドにこそ必要な機能だと思う。
146デフォルトの名無しさん:2010/12/14(火) 23:19:41
vectorみたいにある程度速度を求めるところに使うのは範囲チェックも意外とバカにならないよ
VC使うと分かるけど。あれなんで標準オンなんだよ
147デフォルトの名無しさん:2010/12/14(火) 23:20:11
事前に一回範囲調べればいいのに
アクセスするたびに範囲チェックするなんて無駄なコスト払えないよ
それにエラー処理コード書くぐらいならその手間で範囲オーバーしないためのコードを書くよ
148デフォルトの名無しさん:2010/12/14(火) 23:22:24
>>141
言いたい事はそれだけか低脳
仕事でも使ってますが何か?
149デフォルトの名無しさん:2010/12/14(火) 23:23:04
>>146
ReleaseではオフになるけどDebug版で製品だしてるの?
150デフォルトの名無しさん:2010/12/14(火) 23:23:18
実行時の強力なチェック機構がほしいなら何もC++にこだわらなくてもいいじゃないか。
SEは言語の選択もまた重要な仕事の一つじゃろ^^
いまどき単一言語で何もかも開発するなんてバカげちょる
151デフォルトの名無しさん:2010/12/14(火) 23:24:29
>>148
脳内仕事は勘弁してくれよ
152デフォルトの名無しさん:2010/12/14(火) 23:25:19
C/C++に文句言うのは筋違い。他のLLに行くのが正しい。
153デフォルトの名無しさん:2010/12/14(火) 23:27:32
>>151
仕事なくなったからってこんなとこで遊ぶなよ
154デフォルトの名無しさん:2010/12/14(火) 23:28:24
>>151
お前は文句の矛先を間違えている
間違っているのはC++ではなくお前の頭
155デフォルトの名無しさん:2010/12/14(火) 23:30:00
そうしているうちにC++のメリットの少なさとデメリットの多さから、
C++の仕事がどんどん無くなっていくのであった。
C++屋も「嫌なら他の言語やれ」と固執しているのでめでたしめでたし
156デフォルトの名無しさん:2010/12/14(火) 23:31:12
守銭奴言語やLLならちゃんと例外投げてくれるぞw よかったねw
157デフォルトの名無しさん:2010/12/14(火) 23:39:54
>>149
たしかリリースでも有効な罠があったはず
デバッグでも重いのは勘弁して欲しいところなんだが
158デフォルトの名無しさん:2010/12/14(火) 23:41:49
>>157
範囲チェックで重くなるってどんな処理系でやってるの?
159デフォルトの名無しさん:2010/12/14(火) 23:43:40
>>155
良かったなあC++脳じゃなくて
せいぜい単価の安いJava土方でもやっててね
160デフォルトの名無しさん:2010/12/14(火) 23:44:17
>>155
職を失うのは単に本人の責任だろ^^
知識ポートフォリオは技術者なら当然なわけで。
161デフォルトの名無しさん:2010/12/14(火) 23:52:16
>>158
処理系ってVCとかのことを言うんじゃないの?
それともWindowsって答えればいいの?
162デフォルトの名無しさん:2010/12/14(火) 23:55:33
>>161
windowsプログラムで範囲チェックしたら重くなるようなプログラム書いてるってこと?
163デフォルトの名無しさん:2010/12/14(火) 23:56:05
>>142
当たり前じゃね?
配列インデックスがポインタ演算に置き換わる最適化なんて限度があるんだし、
かけ算と足し算を毎回実行してたらまずいだろ。
164デフォルトの名無しさん:2010/12/15(水) 00:00:27
>>163
それは配列をなめる時にだよね。
165デフォルトの名無しさん:2010/12/15(水) 00:01:07
>>162
そうだよ。つかVCのvectorをWindows以外で使う人はほとんどいないと思うんだが…
166デフォルトの名無しさん:2010/12/15(水) 00:39:47
>>139
語るに落ちてるぜ
おまえ自身が何ナノ秒かわからなくて言ってるんだろ?
167デフォルトの名無しさん:2010/12/15(水) 00:43:18
for(i=0;i!=v.size();++i)
{
if(v.size()<=i) return FAILED;
・・・
}
範囲チェック派ってこれに違和感感じない人ってことだよね?ちょっと頭やばくない?
168デフォルトの名無しさん:2010/12/15(水) 00:46:29
無意味な例を持ち出してきたお前の頭のやばさを疑うよ
169デフォルトの名無しさん:2010/12/15(水) 00:48:30
>>166
まわりのコードやループ回数にもよるだろうし定量的には言いにくいね。
分岐予測して仮実行してたのが当たった時の遅れだからたいしたことはないだろうけど、
5ナノ秒はかからんだろたぶん。まあ実測あるのみだね。
170デフォルトの名無しさん:2010/12/15(水) 00:56:55
>>167
ループの中でi以外のインデックスを使わないんだったらイテレータで
安全に書けるでしょ。i+4とかi-1とかの要素にアクセスするんなら
チェックがあってもおかしくないんじゃない?
171デフォルトの名無しさん:2010/12/15(水) 00:57:52
>>169
5ナノ秒を「保証」できるか?
さもなくば、おまえの論も「危険」なのか?
172デフォルトの名無しさん:2010/12/15(水) 00:59:26
>>170
おかしい
それは開発段階で排除できるミスだからリリースまでチェックを残す必要性が無い
173デフォルトの名無しさん:2010/12/15(水) 01:00:18
>>168
よくわかってるじゃないか。operator[]が範囲チェックするのは無意味なんだよ。
>>167はoperator[]が範囲チェックするってのはこれと同じことですよといっている
174デフォルトの名無しさん:2010/12/15(水) 01:01:41
>>170
vectorはランダムアクセスイテレータだからoperator[]に範囲チェックが欲しい人は
イテレータにも範囲チェック欲しいだろ
175デフォルトの名無しさん:2010/12/15(水) 01:02:33
>>173
その例じゃ無意味さを表現出来てないから頭やばいと言ってるんだけど
176デフォルトの名無しさん:2010/12/15(水) 01:03:28
boost::arrayに範囲チェックあるのはなんでなの?
177デフォルトの名無しさん:2010/12/15(水) 01:03:51
C++の仕事減っているんだが、お前らのところどう?
やっぱり、日本は低脳が超増えているから、ゆとり言語じゃなければ駄目な国に
になってきてるんだよな
178デフォルトの名無しさん:2010/12/15(水) 01:05:54
おお、盛り上がってるな。
非常に残念だが明日早いから寝るわ。
179デフォルトの名無しさん:2010/12/15(水) 01:10:18
範囲チェックしたけりゃすりゃいいがな
ライブラリに範囲チェック組み込まれたら範囲チェックしたくないときは使えないという選択しかできない
180130:2010/12/15(水) 01:13:10
なんかスレがすすんでるなオイ。お前らこんな議論するより
>天ぷら引数で範囲チェックありなしのポリシーを指定するとか考えなかったのか。
にしとけばどっち派でも好きな方選べて文句無いんじゃねーの?
範囲チェック有り無しのif文なんて最適化で消えてオーバーヘッド無いだろ。
>>179
いやだからテンプレ引数で選択できるようにしたらと最初から言ってるのだが。
181デフォルトの名無しさん:2010/12/15(水) 01:14:36
「せめて」とか書くから争いの元に…
182デフォルトの名無しさん:2010/12/15(水) 01:17:16
それこそ無意味だろ
[]とatできりかえれるんだから
183130:2010/12/15(水) 01:22:39
範囲チェックのオンオフでコードを壮大に修正したくはないのだが。
まあいいや。もう寝る。
184デフォルトの名無しさん:2010/12/15(水) 01:24:19
正直このへんくると微妙な議論だが
テンプレ引数で選択できるようにしたら範囲チェックするvectorと範囲チェックしないvectorは別の型になるが大丈夫か?
185デフォルトの名無しさん:2010/12/15(水) 01:25:29
ポリシーにしたほうが壮大な修正はいるわあほかwww
186デフォルトの名無しさん:2010/12/15(水) 01:29:41
規格では「未定義の動作」で FA だろ。
未定義の動作の一部として処理系が独自の条件で throw out_of_range をあてがえばいいだけのこと。
187デフォルトの名無しさん:2010/12/15(水) 01:51:56
範囲チェックを全部に入れて欲しいのか、それとも範囲チェックの有無を
簡単に切り替えたいのかイマイチ主張がわからんな

既存のソースを修正せずに範囲チェックを追加したいってことか?
188デフォルトの名無しさん:2010/12/15(水) 19:43:01
>>186
チェックしてくれるのはありがたいけど、その通知方法はabort()にして欲しいな。
リリース版であっても、いやリリース版だからこそ、
バグを検知したら即座に異常終了してデバッグ情報を残すのが誠実なプログラムだと思う。
189デフォルトの名無しさん:2010/12/15(水) 20:36:30
そういうコンテナを自前で作ればいいじゃん
190デフォルトの名無しさん:2010/12/15(水) 22:49:36
>>188
客先にJITデバッガでも入れてるのか?いきなりabortされたらデバッグ情報も残せないだろ。
サーバアプリならcatchハンドラで各変数の状況をログに残して
プロセス終了した方がいいと思うし、
GUIアプリならプログラムがabortするより丁寧なお詫び文を表示して
プログラム終了した方がユーザーの怒りが少ないだろう。
191デフォルトの名無しさん:2010/12/16(木) 20:02:19
コアダンプとかワトソン先生のような仕組みが存在する前提での話。
無ければ自分でなんとかしないとならないけど、いずれにせよ例外でロールバックされちゃかなわん。
192デフォルトの名無しさん:2010/12/16(木) 20:28:51
メモリダンプ読むなんて暇だな。その労力、別に使った方がいいと思うよ
193デフォルトの名無しさん:2010/12/16(木) 20:39:51
ダンプも読めない女子供はすっこんでろ。
194デフォルトの名無しさん:2010/12/16(木) 20:59:01
ダンプ読みは1年目の研修でみっちり叩き込まれた
アセンブラに自信があったのに甘さを思い知らされた
195デフォルトの名無しさん:2010/12/16(木) 21:00:50
Javaにした方がいいぞ。メモリダンプなんていらん。
本当にC++屋はくだらないことに努力して仕事を失っていくのが好きだな
196デフォルトの名無しさん:2010/12/16(木) 21:03:33
ここ数十年C++で仕事してるが、メモリーダンプなんか見た事無いぞ。
よっぽど効率悪い開発してるな、又は組込か?
197デフォルトの名無しさん:2010/12/16(木) 21:06:32
Windowsアプリじゃありえないよな。組み込みだろ
198デフォルトの名無しさん:2010/12/16(木) 21:12:43
Linux環境だな
199デフォルトの名無しさん:2010/12/16(木) 21:17:22
コア読む暇があったらログの強化とコードレビューに時間使った方がいいぞ。
あとはプログラムの再起動を仕込んでおけばOK
200デフォルトの名無しさん:2010/12/16(木) 21:19:37
コードレビューw
201デフォルトの名無しさん:2010/12/16(木) 22:21:47
>>195
> Javaにした方がいいぞ。
> した方がいいぞ。

「した方がいいぞ」

お前働いてないことがよく分かる一言だな。
202デフォルトの名無しさん:2010/12/16(木) 22:41:08
C++なんて糞は捨ててC#に城
203デフォルトの名無しさん:2010/12/16(木) 22:44:39
C#とか糞のかたまりでしかない
204デフォルトの名無しさん:2010/12/16(木) 22:45:40
#ifndef DEBUGWRAP_DEBUG
#define DEBUGWRAP_DEBUG
//Debug.hpp
namespace DebugWrap
{
void OutputDebugStrA(const char* pString);
void OutputDebugStrW(const wchar_t* pString);
}
#endif

//Debug.cpp
#include "DebugWrap/Debug.hpp"

#include <windows.h>

namespace DebugWrap
{
void OutputDebugStrA(const char* pString)
{
OutputDebugStringA(pString);
}
void OutputDebugStrW(const wchar_t* pString)
{
OutputDebugStringW(pString);
}
}
というのをVCで /Za(言語拡張を無効にする)オプションで
コンパイルしたところ、予期せぬ EOF が検出されました。エラーが出ます
どこがおかしいですか?この有効状態ではコンパイルが通ります
205デフォルトの名無しさん:2010/12/16(木) 22:46:43
206デフォルトの名無しさん:2010/12/16(木) 22:47:59
VB --> C# と進む人が居ても、
C++ --> C# と進む人は少ないんじゃないだろうか。
C#使うならVBでいいや。
207デフォルトの名無しさん:2010/12/16(木) 22:49:00
それはねーよ
208デフォルトの名無しさん:2010/12/16(木) 22:49:10
>>205
プリコンパイル済みヘッダは無効になっています
209デフォルトの名無しさん:2010/12/16(木) 22:57:11
日本には低脳土方しかプログラムしないのに、なんで高脳用のC++使うの
低脳用言語C#、VB使いなさいよ
210デフォルトの名無しさん:2010/12/16(木) 23:01:27
底辺派遣プログラマがいくら「俺はC#で行く」っていったところで
プロジェクトがC++使うことに決まってたらどうしようもないだろ^^
211デフォルトの名無しさん:2010/12/16(木) 23:04:46
ドカタこそ、C#やVB使わされるだろ。
212デフォルトの名無しさん:2010/12/16(木) 23:04:57
何々の言語やった方がいいとか言ってる奴は脳内プログラマ
213デフォルトの名無しさん:2010/12/16(木) 23:14:50
VB6の部署にまわされたけど、趣味でやってるC#やら.netの本を
机の上に積み上げてたら、.netの部署が忙しいらしくてそっちに
まわされることになった。
助かったよ。
214デフォルトの名無しさん:2010/12/16(木) 23:15:43
C#はツール作成用です(´・ω・`)
215デフォルトの名無しさん:2010/12/16(木) 23:39:50
C#→C++だがC++使いでオブジェクト指向を正しく理解してない馬鹿が多すぎてうんざりした。
奴らはまともなオブジェクト指向言語に触れたほうがいい。
どんどん新しい人に追い抜かれていってるぞ。
216デフォルトの名無しさん:2010/12/16(木) 23:50:23
C++はマルチパラダイムなんですよね
217デフォルトの名無しさん:2010/12/16(木) 23:51:48
C++でオブジェクト指向って馬鹿なの
C++は俺俺指向(自分で志向をあみ出す高脳用言語)なのに
自分で道(志向)を切り開けない低脳は使っちゃ駄目よ
218デフォルトの名無しさん:2010/12/16(木) 23:55:21
C++ユーザーはオブジェクト指向できないって点は否定しないんだな。
219デフォルトの名無しさん:2010/12/16(木) 23:59:26
それがゴールじゃないからな
220デフォルトの名無しさん:2010/12/17(金) 00:01:36
オブジェクト指向なんてとっくの昔に通り越してるから古い人間にはちょっとおかしく見えるんだろうね
221デフォルトの名無しさん:2010/12/17(金) 03:52:40
>>217
俺俺指向なのはまあいいけれど、たまにベターCとかいってる人がいるのはちょっとだめだと思う。
222デフォルトの名無しさん:2010/12/17(金) 16:23:01
ベターCでもぜんぜん結構
パラダイムをねちねち語る奴は仕事の出来ない奴
これ常識な
223デフォルトの名無しさん:2010/12/17(金) 16:29:03
まあ、道具だから使い方はいろいろだよね
224デフォルトの名無しさん:2010/12/17(金) 16:50:34
平日の午後4時に書かれてもね。ぜんぜんね。
225デフォルトの名無しさん:2010/12/17(金) 18:17:21
ほとんどC++の利点を用いていないC++コードを見ると悲しくなる
使われててもcout関係だけ
226デフォルトの名無しさん:2010/12/17(金) 18:30:43
coutしか使ってなければCプログラマにも理解しやすいじゃないか
それが利点でなくてなんなんだ
227デフォルトの名無しさん:2010/12/17(金) 18:40:45
むしろioはstdio派の俺
228デフォルトの名無しさん:2010/12/17(金) 18:44:19
C++屋ってどんなのを開発しているんですか?
なんとなくC/C++屋ってハードに近いのをあつかっているってイメージで、
ドライバなんかをがりがり作ってそうな感じですが
229デフォルトの名無しさん:2010/12/17(金) 18:55:37
数値解析だとか画像解析だとか、いろいろやってますが。
230デフォルトの名無しさん:2010/12/17(金) 19:16:20
通信処理とか。
231デフォルトの名無しさん:2010/12/17(金) 19:23:08
C/C++でTCP/IP通信処理か。おめでてーな。Javaの方が得意だろ。
シリアル通信だったら許す
232デフォルトの名無しさん:2010/12/17(金) 19:25:02
>>231
君の無能さを顕著に示しているよいレスだ
233デフォルトの名無しさん:2010/12/17(金) 19:38:24
フイタ
234デフォルトの名無しさん:2010/12/17(金) 20:11:57
>>225
あとコンテナだけ使ってるとかだろ
235デフォルトの名無しさん:2010/12/17(金) 20:19:27
中身全部アセンブラとかな
236デフォルトの名無しさん:2010/12/17(金) 21:07:04
Java脳の人って本当ビックリするぐらいお目出度いよな
237デフォルトの名無しさん:2010/12/18(土) 03:53:44
例外って使ってますか?
238デフォルトの名無しさん:2010/12/18(土) 05:29:15
使わないとSTL殆どだめになるじゃん
239デフォルトの名無しさん:2010/12/18(土) 11:04:17
C++を0の状態から勉強している者です。

「ロベールの入門講座」を読みながら学んでいるのですが、
p144のオーバーロードの項で詰まりました。
本の内容を見比べ、ソースを打ち込んで試しているのですが、
「関数 'double abs(double)' は既に本体を持っています。」とエラーが出ます。
(関数名を変えれば動きます)

http://codepad.org/0i4ByGfl
が自分の書いたソースです。

私はVC++2010を使用しているのですが、
「ロベールの入門書」は2008を前提として書いているようで、
そこら辺の違いもあるのでしょうか?
240デフォルトの名無しさん:2010/12/18(土) 11:06:58
>>239
死ねカス
241デフォルトの名無しさん:2010/12/18(土) 11:41:45
>>239
abs()は標準ライブラリ関数だぞ
マクロとして定義されている事もある
242デフォルトの名無しさん:2010/12/18(土) 12:24:35
>>239
標準の<cmath>にstd::absが定義されているので、それと被っている。
多分コンパイラのバージョン違いで<iostream>が<cmath>をインクルードするようになったんだろう。
対処は自分のabsを名前空間に入れる。
namespace nantoka {
int abs(int a) { if(a < 0) { return -a; } else { return a; } }
double abs(double a) { if(a < 0) { return -a; } else { return a; } }
}
勿論呼び出すときはnantoka::abs(i)とする。
まあ根本的にはそもそもusing namespaceを使わずに常に名前空間を指定して呼び出すのが常道。
243デフォルトの名無しさん:2010/12/18(土) 13:45:26
えーめんどくさいじゃーん
244デフォルトの名無しさん:2010/12/18(土) 13:51:33
この程度でめんどくさがってたらプログラム書くこと自体がめんどくさいよね
なんでプログラム書くの?
245デフォルトの名無しさん:2010/12/18(土) 13:53:28
世界中に私のプログラムを待っている子供たちがいるんです。
246デフォルトの名無しさん:2010/12/18(土) 13:54:49
居ませんよそんなハードロックな子供は
247デフォルトの名無しさん:2010/12/18(土) 13:56:37
std::
位ならいいんだけどね
orelib::utility::gui::win32::window
とか面倒じゃね
248デフォルトの名無しさん:2010/12/18(土) 13:59:06
面倒だけどちゃんと分類されてるほうが有り難い
249デフォルトの名無しさん:2010/12/18(土) 14:27:45
型なんて変数名に比べて書く回数全然少ないんだからガマンしろ
250デフォルトの名無しさん:2010/12/18(土) 14:56:25
using は仕方ないにしても
using namespace はやめれ
typedef か inline でしのげ
251デフォルトの名無しさん:2010/12/18(土) 15:04:27
ヘッダに書かなきゃどっちでもいい
252デフォルトの名無しさん:2010/12/18(土) 15:09:34
と言って数万行のソースの先頭にusing使うんですね
253デフォルトの名無しさん:2010/12/18(土) 15:17:44
それはusingより数万行の方が非難されるべきじゃね?
254デフォルトの名無しさん:2010/12/18(土) 16:46:46
っていうかさ、VCがC++ライブラリ読んでるのに
Cライブラリをstd名前空間にラップしてくれないのがおかしいんだよ^^
255デフォルトの名無しさん:2010/12/18(土) 16:55:44
互換性はジャスティス
256デフォルトの名無しさん:2010/12/18(土) 19:36:37
>>239
本ではAbsと大文字になってるでしょ
257デフォルトの名無しさん:2010/12/18(土) 20:55:34
お前ら全員ドカタだろ?

優秀なドカタと劣悪なドカタが居るのかも知れないが、
俺からみればお前ら全員所詮ドカタであって
それ以上では決して無かろう。
258デフォルトの名無しさん:2010/12/18(土) 21:13:19
遺産でほそぼそと生きてるニートなので土方ではありません
259デフォルトの名無しさん:2010/12/18(土) 21:33:41
>>257
働いているのは全てドカタ(土方)
と言うことで>>258イイですかね

サラリーマンは所詮ヨイトマケだよなと思う俺
260デフォルトの名無しさん:2010/12/18(土) 21:39:22
>>259
いや俺は雇う側なんだ。趣味でC++やってんの。

でも俺がかける制限はSTL使うなとかそんなイカレタ制限は
かけてないから安心してくれ。

ある意味ドカタが居ないと俺の収入が成り立たないから
その点では感謝している。
261デフォルトの名無しさん:2010/12/18(土) 21:47:23
働いているんだろなら立派なドカタ
262デフォルトの名無しさん:2010/12/18(土) 21:47:28
これは恥ずかしい
263デフォルトの名無しさん:2010/12/18(土) 21:56:11
人は生まれながらにして土方であり、土方でるがゆえに人となるのだ
264デフォルトの名無しさん:2010/12/18(土) 22:13:07
馬車馬のように働かないと金が入ってこねーから仕方ねーだろ
265デフォルトの名無しさん:2010/12/18(土) 22:16:03
よくいる「しょせんドカタ、俺なんか楽してもっと稼いでる」みたいな
あおりを執拗にしてるやつって、よっぽどコンプ強いんだろうな。
266デフォルトの名無しさん:2010/12/18(土) 22:21:38
マ板でやれ
267デフォルトの名無しさん:2010/12/18(土) 22:22:25
私はIS部門の人間なんです。SIerの客なんですよ。私に嫌われたらどうなりますか?
皆さん生きていけないですよ!
268デフォルトの名無しさん:2010/12/18(土) 22:30:30
俺SIerじゃないからいいや
269デフォルトの名無しさん:2010/12/18(土) 22:40:30
bool isIS( Person const & );
270260:2010/12/18(土) 23:23:52

        /ヘ、
       /,/   \
       | l       \
.      | |       \
      | |           \
      /⌒)¨゙\       \
     / /  ~\ \       \
   / /  .ノ´⌒`ヽヽ          \
  / γ⌒´       \ヽ         \
. / .// ""´ ⌒\  ) ヽ          \
 | .i /  ⌒  ⌒  i ) ノ          \
 | i   (・ )` ´( ・) i,/ /            \
 | l    (__人_)  | /  つ、釣れた!     `、
 | \.   \ ヽ ノ/    これは大物のバカに違いない!
 ヾ、.       `-? く                    l
   ヽ          ゚\                 .,'
    ヽ         \             _r'´
               ` 、        _.・´
                 ``'〜--─・"

271デフォルトの名無しさん:2010/12/18(土) 23:30:14
>>261-263
>>265-266
ようドカタ諸君。


   , -‐−-、  ヽ∧∧∧ //  |
.  /////_ハ ヽ< 釣れた!> ハ
  レ//j け ,fjlリ / ∨∨V ヽ  h. ゚l;
 ハイイト、"ヮノハ     //   |::: j  。
  /⌒ヽヾ'リ、     //     ヾ、≦ '
. {   j`ー' ハ      // ヽ∧∧∧∧∧∧∨/
  k〜'l   レヘ.   ,r'ス < 初めてなのに >
  | ヽ \ ト、 ヽ-kヾソ < 釣れちゃった!>
.  l  \ `ー‐ゝ-〈/´   / ∨∨∨∨∨∨ヽ
  l     `ー-、___ノ
  ハ   ´ ̄` 〈/‐-、



   , -‐−-、  ヽ∧∧∧ //  |
.  /////_ハ ヽ< 釣れた!> ハ
  レ//j け ,fjlリ / ∨∨V ヽ  h. ゚l;
 ハイイト、"ヮノハ     //   |::: j  。
  /⌒ヽヾ'リ、     //     ヾ、≦ '
. {   j`ー' ハ      // ヽ∧∧∧∧∧∧∨/
  k〜'l   レヘ.   ,r'ス < 初めてなのに >
  | ヽ \ ト、 ヽ-kヾソ < 釣れちゃった!>
.  l  \ `ー‐ゝ-〈/´   / ∨∨∨∨∨∨ヽ
  l     `ー-、___ノ
  ハ   ´ ̄` 〈/‐-、

272デフォルトの名無しさん:2010/12/18(土) 23:49:00
>>270-271
ム板でAA貼る奴ってキチガイ低脳
273デフォルトの名無しさん:2010/12/18(土) 23:55:23
ストリーム開くときにvector<char>などにイッキ読みして作業したほうが速いって聞くけどあれって本当にそうなのか?
内部でもバッファリングぐらいしてるだろうし一回走査しておしまい程度の内容だとメモリ確保とコピーの分取り返せない気がするんだけど…
274デフォルトの名無しさん:2010/12/19(日) 00:04:36
>>273
vector<>は知らんけど、このまえfread()で読み込むサイズを変えて
実験してみたら、やっぱ数バイトごとに読み込むより数十キロごとに
読み込むほうが速かった。
275デフォルトの名無しさん:2010/12/19(日) 00:16:00
ファイルストリームをvector<char>に読むコード教えてください
お願いします。
276デフォルトの名無しさん:2010/12/19(日) 00:31:25
stream.read(&v[0], v.size());
277デフォルトの名無しさん:2010/12/19(日) 00:38:18
1ファイルが一度に全部キャッシュされれば同じ速さになるかもしれないけど
キャッシュから漏れたらシークを繰り返すバッファリングは遅くなってしまうのでは
多くの外部記憶はシークに時間がかかるものだし
278デフォルトの名無しさん:2010/12/19(日) 00:42:35
それよりもHDDをデフラグしろよおめーら
何だって?SSDだからデフラグはいらない?
279デフォルトの名無しさん:2010/12/19(日) 00:50:13
>>276
すみません。v.size()(ファイルサイズ)はファイルストリームからどう得るんですか
で、ファイルサイズ得ないで、vector<char>に格納って出来ないんですか
(自動的にファイルサイズ取得して、vector<char>をそのサイズにして読み込む)
280デフォルトの名無しさん:2010/12/19(日) 01:03:28
>>278
クラウドでストレージがローカルマシンに無いのが普通なのに
HDD・SSDってどこの後進国でプログラミングしてるんだ?
281デフォルトの名無しさん:2010/12/19(日) 01:26:48
>>272
大漁w
顔真っ赤にして。

また今度くるから釣られてね!
282デフォルトの名無しさん:2010/12/19(日) 01:28:55
>>279
ios::pos_type size = stream.seekg(0, ios::end).tellg();
283デフォルトの名無しさん:2010/12/19(日) 01:30:05
>>279
バイナリファイルでヘッダを読んでペイロードのサイズがわかっている時に使ばいい。
テキストファイルのようにサイズがわからない時は、OSの機能でファイルサイズを取得すればOK。
284デフォルトの名無しさん:2010/12/19(日) 01:40:47
pos_typeからどーやってサイズ取得すんの。implementation definedでしょ。
285デフォルトの名無しさん:2010/12/19(日) 01:59:22
>>280
自分がクラウドプログラミングをしてるからと言って、人の職場も全く同じだと思い込む
視野の狭さ

ローカルにデータベースを置いてる案件はいくらでもあるんだけどお前馬鹿か?
286デフォルトの名無しさん:2010/12/19(日) 07:47:37
>>279
typedef std::istreambuf_iterator<char> iterator;
v.assign(iterator(s), iterator());
287デフォルトの名無しさん:2010/12/19(日) 10:17:10
size = distance(istreambuf_iterator<char>(f), istreambuf_iterator());
288デフォルトの名無しさん:2010/12/19(日) 10:22:42
>>284
pos_typeはただの整数typedefでしょ
十分大きな整数型 size = stream.seekg(0, ios::end).tellg();
でおk
289デフォルトの名無しさん:2010/12/19(日) 12:04:05
seekg(0, ios::end)
したらちゃんと
seekg(0. ios::beg)
で、もどれよ!よ!
290デフォルトの名無しさん:2010/12/19(日) 12:11:22
>>287
その後内容は読めないんじゃね?
シークできるストリームならいいけど。
291デフォルトの名無しさん:2010/12/19(日) 12:20:48
シークできるストリームだとしたら素直にシークするのに比べて効率悪すぎるだろ。
292デフォルトの名無しさん:2010/12/19(日) 12:39:34
>>288
そんな保証はない

§21.1.2
2 Requires: For a certain character container type char_type, a related container type INT_T shall be a
type or class which can represent all of the valid characters converted from the corresponding
char_type values, as well as an end-of-file value, eof(). The type int_type represents a character
container type which can hold end-of-file to be used as a return type of the iostream class member
functions.217)
typedef OFF_T off_type;
typedef POS_T pos_type;

§27.1.2
The classes of clause 27 with template arguments charT and traits behave as described if
traits::pos_type and traits::off_type are streampos and streamoff respectively.
Except as noted explicitly below, their behavior when traits::pos_type and traits::off_type
are other types is implementation-defined.
293デフォルトの名無しさん:2010/12/19(日) 12:50:28
これこないだのbcc使いじゃねの
294デフォルトの名無しさん:2010/12/19(日) 13:07:44
implementation-defined.

つまり整数のtypedefだと思って使うとクビ
295デフォルトの名無しさん:2010/12/19(日) 13:15:03
@俺用memo

istream::tellg
 戻り値はios::pos_type型

ios::pos_type
 整数とは限らない
 十分なサイズの整数へのstatic_castは保証されている
 十分なサイズは環境次第
 差をとるとios::off_typeに変換される

ios::off_type
 符号あり整数、サイズは環境次第

ファイルサイズの取り方
 ios::pos_type tmp = f.tellg();
 ios::off_type size_ = f.seekg(0, ios::end).tellg() - f.seekg(0, ios::beg).tellg();
 f.seekg(tmp);
 if(numeric_limits<some_size_type>::max() < size_) /* ERROR */;
 some_size_type size = size_;
296デフォルトの名無しさん:2010/12/19(日) 13:37:21
>>292,294
implimentation-defined と言われているのはその 27 章で規定されているクラスの動作の話。
しかも "when traits::pos_type and traits::off_type are other types" という条件付でな。

引用された箇所のうち pos_type の定義に関する記述は typedef POS_T pos_type; だけだよ。
297デフォルトの名無しさん:2010/12/19(日) 13:43:44
> f.seekg(0, ios::end).tellg() - f.seekg(0, ios::beg).tellg();
seekgc→seekg(2番目)→tellg(1番目)→tellg(2番目) の順で呼ばれたらどうすんだ?

まあどうせseekg/tellgなんてWindowsじゃ大きなファイルの時まともに動作しない糞。
298デフォルトの名無しさん:2010/12/19(日) 13:53:51
標準で巨大ファイル扱えるようにしなかった禿が戦犯
299デフォルトの名無しさん:2010/12/19(日) 14:25:54
> Windowsじゃ大きなファイルの時まともに動作しない

任意の OS で「まともに動作」を保証するのは大ごとだぞ
300デフォルトの名無しさん:2010/12/19(日) 15:35:31
それは単にstreampos等の定義が悪いだけで
要するにライブラリ実装した奴が戦犯ってだけだろ
規格自体は巨大ファイルも考慮している
301デフォルトの名無しさん:2010/12/19(日) 20:39:54
こないだ思ったんだけど
例えば未初期化のローカル変数にさわるコードがあったら
例外なんて出ずになんかエラーで落ちるよね?
ということはC++で例外処理をちゃんとやろうとするのは無理ってこと?
例えばわざと第2引数をこうしたらさっさと終了してしまう
try{
CreateProcess(NULL,L"c:\\windows\\system32\\notepad.exe",NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);
}catch(...){
}
302デフォルトの名無しさん:2010/12/19(日) 20:49:25
C++例外と構造化例外(UNIXならシグナル)は違う。
VCならcl.exeのオプションで構造化例外もcatchできる。
303デフォルトの名無しさん:2010/12/19(日) 21:08:32
構造化例外なんてあったのか、初めて知った
Unixのシグナルは非同期で、もっと大変そうですね
304デフォルトの名無しさん:2010/12/19(日) 21:38:52
構造化例外は0除算とかハードウェアに密着したエラーも捉えられるから便利だな
305デフォルトの名無しさん:2010/12/19(日) 21:39:15
>>301
>例えば未初期化のローカル変数にさわるコードがあったら
>例外なんて出ずになんかエラーで落ちるよね?
いいえ。未定義の動作なので何が起きるかわかりません。落ちたらラッキーです。
306デフォルトの名無しさん:2010/12/19(日) 22:06:33
たまたまスタックに入ってた値が使われるだけ
何が起こるかはその値次第
307デフォルトの名無しさん:2010/12/19(日) 23:35:57
いままで鼻から悪魔とか出たことないわ
308デフォルトの名無しさん:2010/12/19(日) 23:37:56
え?
309デフォルトの名無しさん:2010/12/19(日) 23:38:41
ほんとに悪魔が出たら、是非見てみたい
310デフォルトの名無しさん:2010/12/19(日) 23:58:30
ひょっとして見えてないだけでいつも出ているのでは?
311デフォルトの名無しさん:2010/12/20(月) 00:22:14
もし未定義の動作で鼻からゴキブリが出てくるのなら
動いてるからもう修正なんてしないなんて言わないよ絶対
312デフォルトの名無しさん:2010/12/20(月) 01:00:23
>>309
いつも見ているだろ、鏡の前に立ってみろ。
そこにバグを生産している悪魔が写っている
鼻から悪魔ってバグを生み出しているプログラマが生み出すもう一人の自分だ
313デフォルトの名無しさん:2010/12/20(月) 01:04:48
{
system("format.exe c: /q");
}

↑のようなコードがもし未定義の動作で偶然実行されても文句は言えない
314デフォルトの名無しさん:2010/12/20(月) 01:07:58
未定義動作で彼女できる?
315デフォルトの名無しさん:2010/12/20(月) 01:28:00
>>314
そりゃまあ何が起きるか分からないからな
万が一おまえに彼女ができたとしてもC++の仕様上は問題ない
316デフォルトの名無しさん:2010/12/20(月) 01:50:39
環境依存だけどね
317デフォルトの名無しさん:2010/12/20(月) 01:55:15
未定義動作で特定のマシン発火させれるんだっけ。怖いわー
318デフォルトの名無しさん:2010/12/20(月) 09:29:35
所詮C++で速度を出すのは無理ってことか

【Intel】OpenCV総合スレ 3画素目【画像処理】
http://hibari.2ch.net/test/read.cgi/tech/1271686856/
276 名前:デフォルトの名無しさん[sage] 投稿日:2010/12/03(金) 10:47:42
calcOpticalFlowPyrLKをc++仕様にしたら、3ms→40msになってわろた
319デフォルトの名無しさん:2010/12/20(月) 09:52:27
せやな
320デフォルトの名無しさん:2010/12/20(月) 10:30:54
しかしCからC++にしただけで10倍以上遅くなるって
本当に言語だけの問題なんだろうか
321デフォルトの名無しさん:2010/12/20(月) 13:08:00
そもそもc++仕様にするってどういう意味?
OpenCVってC++製だよねえ。
322デフォルトの名無しさん:2010/12/20(月) 13:31:46
すごく初歩的かもしれないんですが
あるソフトのプラグインを作ってみたいのですが
CLRでコンパイルしたものと、ネイティブでコンパイルしたもの
どちらでもプラグインとして読み込んでくれるんでしょうか?
323デフォルトの名無しさん:2010/12/20(月) 13:42:02
こないだ、ブライアン・ストラウスラップっと偶然握手してきた。
3242 5 7:2010/12/20(月) 13:48:48
>>318
俺みたいに上手に釣ろうよ。
325デフォルトの名無しさん:2010/12/20(月) 13:54:45
>>322
そのソフトのサイトなりスレなどでお好きにどうぞ。
326322:2010/12/20(月) 15:15:26
いくつかプラグインみたら、frameworkが必要なものと
必要でないものがあった。本体はframework必要ない
本体の製作者はどちらでも対応するように特別なことをしているのかな?
それともdll形式にしていれば関係ないのかな?
327デフォルトの名無しさん:2010/12/20(月) 15:18:32
>>326
だからその作者に聞くなりそのソフトのコミュニティで聞くなりしろって。
ここは原則的に標準的なC++のスレなんだから。
328デフォルトの名無しさん:2010/12/20(月) 15:46:52
OpenCVって知らないけど、そのベンチマークの妥当性を検証できる
コードも何もないんじゃ話にならない。
329デフォルトの名無しさん:2010/12/20(月) 16:00:53
>>327
むしろくだ質でいいんじゃ。
330デフォルトの名無しさん:2010/12/21(火) 09:57:34
2038年になってもクラッシュしないコードを書くにはどうすればいいんでしょうか?
331デフォルトの名無しさん:2010/12/21(火) 10:26:23
日付時刻を扱わなければいいです
332デフォルトの名無しさん:2010/12/21(火) 10:27:05
その頃には今作ったソフトウェアなんて動かないから
気にする必要ないよ
333デフォルトの名無しさん:2010/12/21(火) 10:33:11
いまだにWindows98を使ってる奴がいることを考えれば、今作ったソフトが15年後に動いていないとは考えにくい
334デフォルトの名無しさん:2010/12/21(火) 10:33:57
あれ、なんか計算間違った
25年後か
じゃあ大丈夫かもな
335デフォルトの名無しさん:2010/12/21(火) 11:16:00
銀行システムとか旧世代の遺物が普通に動いてるがな・・・
普通にちゃんと書いてりゃハードが壊れない限り何百年でも動くよな
336デフォルトの名無しさん:2010/12/21(火) 18:56:13
>>330
time_tが32ビットじゃない今時の開発環境を使えばいいと思うよ。
337デフォルトの名無しさん:2010/12/21(火) 19:47:13
VC10

#ifdef _USE_32BIT_TIME_T
typedef __time32_t time_t; /* time value */
#else
typedef __time64_t time_t; /* time value */
#endif

互換性を重視してるのかな?
338デフォルトの名無しさん:2010/12/21(火) 23:01:46
class A {
protected:
 A(){}
 virtual ~A()=0;
};

A::~A(){}

class BFactory;
class B {
private:
 B(){}
 virtual ~B(){}
 friend class BFactory;
};

class BFactory {
public:
 BFactory(){};
 ~BFactory(){};
 std::tr1::shared_ptr<A> CreateB(){return std::tr1::shared_ptr<B>(new B());}
};

こんな感じでshared_ptrをBFactoryから返そうとしたら、
gcc43.4で「virtual B::~B()’ is private(privateメンバーにアクセスできない)」とのエラーが出ます。
クラスBの直接deleteを防ぎ、かつshared_ptrでメモリ管理の煩雑さを防ぐ方法はないのでしょうか?
339デフォルトの名無しさん:2010/12/21(火) 23:07:39
>>338 BFactory のメンバとして削除子( deleter )を作って渡せ。
340デフォルトの名無しさん:2010/12/21(火) 23:38:55
>>338

回答ありがとうございます。bindを併用して下記のようにしてみましたが、
「 error: cannot convert ‘B* const’ to ‘A*’ in initialization」と出てだめでした。

void Deleter(B *p){delete p;}
 std::tr1::shared_ptr<A> CreateB(){
  return std::tr1::shared_ptr<B>(new B(), std::tr1::bind(&BFactory::Deleter, this, _1));
 }

ついでにVC2008でやってみたら、「error C2248: 'B::~B: private メンバ (クラス 'B' で宣言されている)にアクセスできません。」
ということでやっぱりだめでした。。。

341デフォルトの名無しさん:2010/12/21(火) 23:42:05
>>338
BはAを継承しないとダメなんじゃない?
それとBのデストラクタはpublicにしなければならない
あるいは、Bを基底にする気がないならデストラクタの定義自体をしない
342デフォルトの名無しさん:2010/12/22(水) 00:00:38
クラスBの直接deleteを防ぎ
343デフォルトの名無しさん:2010/12/22(水) 00:01:18
>>341
friend なら public にしなくてもいいでしょ。
344デフォルトの名無しさん:2010/12/22(水) 00:09:29
>>343
すまない。その通りだね
345デフォルトの名無しさん:2010/12/22(水) 00:25:46
>>338

ありがとうございました。完全にtypoでした。。。
簡単に状況を説明するために基幹部分だけ抜き出したら失敗していたようです。

継承関係をつけたところ、Deleterでの削除がうまくいくようになりました。

346デフォルトの名無しさん:2010/12/22(水) 14:31:09
>>340
Deleter() は static でいいでしょ。そうすれば bind() も要らない。
347デフォルトの名無しさん:2010/12/22(水) 14:49:44
vectorのコンテナについて質問があります。
vector<int> data;
vector<int>::iterator cur,end;

cur=data.begin();
end=data.end();

for(;cur!=end;++cur){
if(*cur==0)
data.erase(cur);
}

こんなことしたら、後続のイテレータが無効になるんですよね?
コンテナに登録されたもので値が0の奴を削除したいときは
どう工夫すればうまく削除できるでしょうか?
348デフォルトの名無しさん:2010/12/22(水) 14:54:59
戻り値、eraseの戻り値を使う
349デフォルトの名無しさん:2010/12/22(水) 14:58:23
ありがとうございます。
eraseの戻り値を使ったとして、一度削除を行ったあとに
要素の最後までループさせるには、endの方のイテレータも
もう一度取得しなおす必要があるのでしょうか?
350デフォルトの名無しさん:2010/12/22(水) 15:04:05
removeしてからいらないとこ削る方がすっきりしないかな
他のこともする必要があるからループで回す必要があるのかもしれないが
351デフォルトの名無しさん:2010/12/22(水) 15:21:22
>>347
0なら削除するのではなく、0なら登録しないってのはダメなの?
352デフォルトの名無しさん:2010/12/22(水) 15:24:39
削除する方法を聞いてるのに最初から入れなければいいとかアホ回答の典型
353デフォルトの名無しさん:2010/12/22(水) 15:26:39
auto itend = std::remove(data.begin(), data.end(), [](int n) { n == 0 });
data.erase(itend, data.end());
354デフォルトの名無しさん:2010/12/22(水) 15:30:54
return忘れた
355デフォルトの名無しさん:2010/12/22(水) 15:37:26
0なら登録しないってのは無理です。
0になったのを終了判定に使っているからです。

removeが良さそうなんですが、いまいち使い方がよくわかりません。
指定した値を切り詰めるとまではわかったのですが、
何か簡単な例でも書いていただけないでしょうか。
356デフォルトの名無しさん:2010/12/22(水) 15:43:29
>>349
規格はしらんけど普通に考えて取りなおさないとダメだと思う
vectorがリリース時にend()で返すのは一般的な実装なら生ポインタ
ということはループ回すときにサイズが縮んで終端が移動したらendは無効なイテレーターになる
だからループで回すなら
while(cur != end) if(*cur == 0) { cur = erase(cur); end = data.end(); } else ++cur;
こうしたほうが安心できるね
まあ削除するだけなら普通はremove&eraseパターンだけど
357デフォルトの名無しさん:2010/12/22(水) 15:50:17
1 2 0 3 4 1 0 3 5 6 0 0 0 1 1 1

↓it = remove_if(beg, end, IsZero());

1 2 3 4 1 3 5 6 1 1 1 0 0 0 0 0
            ↑it
↓erase(it, end)

1 2 3 4 1 3 5 6 1 1 1
358デフォルトの名無しさん:2010/12/22(水) 15:50:31
ずれてる…
359デフォルトの名無しさん:2010/12/22(水) 16:20:11
>>356
これでもいけますよね。ありがとうございます。

>>357-358
すごいわかりやすいです!これでいきます!ありがとうございました!
360デフォルトの名無しさん:2010/12/22(水) 17:35:21
C++のremoveって一致する要素をコンテナの後方に集める(ソート)関数だよな
361デフォルトの名無しさん:2010/12/22(水) 17:56:29
実装はバブルソート?
362デフォルトの名無しさん:2010/12/22(水) 18:16:02
Effective STL読むといいかもにゃー。
一連の話は「第9項 消去オプションは注意して選択しよう」で
詳細に論じられてる。
363デフォルトの名無しさん:2010/12/22(水) 18:30:30
>>356
それを心配するならリバースイテレータ使えばいいのでは?
364デフォルトの名無しさん:2010/12/22(水) 23:43:27
すみません、ミューテックスについて教えてください。

複数スレッドの処理で、下記のようなミューテックスの処理を行ってました。

コンストラクタ
mutex = CreateMutex(NULL, FALSE, NULL);
ReleaseMutex(mutex);


スレッド内処理
ReleaseMutex(mutex);
WaitForSingleObject(mutex, INFINITE);
ReleaseMutex(mutex);
WaitForSingleObject(mutex, INFINITE);

スレッド内処理で最初に無駄なReleaseMutex()をしており、さらに最後にReleaseMutex()をしてなかった為
スレッド間でデッドロックが起こるかと思いきや、問題ありませんでした。
これは最初のReleaseMutex()が予約の様な動きを行っているのですか?
どなたかReleaseMutex()の動きを教えてください。

365デフォルトの名無しさん:2010/12/22(水) 23:48:31
それのどこがC++の相談なのかね?
366デフォルトの名無しさん:2010/12/22(水) 23:59:00
>>364
オマエAPIの戻り値チェックとかしたことある?
367デフォルトの名無しさん:2010/12/23(木) 00:12:53
>>366
それってどうやるんですか教えてください。
368364:2010/12/23(木) 00:17:36
>>365
スマソ
WIN32API質問スレに移動します。

>>366
調べた限りでは、再起カウンタが以下の様な動きしてるのかな?と思うんだけど確証が欲しくて。

ReleaseMutex(mutex); →-1
WaitForSingleObject(mutex, INFINITE);→0
ReleaseMutex(mutex); →-1
WaitForSingleObject(mutex, INFINITE);→0
369デフォルトの名無しさん:2010/12/23(木) 00:29:57
適当に答えるけど、そんなことにはならないと思うから、シンプルな構成で再確認。
370デフォルトの名無しさん:2010/12/24(金) 02:21:05
他人のいじったソースってなんであんなにいらいらいらいらいらいらするのおおおおおおお
371デフォルトの名無しさん:2010/12/24(金) 11:08:18
class A
{
public:
int x, y;
};
class B
{
public:
A a;
const A* operator ->() const { return &this->a; }
A* operator ->(){ return const_cast<A*>( static_cast<const B&>( *this )???? ); }
};
どうやってconstな方のoperator ->をconstじゃないほうから呼び出せばいいのでしょうか。
372デフォルトの名無しさん:2010/12/24(金) 11:20:05
.operator->()
373デフォルトの名無しさん:2010/12/24(金) 11:30:28
どうも
374デフォルトの名無しさん:2010/12/24(金) 15:15:31
class Super{
public:
void func1(){}
};
class Sub1 : public Super{
public:
void func2(){}
};
lass Sub2{
public:
void func2(){}
private:
Super s;
};
この場合Sub1とSub2はどっちがいいですか。
Sub2のユーザーがfunc1にアクセスするにはどういう方法がいいですか。
375デフォルトの名無しさん:2010/12/24(金) 15:17:47
>>374
「いい」の判断基準が不明なのでなんともいえない。

private な s に対する func1 を呼び出したいなら同じ仕様の関数を Sub2 にも追加して
委譲するか、 public 継承との比較と言うことなら Super& を返す関数を追加してもいいと
思う。
376デフォルトの名無しさん:2010/12/24(金) 15:29:04
仮想関数が無いクラスを継承するなとか聞いたんで
377デフォルトの名無しさん:2010/12/24(金) 16:44:15
C++は何が望ましいかをプログラマが決める言語だから
一般論があっても参考になるとは限らないよ。
378デフォルトの名無しさん:2010/12/24(金) 17:51:57
>>376
徹底できれば良いけど普通に考えてめんどくさいよね
クライアント重視の設計が好みなのかね
379デフォルトの名無しさん:2010/12/24(金) 18:22:06
グローバル領域にクラスを1つ生成してアクセスするための
テンプレートクラスを作ったのですが、
こういう使い方はまずいですか?

作法云々ではなく、言語仕様的にまずいかどうかが知りたいです。

ttp://codepad.org/anKRtKi8

よろしくお願いします。
380デフォルトの名無しさん:2010/12/24(金) 18:23:46
別にまずかねぇが
なぜまずいとおもったのか知りたい
381デフォルトの名無しさん:2010/12/24(金) 18:25:47
シングルトンの実装でよく使うよね
382379:2010/12/24(金) 18:27:32
>>380
ありがとうございます
自動シングルトンテンプレートを参考に考えたんですが、
static をつけるあたりが慣れていなく、ちょっと不安な感じがしました
383デフォルトの名無しさん:2010/12/24(金) 20:59:09
struct Hoge
{
Hoge(int x) : x(x) {}
int x;
};

strutc HogePtrComp
{
bool operator () (Hoge const *p, Hoge const *q) { return p->x < q->x; }
};

std::multiset<Hoge *p, HogePtrComp> s;

s.insert(new Hoge(10));
s.insert(new Hoge(20));
s.insert(new Hoge(30));

Hoge *p = s.begin();
p->x = 30;

こうすると並びが30 20 30になって順序が崩れるから再配置したいんだけど
これを効率よく再配置するイディオムってある?
384デフォルトの名無しさん:2010/12/24(金) 21:09:35
せめてコンパイル通るコード書けよと思うが
削除してから、挿入しなおせばいいんじゃね
385デフォルトの名無しさん:2010/12/24(金) 23:22:53
順序が崩れるってどういうことだろう。
ソートしたいということではないんだよね
386デフォルトの名無しさん:2010/12/24(金) 23:24:56
元々setやmultisetは自動的にソートされるコンテナだからじゃないかな
値の変更はソートには影響ないんだね
387デフォルトの名無しさん:2010/12/25(土) 00:03:00
コンストラクタのオーバーロードに関する質問です。

Javaだと親子関係にあるクラス間において、コンストラクタの
オーバーロードが出来ますよね。C++ではこれができないというのは
いいのですが、同様のことを実現する常套手段みたいなものは
ありますでしょうか?

(私の場合、親・子クラスともにデフォルトコンストラクタだけを定義して、
コンストラクタではない通常の関数で初期化しているのですが、これは
あまり良い方法には思えません)

何か良いアイデアがありましたら、よろしくお願いします。
388387:2010/12/25(土) 00:04:21
===== Java =====

public class SuperCls {
public SuperCls() { … }
public SuperCls(int a) { … }
}

public class SubCls extends SuperCls {
public SubCls() { … }
public SubCls(int a) { … }
public SuperCls(int a, int b) { … }
}

===== C++ =====

class SuperCls {
public:
SuperCls();
SuperCls(int a);
};

class SubCls : public SuperCls {
public:
SubCls();
SubCls(int a);
//SuperCls(int a, int b); ★エラー
init(int a, int b);
};
389デフォルトの名無しさん:2010/12/25(土) 00:05:09
Javaなんて低俗な言語つかった事ないから何言ってるのかわからない
390387:2010/12/25(土) 00:05:09
本当はSuperCls(int a, int b)を呼びたいのですが、それは無理なので
仕方なくデフォルトコンストラクタを呼んだ後にinitを呼ぶようにしています。

インスタンス生成時に初期化することを保証したいので
できればコンストラクタに引数を渡したい、ということです。
(子クラスは常に追加される可能性があるので、親クラスのコンストラクタを
あらかじめ複数用意することはできないものとします)

わかりにくかったらすみません。
391387:2010/12/25(土) 00:06:52
すみません、>>388に記述ミスです。


誤 //SuperCls(int a, int b); ★エラー

正 //SubCls(int a, int b); ★エラー
392デフォルトの名無しさん:2010/12/25(土) 00:14:28
Javaそんなめちゃくちゃなことできるの?
でもJavaでもそんなコードは普通書かないと思う

普通はこうでしょ。コンパイルはしてない
class SubCls : public SuperCls {
private:
int bb;
public:
SubCls(int a,int b){SuperCls(a); bb=b;}
};
393デフォルトの名無しさん:2010/12/25(土) 00:17:32
>Javaだと親子関係にあるクラス間において、コンストラクタのオーバーロードが出来ますよね。
はぁ?

>public SuperCls(int a, int b) { … }
コンパイル通らねーぞ。
394デフォルトの名無しさん:2010/12/25(土) 00:17:32
C++使ってるのにメンバイニシャライザ使わない奴が多い。何で?
395デフォルトの名無しさん:2010/12/25(土) 00:17:56
JavaとC++を両方使っている俺でも>>387が言っていることがわからん
396デフォルトの名無しさん:2010/12/25(土) 00:19:41
class SuperCls {
public:
SuperCls() {};
SuperCls(int a) {};
};

class SubCls : public SuperCls {
public:
SubCls() {};
SubCls(int a) {};
SubCls(int a, int b) {}; // ★エラーにならない
void init(int a, int b) {};
};

int main() {
SuperCls spc;
SubCls sbc;
}

全然エラーなんておこらないよ^^
397392:2010/12/25(土) 00:19:45
suimasendesita
最近C++あまり使ってないから忘れてた
398デフォルトの名無しさん:2010/12/25(土) 00:20:21
>>394
見た目にセンスを感じないから
399デフォルトの名無しさん:2010/12/25(土) 00:20:26
何も継承してなくても、javaだとコンストラクタのオーバーロードはできるわなww
400デフォルトの名無しさん:2010/12/25(土) 00:20:41
>コンストラクタではない通常の関数で初期化しているのですが
それでいい。C++はそのやり方しかできない。
401デフォルトの名無しさん:2010/12/25(土) 00:21:55
>>398
どこで初期化してんの?
402392:2010/12/25(土) 00:22:51
質問内容すりかわっとるw
ところで、C++にはjavaにないオプショナル引数的なものもあるんで
それも参考になるかもよ
403デフォルトの名無しさん:2010/12/25(土) 00:23:08
>>392
コンパイルは通るがSuperClsのテンポラリオブジェクト作ってるだけじゃ意味がない。
404デフォルトの名無しさん:2010/12/25(土) 00:25:10
>>392
そんなことする奴初めて見たよw
基底クラスの初期化になってねえーじゃんそれ
405デフォルトの名無しさん:2010/12/25(土) 00:25:39
>>401
コンストラクタスコープでだな
ちょっと複雑なコードだとイニシャライザだけで出来る処理ってあんまないし
ポインタと重いクラスだけだな
406デフォルトの名無しさん:2010/12/25(土) 00:26:46
初期化子リスト使ったほうが一般的には実行速度が早くなる
詳しくは、C++ Coding Standards 第48項
407392:2010/12/25(土) 00:27:29
あれだとテンポラリオブジェクト作るだけなんだっけ
なんか大分忘れてるな・・
SubCls(int a,int b):SuperCls(a),bb(b){}
こんな感じだっけ、確認はしてない

とりあえず自分が言いたいことは、
子クラスで親クラスのコンストラクタの
オーバーロードなんてされたらたまらないっていうことよ
408デフォルトの名無しさん:2010/12/25(土) 00:28:38
C++でなくアセンブリ言語を使ったほうが一般的には実行速度が速くなる
409デフォルトの名無しさん:2010/12/25(土) 00:30:36
>>407
大丈夫。幾らJAVA(笑)がクレイジーでも基本クラスと派生クラスで
コンストラクタはオーバーロードできない。
410デフォルトの名無しさん:2010/12/25(土) 00:38:41
自分の持ってるJAVA本でも
subクラスでsuperクラスのコンストラクタを呼ぶなら

sub( int a, int b ) {
super( a, b );
}

のように記述せよとなってるねぇ。
(ちなみに super は予約語であってクラス名ではない)
コンストラクタのオーバーライドはできないことになってる。
JAVA使ったことないからしらんけどw
411デフォルトの名無しさん:2010/12/25(土) 00:40:40
Java厨はトイレこもってろよ
412デフォルトの名無しさん:2010/12/25(土) 00:46:24
見た目にセンスを感じないといえば ファンクションtryブロックの構文だな。
struct x {
 int i;

 x() try : i() {}
 catch(...) {}
};
しかもコンストラクタとデストラクタだけcatchした例外が勝手に再スローされる不思議。
413デフォルトの名無しさん:2010/12/25(土) 00:53:45
改めて見ると387のコードは味があるな
元々の問題意識が一番謎。

C++的にはこんなところだと思う
・デフォルトコンストラクタは副作用が大きいから出来るだけ明示的に宣言して使わない
・explicit付ける
・コンストラクタとコピーコンストラクタ/代入演算子を定義
 自作クラスをコンテナに入れるなら特に必要
・virtualなデストラクタ

何個かオーバーロードするなら、
引数の少ないコンストラクタは一番引数の多いコンストラクタに丸投げ
(C++だとデフォルト引数も使えるけどJavaはむしろこれしか選択肢がない)
414デフォルトの名無しさん:2010/12/25(土) 01:00:59
要するに387はC++どころかJAVAもよくわかってないってオチだろ^^
415デフォルトの名無しさん:2010/12/25(土) 01:03:58
public class SubCls extends SuperCls {
public SubCls() { … }
public SubCls(int a) { … }
public SuperCls(int a, int b) { … } // ←ここ
}

Javaでこれが通るかどうかがわからないんだけど、通るの?
416デフォルトの名無しさん:2010/12/25(土) 01:05:00
Javaの話はどうでもいいよ
417デフォルトの名無しさん:2010/12/25(土) 01:13:06
>>400 やめろよバカ
418デフォルトの名無しさん:2010/12/25(土) 01:16:22
>>413
「デフォルトコンストラクタは副作用が大きい」の意味がわからない。
副作用って何のこと言ってるの?

コピーコンストラクタ・代入演算子が必要な場合として
「コンテナに入れるなら特に」という条件を挙げているのも謎。
デフォルトで済むなら要らないし、必要な場合はコンテナに
入れるかどうかにかかわらず必要なはず。
419デフォルトの名無しさん:2010/12/25(土) 01:19:30
>>413の書いていることも全体的に意味不明なのでスルーで
420デフォルトの名無しさん:2010/12/25(土) 01:39:26
何も考えずに猿のようにexplicitつけたりデストラクタをvirtualにする奴っているのな。
ついでにすべてのメンバをmutableにしておけ。
421デフォルトの名無しさん:2010/12/25(土) 10:29:03
>>420
俺なんて全てのローカル変数をautoにしちゃうぜ
422デフォルトの名無しさん:2010/12/25(土) 15:00:42
そしてスタックオーバーフローですねわかります
423デフォルトの名無しさん:2010/12/25(土) 15:36:52
いや、全てのローカル変数をautoにするのは何も問題ないのでは?w
staticローカル変数はsingleton作る時以外おすすめできないし
定数ならいいけど
424デフォルトの名無しさん:2010/12/25(土) 15:45:40
0xのautoのことじゃないの?
425デフォルトの名無しさん:2010/12/25(土) 16:04:47
explicitはとりあえず付けて
困ったら外すくらいで丁度いい
explicitなしのコンストラクタはバグの温床だ

virtualデストラクタも同じ
後で継承したいと思った時にvirtualじゃないと困る
(特に他人の作ったライブラリがそうなってた場合とか)
仮想関数テーブルケチりたい時や
継承するな!という意味で非virtualにするのはアリだがコメント書いてくれ
426デフォルトの名無しさん:2010/12/25(土) 16:11:42
あほか
427デフォルトの名無しさん:2010/12/25(土) 16:13:06
あほはおまえや
428デフォルトの名無しさん:2010/12/25(土) 16:14:09
設計段階で継承可能にするかどうか決めるだろ普通
あとで継承するかもしれないからとりあえずデストラクタvirtualとかないわ
429デフォルトの名無しさん:2010/12/25(土) 16:15:08
永遠に継承しないかもしれないクラスのサイズを何倍にも拡大するなんてアホどころか知的障害レベルだよ
430デフォルトの名無しさん:2010/12/25(土) 16:18:25
何倍てポインタ1つだろ
431デフォルトの名無しさん:2010/12/25(土) 16:20:32
継承前提のクラスで非virtualはさすがにやめて欲しいけど
それ以外はどっちでもいい
432デフォルトの名無しさん:2010/12/25(土) 16:23:38
>>428
設計段階でとりあえずvirtualにしておいて
最後に要らない所を削除していけばいいだけ
少なくともvirtualを忘れてしまう事はない
433デフォルトの名無しさん:2010/12/25(土) 16:24:19
>最後に要らない所を削除していけばいいだけ
は「設計段階の最後に」って意味な
434デフォルトの名無しさん:2010/12/25(土) 16:26:15
継承しないクラスはvirtualデストラクタにすんな
435デフォルトの名無しさん:2010/12/25(土) 16:28:58
もしかしてintの代わりにとりあえず__int64を使っておくとか
そういうこともやってるのかな?
ポインタ一つくらいの差だし
436デフォルトの名無しさん:2010/12/25(土) 16:30:15
サイズどうなるか怪しい所はtypedefだろ常考
437デフォルトの名無しさん:2010/12/25(土) 16:35:11
もとのオブジェクトが1byteだとアラインメントも考えると8倍になるね
256Mだったものが2Gになるんだぜメモリアロケート普通に失敗するよこれやばいよ
noncopyableもコストゼロだったのにvtableのせいで…処刑してもいいぐらい勿体無いことしてるね
438デフォルトの名無しさん:2010/12/25(土) 16:37:18
理由ある場合は外せば良いって言ってるだろアホか
439デフォルトの名無しさん:2010/12/25(土) 16:39:16
>>438
後から外さなければならない理由が見つかる場合はどおするの?
>>425の分析チームでは設計段階で継承するかどうかはわからないんでしょ?
440デフォルトの名無しさん:2010/12/25(土) 16:40:15
後からすればいいって考え方がアホだよね
441デフォルトの名無しさん:2010/12/25(土) 16:42:00
>>439
>>432-433くらいは読んでからにしてくれ
442デフォルトの名無しさん:2010/12/25(土) 16:44:04
世の中ウォーターフォールしか使われてないわけじゃないんだが
ウォーターフォール前提で話してる人もどうかと思う
443デフォルトの名無しさん:2010/12/25(土) 16:51:27
動的削除子機能付きの多態スマポを使えばvirtualデストラクタなんて不要
444デフォルトの名無しさん:2010/12/25(土) 16:52:06
先に設計を要求されているなら、
最初はvirtualを無条件で付け、
virtualが必要かどうかはその設計の最後に検討すれば良い

先に設計が要求されていないなら、
最初はvirtualを無条件で付け、
virtualが必要かどうかはプログラムの最終段階か
必要に迫られた際に検討すれば良い

virtualが残ってしまう事より
virtualを忘れてしまう事の方が怖いからな
445デフォルトの名無しさん:2010/12/25(土) 16:53:12
>>443
仮想関数0個の場合はどうすんの
446デフォルトの名無しさん:2010/12/25(土) 16:55:43
先に設計を要求されているなら、                 → 先に設計する
最初はvirtualを無条件で付け、                  → コードを書く
virtualが必要かどうかはその設計の最後に検討すれば良い → 設計が終る

おいなんか順番おかしいぞ
447デフォルトの名無しさん:2010/12/25(土) 16:57:39
まぁ設計の初期で継承されるかどうか決まってないのもどうかと思うが

後でvirtualのことを忘れて困るような人は
「無条件でつける」ってルールそのものを忘れる可能性があるな
バグを回避するためにC++以外を検討すべき
448デフォルトの名無しさん:2010/12/25(土) 16:59:17
設計段階でクラスのメンバまで設計する所としない所があるだけの話でしょ
449デフォルトの名無しさん:2010/12/25(土) 17:01:51
うちは関数の中身まで設計させられる
450デフォルトの名無しさん:2010/12/25(土) 17:09:09
基底クラスのポインタで派生クラスを保持するケースじゃないとvirtual dtorは意味を成さない
普通そういうケースに関しては事前に根から葉までキッチリ決めるからその段階でvirtualの必要性がわかる
だから普段は無意味なので付けずに、動的なポリモーフィック設計にすると決まった段階で付ければ良い
後から必要性の有無がわかるなんてケースはそもそも存在しないはずなんだまともな設計者ならね

そもそもC++の設計理念的に使わない機能にコストを払わないというものが大前提にある
これをわかってない人間はC++を使う資格がない
もっと他の安全で書きやすい親切でクールな高級言語を使うべきだ
そう、例えば…Rubyとかをね!
451デフォルトの名無しさん:2010/12/25(土) 17:10:45
まあ将来の拡張で必要になることはあるんじゃね
452デフォルトの名無しさん:2010/12/25(土) 17:16:15
それはその時拡張すれば
453デフォルトの名無しさん:2010/12/25(土) 17:18:23
virtualついてたら「このクラスライブラリは継承して使うんだな」って思っちゃうよ。
関数シグネチャ(const/volatile/virtual/throw含む)はクラス設計の一部でしょ。
明確な設計ポリシーがあるべき。
可能だからという理由で意味もなくvolatile関数連発されるのと同じで迷惑。
454デフォルトの名無しさん:2010/12/25(土) 17:23:31
virtualないけど勝手にいじれないコードだからということで
丸コピさせられる事が何度もあるぜ・・・
455デフォルトの名無しさん:2010/12/25(土) 17:23:40
>>445
関係あるか?
456デフォルトの名無しさん:2010/12/25(土) 17:26:05
ないな
457デフォルトの名無しさん:2010/12/25(土) 17:28:45
完璧な設計などあり得ないのだ
458デフォルトの名無しさん:2010/12/25(土) 17:29:17
みんな先に全部きっちり設計出来るの?
俺の頭では無理なんで、
後で修正しやすい形でソースコードを作ることを重視してる
459デフォルトの名無しさん:2010/12/25(土) 17:33:47
普通の関数はvirtual忘れると思った挙動にならないからすぐ分かるけど
デストラクタは違いがすぐ目に見えなかったりするしな
微妙にメモリリークするだけだったりとか

絶対忘れない自信なんてないから
できるだけ安全な方向に倒したいところ
460デフォルトの名無しさん:2010/12/25(土) 17:35:00
>>446
コードも書かずに、テストもせずに設計が終わったとでも言うのかい?

>>454
動的削除子を使えば丸コピは避けられたかもね。
461デフォルトの名無しさん:2010/12/25(土) 17:36:30
まあ>>454はデストラクタの話じゃないけどな
でも設計なんて所詮そんなもんだと思う
462デフォルトの名無しさん:2010/12/25(土) 17:39:30
>>458
それも設計の一部なんだよ。
"Programming is a design activity ..."
http://www.google.co.jp/search?q=%22what+is+software+design%22
463デフォルトの名無しさん:2010/12/25(土) 17:41:37
4バイトや8バイトをケチって
うっかりメモリリーク起こすのもばからしいな
464デフォルトの名無しさん:2010/12/25(土) 17:43:10
うっかり継承するのを防ぐべき
465デフォルトの名無しさん:2010/12/25(土) 17:44:34
4byteや8byteをケチるというとカスみたいな節約に聞こえるかもしれないが
オブジェクトは場合によっては何千何万とつくられるかもしれないでしょう
もとのクラスのサイズと比較して何%の無駄とか節約と言ってみればことの重大性に気付くはずだけどなぁ
466デフォルトの名無しさん:2010/12/25(土) 17:45:03
お前は全クラスを何千何万と作ってんのかw
467デフォルトの名無しさん:2010/12/25(土) 17:46:03
>>466
なわけねーだろ
そういうクラスもあるってだけだ
子供みたいな返し方はやめてくれ
468デフォルトの名無しさん:2010/12/25(土) 17:48:33
それに何千何万程度ならそれぞれ4〜8バイト増えても全然大した事ないな
469デフォルトの名無しさん:2010/12/25(土) 17:49:26
どちらにしろ普通のケースじゃカスみたいな節約にしかならないな
470デフォルトの名無しさん:2010/12/25(土) 17:55:18
virtual付けるぐらいならctorとdtorにデバッグオンリーマクロでカウンタ付ける
手間も対して変わらんしリリース時にはコストも無い
ぶっちゃけこれに比べればvirtualデストラクタ(笑)でセーフティのメリットは一つもない
471デフォルトの名無しさん:2010/12/25(土) 17:56:30
それかなりの手間だろう
472デフォルトの名無しさん:2010/12/25(土) 18:01:00
コンストラクタ1つ増やした時にカウンタ回すの忘れそう
特に他人がコード変更した時
473デフォルトの名無しさん:2010/12/25(土) 18:08:46
>>471
これでかなりの手間というなら普段どんだけ楽な仕事してるんだろうな

>>472
そこまでアホだとクラス増やしたときにvirtual dtor忘れそうwww



まあそれでもまだ不安ならデバッグ時のみoperator new/deleteをカウンタ付きに差し替えるといいよ
virtualがなくて困るのはdeleteした時だからこれでほぼ十分
これなら毎回virtualを書く手間も、書き忘れも無くなってよかったね^^
474デフォルトの名無しさん:2010/12/25(土) 18:12:03
gcc の -Wnon-virtual-dtor があれば何も要らんのじゃないか?
475デフォルトの名無しさん:2010/12/25(土) 18:20:59
>>462
読んでみた。
なんというか、ウォーターフォール自体がそもそも時代遅れってことだな
しかもこれ1992年の記事だし
476デフォルトの名無しさん:2010/12/25(土) 18:26:41
設計の手法。ボトムアップとなんだっけ
477デフォルトの名無しさん:2010/12/25(土) 18:30:54
アジャイルだよアジャイル
478デフォルトの名無しさん:2010/12/25(土) 18:39:28
スパイラルとかラピッドとかプロトタイピングとか
479デフォルトの名無しさん:2010/12/25(土) 18:57:28
設計手法って名前やテキストでの説明は知られてるけど実際中身はよく知られてないよね
480デフォルトの名無しさん:2010/12/25(土) 19:03:02
デストラクタの話題が出たのでついでに質問したいんですがよろしいでしょうか
プログラマが間違っていないにもかかわらず開放に失敗する可能性のあるリソースをデストラクタで開放してはいけないと聞きました
そういったリソースはどうすれば例外安全に処理できるのでしょうか?
481デフォルトの名無しさん:2010/12/25(土) 19:05:15
unique_ptr
482デフォルトの名無しさん:2010/12/25(土) 19:09:28
>>480
デストラクタで例外起こったら
握りつぶす(デストラクタ内でcatchして外に出さない)か
アプリケーション終了するしかない

そしてデストラクタでの解放はあくまで保険で
手動での解放を徹底するしかない
483デフォルトの名無しさん:2010/12/25(土) 19:14:38
>>480
std::ofstream の close() みたいな、 public な破棄処理を提供する。
484デフォルトの名無しさん:2010/12/25(土) 19:15:02
解放に失敗するリソースって、解放できないんだから、そのまま見捨てて忘れ去るしかないよね?
なんかやりようある?
485デフォルトの名無しさん:2010/12/25(土) 19:16:45
失敗するとマイクロソフトなどに自動でクレームを送信するコードを仕込む
486デフォルトの名無しさん:2010/12/25(土) 19:18:21
>>480
http://d.hatena.ne.jp/wraith13/20101025/1288015597
> trickerr.h のようなものを利用すれば別にデストラクタで失敗するような処理を実行しても問題ないんですよ。そんな馬鹿馬鹿しい制限を受け入れなくていいんですよ。
らしいぞ。
487デフォルトの名無しさん:2010/12/25(土) 19:19:02
なんのためにデストラクタが用意されてるのか分からんな
488デフォルトの名無しさん:2010/12/25(土) 19:22:07
管理クラスをかませておけば、
解放に失敗したリソースを後で解放できるようにすることもできる
489デフォルトの名無しさん:2010/12/25(土) 19:25:09
時間が経てば解放できるようになるかも・・ってことか?
うーむ
490デフォルトの名無しさん:2010/12/25(土) 19:37:33
結局デストラクタがない言語でどうするかが分かってないと
デストラクタのある言語でも分からないということね
491デフォルトの名無しさん:2010/12/25(土) 20:31:34
>>484
プロセス外にリソースが残るものはログ出して放置で問題ない。
プロセス内にリソースが残るものは運用の人が気づくようアラーム出して、
プログラムを再起動してもらうことを祈りつつ放置。
492デフォルトの名無しさん:2010/12/25(土) 22:15:19
not RAII
void foo(){
 Hoge hoge;
 try{
  hoge.open("somewhere");
  hoge.write(data);
  hoge.close();
 }catch(...){
  hoge.restore();
 }
}
RAII
void foo(){
 try{
  Hoge hoge("somewhere");
  hoge.write(data);
 }catch(...){
  hoge.restore();//compile error
 }
}
デストラクタでの例外許可してもあんまり意味ないなあ。
493デフォルトの名無しさん:2010/12/25(土) 22:20:50
デストラクタでの例外許可は禁忌
494デフォルトの名無しさん:2010/12/25(土) 23:01:52
デストラクト失敗したらHDDをフォーマットすりゃいいじゃん
そんな糞プロジェクトは綺麗に消去した方が吉
495デフォルトの名無しさん:2010/12/26(日) 02:53:39
int i = 100;
int* p = &i;
const int** const pp = &p;

error C2440: '初期化中' : 'int **' から 'const int **' に変換できません。
って出ます。どうやってconstにすればいいんでしょうか。
496デフォルトの名無しさん:2010/12/26(日) 03:05:06
全部 const にしましょう。
int const * const * const pp = &p;
497デフォルトの名無しさん:2010/12/26(日) 03:07:21
書き込もうとしたら書き込まれてた
真ん中がconstじゃなかったら端っこのconst性は保証出来無いってことだ
498デフォルトの名無しさん:2010/12/26(日) 03:22:05
const int*p=&iでも可 497は誤り
499デフォルトの名無しさん:2010/12/26(日) 10:16:42
const int** は const int* へのポインタという意味なので
int* へのポインタをつっこむ事ができない
signed int へのポインタに
unsigned int へのポインタをつっこんでるのと
感覚的には同じなんじゃない
500デフォルトの名無しさん:2010/12/26(日) 11:01:15
RAIIでデストラクタの例外の問題に会わない様に下準備がひつようかな

たとえば、close系のメンバー関数はvoid返しで例外を投げないのようなコーディング規則とか。
501デフォルトの名無しさん:2010/12/26(日) 11:03:20
closeに失敗するケースがある場合はもうどうしようもなくて、
voidかつ例外なしにするのは危険
502デフォルトの名無しさん:2010/12/26(日) 11:10:23
>> 495 俺メモ↓
      // 代入元
      int *const *    *   *   *const *   *   *   p = 0;

// 1.基本はトップレベル以外同じにする
// ┌──────同じ──────────┐ ↓ここは違っていい
      int *const * * *   *const *   *   *   p1 = p; // OK
      int *const * * *   *const *   *   *const p2 = p; // OK

// 2.もし違ったら、違った地点からトップレベルの直前までは全てconstにする
// ┌───同じ─────┐↓違う ┌↓const必要┐↓ここは違っていい
      int *const * * *const *const *const *const *   p3 = p; // OK
      int *const * * *const *const *const *const *const p4 = p; // OK
503デフォルトの名無しさん:2010/12/26(日) 11:12:49
・小さいファイル開いたら全部メモリに読み込む
・大きいファイルはひらきっぱなしにしないでまとまった処理があるたびに開く
一般的なファイルに関してはこれで乗り切ってる
WinAPIのハンドルとかが扱いに困る
504デフォルトの名無しさん:2010/12/26(日) 11:13:45
デストラクタで初めて例外で悩むのではなくて、closeでほいほい例外を出さないように準備が必要だっていいたいの。

closeでどうしても例外が必要なら、それにつられてデストラクタで例外で悩むということになる。
デストラクタが悪いというよりも、close系のメソッドが例外を投げなくてすむようにしないと解決しないんじゃね?
505デフォルトの名無しさん:2010/12/26(日) 11:15:55
>>502 オレメモ
多重のポインタを使う前に設計を見直す
506デフォルトの名無しさん:2010/12/26(日) 11:17:29
出来るだけclose系は例外出したくないけど、
出さないために無理して壮大なコード書こうとは思わないな。
507デフォルトの名無しさん:2010/12/26(日) 11:17:30
>>504
ハードやネットワークの問題が絡むとプログラマがミスをしなくても失敗しうるからそれは無理だよ
508デフォルトの名無しさん:2010/12/26(日) 11:20:56
スレッドクラスのデストラクタはどうすれば良いだろう
terminateする? それはちょっと
終わるまでwaitする? それもちょっと
管理を放棄するのがせいぜいか
509デフォルトの名無しさん:2010/12/26(日) 11:27:03
>>508
メイン側の話なら、タイムアウトつきjoinしてTerminateするかな。
メイン側で解放した後のメモリにアクセスされると困るから。
510デフォルトの名無しさん:2010/12/26(日) 15:09:06
>>507
伝統的に(?) flush と close がいっしょになってるのが悪いんだろ。
そんなに無理なことかな?
511デフォルトの名無しさん:2010/12/26(日) 15:17:22
別になっていようがデストラクタで問題になる事に変わりはないと思うけど
512デフォルトの名無しさん:2010/12/26(日) 15:18:54
flushなしにcloseしたら失敗する実装になるだけじゃないか
結局close失敗するじゃん
513デフォルトの名無しさん:2010/12/26(日) 15:20:12
バッファされた操作の実行とリソースの破棄が別になってれば、デストラクタでは
リソースを破棄するだけで済むでしょ。
514デフォルトの名無しさん:2010/12/26(日) 15:42:57
two-phase terminate パターンで遅延と回復を願ってる
515デフォルトの名無しさん:2010/12/26(日) 15:44:36
C#のFileStreamはCloseは例外出すのに、Disposeは例外ださない。
using(var f = new FileStream())…
のとき、Close()が出した例外はどこに行ってしまうだって気になってる。
516デフォルトの名無しさん:2010/12/26(日) 16:49:20
握りつぶす!
517デフォルトの名無しさん:2010/12/26(日) 16:50:10
>>513
デストラクタではflushせずにcloseしろってこと?
それはちょっと・・・
518デフォルトの名無しさん:2010/12/26(日) 16:55:09
>>517
そう。 flush() は write() (の繰り返し)の最後にユーザーが行うものとする。

今でもこれを忘れているコードはデストラクタで close() に伴って行われる
flush() でのエラーに対応できていない。

慣れの問題はわかるが、それ以外に何か問題があるかい?
519デフォルトの名無しさん:2010/12/26(日) 17:05:15
手動でフラッシュを強制するなら何のためにデストラクタがあるんだ?
520デフォルトの名無しさん:2010/12/26(日) 17:07:08
デストラクタに全部まかせんでもいいでしょ
521デフォルトの名無しさん:2010/12/26(日) 17:09:24
>>519 リソース漏れを防ぐためだろ。
522デフォルトの名無しさん:2010/12/26(日) 17:11:25
滑り止め的な感じ?
523デフォルトの名無しさん:2010/12/26(日) 17:57:15
デストラクタでもflushして、失敗したら無視すれば良いだろ
524デフォルトの名無しさん:2010/12/26(日) 18:35:02
これって安全です?
関数呼び出しのカッコ内で生成されるオブジェクトの生存期間がよくわかんなくなり・・・

std::string helloFunc() {
  return std::string("hello1");
}
struct HelloStruct {
  std::string text;
  HelloStruct() { text = "hello2"; }
  operator const char*() { return text.c_str(); }
};
printf("test1:%s\n", helloFunc().c_str());
printf("test2:%s\n", (const char*)HelloStruct());

VC++でデバッガで追うとstd::stringのデストラクタは安全なタイミングで呼ばれてるんですが
他のコンパイラに持っていっても問題ないのかなと
525デフォルトの名無しさん:2010/12/26(日) 18:41:29
>>524
一時オブジェクトの寿命は文(正確には完全式)の終わりまであるから、大丈夫。

それとは別に、その変換演算子 operator const char* () は一般的な変換演算子の
話として危険だと思う。
526デフォルトの名無しさん:2010/12/26(日) 18:53:29
>>524
カッコ内で生成されるオブジェクトってのがどれをさしてるのかわからんけど
"hello1"のことならばは生成されてすぐhellofuncの中でデストラクタが呼ばれる。
ただ、コピーコンストラクタで内容がコピーされて
それが戻るので大丈夫なはず
527デフォルトの名無しさん:2010/12/26(日) 19:04:28
よかった、ありがと!戻ってきたオブジェクトは文の終わりまでOKなのね

>>524
キャスト演算子はどっかで見たなあと書いたけど確かに・・・
たいして便利でもないしc_str()関数とか作った方が間違いにくいですね
実際に最初printfにキャスト無しで渡してハングさせたし
528デフォルトの名無しさん:2010/12/26(日) 19:09:22
>>524
まあ、無駄に遅いプログラムが出来るだけ。
個人ツールなら何でもいい、仕事でやったらどうだろうね〜〜
529デフォルトの名無しさん:2010/12/26(日) 19:46:40
>>526
そういうのは普通戻り値最適化されて、
return std::string("hello1"); の時点で
戻り値用のテンポラリオブジェクトがコンストラクトされるようなコードが生成される
530526:2010/12/26(日) 20:36:30
>>529
C++ 0b>=ではそれが仕様的に許されることになったとか
そんな話をどっかで見たような
531526:2010/12/26(日) 20:37:29
ん、過去形はおかしいな
532デフォルトの名無しさん:2010/12/26(日) 20:44:59
>>530 C++98 から許されてはいるから、そんな話はないと思うよ。
533デフォルトの名無しさん:2010/12/26(日) 20:49:46
パフォーマンスを調べるときにとりあえずforで大量に呼んで計測してるんだけど
このforのオーバーヘッドなしの測定方法ってある?
534デフォルトの名無しさん:2010/12/26(日) 20:54:58
マクロかTMPにする
535デフォルトの名無しさん:2010/12/26(日) 20:56:32
for のオーバーヘッドがどのくらいかわかれば差し引くだけ
中学レベルの数学でどうにでもなる
536デフォルトの名無しさん:2010/12/26(日) 21:01:07
>>533 for の中だけ計測すればいいじゃない
537デフォルトの名無しさん:2010/12/26(日) 21:59:01
>>533
・無視する
・ループをunrollingするソースコンバータを作って評価
538デフォルトの名無しさん:2010/12/26(日) 22:09:39
forのみで処理させて、それを引けば
forの影響はある程度なくせるけど

でも結局ループでパフォーマンス調べるのでは
キャッシュの影響が入っちゃうから
本当のパフォーマンスなんてのは分からないものだ
539デフォルトの名無しさん:2010/12/26(日) 22:11:45
>>533
一般的な実験では
何も内容(効果)が無いであろうものも同時に調べておき、最後にそれらを比較する
540デフォルトの名無しさん:2010/12/26(日) 22:56:31
Hoge *p = new Hoge(new Fuga);

これって例外でたらリークする?
541デフォルトの名無しさん:2010/12/26(日) 22:57:42
する
542デフォルトの名無しさん:2010/12/26(日) 23:01:06
人に聞かなくてもデストラクタにトレース出力入れればわかるだろ
543デフォルトの名無しさん:2010/12/26(日) 23:06:07
>>540
Hogeコンストラクタの実装次第、としか言いようが無い
とりあえず

class Hoge {
public:
 Hoge(Fuga* fuga) : m_fuga(fuga), ... { ... }
private:
 std::auto_ptr<Fuga> m_fuga;
 ...
};

となってるならリークしない
544デフォルトの名無しさん:2010/12/26(日) 23:09:41
>>543
new Fuga の評価後に Hoge のための operator new で bad_alloc 出たら
Hoge のコンストラクタ定義に関係なく漏れるでしょ。
545デフォルトの名無しさん:2010/12/26(日) 23:13:48
>>544
operator newの実装次第としか言いようがない。
ユーザー定義のoperator newがあってガベージコレクションが
実装されているかもしれない。
546デフォルトの名無しさん:2010/12/26(日) 23:18:35
newで生成したオブジェクトを受け取る設計は糞だと思うが、
 auto_ptr<Fuga> unko(new Fuga);
 Hoge *p = new Hoge(unko);
 unko.release();
でいいんじゃない?
547デフォルトの名無しさん:2010/12/26(日) 23:19:03
>>544
ああ、そうか
それ忘れてた
まあoperator newまで考えると分からんが、危険だな
548デフォルトの名無しさん:2010/12/26(日) 23:23:30
>>546
Hoge のコンストラクタで所有権が移動するなら中で release() するだろ。
移動しないなら release() しちゃダメだし。
549デフォルトの名無しさん:2010/12/26(日) 23:43:32
もとが Hoge *p = new Hoge(new Fuga); なんだから、
Hogeの引数はauto_ptrじゃなくてFuga*型だし、
Hogeがメモリ解放する設計になってるんでは?
550デフォルトの名無しさん:2010/12/26(日) 23:46:13
>>549 なら new Hoge(unko.get()) だな。ただの書き間違いか。
551デフォルトの名無しさん:2010/12/26(日) 23:51:04
おそらく.get()の間違いとして、auto_ptrで囲めば例外安全になるの?
552デフォルトの名無しさん:2010/12/26(日) 23:56:24
Hogeの引数をauto_ptrにしろって話じゃないの?
553デフォルトの名無しさん:2010/12/26(日) 23:58:19
Hogeの引数がスマポでimplicitコンストラクタ持ってるなら
>>540でも例外安全か
554デフォルトの名無しさん:2010/12/27(月) 00:01:34
auto_ptr<Hoge> hoge(auto_ptr<Fuga>(new Fuga));
これでいいのかな

>>553
>>544を100ぺん読み直せ
555デフォルトの名無しさん:2010/12/27(月) 00:04:46
> auto_ptr<Hoge> hoge(auto_ptr<Fuga>(new Fuga));

auto_ptr<Hoge> hoge(new Hoge(auto_ptr<Fuga>(new Fuga)));
556デフォルトの名無しさん:2010/12/27(月) 00:05:51
ボスはサンタもやってるのか
557デフォルトの名無しさん:2010/12/27(月) 00:10:35
>>554
引数のテンポラリオブジェクトの作成とnewって
どっちが先だっけ?
558デフォルトの名無しさん:2010/12/27(月) 00:14:48
C++って糞だな。
おJAVA様(笑)なら new Hoge(new Fuga()) でオーケーだぜ
559デフォルトの名無しさん:2010/12/27(月) 00:16:24
>>558
結局そこに行き着くんだよなぁ
C++もそろそろ根っこから新しくしないと時代に取り残されるよ
560デフォルトの名無しさん:2010/12/27(月) 00:24:14
C++にガベージコレクションを付けろと?
561デフォルトの名無しさん:2010/12/27(月) 00:26:04
>>554-555
それでも結局 new Fuga の後 auto_ptr の構築前に operator new の呼び出しが
行われる可能性があるからダメ。

new の結果は常に名前つきのスマートポインタで保持するのが最善手。
http://www.boost.org/libs/smart_ptr/shared_ptr.htm#BestPractices
> A simple guideline that nearly eliminates the possibility of memory leaks is:
> always use a named smart pointer variable to hold the result of new.
562デフォルトの名無しさん:2010/12/27(月) 00:34:19
Hogeがテンプレートならいいけど、そもそもauto_ptrを受け取る設計はいかんでしょ。
operator newとoperator deleteでC++ライブラリの不整合が
あったらどうすんの
563デフォルトの名無しさん:2010/12/27(月) 00:36:54
>>562
どうにもならんと思うが、 auto_ptr を受け取らなければなんとかなるのか?
564デフォルトの名無しさん:2010/12/27(月) 00:39:03
>>561
newとコンストラクタ引数の評価順はundefinedかunspecifiedってことか
それだと無理だな
565デフォルトの名無しさん:2010/12/27(月) 00:42:13
動的削除子を載せた shared_ptr のコピーにすればライブラリの不整合とやらがあっても大丈夫だね。

だからと言って auto_ptr 渡しに原因があるかのように言うのは筋違いだろう。
生ポインタだって unique_ptr だって、動的削除子無しで所有権の移動をする限り同じこと。

そもそもライブラリの不整合なんて心配しないといけないのもおかしいだろうと思う。
566デフォルトの名無しさん:2010/12/27(月) 00:47:55
auto_ptrは解放を自動化するための技でしかなくて、
ライブラリ境界をまたいでnew/deleteしないような設計にするのは基本だろ。
deleteする側が性的リンクしてnewする側が動的リンクとか不整合は簡単に起こる。
567デフォルトの名無しさん:2010/12/27(月) 00:49:15
operator newを定義して、その中ですまぽ<T> hogeに入れて、*hogeを返すって実装はどう
568デフォルトの名無しさん:2010/12/27(月) 00:51:31
>>567 意味がわからない。
569デフォルトの名無しさん:2010/12/27(月) 01:06:08
struct Test {
Test* mawari[9];
};
ってなってるやつを
0 1 2
3 4 5
6 7 8
って考えて
Test t;
t.mawari[0][0]で添え字4にアクセス
t.mawari[-1][-1]で添え字0にアクセス
t.mawari[-1][0]で添え字3にアクセス
みたいなことをオペレータでやりたいんですけどどうすればできますか?
570デフォルトの名無しさん:2010/12/27(月) 01:08:17
proxyを使います
571デフォルトの名無しさん:2010/12/27(月) 01:09:06
Test *p = reinterpret_cast<Test (*)[3]>(mawari + 4);
p[0][0];
みたいな感じ? 確認はしてない。
572571:2010/12/27(月) 01:27:29
xとyが逆だったすまん。
int ar[] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
struct proxy_y { int *p, x;
 proxy_y(int *p, int x) : p(p), x(x) {}
 int &operator[](int y) { return p[4 + (3*y) + x]; }
};
struct proxy { int *p;
 proxy(int *p) : p(p) {}
 proxy_y operator[](int x) { return proxy_y(p, x); }
};
proxy p(ar);
573デフォルトの名無しさん:2010/12/27(月) 01:28:23
struct Test {
struct {
struct {
Test& operator[](int i);
} operator[](int i);
} mawari;
Test& operator=(Test*);
};
とりあえずプロトタイプ宣言的なものは上の形でできました(VC++で赤い波線が消えました)
574デフォルトの名無しさん:2010/12/27(月) 01:28:30
>>569
めんどくさいから mawari(int, int) って関数にしたほうがいいよ。
575デフォルトの名無しさん:2010/12/27(月) 01:29:19
コスト面でもoperator()だよね普通
576デフォルトの名無しさん:2010/12/27(月) 01:34:08
>>574
思ったよりめんどうだったので関数でやってみます
577デフォルトの名無しさん:2010/12/27(月) 13:55:06
>>574
やっぱり止めます
578デフォルトの名無しさん:2010/12/27(月) 20:39:10
なんでだよ。
int &marari(int x, int y) { return p[4 + (y * 3) + x]; }
が一番シンプルだよ
579デフォルトの名無しさん:2010/12/27(月) 23:58:15
無理にoperatorを使う必要はない
Test* Test::mawari(int x, int y) { return t.mawari[(y + 1) * 3 + (x + 1)]; }
で十分
演算子オーバーロードにこだわるのは初心者にありがちな悪癖
580デフォルトの名無しさん:2010/12/27(月) 23:58:42
ああ t. いらねえや
581576:2010/12/28(火) 01:21:10
>>577は自分ではありません
あと、関数でやろうとしましたが=のオペレータがどうしたらいいかわからなくなったのでやめました
いろいろな意見を出していただきありがとうございました

struct Test {
Test* mawari[9];
void move(int index){
 *this = this->mawari[index];
}
}
のようにして
Test t;
t = t->mawari[2];

t->move(2);
のようにしようとすると*this = this->mawari[index];の=に赤波が付きます
このようなことはできるのでしょうか
582デフォルトの名無しさん:2010/12/28(火) 01:47:13
>>581
赤波って、コンパイルエラーだろ。エラーメッセージを見ろ。
(その例だとどうせ「型が合いません」とか言われてるはず)
583デフォルトの名無しさん:2010/12/28(火) 01:52:26
すいません
 これらのオペランドと一致する演算子"="はありません
とでます
*thisに代入できないということなのでしょうか
584デフォルトの名無しさん:2010/12/28(火) 01:55:41
>>583
= の左辺が Test 型、右辺が Test* 型になってる
585デフォルトの名無しさん:2010/12/28(火) 02:01:12
やっとわかりました
thisってconstだから代入できないんですね
ということは自分自身を変更することはできないということでしょうか?
586デフォルトの名無しさん:2010/12/28(火) 02:06:11
>>585
メンバ関数 move() の中で this は const だが *this はそうではない。
587デフォルトの名無しさん:2010/12/28(火) 02:07:14
>>585
= の左辺が Test 型、右辺が Test* 型になってる
588デフォルトの名無しさん:2010/12/28(火) 03:02:59
*this = *this->mawari[index];
だとエラーはありませんでしたが
t = t->mawari[2];
と等価の働きはしませんでした
t = t->mawari[2];と同じ動きにはできないでしょうか
589デフォルトの名無しさん:2010/12/28(火) 03:39:48
>>588
t の型が Test なのか Test* なのか、はっきりしないな。
「等価の働きはしませんでした」と言われてもどうなったのかがわからない。

コンパイルできるソース貼れ。
590デフォルトの名無しさん:2010/12/28(火) 07:07:52
Windows(VC++)のマルチスレッドで、スレッドBからスレッドAの中で割り込みを発生させることはできますか?
UNIXのシグナルのような感じで、スレッドAが動作中にスレッドBからスレッドAの中で割り込みを発生させて、別の処理をさせたいのですが
591デフォルトの名無しさん:2010/12/28(火) 07:21:36
>>590
>スレッドBからスレッドAの中で割り込みを発生させて
オマエはUNIXシグナルの基礎を理解していなさそうだから、
あきらめた方がいいよ。
592591:2010/12/28(火) 07:28:28
VC++はスレッドBでraiseすると、シグナルハンドラは確かスレッドBで実行される。
Ctrl+CとかのSIGINTだと別スレッド。
シグナルハンドらはvolatile変数のフラグ立てるぐらいしか処理しちゃしけない。
これでUNIXシグナル相当のことはできるはず。
593デフォルトの名無しさん:2010/12/28(火) 07:28:46
>>591
わかりずらかったでしょうか?
UNIXのシグナルはプロセスになっちゃいますが、シグナルみたいなことをスレッドでやりたいのですが
594デフォルトの名無しさん:2010/12/28(火) 07:29:35
安価ミスった
>>593>>592への返信です
595デフォルトの名無しさん:2010/12/28(火) 07:42:47
基礎を理解していないんじゃなくて、説明が下手だったのか。

>>594
で、メッセージを投げるんじゃダメな理由が何かあるのか?
どっちみち、ここよりも汎用C/C++スレかWinAPIスレで聞いた方がよさそうだが。
596デフォルトの名無しさん:2010/12/28(火) 10:56:27
STLコンテナって一般のコンテナと何が違うんですか?
ググルとアルゴリズムがどうのこうのと言ってるんですがよくわかりません
597デフォルトの名無しさん:2010/12/28(火) 10:57:53
一般のコンテナより少ない体積で沢山入る
マジ便利
598デフォルトの名無しさん:2010/12/28(火) 11:04:25
一般のコンテナとは何ぞや
599デフォルトの名無しさん:2010/12/28(火) 11:21:12
今までは標準のコンテナがなかったのさ。
だからソフトハウスが独自に用意するか、さもなくばコンテナなしに済ませてたってこと。
600デフォルトの名無しさん:2010/12/28(火) 11:22:49
>>596
C++標準のコンテナ。それ以上の意味はない。
601デフォルトの名無しさん:2010/12/28(火) 16:20:26
VC++でメルセンヌツイスタ(SFMT)を使いたいのですが、どのようにすれば組み込めますか?
プロジェクトと同じフォルダにSFMT.hとSFMT.cを移してソースコードに#include"SFMT.h"だけではだめなのでしょうか
602デフォルトの名無しさん:2010/12/28(火) 18:11:53
アプリの使い方はそのアプリのスレに行ってくれ。
せめて何がどうダメだったのか位書いてあれば兎も角、ここはエスパースレじゃない。
603デフォルトの名無しさん:2010/12/28(火) 18:28:07
エスパドリューがエスパーの履く靴だと思っていたあの頃…
604デフォルトの名無しさん:2010/12/28(火) 18:42:41
>>602
わかりました。
-----------------------
#include"SFMT.h"
int main(){
init_gen_rand(0);
return 0;
}

------------------------

上記を入力してデバッグすると

1>------ ビルド開始: プロジェクト: tst, 構成: Debug Win32 ------
1> tst.cpp
1>tst.obj : error LNK2001: 外部シンボル ""void __cdecl init_gen_rand(unsigned int)" (?init_gen_rand@@YAXI@Z)" は未解決です。
1>c:\(中略)\visual studio 2010\Projects\tst\Debug\tst.exe : fatal error LNK1120: 外部参照 1 が未解決です。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

というエラーが出ます。何か分かりましたらよろしくお願いします
605デフォルトの名無しさん:2010/12/28(火) 18:45:27
>>604
extern "C" void __cdecl init_gen_rand(unsigned int);
606デフォルトの名無しさん:2010/12/28(火) 18:45:34
.cもプロジェクトに追加しなさい
607デフォルトの名無しさん:2010/12/28(火) 19:32:02
MinGW gcc4.4.1 でコマンドラインアプリケーションを作っているのですが
標準C++に違反しないまま、他人が配布しているDLL内にある関数を使用することはできますか?

ググってみたところ、どれもwindows.hをincludeして
LoadLibrary,GetProcAddress,FreeLibrary を使用しているようですが。
608デフォルトの名無しさん:2010/12/28(火) 19:57:29
>>607
LoadLibraryみたいなAPIを使うことを標準C++に違反するとは言わない。
そんな事言ったらそのDLLを使うこと自体が違反だと思うが?

…ちょっとエスパーすると、
そのDLLもDLLと言うモノ自体もC++の規格にはないので
あなたの求めるような方法が存在するわけがない。
609デフォルトの名無しさん:2010/12/28(火) 20:01:59
DLLなんてものがC++にあると思っているバカがいるのはここですかw
610デフォルトの名無しさん:2010/12/28(火) 20:12:30
インポートライブラリつかえ
611デフォルトの名無しさん:2010/12/28(火) 20:31:25
>>607
DLL内で例外処理さえ使わないようにしておけば安全
例外処理はコンパイラに依存するので、同じコンパイラで組んだDLLでないと
例外処理を行わせると未定義の振る舞いになる
612デフォルトの名無しさん:2010/12/28(火) 21:15:33
DLLは結局Cで書くんだよね俺らって
613デフォルトの名無しさん:2010/12/28(火) 21:15:42
>>605-606
ありがとうございます。が、今度は別のエラーが出てしまいました.。まだ何か足りないようです
状況:プロジェクトのソースファイルにSFMT.cを追加
ソース"tst.cpp"
------------------------
#include"SFMT.h"
extern "C"{
void __cdecl init_gen_rand(unsigned int);
}
int main(){
init_gen_rand(0);
return 0;
}

------------------------
1>------ ビルド開始: プロジェクト: tst, 構成: Debug Win32 ------
1> SFMT.c
1> tst.cpp
1>c:\(中略)\visual studio 2010\projects\tst\tst.cpp(2): error C2732: リンケージ指定は、別の 'init_gen_rand' に対する指定と矛盾しています。
1> c:(中略)\visual studio 2010\projects\tst\tst.cpp(2) : 'init_gen_rand' の宣言を確認してください。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
init_gen_randの下に下線が出ており、マウスポインタを置くと
「リンケージ指定は前の"init_gen_rand"(宣言された行 79 ファイル名STMT.h)と互換性がありません」
と表示されます。なお、SFMT.hの79行目は以下の通りです。
--------------------
void init_gen_rand(uint32_t seed);
--------------------
何か助言がいただけましたら幸いです
614デフォルトの名無しさん:2010/12/28(火) 21:22:45
>>613
extern "C"{
void __cdecl init_gen_rand(unsigned int);
}


なんで中括弧つけた?
615デフォルトの名無しさん:2010/12/28(火) 21:33:31
>>614
あ、さーせん。それはネットで調べてていろいろ試してたのがそのままだからです。

-----------------
extern "C" void __cdecl init_gen_rand(unsigned int);
-----------------
に表記を直してもエラーは同じものが出ています
616デフォルトの名無しさん:2010/12/28(火) 21:49:52
extern "C"{
#include"SFMT.h"
}
int main(){
init_gen_rand(0);
return 0;
}
617デフォルトの名無しさん:2010/12/28(火) 21:53:43
>>616
おお!通りました!
ありがとうございます!!
618デフォルトの名無しさん:2010/12/29(水) 04:47:54
SFMTである必要がなくて、単にメヌセンヌツイスタ使いたいだけなら、
Boost、TR1 (VC++ 2008)、0x (VC++ 2010)のRandomライブラリを使うのも手。
619デフォルトの名無しさん:2010/12/29(水) 12:03:33
そんなことは知っているが誰も聞いてない。
620デフォルトの名無しさん:2010/12/30(木) 21:29:51
MFCのCArrayのGetDataのようなことをSTLのvectorでやりたいんだけど、できますか?
CArray<char, char> hoge;
char *parray = hoge.GetData();
みたいにデータの先頭のアドレスを取得したいのです
(もちろんこれがSTLではあまり綺麗なやり方でないことは承知しています)

std::vector<char> hoge;
char *parray = hoge.begin();
だと「error C2440: '型キャスト' : 'std::_Vector_iterator<_Ty,_Alloc>' から 'char *' に変換できません」のエラーになります(VC++2005)
621デフォルトの名無しさん:2010/12/30(木) 21:30:29
&hoge[0]
622デフォルトの名無しさん:2010/12/30(木) 21:31:43
>>621 !hoge.empty() を確認してから使おうね。
623デフォルトの名無しさん:2010/12/30(木) 21:32:20
>>621
即答ありがとうございます。できました
624デフォルトの名無しさん:2010/12/30(木) 21:59:40
C++0xならdata()があるんだけど
何でC++03で導入されなかったんだろうなあ
625デフォルトの名無しさん:2010/12/30(木) 22:02:07
禿が間抜けだったから
626デフォルトの名無しさん:2010/12/30(木) 23:23:58
そんなアホなことせずイテレータ使えってことだろ
627デフォルトの名無しさん:2010/12/31(金) 07:44:22
C++03ってのは、vectorのメモリ上の連続性を保証する仕様を導入した規格なんだよ
なら先頭アドレス取得するメソッドも追加しろって話
628デフォルトの名無しさん:2010/12/31(金) 08:19:15
&* vec.begin()
629デフォルトの名無しさん:2010/12/31(金) 09:05:49
コンパイルエラーが出すぎて困ってるんだけど、
ファイルにダンプする方法、
g++のオプションで減らす方法、
エラーをひとつひとつステップ出力する方法
のどれかを教えてもらえますか?
630デフォルトの名無しさん:2010/12/31(金) 09:16:11
> IDE (VC++など)などの使い方の質問はその開発環境のスレに
> お願いします。
631デフォルトの名無しさん:2010/12/31(金) 10:27:50
以下のコードでBUGというメッセージが出る可能性はあるでしょうか?
このコードが複数のスレッドから同時実行されているのですが、、、

#include <iostream>
#include <string>
#include <set>
int main() {
typedef std::set<std::string> TagSet;
typedef std::pair<TagSet::iterator, bool> TagEntry;
TagSet checkList;
std::string tag("abcde");
if (checkList.find (tag) == checkList.end ()) {
TagEntry tent = checkList.insert (tag);
if (! tent.second) {
std::cout << "BUG\n";
}
}
return 0;
}
632デフォルトの名無しさん:2010/12/31(金) 10:36:04
余裕でありそうだけど
どうして無いと思う?
633デフォルトの名無しさん:2010/12/31(金) 14:26:23
>>631
そのコードそのままのmain関数を複数スレッドから呼んでも
競合が起きる可能性はないよ。
もしcheckListが非ローカルなら当然アウトだけど。
634デフォルトの名無しさん:2010/12/31(金) 23:11:40
自分自身のコピーを作る関数で以下のようなコードがありました。
ClassA& ClassA::Dup()
{
  return *this;
}
このコードは以下のように書いては駄目なのでしょうか?
違いがわかりません。
ClassA ClassA::Dup()
{
  return *this;
}
よろしくお願いします。
635デフォルトの名無しさん:2010/12/31(金) 23:17:52
>>634
上のコードはコピーなんて作ってなくてただの参照を返してるだけ

単純にC++の参照の機能を勉強すれば違いがわかるんじゃないだろうか
636デフォルトの名無しさん:2011/01/01(土) 00:24:30
むしろ上の書き方がだめ。Dupという名前にふさわしくない動作をする。
637デフォルトの名無しさん:2011/01/01(土) 04:33:04
つまりDuppunですね
638デフォルトの名無しさん:2011/01/01(土) 10:08:26
>>635
参照については、書籍やホームページで勉強したのですが、
return *this;とする場合に、参照で渡すのとそのまま渡すので
どう違いがあるのかよくわかりません。
参照で渡したほうがメモリを食わないのかなとは思いますが…

>>636
二つのコードで振る舞いに違いが出るのは
どういう場合でしょうか?

代入演算子のオーバーロードのサンプルコードでは、
戻り値が参照でreturn this*;と
なっているコードを見たりするのですが、
そういう書き方はよくないということでしょうか?
639デフォルトの名無しさん:2011/01/01(土) 10:41:07
http://codepad.org/UpgCxgJo
Dup(duplicate)といったら普通はDup2のほう
640634:2011/01/01(土) 11:49:31
>>639
理解できました。
ありがとうございました。
641 【大吉】 【1808円】 :2011/01/01(土) 12:37:57
642 【小吉】 【1688円】 :2011/01/01(土) 14:38:13
てす
643デフォルトの名無しさん:2011/01/01(土) 17:19:18
Unit1.cpp
const char * const szStr1 = "aaaaaaaaaaaa";
---------
Uit2.cpp
extern const char * const szStr1;
-----------

const char * const を const char * にするとOKなんですが
const char * const のままだとリンカエラー(参照の未解決)になるんだけど、理由が分かりません。
なぜリンクできないのか教えてください。
お願いします。
644デフォルトの名無しさん:2011/01/01(土) 17:29:19
float型で割り算をするとき、
0割エラーが発生しないもっとも0に近い値はいくつですか?
645デフォルトの名無しさん:2011/01/01(土) 17:34:45
>>644
0でも発生しないと思うよ
結果が非数とか無限大とかになるだけで
646デフォルトの名無しさん:2011/01/01(土) 17:45:56
ありがとうございます。
ということは、0かもしれない値で割り算するときは、
除算後にその値をisfiniteマクロあたりで調べる、というのがベターでしょうか?
647デフォルトの名無しさん:2011/01/01(土) 18:13:12
>>646
どう考えても除算前に0かどうかを比較するのがベストだろ
648644:2011/01/01(土) 18:26:21
ではひきつづき644の質問をお願いします
649デフォルトの名無しさん:2011/01/01(土) 19:07:00
floatの最大値を超えると無限大になるので、floatの最大値をちょうど超えないような結果になる除数を知りたいということだな
被除数が 1 ならおよそ 3.0e-39 くらい
被除数が 2 ならおよそ 5.9e-39 くらい
被除数が 0.5 ならおよそ 1.5e-39 くらい
被除数が x ならおよそ (x / FLT_MAX + ulp) くらい
で割るといいと思うよ
650644:2011/01/01(土) 19:10:08
>>649
なるほど!ありがとうございました。
651デフォルトの名無しさん:2011/01/01(土) 23:13:52
0.0 / 0.0 にカレーをつけると美味しいらしい。
652デフォルトの名無しさん:2011/01/02(日) 13:54:20
VC++6を使用して、エクセル操作って出来るのか?
操作する環境はInterop.ExcelとかのOffice関係のライブラリが一切インストールされてないんだが

無理じゃね?
dllをexeと同じ階層に持ってきちゃえばいける気がするのだが
金が掛かっている以上、MSのdllを無許可で使用するのは得策じゃないし・・・
653デフォルトの名無しさん:2011/01/02(日) 15:02:13
>>649
天才エスパー現る
654デフォルトの名無しさん:2011/01/02(日) 15:30:45
質問です。配列を初期化するようにクラスを初期化したくてstd::arrayをぱくったんですけど、どうしても変数をパブリックにしないと実現できなそうです。
そこで、プロテクトを考えたんですけど、ここまでやる必要はありますか?#undefするまではありだと思うんですけど、最後の@に置換してるのがキモイです。
#define Value_ ValueIsProtected_
template<class T>
class MultiValue{
    enum {Size_ = 3};
public:
    T Value_[Size_];//Dont Touch The Direct Value.

    void Initialize(){
        Value_[0] = T();
        Value_[1] = T();
        Value_[2] = T();
    }

    void Initialize(const T& A,const T& B,const T& C){
        Value_[0] = A;
        Value_[1] = B;
        Value_[2] = C;
    }
    T& A(){
        return Value_[0];
    }
    T& B(){
        return Value_[1];
    }
    T& C(){
        return Value_[2];
    }
};
#undef Value_ 
#define ValueIsProtected_ @
655デフォルトの名無しさん:2011/01/02(日) 15:42:21
イミフ
656デフォルトの名無しさん:2011/01/02(日) 15:54:00
えーっと、
MultiValue<T> V={A,B,C};
的な初期化がしたいのですよ。
で、std::arrayをみて、コンストラクタを書かずに、対象の変数をパブリックにすれば、
言語の標準機能で初期化できることがわかりました。
しかし、クラスの隠蔽の観点からそういうパブリックな変数は意にそぐわないと思います。
そこで、パブリックにする代わりに、プリプロセッサで予測が難しい文字列に置換することにしました。
で、defineしたものを使い終わったらけして、隠蔽を図るまではアリだと思うのですが、
その後の使用においてもパブリックなフィールドに手をつけられないようにするべきでしょうか。それが@に置換なんですけど。
そもそも、どの程度のプロテクトをかければ正常な運用の上で不具合が起こらないでしょうか??

vc10なんですけど、イニシャライザーリストさんがまだ来ないので困っています。
657デフォルトの名無しさん:2011/01/02(日) 16:17:09
そんなところで頑張っても無意味なのでpublicにするか普通にコンストラクタを使ってください
変なマクロで識別子を汚されると皆が迷惑するんです
658デフォルトの名無しさん:2011/01/02(日) 16:48:38
>>657
無駄な努力ですか〜。まーそうかもですね。
体裁整えたかったんだけど、イニシャライザーリストさんをまちますよ。
解答ありがとう。
659デフォルトの名無しさん:2011/01/02(日) 17:23:13
むしろMultiValueなのに型の指定が1つというのが気になる
660デフォルトの名無しさん:2011/01/02(日) 17:27:05
タプル的な意味ではなくて、メンバ変数的な意味で、マルチバリュー。
適当な名前が思い浮かばなかったんだ。Orz
661デフォルトの名無しさん:2011/01/02(日) 20:09:03
覚えたては、覚えたテクニックを駆使したくなるもんだよ。
662デフォルトの名無しさん:2011/01/03(月) 13:06:44
>>643
const なオブジェクトのリンケージはデフォルトで内部リンケージ。
これは C と C++ で違うところ。
外部リンケージにしたいときには extern の指定が要る。

ヘッダで宣言せずに extern で取ってくる、なんて行儀の悪いことを
しようとするからそんなことになる。
663デフォルトの名無しさん:2011/01/03(月) 19:52:22
>>656
documentに「publicにしてあるけどさわったらちゃんと動きません!」って強くその旨記載してあれば
正常な運用の上で不具合は起こらない。

俺だったら
Do_Not_Touch_This_Member_xxxxないしdo_not_touch_this_member_xxxx
ってやる。

そもそもそうならないようにするけど。
teamの仲間が良識があればさすがに触らないでしょ。
664663:2011/01/03(月) 19:53:15

× 俺だったら
× Do_Not_Touch_This_Member_xxxxないしdo_not_touch_this_member_xxxx
× ってやる。

○ 俺だったら
○ Do_Not_Touch_This_Member_xxxxないしdo_not_touch_this_member_xxxx
○ っていうメンバ名にするよ。
665デフォルトの名無しさん:2011/01/03(月) 20:08:39
考え方としては有りだと思うがtouchはない
666デフォルトの名無しさん:2011/01/03(月) 20:23:51
おさわり禁止だよな
667デフォルトの名無しさん:2011/01/03(月) 20:26:05
actually_private_member_xxx とか
668デフォルトの名無しさん:2011/01/03(月) 21:20:18
ご意見ありがとう!

>>663-664
最初それ系を考えたんですけど、保守性の観点からクラスの記述はシンプルにしたかったので、defineにしたんですよ。
それでもコード補間で候補に出るから参ったって感じでしたけど、まー良識を信用したほうがいいところに落とせそうです。

>>665-666
もう触れるのもやめてくれ的な強い意味でタッチを選んだんですけどナシですか。英語は難しいです。
669デフォルトの名無しさん:2011/01/03(月) 22:05:44
マイクロソフトも言ってるしアリじゃね
ttp://www.pcworld.com/article/114847/microsoft_says_dont_touch_that_code.html
670デフォルトの名無しさん:2011/01/03(月) 22:33:16
英語力がないのは
>>665-666
の2人の方だったのかww
671デフォルトの名無しさん:2011/01/03(月) 23:01:58
あ、ごめん>>669だが
よく読んだら「あのコードには(違法に盗まれたものなので)関わらないでくれ」って意味だったみたい
コード修正するな、だとdonot modify this codeの方が明確なのかな
672デフォルトの名無しさん:2011/01/03(月) 23:11:42
スレチだから命名スレ行けカスども
673デフォルトの名無しさん:2011/01/04(火) 13:31:48
>>672
!!!!!!!!自治厨乙!!!!!!!!!!!!
674デフォルトの名無しさん:2011/01/04(火) 16:23:50
どうでもいいさ
675デフォルトの名無しさん:2011/01/04(火) 16:25:10
>>671
> コード修正するな、だとdonot modify this codeの方が明確なのかな
でも質問者は「コード修正するな」じゃなくて
「このメンバ(変数)は(C++的に気持ち悪いけどpublicにしたんで)関わらないでくれ」
って意味だからtouchでいいんじゃないのかね。

676デフォルトの名無しさん:2011/01/04(火) 17:26:21
>>652
Interop.Excelって.NETのタイプライブラリインポートだよな(以下その前提で話をする)。
そうならそもそもVC6ではそんな機能動かないぞ。

なので、選択肢は2つ。
VC6でやりたい→Interop系使わない。Excel操作なら#import使え。

Interop系使いたい→VC6を使わない。
ちなみに、Interop.Excelを自分のアプリと一緒に配るべきでないのは正解。
なぜならMS Officeの一部としてインストールされているから。
http://msdn.microsoft.com/ja-jp/library/aa159923.aspx
ただし、アプリを作る側でも、自分のInterop.ExcelではなくこのExcelのPIAを参照させる必要がある。

細かい話はVC++なりなんなりのスレへ行け。
677デフォルトの名無しさん:2011/01/04(火) 21:04:02
>>675
延々と続けられるのもあれなので答えを書くと

dont access this member directly
678デフォルトの名無しさん:2011/01/04(火) 22:19:27
もっとシンプルに
dont access here
leave_me_alone
680デフォルトの名無しさん:2011/01/04(火) 22:50:17
north_korea
681デフォルトの名無しさん:2011/01/04(火) 23:27:49
gtfo
682デフォルトの名無しさん:2011/01/05(水) 00:06:36
だからお前らスレチなんだから名前スレに行けよカス
ttp://codepad.org/eKGVKex0
683デフォルトの名無しさん:2011/01/05(水) 01:24:40
>>682
So cool!
684デフォルトの名無しさん:2011/01/05(水) 02:48:14
>>682
おまえカッコいいな
685デフォルトの名無しさん:2011/01/05(水) 03:11:42
>>682
c++スレでc++の命名について議論しちゃダメなんですか?
686デフォルトの名無しさん:2011/01/05(水) 16:51:23
>>682
面白いね。理屈理解するのにちょっと悩んだぜ。
687デフォルトの名無しさん:2011/01/06(木) 02:41:04
template<class T>
struct identity
{
typedef T type;
};

struct A : identity<int>
{
type value; //これはOK?
};

typedef base::type type;とtypedefし直してるのをよく見ますが、typedefって継承されますか?
VC++、gccでコンパイル通るようですがC++としてはどうなんでしょうか。
688デフォルトの名無しさん:2011/01/06(木) 02:50:30
>>687
継承されるメンバに種類の区別は無いよ。 (ISO C++ 2003 10 [class.derived] p1)
689デフォルトの名無しさん:2011/01/06(木) 03:10:13
>>688
読みづらくなりそうですが、typedefし直さなくても問題ないんですね。
ありがとう。
690デフォルトの名無しさん:2011/01/06(木) 07:40:09
class Hoge { };
class Fuga {
private:
 Hoge *pHoge;
public:
 void change1(Hoge **p) {
  Hoge *tmp=pHoge;
  pHoge=*p;
  *p=tmp;
 }
 Hage *change2(Hoge *p) {
  Hoge *tmp=pHoge;
  pHoge=p;
  return tmp;
 }
};

main() {
 Hoge *hoge;
 change1(&hoge);
 hoge=change2(hoge);
}

---
コンストラクタ、デストラクタは省略。
change1とchange2の実装だったらどっちが良い?
691デフォルトの名無しさん:2011/01/06(木) 07:41:33
あっmainは以下で。

main() {
 Hoge *hoge;
 Fuga f;
 f.change1(&hoge);
 hoge=f.change2(hoge);
}
692デフォルトの名無しさん:2011/01/06(木) 08:08:57
>>690
実装じゃなくてインターフェースの比較の話だよね?

値の交換しか提供しない、似たような std::set_new_handler() の
インターフェースが問題とされたりしている。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3189.htm
どちらというより、まず値の取得と設定は分けておいたほうがいいと思う。
Fuga const からは読み出せないとかいうのも問題になりそう。

そうは言っても値の交換を複数スレッドからアトミックにしたい場合は似たような
インターフェースが必要になるかもしれないとは思う。その場合は "swap" という
名前付けができる change1() のインターフェースのほうがいくらかわかりやすい
かもしれない。


本筋とは関係ないけど、暗黙の int は標準から外れるんでやめといたほうがいいよ。
693デフォルトの名無しさん:2011/01/06(木) 08:44:33
>>692
> 値の取得と設定は分けておいたほうがいい
これはどういう意味?

> 暗黙の int は
mainの戻り値のこと?ここは説明用に書いただけで省略しちゃいました。
694デフォルトの名無しさん:2011/01/06(木) 08:46:42
>>693
あたいのしゅとくをするかんすうとせっていをおこなうかんすうをふたつ
よういすればいいんだとおもうよ。
695デフォルトの名無しさん:2011/01/06(木) 18:18:17
C++の文法の質問です。
 二択条件式
   | 論理和式
   | 論理和式 ? 式 : 代入式
となっていますが、2番目が C言語では
   論理和式 ? 式 : 二択条件式
となっています。違いの意味は何でしょうか?
また ++x の評価が C++ では左辺値、Cでは右辺値となっている
と思うのですが?違っているのは何か意味があるのでしょうか?
696デフォルトの名無しさん:2011/01/06(木) 19:02:41
x ? y : z = 1;
がC++では
x ? y : (z = 1);
と解釈されるがCでは
(x ? y : z) = 1;
と解釈される (そしてエラーになる) という意味では

++x は左辺値の方が参照が取れて便利だから?
697デフォルトの名無しさん:2011/01/06(木) 19:32:34
++は変数にしか使えない演算子なんだから、
右辺値になっているCの設計がおかしいだけ。
698デフォルトの名無しさん:2011/01/06(木) 21:04:53
>>696  C++では x ? y : (z = 1); と解釈される
ありがとうございます。
 C++ が x ? y : (z = 1);  とする方を仕様とした理由が知りたいです。 
 (++x は左辺値の方が参照が取れて便利だから? )と同様な
699デフォルトの名無しさん:2011/01/06(木) 22:36:40
x ? y = 1 : z = 1;

こうやりたかったんじゃないの?
こういうのはif-elseでやってくれとは思うが
700デフォルトの名無しさん:2011/01/07(金) 00:32:17
>>698
エラーだったのを動くよう直すのに何か特別な理由がいるのか?
701デフォルトの名無しさん:2011/01/07(金) 02:05:10
x ? y : z = 1;なんか書かねーだろ
702デフォルトの名無しさん:2011/01/07(金) 02:40:37
下記のコードが VC9 と VC10 で C2664 になりますが、GCC4 では問題ありません。
const なメンバ関数の型を正しく推測できていないようです。

何か規格外の事をしているのか、それとも単なる VC のバグなのでしょうか?

struct Foo{
  void test1(){ cout << "test1" << endl; }
  void test2() const{ cout << "test2" << endl; }
};

template<typename F>
void test( Foo* foo, F Foo::*func ){
  ( foo->*func )();
}

Foo foo;
test( &foo, &Foo::test1 );
test( &foo, &Foo::test2 ); // C2664
703デフォルトの名無しさん:2011/01/07(金) 03:29:07
#pragmaの指定を使って、そのソースをコンパイルしたときに
別のobjを一緒にリンクして実行ファイルを作ってくれるように指定することはできないでしょうか?
(コンパイラはclを使っています。)

#pragma comment(lib, "sub.obj") ←こんな風に書きたいのですができませんでした
704デフォルトの名無しさん:2011/01/07(金) 04:00:43
>>700 エラーだったのを動くよう直すのに何か特別な理由がいるのか?
 Cではエラーではない。Cとの互換性をできるだけ維持しようとしていた
 はずのC++が何故、些細と思われる仕様の変更を行ったのか?または言語
 仕様上こうしなければならない理由があるなら、それを知りたいだけです。
705デフォルトの名無しさん:2011/01/07(金) 05:57:38
知りたいだけです(キリッ
706デフォルトの名無しさん:2011/01/07(金) 07:12:17
#pragma 指定をどう解釈するかはコンパイラに依存する
707デフォルトの名無しさん:2011/01/07(金) 07:12:37
>>703
その別のobjとやらをライブラリ化すればいいんじゃないのか?
708デフォルトの名無しさん:2011/01/07(金) 07:18:18
>>702
template<typename F>
void test( Foo* foo, F func ){
 ( foo->*func )();
}

でいいんじゃないかな
709デフォルトの名無しさん:2011/01/07(金) 11:05:09
STL, Qtの両コンテナで動くテンプレート関数を作ろうとしています。
コンテナの定義が
STL
template<class T, class Alloc=allocator<T>>
class vector;

Qt
template<class T>
class QVector

と、コンテナのテンプレート引き数の数が異なるのが問題で
template<template<class A, class B=allocator<A> >class C, class T>
T func(C<T>& a)
みたいな関数はSTLコンテナから呼び出せますがQtコンテナからは無理です。
template<template<class A>class C, class T>
T func(C<T>& a)
ではQtコンテナはOKでSTLコンテナはNGです。

なんか、上手く両方から使えるテンプレート関数を作ることはできないものでしょうか。
STLのデフォルト引数周りをゴニョゴニョすれば行けそうな気がするのですが・・・
710デフォルトの名無しさん:2011/01/07(金) 11:50:00
template <class T> typename T::value_type func(T & a);
じゃだめなの?
711デフォルトの名無しさん:2011/01/07(金) 12:10:33
>>704
C ではエラーになるよ。
http://codepad.org/XEunP081
712デフォルトの名無しさん:2011/01/07(金) 12:15:48
>>702
> template<typename F>
> void test( Foo* foo, F Foo::*func ){

これだと func は F 型の非静的データメンバ( Foo のメンバ変数)へのポインタに
なりそうなんだけど、これでメンバ関数へのポインタもマッチしちゃう gcc がなんか
おかしいんじゃないかな?
713709:2011/01/07(金) 12:34:50
>>710
あざーす
そんな型が定義されているとは知りませんでした。
Qtの方にもSTL互換用に定義されてました。
714デフォルトの名無しさん:2011/01/07(金) 13:15:30
テンプレートに定義されて無いといけない関数が
定義してなかったらエラーじゃなくて
デフォルトのことをするなんてことできませんよね?
715デフォルトの名無しさん:2011/01/07(金) 13:18:08
できます
716デフォルトの名無しさん:2011/01/07(金) 13:21:39
template <typename T> class C{

C(){
T.a();
}
};
ではこのa()が定義されてなかったときの例について教えてください。
717デフォルトの名無しさん:2011/01/07(金) 13:32:31
>>702
test( &foo, &Foo::test2 );
この場合、constでないオブジェクトfooがconstなメンバ関数test2を呼び出しているけど、いいんだろうか?
718デフォルトの名無しさん:2011/01/07(金) 13:32:41
継承使えばいいんじゃね?
719デフォルトの名無しさん:2011/01/07(金) 13:34:08
>>717
それのどこが問題なんだ?
const なオブジェクトが非const なメンバを呼び出せるのが不味いってんなら分かるが
720デフォルトの名無しさん:2011/01/07(金) 13:34:14
>>717
書き換え可能なオブジェクトに対して書き換えしない関数を呼んでも何も困らない。
721デフォルトの名無しさん:2011/01/07(金) 13:35:09
>>716
has_member が要るケースか。それは標準では無理だな。
722717:2011/01/07(金) 13:39:26
ごめん。超勘違いしてた
723デフォルトの名無しさん:2011/01/07(金) 14:23:11
724デフォルトの名無しさん:2011/01/07(金) 14:27:19
>>723
型名を持ってるかどうかの判別じゃダメでしょ?
725デフォルトの名無しさん:2011/01/07(金) 14:37:39
>>711
ごめんなさい。言い方(書き方)をまちがえていました。
Cではエラーとなる仕様なのに、C++ではエラーとならない仕様となっているのは何故?
といううことです。
C++では第二演算対象、第三演算対象が左辺値であって同じ型である場合は
「二択条件式の結果をその型の左辺値とする。」とする仕様と関係があるのか?
>>699 のとおり if-else で十分なのではないかと思うに、何故?
しつこくてごめんなさい。
726デフォルトの名無しさん:2011/01/07(金) 14:41:51
>>725
どちらも不要な制限事項を取り払ったもの。
Cではエラーになっていたものなので、互換性の問題も無い。
727デフォルトの名無しさん:2011/01/07(金) 14:43:12
>>725
むしろ、エラーのままにしておいたほうがいいと思う理由は何?と聞きたいぐらいだ。
728デフォルトの名無しさん:2011/01/07(金) 14:44:29
>>725
構造体名の前の struct が不要になったことについても君は理由を問うのかね?
729デフォルトの名無しさん:2011/01/07(金) 15:13:57
730デフォルトの名無しさん:2011/01/07(金) 19:26:37
mainから呼ばれた関数の中でnewし、
main関数内でdeleteすることは推奨されるのでしょうか。
例えばこんな感じです。
ポインタを参照渡しするのもなんか気持ち悪いので
もっと良い書き方があれば併せて教えて頂けるとうれしいです。

int ReadVariableData(char* &a)
{
 int size = GetSize();
 a = new char[size];
ReadData(a,size);
 return size;
}

void main(void)
{
 char* a;
 int size = ReadVariableData(a);
 //処理
 delete[] a;
}
731デフォルトの名無しさん:2011/01/07(金) 19:27:05
>>728 構造体名の前の struct が不要になったことについても君は理由を問うのかね?
C++ で struct を前置してもエラーにならないのはCとの互換性のためでは?
二択条件式の例では、 >>726 のとおり、Cではエラーになっていたものなので、
互換性の問題も無い。 (CでコンパイルできたソースをC++でほぼコンパイルできる)
「どちらも不要な制限事項を取り払ったもの。」なのか、C++の言語仕様で必然的に
そうしているのか?(私自身はなにによって必然となるのか理解していませんが)
ということを知りたい。またまたしつこくてごめんなさい。
732デフォルトの名無しさん:2011/01/07(金) 19:46:39
>>730
別に問題は無いけど直接newを使うとdeleteし忘れの可能性があるし、関数のシグネチャからは内部でnewしてることがわからないので
いちいち関数の中身を見ないとdeleteが必要かどうかわからないなど保守の手間がかかるので避けたほうがいい。
この場合はstd::vector<char>を使うのがいい。スコープを超えて使いたいならスマートポインタの類を使う。
int ReadVariableData(std::vector<char>& a)
{
 int size = GetSize();
 a.resize(size);
ReadData(&a[0],size);
 return size;
}

void main(void)
{
 std::vector<char> a;
 int size = ReadVariableData(a);
 //処理
 //delete不要
}
733デフォルトの名無しさん:2011/01/07(金) 19:50:35
それに直接new,deleteをつかえば途中で例外が飛んだ場合にメモリリークしてしまう。
734デフォルトの名無しさん:2011/01/07(金) 20:27:33
C++でネットワークプログラミングしてみたいんですが、よい入門によい
書籍・サイトとかありますか?
チャットツールとかが作れるようになりたいです。
735デフォルトの名無しさん:2011/01/07(金) 20:54:18
>>731
たぶん"その理由はこうです"的なものは見つけるのが難しいんじゃないかなぁ
だいたいの予想としては
c ? x = 42 : y = 42 ← xはいいけどyはダメ
みたいなイミフなルールを是正するためだと思う
736デフォルトの名無しさん:2011/01/07(金) 21:27:32
>>735
ありがとうございます。
いろいろ調べていたら、JIS X3014 附属書Cの 5.16,5.17,および5.18 に
改変内容 条件式、代入式 又はコンマ式の結果は左辺値となりうる。
改変理由 C++は、オブジェクト指向言語の一つであり、左辺値を比較的
     重要視している。例えば、関数は左辺値を返してもよい。
 とありました。
737デフォルトの名無しさん:2011/01/07(金) 21:40:28
ネットワークならjavaあたりから入ったほうがいいんじゃないか?
738デフォルトの名無しさん:2011/01/07(金) 21:41:55
ruby最強
739デフォルトの名無しさん:2011/01/07(金) 22:09:33
>>734
1. まずsocketのマニュアルを開きます
2. 次に簡単なechoサーバーを作ってみましょう
3. あとは応用で何でもできます
740デフォルトの名無しさん:2011/01/07(金) 22:12:25
ダブルポインタで渡ってきたクラスのメンバを呼び出す時に
*を使わないですむ演算子はないのでしょうか?

Hoge(CTest **p)
{
  ………
  (**p).guhe(); //方法1
  (*p)->guhe(); //方法2
  p-->guhe();  //こんな感じで*を使わず呼び出したい
741デフォルトの名無しさん:2011/01/07(金) 22:16:51
hoge moge(huga** in){
   huga* P = *in;
   P->proc();
}
ってかんじじゃね?
742デフォルトの名無しさん:2011/01/07(金) 22:30:35
CTest*& pってやればいいんじゃね
743デフォルトの名無しさん:2011/01/07(金) 23:19:54
>>741-742
ありがとうございます。
ポインタへの参照ですっきり書くことができました。
744デフォルトの名無しさん:2011/01/08(土) 00:14:13
>>739
なんかよくわかりませんがとりあえず手順通りにググッたり書籍を探してみたり
してがんばります。
745730:2011/01/08(土) 00:30:22
>>732 >>733
アドバイスありがとうございます。

説明不足というか後出しで大変恐縮なのですが
目標はBMPファイルをロードする関数を作るので、
fin.read()で一気にピクセルデータをロードしたいと思っています。
fin.read() の第一引数に &a[0] を入れても(std::vectorの内部構造的に)大丈夫なんでしょうか?
746730:2011/01/08(土) 00:41:58
すみません、「vector メモリ 連続」でググって自己解決しました。
std::vectorはメモリ連続性が保証されてるので、>>732の方法でOKなんですね。

>>732の方法で行きたいと思います。
ありがとうございました。
747デフォルトの名無しさん:2011/01/08(土) 21:36:22
イテレータのようなものを作っててわからなくなりました
template < class T >
class renketu {
struct list {
list *prev;
list *next;
T n;
}
list *begin;
public:
class iterator {
public:
iterator& operator++();
・・・・
private:
list *listPtr;
}


renketu(){
begin = new list;
}
iterator beginIterator(){
return ???;
}
}

のような感じにするとiteratorでprivateにしてるlistPtrに対してアクセスすることができずlist *beginを持つiteratorを返すことができません
だからと言ってiteratorのpublicに書き換えるための関数を用意するのもスマートではありません
どうにかして例外的にprivateにアクセスさせるなどの方法はないでしょうか
748730:2011/01/08(土) 22:12:32
>>730の続きの質問をさせてください。
>>732の方法を用いて、bmpのピクセルデータを
std::vector<char> a に格納することには成功しました。

このデータをメディアンフィルタ関数に渡したいのですが、
a_2d[i][j] というアクセスを可能にできますか?

今まではダブルポインタとnewを使って
char** a_2d = new char*[height];
for(int i=0; i<height; i++)
 a_2d[i] = a+(i*width);
としておいて、メディアンフィルタ関数には a_2d を渡していました。

メディアンフィルタ関数にvector<char> a と一緒にwidthも渡せば
a[i*width+j] という形でアクセスは可能なのですが、
今までwidthは渡さずに済んでいたので、できればそうしたいです。
既に存在するvectorに二次元アクセスする綺麗な書き方を教えて頂けませんか。。
749デフォルトの名無しさん:2011/01/08(土) 22:18:39
vector< vector<char> > a;

a.resize(height);
for(int i=0; i<height; i++) a[i].resize(width);

a[i][j]=0;
750デフォルトの名無しさん:2011/01/08(土) 22:19:55
a.size()と、a[0].size()で配列サイズを取得できる。
751デフォルトの名無しさん:2011/01/08(土) 22:22:14
749の代わりに。
vector<string> a; でも良い。 2次元のchar配列確保できる。
752デフォルトの名無しさん:2011/01/08(土) 22:37:22
[1] 授業単元:画像処理
[2] 問題文(含コード&リンク):http://codepad.org/7N0GSgtiを完成させよ
また上記のプログラムを構造体で表現しなさい
[3] 環境
 [3.1] OS: Windows7
 [3.2] コンパイラ名とバージョン: Microsoft Visual C++ 2008
 [3.3] 言語: C++
[4] 期限:2010年 1月12日
[5] その他の制限:ありません

出力しても写真が表示されません。よろしくおねがいします。
753デフォルトの名無しさん:2011/01/08(土) 22:42:13
宿題スレにいけ
754デフォルトの名無しさん:2011/01/08(土) 23:35:24
>>753
ごめんなさい間違えました
すいません
755デフォルトの名無しさん:2011/01/09(日) 02:00:27
>>747
コンストラクタに引数で渡せば private な変数に触る必要もない。
756デフォルトの名無しさん:2011/01/09(日) 02:01:47
>>751
そこは vector<char> だろ。 string にしてなんかいいことあるの?
むしろはじめから vector<unsigned char> じゃないのが気になる。
757デフォルトの名無しさん:2011/01/09(日) 03:27:07
>>755
それはiteratorのコンストラクタでbiginでlistPtrを初期化するってことですか?
毎回beginを使うわけではないのでそれだと無駄が出てしまいますし
std::vectorのbegin()ようにbeginIterator()で渡して初期化したいんですけど
どうにかなりませんか?
758デフォルトの名無しさん:2011/01/09(日) 03:40:59
>>757
何が無駄になると言ってるのかわからん。

> beginIterator()で渡して初期化したいんですけど
だからそうすればいいと言ってるだろう。
759デフォルトの名無しさん:2011/01/09(日) 03:53:20
>>747
このソースよみづらい・・・
760デフォルトの名無しさん:2011/01/09(日) 04:03:25
>>758
すいません>>755がよくわからないのでもう少し詳しく書いてもらえませんか
761デフォルトの名無しさん:2011/01/09(日) 04:29:21
>>760
iterator に list* を受け取るコンストラクタ iterator(list*) を追加して beginIterator() で
iterator(begin) と渡せば renketu から iterator の private な変数 listPtr に触る必要も無い。
762デフォルトの名無しさん:2011/01/09(日) 06:22:43
>>761
それをするとmainなどの外部から
renketu::iterator ite( ??? );
のような宣言をしたときにも???に勝手に値を渡せますよね?
内部実装をできるだけ隠してこのクラスの使用者はそのようなことができないようにしたいのです
何かいい方法はありませんでしょうか
763デフォルトの名無しさん:2011/01/09(日) 06:40:27
renketu<T>::iterator::iterator(int)
なんて馬鹿な物を作らなければ外からはrenketu<T>::listに触れられないから問題ない
764デフォルトの名無しさん:2011/01/09(日) 12:27:03
単純に >747 の質問に答えるなら「friend 使え」で終わりじゃないの?
765デフォルトの名無しさん:2011/01/09(日) 20:41:23
APIのラッパークラス作りたいんですけど、どうしたらいいですか
766デフォルトの名無しさん:2011/01/09(日) 20:59:29
>>765
ほかに書くことがないなら↓こちらへどうぞ
http://hibari.2ch.net/test/read.cgi/tech/1187922645/
767デフォルトの名無しさん:2011/01/09(日) 21:09:11
>>766
ありがとうございます。そちらで質問してみます
768デフォルトの名無しさん:2011/01/09(日) 22:18:47
769デフォルトの名無しさん:2011/01/10(月) 00:21:34
>>768
PCがぶっ壊れた
770デフォルトの名無しさん:2011/01/10(月) 14:17:44
C++書こうとしてもなんかbetter Cっぽくなっちゃうんだけど
STLとかクラスとかガンガン使うのがC++っぽいプログラミング?
771デフォルトの名無しさん:2011/01/10(月) 14:20:33
動けば何でもいいが、
C++っぽいプログラミング と言えば、最低クラスは普通に全体的に使わないとな。
772デフォルトの名無しさん:2011/01/10(月) 14:23:55
テンプレートでキモいコード書き始めるとC++だなぁって感じる
773デフォルトの名無しさん:2011/01/10(月) 14:41:18
vectorとアルゴリズムを使っているとC++っぽい気はする。
774デフォルトの名無しさん:2011/01/10(月) 16:42:48
その状態でガンガンとか考えない方が安全な気がする。
「C+α+継承無しクラス」な状態で2,3年趣味ってた身としては。
今はSTLの簡単なところは使うけど自作クラスを継承とかやった事ないな。
775デフォルトの名無しさん:2011/01/10(月) 18:23:40
extern void Hoge();

void Hoge();
では何が違いますか?
静的リンクライブラリ関係で意味の違い等あれば教えてください
776デフォルトの名無しさん:2011/01/10(月) 18:50:52
C++では違いは無い
777デフォルトの名無しさん:2011/01/10(月) 18:56:19
>>775
void Hoge(); の場合、
static void Hoge(); が void Hoge(); より前にあれば、void Hoge(); は static になる
static void Hoge(); が void Hoge(); より前になければ、void Hoge(); は extern になる

extern void Hoge(); の場合、常に extern になる
778デフォルトの名無しさん:2011/01/10(月) 19:18:19
>>776
>>777
なるほど、ほとんど違いはないのですね
ありがとうございました
779デフォルトの名無しさん:2011/01/10(月) 21:26:22
>>777
externが常に外部リンケージ?
ソース出せや
780デフォルトの名無しさん:2011/01/10(月) 22:48:43
>>775 779
static void f();
void g(){
 extern void f(); // 内部結合
 .....
}
779 のとおりだと思うけど、自分で例だして示したら
781デフォルトの名無しさん:2011/01/10(月) 23:29:14
ねー、作る物によって言語って使い分けるもんなのかな?
782デフォルトの名無しさん:2011/01/10(月) 23:33:43
使い分けると楽なのなら使い分ければいい
783デフォルトの名無しさん:2011/01/10(月) 23:48:34
C++で何でもかんでも書いてたら嫌になるだろ?
784デフォルトの名無しさん:2011/01/11(火) 01:19:21
15個くらい使えたらいいと思うよ
785デフォルトの名無しさん:2011/01/11(火) 18:01:50
>>780
誰が教えてくれなんて頼んだ?
お前は諮問されてるんだろうが
人様に物を教える立場か
思い上がるのも大概にしろ
786デフォルトの名無しさん:2011/01/11(火) 18:14:37
C++ && (Python || Ruby || Perl) && (brainf*ck || whitespace || unlambda)
ぐらいが使えれば十分生きていけるんじゃないのかな
787デフォルトの名無しさん:2011/01/11(火) 18:37:13
>>785
はどうしてそんなに必死なの?ねぇねぇどうして?
788デフォルトの名無しさん:2011/01/11(火) 18:59:24
他人にケチはつけるけど、自分ではできないから
789デフォルトの名無しさん:2011/01/11(火) 20:26:33
>>785 でも人様にソース出させて教えたかったんだろう
 なにを教えたかったか見たかった
790779:2011/01/11(火) 23:03:13
>>779は俺だが>>785とは別人だ。
ISO14882の3.5Program and linkageを読めばすぐにわかる
嘘をつかれたのでイラっとした。
さらっと嘘を回答する奴の精神構造が知りたい。
791デフォルトの名無しさん:2011/01/11(火) 23:39:12
不遜メソッドでググれ
792デフォルトの名無しさん:2011/01/12(水) 00:31:22
>>790
extern で宣言されながら外部リンケージを持たない例を教えてください。
793779:2011/01/12(水) 06:39:38
>>792
ISO 14882の3.5に>>780と同じコードがのってる。
794デフォルトの名無しさん:2011/01/12(水) 09:50:35
難しい、わからん 以下の例で
// e01.cpp
#include<stdio.h>
void f(){printf("extern void f()\n");}
int i = 0x0e;

// e00.cpp
#include<stdio.h>
static void f();
static int i = 0;

void g(){
 extern void f();
 int i;
 {
  extern void f();
  extern int i;
  f();
  printf("i: %d\n", i);
 }
}

static void f(){printf("static void f()\n");}

int main(){ g();return 0;}

出力(改行無視)
  g++(gcc 4.5.0 20091105) : extern void f() i: 14
  VC(cl 15.00.30729.01)  : static void f() i: 0

大抵は、 gcc の方が正解だと思うが
static void f(), i: 14 が正しいのでは
795デフォルトの名無しさん:2011/01/12(水) 15:09:09
>void g(){
> extern void f();
> int i;
ここで、e00.cppのfとiが隠蔽されるんじゃないか?
796デフォルトの名無しさん:2011/01/12(水) 15:32:11
>>795
i は隠蔽されて後続の extern int i で外部リンケージになるが、
f() は static void f() の宣言になって、後続の extern void f() も同じくそれを受け取り、
結局内部リンケージになるらしい。

ってことで static void f(), i: 14 が正解だな。
797デフォルトの名無しさん:2011/01/12(水) 16:51:29
>>795 ありがとうございます。
void g()直下の extern void f(), と int i をコメントアウト
すれば、gcc, VC ともに static void f(), i: 0 を出力しました。
gcc はそのように隠蔽されたと解釈しているのだと思われます。
しかし、 ISO 14882 ではコメントアウトしない状態で、

static void f();    // @
static int i = 0;    // 1

void g(){
 extern void f();   // A internal linkage
 int i;        // 2. i has no linkage
 {
  extern void f();  // B internal linkage
  extern int i;   // 3. external linkage
 }
}
となっています。
私の拙い英語力での仕様書の解釈は、
 3. の i は、2. の結合を持たない i で 1. の内部結合を持った
 i が隠蔽され、結果 外部結合を持った i を参照することになる。
 B の f() はAの f() が@のf() の内部結合を受け継ぎ、その
 内部結合を受け継いでBの f() も内部結合を持つことになる。
で、static void f(), i: 14 が正解だと考えスレしました。
よろしく、お願いします
798デフォルトの名無しさん:2011/01/12(水) 16:53:41
>>796
797 です。すいません。簡潔にすでに答えられていたことをきずいていませんでした。
799デフォルトの名無しさん:2011/01/12(水) 23:43:29
ひさびさにこのスレで勉強になった
800デフォルトの名無しさん:2011/01/13(木) 00:57:28
不遜メソッド強力だな
801デフォルトの名無しさん:2011/01/13(木) 22:44:17
勉強っていうか、糞言語C++の無駄に複雑な仕様を垣間見ただけだな。
802デフォルトの名無しさん:2011/01/13(木) 22:49:57
コンパイラの実装以外で役に立つことはまずないだろうなぁ
803デフォルトの名無しさん:2011/01/13(木) 23:11:00
じゃあ、役に立つ言語って何だよ
804デフォルトの名無しさん:2011/01/13(木) 23:30:40
日本語とか日々の生活に役立つと思うよ
805デフォルトの名無しさん:2011/01/14(金) 00:36:40
確かにC++は仕様書を日本語でも理解しにくいくらい複雑
でも糞という言葉はでてこないから、我慢しなければと思っている
806デフォルトの名無しさん:2011/01/14(金) 00:58:37
糞と言い放つことがカタルシスそのものなんだろうから、
そっとしておく
807デフォルトの名無しさん:2011/01/17(月) 01:16:09
vector<string>を直接ファイルに書き出して、読み込むこと出来ますか。
たとえば合計サイズが10Mだとしたら一回のロードで格納すむといいんですが。
808デフォルトの名無しさん:2011/01/17(月) 01:20:20
boost::serializationでも使ったらどうかね
それを使わずにやるのは、そういう質問してる段階だと厳しいかも
809デフォルトの名無しさん:2011/01/17(月) 01:43:54
>>807
ifstreamからstd::getlineで一行づつ取得しつつ、ofstreamに1行づつ書き出してもらう。
for文まわすだけのようなきがする。

でも、一発で1個のブロックとして読み出すのは構造上難しい。
810デフォルトの名無しさん:2011/01/17(月) 01:51:31
サンクスでした。
811デフォルトの名無しさん:2011/01/17(月) 07:32:02
int main()
{
std::vector<std::string> vs, vs2;

vs.push_back("abcde");
vs.push_back("fghij");
vs.push_back("klmno");

std::ofstream ofs("test.txt");
std::copy(vs.begin(), vs.end(), std::ostream_iterator<std::string>(ofs, "\n"));
ofs.close();

std::ifstream ifs("test.txt");

std::copy(std::istream_iterator<std::string, char>(ifs), std::istream_iterator<std::string, char>(), std::back_inserter(vs2));
std::copy(vs2.begin(), vs2.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
}

これでもあまり美しくないなあ
pstreambuf_iterator<char>とc_str()を使えばコンパイラ側から見て一回の入出力に見えるんだけど
文字単位なので効率悪いし
812デフォルトの名無しさん:2011/01/17(月) 08:34:31
文字列に改行が含まれる場合と、std::stringはnull終端とは限らない点を考慮しないとだなぁ
813デフォルトの名無しさん:2011/01/17(月) 08:42:57
そうならやはりboost::serializationが手っ取り早いですね
814デフォルトの名無しさん:2011/01/18(火) 13:46:40
>>811みたいにboost::serializationで書いたコードを頂戴
815デフォルトの名無しさん:2011/01/18(火) 17:06:00
boost::serializationはビルドが必要なので面倒だよ
でも入れる価値があるかもね
816デフォルトの名無しさん:2011/01/18(火) 19:05:07
マルチスレッド化でfactoryクラスを利用したくてsingletonパターンを適用したのだけど
今度はfactoryが生成するインスタンスを抽象化する必要が出てきてfactoryを抽象化しようとしたら
singletonパターンの継承ではまってしまいました。

C++で上手く切り抜ける方法はないでしょうか?
singletonをやめて普通にstaticな大域変数として生成したほうがマシでしょうか?
817デフォルトの名無しさん:2011/01/18(火) 19:11:36
>>815
ビルド必要なんですか><
なんかコードだけで実現できる良い方法ない?
818デフォルトの名無しさん:2011/01/18(火) 20:29:12
ない
819デフォルトの名無しさん:2011/01/18(火) 21:26:06
>>816
なんかこう無理にパターンに当てはめようとしないで、
本当にそれが必要かどうか再検討してみては?
それでも必要なら、
もうちょっと具体的なことを書けばなにか良いきっかけが生まれるかもしれん
820デフォルトの名無しさん:2011/01/18(火) 21:34:02
>>817
書き出しはいいけど読み込む時は>>812のような事情があるため難しくない?
821デフォルトの名無しさん:2011/01/18(火) 22:41:38
>>819
作業クラスとその結果を表示するクラスがあって1対1で関連付けられています
この関連性を壊さないために、この2つのクラスを必ずFactory内部で関連付けてからインスタンスを得るようにしたいです

で、作業クラスと表示クラスの抽象化に伴ってFactoryも抽象化する必要が出てきた次第です。
822デフォルトの名無しさん:2011/01/18(火) 23:37:40
>>821
あまり理解しておらず、申し訳ないが、文字通り
Abstract Factory パターンというのがあるみたいだけど
(説明はできない)
823デフォルトの名無しさん:2011/01/19(水) 01:31:39
>>816
「factoryを抽象化しようとしたらsingletonパターンの継承ではまって」の意味がわからない。
抽象化とシングルトン化はまったく関係なくできるだろう。

困っている点についてはよくわからないが、とりあえずシングルトンパターンは捨てていい。
これは間違いない。
824デフォルトの名無しさん:2011/01/19(水) 08:49:54
>>823
肝心なところが抜けてました

Factoryが複数あると不味い状況になるので必ずインスタンスが1個であるようにsingletonを適用し
そのあと抽象化の問題が発生しました

無理に設計時に何とかするより、使用時に注意する方向の方が楽そうですね・・・
825デフォルトの名無しさん:2011/01/19(水) 09:53:33
>>824
だから、「抽象化の問題」ってなんだよ?
826デフォルトの名無しさん:2011/01/19(水) 11:04:47
とりあえず>>822方式でConcreteFactoryをシングルトンにすればいいんじゃないの
SingletonにしたいのはFactoryだけって認識であってるのだろうか

継承の話は、基底クラス経由でシングルトンが破綻するので
一般にシングルトンは継承出来無かったように思うけどそれのことと予想
シングルトンにこだわらないでスレッドセーフを目指すって方向もあると思う
827デフォルトの名無しさん:2011/01/19(水) 11:17:36
>>824
class Object;
class Factory { public: virtual ~Factory() {} virtual Object create() = 0; };

Factory& MyGlobalFactory();

class ConcreteFactory : public Factory { ... };
Factory& MyGlobalFactory() { static ConcreteFactory singleton; return singleton; }

これで何か問題でもあるか?
828デフォルトの名無しさん:2011/01/20(木) 00:05:21
class ConcreteFactory : public Factory, Singleton<ConcreteFactory>
829デフォルトの名無しさん:2011/01/20(木) 16:52:37
関数ポインタ なのか 普通のポインタなのか
判定するif文ってどう書けばいいのでしょうか?
boost.mpl使わないとダメでしょうか?
830デフォルトの名無しさん:2011/01/20(木) 21:25:14
>>829
SFINAE がやりたいなら TypeTraits の is_function 使え。Boost または TR1 にある。

あるいは void* が実際に指す型で動的にディスパッチしたいなら Type Erasure でやれ。
831デフォルトの名無しさん:2011/01/20(木) 21:37:34
class A{};
class B : public A{};
B b;
A* a = &b;

BをAにキャストするのを禁止する方法ってありますか?
832デフォルトの名無しさん:2011/01/20(木) 21:56:44
private継承でも通せるのひどいな
833デフォルトの名無しさん:2011/01/20(木) 22:08:06
>>832
何言ってる? private 継承では派生クラスのポインタから基底クラスのポインタへは変換できない。

>>831
C++03 の機能では無理。
C++0x では operator static_cast のオーバーロードが可能なので、実装されていれば可能なはず。
834デフォルトの名無しさん:2011/01/20(木) 23:12:07
operator&をオーバーライドしてA*に変換できない別の型を返す!
835デフォルトの名無しさん:2011/01/20(木) 23:13:57
できるかボケ^^
836デフォルトの名無しさん:2011/01/20(木) 23:21:28
>>834
本質的な解決にならないうえ boost::addressof で破られる。
837デフォルトの名無しさん:2011/01/21(金) 01:34:05
838デフォルトの名無しさん:2011/01/22(土) 13:45:18
バッファにファイルを読み込んで構造体の形に変換するにはどのキャストを使えばいいですか?
struct A
{
  int a;
  int b;
};
char buf[ 1000 ];
A* a = reinterpret_cast<A*>( buf );
A* a = static_cast<A*>( static_cast<void*>( buf ) );
839デフォルトの名無しさん:2011/01/22(土) 14:19:54
基本的にC++ではそれ自体禁止だけど、この場合は下のやり方。
ところで

union U {
A* a;
char buf[ 1000 ];
};

はやっていいんだっけ?^^;
840デフォルトの名無しさん:2011/01/22(土) 14:42:25
やってもいいけど>>838の意図するだろう挙動にはならない
841デフォルトの名無しさん:2011/01/22(土) 15:15:21
>>840
なぜですか
842デフォルトの名無しさん:2011/01/22(土) 15:37:29
配列はポインタじゃないから
やるならこう
union U {
  A  a;
  char buf[1000];
};
843デフォルトの名無しさん:2011/01/22(土) 15:50:07
>>838
どうでもいいけど型名Aのメンバー変数がaなのにA*型の変数名にa使われるとイラっとする
844デフォルトの名無しさん:2011/01/22(土) 15:53:40
ハンガリアン信者?
845デフォルトの名無しさん:2011/01/22(土) 15:56:59
せっかくどうでもいいって言ってるんだから、変なのに触って無駄にスレを消費しないようにしよう。
846デフォルトの名無しさん:2011/01/22(土) 17:56:12
インスタンス名がデータメンバ名とかぶるのがいやなんでない?
a.aとかになるから。
847デフォルトの名無しさん:2011/01/22(土) 17:59:38
説明用の仮コードなんだからどうでもいいじゃんと言いたいが
名前被ると説明し辛い事もあるから場合によっては避けた方がいいはいいな
848デフォルトの名無しさん:2011/01/22(土) 18:42:05
説明用に適当に書いたコードに細かい文句言うなよ。
849デフォルトの名無しさん:2011/01/23(日) 03:28:29
>>842
&aと&bufが同じアドレスになることは言語仕様で保障されてないでしょ。

>>838
bufのメモリアライメントが保障されていないからキャストは不可。
bufが動的に確保した領域ならどっちでも構わないが、普通はreinterpret_cast。

だがその前に構造体のメモリイメージを保存することはやめた方がいい。
850デフォルトの名無しさん:2011/01/23(日) 12:26:09
>849
> >>842
> &aと&bufが同じアドレスになることは言語仕様で保障されてないでしょ。

いや、保証されてるだろ、と思って探してみた。以下、14882:2003 が参照仕様。
> 9.5 Union /2
> (略) Each data member is allocated as if it were the sole member of a struct. (略)
> 9.2 Class members /17
> A pointer to a POD-struct object, suitably converted using a reinterpret_cast, points to its initial
> member (or if that member is a bit-field, then to the unit in which it resides) and vice versa. [Note: There
> might therefore be unnamed padding within a POD-struct object, but not at its beginning, as necessary to
> achieve appropriate alignment. ]
851デフォルトの名無しさん:2011/01/23(日) 13:49:17
単一メンバの構造体の場合と同じように配置される、か。
なら全て同じアドレスになるね。
852デフォルトの名無しさん:2011/01/23(日) 15:53:54
シングルコアで複数個の無限ループさせたいのですが、
可能ですか?どうすればできますか?教えてください。
853デフォルトの名無しさん:2011/01/23(日) 15:58:38
スレッド使えば?というかC++関係なくね
854デフォルトの名無しさん:2011/01/23(日) 16:00:20
その複数個の無限ループと言うのは。
本当に完全に並列なら −> 無理
OSが管理するスレッド単位の並列なら −> 可能
855デフォルトの名無しさん:2011/01/23(日) 16:04:58
>>852
メニーコアで複数個の無限ループさせるのと同じ要領でいいよ。
今こうしている間にも起動しているほとんどのアプリケーションが無限ループを行っているよ。
856デフォルトの名無しさん:2011/01/23(日) 16:22:36
C++0xのthreadさえ実装されれば・・・
857デフォルトの名無しさん:2011/01/23(日) 17:30:01
int now_thread = 0;

while(1)
{
  if(now_thread == 0){
    func_0();
  }
  else if(now_thread == 1){
    func_1();
  }
  else if(now_thread == 2){
    func_2();
  }

  now_thread++;
  if(now_thread == THREAD_MAX){
    now_thread = 0;
  }
}
858デフォルトの名無しさん:2011/01/23(日) 17:35:16
>>857
なんで
while(1) { func_0(); func_1(); func_2(); }
じゃないの?
859デフォルトの名無しさん:2011/01/23(日) 17:45:01
nowじゃなくてcurrentだろ
略すならcur
860デフォルトの名無しさん:2011/01/23(日) 18:24:34
curはcursorのcur
861デフォルトの名無しさん:2011/01/23(日) 18:34:47
new/cur/tmp ですねわかります
862デフォルトの名無しさん:2011/01/23(日) 18:37:21
Maildir
863デフォルトの名無しさん:2011/01/23(日) 19:55:44
master_thread/maid_thread
864デフォルトの名無しさん:2011/01/23(日) 21:26:30
master/slaveって言うけどこれいいんだろうか
放送には載せられないよね
865デフォルトの名無しさん:2011/01/23(日) 22:58:08
>>858
>>857は説明が足りないだけで、別スレッドがnow_threadの値を変更することを考慮してるからだよ。
866デフォルトの名無しさん:2011/01/24(月) 12:48:14
んなバカな
867デフォルトの名無しさん:2011/01/26(水) 10:01:37
using std::swap;
swap(a,b);

using namespace std;
swap(a,b);
は同じですか?
868デフォルトの名無しさん:2011/01/26(水) 16:42:57
>>867
template <class T>
void swap( T& a, T& b ) { std::cout << "unnamed::swap" << std::endl; }

void hoge( int a, int b )
{
 using std::swap;
 swap(a,b); // std::swap が優先
}

void hogehoge( int a, int b )
{
 using namespace std;
 swap(a,b); // エラー オーバーロード関数の呼び出しを解決できない
}
869デフォルトの名無しさん:2011/01/26(水) 18:14:02
using宣言とusingディレクティブの違い
870デフォルトの名無しさん:2011/01/27(木) 00:51:41
eclipseってすげえな
ボタン一つで文字列を全部外部ファイルに外出しにできたりする
JavaDocで関数仕様の資料作成も一瞬だしVisualStudioって馬鹿じゃねーのってレベル
871デフォルトの名無しさん:2011/01/27(木) 03:01:21
そうなの? eclipseの推奨環境ってどのくらいかな。
Q6600+4GBでさくさく動くなら移行しようかしら…。
872デフォルトの名無しさん:2011/01/27(木) 03:02:26
前者はアドオン作らないとだめかなーって思わんでもない。
後者は、なんでC++スレでJavaDoc?って気がしなくも。

VisualStudioの機能の数パーセントぐらいしか使ったことがなさそうなのはわかった。
873デフォルトの名無しさん:2011/01/27(木) 19:02:44
VS道を究めるには俺のIDEはあまりにもexpress editionだった
まあjavadocはdoxygenで困らんよね
874デフォルトの名無しさん:2011/01/27(木) 21:53:40
>>871
今のJavaクライアントはJITコンパイラが優秀になってるのでAthlon64 4000+程度でもサクサクだ
875デフォルトの名無しさん:2011/01/27(木) 23:23:59
すみません。
超初心者で間違ってる箇所が分からないので指摘お願いします。

#include<stdio.h>

int main(void)
{
int i=1;
int j=0;

printf("テストの点数を入力してください。(0で終了)\n");

while(i= 0){

scanf("%d",&i);
j = j+i;
}
printf("合計は%dです。\n",j);
return 0;
}
876デフォルトの名無しさん:2011/01/27(木) 23:28:42
>>875
> while(i= 0){

while(i != 0){
877デフォルトの名無しさん:2011/01/28(金) 07:01:56
>>876
ありがとうございます。助かりました。
878デフォルトの名無しさん:2011/01/28(金) 14:51:02
エラーがあったら標準エラー出力に出力しればいいですか?
879デフォルトの名無しさん:2011/01/28(金) 16:16:52
エラーと分かれば何でもいい
880デフォルトの名無しさん:2011/01/28(金) 16:35:52
>>878
何で標準エラー出力に出力するかわかる?
881デフォルトの名無しさん:2011/01/28(金) 16:42:43
>>879
そうとも言い切れません。
>>880
わかりません。
882デフォルトの名無しさん:2011/01/28(金) 17:16:26
>>881
お前、エラーと分からないような文をエラーで吐くのか!
無能のレッテルを貼られるぞw
883デフォルトの名無しさん:2011/01/28(金) 20:57:36
標準エラー出力は確かバッファリングしないんだったよね
他の要因でプログラムが落ちる前に出来るだけはき出しておきましょうって事だろ
884デフォルトの名無しさん:2011/01/28(金) 21:23:05
ぶっちゃけ *stderr が記憶保護されていないから
言い出すときりがないんだけどね
885デフォルトの名無しさん:2011/01/29(土) 01:49:59
記憶保護ってなんぞ
886デフォルトの名無しさん:2011/01/29(土) 16:15:27
c/c++に入出力を任せるという発想がそもそも間違い。
887デフォルトの名無しさん:2011/01/29(土) 23:54:50
VCコンパイラで使える、高精度なタイマーというと何があるんでしょうか?
888デフォルトの名無しさん:2011/01/29(土) 23:58:47
それはC++の質問なのかね?
889デフォルトの名無しさん:2011/01/30(日) 00:01:15
VCだとclockが1ms単位くらいの精度だったような気がする。
890デフォルトの名無しさん:2011/01/30(日) 00:02:23
>>889
apiでもっと細かいのがあるけど、ググるのがめんどうだ。
891デフォルトの名無しさん:2011/01/30(日) 00:07:09
892デフォルトの名無しさん:2011/01/30(日) 03:26:24
>>887
QueryPerformanceFrequency
QueryPerformanceCounter
893デフォルトの名無しさん:2011/01/30(日) 05:00:13
メディアプレイヤーを起動しつつそれらのAPIを使うのが胡散臭い方法
どうしてもしたければタイマー精度を変更する
894デフォルトの名無しさん:2011/01/30(日) 10:18:39
もっと頑張れよw
最近落ち目だぜww
895デフォルトの名無しさん:2011/01/30(日) 10:23:21
My Love, My Love.
896デフォルトの名無しさん:2011/02/01(火) 06:23:36
boost::timer
897デフォルトの名無しさん:2011/02/01(火) 17:09:32
C++って関数内に局所的な関数ってかけませんでしたっけ?
むかしどこかで書いたようなきがしたのですが・・・。
898デフォルトの名無しさん:2011/02/01(火) 17:11:43
>>897
struct{
void operator()()
{
}
}Func;
899デフォルトの名無しさん:2011/02/01(火) 17:19:44
auto func = [](int& n) { n++; }
int i;
func(i);
900デフォルトの名無しさん:2011/02/01(火) 17:20:15
C++0x

int  Func(){
    auto Fn = [](int Args)->int{
                     return 0;
                 };
    return Fn(0);
}

って感じか。
901900:2011/02/01(火) 17:21:13
かぶた。
902デフォルトの名無しさん:2011/02/01(火) 18:18:21
>>898
>>899
>>900

どもです、0x系ではないコンパイラだとやっぱりstructの中にかくことになりますか・・・。
ありがとうございました。
903デフォルトの名無しさん:2011/02/01(火) 21:31:37
>>900
int Func(){
return [](int Args)->int{
return 0;
}(0);
}
これでおk
904!omikuji !dama:2011/02/01(火) 22:01:21
>>903
ちょっとキモイな。。。
905デフォルトの名無しさん:2011/02/02(水) 12:32:41
zip書庫を解凍なしに参照するライブラリなどありますか?
たとえば、1ギガのファイルがあったとき、それをメモリかファイルに展開せずに
部分読み出来るものです。
906デフォルトの名無しさん:2011/02/02(水) 13:09:43
前にもこんな質問あったな
仕様読んで自前でやれって言われてたよ
907デフォルトの名無しさん:2011/02/02(水) 13:58:56
Windows7 だと普通に出来てた
908905:2011/02/02(水) 14:25:05
OSの機能使わず、どのOSでも同じアクセスしたいのですが。
ヘッダにzip、zip64、LZMAなどあって、その方言ような誤差の吸収や複数圧縮形式あり
自作するのは辛いですが。ないですか。
909デフォルトの名無しさん:2011/02/02(水) 18:12:38
>>908
日本語でおk
910デフォルトの名無しさん:2011/02/02(水) 21:09:24
とりあえず905=908には無理なことだけは俺にもわかった
911デフォルトの名無しさん:2011/02/03(木) 00:20:56
>>905
メモリに展開せずに、どうやって部分読みできると思うんだ?
まさかとは思うが、レジスタに展開しろとでも言うのか?
912905:2011/02/03(木) 07:41:49
全てをメモリに格納せず、一部分ずつをメモリに格納するという意味でした。
913デフォルトの名無しさん:2011/02/03(木) 08:59:47
できるよ
圧縮前の内容は読めないけどな
914905:2011/02/03(木) 10:54:30
シーケンシャルリードでいいのですが・・・
915デフォルトの名無しさん:2011/02/03(木) 11:03:27
これどう? ソース公開されているからなんとかなるっしょ。
ttp://www.icsharpcode.net/OpenSource/SharpZipLib/
916デフォルトの名無しさん:2011/02/03(木) 11:39:59
>>908
zip書庫のヘッダ形式のLZMAってなんじゃいな
917デフォルトの名無しさん:2011/02/03(木) 19:56:25
C++0xって向こう10年以内には正式の規格にはなら無いんだろ
918デフォルトの名無しさん:2011/02/03(木) 20:06:47
早くて 99 年後だな
919デフォルトの名無しさん:2011/02/04(金) 08:50:04
テンプレートパターンでテンプレート関数をインライン化する
方法をいくつか紹介してください。
920デフォルトの名無しさん:2011/02/05(土) 23:16:27
struct boo
{
  boo() : a(){}
  int a[100];
};

これで配列aが0で初期化されるのは正しい動作なんでしょうか?
921デフォルトの名無しさん:2011/02/05(土) 23:17:16
値を書かなければ0とみなされます
922デフォルトの名無しさん:2011/02/05(土) 23:35:24
>>920
デフォルト初期化が行われて 0 になるので正解。
923デフォルトの名無しさん:2011/02/06(日) 01:59:40
独自フォーマットのアーカイバ(非圧縮)を開発することについて質問です。環境はWinXP+VC++2010です。
以下の質問では、より良い標準的な方法があったらそれも教えてください(例えばmemcpy関数じゃなくてこっちのほうが標準的でいいよ的な)
沢山質問してしまいますがよろしくお願いします。
0, (そもそもこういう処理のためのライブラリがあったりしませんか?スレチ気味ですが)

1, ヘッダ部を処理するために例えば
struct Header{
unsigned char sign[8]; //8bytes
unsigned char datasize[8]; //8bytes
};
Header hdr = {0};
のような構造体を定義します。
まず、特定のバイト数を確保する際のやりかた(ここでは8バイト)はこれでいいのでしょうか?

2, 1,で定義した構造体のメンバにあるバイト列を代入する場合どうすればよいのでしょうか?
例えば代入元がUINT128(適当ですからなかったらすいません)の場合は、
UINT8 i = 234;
memcpy(hdr.datasize,&i,sizeof(UINT128));
でいいんでしょうか?
memcpyでサイズが違うものに使ったことがなく不安です。例えば、
コピー元(UINT128=16バイト): 0xFF 00 00 00 00 (略) 00 AA BB CC
の時memcpyで8バイトコピーしたら、コピー先は0x00 00 00 00 00 AA BB CCってことでいいんですか?
つまりmemcpyの起点はいったいどうなってるんですか?

3, boost::FileSystem::file_sizeがuintmax_tの返り値をくれるんですが、これはどうやって1の構造体に代入すれば?
sizeofで実行時にサイズを計算して、8バイトと比べて小さい方をmemcpy?

4, wchar_t* なんかもそのままmemcpyで大丈夫ですか?
5, できあがったhdrをメンバ変数を一つづつファイル出力するとして
選択1: C++のfstream; 選択2: Cのread&write; 選択3: win32api(低水準)
巨大なバイナリ列を扱う時の、定番の入出力法はなんなんでしょう?ちまたのアーカイバはどうしてるんですか?
なお、fstreamに渡すときは(char*)にキャストしてバイト数指定でいいですよね? 強制的にリトルエンディアンですか?
924デフォルトの名無しさん:2011/02/06(日) 02:16:50
>>923
0 については知らない。

1 について、構造体のメンバ間や終端には実装依存のパディングが入ることがある。
ただし実際には理由無くパディングを入れることはまず無いので、 sizeof や
offsetof と assert あるいは BOOST_STATIC_ASSERT を組み合わせてレイアウトを
確認しながら使うことはできる。

2, 3 4 について、整数型の表現形式は実装依存。ただし unsigned char については
そのビット数ぶん隙間無く詰まっていることが保証されている。移植性を最大にするなら
すべて unsigned char のレベルで処理することになる。つまり大きな整数型のまま
memcpy() するのではなく、想定しているバイト並びを明示的に組み立てるのがいい。
移植性は必要なくて速度が必要だと言うなら、そのことをコメントで記載したうえで
特定の実装に依存してしまうのもいい。

5 について、要求に応じて決めればいい。エンディアンとか気にするなら↑に戻る。
925923:2011/02/06(日) 02:37:13
>>924
ありがとうございます。

1, では変数を個別に書き出すことにします。

2,3,4,5について、気持ちが悪いので実装に依存しない方法で書くことにします。
>想定しているバイト並びを明示的に組み立てるのがいい。
どういうコードになりますか?
memcpy(&unsignedchar, &largeinteger, sizeof(unsigned char));
このときlargeintegerのどの部分から取り出されるんですか?
これが実装依存だとどうしようもない気がするんですが。
926デフォルトの名無しさん:2011/02/06(日) 03:02:22
>>925
> memcpy(&unsignedchar, &largeinteger, sizeof(unsigned char));

unsignedchar が 8 ビット、 largeinteger が 32 ビットだとして、
リトルエンディアンで保存したいなら
unsignedchar = largeinteger & 0xff;
ビッグエンディアンで保存したいなら
unsignedchar = (largeinteger & 0xff000000) >> 24;
という感じになるかな。
927デフォルトの名無しさん:2011/02/06(日) 03:08:28
uint64_t largeinteger;
uint8_t byte_array[8]; // リトルエンディアンで格納される
for(int i = 0 ; i < 8 ; i ++)
{
byte_array[i] = (uint8_t)((largeinteger >> i*8) & 0xFF);
}
928デフォルトの名無しさん:2011/02/06(日) 10:52:22
visual C++でのIEを操作したいです。
MSTHMLのライブラリを使っているのですが、問題がおきました。
質問はここでいいでしょうか?
929デフォルトの名無しさん:2011/02/06(日) 11:15:52
930デフォルトの名無しさん:2011/02/06(日) 11:17:03
↑有難うございます。こっちで聞いてみます。
931デフォルトの名無しさん:2011/02/06(日) 11:29:20
すまないが、こっちのが良かった
http://hibari.2ch.net/test/read.cgi/tech/1145189322
932デフォルトの名無しさん:2011/02/06(日) 18:20:06
int* x = new int(10);
delete x;

はメモリ確保→開放をポインタでやってるわけだよね

int x = 10;
delete &x;

とは書けないの?
933デフォルトの名無しさん:2011/02/06(日) 18:27:18
deleteは動的に確保されたメモリを開放する命令だから
int x = 10;みたいに静的に確保されたメモリには使えない。
っていうか、使う意味がない。
int x = 10;はスコープから抜ければ勝手に破棄されるから。
934デフォルトの名無しさん:2011/02/06(日) 18:33:06
いや、違うな。int x = 10;は自動であって静的じゃないね。
935デフォルトの名無しさん:2011/02/06(日) 18:43:48
>>932
> 開放をポインタでやってるわけだよね

どこからそんな変な知識を得たんだろう...。
936デフォルトの名無しさん:2011/02/06(日) 18:44:42
前者はヒープ、後者はスタック
937デフォルトの名無しさん:2011/02/06(日) 18:47:59
規格で自動変数がスタックに確保されると決まってるわけじゃないだろ。
そうじゃない実装はほとんどないだろうけど。
938デフォルトの名無しさん:2011/02/06(日) 18:48:06
入門書はヒープとかスタックとかについて解説すべき
大抵2冊目の本にしかその辺のことがかかれてない
939932:2011/02/06(日) 18:52:22
初心者質問スレがあったみたいだわ
とりあえずヒープとスタックでググります
940925:2011/02/06(日) 21:31:29
>>926-927
ありがとうございます。
>>927で実装してみたところ、上手くいってる……と思ったら、
いくつかある変数のうち1つだけが値がおかしいのでよく調べたら、
wikipediaによればC++ではシフト元を超えてシフトする場合の動作は未定義とのことで。
iの値は、元が64ビットの保証がない時はsizeof使うってことでいいんでしょうか?
941デフォルトの名無しさん:2011/02/06(日) 21:41:26
>>940
cstdint や stdint.h が使えれば簡単に保証できるんだけどね。
無いなら numeric_limits 使って確認、かなぁ。
942デフォルトの名無しさん:2011/02/06(日) 21:43:40
PSPの環境で
sizeof( int64_t )が4という値を返してきたんですがどうしてですか?8byteじゃないんですか。
943デフォルトの名無しさん:2011/02/06(日) 21:46:36
>>942
単にバグってるか、 CHAR_BIT が 16 だとか。
944デフォルトの名無しさん:2011/02/06(日) 22:00:39
CHAR_BIT関係なくね?
945デフォルトの名無しさん:2011/02/06(日) 22:07:27
>>944 CHAR_BIT が 16 なら sizeof(int64_t) は 4 で正解でしょ。 16*4 == 64
946デフォルトの名無しさん :2011/02/06(日) 22:11:43
>>944
sizeof は char いくつ分かを返すんだよ。
947デフォルトの名無しさん:2011/02/06(日) 22:14:56
stdint.h見ると

typedef long int64_t;
typedef unsigned long long uint64_t;

となっています。バグですか?
948925:2011/02/06(日) 22:23:57
>>941
これならいけそうです。ありがとうございました。
949デフォルトの名無しさん:2011/02/06(日) 22:25:24
>>947
uint64_t と int64_t で long long と long が違うのか。バグっぽいな。

BOOST_STATIC_ASSERT((sizeof(int64_t) * CHAR_BIT) == 64); あるいは assert(...) してみて、
失敗したら確実にバグ。
950デフォルトの名無しさん:2011/02/06(日) 23:07:09
CHAR_BITってはじめてきいたわ、これなにもの??
951デフォルトの名無しさん:2011/02/07(月) 00:54:11
charは1byteであることは規格で定められているが、1byteが何bitであるかは定めていない。
CHAR_BITはchar型のbit数を定義してあり、ひいては、1byteが何bitであるかをあらわしている。
952デフォルトの名無しさん:2011/02/07(月) 15:18:10
>>951
ありがとう、わかりやすい解説でたすかりました。
953デフォルトの名無しさん:2011/02/07(月) 17:10:17
class test
{
public:
 test(char* a) : pchar = a {};
 char& operator[](size_t i)
 {
  return pChar[i];
 }
}

test temp = test("aaa");
temp[0] = 'b';

上記コードの最後で書き込みアクセス違反となってしまいます。
[]のオーバーロード方法が間違っているのでしょうか?
よろしくお願いします。
954デフォルトの名無しさん:2011/02/07(月) 17:12:29
public:
 test(char* a) : pchar = a {};

public:
 char* pChar;
 test(char* a) : pChar(a) {};

でした
955デフォルトの名無しさん:2011/02/07(月) 17:24:17
char* p = "aaa"と
char p[] = "aaa"の違い分かってないでしょ
コンストラクタでメモリ確保してそこに渡された文字列をコピーしないとだめ
956デフォルトの名無しさん:2011/02/07(月) 17:38:07
>>955
仰せのとおり同じものと認識していましたorz
ありがとうございました
957デフォルトの名無しさん:2011/02/07(月) 20:23:09
char* p = "aaa"と
char p[] = "aaa"の違い分かってないでしょ
はい。中身は同じですよね。で、どう違うんですか?
958デフォルトの名無しさん:2011/02/07(月) 20:26:48
sizeof が同じになるねw
959デフォルトの名無しさん:2011/02/07(月) 20:34:24
char* p = "aaa";
は、staticに4byteを確保しておいて(最後の1byteは'\0')、そのポインタだけを得る。
静的領域へのポインタだから、今のメモリ管理システムだと書き換えできない。
…でも昔はできた気がする。

char p[] = "aaa";
は、ヒープに必要なサイズのメモ地(この場合は4byte)確保して、そこに"aaa"をコピーする。
ヒープだから書き換えできる。
960デフォルトの名無しさん:2011/02/07(月) 20:35:02
char* p = "aaa";
p[1] = 'b';
961デフォルトの名無しさん:2011/02/07(月) 21:03:15
>959
>静的領域へのポインタだから、今のメモリ管理システムだと書き換えできない。
多分メモリ保護のこと言ってるんだろうけど環境によっては ROM 上になるべ。
いずれにしろ未定義動作だ。

>は、ヒープに必要なサイズのメモ地(この場合は4byte)確保して、そこに"aaa"をコピーする。
>ヒープだから書き換えできる。
スタックか静的領域か、いずれにしろヒープには取らないだろう、普通。
962デフォルトの名無しさん:2011/02/07(月) 23:04:49
かなり上げ足取りだが、
クラスのメンバなら普通にヒープになる場合もあるがなー
963デフォルトの名無しさん:2011/02/07(月) 23:09:06
おまえらはヒープって言っているけど、実はヒープの説明できないだろ
964デフォルトの名無しさん:2011/02/07(月) 23:18:51
スコープつきの変数はスタックに取られる。
ヒープはメモリのプールでプログラマの権限で管理する。
スタック自体はヒープに取られることもありうる。
965デフォルトの名無しさん:2011/02/07(月) 23:24:50
そんなルール、規格に書いてあったっけ?
966デフォルトの名無しさん:2011/02/07(月) 23:30:28
スタックはCPUレベルならespとかで操作
関数型言語ならCPUスタックは使わずにヒープで実装されてるイメージがある
しかしヒープ自体についてはあまりよくわかってないので教えて
967デフォルトの名無しさん:2011/02/07(月) 23:33:01
968デフォルトの名無しさん:2011/02/07(月) 23:36:44
ヒープとはいったいナンなのだ!!!
969デフォルトの名無しさん:2011/02/07(月) 23:37:00
closure を stack allocation するのは基本的な最適化の一つじゃなかったっけ。
だから関数型言語の実装者もスタックが使えるなら使いたいと思ってる筈。
ただ、継続とか、プログラムの実行制御を言語の機能として持っていると、
それがなかなか難しいみたいな感じなのかな。
970デフォルトの名無しさん:2011/02/07(月) 23:39:44
>>963
自分で brk して取ってくるのがヒープ
プロセスの起動時に勝手に brk して貰えるのがスタックとかテキストエリアとか
971デフォルトの名無しさん:2011/02/07(月) 23:49:58
>>970
brk?
972デフォルトの名無しさん:2011/02/07(月) 23:53:37
>>971
古いUnix系のシステムコールだよ。今でも使えるOSはそれほど多くない。
973デフォルトの名無しさん:2011/02/07(月) 23:56:58
今でも現役だと思いますが?
974デフォルトの名無しさん:2011/02/08(火) 00:01:16
わかった、仮想メモリの.bssの上あたりにbrkとかsbrkで保存される
コンパイルオプションで与えるスタックサイズが
自動でbrkされるサイズなのか?
975デフォルトの名無しさん:2011/02/08(火) 00:08:23
コンパイル時にスタックサイズを決めるって何か新鮮だな
ulimit とかが無いシステムなのか
976デフォルトの名無しさん:2011/02/08(火) 01:03:23
スタックサイズが見積もられていないプログラムも悪い意味で「新鮮」だが
977デフォルトの名無しさん:2011/02/08(火) 01:10:21
コンパイル時に指定しなくて良いという話と、見積もらないで良いという話を
ごちゃ混ぜにしちゃったのかな?

普段からスタックを食いつぶす様なコードを書いていたら俺も不安になるかもなあ。
不思議な世界もあるもんだ。
978デフォルトの名無しさん:2011/02/08(火) 01:46:38
クラスがメンバ変数にPODな構造体を持っていて、
コンストラクタの初期化子にその構造体を明示的に記述した場合、
構造体の中身が全て0で初期化される。
初期化子に書かなかった場合、0で初期化されない。

という認識で間違いないでしょうか。
http://codepad.org/1lm8NweW

試したらちゃんと0になってくれて、合ってると思うのですが、
ネット上にあるコード見てると、ZeroMemoryとかmemsetを使ってる人が多くて、不安になったので…
979デフォルトの名無しさん:2011/02/08(火) 01:50:41
テンプレートクラスを引数にとる関数を作りたいのですが、
テンプレートクラスのテンプレート引数に関係ない部分を処理するので、
いちいちこの関数に対してテンプレート引数を要求したくありません
何か良い実装法はないですか?
980デフォルトの名無しさん:2011/02/08(火) 02:40:39
>>978
その認識で合ってる。不安なら規格を確認しれ。
981デフォルトの名無しさん:2011/02/08(火) 03:41:33
C++の標準ライブラリ≒STL だろうと思うけど、
逆にSTLでない標準ライブラリって何があるん
でしょうか。
982デフォルトの名無しさん:2011/02/08(火) 03:47:16
std::coutとか。
stdでテンプレート以外の奴が大体そうじゃね
983デフォルトの名無しさん:2011/02/08(火) 03:48:39
standard template laiburarii = STLだから、tennpure-to使ってないものならSTLには含まれない。
984デフォルトの名無しさん:2011/02/08(火) 03:52:59
あ標準入出力やファイル入出力や文字列クラスがそれに該当するか。
stringは確かbasic_string<char>とかで、結局はいずれも、内部では
STLを使って型を特定したバージョンにすぎないのかも知れんな。
985デフォルトの名無しさん:2011/02/08(火) 04:50:19
>>983
だいぶ適当だなwまあいいけど
986デフォルトの名無しさん:2011/02/08(火) 08:03:16
どうせならsutanda-doくらい書けよpgr
987デフォルトの名無しさん:2011/02/08(火) 11:05:18
うめ
988デフォルトの名無しさん:2011/02/08(火) 12:04:23
boostのmulti_arrayとかコンストラクタでメンバ変数をまるごと指定できないクラスで、その内容をconstにしたい場合、
初期化のときだけforループでまわしてconst_castして初期化、という方法くらいしか思い浮かばないのですが、
何かconst_castみたいな気持ち悪いもの使わない方法はありませんか?
989デフォルトの名無しさん:2011/02/08(火) 12:15:41
valarrayとかbitsetもSTLの中には入ってないはず。
STLと呼ばれるためには単にテンプレートを採用しているだけでなく
algorithmと協調動作するために一定の要件がある。
990デフォルトの名無しさん:2011/02/08(火) 12:19:37
>>989 特定の要件を満たしたときにSTLの一部と呼ばれるようになる、なんてことはないお
991デフォルトの名無しさん:2011/02/08(火) 12:34:16
>>988
それって別にboost::multi_arrayだけでなくて通常のクラス配列にも成り立つ事だよね
リファレンス変数とかconst変数の初期化を行いたい時はどっちにしろクラスの数分
コンストラクタを呼び出さなくてはいけないのでは?

デフォルト値ならともかく
992デフォルトの名無しさん:2011/02/08(火) 12:47:44
単純な配列にしてもこんな方法しか思いつかない

#include <iostream>

class Test {
const int i;
public:
Test() : i(0) {}
Test(int j) : i(j) {}
void Set_i(int j) { const_cast<int&>(i) = j; }
void Print_i() const { std::cout << i << ' '; }
};

int main()
{
Test* t = new Test[10];
for (int i = 0; i < 10; i++) {
t[i].Set_i(i);
t[i].Print_i();
}
std::cout << std::endl;
delete t;
}
993デフォルトの名無しさん:2011/02/08(火) 12:48:08
>>988
非constなコンテナにforループで代入して、それを使ってconstなコンテナを初期化して
コンパイラの最適化を祈る
未来にはnested_collectionコンセプトみたいなのができるてるといいな
994デフォルトの名無しさん:2011/02/08(火) 13:11:33
でもpublicなconst変数があるとユーザがそれを利用して悪さというか
間違った操作をする可能性はないか?

まあCもC++も「プログラマはコンピュータに何をさせようとするか全て知っている」
という前提だけどな
995デフォルトの名無しさん:2011/02/08(火) 13:13:00
次スレ建つまで埋めんなよ
996デフォルトの名無しさん:2011/02/08(火) 13:15:48
>>993
collectionで一気にコンストラクタを呼び出す機能とかは確かに欲しいな
997デフォルトの名無しさん:2011/02/08(火) 13:25:32
>>993
非constなコンテナにforループで代入して返却するstaticメソッドなら作ったりしたなぁ
998デフォルトの名無しさん:2011/02/08(火) 14:23:33
999デフォルトの名無しさん:2011/02/08(火) 15:34:18
.
1000小倉優子 ◆YUKOH0W58Q :2011/02/08(火) 15:35:01
  ∧,,,∧ 
 (  ・∀・) 1000ならジュースでも飲むか
  (    ) 
  し─J 
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。