C++相談室 part87
レス数が1000を超えています。これ以上書き込みはできません。
0001ゆとり
2010/12/09(木) 19:31:20このスレはゆとりのための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
0002ゆとり
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)に対応。
0003ゆとり
2010/12/09(木) 19:34:23[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
0004ゆとり
2010/12/09(木) 19:35:36amazon C,C++関連書籍
http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
http://www.amazon.co.jp/b/?node=754384
The C++ Programming Language
http://www.amazon.com/exec/obidos/ASIN/0201700735/
http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
http://www.amazon.com/exec/obidos/ASIN/0201824701/
http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
http://www.amazon.com/exec/obidos/ASIN/0201379260/
http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
http://www.amazon.com/exec/obidos/ASIN/0201924889/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
http://www.amazon.com/exec/obidos/ASIN/020163371X/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/0201615622/
http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/020170434X/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714833/ (翻訳)
Exceptional C++ Style
http://www.amazon.com/exec/obidos/ASIN/0201760428/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714663/ (翻訳)
0005ゆとり
2010/12/09(木) 19:37:03http://codepad.org/
http://ideone.com/
では、ゆとりの皆さん相談どうぞ。
0006ゆとり
2010/12/09(木) 19:39:58Effective STL
http://www.amazon.com/exec/obidos/ASIN/0201749629/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
http://www.amazon.com/exec/obidos/ASIN/0201704315/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
http://www.amazon.com/exec/obidos/ASIN/0321227255/
ごめんなさい。これ忘れてた。
0007デフォルトの名無しさん
2010/12/09(木) 20:27:060008v(^・^)v
2010/12/09(木) 21:01:22環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0009デフォルトの名無しさん
2010/12/09(木) 22:36:580010デフォルトの名無しさん
2010/12/09(木) 22:47:470011デフォルトの名無しさん
2010/12/09(木) 23:04:130012デフォルトの名無しさん
2010/12/09(木) 23:11:400013デフォルトの名無しさん
2010/12/09(木) 23:16:130014デフォルトの名無しさん
2010/12/10(金) 00:39:08コマンドライン引数をmain関数以外で取得する方法はありますか?
BCBのParamCount()のようなものを探しています。
0015質問
2010/12/10(金) 00:40:530016デフォルトの名無しさん
2010/12/10(金) 00:42:110017デフォルトの名無しさん
2010/12/10(金) 00:44:150018デフォルトの名無しさん
2010/12/10(金) 00:46:11ランタイムライブラリを動的リンクしてるから
静的リンクすれば必要ない
0020デフォルトの名無しさん
2010/12/10(金) 01:12:14>>1 スレ違い
0021デフォルトの名無しさん
2010/12/10(金) 04:08:480022デフォルトの名無しさん
2010/12/10(金) 10:42:46part80くらいからしか見てないからわからん。
0023デフォルトの名無しさん
2010/12/10(金) 11:31:41かなり前に面白い流れだからって新スレを立てた人が次スレにも貼ったのが
始まりだったと記憶している
0024デフォルトの名無しさん
2010/12/10(金) 12:52:49「STLつかうと〜」の初出が part16 (2003/02/21) で、 part17 にデジャブネタとして
コピペされたときにテンプレ指定され、隣接していた「C1010: プリコンパイル済みヘッダーの〜」の
くだりまでまとめて part18 で貼られ、その後長らくテンプレとして毎度貼られていた。
0025デフォルトの名無しさん
2010/12/10(金) 12:56:44http://mimizun.com/2chlog/tech/pc2.2ch.net/tech/kako/1045/10457/1045746245.html
なんとか16を見つけたところだった。
0026デフォルトの名無しさん
2010/12/10(金) 13:05:56もうすぐ10周年になるようだ。
0027デフォルトの名無しさん
2010/12/11(土) 12:58:140028デフォルトの名無しさん
2010/12/11(土) 16:47:550029デフォルトの名無しさん
2010/12/11(土) 20:01:50どうすればよいでしょう?
0030デフォルトの名無しさん
2010/12/11(土) 20:10:300031デフォルトの名無しさん
2010/12/11(土) 20:14:11{
public:
int operator =( int val ){ return this->val = val; }
private:
int val;
};
これでなんとかしろ
0032デフォルトの名無しさん
2010/12/11(土) 20:17:320033デフォルトの名無しさん
2010/12/11(土) 20:26:220034デフォルトの名無しさん
2010/12/11(土) 21:14:23sizeof演算子の戻り値の型は、std::size_t型であるとされている。
std::size_tは、ライブラリ18.2[support.types]で定義されている。
そこでは、size_tはC規格で定義されているとしている。
C規格では、size_tはsizeof演算子の結果の型であると定義されている!
要するに、何型なの?
0035デフォルトの名無しさん
2010/12/11(土) 21:25:23わざわざコンストラクタ/デストラクタを宣言しますか?
0036デフォルトの名無しさん
2010/12/11(土) 21:25:46The 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).
要するに処理系定義の符号なし整数型
0037デフォルトの名無しさん
2010/12/11(土) 21:51:04でも、インラインと非インラインの関数の違いがイメージ出来ません
説明お願いします
0038デフォルトの名無しさん
2010/12/11(土) 21:56:53++i;
これと
void increment(int& i) { ++i; }
int i = 0;
increment(i);
これ
どっちも同じことしてるけど後者の方が遅いっていうのは分かるよな?
それでinlineを付けるとコンパイル時に前者に置換されるわけだ
0040デフォルトの名無しさん
2010/12/11(土) 22:17:20> どっちも同じことしてるけど後者の方が遅いっていうのは分かるよな?
わかんねーだろjk
37 も何納得してんだ。
アセンブリレベルのコードで比較しないと意味無い。
0041デフォルトの名無しさん
2010/12/11(土) 22:18:430042デフォルトの名無しさん
2010/12/11(土) 22:18:470043デフォルトの名無しさん
2010/12/11(土) 22:33:11スタック積む?処理がなくなるから
オーバーヘッドがなくなるってことなんじゃないの?
C++ はじめてまだ15分ほどなんでよくわからないですけど。
Cは未経験です。
童貞って意味じゃないです。
いや、まぁ童貞なんですけどね。
0044デフォルトの名無しさん
2010/12/11(土) 23:15:31目指しているものと一致してるかはわからんが
演算子をオーバーロードして範囲チェックを行うやり方があるね
範囲そのものはポリシーで挿げ替えるという実装
オライリーの本だかに載ってたと思う
0045デフォルトの名無しさん
2010/12/12(日) 00:44:41ありがとうございます。
0046デフォルトの名無しさん
2010/12/12(日) 01:14:03おいおい安易に納得するな
inlineはregister指定と同じで、コンパイラはこれを無視する事が出来る
本当にインラインになっているかどうかは>>40の言う通りで逆アセンブル
画面を出して見てみないと分からないぞ
0047デフォルトの名無しさん
2010/12/12(日) 01:15:040048デフォルトの名無しさん
2010/12/12(日) 02:03:42これ見て後者が遅いと思い込むなんてのは、 for の中で変数宣言したら
遅くなるから外で(なんならグローバルで)とか言うのと同じような勘違いだ。
C++ 上の字面とパフォーマンスを直結させるべきじゃない。
0049デフォルトの名無しさん
2010/12/12(日) 03:30:57必ずinline展開されると思い込んでいる馬鹿もどうかと思うけどね
0050デフォルトの名無しさん
2010/12/12(日) 03:43:340051デフォルトの名無しさん
2010/12/12(日) 10:20:09inlineはリンカに関数定義の重複を無視するように指示するものだと考えた方が
実用上は便利だ。
0052デフォルトの名無しさん
2010/12/12(日) 10:48:550053デフォルトの名無しさん
2010/12/12(日) 10:55:58質問の意図を履き違えて関係ないことをべらべら喋り出すアホの典型
0054デフォルトの名無しさん
2010/12/12(日) 13:47:58string &m_str;
public:
Super(string &s) : m_str(s) {};
}
class Sub : public Super {
public:
Super(): Super("string") {};
}
スーパークラスの&m_strを使う事は危険ですか?
0055デフォルトの名無しさん
2010/12/12(日) 13:56:59そもそもprotectedでないと派生からはm_strは使えない
それとなぜに参照?""で渡すと
一時オブジェクトが破棄されて存在しないものの参照が出来上がるんじゃないか?
0057デフォルトの名無しさん
2010/12/12(日) 14:12:20005854
2010/12/12(日) 14:32:54って怒られるんだね
知らなかった
0059デフォルトの名無しさん
2010/12/12(日) 14:54:140060デフォルトの名無しさん
2010/12/12(日) 15:03:45したよ
0061デフォルトの名無しさん
2010/12/12(日) 15:05:440062デフォルトの名無しさん
2010/12/12(日) 15:22:52class 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;
}
0063デフォルトの名無しさん
2010/12/12(日) 15:26:42そういえばコンパイラが無視していいものの中には volatile もあるな
>>51
単一定義規則は inline がついていても見逃してもらえないぞ
0064デフォルトの名無しさん
2010/12/12(日) 16:05:40class 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) {}
};
のようにコピーを保持しなければならない
0065デフォルトの名無しさん
2010/12/12(日) 16:10:12なるほど、const参照のconst参照という風に2段以上に重ねると
問題が生じるようですね
これは盲点でした
これから気を付けます
ありがとうございました
0066デフォルトの名無しさん
2010/12/12(日) 19:12:28Super s ( std::string("string") );
の時点でアウトなんだよ。
SuperとかSubとか書いてたり、仮想関数を知らなかったりするあたりJava使いだと思うんだが、
Javaの発想は全部捨てないとCやC++はぜんぜん挙動が違うぞ?
0067デフォルトの名無しさん
2010/12/12(日) 20:11:51volatile は無視しちゃいかんだろう。
inline で単一定義規則の制限が少し楽になるのは確かだろう。
0068デフォルトの名無しさん
2010/12/12(日) 20:13:34なんでアウトなんだよ
ただの一時オブジェクトじゃないか
それに今回は仮想関数は必要ないだろう
0069デフォルトの名無しさん
2010/12/12(日) 20:15:280070デフォルトの名無しさん
2010/12/12(日) 20:19:48だから具体的にどうアウトなんだよ?
0071デフォルトの名無しさん
2010/12/12(日) 20:21:56一時オブジェクトを指して初期化された参照は、 Supuer の初期化が完了した時点ではすでに
無効になっている。 >>66 にある初期化の後、 s を使ったあらゆる操作が未定義動作になりうる。
0072デフォルトの名無しさん
2010/12/12(日) 20:22:42だからお前の言ってる事は>>64で全部書いてあるだろう
なぜ同じ事を二度も言うんだ?
0073デフォルトの名無しさん
2010/12/12(日) 20:23:480074デフォルトの名無しさん
2010/12/12(日) 20:26:07どうして>>65が「さっぱり」理解してない事がお前にわかるんだ?
0075デフォルトの名無しさん
2010/12/12(日) 20:29:4665 が理解している問題発生の条件は「const参照のconst参照という風に2段以上に重ねると」
となっているが、実際には2段重ねなくたって同じ問題は発生する。
struct S { std::string const& s } s = { std::string("string") };
0076デフォルトの名無しさん
2010/12/12(日) 20:30:44だったら最初からそのようにシンプルに書けばいいだろう
ネチネチと厭らしいんだよてめえの書き方は
0077デフォルトの名無しさん
2010/12/12(日) 20:32:34だいたいコンパイルが通らないコードを書いてどうするつもりなんだよ?
0078デフォルトの名無しさん
2010/12/12(日) 20:34:110079デフォルトの名無しさん
2010/12/12(日) 20:35:30#include <string>
struct S { std::string const& s; } s = { std::string("string") };
0080デフォルトの名無しさん
2010/12/12(日) 20:38:27「コンストラクタがありません」と言われますけど?
0081デフォルトの名無しさん
2010/12/12(日) 20:44:01codepad では通るようだが、環境は?
http://codepad.org/WVPBNYkZ
0082デフォルトの名無しさん
2010/12/12(日) 20:49:11BCC(ECC)6.3.1だ
エラーメッセージは「リファレンス メンバ 'S::s' があるクラスにコンストラクタがない」だ
当然だと思うが?
gccの拡張だろう
0083デフォルトの名無しさん
2010/12/12(日) 20:51:31一時オブジェクトと参照がどういうもかと言う基礎的ことを知らないってのが原因じゃね
恐らく、>>62はポインタ使ったのでも一時オブジェクトを気合を入れて指すコード書くんだろうな
0084デフォルトの名無しさん
2010/12/12(日) 20:52:29だからお前のは単なる憶測に過ぎないから
なんでそう自分の価値観を人に押しつける?
うぬぼれが強すぎるんと違うか?
0085デフォルトの名無しさん
2010/12/12(日) 20:57:28codepad は -std=c++98 -pedantic-errors だから gcc 拡張の線は薄いな。
http://codepad.org/about
暗黙宣言のデフォルトコンストラクタが使われれば暗黙定義で S::s が初期化されて
いないことが問題になるだろうが、この例では { ... } による初期化が行われているので
問題にならないほうが正しいと思う。
0086デフォルトの名無しさん
2010/12/12(日) 21:10:40§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.
お前さんの言っている事はデタラメである事がはっきりしている
0087デフォルトの名無しさん
2010/12/12(日) 21:15:11念のためにこれも付け加えておくか
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拡張である事が明らかだ
0088デフォルトの名無しさん
2010/12/12(日) 21:15:25いや、だからさ、それは暗黙定義のデフォルトコンストラクタで問題になるわけで、
>>79 では暗黙定義のデフォルトコンストラクタは使われていないから問題ないだろ。
0089デフォルトの名無しさん
2010/12/12(日) 21:18:29お前英語が読めないんだろう
the program is ill-formed.
の意味が分かるか?
リファレンスをメンバに持っていてそれがコンストラクタで初期化されない時は
そのプログラムは不適格とすると書いてあるだろう
つまりコンパイルが通らないので正しいわけだ
0090デフォルトの名無しさん
2010/12/12(日) 21:21:53それも関係ない。参照型メンバは初期化リストで初期化されなければコンパイルエラーに
なるから、当該のコンストラクタが実行されることもないし、もちろん完了することも無い。
0091デフォルトの名無しさん
2010/12/12(日) 21:23:02コンストラクタ定義の中で >>86 の条件に合えば ill-formed なんだよ。
>>79 では問題のコンストラクタ定義が無い。
何度言わせるんだ?お前は日本語が読めないのか?
0092デフォルトの名無しさん
2010/12/12(日) 21:27:15もう好きなようにしろ
規格を呈示しても難癖付ける奴にはもう言う事はないよ
自分独自の世界でプログラムでもしてろ
0093デフォルトの名無しさん
2010/12/12(日) 21:31:22規格を提示って言っても、関係ないところ提示されて話になるわけないだろ。
0094デフォルトの名無しさん
2010/12/12(日) 21:32:40「英語が読めない奴はJIS規格でも読んでろ」
0095デフォルトの名無しさん
2010/12/12(日) 21:35:470096デフォルトの名無しさん
2010/12/12(日) 21:43:03よく分らんが、
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") }; はありえる?
009766
2010/12/12(日) 21:44:53>なるほど、const参照のconst参照という風に2段以上に重ねる
これに対して「何を面白いことを」ですよ^^
>>64のいってることはあってますよ^^
0098デフォルトの名無しさん
2010/12/12(日) 21:47:25> {}あるからSはクラスじゃなくC的な構造体ととらえられてるんじゃない?
逆。 aggregate として扱われているから { ... } による初期化ができる。
> C++のstructはpublic class扱いのみで、データをまとめるC的structとしては扱えないの?
問題なく扱える。
> クラス扱いでs = { std::string("string") }; はありえる?
あり得る。
エラーが発生しているのは BCC(ECC) のバグ。
0099デフォルトの名無しさん
2010/12/12(日) 22:06:010100デフォルトの名無しさん
2010/12/12(日) 22:32:19Cスタイルの初期化でコンストラクタとかもう聞いただけで汚らわしい
0101デフォルトの名無しさん
2010/12/12(日) 22:39:15むしろ、ユーザー定義のコンストラクタがあるほうがだめ。
0102デフォルトの名無しさん
2010/12/12(日) 23:17:22それはstructの時だけだよね
classでできる?
0103デフォルトの名無しさん
2010/12/12(日) 23:23:370104デフォルトの名無しさん
2010/12/12(日) 23:24:34public:の時だけだよねやっぱり
0105デフォルトの名無しさん
2010/12/12(日) 23:28:51classかstructであるかは問題ではない…が、結局いっしょ。
010696
2010/12/13(月) 00:34:59aggregateって知らない言葉に戸惑ったが、配列初期化の
int array[3] = {1,2,3}; と同じ{}ってことか
int array[3]がaggregateだから{}で初期化ができると
aggregateはここが参考になった
http://www.bohyoh.com/CandCPP/FAQ/FAQ00067.html
BCC、ダメポ
0107デフォルトの名無しさん
2010/12/13(月) 00:49:40テンプレート使うと大爆発するし。
0108デフォルトの名無しさん
2010/12/13(月) 01:21:140109デフォルトの名無しさん
2010/12/13(月) 05:04:11普通にやってることなんだよね?
0110デフォルトの名無しさん
2010/12/13(月) 08:17:27関数化すれば?
0111デフォルトの名無しさん
2010/12/13(月) 09:43:210112デフォルトの名無しさん
2010/12/13(月) 13:30:03組織の力学で決まってしまっている人もいる
0113デフォルトの名無しさん
2010/12/13(月) 15:00:18初期値を代入した後は変更できないようにしたいんですが。
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;
とかやるしかないでしょうか?
0114デフォルトの名無しさん
2010/12/13(月) 15:31:45だめなら、その方法しかないかなと。const参照にすればいいよ。
0115デフォルトの名無しさん
2010/12/13(月) 15:35:48vectorをメンバに持ち、const参照を返すメンバ関数とコンストラクタのみをpublicに持つクラスでも作れば。
0116デフォルトの名無しさん
2010/12/13(月) 16:14:020117113
2010/12/13(月) 18:10:50アドバイスありがとうございます。
const_castが最小限の変更ですっきり書けそうですね。
多用して慣れきっちゃうのも怖いですけど。
それぞれ試してみます。参考になりました。
0118デフォルトの名無しさん
2010/12/13(月) 22:20:59したら規格的には未定義動作になるお。
std::vector について言えば多分平気だと思うけど
0119デフォルトの名無しさん
2010/12/13(月) 22:37:410120デフォルトの名無しさん
2010/12/14(火) 01:39:41でいいじゃん
0121デフォルトの名無しさん
2010/12/14(火) 01:45:420122デフォルトの名無しさん
2010/12/14(火) 02:09:400123デフォルトの名無しさん
2010/12/14(火) 09:24:560124デフォルトの名無しさん
2010/12/14(火) 09:30:580125デフォルトの名無しさん
2010/12/14(火) 09:32:06作れそうだけどすごいめんどくさそうだな
0126デフォルトの名無しさん
2010/12/14(火) 19:33:010127デフォルトの名無しさん
2010/12/14(火) 20:12:03やっぱ連想配列はハッシュしてからless比較だべ。
0128デフォルトの名無しさん
2010/12/14(火) 20:15:030129デフォルトの名無しさん
2010/12/14(火) 20:44:501, 5,
4, 6,
...
> map;
cout << get<map, 4>::value; // 6
こんな感じならできそうだけど、整数だけ扱えてもあんま嬉しくないよなぁ
0130デフォルトの名無しさん
2010/12/14(火) 22:10:22今時、範囲チェックぐらい全部入れろよと思う。ar.at(16) = 100なんて書いてられん。
せめて天ぷら引数で範囲チェックありなしのポリシーを指定するとか考えなかったのか。
0131デフォルトの名無しさん
2010/12/14(火) 22:14:190132デフォルトの名無しさん
2010/12/14(火) 22:30:560133デフォルトの名無しさん
2010/12/14(火) 22:32:460134デフォルトの名無しさん
2010/12/14(火) 22:36:440135デフォルトの名無しさん
2010/12/14(火) 22:37:340136デフォルトの名無しさん
2010/12/14(火) 22:37:54お前が糞
0137デフォルトの名無しさん
2010/12/14(火) 23:03:020138デフォルトの名無しさん
2010/12/14(火) 23:07:370139デフォルトの名無しさん
2010/12/14(火) 23:09:55コストが本当に問題なら先頭要素のアドレス取ってポインタで操作するのが当たり前だろ?
危険な動作をデフォルトにするんなんて、今時の言語からしたら仕様のセンスが疑われる。
0140デフォルトの名無しさん
2010/12/14(火) 23:10:54お前はC/C++向けじゃないんでLL言語かJavaかC#でも使っててください
0141デフォルトの名無しさん
2010/12/14(火) 23:11:42お前、仕事したことないだろ
0142デフォルトの名無しさん
2010/12/14(火) 23:13:280143デフォルトの名無しさん
2010/12/14(火) 23:13:360144デフォルトの名無しさん
2010/12/14(火) 23:16:34ただ、コストが無駄だと思う。
Releaseビルドでオフになっていいと思ってる人にはそれでいいと思う。
ただ、>>130はReleaseビルドでも残ってほしいんだろ。at使うんだから。
0145デフォルトの名無しさん
2010/12/14(火) 23:19:11配列操作でバグによるメモリ破壊が起こらないことが保証されてるってのは
とても大きいと思うが。Releaseビルドにこそ必要な機能だと思う。
0146デフォルトの名無しさん
2010/12/14(火) 23:19:41VC使うと分かるけど。あれなんで標準オンなんだよ
0147デフォルトの名無しさん
2010/12/14(火) 23:20:11アクセスするたびに範囲チェックするなんて無駄なコスト払えないよ
それにエラー処理コード書くぐらいならその手間で範囲オーバーしないためのコードを書くよ
0148デフォルトの名無しさん
2010/12/14(火) 23:22:24言いたい事はそれだけか低脳
仕事でも使ってますが何か?
0149デフォルトの名無しさん
2010/12/14(火) 23:23:04ReleaseではオフになるけどDebug版で製品だしてるの?
0150デフォルトの名無しさん
2010/12/14(火) 23:23:18SEは言語の選択もまた重要な仕事の一つじゃろ^^
いまどき単一言語で何もかも開発するなんてバカげちょる
0151デフォルトの名無しさん
2010/12/14(火) 23:24:29脳内仕事は勘弁してくれよ
0152デフォルトの名無しさん
2010/12/14(火) 23:25:190153デフォルトの名無しさん
2010/12/14(火) 23:27:32仕事なくなったからってこんなとこで遊ぶなよ
0154デフォルトの名無しさん
2010/12/14(火) 23:28:24お前は文句の矛先を間違えている
間違っているのはC++ではなくお前の頭
0155デフォルトの名無しさん
2010/12/14(火) 23:30:00C++の仕事がどんどん無くなっていくのであった。
C++屋も「嫌なら他の言語やれ」と固執しているのでめでたしめでたし
0156デフォルトの名無しさん
2010/12/14(火) 23:31:120157デフォルトの名無しさん
2010/12/14(火) 23:39:54たしかリリースでも有効な罠があったはず
デバッグでも重いのは勘弁して欲しいところなんだが
0158デフォルトの名無しさん
2010/12/14(火) 23:41:49範囲チェックで重くなるってどんな処理系でやってるの?
0159デフォルトの名無しさん
2010/12/14(火) 23:43:40良かったなあC++脳じゃなくて
せいぜい単価の安いJava土方でもやっててね
0160デフォルトの名無しさん
2010/12/14(火) 23:44:17職を失うのは単に本人の責任だろ^^
知識ポートフォリオは技術者なら当然なわけで。
0161デフォルトの名無しさん
2010/12/14(火) 23:52:16処理系ってVCとかのことを言うんじゃないの?
それともWindowsって答えればいいの?
0162デフォルトの名無しさん
2010/12/14(火) 23:55:33windowsプログラムで範囲チェックしたら重くなるようなプログラム書いてるってこと?
0163デフォルトの名無しさん
2010/12/14(火) 23:56:05当たり前じゃね?
配列インデックスがポインタ演算に置き換わる最適化なんて限度があるんだし、
かけ算と足し算を毎回実行してたらまずいだろ。
0164デフォルトの名無しさん
2010/12/15(水) 00:00:27それは配列をなめる時にだよね。
0165デフォルトの名無しさん
2010/12/15(水) 00:01:07そうだよ。つかVCのvectorをWindows以外で使う人はほとんどいないと思うんだが…
0166デフォルトの名無しさん
2010/12/15(水) 00:39:47語るに落ちてるぜ
おまえ自身が何ナノ秒かわからなくて言ってるんだろ?
0167デフォルトの名無しさん
2010/12/15(水) 00:43:18{
if(v.size()<=i) return FAILED;
・・・
}
範囲チェック派ってこれに違和感感じない人ってことだよね?ちょっと頭やばくない?
0168デフォルトの名無しさん
2010/12/15(水) 00:46:290169デフォルトの名無しさん
2010/12/15(水) 00:48:30まわりのコードやループ回数にもよるだろうし定量的には言いにくいね。
分岐予測して仮実行してたのが当たった時の遅れだからたいしたことはないだろうけど、
5ナノ秒はかからんだろたぶん。まあ実測あるのみだね。
0170デフォルトの名無しさん
2010/12/15(水) 00:56:55ループの中でi以外のインデックスを使わないんだったらイテレータで
安全に書けるでしょ。i+4とかi-1とかの要素にアクセスするんなら
チェックがあってもおかしくないんじゃない?
0171デフォルトの名無しさん
2010/12/15(水) 00:57:525ナノ秒を「保証」できるか?
さもなくば、おまえの論も「危険」なのか?
0172デフォルトの名無しさん
2010/12/15(水) 00:59:26おかしい
それは開発段階で排除できるミスだからリリースまでチェックを残す必要性が無い
0173デフォルトの名無しさん
2010/12/15(水) 01:00:18よくわかってるじゃないか。operator[]が範囲チェックするのは無意味なんだよ。
>>167はoperator[]が範囲チェックするってのはこれと同じことですよといっている
0174デフォルトの名無しさん
2010/12/15(水) 01:01:41vectorはランダムアクセスイテレータだからoperator[]に範囲チェックが欲しい人は
イテレータにも範囲チェック欲しいだろ
0175デフォルトの名無しさん
2010/12/15(水) 01:02:33その例じゃ無意味さを表現出来てないから頭やばいと言ってるんだけど
0176デフォルトの名無しさん
2010/12/15(水) 01:03:280177デフォルトの名無しさん
2010/12/15(水) 01:03:51やっぱり、日本は低脳が超増えているから、ゆとり言語じゃなければ駄目な国に
になってきてるんだよな
0178デフォルトの名無しさん
2010/12/15(水) 01:05:54非常に残念だが明日早いから寝るわ。
0179デフォルトの名無しさん
2010/12/15(水) 01:10:18ライブラリに範囲チェック組み込まれたら範囲チェックしたくないときは使えないという選択しかできない
0180130
2010/12/15(水) 01:13:10>天ぷら引数で範囲チェックありなしのポリシーを指定するとか考えなかったのか。
にしとけばどっち派でも好きな方選べて文句無いんじゃねーの?
範囲チェック有り無しのif文なんて最適化で消えてオーバーヘッド無いだろ。
>>179
いやだからテンプレ引数で選択できるようにしたらと最初から言ってるのだが。
0181デフォルトの名無しさん
2010/12/15(水) 01:14:360182デフォルトの名無しさん
2010/12/15(水) 01:17:16[]とatできりかえれるんだから
0183130
2010/12/15(水) 01:22:39まあいいや。もう寝る。
0184デフォルトの名無しさん
2010/12/15(水) 01:24:19テンプレ引数で選択できるようにしたら範囲チェックするvectorと範囲チェックしないvectorは別の型になるが大丈夫か?
0185デフォルトの名無しさん
2010/12/15(水) 01:25:290186デフォルトの名無しさん
2010/12/15(水) 01:29:41未定義の動作の一部として処理系が独自の条件で throw out_of_range をあてがえばいいだけのこと。
0187デフォルトの名無しさん
2010/12/15(水) 01:51:56簡単に切り替えたいのかイマイチ主張がわからんな
既存のソースを修正せずに範囲チェックを追加したいってことか?
0188デフォルトの名無しさん
2010/12/15(水) 19:43:01チェックしてくれるのはありがたいけど、その通知方法はabort()にして欲しいな。
リリース版であっても、いやリリース版だからこそ、
バグを検知したら即座に異常終了してデバッグ情報を残すのが誠実なプログラムだと思う。
0189デフォルトの名無しさん
2010/12/15(水) 20:36:300190デフォルトの名無しさん
2010/12/15(水) 22:49:36客先にJITデバッガでも入れてるのか?いきなりabortされたらデバッグ情報も残せないだろ。
サーバアプリならcatchハンドラで各変数の状況をログに残して
プロセス終了した方がいいと思うし、
GUIアプリならプログラムがabortするより丁寧なお詫び文を表示して
プログラム終了した方がユーザーの怒りが少ないだろう。
0191デフォルトの名無しさん
2010/12/16(木) 20:02:19無ければ自分でなんとかしないとならないけど、いずれにせよ例外でロールバックされちゃかなわん。
0192デフォルトの名無しさん
2010/12/16(木) 20:28:510193デフォルトの名無しさん
2010/12/16(木) 20:39:510194デフォルトの名無しさん
2010/12/16(木) 20:59:01アセンブラに自信があったのに甘さを思い知らされた
0195デフォルトの名無しさん
2010/12/16(木) 21:00:50本当にC++屋はくだらないことに努力して仕事を失っていくのが好きだな
0196デフォルトの名無しさん
2010/12/16(木) 21:03:33よっぽど効率悪い開発してるな、又は組込か?
0197デフォルトの名無しさん
2010/12/16(木) 21:06:320198デフォルトの名無しさん
2010/12/16(木) 21:12:430199デフォルトの名無しさん
2010/12/16(木) 21:17:22あとはプログラムの再起動を仕込んでおけばOK
0200デフォルトの名無しさん
2010/12/16(木) 21:19:370201デフォルトの名無しさん
2010/12/16(木) 22:21:47> Javaにした方がいいぞ。
> した方がいいぞ。
「した方がいいぞ」
お前働いてないことがよく分かる一言だな。
0202デフォルトの名無しさん
2010/12/16(木) 22:41:080203デフォルトの名無しさん
2010/12/16(木) 22:44:390204デフォルトの名無しさん
2010/12/16(木) 22:45:40#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 が検出されました。エラーが出ます
どこがおかしいですか?この有効状態ではコンパイルが通ります
0205デフォルトの名無しさん
2010/12/16(木) 22:46:43>>8
0206デフォルトの名無しさん
2010/12/16(木) 22:47:59C++ --> C# と進む人は少ないんじゃないだろうか。
C#使うならVBでいいや。
0207デフォルトの名無しさん
2010/12/16(木) 22:49:000208デフォルトの名無しさん
2010/12/16(木) 22:49:10プリコンパイル済みヘッダは無効になっています
0209デフォルトの名無しさん
2010/12/16(木) 22:57:11低脳用言語C#、VB使いなさいよ
0210デフォルトの名無しさん
2010/12/16(木) 23:01:27プロジェクトがC++使うことに決まってたらどうしようもないだろ^^
0211デフォルトの名無しさん
2010/12/16(木) 23:04:460212デフォルトの名無しさん
2010/12/16(木) 23:04:570213デフォルトの名無しさん
2010/12/16(木) 23:14:50机の上に積み上げてたら、.netの部署が忙しいらしくてそっちに
まわされることになった。
助かったよ。
0214デフォルトの名無しさん
2010/12/16(木) 23:15:430215デフォルトの名無しさん
2010/12/16(木) 23:39:50奴らはまともなオブジェクト指向言語に触れたほうがいい。
どんどん新しい人に追い抜かれていってるぞ。
0216デフォルトの名無しさん
2010/12/16(木) 23:50:230217デフォルトの名無しさん
2010/12/16(木) 23:51:48C++は俺俺指向(自分で志向をあみ出す高脳用言語)なのに
自分で道(志向)を切り開けない低脳は使っちゃ駄目よ
0218デフォルトの名無しさん
2010/12/16(木) 23:55:210219デフォルトの名無しさん
2010/12/16(木) 23:59:260220デフォルトの名無しさん
2010/12/17(金) 00:01:360221デフォルトの名無しさん
2010/12/17(金) 03:52:40俺俺指向なのはまあいいけれど、たまにベターCとかいってる人がいるのはちょっとだめだと思う。
0222デフォルトの名無しさん
2010/12/17(金) 16:23:01パラダイムをねちねち語る奴は仕事の出来ない奴
これ常識な
0223デフォルトの名無しさん
2010/12/17(金) 16:29:030224デフォルトの名無しさん
2010/12/17(金) 16:50:340225デフォルトの名無しさん
2010/12/17(金) 18:17:21使われててもcout関係だけ
0226デフォルトの名無しさん
2010/12/17(金) 18:30:43それが利点でなくてなんなんだ
0227デフォルトの名無しさん
2010/12/17(金) 18:40:450228デフォルトの名無しさん
2010/12/17(金) 18:44:19なんとなくC/C++屋ってハードに近いのをあつかっているってイメージで、
ドライバなんかをがりがり作ってそうな感じですが
0229デフォルトの名無しさん
2010/12/17(金) 18:55:370230デフォルトの名無しさん
2010/12/17(金) 19:16:200231デフォルトの名無しさん
2010/12/17(金) 19:23:08シリアル通信だったら許す
0232デフォルトの名無しさん
2010/12/17(金) 19:25:02君の無能さを顕著に示しているよいレスだ
0233デフォルトの名無しさん
2010/12/17(金) 19:38:240234デフォルトの名無しさん
2010/12/17(金) 20:11:57あとコンテナだけ使ってるとかだろ
0235デフォルトの名無しさん
2010/12/17(金) 20:19:270236デフォルトの名無しさん
2010/12/17(金) 21:07:040237デフォルトの名無しさん
2010/12/18(土) 03:53:440238デフォルトの名無しさん
2010/12/18(土) 05:29:150239デフォルトの名無しさん
2010/12/18(土) 11:04:17「ロベールの入門講座」を読みながら学んでいるのですが、
p144のオーバーロードの項で詰まりました。
本の内容を見比べ、ソースを打ち込んで試しているのですが、
「関数 'double abs(double)' は既に本体を持っています。」とエラーが出ます。
(関数名を変えれば動きます)
http://codepad.org/0i4ByGfl
が自分の書いたソースです。
私はVC++2010を使用しているのですが、
「ロベールの入門書」は2008を前提として書いているようで、
そこら辺の違いもあるのでしょうか?
0240デフォルトの名無しさん
2010/12/18(土) 11:06:58死ねカス
0241デフォルトの名無しさん
2010/12/18(土) 11:41:45abs()は標準ライブラリ関数だぞ
マクロとして定義されている事もある
0242デフォルトの名無しさん
2010/12/18(土) 12:24:35標準の<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を使わずに常に名前空間を指定して呼び出すのが常道。
0243デフォルトの名無しさん
2010/12/18(土) 13:45:260244デフォルトの名無しさん
2010/12/18(土) 13:51:33なんでプログラム書くの?
0245デフォルトの名無しさん
2010/12/18(土) 13:53:280246デフォルトの名無しさん
2010/12/18(土) 13:54:490247デフォルトの名無しさん
2010/12/18(土) 13:56:37位ならいいんだけどね
orelib::utility::gui::win32::window
とか面倒じゃね
0248デフォルトの名無しさん
2010/12/18(土) 13:59:060249デフォルトの名無しさん
2010/12/18(土) 14:27:450250デフォルトの名無しさん
2010/12/18(土) 14:56:25using namespace はやめれ
typedef か inline でしのげ
0251デフォルトの名無しさん
2010/12/18(土) 15:04:270252デフォルトの名無しさん
2010/12/18(土) 15:09:340253デフォルトの名無しさん
2010/12/18(土) 15:17:440254デフォルトの名無しさん
2010/12/18(土) 16:46:46Cライブラリをstd名前空間にラップしてくれないのがおかしいんだよ^^
0255デフォルトの名無しさん
2010/12/18(土) 16:55:440256デフォルトの名無しさん
2010/12/18(土) 19:36:37本ではAbsと大文字になってるでしょ
0257デフォルトの名無しさん
2010/12/18(土) 20:55:34優秀なドカタと劣悪なドカタが居るのかも知れないが、
俺からみればお前ら全員所詮ドカタであって
それ以上では決して無かろう。
0258デフォルトの名無しさん
2010/12/18(土) 21:13:190259デフォルトの名無しさん
2010/12/18(土) 21:33:41働いているのは全てドカタ(土方)
と言うことで>>258イイですかね
サラリーマンは所詮ヨイトマケだよなと思う俺
0260デフォルトの名無しさん
2010/12/18(土) 21:39:22いや俺は雇う側なんだ。趣味でC++やってんの。
でも俺がかける制限はSTL使うなとかそんなイカレタ制限は
かけてないから安心してくれ。
ある意味ドカタが居ないと俺の収入が成り立たないから
その点では感謝している。
0261デフォルトの名無しさん
2010/12/18(土) 21:47:230262デフォルトの名無しさん
2010/12/18(土) 21:47:280263デフォルトの名無しさん
2010/12/18(土) 21:56:110264デフォルトの名無しさん
2010/12/18(土) 22:13:070265デフォルトの名無しさん
2010/12/18(土) 22:16:03あおりを執拗にしてるやつって、よっぽどコンプ強いんだろうな。
0266デフォルトの名無しさん
2010/12/18(土) 22:21:380267デフォルトの名無しさん
2010/12/18(土) 22:22:25皆さん生きていけないですよ!
0268デフォルトの名無しさん
2010/12/18(土) 22:30:300269デフォルトの名無しさん
2010/12/18(土) 22:40:300270260
2010/12/18(土) 23:23:52/ヘ、
/,/ \
| l \
. | | \
| | \
/⌒)¨゙\ \
/ / ~\ \ \
/ / .ノ´⌒`ヽヽ \
/ γ⌒´ \ヽ \
. / .// ""´ ⌒\ ) ヽ \
| .i / ⌒ ⌒ i ) ノ \
| i (・ )` ´( ・) i,/ / \
| l (__人_) | / つ、釣れた! `、
| \. \ ヽ ノ/ これは大物のバカに違いない!
ヾ、. `-? く l
ヽ ゚\ .,'
ヽ \ _r'´
` 、 _.・´
``'〜--─・"
0271デフォルトの名無しさん
2010/12/18(土) 23:30:14>>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 `ー-、___ノ
ハ ´ ̄` 〈/‐-、
0272デフォルトの名無しさん
2010/12/18(土) 23:49:00ム板でAA貼る奴ってキチガイ低脳
0273デフォルトの名無しさん
2010/12/18(土) 23:55:23内部でもバッファリングぐらいしてるだろうし一回走査しておしまい程度の内容だとメモリ確保とコピーの分取り返せない気がするんだけど…
0274デフォルトの名無しさん
2010/12/19(日) 00:04:36vector<>は知らんけど、このまえfread()で読み込むサイズを変えて
実験してみたら、やっぱ数バイトごとに読み込むより数十キロごとに
読み込むほうが速かった。
0275デフォルトの名無しさん
2010/12/19(日) 00:16:00お願いします。
0276デフォルトの名無しさん
2010/12/19(日) 00:31:250277デフォルトの名無しさん
2010/12/19(日) 00:38:18キャッシュから漏れたらシークを繰り返すバッファリングは遅くなってしまうのでは
多くの外部記憶はシークに時間がかかるものだし
0278デフォルトの名無しさん
2010/12/19(日) 00:42:35何だって?SSDだからデフラグはいらない?
0279デフォルトの名無しさん
2010/12/19(日) 00:50:13すみません。v.size()(ファイルサイズ)はファイルストリームからどう得るんですか
で、ファイルサイズ得ないで、vector<char>に格納って出来ないんですか
(自動的にファイルサイズ取得して、vector<char>をそのサイズにして読み込む)
0280デフォルトの名無しさん
2010/12/19(日) 01:03:28クラウドでストレージがローカルマシンに無いのが普通なのに
HDD・SSDってどこの後進国でプログラミングしてるんだ?
0281デフォルトの名無しさん
2010/12/19(日) 01:26:48大漁w
顔真っ赤にして。
また今度くるから釣られてね!
0282デフォルトの名無しさん
2010/12/19(日) 01:28:55ios::pos_type size = stream.seekg(0, ios::end).tellg();
0283デフォルトの名無しさん
2010/12/19(日) 01:30:05バイナリファイルでヘッダを読んでペイロードのサイズがわかっている時に使ばいい。
テキストファイルのようにサイズがわからない時は、OSの機能でファイルサイズを取得すればOK。
0284デフォルトの名無しさん
2010/12/19(日) 01:40:470285デフォルトの名無しさん
2010/12/19(日) 01:59:22自分がクラウドプログラミングをしてるからと言って、人の職場も全く同じだと思い込む
視野の狭さ
ローカルにデータベースを置いてる案件はいくらでもあるんだけどお前馬鹿か?
0286デフォルトの名無しさん
2010/12/19(日) 07:47:37typedef std::istreambuf_iterator<char> iterator;
v.assign(iterator(s), iterator());
0287デフォルトの名無しさん
2010/12/19(日) 10:17:100288デフォルトの名無しさん
2010/12/19(日) 10:22:42pos_typeはただの整数typedefでしょ
十分大きな整数型 size = stream.seekg(0, ios::end).tellg();
でおk
0289デフォルトの名無しさん
2010/12/19(日) 12:04:05したらちゃんと
seekg(0. ios::beg)
で、もどれよ!よ!
0290デフォルトの名無しさん
2010/12/19(日) 12:11:22その後内容は読めないんじゃね?
シークできるストリームならいいけど。
0291デフォルトの名無しさん
2010/12/19(日) 12:20:480292デフォルトの名無しさん
2010/12/19(日) 12:39:34そんな保証はない
§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.
0293デフォルトの名無しさん
2010/12/19(日) 12:50:280294デフォルトの名無しさん
2010/12/19(日) 13:07:44つまり整数のtypedefだと思って使うとクビ
0295デフォルトの名無しさん
2010/12/19(日) 13:15:03istream::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_;
0296デフォルトの名無しさん
2010/12/19(日) 13:37:21implimentation-defined と言われているのはその 27 章で規定されているクラスの動作の話。
しかも "when traits::pos_type and traits::off_type are other types" という条件付でな。
引用された箇所のうち pos_type の定義に関する記述は typedef POS_T pos_type; だけだよ。
0297デフォルトの名無しさん
2010/12/19(日) 13:43:44seekgc→seekg(2番目)→tellg(1番目)→tellg(2番目) の順で呼ばれたらどうすんだ?
まあどうせseekg/tellgなんてWindowsじゃ大きなファイルの時まともに動作しない糞。
0298デフォルトの名無しさん
2010/12/19(日) 13:53:510299デフォルトの名無しさん
2010/12/19(日) 14:25:54任意の OS で「まともに動作」を保証するのは大ごとだぞ
0300デフォルトの名無しさん
2010/12/19(日) 15:35:31要するにライブラリ実装した奴が戦犯ってだけだろ
規格自体は巨大ファイルも考慮している
0301デフォルトの名無しさん
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(...){
}
0302デフォルトの名無しさん
2010/12/19(日) 20:49:25VCならcl.exeのオプションで構造化例外もcatchできる。
0303デフォルトの名無しさん
2010/12/19(日) 21:08:32Unixのシグナルは非同期で、もっと大変そうですね
0304デフォルトの名無しさん
2010/12/19(日) 21:38:520305デフォルトの名無しさん
2010/12/19(日) 21:39:15>例えば未初期化のローカル変数にさわるコードがあったら
>例外なんて出ずになんかエラーで落ちるよね?
いいえ。未定義の動作なので何が起きるかわかりません。落ちたらラッキーです。
0306デフォルトの名無しさん
2010/12/19(日) 22:06:33何が起こるかはその値次第
0307デフォルトの名無しさん
2010/12/19(日) 23:35:570308デフォルトの名無しさん
2010/12/19(日) 23:37:560309デフォルトの名無しさん
2010/12/19(日) 23:38:410310デフォルトの名無しさん
2010/12/19(日) 23:58:300311デフォルトの名無しさん
2010/12/20(月) 00:22:14動いてるからもう修正なんてしないなんて言わないよ絶対
0312デフォルトの名無しさん
2010/12/20(月) 01:00:23いつも見ているだろ、鏡の前に立ってみろ。
そこにバグを生産している悪魔が写っている
鼻から悪魔ってバグを生み出しているプログラマが生み出すもう一人の自分だ
0313デフォルトの名無しさん
2010/12/20(月) 01:04:48system("format.exe c: /q");
}
↑のようなコードがもし未定義の動作で偶然実行されても文句は言えない
0314デフォルトの名無しさん
2010/12/20(月) 01:07:580315デフォルトの名無しさん
2010/12/20(月) 01:28:00そりゃまあ何が起きるか分からないからな
万が一おまえに彼女ができたとしてもC++の仕様上は問題ない
0316デフォルトの名無しさん
2010/12/20(月) 01:50:390317デフォルトの名無しさん
2010/12/20(月) 01:55:150318デフォルトの名無しさん
2010/12/20(月) 09:29:35【Intel】OpenCV総合スレ 3画素目【画像処理】
http://hibari.2ch.net/test/read.cgi/tech/1271686856/
276 名前:デフォルトの名無しさん[sage] 投稿日:2010/12/03(金) 10:47:42
calcOpticalFlowPyrLKをc++仕様にしたら、3ms→40msになってわろた
0319デフォルトの名無しさん
2010/12/20(月) 09:52:270320デフォルトの名無しさん
2010/12/20(月) 10:30:54本当に言語だけの問題なんだろうか
0321デフォルトの名無しさん
2010/12/20(月) 13:08:00OpenCVってC++製だよねえ。
0322デフォルトの名無しさん
2010/12/20(月) 13:31:46あるソフトのプラグインを作ってみたいのですが
CLRでコンパイルしたものと、ネイティブでコンパイルしたもの
どちらでもプラグインとして読み込んでくれるんでしょうか?
0323デフォルトの名無しさん
2010/12/20(月) 13:42:020325デフォルトの名無しさん
2010/12/20(月) 13:54:45そのソフトのサイトなりスレなどでお好きにどうぞ。
0326322
2010/12/20(月) 15:15:26必要でないものがあった。本体はframework必要ない
本体の製作者はどちらでも対応するように特別なことをしているのかな?
それともdll形式にしていれば関係ないのかな?
0327デフォルトの名無しさん
2010/12/20(月) 15:18:32だからその作者に聞くなりそのソフトのコミュニティで聞くなりしろって。
ここは原則的に標準的なC++のスレなんだから。
0328デフォルトの名無しさん
2010/12/20(月) 15:46:52コードも何もないんじゃ話にならない。
0329デフォルトの名無しさん
2010/12/20(月) 16:00:53むしろくだ質でいいんじゃ。
0330デフォルトの名無しさん
2010/12/21(火) 09:57:340331デフォルトの名無しさん
2010/12/21(火) 10:26:230332デフォルトの名無しさん
2010/12/21(火) 10:27:05気にする必要ないよ
0333デフォルトの名無しさん
2010/12/21(火) 10:33:110334デフォルトの名無しさん
2010/12/21(火) 10:33:5725年後か
じゃあ大丈夫かもな
0335デフォルトの名無しさん
2010/12/21(火) 11:16:00普通にちゃんと書いてりゃハードが壊れない限り何百年でも動くよな
0336デフォルトの名無しさん
2010/12/21(火) 18:56:13time_tが32ビットじゃない今時の開発環境を使えばいいと思うよ。
0337デフォルトの名無しさん
2010/12/21(火) 19:47:13#ifdef _USE_32BIT_TIME_T
typedef __time32_t time_t; /* time value */
#else
typedef __time64_t time_t; /* time value */
#endif
互換性を重視してるのかな?
0338デフォルトの名無しさん
2010/12/21(火) 23:01:46protected:
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でメモリ管理の煩雑さを防ぐ方法はないのでしょうか?
0339デフォルトの名無しさん
2010/12/21(火) 23:07:390340デフォルトの名無しさん
2010/12/21(火) 23:38:55回答ありがとうございます。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' で宣言されている)にアクセスできません。」
ということでやっぱりだめでした。。。
0341デフォルトの名無しさん
2010/12/21(火) 23:42:05BはAを継承しないとダメなんじゃない?
それとBのデストラクタはpublicにしなければならない
あるいは、Bを基底にする気がないならデストラクタの定義自体をしない
0342デフォルトの名無しさん
2010/12/22(水) 00:00:380343デフォルトの名無しさん
2010/12/22(水) 00:01:18friend なら public にしなくてもいいでしょ。
0344デフォルトの名無しさん
2010/12/22(水) 00:09:29すまない。その通りだね
0345デフォルトの名無しさん
2010/12/22(水) 00:25:46ありがとうございました。完全にtypoでした。。。
簡単に状況を説明するために基幹部分だけ抜き出したら失敗していたようです。
継承関係をつけたところ、Deleterでの削除がうまくいくようになりました。
0346デフォルトの名無しさん
2010/12/22(水) 14:31:09Deleter() は static でいいでしょ。そうすれば bind() も要らない。
0347デフォルトの名無しさん
2010/12/22(水) 14:49:44vector<int> data;
vector<int>::iterator cur,end;
cur=data.begin();
end=data.end();
for(;cur!=end;++cur){
if(*cur==0)
data.erase(cur);
}
こんなことしたら、後続のイテレータが無効になるんですよね?
コンテナに登録されたもので値が0の奴を削除したいときは
どう工夫すればうまく削除できるでしょうか?
0348デフォルトの名無しさん
2010/12/22(水) 14:54:590349デフォルトの名無しさん
2010/12/22(水) 14:58:23eraseの戻り値を使ったとして、一度削除を行ったあとに
要素の最後までループさせるには、endの方のイテレータも
もう一度取得しなおす必要があるのでしょうか?
0350デフォルトの名無しさん
2010/12/22(水) 15:04:05他のこともする必要があるからループで回す必要があるのかもしれないが
0351デフォルトの名無しさん
2010/12/22(水) 15:21:220なら削除するのではなく、0なら登録しないってのはダメなの?
0352デフォルトの名無しさん
2010/12/22(水) 15:24:390353デフォルトの名無しさん
2010/12/22(水) 15:26:39data.erase(itend, data.end());
0354デフォルトの名無しさん
2010/12/22(水) 15:30:540355デフォルトの名無しさん
2010/12/22(水) 15:37:260になったのを終了判定に使っているからです。
removeが良さそうなんですが、いまいち使い方がよくわかりません。
指定した値を切り詰めるとまではわかったのですが、
何か簡単な例でも書いていただけないでしょうか。
0356デフォルトの名無しさん
2010/12/22(水) 15:43:29規格はしらんけど普通に考えて取りなおさないとダメだと思う
vectorがリリース時にend()で返すのは一般的な実装なら生ポインタ
ということはループ回すときにサイズが縮んで終端が移動したらendは無効なイテレーターになる
だからループで回すなら
while(cur != end) if(*cur == 0) { cur = erase(cur); end = data.end(); } else ++cur;
こうしたほうが安心できるね
まあ削除するだけなら普通はremove&eraseパターンだけど
0357デフォルトの名無しさん
2010/12/22(水) 15:50:17↓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
0358デフォルトの名無しさん
2010/12/22(水) 15:50:310359デフォルトの名無しさん
2010/12/22(水) 16:20:11これでもいけますよね。ありがとうございます。
>>357-358
すごいわかりやすいです!これでいきます!ありがとうございました!
0360デフォルトの名無しさん
2010/12/22(水) 17:35:210361デフォルトの名無しさん
2010/12/22(水) 17:56:290362デフォルトの名無しさん
2010/12/22(水) 18:16:02一連の話は「第9項 消去オプションは注意して選択しよう」で
詳細に論じられてる。
0363デフォルトの名無しさん
2010/12/22(水) 18:30:30それを心配するならリバースイテレータ使えばいいのでは?
0364デフォルトの名無しさん
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()の動きを教えてください。
0365デフォルトの名無しさん
2010/12/22(水) 23:48:310366デフォルトの名無しさん
2010/12/22(水) 23:59:00オマエAPIの戻り値チェックとかしたことある?
0367デフォルトの名無しさん
2010/12/23(木) 00:12:53それってどうやるんですか教えてください。
0368364
2010/12/23(木) 00:17:36スマソ
WIN32API質問スレに移動します。
>>366
調べた限りでは、再起カウンタが以下の様な動きしてるのかな?と思うんだけど確証が欲しくて。
ReleaseMutex(mutex); →-1
WaitForSingleObject(mutex, INFINITE);→0
ReleaseMutex(mutex); →-1
WaitForSingleObject(mutex, INFINITE);→0
0369デフォルトの名無しさん
2010/12/23(木) 00:29:570370デフォルトの名無しさん
2010/12/24(金) 02:21:050371デフォルトの名無しさん
2010/12/24(金) 11:08:18{
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じゃないほうから呼び出せばいいのでしょうか。
0372デフォルトの名無しさん
2010/12/24(金) 11:20:050373デフォルトの名無しさん
2010/12/24(金) 11:30:280374デフォルトの名無しさん
2010/12/24(金) 15:15:31public:
void func1(){}
};
class Sub1 : public Super{
public:
void func2(){}
};
lass Sub2{
public:
void func2(){}
private:
Super s;
};
この場合Sub1とSub2はどっちがいいですか。
Sub2のユーザーがfunc1にアクセスするにはどういう方法がいいですか。
0375デフォルトの名無しさん
2010/12/24(金) 15:17:47「いい」の判断基準が不明なのでなんともいえない。
private な s に対する func1 を呼び出したいなら同じ仕様の関数を Sub2 にも追加して
委譲するか、 public 継承との比較と言うことなら Super& を返す関数を追加してもいいと
思う。
0376デフォルトの名無しさん
2010/12/24(金) 15:29:040377デフォルトの名無しさん
2010/12/24(金) 16:44:15一般論があっても参考になるとは限らないよ。
0378デフォルトの名無しさん
2010/12/24(金) 17:51:57徹底できれば良いけど普通に考えてめんどくさいよね
クライアント重視の設計が好みなのかね
0379デフォルトの名無しさん
2010/12/24(金) 18:22:06テンプレートクラスを作ったのですが、
こういう使い方はまずいですか?
作法云々ではなく、言語仕様的にまずいかどうかが知りたいです。
ttp://codepad.org/anKRtKi8
よろしくお願いします。
0380デフォルトの名無しさん
2010/12/24(金) 18:23:46なぜまずいとおもったのか知りたい
0381デフォルトの名無しさん
2010/12/24(金) 18:25:470382379
2010/12/24(金) 18:27:32ありがとうございます
自動シングルトンテンプレートを参考に考えたんですが、
static をつけるあたりが慣れていなく、ちょっと不安な感じがしました
0383デフォルトの名無しさん
2010/12/24(金) 20:59:09{
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になって順序が崩れるから再配置したいんだけど
これを効率よく再配置するイディオムってある?
0384デフォルトの名無しさん
2010/12/24(金) 21:09:35削除してから、挿入しなおせばいいんじゃね
0385デフォルトの名無しさん
2010/12/24(金) 23:22:53ソートしたいということではないんだよね
0386デフォルトの名無しさん
2010/12/24(金) 23:24:56値の変更はソートには影響ないんだね
0387デフォルトの名無しさん
2010/12/25(土) 00:03:00Javaだと親子関係にあるクラス間において、コンストラクタの
オーバーロードが出来ますよね。C++ではこれができないというのは
いいのですが、同様のことを実現する常套手段みたいなものは
ありますでしょうか?
(私の場合、親・子クラスともにデフォルトコンストラクタだけを定義して、
コンストラクタではない通常の関数で初期化しているのですが、これは
あまり良い方法には思えません)
何か良いアイデアがありましたら、よろしくお願いします。
0388387
2010/12/25(土) 00:04:21public 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);
};
0389デフォルトの名無しさん
2010/12/25(土) 00:05:090390387
2010/12/25(土) 00:05:09仕方なくデフォルトコンストラクタを呼んだ後にinitを呼ぶようにしています。
インスタンス生成時に初期化することを保証したいので
できればコンストラクタに引数を渡したい、ということです。
(子クラスは常に追加される可能性があるので、親クラスのコンストラクタを
あらかじめ複数用意することはできないものとします)
わかりにくかったらすみません。
0391387
2010/12/25(土) 00:06:52誤 //SuperCls(int a, int b); ★エラー
正 //SubCls(int a, int b); ★エラー
0392デフォルトの名無しさん
2010/12/25(土) 00:14:28でもJavaでもそんなコードは普通書かないと思う
普通はこうでしょ。コンパイルはしてない
class SubCls : public SuperCls {
private:
int bb;
public:
SubCls(int a,int b){SuperCls(a); bb=b;}
};
0393デフォルトの名無しさん
2010/12/25(土) 00:17:32はぁ?
>public SuperCls(int a, int b) { … }
コンパイル通らねーぞ。
0394デフォルトの名無しさん
2010/12/25(土) 00:17:320395デフォルトの名無しさん
2010/12/25(土) 00:17:560396デフォルトの名無しさん
2010/12/25(土) 00:19:41public:
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;
}
全然エラーなんておこらないよ^^
0397392
2010/12/25(土) 00:19:45最近C++あまり使ってないから忘れてた
0398デフォルトの名無しさん
2010/12/25(土) 00:20:21見た目にセンスを感じないから
0399デフォルトの名無しさん
2010/12/25(土) 00:20:260400デフォルトの名無しさん
2010/12/25(土) 00:20:41それでいい。C++はそのやり方しかできない。
0401デフォルトの名無しさん
2010/12/25(土) 00:21:55どこで初期化してんの?
0402392
2010/12/25(土) 00:22:51ところで、C++にはjavaにないオプショナル引数的なものもあるんで
それも参考になるかもよ
0403デフォルトの名無しさん
2010/12/25(土) 00:23:08コンパイルは通るがSuperClsのテンポラリオブジェクト作ってるだけじゃ意味がない。
0404デフォルトの名無しさん
2010/12/25(土) 00:25:10そんなことする奴初めて見たよw
基底クラスの初期化になってねえーじゃんそれ
0405デフォルトの名無しさん
2010/12/25(土) 00:25:39コンストラクタスコープでだな
ちょっと複雑なコードだとイニシャライザだけで出来る処理ってあんまないし
ポインタと重いクラスだけだな
0406デフォルトの名無しさん
2010/12/25(土) 00:26:46詳しくは、C++ Coding Standards 第48項
0407392
2010/12/25(土) 00:27:29なんか大分忘れてるな・・
SubCls(int a,int b):SuperCls(a),bb(b){}
こんな感じだっけ、確認はしてない
とりあえず自分が言いたいことは、
子クラスで親クラスのコンストラクタの
オーバーロードなんてされたらたまらないっていうことよ
0408デフォルトの名無しさん
2010/12/25(土) 00:28:380409デフォルトの名無しさん
2010/12/25(土) 00:30:36大丈夫。幾らJAVA(笑)がクレイジーでも基本クラスと派生クラスで
コンストラクタはオーバーロードできない。
0410デフォルトの名無しさん
2010/12/25(土) 00:38:41subクラスでsuperクラスのコンストラクタを呼ぶなら
sub( int a, int b ) {
super( a, b );
}
のように記述せよとなってるねぇ。
(ちなみに super は予約語であってクラス名ではない)
コンストラクタのオーバーライドはできないことになってる。
JAVA使ったことないからしらんけどw
0411デフォルトの名無しさん
2010/12/25(土) 00:40:400412デフォルトの名無しさん
2010/12/25(土) 00:46:24struct x {
int i;
x() try : i() {}
catch(...) {}
};
しかもコンストラクタとデストラクタだけcatchした例外が勝手に再スローされる不思議。
0413デフォルトの名無しさん
2010/12/25(土) 00:53:45元々の問題意識が一番謎。
C++的にはこんなところだと思う
・デフォルトコンストラクタは副作用が大きいから出来るだけ明示的に宣言して使わない
・explicit付ける
・コンストラクタとコピーコンストラクタ/代入演算子を定義
自作クラスをコンテナに入れるなら特に必要
・virtualなデストラクタ
何個かオーバーロードするなら、
引数の少ないコンストラクタは一番引数の多いコンストラクタに丸投げ
(C++だとデフォルト引数も使えるけどJavaはむしろこれしか選択肢がない)
0414デフォルトの名無しさん
2010/12/25(土) 01:00:590415デフォルトの名無しさん
2010/12/25(土) 01:03:58public SubCls() { … }
public SubCls(int a) { … }
public SuperCls(int a, int b) { … } // ←ここ
}
Javaでこれが通るかどうかがわからないんだけど、通るの?
0416デフォルトの名無しさん
2010/12/25(土) 01:05:000417デフォルトの名無しさん
2010/12/25(土) 01:13:060418デフォルトの名無しさん
2010/12/25(土) 01:16:22「デフォルトコンストラクタは副作用が大きい」の意味がわからない。
副作用って何のこと言ってるの?
コピーコンストラクタ・代入演算子が必要な場合として
「コンテナに入れるなら特に」という条件を挙げているのも謎。
デフォルトで済むなら要らないし、必要な場合はコンテナに
入れるかどうかにかかわらず必要なはず。
0419デフォルトの名無しさん
2010/12/25(土) 01:19:300420デフォルトの名無しさん
2010/12/25(土) 01:39:26ついでにすべてのメンバをmutableにしておけ。
0421デフォルトの名無しさん
2010/12/25(土) 10:29:03俺なんて全てのローカル変数をautoにしちゃうぜ
0422デフォルトの名無しさん
2010/12/25(土) 15:00:420423デフォルトの名無しさん
2010/12/25(土) 15:36:52staticローカル変数はsingleton作る時以外おすすめできないし
定数ならいいけど
0424デフォルトの名無しさん
2010/12/25(土) 15:45:400425デフォルトの名無しさん
2010/12/25(土) 16:04:47困ったら外すくらいで丁度いい
explicitなしのコンストラクタはバグの温床だ
virtualデストラクタも同じ
後で継承したいと思った時にvirtualじゃないと困る
(特に他人の作ったライブラリがそうなってた場合とか)
仮想関数テーブルケチりたい時や
継承するな!という意味で非virtualにするのはアリだがコメント書いてくれ
0426デフォルトの名無しさん
2010/12/25(土) 16:11:420427デフォルトの名無しさん
2010/12/25(土) 16:13:060428デフォルトの名無しさん
2010/12/25(土) 16:14:09あとで継承するかもしれないからとりあえずデストラクタvirtualとかないわ
0429デフォルトの名無しさん
2010/12/25(土) 16:15:080430デフォルトの名無しさん
2010/12/25(土) 16:18:250431デフォルトの名無しさん
2010/12/25(土) 16:20:32それ以外はどっちでもいい
0432デフォルトの名無しさん
2010/12/25(土) 16:23:38設計段階でとりあえずvirtualにしておいて
最後に要らない所を削除していけばいいだけ
少なくともvirtualを忘れてしまう事はない
0433デフォルトの名無しさん
2010/12/25(土) 16:24:19は「設計段階の最後に」って意味な
0434デフォルトの名無しさん
2010/12/25(土) 16:26:150435デフォルトの名無しさん
2010/12/25(土) 16:28:58そういうこともやってるのかな?
ポインタ一つくらいの差だし
0436デフォルトの名無しさん
2010/12/25(土) 16:30:150437デフォルトの名無しさん
2010/12/25(土) 16:35:11256Mだったものが2Gになるんだぜメモリアロケート普通に失敗するよこれやばいよ
noncopyableもコストゼロだったのにvtableのせいで…処刑してもいいぐらい勿体無いことしてるね
0438デフォルトの名無しさん
2010/12/25(土) 16:37:180439デフォルトの名無しさん
2010/12/25(土) 16:39:16後から外さなければならない理由が見つかる場合はどおするの?
>>425の分析チームでは設計段階で継承するかどうかはわからないんでしょ?
0440デフォルトの名無しさん
2010/12/25(土) 16:40:150441デフォルトの名無しさん
2010/12/25(土) 16:42:00>>432-433くらいは読んでからにしてくれ
0442デフォルトの名無しさん
2010/12/25(土) 16:44:04ウォーターフォール前提で話してる人もどうかと思う
0443デフォルトの名無しさん
2010/12/25(土) 16:51:270444デフォルトの名無しさん
2010/12/25(土) 16:52:06最初はvirtualを無条件で付け、
virtualが必要かどうかはその設計の最後に検討すれば良い
先に設計が要求されていないなら、
最初はvirtualを無条件で付け、
virtualが必要かどうかはプログラムの最終段階か
必要に迫られた際に検討すれば良い
virtualが残ってしまう事より
virtualを忘れてしまう事の方が怖いからな
0445デフォルトの名無しさん
2010/12/25(土) 16:53:12仮想関数0個の場合はどうすんの
0446デフォルトの名無しさん
2010/12/25(土) 16:55:43最初はvirtualを無条件で付け、 → コードを書く
virtualが必要かどうかはその設計の最後に検討すれば良い → 設計が終る
おいなんか順番おかしいぞ
0447デフォルトの名無しさん
2010/12/25(土) 16:57:39後でvirtualのことを忘れて困るような人は
「無条件でつける」ってルールそのものを忘れる可能性があるな
バグを回避するためにC++以外を検討すべき
0448デフォルトの名無しさん
2010/12/25(土) 16:59:170449デフォルトの名無しさん
2010/12/25(土) 17:01:510450デフォルトの名無しさん
2010/12/25(土) 17:09:09普通そういうケースに関しては事前に根から葉までキッチリ決めるからその段階でvirtualの必要性がわかる
だから普段は無意味なので付けずに、動的なポリモーフィック設計にすると決まった段階で付ければ良い
後から必要性の有無がわかるなんてケースはそもそも存在しないはずなんだまともな設計者ならね
そもそもC++の設計理念的に使わない機能にコストを払わないというものが大前提にある
これをわかってない人間はC++を使う資格がない
もっと他の安全で書きやすい親切でクールな高級言語を使うべきだ
そう、例えば…Rubyとかをね!
0451デフォルトの名無しさん
2010/12/25(土) 17:10:450452デフォルトの名無しさん
2010/12/25(土) 17:16:150453デフォルトの名無しさん
2010/12/25(土) 17:18:23関数シグネチャ(const/volatile/virtual/throw含む)はクラス設計の一部でしょ。
明確な設計ポリシーがあるべき。
可能だからという理由で意味もなくvolatile関数連発されるのと同じで迷惑。
0454デフォルトの名無しさん
2010/12/25(土) 17:23:31丸コピさせられる事が何度もあるぜ・・・
0455デフォルトの名無しさん
2010/12/25(土) 17:23:40関係あるか?
0456デフォルトの名無しさん
2010/12/25(土) 17:26:050457デフォルトの名無しさん
2010/12/25(土) 17:28:450458デフォルトの名無しさん
2010/12/25(土) 17:29:17俺の頭では無理なんで、
後で修正しやすい形でソースコードを作ることを重視してる
0459デフォルトの名無しさん
2010/12/25(土) 17:33:47デストラクタは違いがすぐ目に見えなかったりするしな
微妙にメモリリークするだけだったりとか
絶対忘れない自信なんてないから
できるだけ安全な方向に倒したいところ
0460デフォルトの名無しさん
2010/12/25(土) 17:35:00コードも書かずに、テストもせずに設計が終わったとでも言うのかい?
>>454
動的削除子を使えば丸コピは避けられたかもね。
0461デフォルトの名無しさん
2010/12/25(土) 17:36:30でも設計なんて所詮そんなもんだと思う
0462デフォルトの名無しさん
2010/12/25(土) 17:39:30それも設計の一部なんだよ。
"Programming is a design activity ..."
http://www.google.co.jp/search?q=%22what+is+software+design%22
0463デフォルトの名無しさん
2010/12/25(土) 17:41:37うっかりメモリリーク起こすのもばからしいな
0464デフォルトの名無しさん
2010/12/25(土) 17:43:100465デフォルトの名無しさん
2010/12/25(土) 17:44:34オブジェクトは場合によっては何千何万とつくられるかもしれないでしょう
もとのクラスのサイズと比較して何%の無駄とか節約と言ってみればことの重大性に気付くはずだけどなぁ
0466デフォルトの名無しさん
2010/12/25(土) 17:45:030467デフォルトの名無しさん
2010/12/25(土) 17:46:03なわけねーだろ
そういうクラスもあるってだけだ
子供みたいな返し方はやめてくれ
0468デフォルトの名無しさん
2010/12/25(土) 17:48:330469デフォルトの名無しさん
2010/12/25(土) 17:49:260470デフォルトの名無しさん
2010/12/25(土) 17:55:18手間も対して変わらんしリリース時にはコストも無い
ぶっちゃけこれに比べればvirtualデストラクタ(笑)でセーフティのメリットは一つもない
0471デフォルトの名無しさん
2010/12/25(土) 17:56:300472デフォルトの名無しさん
2010/12/25(土) 18:01:00特に他人がコード変更した時
0473デフォルトの名無しさん
2010/12/25(土) 18:08:46これでかなりの手間というなら普段どんだけ楽な仕事してるんだろうな
>>472
そこまでアホだとクラス増やしたときにvirtual dtor忘れそうwww
まあそれでもまだ不安ならデバッグ時のみoperator new/deleteをカウンタ付きに差し替えるといいよ
virtualがなくて困るのはdeleteした時だからこれでほぼ十分
これなら毎回virtualを書く手間も、書き忘れも無くなってよかったね^^
0474デフォルトの名無しさん
2010/12/25(土) 18:12:030475デフォルトの名無しさん
2010/12/25(土) 18:20:59読んでみた。
なんというか、ウォーターフォール自体がそもそも時代遅れってことだな
しかもこれ1992年の記事だし
0476デフォルトの名無しさん
2010/12/25(土) 18:26:410477デフォルトの名無しさん
2010/12/25(土) 18:30:540478デフォルトの名無しさん
2010/12/25(土) 18:39:280479デフォルトの名無しさん
2010/12/25(土) 18:57:280480デフォルトの名無しさん
2010/12/25(土) 19:03:02プログラマが間違っていないにもかかわらず開放に失敗する可能性のあるリソースをデストラクタで開放してはいけないと聞きました
そういったリソースはどうすれば例外安全に処理できるのでしょうか?
0481デフォルトの名無しさん
2010/12/25(土) 19:05:150482デフォルトの名無しさん
2010/12/25(土) 19:09:28デストラクタで例外起こったら
握りつぶす(デストラクタ内でcatchして外に出さない)か
アプリケーション終了するしかない
そしてデストラクタでの解放はあくまで保険で
手動での解放を徹底するしかない
0483デフォルトの名無しさん
2010/12/25(土) 19:14:38std::ofstream の close() みたいな、 public な破棄処理を提供する。
0484デフォルトの名無しさん
2010/12/25(土) 19:15:02なんかやりようある?
0485デフォルトの名無しさん
2010/12/25(土) 19:16:450486デフォルトの名無しさん
2010/12/25(土) 19:18:21http://d.hatena.ne.jp/wraith13/20101025/1288015597
> trickerr.h のようなものを利用すれば別にデストラクタで失敗するような処理を実行しても問題ないんですよ。そんな馬鹿馬鹿しい制限を受け入れなくていいんですよ。
らしいぞ。
0487デフォルトの名無しさん
2010/12/25(土) 19:19:020488デフォルトの名無しさん
2010/12/25(土) 19:22:07解放に失敗したリソースを後で解放できるようにすることもできる
0489デフォルトの名無しさん
2010/12/25(土) 19:25:09うーむ
0490デフォルトの名無しさん
2010/12/25(土) 19:37:33デストラクタのある言語でも分からないということね
0491デフォルトの名無しさん
2010/12/25(土) 20:31:34プロセス外にリソースが残るものはログ出して放置で問題ない。
プロセス内にリソースが残るものは運用の人が気づくようアラーム出して、
プログラムを再起動してもらうことを祈りつつ放置。
0492デフォルトの名無しさん
2010/12/25(土) 22:15:19void 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
}
}
デストラクタでの例外許可してもあんまり意味ないなあ。
0493デフォルトの名無しさん
2010/12/25(土) 22:20:500494デフォルトの名無しさん
2010/12/25(土) 23:01:52そんな糞プロジェクトは綺麗に消去した方が吉
0495デフォルトの名無しさん
2010/12/26(日) 02:53:39int* p = &i;
const int** const pp = &p;
error C2440: '初期化中' : 'int **' から 'const int **' に変換できません。
って出ます。どうやってconstにすればいいんでしょうか。
0496デフォルトの名無しさん
2010/12/26(日) 03:05:06int const * const * const pp = &p;
0497デフォルトの名無しさん
2010/12/26(日) 03:07:21真ん中がconstじゃなかったら端っこのconst性は保証出来無いってことだ
0498デフォルトの名無しさん
2010/12/26(日) 03:22:050499デフォルトの名無しさん
2010/12/26(日) 10:16:42int* へのポインタをつっこむ事ができない
signed int へのポインタに
unsigned int へのポインタをつっこんでるのと
感覚的には同じなんじゃない
0500デフォルトの名無しさん
2010/12/26(日) 11:01:15たとえば、close系のメンバー関数はvoid返しで例外を投げないのようなコーディング規則とか。
0501デフォルトの名無しさん
2010/12/26(日) 11:03:20voidかつ例外なしにするのは危険
0502デフォルトの名無しさん
2010/12/26(日) 11:10:23// 代入元
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
0503デフォルトの名無しさん
2010/12/26(日) 11:12:49・大きいファイルはひらきっぱなしにしないでまとまった処理があるたびに開く
一般的なファイルに関してはこれで乗り切ってる
WinAPIのハンドルとかが扱いに困る
0504デフォルトの名無しさん
2010/12/26(日) 11:13:45closeでどうしても例外が必要なら、それにつられてデストラクタで例外で悩むということになる。
デストラクタが悪いというよりも、close系のメソッドが例外を投げなくてすむようにしないと解決しないんじゃね?
0505デフォルトの名無しさん
2010/12/26(日) 11:15:55多重のポインタを使う前に設計を見直す
0506デフォルトの名無しさん
2010/12/26(日) 11:17:29出さないために無理して壮大なコード書こうとは思わないな。
0507デフォルトの名無しさん
2010/12/26(日) 11:17:30ハードやネットワークの問題が絡むとプログラマがミスをしなくても失敗しうるからそれは無理だよ
0508デフォルトの名無しさん
2010/12/26(日) 11:20:56terminateする? それはちょっと
終わるまでwaitする? それもちょっと
管理を放棄するのがせいぜいか
0509デフォルトの名無しさん
2010/12/26(日) 11:27:03メイン側の話なら、タイムアウトつきjoinしてTerminateするかな。
メイン側で解放した後のメモリにアクセスされると困るから。
0510デフォルトの名無しさん
2010/12/26(日) 15:09:06伝統的に(?) flush と close がいっしょになってるのが悪いんだろ。
そんなに無理なことかな?
0511デフォルトの名無しさん
2010/12/26(日) 15:17:220512デフォルトの名無しさん
2010/12/26(日) 15:18:54結局close失敗するじゃん
0513デフォルトの名無しさん
2010/12/26(日) 15:20:12リソースを破棄するだけで済むでしょ。
0514デフォルトの名無しさん
2010/12/26(日) 15:42:570515デフォルトの名無しさん
2010/12/26(日) 15:44:36using(var f = new FileStream())…
のとき、Close()が出した例外はどこに行ってしまうだって気になってる。
0516デフォルトの名無しさん
2010/12/26(日) 16:49:200517デフォルトの名無しさん
2010/12/26(日) 16:50:10デストラクタではflushせずにcloseしろってこと?
それはちょっと・・・
0518デフォルトの名無しさん
2010/12/26(日) 16:55:09そう。 flush() は write() (の繰り返し)の最後にユーザーが行うものとする。
今でもこれを忘れているコードはデストラクタで close() に伴って行われる
flush() でのエラーに対応できていない。
慣れの問題はわかるが、それ以外に何か問題があるかい?
0519デフォルトの名無しさん
2010/12/26(日) 17:05:150520デフォルトの名無しさん
2010/12/26(日) 17:07:080521デフォルトの名無しさん
2010/12/26(日) 17:09:240522デフォルトの名無しさん
2010/12/26(日) 17:11:250523デフォルトの名無しさん
2010/12/26(日) 17:57:150524デフォルトの名無しさん
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のデストラクタは安全なタイミングで呼ばれてるんですが
他のコンパイラに持っていっても問題ないのかなと
0525デフォルトの名無しさん
2010/12/26(日) 18:41:29一時オブジェクトの寿命は文(正確には完全式)の終わりまであるから、大丈夫。
それとは別に、その変換演算子 operator const char* () は一般的な変換演算子の
話として危険だと思う。
0526デフォルトの名無しさん
2010/12/26(日) 18:53:29カッコ内で生成されるオブジェクトってのがどれをさしてるのかわからんけど
"hello1"のことならばは生成されてすぐhellofuncの中でデストラクタが呼ばれる。
ただ、コピーコンストラクタで内容がコピーされて
それが戻るので大丈夫なはず
0527デフォルトの名無しさん
2010/12/26(日) 19:04:28>>524
キャスト演算子はどっかで見たなあと書いたけど確かに・・・
たいして便利でもないしc_str()関数とか作った方が間違いにくいですね
実際に最初printfにキャスト無しで渡してハングさせたし
0528デフォルトの名無しさん
2010/12/26(日) 19:09:22まあ、無駄に遅いプログラムが出来るだけ。
個人ツールなら何でもいい、仕事でやったらどうだろうね〜〜
0529デフォルトの名無しさん
2010/12/26(日) 19:46:40そういうのは普通戻り値最適化されて、
return std::string("hello1"); の時点で
戻り値用のテンポラリオブジェクトがコンストラクトされるようなコードが生成される
0531526
2010/12/26(日) 20:37:290532デフォルトの名無しさん
2010/12/26(日) 20:44:590533デフォルトの名無しさん
2010/12/26(日) 20:49:46このforのオーバーヘッドなしの測定方法ってある?
0534デフォルトの名無しさん
2010/12/26(日) 20:54:580535デフォルトの名無しさん
2010/12/26(日) 20:56:32中学レベルの数学でどうにでもなる
0536デフォルトの名無しさん
2010/12/26(日) 21:01:070537デフォルトの名無しさん
2010/12/26(日) 21:59:01・無視する
・ループをunrollingするソースコンバータを作って評価
0538デフォルトの名無しさん
2010/12/26(日) 22:09:39forの影響はある程度なくせるけど
でも結局ループでパフォーマンス調べるのでは
キャッシュの影響が入っちゃうから
本当のパフォーマンスなんてのは分からないものだ
0539デフォルトの名無しさん
2010/12/26(日) 22:11:45一般的な実験では
何も内容(効果)が無いであろうものも同時に調べておき、最後にそれらを比較する
0540デフォルトの名無しさん
2010/12/26(日) 22:56:31これって例外でたらリークする?
0541デフォルトの名無しさん
2010/12/26(日) 22:57:420542デフォルトの名無しさん
2010/12/26(日) 23:01:060543デフォルトの名無しさん
2010/12/26(日) 23:06:07Hogeコンストラクタの実装次第、としか言いようが無い
とりあえず
class Hoge {
public:
Hoge(Fuga* fuga) : m_fuga(fuga), ... { ... }
private:
std::auto_ptr<Fuga> m_fuga;
...
};
となってるならリークしない
0544デフォルトの名無しさん
2010/12/26(日) 23:09:41new Fuga の評価後に Hoge のための operator new で bad_alloc 出たら
Hoge のコンストラクタ定義に関係なく漏れるでしょ。
0545デフォルトの名無しさん
2010/12/26(日) 23:13:48operator newの実装次第としか言いようがない。
ユーザー定義のoperator newがあってガベージコレクションが
実装されているかもしれない。
0546デフォルトの名無しさん
2010/12/26(日) 23:18:35auto_ptr<Fuga> unko(new Fuga);
Hoge *p = new Hoge(unko);
unko.release();
でいいんじゃない?
0547デフォルトの名無しさん
2010/12/26(日) 23:19:03ああ、そうか
それ忘れてた
まあoperator newまで考えると分からんが、危険だな
0548デフォルトの名無しさん
2010/12/26(日) 23:23:30Hoge のコンストラクタで所有権が移動するなら中で release() するだろ。
移動しないなら release() しちゃダメだし。
0549デフォルトの名無しさん
2010/12/26(日) 23:43:32Hogeの引数はauto_ptrじゃなくてFuga*型だし、
Hogeがメモリ解放する設計になってるんでは?
0550デフォルトの名無しさん
2010/12/26(日) 23:46:130551デフォルトの名無しさん
2010/12/26(日) 23:51:040552デフォルトの名無しさん
2010/12/26(日) 23:56:240553デフォルトの名無しさん
2010/12/26(日) 23:58:19>>540でも例外安全か
0554デフォルトの名無しさん
2010/12/27(月) 00:01:34これでいいのかな
>>553
>>544を100ぺん読み直せ
0555デフォルトの名無しさん
2010/12/27(月) 00:04:46?
auto_ptr<Hoge> hoge(new Hoge(auto_ptr<Fuga>(new Fuga)));
0556デフォルトの名無しさん
2010/12/27(月) 00:05:510557デフォルトの名無しさん
2010/12/27(月) 00:10:35引数のテンポラリオブジェクトの作成とnewって
どっちが先だっけ?
0558デフォルトの名無しさん
2010/12/27(月) 00:14:48おJAVA様(笑)なら new Hoge(new Fuga()) でオーケーだぜ
0559デフォルトの名無しさん
2010/12/27(月) 00:16:24結局そこに行き着くんだよなぁ
C++もそろそろ根っこから新しくしないと時代に取り残されるよ
0560デフォルトの名無しさん
2010/12/27(月) 00:24:140561デフォルトの名無しさん
2010/12/27(月) 00:26:04それでも結局 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.
0562デフォルトの名無しさん
2010/12/27(月) 00:34:19operator newとoperator deleteでC++ライブラリの不整合が
あったらどうすんの
0563デフォルトの名無しさん
2010/12/27(月) 00:36:54どうにもならんと思うが、 auto_ptr を受け取らなければなんとかなるのか?
0564デフォルトの名無しさん
2010/12/27(月) 00:39:03newとコンストラクタ引数の評価順はundefinedかunspecifiedってことか
それだと無理だな
0565デフォルトの名無しさん
2010/12/27(月) 00:42:13だからと言って auto_ptr 渡しに原因があるかのように言うのは筋違いだろう。
生ポインタだって unique_ptr だって、動的削除子無しで所有権の移動をする限り同じこと。
そもそもライブラリの不整合なんて心配しないといけないのもおかしいだろうと思う。
0566デフォルトの名無しさん
2010/12/27(月) 00:47:55ライブラリ境界をまたいでnew/deleteしないような設計にするのは基本だろ。
deleteする側が性的リンクしてnewする側が動的リンクとか不整合は簡単に起こる。
0567デフォルトの名無しさん
2010/12/27(月) 00:49:150568デフォルトの名無しさん
2010/12/27(月) 00:51:310569デフォルトの名無しさん
2010/12/27(月) 01:06:08Test* 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にアクセス
みたいなことをオペレータでやりたいんですけどどうすればできますか?
0570デフォルトの名無しさん
2010/12/27(月) 01:08:170571デフォルトの名無しさん
2010/12/27(月) 01:09:06p[0][0];
みたいな感じ? 確認はしてない。
0572571
2010/12/27(月) 01:27:29int 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);
0573デフォルトの名無しさん
2010/12/27(月) 01:28:23struct {
struct {
Test& operator[](int i);
} operator[](int i);
} mawari;
Test& operator=(Test*);
};
とりあえずプロトタイプ宣言的なものは上の形でできました(VC++で赤い波線が消えました)
0574デフォルトの名無しさん
2010/12/27(月) 01:28:30めんどくさいから mawari(int, int) って関数にしたほうがいいよ。
0575デフォルトの名無しさん
2010/12/27(月) 01:29:190576デフォルトの名無しさん
2010/12/27(月) 01:34:08思ったよりめんどうだったので関数でやってみます
0577デフォルトの名無しさん
2010/12/27(月) 13:55:06やっぱり止めます
0578デフォルトの名無しさん
2010/12/27(月) 20:39:10int &marari(int x, int y) { return p[4 + (y * 3) + x]; }
が一番シンプルだよ
0579デフォルトの名無しさん
2010/12/27(月) 23:58:15Test* Test::mawari(int x, int y) { return t.mawari[(y + 1) * 3 + (x + 1)]; }
で十分
演算子オーバーロードにこだわるのは初心者にありがちな悪癖
0580デフォルトの名無しさん
2010/12/27(月) 23:58:420581576
2010/12/28(火) 01:21:10あと、関数でやろうとしましたが=のオペレータがどうしたらいいかわからなくなったのでやめました
いろいろな意見を出していただきありがとうございました
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];の=に赤波が付きます
このようなことはできるのでしょうか
0582デフォルトの名無しさん
2010/12/28(火) 01:47:13赤波って、コンパイルエラーだろ。エラーメッセージを見ろ。
(その例だとどうせ「型が合いません」とか言われてるはず)
0583デフォルトの名無しさん
2010/12/28(火) 01:52:26これらのオペランドと一致する演算子"="はありません
とでます
*thisに代入できないということなのでしょうか
0584デフォルトの名無しさん
2010/12/28(火) 01:55:41= の左辺が Test 型、右辺が Test* 型になってる
0585デフォルトの名無しさん
2010/12/28(火) 02:01:12thisってconstだから代入できないんですね
ということは自分自身を変更することはできないということでしょうか?
0586デフォルトの名無しさん
2010/12/28(火) 02:06:11メンバ関数 move() の中で this は const だが *this はそうではない。
0587デフォルトの名無しさん
2010/12/28(火) 02:07:14= の左辺が Test 型、右辺が Test* 型になってる
0588デフォルトの名無しさん
2010/12/28(火) 03:02:59だとエラーはありませんでしたが
t = t->mawari[2];
と等価の働きはしませんでした
t = t->mawari[2];と同じ動きにはできないでしょうか
0589デフォルトの名無しさん
2010/12/28(火) 03:39:48t の型が Test なのか Test* なのか、はっきりしないな。
「等価の働きはしませんでした」と言われてもどうなったのかがわからない。
コンパイルできるソース貼れ。
0590デフォルトの名無しさん
2010/12/28(火) 07:07:52UNIXのシグナルのような感じで、スレッドAが動作中にスレッドBからスレッドAの中で割り込みを発生させて、別の処理をさせたいのですが
0591デフォルトの名無しさん
2010/12/28(火) 07:21:36>スレッドBからスレッドAの中で割り込みを発生させて
オマエはUNIXシグナルの基礎を理解していなさそうだから、
あきらめた方がいいよ。
0592591
2010/12/28(火) 07:28:28Ctrl+CとかのSIGINTだと別スレッド。
シグナルハンドらはvolatile変数のフラグ立てるぐらいしか処理しちゃしけない。
これでUNIXシグナル相当のことはできるはず。
0593デフォルトの名無しさん
2010/12/28(火) 07:28:46わかりずらかったでしょうか?
UNIXのシグナルはプロセスになっちゃいますが、シグナルみたいなことをスレッドでやりたいのですが
0594デフォルトの名無しさん
2010/12/28(火) 07:29:35>>593は>>592への返信です
0595デフォルトの名無しさん
2010/12/28(火) 07:42:47>>594
で、メッセージを投げるんじゃダメな理由が何かあるのか?
どっちみち、ここよりも汎用C/C++スレかWinAPIスレで聞いた方がよさそうだが。
0596デフォルトの名無しさん
2010/12/28(火) 10:56:27ググルとアルゴリズムがどうのこうのと言ってるんですがよくわかりません
0597デフォルトの名無しさん
2010/12/28(火) 10:57:53マジ便利
0598デフォルトの名無しさん
2010/12/28(火) 11:04:250599デフォルトの名無しさん
2010/12/28(火) 11:21:12だからソフトハウスが独自に用意するか、さもなくばコンテナなしに済ませてたってこと。
0600デフォルトの名無しさん
2010/12/28(火) 11:22:49C++標準のコンテナ。それ以上の意味はない。
0601デフォルトの名無しさん
2010/12/28(火) 16:20:26プロジェクトと同じフォルダにSFMT.hとSFMT.cを移してソースコードに#include"SFMT.h"だけではだめなのでしょうか
0602デフォルトの名無しさん
2010/12/28(火) 18:11:53せめて何がどうダメだったのか位書いてあれば兎も角、ここはエスパースレじゃない。
0603デフォルトの名無しさん
2010/12/28(火) 18:28:070604デフォルトの名無しさん
2010/12/28(火) 18:42:41わかりました。
-----------------------
#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 スキップ ==========
というエラーが出ます。何か分かりましたらよろしくお願いします
0605デフォルトの名無しさん
2010/12/28(火) 18:45:27extern "C" void __cdecl init_gen_rand(unsigned int);
0606デフォルトの名無しさん
2010/12/28(火) 18:45:340607デフォルトの名無しさん
2010/12/28(火) 19:32:02標準C++に違反しないまま、他人が配布しているDLL内にある関数を使用することはできますか?
ググってみたところ、どれもwindows.hをincludeして
LoadLibrary,GetProcAddress,FreeLibrary を使用しているようですが。
0608デフォルトの名無しさん
2010/12/28(火) 19:57:29LoadLibraryみたいなAPIを使うことを標準C++に違反するとは言わない。
そんな事言ったらそのDLLを使うこと自体が違反だと思うが?
…ちょっとエスパーすると、
そのDLLもDLLと言うモノ自体もC++の規格にはないので
あなたの求めるような方法が存在するわけがない。
0609デフォルトの名無しさん
2010/12/28(火) 20:01:590610デフォルトの名無しさん
2010/12/28(火) 20:12:300611デフォルトの名無しさん
2010/12/28(火) 20:31:25DLL内で例外処理さえ使わないようにしておけば安全
例外処理はコンパイラに依存するので、同じコンパイラで組んだDLLでないと
例外処理を行わせると未定義の振る舞いになる
0612デフォルトの名無しさん
2010/12/28(火) 21:15:330613デフォルトの名無しさん
2010/12/28(火) 21:15:42ありがとうございます。が、今度は別のエラーが出てしまいました.。まだ何か足りないようです
状況:プロジェクトのソースファイルに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);
--------------------
何か助言がいただけましたら幸いです
0614デフォルトの名無しさん
2010/12/28(火) 21:22:45extern "C"{
void __cdecl init_gen_rand(unsigned int);
}
なんで中括弧つけた?
0615デフォルトの名無しさん
2010/12/28(火) 21:33:31あ、さーせん。それはネットで調べてていろいろ試してたのがそのままだからです。
-----------------
extern "C" void __cdecl init_gen_rand(unsigned int);
-----------------
に表記を直してもエラーは同じものが出ています
0616デフォルトの名無しさん
2010/12/28(火) 21:49:52#include"SFMT.h"
}
int main(){
init_gen_rand(0);
return 0;
}
0617デフォルトの名無しさん
2010/12/28(火) 21:53:43おお!通りました!
ありがとうございます!!
0618デフォルトの名無しさん
2010/12/29(水) 04:47:54Boost、TR1 (VC++ 2008)、0x (VC++ 2010)のRandomライブラリを使うのも手。
0619デフォルトの名無しさん
2010/12/29(水) 12:03:330620デフォルトの名無しさん
2010/12/30(木) 21:29:51CArray<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)
0621デフォルトの名無しさん
2010/12/30(木) 21:30:290622デフォルトの名無しさん
2010/12/30(木) 21:31:430623デフォルトの名無しさん
2010/12/30(木) 21:32:20即答ありがとうございます。できました
0624デフォルトの名無しさん
2010/12/30(木) 21:59:40何でC++03で導入されなかったんだろうなあ
0625デフォルトの名無しさん
2010/12/30(木) 22:02:070626デフォルトの名無しさん
2010/12/30(木) 23:23:580627デフォルトの名無しさん
2010/12/31(金) 07:44:22なら先頭アドレス取得するメソッドも追加しろって話
0628デフォルトの名無しさん
2010/12/31(金) 08:19:150629デフォルトの名無しさん
2010/12/31(金) 09:05:49ファイルにダンプする方法、
g++のオプションで減らす方法、
エラーをひとつひとつステップ出力する方法
のどれかを教えてもらえますか?
0630デフォルトの名無しさん
2010/12/31(金) 09:16:11> お願いします。
0631デフォルトの名無しさん
2010/12/31(金) 10:27:50このコードが複数のスレッドから同時実行されているのですが、、、
#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;
}
0632デフォルトの名無しさん
2010/12/31(金) 10:36:04どうして無いと思う?
0633デフォルトの名無しさん
2010/12/31(金) 14:26:23そのコードそのままのmain関数を複数スレッドから呼んでも
競合が起きる可能性はないよ。
もしcheckListが非ローカルなら当然アウトだけど。
0634デフォルトの名無しさん
2010/12/31(金) 23:11:40ClassA& ClassA::Dup()
{
return *this;
}
このコードは以下のように書いては駄目なのでしょうか?
違いがわかりません。
ClassA ClassA::Dup()
{
return *this;
}
よろしくお願いします。
0635デフォルトの名無しさん
2010/12/31(金) 23:17:52上のコードはコピーなんて作ってなくてただの参照を返してるだけ
単純にC++の参照の機能を勉強すれば違いがわかるんじゃないだろうか
0636デフォルトの名無しさん
2011/01/01(土) 00:24:300637デフォルトの名無しさん
2011/01/01(土) 04:33:040638デフォルトの名無しさん
2011/01/01(土) 10:08:26参照については、書籍やホームページで勉強したのですが、
return *this;とする場合に、参照で渡すのとそのまま渡すので
どう違いがあるのかよくわかりません。
参照で渡したほうがメモリを食わないのかなとは思いますが…
>>636
二つのコードで振る舞いに違いが出るのは
どういう場合でしょうか?
代入演算子のオーバーロードのサンプルコードでは、
戻り値が参照でreturn this*;と
なっているコードを見たりするのですが、
そういう書き方はよくないということでしょうか?
0639デフォルトの名無しさん
2011/01/01(土) 10:41:07Dup(duplicate)といったら普通はDup2のほう
0643デフォルトの名無しさん
2011/01/01(土) 17:19:18const char * const szStr1 = "aaaaaaaaaaaa";
---------
Uit2.cpp
extern const char * const szStr1;
-----------
const char * const を const char * にするとOKなんですが
const char * const のままだとリンカエラー(参照の未解決)になるんだけど、理由が分かりません。
なぜリンクできないのか教えてください。
お願いします。
0644デフォルトの名無しさん
2011/01/01(土) 17:29:190割エラーが発生しないもっとも0に近い値はいくつですか?
0645デフォルトの名無しさん
2011/01/01(土) 17:34:450でも発生しないと思うよ
結果が非数とか無限大とかになるだけで
0646デフォルトの名無しさん
2011/01/01(土) 17:45:56ということは、0かもしれない値で割り算するときは、
除算後にその値をisfiniteマクロあたりで調べる、というのがベターでしょうか?
0647デフォルトの名無しさん
2011/01/01(土) 18:13:12どう考えても除算前に0かどうかを比較するのがベストだろ
0648644
2011/01/01(土) 18:26:210649デフォルトの名無しさん
2011/01/01(土) 19:07:00被除数が 1 ならおよそ 3.0e-39 くらい
被除数が 2 ならおよそ 5.9e-39 くらい
被除数が 0.5 ならおよそ 1.5e-39 くらい
被除数が x ならおよそ (x / FLT_MAX + ulp) くらい
で割るといいと思うよ
0651デフォルトの名無しさん
2011/01/01(土) 23:13:520652デフォルトの名無しさん
2011/01/02(日) 13:54:20操作する環境はInterop.ExcelとかのOffice関係のライブラリが一切インストールされてないんだが
無理じゃね?
dllをexeと同じ階層に持ってきちゃえばいける気がするのだが
金が掛かっている以上、MSのdllを無許可で使用するのは得策じゃないし・・・
0653デフォルトの名無しさん
2011/01/02(日) 15:02:13天才エスパー現る
0654デフォルトの名無しさん
2011/01/02(日) 15:30:45そこで、プロテクトを考えたんですけど、ここまでやる必要はありますか?#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_ @
0655デフォルトの名無しさん
2011/01/02(日) 15:42:210656デフォルトの名無しさん
2011/01/02(日) 15:54:00MultiValue<T> V={A,B,C};
的な初期化がしたいのですよ。
で、std::arrayをみて、コンストラクタを書かずに、対象の変数をパブリックにすれば、
言語の標準機能で初期化できることがわかりました。
しかし、クラスの隠蔽の観点からそういうパブリックな変数は意にそぐわないと思います。
そこで、パブリックにする代わりに、プリプロセッサで予測が難しい文字列に置換することにしました。
で、defineしたものを使い終わったらけして、隠蔽を図るまではアリだと思うのですが、
その後の使用においてもパブリックなフィールドに手をつけられないようにするべきでしょうか。それが@に置換なんですけど。
そもそも、どの程度のプロテクトをかければ正常な運用の上で不具合が起こらないでしょうか??
vc10なんですけど、イニシャライザーリストさんがまだ来ないので困っています。
0657デフォルトの名無しさん
2011/01/02(日) 16:17:09変なマクロで識別子を汚されると皆が迷惑するんです
0658デフォルトの名無しさん
2011/01/02(日) 16:48:38無駄な努力ですか〜。まーそうかもですね。
体裁整えたかったんだけど、イニシャライザーリストさんをまちますよ。
解答ありがとう。
0659デフォルトの名無しさん
2011/01/02(日) 17:23:130660デフォルトの名無しさん
2011/01/02(日) 17:27:05適当な名前が思い浮かばなかったんだ。Orz
0661デフォルトの名無しさん
2011/01/02(日) 20:09:030662デフォルトの名無しさん
2011/01/03(月) 13:06:44const なオブジェクトのリンケージはデフォルトで内部リンケージ。
これは C と C++ で違うところ。
外部リンケージにしたいときには extern の指定が要る。
ヘッダで宣言せずに extern で取ってくる、なんて行儀の悪いことを
しようとするからそんなことになる。
0663デフォルトの名無しさん
2011/01/03(月) 19:52:22documentに「publicにしてあるけどさわったらちゃんと動きません!」って強くその旨記載してあれば
正常な運用の上で不具合は起こらない。
俺だったら
Do_Not_Touch_This_Member_xxxxないしdo_not_touch_this_member_xxxx
ってやる。
そもそもそうならないようにするけど。
teamの仲間が良識があればさすがに触らないでしょ。
0664663
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
○ っていうメンバ名にするよ。
0665デフォルトの名無しさん
2011/01/03(月) 20:08:390666デフォルトの名無しさん
2011/01/03(月) 20:23:510667デフォルトの名無しさん
2011/01/03(月) 20:26:050668デフォルトの名無しさん
2011/01/03(月) 21:20:18>>663-664
最初それ系を考えたんですけど、保守性の観点からクラスの記述はシンプルにしたかったので、defineにしたんですよ。
それでもコード補間で候補に出るから参ったって感じでしたけど、まー良識を信用したほうがいいところに落とせそうです。
>>665-666
もう触れるのもやめてくれ的な強い意味でタッチを選んだんですけどナシですか。英語は難しいです。
0669デフォルトの名無しさん
2011/01/03(月) 22:05:44ttp://www.pcworld.com/article/114847/microsoft_says_dont_touch_that_code.html
0670デフォルトの名無しさん
2011/01/03(月) 22:33:16>>665-666
の2人の方だったのかww
0671デフォルトの名無しさん
2011/01/03(月) 23:01:58よく読んだら「あのコードには(違法に盗まれたものなので)関わらないでくれ」って意味だったみたい
コード修正するな、だとdonot modify this codeの方が明確なのかな
0672デフォルトの名無しさん
2011/01/03(月) 23:11:420673デフォルトの名無しさん
2011/01/04(火) 13:31:48!!!!!!!!自治厨乙!!!!!!!!!!!!
0674デフォルトの名無しさん
2011/01/04(火) 16:23:500675デフォルトの名無しさん
2011/01/04(火) 16:25:10> コード修正するな、だとdonot modify this codeの方が明確なのかな
でも質問者は「コード修正するな」じゃなくて
「このメンバ(変数)は(C++的に気持ち悪いけどpublicにしたんで)関わらないでくれ」
って意味だからtouchでいいんじゃないのかね。
0676デフォルトの名無しさん
2011/01/04(火) 17:26:21Interop.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++なりなんなりのスレへ行け。
0677デフォルトの名無しさん
2011/01/04(火) 21:04:02延々と続けられるのもあれなので答えを書くと
dont access this member directly
0678デフォルトの名無しさん
2011/01/04(火) 22:19:27dont access here
0680デフォルトの名無しさん
2011/01/04(火) 22:50:170681デフォルトの名無しさん
2011/01/04(火) 23:27:490682デフォルトの名無しさん
2011/01/05(水) 00:06:36ttp://codepad.org/eKGVKex0
0683デフォルトの名無しさん
2011/01/05(水) 01:24:40So cool!
0684デフォルトの名無しさん
2011/01/05(水) 02:48:14おまえカッコいいな
0685デフォルトの名無しさん
2011/01/05(水) 03:11:42c++スレでc++の命名について議論しちゃダメなんですか?
0686デフォルトの名無しさん
2011/01/05(水) 16:51:23面白いね。理屈理解するのにちょっと悩んだぜ。
0687デフォルトの名無しさん
2011/01/06(木) 02:41:04struct identity
{
typedef T type;
};
struct A : identity<int>
{
type value; //これはOK?
};
typedef base::type type;とtypedefし直してるのをよく見ますが、typedefって継承されますか?
VC++、gccでコンパイル通るようですがC++としてはどうなんでしょうか。
0688デフォルトの名無しさん
2011/01/06(木) 02:50:30継承されるメンバに種類の区別は無いよ。 (ISO C++ 2003 10 [class.derived] p1)
0689デフォルトの名無しさん
2011/01/06(木) 03:10:13読みづらくなりそうですが、typedefし直さなくても問題ないんですね。
ありがとう。
0690デフォルトの名無しさん
2011/01/06(木) 07:40:09class 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の実装だったらどっちが良い?
0691デフォルトの名無しさん
2011/01/06(木) 07:41:33main() {
Hoge *hoge;
Fuga f;
f.change1(&hoge);
hoge=f.change2(hoge);
}
0692デフォルトの名無しさん
2011/01/06(木) 08:08:57実装じゃなくてインターフェースの比較の話だよね?
値の交換しか提供しない、似たような std::set_new_handler() の
インターフェースが問題とされたりしている。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3189.htm
どちらというより、まず値の取得と設定は分けておいたほうがいいと思う。
Fuga const からは読み出せないとかいうのも問題になりそう。
そうは言っても値の交換を複数スレッドからアトミックにしたい場合は似たような
インターフェースが必要になるかもしれないとは思う。その場合は "swap" という
名前付けができる change1() のインターフェースのほうがいくらかわかりやすい
かもしれない。
本筋とは関係ないけど、暗黙の int は標準から外れるんでやめといたほうがいいよ。
0693デフォルトの名無しさん
2011/01/06(木) 08:44:33> 値の取得と設定は分けておいたほうがいい
これはどういう意味?
> 暗黙の int は
mainの戻り値のこと?ここは説明用に書いただけで省略しちゃいました。
0694デフォルトの名無しさん
2011/01/06(木) 08:46:42あたいのしゅとくをするかんすうとせっていをおこなうかんすうをふたつ
よういすればいいんだとおもうよ。
0695デフォルトの名無しさん
2011/01/06(木) 18:18:17二択条件式
| 論理和式
| 論理和式 ? 式 : 代入式
となっていますが、2番目が C言語では
論理和式 ? 式 : 二択条件式
となっています。違いの意味は何でしょうか?
また ++x の評価が C++ では左辺値、Cでは右辺値となっている
と思うのですが?違っているのは何か意味があるのでしょうか?
0696デフォルトの名無しさん
2011/01/06(木) 19:02:41がC++では
x ? y : (z = 1);
と解釈されるがCでは
(x ? y : z) = 1;
と解釈される (そしてエラーになる) という意味では
++x は左辺値の方が参照が取れて便利だから?
0697デフォルトの名無しさん
2011/01/06(木) 19:32:34右辺値になっているCの設計がおかしいだけ。
0698デフォルトの名無しさん
2011/01/06(木) 21:04:53ありがとうございます。
C++ が x ? y : (z = 1); とする方を仕様とした理由が知りたいです。
(++x は左辺値の方が参照が取れて便利だから? )と同様な
0699デフォルトの名無しさん
2011/01/06(木) 22:36:40こうやりたかったんじゃないの?
こういうのはif-elseでやってくれとは思うが
0700デフォルトの名無しさん
2011/01/07(金) 00:32:17エラーだったのを動くよう直すのに何か特別な理由がいるのか?
0701デフォルトの名無しさん
2011/01/07(金) 02:05:100702デフォルトの名無しさん
2011/01/07(金) 02:40:37const なメンバ関数の型を正しく推測できていないようです。
何か規格外の事をしているのか、それとも単なる 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
0703デフォルトの名無しさん
2011/01/07(金) 03:29:07別のobjを一緒にリンクして実行ファイルを作ってくれるように指定することはできないでしょうか?
(コンパイラはclを使っています。)
#pragma comment(lib, "sub.obj") ←こんな風に書きたいのですができませんでした
0704デフォルトの名無しさん
2011/01/07(金) 04:00:43Cではエラーではない。Cとの互換性をできるだけ維持しようとしていた
はずのC++が何故、些細と思われる仕様の変更を行ったのか?または言語
仕様上こうしなければならない理由があるなら、それを知りたいだけです。
0705デフォルトの名無しさん
2011/01/07(金) 05:57:380706デフォルトの名無しさん
2011/01/07(金) 07:12:170707デフォルトの名無しさん
2011/01/07(金) 07:12:37その別のobjとやらをライブラリ化すればいいんじゃないのか?
0708デフォルトの名無しさん
2011/01/07(金) 07:18:18template<typename F>
void test( Foo* foo, F func ){
( foo->*func )();
}
でいいんじゃないかな
0709デフォルトの名無しさん
2011/01/07(金) 11:05:09コンテナの定義が
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のデフォルト引数周りをゴニョゴニョすれば行けそうな気がするのですが・・・
0710デフォルトの名無しさん
2011/01/07(金) 11:50:00じゃだめなの?
0711デフォルトの名無しさん
2011/01/07(金) 12:10:33C ではエラーになるよ。
http://codepad.org/XEunP081
0712デフォルトの名無しさん
2011/01/07(金) 12:15:48> template<typename F>
> void test( Foo* foo, F Foo::*func ){
これだと func は F 型の非静的データメンバ( Foo のメンバ変数)へのポインタに
なりそうなんだけど、これでメンバ関数へのポインタもマッチしちゃう gcc がなんか
おかしいんじゃないかな?
0714デフォルトの名無しさん
2011/01/07(金) 13:15:30定義してなかったらエラーじゃなくて
デフォルトのことをするなんてことできませんよね?
0715デフォルトの名無しさん
2011/01/07(金) 13:18:080716デフォルトの名無しさん
2011/01/07(金) 13:21:39C(){
T.a();
}
};
ではこのa()が定義されてなかったときの例について教えてください。
0717デフォルトの名無しさん
2011/01/07(金) 13:32:31test( &foo, &Foo::test2 );
この場合、constでないオブジェクトfooがconstなメンバ関数test2を呼び出しているけど、いいんだろうか?
0718デフォルトの名無しさん
2011/01/07(金) 13:32:410719デフォルトの名無しさん
2011/01/07(金) 13:34:08それのどこが問題なんだ?
const なオブジェクトが非const なメンバを呼び出せるのが不味いってんなら分かるが
0720デフォルトの名無しさん
2011/01/07(金) 13:34:14書き換え可能なオブジェクトに対して書き換えしない関数を呼んでも何も困らない。
0721デフォルトの名無しさん
2011/01/07(金) 13:35:09has_member が要るケースか。それは標準では無理だな。
0722717
2011/01/07(金) 13:39:260723デフォルトの名無しさん
2011/01/07(金) 14:23:11http://cpplover.blogspot.com/2008/10/hasxxx.html
0724デフォルトの名無しさん
2011/01/07(金) 14:27:19型名を持ってるかどうかの判別じゃダメでしょ?
0725デフォルトの名無しさん
2011/01/07(金) 14:37:39ごめんなさい。言い方(書き方)をまちがえていました。
Cではエラーとなる仕様なのに、C++ではエラーとならない仕様となっているのは何故?
といううことです。
C++では第二演算対象、第三演算対象が左辺値であって同じ型である場合は
「二択条件式の結果をその型の左辺値とする。」とする仕様と関係があるのか?
>>699 のとおり if-else で十分なのではないかと思うに、何故?
しつこくてごめんなさい。
0726デフォルトの名無しさん
2011/01/07(金) 14:41:51どちらも不要な制限事項を取り払ったもの。
Cではエラーになっていたものなので、互換性の問題も無い。
0727デフォルトの名無しさん
2011/01/07(金) 14:43:12むしろ、エラーのままにしておいたほうがいいと思う理由は何?と聞きたいぐらいだ。
0728デフォルトの名無しさん
2011/01/07(金) 14:44:29構造体名の前の struct が不要になったことについても君は理由を問うのかね?
0729デフォルトの名無しさん
2011/01/07(金) 15:13:570730デフォルトの名無しさん
2011/01/07(金) 19:26:37main関数内で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;
}
0731デフォルトの名無しさん
2011/01/07(金) 19:27:05C++ で struct を前置してもエラーにならないのはCとの互換性のためでは?
二択条件式の例では、 >>726 のとおり、Cではエラーになっていたものなので、
互換性の問題も無い。 (CでコンパイルできたソースをC++でほぼコンパイルできる)
「どちらも不要な制限事項を取り払ったもの。」なのか、C++の言語仕様で必然的に
そうしているのか?(私自身はなにによって必然となるのか理解していませんが)
ということを知りたい。またまたしつこくてごめんなさい。
0732デフォルトの名無しさん
2011/01/07(金) 19:46:39別に問題は無いけど直接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不要
}
0733デフォルトの名無しさん
2011/01/07(金) 19:50:350734デフォルトの名無しさん
2011/01/07(金) 20:27:33書籍・サイトとかありますか?
チャットツールとかが作れるようになりたいです。
0735デフォルトの名無しさん
2011/01/07(金) 20:54:18たぶん"その理由はこうです"的なものは見つけるのが難しいんじゃないかなぁ
だいたいの予想としては
c ? x = 42 : y = 42 ← xはいいけどyはダメ
みたいなイミフなルールを是正するためだと思う
0736デフォルトの名無しさん
2011/01/07(金) 21:27:32ありがとうございます。
いろいろ調べていたら、JIS X3014 附属書Cの 5.16,5.17,および5.18 に
改変内容 条件式、代入式 又はコンマ式の結果は左辺値となりうる。
改変理由 C++は、オブジェクト指向言語の一つであり、左辺値を比較的
重要視している。例えば、関数は左辺値を返してもよい。
とありました。
0737デフォルトの名無しさん
2011/01/07(金) 21:40:280738デフォルトの名無しさん
2011/01/07(金) 21:41:550739デフォルトの名無しさん
2011/01/07(金) 22:09:331. まずsocketのマニュアルを開きます
2. 次に簡単なechoサーバーを作ってみましょう
3. あとは応用で何でもできます
完
0740デフォルトの名無しさん
2011/01/07(金) 22:12:25*を使わないですむ演算子はないのでしょうか?
Hoge(CTest **p)
{
………
(**p).guhe(); //方法1
(*p)->guhe(); //方法2
p-->guhe(); //こんな感じで*を使わず呼び出したい
0741デフォルトの名無しさん
2011/01/07(金) 22:16:51huga* P = *in;
P->proc();
}
ってかんじじゃね?
0742デフォルトの名無しさん
2011/01/07(金) 22:30:350743デフォルトの名無しさん
2011/01/07(金) 23:19:54ありがとうございます。
ポインタへの参照ですっきり書くことができました。
0744デフォルトの名無しさん
2011/01/08(土) 00:14:13なんかよくわかりませんがとりあえず手順通りにググッたり書籍を探してみたり
してがんばります。
0745730
2011/01/08(土) 00:30:22アドバイスありがとうございます。
説明不足というか後出しで大変恐縮なのですが
目標はBMPファイルをロードする関数を作るので、
fin.read()で一気にピクセルデータをロードしたいと思っています。
fin.read() の第一引数に &a[0] を入れても(std::vectorの内部構造的に)大丈夫なんでしょうか?
0746730
2011/01/08(土) 00:41:58std::vectorはメモリ連続性が保証されてるので、>>732の方法でOKなんですね。
>>732の方法で行きたいと思います。
ありがとうございました。
0747デフォルトの名無しさん
2011/01/08(土) 21:36:22template < 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にアクセスさせるなどの方法はないでしょうか
0748730
2011/01/08(土) 22:12:32>>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に二次元アクセスする綺麗な書き方を教えて頂けませんか。。
0749デフォルトの名無しさん
2011/01/08(土) 22:18:39a.resize(height);
for(int i=0; i<height; i++) a[i].resize(width);
a[i][j]=0;
0750デフォルトの名無しさん
2011/01/08(土) 22:19:550751デフォルトの名無しさん
2011/01/08(土) 22:22:14vector<string> a; でも良い。 2次元のchar配列確保できる。
0752デフォルトの名無しさん
2011/01/08(土) 22:37:22[2] 問題文(含コード&リンク):http://codepad.org/7N0GSgtiを完成させよ
また上記のプログラムを構造体で表現しなさい
[3] 環境
[3.1] OS: Windows7
[3.2] コンパイラ名とバージョン: Microsoft Visual C++ 2008
[3.3] 言語: C++
[4] 期限:2010年 1月12日
[5] その他の制限:ありません
出力しても写真が表示されません。よろしくおねがいします。
0753デフォルトの名無しさん
2011/01/08(土) 22:42:130754デフォルトの名無しさん
2011/01/08(土) 23:35:24ごめんなさい間違えました
すいません
0755デフォルトの名無しさん
2011/01/09(日) 02:00:27コンストラクタに引数で渡せば private な変数に触る必要もない。
0756デフォルトの名無しさん
2011/01/09(日) 02:01:47そこは vector<char> だろ。 string にしてなんかいいことあるの?
むしろはじめから vector<unsigned char> じゃないのが気になる。
0757デフォルトの名無しさん
2011/01/09(日) 03:27:07それはiteratorのコンストラクタでbiginでlistPtrを初期化するってことですか?
毎回beginを使うわけではないのでそれだと無駄が出てしまいますし
std::vectorのbegin()ようにbeginIterator()で渡して初期化したいんですけど
どうにかなりませんか?
0758デフォルトの名無しさん
2011/01/09(日) 03:40:59何が無駄になると言ってるのかわからん。
> beginIterator()で渡して初期化したいんですけど
だからそうすればいいと言ってるだろう。
0759デフォルトの名無しさん
2011/01/09(日) 03:53:20このソースよみづらい・・・
0760デフォルトの名無しさん
2011/01/09(日) 04:03:25すいません>>755がよくわからないのでもう少し詳しく書いてもらえませんか
0761デフォルトの名無しさん
2011/01/09(日) 04:29:21iterator に list* を受け取るコンストラクタ iterator(list*) を追加して beginIterator() で
iterator(begin) と渡せば renketu から iterator の private な変数 listPtr に触る必要も無い。
0762デフォルトの名無しさん
2011/01/09(日) 06:22:43それをするとmainなどの外部から
renketu::iterator ite( ??? );
のような宣言をしたときにも???に勝手に値を渡せますよね?
内部実装をできるだけ隠してこのクラスの使用者はそのようなことができないようにしたいのです
何かいい方法はありませんでしょうか
0763デフォルトの名無しさん
2011/01/09(日) 06:40:27なんて馬鹿な物を作らなければ外からはrenketu<T>::listに触れられないから問題ない
0764デフォルトの名無しさん
2011/01/09(日) 12:27:030765デフォルトの名無しさん
2011/01/09(日) 20:41:230766デフォルトの名無しさん
2011/01/09(日) 20:59:29ほかに書くことがないなら↓こちらへどうぞ
http://hibari.2ch.net/test/read.cgi/tech/1187922645/
0767デフォルトの名無しさん
2011/01/09(日) 21:09:11ありがとうございます。そちらで質問してみます
0768デフォルトの名無しさん
2011/01/09(日) 22:18:47↑の配信者が作った神ゲーム↓
http://shanat.net/upload/toral.zip
0769デフォルトの名無しさん
2011/01/10(月) 00:21:34PCがぶっ壊れた
0770デフォルトの名無しさん
2011/01/10(月) 14:17:44STLとかクラスとかガンガン使うのがC++っぽいプログラミング?
0771デフォルトの名無しさん
2011/01/10(月) 14:20:33C++っぽいプログラミング と言えば、最低クラスは普通に全体的に使わないとな。
0772デフォルトの名無しさん
2011/01/10(月) 14:23:550773デフォルトの名無しさん
2011/01/10(月) 14:41:180774デフォルトの名無しさん
2011/01/10(月) 16:42:48「C+α+継承無しクラス」な状態で2,3年趣味ってた身としては。
今はSTLの簡単なところは使うけど自作クラスを継承とかやった事ないな。
0775デフォルトの名無しさん
2011/01/10(月) 18:23:40と
void Hoge();
では何が違いますか?
静的リンクライブラリ関係で意味の違い等あれば教えてください
0776デフォルトの名無しさん
2011/01/10(月) 18:50:520777デフォルトの名無しさん
2011/01/10(月) 18:56:19void Hoge(); の場合、
static void Hoge(); が void Hoge(); より前にあれば、void Hoge(); は static になる
static void Hoge(); が void Hoge(); より前になければ、void Hoge(); は extern になる
extern void Hoge(); の場合、常に extern になる
0778デフォルトの名無しさん
2011/01/10(月) 19:18:19>>777
なるほど、ほとんど違いはないのですね
ありがとうございました
0779デフォルトの名無しさん
2011/01/10(月) 21:26:22externが常に外部リンケージ?
ソース出せや
0780デフォルトの名無しさん
2011/01/10(月) 22:48:43static void f();
void g(){
extern void f(); // 内部結合
.....
}
779 のとおりだと思うけど、自分で例だして示したら
0781デフォルトの名無しさん
2011/01/10(月) 23:29:140782デフォルトの名無しさん
2011/01/10(月) 23:33:430783デフォルトの名無しさん
2011/01/10(月) 23:48:340784デフォルトの名無しさん
2011/01/11(火) 01:19:210785デフォルトの名無しさん
2011/01/11(火) 18:01:50誰が教えてくれなんて頼んだ?
お前は諮問されてるんだろうが
人様に物を教える立場か
思い上がるのも大概にしろ
0786デフォルトの名無しさん
2011/01/11(火) 18:14:37ぐらいが使えれば十分生きていけるんじゃないのかな
0787デフォルトの名無しさん
2011/01/11(火) 18:37:13はどうしてそんなに必死なの?ねぇねぇどうして?
0788デフォルトの名無しさん
2011/01/11(火) 18:59:240789デフォルトの名無しさん
2011/01/11(火) 20:26:33なにを教えたかったか見たかった
0790779
2011/01/11(火) 23:03:13ISO14882の3.5Program and linkageを読めばすぐにわかる
嘘をつかれたのでイラっとした。
さらっと嘘を回答する奴の精神構造が知りたい。
0791デフォルトの名無しさん
2011/01/11(火) 23:39:120792デフォルトの名無しさん
2011/01/12(水) 00:31:22extern で宣言されながら外部リンケージを持たない例を教えてください。
0794デフォルトの名無しさん
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 が正しいのでは
0795デフォルトの名無しさん
2011/01/12(水) 15:09:09> extern void f();
> int i;
ここで、e00.cppのfとiが隠蔽されるんじゃないか?
0796デフォルトの名無しさん
2011/01/12(水) 15:32:11i は隠蔽されて後続の extern int i で外部リンケージになるが、
f() は static void f() の宣言になって、後続の extern void f() も同じくそれを受け取り、
結局内部リンケージになるらしい。
ってことで static void f(), i: 14 が正解だな。
0797デフォルトの名無しさん
2011/01/12(水) 16:51:29void 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 が正解だと考えスレしました。
よろしく、お願いします
0798デフォルトの名無しさん
2011/01/12(水) 16:53:41797 です。すいません。簡潔にすでに答えられていたことをきずいていませんでした。
0799デフォルトの名無しさん
2011/01/12(水) 23:43:290800デフォルトの名無しさん
2011/01/13(木) 00:57:280801デフォルトの名無しさん
2011/01/13(木) 22:44:170802デフォルトの名無しさん
2011/01/13(木) 22:49:570803デフォルトの名無しさん
2011/01/13(木) 23:11:000804デフォルトの名無しさん
2011/01/13(木) 23:30:400805デフォルトの名無しさん
2011/01/14(金) 00:36:40でも糞という言葉はでてこないから、我慢しなければと思っている
0806デフォルトの名無しさん
2011/01/14(金) 00:58:37そっとしておく
0807デフォルトの名無しさん
2011/01/17(月) 01:16:09たとえば合計サイズが10Mだとしたら一回のロードで格納すむといいんですが。
0808デフォルトの名無しさん
2011/01/17(月) 01:20:20それを使わずにやるのは、そういう質問してる段階だと厳しいかも
0809デフォルトの名無しさん
2011/01/17(月) 01:43:54ifstreamからstd::getlineで一行づつ取得しつつ、ofstreamに1行づつ書き出してもらう。
for文まわすだけのようなきがする。
でも、一発で1個のブロックとして読み出すのは構造上難しい。
0810デフォルトの名無しさん
2011/01/17(月) 01:51:310811デフォルトの名無しさん
2011/01/17(月) 07:32:02{
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()を使えばコンパイラ側から見て一回の入出力に見えるんだけど
文字単位なので効率悪いし
0812デフォルトの名無しさん
2011/01/17(月) 08:34:310813デフォルトの名無しさん
2011/01/17(月) 08:42:570814デフォルトの名無しさん
2011/01/18(火) 13:46:400815デフォルトの名無しさん
2011/01/18(火) 17:06:00でも入れる価値があるかもね
0816デフォルトの名無しさん
2011/01/18(火) 19:05:07今度はfactoryが生成するインスタンスを抽象化する必要が出てきてfactoryを抽象化しようとしたら
singletonパターンの継承ではまってしまいました。
C++で上手く切り抜ける方法はないでしょうか?
singletonをやめて普通にstaticな大域変数として生成したほうがマシでしょうか?
0817デフォルトの名無しさん
2011/01/18(火) 19:11:36ビルド必要なんですか><
なんかコードだけで実現できる良い方法ない?
0818デフォルトの名無しさん
2011/01/18(火) 20:29:120819デフォルトの名無しさん
2011/01/18(火) 21:26:06なんかこう無理にパターンに当てはめようとしないで、
本当にそれが必要かどうか再検討してみては?
それでも必要なら、
もうちょっと具体的なことを書けばなにか良いきっかけが生まれるかもしれん
0820デフォルトの名無しさん
2011/01/18(火) 21:34:02書き出しはいいけど読み込む時は>>812のような事情があるため難しくない?
0821デフォルトの名無しさん
2011/01/18(火) 22:41:38作業クラスとその結果を表示するクラスがあって1対1で関連付けられています
この関連性を壊さないために、この2つのクラスを必ずFactory内部で関連付けてからインスタンスを得るようにしたいです
で、作業クラスと表示クラスの抽象化に伴ってFactoryも抽象化する必要が出てきた次第です。
0822デフォルトの名無しさん
2011/01/18(火) 23:37:40あまり理解しておらず、申し訳ないが、文字通り
Abstract Factory パターンというのがあるみたいだけど
(説明はできない)
0823デフォルトの名無しさん
2011/01/19(水) 01:31:39「factoryを抽象化しようとしたらsingletonパターンの継承ではまって」の意味がわからない。
抽象化とシングルトン化はまったく関係なくできるだろう。
困っている点についてはよくわからないが、とりあえずシングルトンパターンは捨てていい。
これは間違いない。
0824デフォルトの名無しさん
2011/01/19(水) 08:49:54肝心なところが抜けてました
Factoryが複数あると不味い状況になるので必ずインスタンスが1個であるようにsingletonを適用し
そのあと抽象化の問題が発生しました
無理に設計時に何とかするより、使用時に注意する方向の方が楽そうですね・・・
0825デフォルトの名無しさん
2011/01/19(水) 09:53:33だから、「抽象化の問題」ってなんだよ?
0826デフォルトの名無しさん
2011/01/19(水) 11:04:47SingletonにしたいのはFactoryだけって認識であってるのだろうか
継承の話は、基底クラス経由でシングルトンが破綻するので
一般にシングルトンは継承出来無かったように思うけどそれのことと予想
シングルトンにこだわらないでスレッドセーフを目指すって方向もあると思う
0827デフォルトの名無しさん
2011/01/19(水) 11:17:36class Object;
class Factory { public: virtual ~Factory() {} virtual Object create() = 0; };
Factory& MyGlobalFactory();
class ConcreteFactory : public Factory { ... };
Factory& MyGlobalFactory() { static ConcreteFactory singleton; return singleton; }
これで何か問題でもあるか?
0828デフォルトの名無しさん
2011/01/20(木) 00:05:210829デフォルトの名無しさん
2011/01/20(木) 16:52:37判定するif文ってどう書けばいいのでしょうか?
boost.mpl使わないとダメでしょうか?
0830デフォルトの名無しさん
2011/01/20(木) 21:25:14SFINAE がやりたいなら TypeTraits の is_function 使え。Boost または TR1 にある。
あるいは void* が実際に指す型で動的にディスパッチしたいなら Type Erasure でやれ。
0831デフォルトの名無しさん
2011/01/20(木) 21:37:34class B : public A{};
B b;
A* a = &b;
BをAにキャストするのを禁止する方法ってありますか?
0832デフォルトの名無しさん
2011/01/20(木) 21:56:440833デフォルトの名無しさん
2011/01/20(木) 22:08:06何言ってる? private 継承では派生クラスのポインタから基底クラスのポインタへは変換できない。
>>831
C++03 の機能では無理。
C++0x では operator static_cast のオーバーロードが可能なので、実装されていれば可能なはず。
0834デフォルトの名無しさん
2011/01/20(木) 23:12:070835デフォルトの名無しさん
2011/01/20(木) 23:13:570836デフォルトの名無しさん
2011/01/20(木) 23:21:28本質的な解決にならないうえ boost::addressof で破られる。
0837デフォルトの名無しさん
2011/01/21(金) 01:34:05これのことだよね?
http://cpplover.blogspot.com/2010/07/c.html
0838デフォルトの名無しさん
2011/01/22(土) 13:45:18struct A
{
int a;
int b;
};
char buf[ 1000 ];
A* a = reinterpret_cast<A*>( buf );
A* a = static_cast<A*>( static_cast<void*>( buf ) );
0839デフォルトの名無しさん
2011/01/22(土) 14:19:54ところで
union U {
A* a;
char buf[ 1000 ];
};
はやっていいんだっけ?^^;
0840デフォルトの名無しさん
2011/01/22(土) 14:42:250841デフォルトの名無しさん
2011/01/22(土) 15:15:21なぜですか
0842デフォルトの名無しさん
2011/01/22(土) 15:37:29やるならこう
union U {
A a;
char buf[1000];
};
0843デフォルトの名無しさん
2011/01/22(土) 15:50:07どうでもいいけど型名Aのメンバー変数がaなのにA*型の変数名にa使われるとイラっとする
0844デフォルトの名無しさん
2011/01/22(土) 15:53:400845デフォルトの名無しさん
2011/01/22(土) 15:56:590846デフォルトの名無しさん
2011/01/22(土) 17:56:12a.aとかになるから。
0847デフォルトの名無しさん
2011/01/22(土) 17:59:38名前被ると説明し辛い事もあるから場合によっては避けた方がいいはいいな
0848デフォルトの名無しさん
2011/01/22(土) 18:42:050849デフォルトの名無しさん
2011/01/23(日) 03:28:29&aと&bufが同じアドレスになることは言語仕様で保障されてないでしょ。
>>838
bufのメモリアライメントが保障されていないからキャストは不可。
bufが動的に確保した領域ならどっちでも構わないが、普通はreinterpret_cast。
だがその前に構造体のメモリイメージを保存することはやめた方がいい。
0850デフォルトの名無しさん
2011/01/23(日) 12:26:09> >>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. ]
0851デフォルトの名無しさん
2011/01/23(日) 13:49:17なら全て同じアドレスになるね。
0852デフォルトの名無しさん
2011/01/23(日) 15:53:54可能ですか?どうすればできますか?教えてください。
0853デフォルトの名無しさん
2011/01/23(日) 15:58:380854デフォルトの名無しさん
2011/01/23(日) 16:00:20本当に完全に並列なら −> 無理
OSが管理するスレッド単位の並列なら −> 可能
0855デフォルトの名無しさん
2011/01/23(日) 16:04:58メニーコアで複数個の無限ループさせるのと同じ要領でいいよ。
今こうしている間にも起動しているほとんどのアプリケーションが無限ループを行っているよ。
0856デフォルトの名無しさん
2011/01/23(日) 16:22:360857デフォルトの名無しさん
2011/01/23(日) 17:30:01while(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;
}
}
0858デフォルトの名無しさん
2011/01/23(日) 17:35:16なんで
while(1) { func_0(); func_1(); func_2(); }
じゃないの?
0859デフォルトの名無しさん
2011/01/23(日) 17:45:01略すならcur
0860デフォルトの名無しさん
2011/01/23(日) 18:24:340861デフォルトの名無しさん
2011/01/23(日) 18:34:470862デフォルトの名無しさん
2011/01/23(日) 18:37:210863デフォルトの名無しさん
2011/01/23(日) 19:55:440864デフォルトの名無しさん
2011/01/23(日) 21:26:30放送には載せられないよね
0865デフォルトの名無しさん
2011/01/23(日) 22:58:08>>857は説明が足りないだけで、別スレッドがnow_threadの値を変更することを考慮してるからだよ。
0866デフォルトの名無しさん
2011/01/24(月) 12:48:140867デフォルトの名無しさん
2011/01/26(水) 10:01:37swap(a,b);
と
using namespace std;
swap(a,b);
は同じですか?
0868デフォルトの名無しさん
2011/01/26(水) 16:42:57template <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); // エラー オーバーロード関数の呼び出しを解決できない
}
0869デフォルトの名無しさん
2011/01/26(水) 18:14:020870デフォルトの名無しさん
2011/01/27(木) 00:51:41ボタン一つで文字列を全部外部ファイルに外出しにできたりする
JavaDocで関数仕様の資料作成も一瞬だしVisualStudioって馬鹿じゃねーのってレベル
0871デフォルトの名無しさん
2011/01/27(木) 03:01:21Q6600+4GBでさくさく動くなら移行しようかしら…。
0872デフォルトの名無しさん
2011/01/27(木) 03:02:26後者は、なんでC++スレでJavaDoc?って気がしなくも。
VisualStudioの機能の数パーセントぐらいしか使ったことがなさそうなのはわかった。
0873デフォルトの名無しさん
2011/01/27(木) 19:02:44まあjavadocはdoxygenで困らんよね
0874デフォルトの名無しさん
2011/01/27(木) 21:53:40今のJavaクライアントはJITコンパイラが優秀になってるのでAthlon64 4000+程度でもサクサクだ
0875デフォルトの名無しさん
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;
}
0876デフォルトの名無しさん
2011/01/27(木) 23:28:42> while(i= 0){
while(i != 0){
0877デフォルトの名無しさん
2011/01/28(金) 07:01:56ありがとうございます。助かりました。
0878デフォルトの名無しさん
2011/01/28(金) 14:51:020879デフォルトの名無しさん
2011/01/28(金) 16:16:520880デフォルトの名無しさん
2011/01/28(金) 16:35:52何で標準エラー出力に出力するかわかる?
0881デフォルトの名無しさん
2011/01/28(金) 16:42:43そうとも言い切れません。
>>880
わかりません。
0882デフォルトの名無しさん
2011/01/28(金) 17:16:26お前、エラーと分からないような文をエラーで吐くのか!
無能のレッテルを貼られるぞw
0883デフォルトの名無しさん
2011/01/28(金) 20:57:36他の要因でプログラムが落ちる前に出来るだけはき出しておきましょうって事だろ
0884デフォルトの名無しさん
2011/01/28(金) 21:23:05言い出すときりがないんだけどね
0885デフォルトの名無しさん
2011/01/29(土) 01:49:590886デフォルトの名無しさん
2011/01/29(土) 16:15:270887デフォルトの名無しさん
2011/01/29(土) 23:54:500888デフォルトの名無しさん
2011/01/29(土) 23:58:470889デフォルトの名無しさん
2011/01/30(日) 00:01:150890デフォルトの名無しさん
2011/01/30(日) 00:02:23apiでもっと細かいのがあるけど、ググるのがめんどうだ。
0891デフォルトの名無しさん
2011/01/30(日) 00:07:090892デフォルトの名無しさん
2011/01/30(日) 03:26:24QueryPerformanceFrequency
QueryPerformanceCounter
0893デフォルトの名無しさん
2011/01/30(日) 05:00:13どうしてもしたければタイマー精度を変更する
0894デフォルトの名無しさん
2011/01/30(日) 10:18:39最近落ち目だぜww
0895デフォルトの名無しさん
2011/01/30(日) 10:23:210896デフォルトの名無しさん
2011/02/01(火) 06:23:360897デフォルトの名無しさん
2011/02/01(火) 17:09:32むかしどこかで書いたようなきがしたのですが・・・。
0898デフォルトの名無しさん
2011/02/01(火) 17:11:43struct{
void operator()()
{
}
}Func;
0899デフォルトの名無しさん
2011/02/01(火) 17:19:44int i;
func(i);
0900デフォルトの名無しさん
2011/02/01(火) 17:20:15int Func(){
auto Fn = [](int Args)->int{
return 0;
};
return Fn(0);
}
って感じか。
0901900
2011/02/01(火) 17:21:130902デフォルトの名無しさん
2011/02/01(火) 18:18:21>>899
>>900
どもです、0x系ではないコンパイラだとやっぱりstructの中にかくことになりますか・・・。
ありがとうございました。
0903デフォルトの名無しさん
2011/02/01(火) 21:31:37int Func(){
return [](int Args)->int{
return 0;
}(0);
}
これでおk
0904!omikuji !dama
2011/02/01(火) 22:01:21ちょっとキモイな。。。
0905デフォルトの名無しさん
2011/02/02(水) 12:32:41たとえば、1ギガのファイルがあったとき、それをメモリかファイルに展開せずに
部分読み出来るものです。
0906デフォルトの名無しさん
2011/02/02(水) 13:09:43仕様読んで自前でやれって言われてたよ
0907デフォルトの名無しさん
2011/02/02(水) 13:58:560908905
2011/02/02(水) 14:25:05ヘッダにzip、zip64、LZMAなどあって、その方言ような誤差の吸収や複数圧縮形式あり
自作するのは辛いですが。ないですか。
0909デフォルトの名無しさん
2011/02/02(水) 18:12:38日本語でおk
0910デフォルトの名無しさん
2011/02/02(水) 21:09:240911デフォルトの名無しさん
2011/02/03(木) 00:20:56メモリに展開せずに、どうやって部分読みできると思うんだ?
まさかとは思うが、レジスタに展開しろとでも言うのか?
0912905
2011/02/03(木) 07:41:490913デフォルトの名無しさん
2011/02/03(木) 08:59:47圧縮前の内容は読めないけどな
0914905
2011/02/03(木) 10:54:300915デフォルトの名無しさん
2011/02/03(木) 11:03:27ttp://www.icsharpcode.net/OpenSource/SharpZipLib/
0916デフォルトの名無しさん
2011/02/03(木) 11:39:59zip書庫のヘッダ形式のLZMAってなんじゃいな
0917デフォルトの名無しさん
2011/02/03(木) 19:56:250918デフォルトの名無しさん
2011/02/03(木) 20:06:470919デフォルトの名無しさん
2011/02/04(金) 08:50:04方法をいくつか紹介してください。
0920デフォルトの名無しさん
2011/02/05(土) 23:16:27{
boo() : a(){}
int a[100];
};
これで配列aが0で初期化されるのは正しい動作なんでしょうか?
0921デフォルトの名無しさん
2011/02/05(土) 23:17:160922デフォルトの名無しさん
2011/02/05(土) 23:35:24デフォルト初期化が行われて 0 になるので正解。
0923デフォルトの名無しさん
2011/02/06(日) 01:59:40以下の質問では、より良い標準的な方法があったらそれも教えてください(例えば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*)にキャストしてバイト数指定でいいですよね? 強制的にリトルエンディアンですか?
0924デフォルトの名無しさん
2011/02/06(日) 02:16:500 については知らない。
1 について、構造体のメンバ間や終端には実装依存のパディングが入ることがある。
ただし実際には理由無くパディングを入れることはまず無いので、 sizeof や
offsetof と assert あるいは BOOST_STATIC_ASSERT を組み合わせてレイアウトを
確認しながら使うことはできる。
2, 3 4 について、整数型の表現形式は実装依存。ただし unsigned char については
そのビット数ぶん隙間無く詰まっていることが保証されている。移植性を最大にするなら
すべて unsigned char のレベルで処理することになる。つまり大きな整数型のまま
memcpy() するのではなく、想定しているバイト並びを明示的に組み立てるのがいい。
移植性は必要なくて速度が必要だと言うなら、そのことをコメントで記載したうえで
特定の実装に依存してしまうのもいい。
5 について、要求に応じて決めればいい。エンディアンとか気にするなら↑に戻る。
0925923
2011/02/06(日) 02:37:13ありがとうございます。
1, では変数を個別に書き出すことにします。
2,3,4,5について、気持ちが悪いので実装に依存しない方法で書くことにします。
>想定しているバイト並びを明示的に組み立てるのがいい。
どういうコードになりますか?
memcpy(&unsignedchar, &largeinteger, sizeof(unsigned char));
このときlargeintegerのどの部分から取り出されるんですか?
これが実装依存だとどうしようもない気がするんですが。
0926デフォルトの名無しさん
2011/02/06(日) 03:02:22> memcpy(&unsignedchar, &largeinteger, sizeof(unsigned char));
unsignedchar が 8 ビット、 largeinteger が 32 ビットだとして、
リトルエンディアンで保存したいなら
unsignedchar = largeinteger & 0xff;
ビッグエンディアンで保存したいなら
unsignedchar = (largeinteger & 0xff000000) >> 24;
という感じになるかな。
0927デフォルトの名無しさん
2011/02/06(日) 03:08:28uint8_t byte_array[8]; // リトルエンディアンで格納される
for(int i = 0 ; i < 8 ; i ++)
{
byte_array[i] = (uint8_t)((largeinteger >> i*8) & 0xFF);
}
0928デフォルトの名無しさん
2011/02/06(日) 10:52:22MSTHMLのライブラリを使っているのですが、問題がおきました。
質問はここでいいでしょうか?
0929デフォルトの名無しさん
2011/02/06(日) 11:15:52ttp://127.0.0.1:8823/thread/http://hibari.2ch.net/test/read.cgi/tech/1289292155
0930デフォルトの名無しさん
2011/02/06(日) 11:17:030931デフォルトの名無しさん
2011/02/06(日) 11:29:20http://hibari.2ch.net/test/read.cgi/tech/1145189322
0932デフォルトの名無しさん
2011/02/06(日) 18:20:06delete x;
はメモリ確保→開放をポインタでやってるわけだよね
int x = 10;
delete &x;
とは書けないの?
0933デフォルトの名無しさん
2011/02/06(日) 18:27:18int x = 10;みたいに静的に確保されたメモリには使えない。
っていうか、使う意味がない。
int x = 10;はスコープから抜ければ勝手に破棄されるから。
0934デフォルトの名無しさん
2011/02/06(日) 18:33:060935デフォルトの名無しさん
2011/02/06(日) 18:43:48> 開放をポインタでやってるわけだよね
どこからそんな変な知識を得たんだろう...。
0936デフォルトの名無しさん
2011/02/06(日) 18:44:420937デフォルトの名無しさん
2011/02/06(日) 18:47:59そうじゃない実装はほとんどないだろうけど。
0938デフォルトの名無しさん
2011/02/06(日) 18:48:06大抵2冊目の本にしかその辺のことがかかれてない
0939932
2011/02/06(日) 18:52:22とりあえずヒープとスタックでググります
0940925
2011/02/06(日) 21:31:29ありがとうございます。
>>927で実装してみたところ、上手くいってる……と思ったら、
いくつかある変数のうち1つだけが値がおかしいのでよく調べたら、
wikipediaによればC++ではシフト元を超えてシフトする場合の動作は未定義とのことで。
iの値は、元が64ビットの保証がない時はsizeof使うってことでいいんでしょうか?
0941デフォルトの名無しさん
2011/02/06(日) 21:41:26cstdint や stdint.h が使えれば簡単に保証できるんだけどね。
無いなら numeric_limits 使って確認、かなぁ。
0942デフォルトの名無しさん
2011/02/06(日) 21:43:40sizeof( int64_t )が4という値を返してきたんですがどうしてですか?8byteじゃないんですか。
0943デフォルトの名無しさん
2011/02/06(日) 21:46:36単にバグってるか、 CHAR_BIT が 16 だとか。
0944デフォルトの名無しさん
2011/02/06(日) 22:00:390945デフォルトの名無しさん
2011/02/06(日) 22:07:270946デフォルトの名無しさん
2011/02/06(日) 22:11:43sizeof は char いくつ分かを返すんだよ。
0947デフォルトの名無しさん
2011/02/06(日) 22:14:56typedef long int64_t;
typedef unsigned long long uint64_t;
となっています。バグですか?
0949デフォルトの名無しさん
2011/02/06(日) 22:25:24uint64_t と int64_t で long long と long が違うのか。バグっぽいな。
BOOST_STATIC_ASSERT((sizeof(int64_t) * CHAR_BIT) == 64); あるいは assert(...) してみて、
失敗したら確実にバグ。
0950デフォルトの名無しさん
2011/02/06(日) 23:07:090951デフォルトの名無しさん
2011/02/07(月) 00:54:11CHAR_BITはchar型のbit数を定義してあり、ひいては、1byteが何bitであるかをあらわしている。
0952デフォルトの名無しさん
2011/02/07(月) 15:18:10ありがとう、わかりやすい解説でたすかりました。
0953デフォルトの名無しさん
2011/02/07(月) 17:10:17{
public:
test(char* a) : pchar = a {};
char& operator[](size_t i)
{
return pChar[i];
}
}
test temp = test("aaa");
temp[0] = 'b';
上記コードの最後で書き込みアクセス違反となってしまいます。
[]のオーバーロード方法が間違っているのでしょうか?
よろしくお願いします。
0954デフォルトの名無しさん
2011/02/07(月) 17:12:29test(char* a) : pchar = a {};
↓
public:
char* pChar;
test(char* a) : pChar(a) {};
でした
0955デフォルトの名無しさん
2011/02/07(月) 17:24:17char p[] = "aaa"の違い分かってないでしょ
コンストラクタでメモリ確保してそこに渡された文字列をコピーしないとだめ
0956デフォルトの名無しさん
2011/02/07(月) 17:38:07仰せのとおり同じものと認識していましたorz
ありがとうございました
0957デフォルトの名無しさん
2011/02/07(月) 20:23:09char p[] = "aaa"の違い分かってないでしょ
はい。中身は同じですよね。で、どう違うんですか?
0958デフォルトの名無しさん
2011/02/07(月) 20:26:480959デフォルトの名無しさん
2011/02/07(月) 20:34:24は、staticに4byteを確保しておいて(最後の1byteは'\0')、そのポインタだけを得る。
静的領域へのポインタだから、今のメモリ管理システムだと書き換えできない。
…でも昔はできた気がする。
char p[] = "aaa";
は、ヒープに必要なサイズのメモ地(この場合は4byte)確保して、そこに"aaa"をコピーする。
ヒープだから書き換えできる。
0960デフォルトの名無しさん
2011/02/07(月) 20:35:02p[1] = 'b';
0961デフォルトの名無しさん
2011/02/07(月) 21:03:15>静的領域へのポインタだから、今のメモリ管理システムだと書き換えできない。
多分メモリ保護のこと言ってるんだろうけど環境によっては ROM 上になるべ。
いずれにしろ未定義動作だ。
>は、ヒープに必要なサイズのメモ地(この場合は4byte)確保して、そこに"aaa"をコピーする。
>ヒープだから書き換えできる。
スタックか静的領域か、いずれにしろヒープには取らないだろう、普通。
0962デフォルトの名無しさん
2011/02/07(月) 23:04:49クラスのメンバなら普通にヒープになる場合もあるがなー
0963デフォルトの名無しさん
2011/02/07(月) 23:09:060964デフォルトの名無しさん
2011/02/07(月) 23:18:51ヒープはメモリのプールでプログラマの権限で管理する。
スタック自体はヒープに取られることもありうる。
0965デフォルトの名無しさん
2011/02/07(月) 23:24:500966デフォルトの名無しさん
2011/02/07(月) 23:30:28関数型言語ならCPUスタックは使わずにヒープで実装されてるイメージがある
しかしヒープ自体についてはあまりよくわかってないので教えて
0967デフォルトの名無しさん
2011/02/07(月) 23:33:010968デフォルトの名無しさん
2011/02/07(月) 23:36:440969デフォルトの名無しさん
2011/02/07(月) 23:37:00だから関数型言語の実装者もスタックが使えるなら使いたいと思ってる筈。
ただ、継続とか、プログラムの実行制御を言語の機能として持っていると、
それがなかなか難しいみたいな感じなのかな。
0970デフォルトの名無しさん
2011/02/07(月) 23:39:44自分で brk して取ってくるのがヒープ
プロセスの起動時に勝手に brk して貰えるのがスタックとかテキストエリアとか
0971デフォルトの名無しさん
2011/02/07(月) 23:49:58brk?
0972デフォルトの名無しさん
2011/02/07(月) 23:53:37古いUnix系のシステムコールだよ。今でも使えるOSはそれほど多くない。
0973デフォルトの名無しさん
2011/02/07(月) 23:56:580974デフォルトの名無しさん
2011/02/08(火) 00:01:16コンパイルオプションで与えるスタックサイズが
自動でbrkされるサイズなのか?
0975デフォルトの名無しさん
2011/02/08(火) 00:08:23ulimit とかが無いシステムなのか
0976デフォルトの名無しさん
2011/02/08(火) 01:03:230977デフォルトの名無しさん
2011/02/08(火) 01:10:21ごちゃ混ぜにしちゃったのかな?
普段からスタックを食いつぶす様なコードを書いていたら俺も不安になるかもなあ。
不思議な世界もあるもんだ。
0978デフォルトの名無しさん
2011/02/08(火) 01:46:38コンストラクタの初期化子にその構造体を明示的に記述した場合、
構造体の中身が全て0で初期化される。
初期化子に書かなかった場合、0で初期化されない。
という認識で間違いないでしょうか。
http://codepad.org/1lm8NweW
試したらちゃんと0になってくれて、合ってると思うのですが、
ネット上にあるコード見てると、ZeroMemoryとかmemsetを使ってる人が多くて、不安になったので…
0979デフォルトの名無しさん
2011/02/08(火) 01:50:41テンプレートクラスのテンプレート引数に関係ない部分を処理するので、
いちいちこの関数に対してテンプレート引数を要求したくありません
何か良い実装法はないですか?
0980デフォルトの名無しさん
2011/02/08(火) 02:40:39その認識で合ってる。不安なら規格を確認しれ。
0981デフォルトの名無しさん
2011/02/08(火) 03:41:33逆にSTLでない標準ライブラリって何があるん
でしょうか。
0982デフォルトの名無しさん
2011/02/08(火) 03:47:16stdでテンプレート以外の奴が大体そうじゃね
0983デフォルトの名無しさん
2011/02/08(火) 03:48:390984デフォルトの名無しさん
2011/02/08(火) 03:52:59stringは確かbasic_string<char>とかで、結局はいずれも、内部では
STLを使って型を特定したバージョンにすぎないのかも知れんな。
0985デフォルトの名無しさん
2011/02/08(火) 04:50:19だいぶ適当だなwまあいいけど
0986デフォルトの名無しさん
2011/02/08(火) 08:03:160987デフォルトの名無しさん
2011/02/08(火) 11:05:180988デフォルトの名無しさん
2011/02/08(火) 12:04:23初期化のときだけforループでまわしてconst_castして初期化、という方法くらいしか思い浮かばないのですが、
何かconst_castみたいな気持ち悪いもの使わない方法はありませんか?
0989デフォルトの名無しさん
2011/02/08(火) 12:15:41STLと呼ばれるためには単にテンプレートを採用しているだけでなく
algorithmと協調動作するために一定の要件がある。
0990デフォルトの名無しさん
2011/02/08(火) 12:19:370991デフォルトの名無しさん
2011/02/08(火) 12:34:16それって別にboost::multi_arrayだけでなくて通常のクラス配列にも成り立つ事だよね
リファレンス変数とかconst変数の初期化を行いたい時はどっちにしろクラスの数分
コンストラクタを呼び出さなくてはいけないのでは?
デフォルト値ならともかく
0992デフォルトの名無しさん
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;
}
0993デフォルトの名無しさん
2011/02/08(火) 12:48:08非constなコンテナにforループで代入して、それを使ってconstなコンテナを初期化して
コンパイラの最適化を祈る
未来にはnested_collectionコンセプトみたいなのができるてるといいな
0994デフォルトの名無しさん
2011/02/08(火) 13:11:33間違った操作をする可能性はないか?
まあCもC++も「プログラマはコンピュータに何をさせようとするか全て知っている」
という前提だけどな
0995デフォルトの名無しさん
2011/02/08(火) 13:13:000996デフォルトの名無しさん
2011/02/08(火) 13:15:48collectionで一気にコンストラクタを呼び出す機能とかは確かに欲しいな
0997デフォルトの名無しさん
2011/02/08(火) 13:25:32非constなコンテナにforループで代入して返却するstaticメソッドなら作ったりしたなぁ
0998デフォルトの名無しさん
2011/02/08(火) 14:23:33C++相談室 part88
http://hibari.2ch.net/test/read.cgi/tech/1297142195/
0999デフォルトの名無しさん
2011/02/08(火) 15:34:181000小倉優子 ◆YUKOH0W58Q
2011/02/08(火) 15:35:01( ・∀・) 1000ならジュースでも飲むか
( )
し─J
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。