C++相談室 part83
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2010/08/04(水) 18:34:23ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part82
http://pc12.2ch.net/test/read.cgi/tech/1275477613/
0002デフォルトの名無しさん
2010/08/04(水) 18:35:04[C++ FAQ]
http://www.parashift.com/c++-faq-lite/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
http://www.cppreference.com/ (英語)
http://www.cppreference.com/wiki/jp/ (↑の日本語訳だけどまだ未完)
[禿 Stroustrup]
http://www.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/08/04(水) 18:35:52[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/08/04(水) 18:37:04amazon.com C,C++関連書籍
http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
The C++ Programming Language
http://www.amazon.com/exec/obidos/ASIN/0201700735/
http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
http://www.amazon.com/exec/obidos/ASIN/0201824701/
http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
http://www.amazon.com/exec/obidos/ASIN/0201379260/
http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
http://www.amazon.com/exec/obidos/ASIN/0201924889/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
http://www.amazon.com/exec/obidos/ASIN/020163371X/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/0201615622/
http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/020170434X/
Exceptional C++ Style
http://www.amazon.com/exec/obidos/ASIN/0201760428/
0005デフォルトの名無しさん
2010/08/04(水) 18:38:36Effective 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/
■長いソースを貼るときはここへ。■
http://codepad.org/
0006デフォルトの名無しさん
2010/08/04(水) 18:55:43環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0007デフォルトの名無しさん
2010/08/05(木) 00:46:27置換した箇所を取得する方法を教えてください。
0008デフォルトの名無しさん
2010/08/05(木) 08:31:51aho.cxx:12: error: cannot dynamic_cast ‘this’ (of type ‘const class Base* const’) to type ‘const class Derived* const’ (source type is not polymorphic)
と出ます。基底クラス内で、thisをアップキャストすることは不可能でしょうか。
実際にはDerived1やDerived2のような継承クラスがいくつかあり、Baseは抽象クラスです。
Base::Foo()は、どのクラスに継承されたかを調べるメソッドです。
Fooをそれぞれのクラスでオーバーライドするべき、というのは理解した上での質問です。
class Derived;
class Base {
public:
int Foo() const;
};
class Derived : public Base {
};
int Base::Foo() const {
const Derived* const p = dynamic_cast<const Derived* const>(this);
if(p){
return 1;
}
return 0;
}
0009デフォルトの名無しさん
2010/08/05(木) 08:35:440010デフォルトの名無しさん
2010/08/05(木) 08:40:55ありがとうございます。解決しました。
virtual int Foo() const;
にすれば良いようです。
0011デフォルトの名無しさん
2010/08/06(金) 09:16:06Baseクラスが派生されること前提にしてるならデストラクタをvirtualすればいいと思う
というかするべきだと思う
0012デフォルトの名無しさん
2010/08/06(金) 10:36:59Aを再利用する為に、キー値を使って
std::mapに入れて管理したいと思います。
Aがmapにあれば更新され、無ければ追加されます。
Aは複数あるので、そのまま使っていくとmapのサイズが
無尽蔵に大きくなってしまいます。
そこで、mapのサイズに上限を設けて、上限を超えたら
古いAから削除する実装にしたいと思います。
std::map< key, item > map;
std:dequeue< map::iterator > queue;
こういう実装を考えたのですが、Aが追加ではなく更新された場合、
queueの中ほどに入っているiteratorを削除して、おけつにpushしなければならず
効率が悪く感じました。もっと良い実装案はないでしょうか?
0013デフォルトの名無しさん
2010/08/06(金) 11:41:04使った要素を毎回先頭につなぎなおす
0014デフォルトの名無しさん
2010/08/06(金) 12:05:45std::list< item > map;
std::map< key, list::iterator > map;
これでいいんじゃね?
0015デフォルトの名無しさん
2010/08/06(金) 18:55:08言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
京都大学霊長類研究所
0016デフォルトの名無しさん
2010/08/07(土) 14:47:47foo:bar
の違いってなんでしたでしょうか
0017デフォルトの名無しさん
2010/08/07(土) 14:58:59bit field だっけ
あんまり使わんな
0018デフォルトの名無しさん
2010/08/07(土) 15:16:110019デフォルトの名無しさん
2010/08/07(土) 16:54:460020デフォルトの名無しさん
2010/08/07(土) 17:16:55無理なんじゃないでしょうか。
regex_searchでなんとかするしかなさそう。
0021デフォルトの名無しさん
2010/08/10(火) 05:53:49括弧よりもstatic_castの方がいいよね?
0022デフォルトの名無しさん
2010/08/10(火) 07:13:070023デフォルトの名無しさん
2010/08/10(火) 16:49:45std:vectorをわざわざつかわないで単純に配列そのまま使うのがいいの?
0024デフォルトの名無しさん
2010/08/10(火) 17:15:57お好きにどうぞ。
固定長の配列にstd::vectorを使うのは余計なコストが掛かりますが、
可変長になったときにも融通が利きます。
が、ベクタ演算とstd::vectorを混乱したまま理解していないかちょっと心配。
0026デフォルトの名無しさん
2010/08/10(火) 22:08:15CALL/RETでのコストなんてわずかなもんだしパイプラインも途切れないよ
x86が条件付きCALL命令を持ってないのは今から考えるととても幸いしている
0027デフォルトの名無しさん
2010/08/11(水) 02:06:030028デフォルトの名無しさん
2010/08/11(水) 09:20:48なんでCISCの話してんの?
あんたは化石か?
0029デフォルトの名無しさん
2010/08/11(水) 13:04:52配列ならそんなことない
0030デフォルトの名無しさん
2010/08/11(水) 13:07:010031デフォルトの名無しさん
2010/08/11(水) 13:07:440032デフォルトの名無しさん
2010/08/11(水) 14:05:040033デフォルトの名無しさん
2010/08/11(水) 14:23:54std::vectorは[]演算子で直接3番目にアクセスできるし、イテレーターでも+=で3番目に直接飛べるし
0034デフォルトの名無しさん
2010/08/11(水) 14:24:020035デフォルトの名無しさん
2010/08/11(水) 14:56:090036デフォルトの名無しさん
2010/08/11(水) 16:05:03std::listじゃあるまいし、std::vectorはランダムアクセス可能。
実装にもよるが、大概 operator[]なら配列と変わらんぞ
003836
2010/08/11(水) 16:07:2729あてでよかった…
0039デフォルトの名無しさん
2010/08/11(水) 19:48:250040デフォルトの名無しさん
2010/08/11(水) 20:08:07えぴすてーめーのページなら移転しているよ。
ttp://episteme.wankuma.com/stlprog/index.html
あーでも、wankumaがまた落ちているような希ガス。
0041デフォルトの名無しさん
2010/08/12(木) 14:24:56「AT&TのBjarne StroustrupがC++をこの世に送り出しました。」
この世を去ったかと思った。
0042デフォルトの名無しさん
2010/08/12(木) 14:58:290043デフォルトの名無しさん
2010/08/14(土) 00:49:10なんで1byteなんですか?
0044デフォルトの名無しさん
2010/08/14(土) 01:51:01§9.3
3 Complete objects and member subobjects of class type shall have nonzero size.
つまりクラスのサイズは最低1なければならない。これは別クラスかどうかアドレスで区別
出来るように設けられた規則である。当然空のクラスもサイズは最低1になる。
0045デフォルトの名無しさん
2010/08/14(土) 13:50:04あとからまとめてつけれませんか?
0046デフォルトの名無しさん
2010/08/14(土) 14:02:000047デフォルトの名無しさん
2010/08/14(土) 14:18:130048デフォルトの名無しさん
2010/08/14(土) 14:45:0610年前はきちんとやってたけど5年くらい前から馬鹿らしくなって手を抜いてる。
社内でネームスペース付けてる奴自体少数派だし、困ったという話は聞かない。
しかし外販用やフリーで配布するライブラリなら最初から付けておかないと後悔すると思う。
boostがネームスペース使ってなかったら死ぬと思う。
それよりマイクロソフトのwindows.hにあるマクロ類が、
ネームスペースで解決不能なので困る。
0049デフォルトの名無しさん
2010/08/14(土) 20:39:28C++ Glossary
ttp://www.kmonos.net/alang/cpp/glossary.html
> EBO (Empty Base Optimization)
> 空の基底クラスの最適化。
> メンバ変数を一個も持たない、空のクラス、というものが出来ることがあります。
> しかし空のクラスであっても、アドレスは一意に決めなくてはならないので、
> sizeof( EmptyClass ) は 0 にはなりません。 EmptyClass arr[100];
> assert( &arr[0] != &arr[1] ); // アドレスは違ってて欲しい単独で使う時にはこの無駄は仕方のないところですが、
> 例えばこの空クラスから他のクラスを派生するときは、EmptyClass の分のサイズは 0 にして、派生クラスのメンバ変数の分だけを確保する、
> という最適化が可能です。 C++の規格で許されているこの最適化のことを、Empty Base Optimization と呼びます。
0050デフォルトの名無しさん
2010/08/14(土) 21:17:04> ネームスペースをつけずに作ってあとで後悔することってありますか?
グローバルじゃなければ最低限のマナーを守っていると
考えていいと思う。
グローバル名前空間に放り投げるのは思いやりがないよ。
> あとからまとめてつけれませんか?
なにを無茶おっしゃいますか
0051デフォルトの名無しさん
2010/08/14(土) 22:05:41以下のコードを実行させると。。。
enum index {
first,
second,
third,
end_of_index
};
index & operator +=( index & dst, const index & src ) {
reinterpret_cast< int & >( dst ) += src;
assert( ( first <= dst ) && ( dst < end_of_index ) );
return ( dst );
}
index operator +( const index & left, const index & right ) {
return ( index( left ) += right );
}
int main( int argc, char * argv[] )
{
index a, b = first, c = second;
a = b + c;
}
b の中身も変わってしまうのは何故なんだぜ?
0052デフォルトの名無しさん
2010/08/14(土) 22:12:55index operator +( const index & left, const index & right ) {
index t = left;
return (t += right );
}
でいいんじゃない?
0053デフォルトの名無しさん
2010/08/14(土) 22:12:57コンパイルエラーのコードだからじゃね?
g++とComeau C/C++では普通に通らなかったよ?
"ComeauTest.c"
error: no operator "+=" matches these operands
operand types are: index += const index
return ( index( left ) += right );
^
1 error detected in the compilation of "ComeauTest.c".
In strict mode, with -tused, Compile failed
Hit the Back Button to review your code and compile options.
Compiled with C++0x extensions enabled.
0054デフォルトの名無しさん
2010/08/14(土) 22:24:50いや、こうならないように回避する方法はいくらでもあるけど
このコードでこういう結果になる理由が知りたいんだよね
>>53
Visual C++ 2008 では error も worning も一切出ずにビルドできるんだよね
っていうかこのコードってどっか間違ってる?
005553
2010/08/14(土) 22:28:59俺がはったエラーメッセージを読まねぇのか読めねぇのかしらんが
ちょいと自分で考えておくんなさいまし。
g++でもComeau C/C++でも通らないんだからそのコードは誤り。
とくにstrictのComeau C/C++で通らないって事は
ほぼ間違いなく、誤りがあるってこと。
そして誤りがあるコードは未定義の動作。
005651
2010/08/14(土) 22:45:56index( left )
のところで index の一時変数が作られて operator += に渡されて
っていう動作を期待してたんだけど、正規の C++ の仕様ではないのかな?
Visual C++ 2008 のデバックモードでステップで追っていくと
期待したような動作をしてるんだけど b の値が変わるんで何故なのかなと思ったもんでね
0057デフォルトの名無しさん
2010/08/14(土) 22:48:30005851
2010/08/14(土) 22:58:10index( left ) ではクラスのように一時的なインスタンスは作られないってことかね
0059デフォルトの名無しさん
2010/08/14(土) 23:01:23回避する方法が思いつくなら原因もわかるだろ。
みれば一発じゃん。
0060デフォルトの名無しさん
2010/08/14(土) 23:02:280061デフォルトの名無しさん
2010/08/14(土) 23:04:43006251
2010/08/14(土) 23:06:14特にこのコードが必要なわけじゃなくてどこまで変則的なコードが通るものか今いろいろ試しててね
その中で見つけたヤツなのよ
0063デフォルトの名無しさん
2010/08/14(土) 23:07:18C型のキャストの存在する悪がここに見参。
0064デフォルトの名無しさん
2010/08/14(土) 23:08:50お前の都合なんか知ったことかよ。
0065デフォルトの名無しさん
2010/08/14(土) 23:10:03・・・何だっけ?
コンパイラはそう言う最適化をして良いだとかなんだとかあったよな。
0067デフォルトの名無しさん
2010/08/14(土) 23:23:22ところでこいつマルチポストだった。
せっかく応えた俺の誠意を踏みにじりやがって。
なんか言えよお前。
006851
2010/08/14(土) 23:24:27ああそうか
C型のキャストが適用されてるわけか
それで const 属性が外れてしまうと。。。
やっぱり enum じゃクラスのように一時インスタンスは作られないんだね
>>61
>>66
質問の意味を汲み取っていただいてありがとうございます
0069デフォルトの名無しさん
2010/08/14(土) 23:35:54,,.----、
i | | | _____
/ | | | / ヽ
/ / | | | ^o^ | <ネームスペースをつけずに作ってあとで後悔することってありますか?
/ / 人ヽ、 !ー!\_/ヽ、
/ /ノ,,,,,,ヽ、ヾ .|ヾ ゞ / !ヽ`ヽ- 、
/ //、 `,ヽ .| ヾ /ヾ ヾ `ー-- 、
/ // ` '´ ,ヽ||´~~ヽ ヽ、, '"´``.、 .ヽ
| ((ー‐ ● ---.||" ,, i i;;;;" ゛;;;;i |
| ヾ、 ,. ´, 、 || ,/ |ll!!!^!!!lllノ .ノ
ヾ i lヾ i ヾ ,/ |"" ,, 'ヽ ,,, / |
| l l;;;;;`;,,,, ゞ-‐´/ ,,| ゞ`ヾ ヾ |
/ ̄\
| | <お前は マルチポスト です
\_/
_| |_
ttp://hibari.2ch.net/test/read.cgi/tech/1280950209/66
ttp://hibari.2ch.net/test/read.cgi/tech/1280914463/45
せっかく応えた俺の誠意を踏みにじりやがって。
なんか言えよお前。
0070デフォルトの名無しさん
2010/08/14(土) 23:36:18なんか
0071デフォルトの名無しさん
2010/08/15(日) 00:03:21007251
2010/08/15(日) 00:41:01最初に↓のコードを書き込んでから質問すればよかったですね
007351
2010/08/15(日) 00:41:42{
public:
enum hoge { first, second, third, end_of_index };
index() {}
index( hoge src ) : num( src ) {
assert( ( first <= num ) && ( num < end_of_index ) );
}
index & operator +=( const index & src ) {
num += src.num;
assert( ( first, <= num ) && ( num < end_of_index ) );
return ( * this );
}
private:
int num;
};
index operator +( const index & left, const index & right ) {
return ( index( left ) += right );
}
int main( int argc, char * argv[] )
{
index a, b = index::first, c = index::second;
a = b + c;
}
007451
2010/08/15(日) 00:42:29何故 enum の演算子のオーバーライドの時はそうならないのか疑問だったもので
ユーザー定義型の enum ならクラスのように一時インスタンスが作られるのだろうと
思い込んでました^^
0075デフォルトの名無しさん
2010/08/15(日) 02:01:26もっと勉強した方がいいよ
0076デフォルトの名無しさん
2010/08/15(日) 09:26:39何で誰も気づかないんだよ。
0077デフォルトの名無しさん
2010/08/15(日) 09:39:17おお、それはかの有名なVC独自仕様ってやつじゃないですか。
0078デフォルトの名無しさん
2010/08/15(日) 16:37:04っていう話なんだからそこは別にいいんじゃないの
0079デフォルトの名無しさん
2010/08/15(日) 21:44:21クラスstaticなmapにthisポインタとデータをマッピングして代用してるんだけどあんましスマートじゃない気がする
0080デフォルトの名無しさん
2010/08/15(日) 22:53:440081デフォルトの名無しさん
2010/08/15(日) 23:13:13ただしusingは使わないものとします。
namespace ThisIsALongNamespaceName
{
// うんたんうんたん
}
0082デフォルトの名無しさん
2010/08/15(日) 23:17:200083デフォルトの名無しさん
2010/08/15(日) 23:19:530084デフォルトの名無しさん
2010/08/15(日) 23:25:39残念
>>83
正解
0085デフォルトの名無しさん
2010/08/17(火) 18:17:060086デフォルトの名無しさん
2010/08/17(火) 18:42:020087デフォルトの名無しさん
2010/08/17(火) 18:46:04やろうとしていることとクラス化している範囲が
無理なく対応しているかを見るべき
これでいいんだ!
という場合もある
0088デフォルトの名無しさん
2010/08/17(火) 23:18:050089デフォルトの名無しさん
2010/08/17(火) 23:56:410090デフォルトの名無しさん
2010/08/18(水) 00:00:36const参照渡しと値渡しは速いほうにすれば問題ない。
0091デフォルトの名無しさん
2010/08/18(水) 06:44:04ユーザ定義型はconst参照渡し、組み込み型は値渡し
0092デフォルトの名無しさん
2010/08/18(水) 17:47:13foo.bar(x)
を
extern "C"
するときの名前のつけかたの慣習みたいなものはないのでしょうか?
extern "C" foo_bar(x)
とかでしょうか
0093デフォルトの名無しさん
2010/08/18(水) 19:15:310094デフォルトの名無しさん
2010/08/18(水) 20:56:44処理系によってちがう。
0095デフォルトの名無しさん
2010/08/18(水) 20:59:53仮に「慣習」があってもその処理系限り
あきらめろ
0096デフォルトの名無しさん
2010/08/18(水) 21:02:130097デフォルトの名無しさん
2010/08/18(水) 21:05:000098デフォルトの名無しさん
2010/08/19(木) 01:50:350099デフォルトの名無しさん
2010/08/19(木) 11:41:14http://codepad.org/8gr5sRPs
の
struct Data d;
push_back(d)
では、Data のコピーコンストラクターが呼ばれていると考えていいのでしょうか?
これをキャッチしたいのですが、どう書けばいいのでしょうか?
0100デフォルトの名無しさん
2010/08/19(木) 13:42:52POD型だから本当に呼ばれてるかって言われると微妙なんだけど
一応呼ばれてると言えなくもない
検出するにはコピーコンストラクタを書けばいいだろう
キャッチしたいってのはコピーコンストラクタが呼ばれてるのを確認したいってことだよな?
0101デフォルトの名無しさん
2010/08/19(木) 14:10:57push_back()での追加はオブジェクトのコピーがされるって言いたかっただけで
0102デフォルトの名無しさん
2010/08/19(木) 16:09:47メモリコピーになるんだから、それが呼ばれているよ
0103デフォルトの名無しさん
2010/08/19(木) 17:53:54って関数をまたでジャンプできないのでしょうか
0104デフォルトの名無しさん
2010/08/19(木) 17:58:26もしできたとしたら地獄だろうな
0105デフォルトの名無しさん
2010/08/19(木) 18:08:54と、ひたすら逃げ回っていたのが構造化プログラミング
ちゃんと秩序を作れば悪くはないというのがアクセス制御や例外処理
もっとも goto という綴りは使っていないが
0106デフォルトの名無しさん
2010/08/19(木) 18:11:22setjmpとlongjmpでだとできるらしいけど
010799
2010/08/19(木) 18:16:19つまり、push_back() では新しくオブジェクトが生成されて、コピーが行われいる、ということですね。
それがわかれば、納得です。c 上がりの身としてはちょっと抵抗がありますが。
コメントありがとうございました。
0108air
2010/08/19(木) 18:16:430109デフォルトの名無しさん
2010/08/19(木) 18:42:19Cでも構造体を引数で渡すと同じようにコピーされるじゃん。
0110デフォルトの名無しさん
2010/08/19(木) 19:42:44011199
2010/08/19(木) 20:34:44次のような構造体も POD型といえるのでしょうか?
struct data {
list<int> l;
}
http://codepad.org/L7bt2ZlW
うーむ。
#昔は(win32は今でも)構造体はポインタで渡していたからなあ
0112デフォルトの名無しさん
2010/08/19(木) 20:42:370113デフォルトの名無しさん
2010/08/19(木) 20:49:05すると、>>111 は POD 型ではないのですが、それでも、
container.push_back(struct-non-POD);
とすれば、non-POD がまるままコピーされるようなんです。(http://codepad.org/L7bt2ZlW)
そんなものだ、といわれれば、それまでなんですけれども。
うーむ。
0114デフォルトの名無しさん
2010/08/19(木) 21:04:200115デフォルトの名無しさん
2010/08/19(木) 21:28:590116デフォルトの名無しさん
2010/08/19(木) 21:38:05listがPODじゃ無いから違うだろう
0117デフォルトの名無しさん
2010/08/19(木) 22:58:54push_backの定義は
void push_back( const T& val );
だから引数に関しては参照渡しになっている。
コピーコンストラクタが実行されるのはコンテナに入れるとき。
0118デフォルトの名無しさん
2010/08/20(金) 01:01:22そんなものです。(コピー)コンストラクタについて理解した方が良い。
0119デフォルトの名無しさん
2010/08/20(金) 03:18:09MYSQL Connecter C 6.0.2というのとMYSQL Connecter C++ 1.0.5というのが見つかったのですが、
ぐぐってもWin32コンソールアプリケーションからDLLを使った例しかでてきません。
http://ameblo.jp/nana-2007-july/entry-10086686152.html
ここに書いてある事を参考に試してみたのですが、DLLからDLLを呼び出せないのか、
そのDLLを利用したアプリケーションが関数を使おうとすると吹っ飛びます。
MYSQL Connector Cの方はスタティックライブラリが存在しないみたいなので、
スタティックライブラリを利用して今現在のDLLに結合?してしまいたいのですが
DLLからスタティックライブラリすることって可能でしょうか?
それかヘッダとソースコードだけでMYSQLに接続できるようなライブラリがあれば
それを使いたいのですが、そのようなものはあるでしょうか?
C++版の方はスタティックライブラリはあるのですが、
http://forums.mysql.com/read.php?167,240030,240030#msg-240030
この人同じエラーがでて、フォーラムでも問題が解決していません。
また
http://blog.ulf-wendel.de/?p=215
こちらを参考に、試しにWin32コンソールアプリケーションで作成してみると、
スタティックライブラリを利用してるのに、libmylib.dllを必要となりまったく意味がありません。
0120デフォルトの名無しさん
2010/08/20(金) 04:44:11Accelerated C++に進む前に、基本をちゃんとやっとけってレベルだったんだな
0121デフォルトの名無しさん
2010/08/20(金) 06:21:58たぶん素材(ソースとかコンパイル方法とかの情報)全部出してもお前には無理っぽいから
面倒なので無視することにした
0122デフォルトの名無しさん
2010/08/20(金) 07:11:10そうですか・・・残念です。
0123デフォルトの名無しさん
2010/08/20(金) 07:54:41頼むから別人に成り済ましてくれ
0124デフォルトの名無しさん
2010/08/20(金) 09:04:030125デフォルトの名無しさん
2010/08/20(金) 09:21:25答えられないなら無理すんなよw
0126デフォルトの名無しさん
2010/08/20(金) 12:13:180127デフォルトの名無しさん
2010/08/20(金) 14:34:300128デフォルトの名無しさん
2010/08/20(金) 23:59:090129デフォルトの名無しさん
2010/08/22(日) 14:24:150130デフォルトの名無しさん
2010/08/22(日) 19:26:390131デフォルトの名無しさん
2010/08/22(日) 19:39:070132デフォルトの名無しさん
2010/08/22(日) 19:42:360133デフォルトの名無しさん
2010/08/22(日) 19:52:550134デフォルトの名無しさん
2010/08/22(日) 19:55:230135デフォルトの名無しさん
2010/08/22(日) 21:01:180136デフォルトの名無しさん
2010/08/22(日) 21:01:58C++の公開されてるライブラリって少なくないですかね?
Windows開発でも屍のMFC/ATLぐらいしかなくメインはWinAPIか魔術DirectXですし
MacはObjectiveCですし
UNIX/LinuxはCメインですし
パット思い浮かぶのはQtぐらいしかないんですが
C++のライブラリってあんまりないもんなんですか?
業務とかで自分たちでCの関数をラッパーして作るのが主流?
0137デフォルトの名無しさん
2010/08/22(日) 21:04:000138デフォルトの名無しさん
2010/08/22(日) 21:09:36そうじゃなくてもっと専門に特価したネットワークライブラリ(上級層 HTTP/SMTP)とか画像処理とか
サウンド処理とかあってもいいんじゃないかと。
0139デフォルトの名無しさん
2010/08/22(日) 21:10:16ならもうくんなよなwww
0140デフォルトの名無しさん
2010/08/22(日) 21:14:12それだけ知っててなぜ無駄口をたたいているヒマがある?
どれでもいいからがっぷり四つに組んでみろ
歩兵用の兵器って認識ねえならやめとけ
0141デフォルトの名無しさん
2010/08/22(日) 21:23:36____
/ \ /\ C++は歩兵用の兵器キリッ
. / (ー) (ー)\
/ ⌒(__人__)⌒ \
| |r┬-| |
\ `ー'´ /
ノ \
/´ ヽ
| l \
ヽ -一''''''"~~``'ー--、 -一'''''''ー-、.
ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
____
/_ノ ヽ、_\
ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ
/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒)
| / / / |r┬-| | (⌒)/ / / // だっておwwwwwwwwwwwwww
| :::::::::::(⌒) | | | / ゝ :::::::::::/
| ノ | | | \ / ) /
ヽ / `ー'´ ヽ / / バ
| | l||l 从人 l||l l||l 从人 l||l バ ン
ヽ -一''''''"~~``'ー--、 -一'''''''ー-、 ン
ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
0142デフォルトの名無しさん
2010/08/22(日) 21:31:050143デフォルトの名無しさん
2010/08/22(日) 21:36:100144デフォルトの名無しさん
2010/08/22(日) 21:52:08Qt4
0145デフォルトの名無しさん
2010/08/22(日) 22:55:330146デフォルトの名無しさん
2010/08/23(月) 12:19:47いつも使うならラッパー書いても良いけど別に書く必要も無い。
「C++で公開されてるライブラリって少ない」ってC++使う大きな理由に気づいてないような
この前 Magick++使ったけど,これは C++専用 API もあるね(いろいろな言語
のAPIあるけど)
C++ネイティブのAPIが少ないと感じるとしたらそこまで需要が無い場合が多い
からじゃないかな
fftw3 とかC++で使ったけど普通に使えて特にラッパー書こうという気もおきなかった
0147デフォルトの名無しさん
2010/08/23(月) 12:26:48fftwはplanを作る段階で全てを決定しておく必要があるから余り問題にはならないね。
私はラッパこそ作らないけど、fftwを使うクラスを作ってデストラクタでplanの破棄をするように気をつけてるよ。
GUI系のようにプロパティが沢山あって途中で(変えられる|変えたい)場合はラッパ作っておくと楽だけど。
0148air
2010/08/23(月) 14:08:44そこで疑問が出たのですが解決していただきたいです。
・出力先はどこになるのか?
・今回用いるCSVファイルは容量が大きく開くことができません。
出力することにより開けるようになるのでしょうか?
0149デフォルトの名無しさん
2010/08/23(月) 14:17:47日本語でおk
0150デフォルトの名無しさん
2010/08/23(月) 14:26:100151デフォルトの名無しさん
2010/08/23(月) 14:27:250152デフォルトの名無しさん
2010/08/23(月) 14:32:52・出力したい場所は自分できめる。
・出力したら何MBになったのか書く。
0153デフォルトの名無しさん
2010/08/24(火) 05:23:31virtualでない(オーバーライドできない)関数を
同じ名前で定義するコトって、何か名前がありますか?
単純にクラスの型によってオーバーロードっぽい動作をするだけですが…
class CBase {
virtual void func1(){}
void func2(){}
};
class CSub {
void func1(){} // ←オーバーライド
void func2(){} // ←?
};
0154153
2010/08/24(火) 05:24:47class CBase {
virtual void func1(){}
void func2(){}
};
class CSub : public CBase {
void func1(){} // ←オーバーライド
void func2(){} // ←?
};
0155デフォルトの名無しさん
2010/08/24(火) 05:49:010156デフォルトの名無しさん
2010/08/24(火) 07:32:55virtualじゃなくてもオーバーライドは出来る
0157デフォルトの名無しさん
2010/08/24(火) 09:06:170158デフォルトの名無しさん
2010/08/24(火) 09:14:400159デフォルトの名無しさん
2010/08/24(火) 09:23:010160デフォルトの名無しさん
2010/08/24(火) 09:24:040161デフォルトの名無しさん
2010/08/24(火) 09:27:17規格上の用語として
0162デフォルトの名無しさん
2010/08/24(火) 10:36:44ちなみにhideは隠ぺい。
0163デフォルトの名無しさん
2010/08/24(火) 10:46:08英語→日本語→英語
で完全に元の文になる訳じゃなし
0164デフォルトの名無しさん
2010/08/24(火) 14:31:28> virtualじゃなくてもオーバーライドは出来る
俺もそうだと思っていたが、規格の上ではそうじゃないらしい。
0165デフォルトの名無しさん
2010/08/24(火) 14:45:50virtual なものをオーバーライドするとポリモーフィズム動作してくれる
ってことで内科医
0166デフォルトの名無しさん
2010/08/24(火) 14:48:22けど調べたら違うみたいね
Meyers は redefine と書いてるし「再定義」位が良いのかな
0167デフォルトの名無しさん
2010/08/24(火) 14:53:580168デフォルトの名無しさん
2010/08/24(火) 16:18:140169デフォルトの名無しさん
2010/08/24(火) 17:40:36いや、そもそも
> virtual じゃないものをオーバーライドする
ということができない。
polymorphism以外の点ではまるでそっくりな記法と結果を期待できるが、
規格の上ではそれをoverrideと呼ばないってこと。
俺は以前はpolymorphismが機能しないoverrideと
機能するoverrideがあるのかと思っていたが、
そうじゃなかった、overrideという用語の定義自体に
すでにvirtualな物にたいして使いpolymorphismが機能することが
前提になっていた。
0170デフォルトの名無しさん
2010/08/24(火) 18:04:150171デフォルトの名無しさん
2010/08/24(火) 18:10:15ココはど素人の集まりかよ
0172デフォルトの名無しさん
2010/08/24(火) 18:14:08> とりあえずオーバーライドがどんな機能なのかもう一度勉強してこい
機能というか、用語の定義を、でしょ。
隠蔽とごっちゃになっている人が多いんだろう。
確か・・・polymorphicに使える点以外では振る舞いは同じだよな?
0173デフォルトの名無しさん
2010/08/24(火) 18:18:29いや機能を理解してればごっちゃにならないから
振る舞いが一緒とか寝言は寝ていえってレベル
0174デフォルトの名無しさん
2010/08/24(火) 18:22:22馬鹿でしょお前、マジで。
0175デフォルトの名無しさん
2010/08/24(火) 19:27:400176デフォルトの名無しさん
2010/08/24(火) 21:17:210177デフォルトの名無しさん
2010/08/24(火) 21:53:180178デフォルトの名無しさん
2010/08/24(火) 21:58:37{
int a;
};
void Print( A& a ){ printf( "%d\n", a.a ); }
A a;
Print( a );
Print( A() );
ってやると結果が
2008736204
0
になるんですけどなんで違うんですか。
0179デフォルトの名無しさん
2010/08/24(火) 22:05:30初期化してないからゴミがはいってるんじゃね。
0180デフォルトの名無しさん
2010/08/24(火) 22:09:54すでに>>155, >>162で答えられてるけど 隠ぺい(hide)
JIS X3014 23ページより...
3.3.7 名前は,入れ子になった宣言領域 又は 派生クラスの中で,それと同じ名前を明示的に宣言する
と 隠ぺい(hide) することができる (10.2 参照)。
0181デフォルトの名無しさん
2010/08/24(火) 22:11:450182デフォルトの名無しさん
2010/08/24(火) 22:17:33そもそも最後のはコンパイルエラー
0183デフォルトの名無しさん
2010/08/24(火) 22:53:380185153
2010/08/24(火) 23:35:10ありがとうございました!
なんて言ったらいいのかわからずもやもやしていたので、すっきりしました!!
>>180
定義されているところまでありがとうございます!!
>>155-177
思ってもみない方向に議論が…ι
0186デフォルトの名無しさん
2010/08/24(火) 23:49:12上は未初期化で↓はデフォコン初期化なんじゃね
下でも何もしないコンストラクタ書くと同じ結果になった
0187デフォルトの名無しさん
2010/08/25(水) 00:25:54Print( a );
Print( A() );
0188デフォルトの名無しさん
2010/08/25(水) 00:41:22>隠蔽とごっちゃになっている人が多いんだろう。
>確か・・・polymorphicに使える点以外では振る舞いは同じだよな?
スマソ、隠蔽とオーバーライドを比べてるのかと早とちりした。
0189デフォルトの名無しさん
2010/08/25(水) 01:22:03隠蔽とオーバーライドを比べてるとしか読めないんだけど、
ほんとは何と何の「振る舞いが同じ」って言ってんの?
0190デフォルトの名無しさん
2010/08/25(水) 02:26:110191デフォルトの名無しさん
2010/08/25(水) 13:26:26というか実際 分かってないで使っているのが
案外私以外にもいるって知ってちょっと安心。
0192デフォルトの名無しさん
2010/08/25(水) 13:31:13このことを理解できてない奴が多いだけ
0193デフォルトの名無しさん
2010/08/25(水) 13:52:41まとめるとこうですの
class A
{
public:
virtual ~A();
virtual void override();
void overload();
};
class B :public A
{
public:
virtual void override(); //virtualはなくても同じ
void overload();
};
void hoge()
{
B b;
A& a=b;
a.override(); //B::override()が呼ばれる
a.overload(); //A::overload()がよばれる
b.override(); //B::override()が呼ばれる
b.overload(); //B::overload()が呼ばれる
}
0194デフォルトの名無しさん
2010/08/25(水) 14:10:220195191
2010/08/25(水) 14:13:55ありがとうございます。
> void overload();
は、オーバーロードと呼ぶのですか?
それとも隠蔽と呼ぶのですか??
オーバーロードとは
class X
{
public:
void overload(int);
void overload(char);
void overload(const X&);
> };
こういう物だと思っておりましたが。
0196デフォルトの名無しさん
2010/08/25(水) 14:14:170198デフォルトの名無しさん
2010/08/25(水) 14:45:440199デフォルトの名無しさん
2010/08/25(水) 14:58:06何を訳のわからんことを書いてるんだ
お前が他人に教えるなんて100年早いわ
0200デフォルトの名無しさん
2010/08/25(水) 15:01:120201デフォルトの名無しさん
2010/08/25(水) 15:03:43お前も黙れ、>>172 は間違っている
関数テーブルが変わってくるので、当然振る舞いも変わる
つかこの辺のことをわかってないくせいに、よくも他人のことをああだだこうだ言えるよな
知らなかったしても、少しは調べてから発言しろよ
0202デフォルトの名無しさん
2010/08/25(水) 15:21:24> 「仮想関数でないとオーバーライドはできない」
これは本当?
規格にはそんなこと書いてないと思うんだけど。どこに書いてあるの?
「仮想関数を使うとオーバーライドできる」というようなことは書いてあるけど。
見落としてるのかな。
まあ、「オーバーライド」という言葉は仮想関数に関するときしか使わないというのには同意するけど。
>>195
>> void overload();
>は、オーバーロードと呼ぶのですか?
>それとも隠蔽と呼ぶのですか??
別にその関数宣言自体を「隠ぺい」(名詞)と呼ぶ訳じゃないでしょ。
「関数B::overloadは関数A::overloadを隠ぺいする」と表現する。
「関数B::overloadは関数A::overloadの隠ぺいである」とは普通言わないんじゃない?
なんか一連の議論を見てると言葉の使い方が気持ち悪くて仕方ないんだよね。
0203デフォルトの名無しさん
2010/08/25(水) 15:24:28オーバーロード→王→覆う→世界を覆う共通認識→共通→共通の名前
オーバーライド→井戸→土地に付属→代々継承される→継承
0204デフォルトの名無しさん
2010/08/25(水) 15:46:19>これは本当?
オーバーライドは仮想関数テーブルにある関数へのポインタを書き換えるということだよ。
上書きするからオーバーライド。
仮想関数でなければテーブル自体が存在しないんだよ。
存在しない物をのをどうやってオーバーライドするというんだ。
お前は何をオーバーライドするつもりなんだ。
別の場所に新たに作成されるのがオーバーライドのはずがない。
>同意するけど。
お前の同意などいらん。あほか。
0205デフォルトの名無しさん
2010/08/25(水) 15:48:120206デフォルトの名無しさん
2010/08/25(水) 15:52:03あと隠蔽の意味全然わかってないな。
隠蔽というのは別々に存在している状態で、手前の奴が後ろの物を隠した状態のことだよ。
手前にあるから後ろが見えないだけ。だから工夫すればアクセスも可能。
対して上書きは元の物が上書きされて消失した状態。
0207デフォルトの名無しさん
2010/08/25(水) 16:03:44どんな工夫か知らないけど
0208デフォルトの名無しさん
2010/08/25(水) 16:10:14ヘー君が使ってるメモリは上書きしても前のデータが読めるんだ。
そりゃ凄いな。
0209デフォルトの名無しさん
2010/08/25(水) 16:13:380210202
2010/08/25(水) 16:20:37いや、だからあなたの言うオーバーライドという言葉の定義はどこで仕入れた知識なのかを聞いているんだけど。
規格上は残念ながらあなたの言うようには定義されていないんだよ。
「オーバーライド」という単独の言葉がどこまでの範囲を指すかは、かなり曖昧に見える。
たとえばコンパイラ内のシンボルテーブルの上書き、
という意味で使ってはいけない理由を示してもらえないと、>>192は
嘘だったことになるんだけど。
仮想関数の仕組みは百も承知。
>>192
>「仮想関数でないとオーバーライドはできない」
これは「仮想関数でないと(仮想関数テーブル内のポインタを)オーバーライドできない」の省略だったってこと?
>>206
隠ぺいって規格の3.3.7に書かれている名前の隠ぺいのことだよね?
なんで分かってないと思うのか分からん。
0211デフォルトの名無しさん
2010/08/25(水) 16:37:12>たとえばコンパイラ内のシンボルテーブルの上書き、
>という意味で使ってはいけない理由を示してもらえないと、
おいおい「シンボルテーブルの上書き」ってw
サブクラスに同名関数があるとこういうことが起こると思ってるの?
もちろんこんなことは起こらないよね。
要するに上書きされる物が無いのにオーバーライドとは言わないだろ。
逆に聞きたいが、お前は何が上書きされると思ってるんだ。
0212デフォルトの名無しさん
2010/08/25(水) 16:39:29仮想関数だったものは上書きされてるからアクセスできない。
仮想関数でなければ、例えばキャストすればアクセスできる。
0213デフォルトの名無しさん
2010/08/25(水) 16:47:12例えばa.A::override();とかは駄目なの?
0214202
2010/08/25(水) 17:00:07やれやれ、本当に何を聞かれているのか分かっていないんだな。
まあいいや。
×「仮想関数でないとオーバーライドはできない」
○「仮想関数は自分自身や基底クラスの同じ名前で同じ仮引数並びを持つメンバ関数をオーバーライドする」
ということで。
0215デフォルトの名無しさん
2010/08/25(水) 17:02:20C++ 英語版 wiki に overrided が使用されている。
もちろん Virtual member functions とセット。
引用元が
Stroustrup, Bjarne (2000). The C++ Programming Language
となっている。この人は C++ の開発者。
この本が C++ の発信源なんだよ。
現状の世の中のC++の情報もこれに反することは書いてないはずだけどね。
けど、こういう厳密な定義を持ち出さずとも、
上書きされる物がないのに、上書きというのはおかしいだろう。
仮想関数の基本動作が理解できていればわかるはずだけどね。
0216デフォルトの名無しさん
2010/08/25(水) 17:06:000217デフォルトの名無しさん
2010/08/25(水) 17:07:06違う。
◎「仮想関数でないとオーバーライドはできない」
仮想関数でないと関数テーブルが作成されないので、オーバーライドを実現するすべがない
?「仮想関数は自分自身や基底クラスの同じ名前で同じ仮引数並びを持つメンバ関数をオーバーライドする」
日本語になってない。仮想関数はオーバーライドされる方でしょ。
0218デフォルトの名無しさん
2010/08/25(水) 17:17:47それとも上書きされるものがなくても、オーバーライドと言っても構わないという考え?いうはおかしくないという考えなんでしょうか?
0219デフォルトの名無しさん
2010/08/25(水) 17:17:54いいから、規格書の10.3を読めよ。
仮想関数が仮想関数を上書きするんだよ。
だいたいオーバーライドってのはオブジェクト指向プログラミングの
メソッドオーバーライディングのことを指しているんであって、
仮想関数テーブルの上書きはまた別な話だろう。
0220デフォルトの名無しさん
2010/08/25(水) 17:40:40お前こそ読み直せよ!!!
仮想関数は上書きされる方と書いてあるぞ。お前の読解力は問題ありすぎだわ。
お前は、
>簡便性のため、すべての仮想関数は、自分自身を上書きするものとする。
という一文の意味を取り違えて解釈してるだけじゃんwwwwwwwwwwwww
「簡便性のため」や「自分自身」という意味を考えろよ。
仮想関数をオーバーライドするときに、オーバーライドする方は仮想関数である必要ないだろ。
一体どのレベルから理解できてないんだ????
0221デフォルトの名無しさん
2010/08/25(水) 17:44:04>メソッドオーバーライディングのことを指しているんであって、
>仮想関数テーブルの上書きはまた別な話だろう。
C++ではメソッドオーバーライディングを実現する唯一の方法が
仮想関数テーブルの上書きでしょう。お前が別の話だと妄想してるだけ。
0222デフォルトの名無しさん
2010/08/25(水) 17:47:18いや、よく読んでよ。
> Derived::vfは,(virtualと宣言されていなくても)仮想となり, Base::vfを上書きする。
とかかれてるでしょ?
上書きされる方も当然仮想関数だし、上書きする方も当然仮想関数なんだよ。
ところで何で終始そんなにカッカしてるの?
0223デフォルトの名無しさん
2010/08/25(水) 17:48:55「別の話」と書いたのは不適切だったかもね。
「単に実装の詳細の話」とすべきだったかな。
0224デフォルトの名無しさん
2010/08/25(水) 17:57:14> 仮想関数テーブルの上書きでしょう。
なんて言っちゃうところも無知をさらけ出しているよね。
0225デフォルトの名無しさん
2010/08/25(水) 18:05:24>上書きされる方も当然仮想関数だし、上書きする方も当然仮想関数なんだよ。
違う。対象が仮想関数だから、仮想関数となる(変化する)ということ。
上書きする方は仮想関数である必要はない。
これはvtableに格納されるんだから、動作的にはこれでいい。
何れにしても、オーバーロードする方は仮想関数である必要はない。
0226デフォルトの名無しさん
2010/08/25(水) 18:09:10そう思うのは、お前がオーバーライドを
オーバーロードや隠蔽と混同している証拠だね。
隠蔽なら他の方法があるけど、オーバーライドは vtable を使った方法しかない。
0227デフォルトの名無しさん
2010/08/25(水) 18:10:16>何れにしても、オーバーロードする方は仮想関数である必要はない。
何れにしても、オーバーライドする方は仮想関数である必要はない。
の間違いだわ。
0228デフォルトの名無しさん
2010/08/25(水) 18:14:340229デフォルトの名無しさん
2010/08/25(水) 18:18:29実装と規格の話題がごっちゃになってるよ
そろそろ整理した方がいいんじゃね
0230デフォルトの名無しさん
2010/08/25(水) 18:37:06俺は実装、規格に共通したことしか言ってない。
「仮想関数でないとオーバーライドはできない」
C++ の実装、規格ともにそう。
C++の開発者がそう規定しており、自身の本にもそう書いてある。
世の中のC++書籍やまともなサイトでもそう記述されている。
202の馬鹿が彼方此方かき集めて支離滅裂なことを言ってるだけ。
0231デフォルトの名無しさん
2010/08/25(水) 18:44:07規格ってvtableについても書いてあるの?
0232デフォルトの名無しさん
2010/08/25(水) 18:46:00仮想関数でないとオーバーライドできない
これ循環証明だろ
0233デフォルトの名無しさん
2010/08/25(水) 19:04:59証明?
定義だよ。C++ の開発者がそう定義して、
C++の普及に伴い世の中浸透して、規格化もされているし、当然実装もそうなっている。
世の中の書籍にもそう書いてあるし、ネットで調べてももちろん同じ結果。
本当に 「仮想関数でないとオーバーライドはできない」 を否定したいのなら、
反例を一つ上げるだけの話だよ。それすらできないんだから。
要するに初心者がオーバーロードや隠蔽とごっちゃにしてるだけの話なんだよ。
0234デフォルトの名無しさん
2010/08/25(水) 19:17:17> 定義だよ
ああ、そりゃ悪かった
C++ の開発者ってパゲのことか?
言い出しっぺではあるが今そのタイトルで呼ぶと色んな人に失礼だと思うよ
規格の話をしているなら、実装や書籍やネットを持ち出す必要はないね
仮想関数に近いことは他の手段でもできるんだが
おたくさんが規格と用語にこだわるようなので今は言わないでおく
0235デフォルトの名無しさん
2010/08/25(水) 19:44:53規格だけの話はしていない。
>規格の話をしているなら、実装や書籍やネットを持ち出す必要はないね
規格だけでなく、実装、書籍、ネット全てがそういう認識と言うこと。
そももC++の規格なんて、C++が実装されて、世の中に普及して、書籍も沢山でたその後だよ。
規格なんかよりずーっと前からオーバーライドはプログラマーの共通認識なわけ。
規格書読んでC++の習得する奴なんかいないだろう。初心者なんだから規格を気にする前に、
書籍とかネットでの共通認識を素直に取りこめばいいんだよ。固定観念持ちすぎなんだよ。
>仮想関数に近いことは他の手段でもできるんだが
>おたくさんが規格と用語にこだわるようなので今は言わないでおく
こういう捻くれた解釈はやめなさい。違うものは違うんだよ。隠蔽は隠蔽でしかない。
自分の感覚を世の中に合わせる努力も必要だよ。
0236デフォルトの名無しさん
2010/08/25(水) 20:15:05「オーバーライドならば仮想関数である」
を
「仮想関数でないならばオーバーライドではない」
と言い換えてるだけなんだぜ
0237デフォルトの名無しさん
2010/08/25(水) 22:28:25例のあの人がまとめてくれてるぜ
きっとお前らが情けないからだな。
俺ホモだけど
0238デフォルトの名無しさん
2010/08/25(水) 22:48:530239デフォルトの名無しさん
2010/08/25(水) 22:57:060240デフォルトの名無しさん
2010/08/25(水) 23:35:45今C++0xの本を執筆しようとしてなんとかと言ってたようだが詳細はしらね
0241デフォルトの名無しさん
2010/08/26(木) 01:31:37> If a virtual member function vf is declared in a class Base and in a
> class Derived, derived directly or indirectly from Base, a member
> function vf with the same name, parameter-type-list (8.3.5),
> cv-qualification, and refqualifier (or absence of same) as Base::vf is
> declared, then Derived::vf is also virtual (whether or not it is so
> declared) and it /overrides/ Base::vf.
上記 /overrides/ は、これが用語の定義であることを示す斜体表記になって
いる。( 1.3 p2 )
日本語によるまとめ。
http://cpplover.blogspot.com/2010/08/overloadoverridehiding.html
上記により、「仮想関数でないとオーバーライドはできない」は本当。
ただしこれが本当であることを示すのに vtable 云々(実装の詳細の話)を
持ち出す必要もないし(ここまでの残念な流れを見れば明らかなように)不適切。
0242デフォルトの名無しさん
2010/08/26(木) 02:25:100243デフォルトの名無しさん
2010/08/26(木) 02:44:210244デフォルトの名無しさん
2010/08/26(木) 02:44:22>Derived classの非virtualなメンバー関数に対し、同名のBase classの非virtualなメンバー関数がある場合、
>それは単に、名前を隠しているだけである。
これDerived classは非virtualかどうかって関係無いよね?
0245デフォルトの名無しさん
2010/08/26(木) 10:29:510246デフォルトの名無しさん
2010/08/26(木) 10:50:02ttp://www.geekpage.jp/programming/winsock/
こことか
0247デフォルトの名無しさん
2010/08/26(木) 15:08:280248デフォルトの名無しさん
2010/08/26(木) 15:20:35データ数に上限のない普通のテーブルなら作れるのか?
話はそれからだ
0249デフォルトの名無しさん
2010/08/26(木) 16:07:340250デフォルトの名無しさん
2010/08/26(木) 16:22:06普通のテーブルというのはハッシュ化してないテーブルという意味だよ。
日本語にすると表とか配列のこと。
可変長の配列を作る方法がわからないのか、
それともハッシュ化するところで躓いてるのかがわからんのだよ。
0251デフォルトの名無しさん
2010/08/26(木) 16:23:52サイズが変わるとハッシュ関数も変わっちゃうから
出来ないのは当たり前じゃないですか。
0252デフォルトの名無しさん
2010/08/26(木) 16:39:13縦方向の話じゃなくて、横。。。って言っても伝わらないか。
ハッシュ関数が同じ値を返してくる場合があるよね、
それをどう処理するのがハッシュテーブルを作る上で大変なところ。
ハッシュ値が重複したものに対しての受け皿は可変になるよね。
扱えるデーター数が無制限ということなんだから、この部分も無制限にする必要があるでしょ。
それとも、ハッシュ値が重複しても知らないよって話?上書きでOK?
それなら固定長の配列用意して、適当な index を返すハッシュ関数作ればいいだけ。
ハッシュ関数の作り方がわからないってことか?
0253デフォルトの名無しさん
2010/08/26(木) 16:42:29一言ですむことじゃないですか。
なぜそうしないんですか?
ちなみに他のスレで解決したのでもういいです。
有難うございました。
0254デフォルトの名無しさん
2010/08/26(木) 16:48:02それは失礼したね。
どのレベルで質問してるのかがこっちには分からなかったのだよ。
とりあえず、解決できてよかったね。
0255デフォルトの名無しさん
2010/08/26(木) 23:11:55> ちなみに他のスレで解決したのでもういいです。
なんでそんなマルチポスト野郎が偉そうなんだろうか。
0256デフォルトの名無しさん
2010/08/27(金) 01:08:170257デフォルトの名無しさん
2010/08/27(金) 13:08:190258デフォルトの名無しさん
2010/08/27(金) 19:38:24> ちなみに他のスレで解決したのでもういいです。
この決めぜりふカッコイイな、ガイキチ。
0259デフォルトの名無しさん
2010/08/27(金) 19:47:08ttp://ja.wikipedia.org/wiki/%E8%8A%BD%E6%AE%96%E5%AD%A4%E8%99%AB
予後
現在のところ、芽殖孤虫に感染した患者を救命できたという報告はない。
うぎゃああああああ
0260デフォルトの名無しさん
2010/08/27(金) 21:57:120261デフォルトの名無しさん
2010/08/28(土) 01:36:59「かつて、本田技研の創業者、本田宗一郎氏が技術支援の為に、台湾と韓国へ
技術支援に行きました。暫くして、台湾から、「日本と同じものが作れるようになりました。
是非見に来てください!」と連絡が入りました。そして暫くして韓国からも連絡が。「日本と
同じものが作れるようになりました。もう来なくてもいいです。」
そして韓国は本田とのライセンス契約を一方的に解消し、エンジンからデザインまで全くの
コピー品を”韓国ブランド”として販売を始めました。
本田宗一郎氏は大変失望してこう話したそうです ”韓国とは絶対に関わるな”」
>>253とは絶対に関わるな
0262デフォルトの名無しさん
2010/08/28(土) 03:41:090263デフォルトの名無しさん
2010/08/28(土) 03:48:57●宮崎牛口蹄疫蔓延
●宮崎牛全滅
いまココ
●韓国牛輸入
0264デフォルトの名無しさん
2010/08/28(土) 07:56:120265デフォルトの名無しさん
2010/08/28(土) 08:48:170266デフォルトの名無しさん
2010/08/28(土) 20:19:23下3桁を抽出するにはどうするのが良いでしょうか?
現状、整数型変数に÷1000した値を入れ、それを1000倍して
差し引いて生成しているのですが、もっとシンプルにできるのでしょうか?
0267デフォルトの名無しさん
2010/08/28(土) 20:24:020268デフォルトの名無しさん
2010/08/28(土) 20:24:19%
基本的な演算子ぐら知っとけ
0269デフォルトの名無しさん
2010/08/28(土) 20:31:32ありがとうございました・・orz
0270デフォルトの名無しさん
2010/08/28(土) 20:32:52それでいい
%は構文糖衣
0271デフォルトの名無しさん
2010/08/28(土) 20:36:10構文糖って、どのへんがどのように?
0272デフォルトの名無しさん
2010/08/28(土) 20:41:080273デフォルトの名無しさん
2010/08/28(土) 21:21:16普通、÷ 1000 した時点で剰余も求まるよな。
なのに乗算と減算を追加する処理系って果たして存在するのかどうか。
0274デフォルトの名無しさん
2010/08/28(土) 21:25:030275デフォルトの名無しさん
2010/08/28(土) 22:50:460276デフォルトの名無しさん
2010/08/28(土) 23:08:07void func(/* lambdaを引数にとる関数の書き方を教えてください */);
0277デフォルトの名無しさん
2010/08/28(土) 23:09:23template<typename T> で T とか、 std::function<void ()> とか。
0278デフォルトの名無しさん
2010/08/28(土) 23:16:08{
int a;
int b;
int c;
int d;
};
こんな感じの構造体をクラスのメンバ変数にした場合、
0で埋めるコスト安い方法ってなんですか。memset以外で。
0279デフォルトの名無しさん
2010/08/28(土) 23:18:290280デフォルトの名無しさん
2010/08/28(土) 23:18:450281デフォルトの名無しさん
2010/08/28(土) 23:24:08それでできる?
0282デフォルトの名無しさん
2010/08/28(土) 23:24:44メンバ変数で
0283デフォルトの名無しさん
2010/08/28(土) 23:24:570284デフォルトの名無しさん
2010/08/28(土) 23:27:34勉強させていただきました。ありがとうございます。
これは便利だなあ。
0285デフォルトの名無しさん
2010/08/28(土) 23:28:450286デフォルトの名無しさん
2010/08/28(土) 23:38:17これだとどういう理由でメンバが0で埋まるんですか?
0287別人
2010/08/28(土) 23:40:360288デフォルトの名無しさん
2010/08/29(日) 00:05:080289デフォルトの名無しさん
2010/08/29(日) 00:15:020291デフォルトの名無しさん
2010/08/29(日) 00:37:230292デフォルトの名無しさん
2010/08/29(日) 14:33:390293デフォルトの名無しさん
2010/08/29(日) 16:10:480294デフォルトの名無しさん
2010/08/29(日) 17:39:51http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3126.pdf
8.5.1 Aggregates の 第7節
7 If there are fewer initializer-clauses in the list than there are members in the aggregate, then each member
not explicitly initialized shall be value-initialized (8.5).
8.5 Initializers の 第7節
7 To value-initialize an object of type T means:
...省略...
— if T is a (possibly cv-qualified) non-union class type without a user-provided constructor, then the object
is zero-initialized and, if T’s implicitly-declared default constructor is non-trivial, that constructor is
called.
8.5 Initializers の 第5節
5 To zero-initialize an object or reference of type T means:
...省略...
— if T is a (possibly cv-qualified) non-union class type, each non-static data member and each base-class
subobject is zero-initialized;
8.5 Initializers の 第5節
5 To zero-initialize an object or reference of type T means:
— if T is a scalar type (3.9), the object is set to the value 0 (zero), taken as an integral constant expression,
converted to T;
ってことで仕様で決まってます
上のPDFは0xのものだけど引用部分は03規格とだいたい同じです(03最終草案とはちょっと違います)
0295デフォルトの名無しさん
2010/08/29(日) 17:53:055.2.3 Explicit type conversion の 第2節
2 The expression T(), where T is a simple-type-specifier or typename-specifier for a non-array complete object
type or the (possibly cv-qualified) void type, creates an rvalue a prvalue of the specified type, which is
value-initialized (8.5; no initialization is done for the void() case).
value-initialized から先は>>294のとおり
0296デフォルトの名無しさん
2010/08/30(月) 14:14:13for(boost::tokenizer<escaped_list_separator_sjis >::iterator p=tok.begin(); p!=tok.end();++p){
cout << *p + "\t";
}
cout << endl;
これを出力すると
a e d
q d r
r u t
になります。
これをタブ区切りでtsvファイルに出力したいのですがどうすればよいでしょうか?
0297デフォルトの名無しさん
2010/08/30(月) 14:15:390298デフォルトの名無しさん
2010/08/30(月) 14:19:32もう1つの方はC言語で、こちらがC++だったので2つの書き込みをしてしまいました。
申し訳ありません。
本当はこちらに質問したかったです。
0299デフォルトの名無しさん
2010/08/30(月) 14:23:30いや、boostにも同じ質問しているだろ。
他に移動するときは断り書きをしたうえで、質問のポイントを再検討してから質問するのが道理。
で、あんたは何が判らないんだ? 素直にくだスレにでも行った方が無難なようだが。
0300デフォルトの名無しさん
2010/08/30(月) 14:32:14今は標準出力なのですがこれをtsvファイルに出力したいと思っています。
私が分からないのはこの1点です。
0301デフォルトの名無しさん
2010/08/30(月) 14:37:17#include <fstream>
:
:
ofstream ofs("data.tsv");
boost::tokenizer< escaped_list_separator_sjis > tok( csvLine );
for(boost::tokenizer<escaped_list_separator_sjis >::iterator p=tok.begin(); p!=tok.end();++p){
ofs << *p + "\t";
}
0302デフォルトの名無しさん
2010/08/30(月) 14:39:29最初からそう聞けばいいのに。
0303デフォルトの名無しさん
2010/08/30(月) 14:41:17どうすれば全行出力されますか?
<実行>
a e d
q d r
r u t
したいのですが、
a e d
しか表示されませんでした。
0304デフォルトの名無しさん
2010/08/30(月) 15:29:270305デフォルトの名無しさん
2010/08/30(月) 15:31:51<実行>
a e d
q d r
r u t
したいのですが、
最後の1行の
r u t
しか表示されませんでした。
全行表示するにはどうすれば良いでしょうか?
0306デフォルトの名無しさん
2010/08/30(月) 15:41:140307デフォルトの名無しさん
2010/08/30(月) 15:42:31それとも最初からバグってる?
0308デフォルトの名無しさん
2010/08/30(月) 15:48:070309デフォルトの名無しさん
2010/08/30(月) 15:53:440310デフォルトの名無しさん
2010/08/30(月) 16:08:46307さんのおっしゃる通りcoutをofstreamに置き換えてしましたが出力結果が違います。
0311デフォルトの名無しさん
2010/08/30(月) 16:12:340312デフォルトの名無しさん
2010/08/30(月) 16:13:13>308
0313デフォルトの名無しさん
2010/08/30(月) 16:28:19ああ、それかもね。
ループのなかにofstream ofs("data.tsv"); を入れちゃってる。
0314309
2010/08/30(月) 16:37:14tsvファイルとは関係のない話です。唐突でした。
f.c: void f(int) {}をg++ -c f.cしたのち、nm f.oすると、
00000000 T _Z1fi
と表示されます。ここで、c++filt _Z1fiすると、
f(int)
と表示されます。
あるかと尋ねたのは、この逆の動作をする、「f(int)を入れると_Z1fiが出てくるプログラム」です。
0315デフォルトの名無しさん
2010/08/30(月) 16:49:32しかし、ループの中にはいれていません。
0316デフォルトの名無しさん
2010/08/30(月) 17:10:14>308
0317デフォルトの名無しさん
2010/08/30(月) 17:11:12つ[gcc]
0319デフォルトの名無しさん
2010/08/30(月) 17:42:55何度か他人が指摘しているけど \r はあっても \n が無い
とそういう状況になるはず
そんなにわからないならコードをちゃんと出せって
情報小出しにされても皆わからん
0320デフォルトの名無しさん
2010/08/30(月) 18:01:38これがプログラムです。
void A::ReadFromCsvLine( const std::string& csvLine )
{
ofstream ofs("test.tsv");
boost::tokenizer< escaped_list_separator_sjis > tok( csvLine );
for(boost::tokenizer<escaped_list_separator_sjis >::iterator p=tok.begin(); p!=tok.end();++p){
ofs << *p + "\t" ;
cout << *p + "\t";
}
ofs << endl;
cout << endl;
ofs.close ();
これで実行すると、
標準出力の方は
a e d
q d r
r u t
のようになり、tcvファイルの方は
r u t
となります。
私はtcvファイルの方を標準出力の結果と同じにしたいです。
0321デフォルトの名無しさん
2010/08/30(月) 18:06:240322デフォルトの名無しさん
2010/08/30(月) 18:07:43>308
その"test.tsv"をどっかにアップロードして味噌。
0323デフォルトの名無しさん
2010/08/30(月) 18:08:000324デフォルトの名無しさん
2010/08/30(月) 18:09:46だとしたら、最初の行を処理する前に定義して、ReadFromCsvLine()にはofsの参照を渡せばいいや。
0325デフォルトの名無しさん
2010/08/30(月) 18:10:07どうかした?
0326デフォルトの名無しさん
2010/08/30(月) 18:10:550327デフォルトの名無しさん
2010/08/30(月) 18:14:43>323は断片のみの提示に対して不満を訴えているものと思われる。
0328デフォルトの名無しさん
2010/08/30(月) 18:14:49死ねばいいよ
0329デフォルトの名無しさん
2010/08/30(月) 18:15:04どなたか変更後のプログラムを載せていただけないでしょうか?
0330デフォルトの名無しさん
2010/08/30(月) 18:16:220331デフォルトの名無しさん
2010/08/30(月) 18:24:22とりあえずこうすればいいんじゃないかな
これはこれで後で困りそうだけど
0332デフォルトの名無しさん
2010/08/30(月) 18:26:30ってかw
0333デフォルトの名無しさん
2010/08/30(月) 18:26:30ならそう書けばいいのにね
使い方的に全然適当じゃないし
0334デフォルトの名無しさん
2010/08/30(月) 18:31:17絶対嘘。
プログラムの基本分かってないだろ。
0335デフォルトの名無しさん
2010/08/30(月) 18:36:56forか関数呼出かの違いで
0336デフォルトの名無しさん
2010/08/30(月) 18:43:56手 |::::::::::::: ,. '":::::::::::::::::::::::::`ヽ. ::::::::| 頭 ど
遅 |::::: /::::::::く:::::::╋::::::::>:::::::::\ :::| で. こ
れ |:::: 〈:::::::::;:::--- 、─ァ -- 、:;:::::::::〉 :::| す が
で. .|::::: ,〉'" `'´ `ヽ! :| か 悪
す |:::: / / ハ ハ ヽ ヽ 、 ', | ゜ い
ね. |:::: i ,' /!__i_, !' ! ,_ハ__ハ ', ! ', ん
゜/:: ノ.! ! /,ィ-ァ!、! レ',ィ-=!、! i ハ 〉 で
´\|:: 〈 ノ Yレヘ''ゞ-' ゞ-''/レ' ン ∠、 す
:::: 〈 ハ !ハ." ______ "ハ ハ ! ! か
:: ノ、 `ァ'_」>、._`ー' ,,.イ/イ、ノ ヽ. ?
/ `ァ''´ ', ヽ干´ン::::::::::::`ヽ. `''ー─
! ヽ/ ,y ヽ、. .,!':::::::::.y::::::::::::',
〉r〈_,.-、7-、 Y十::::.::::::i::::::::::::::〉
: レ^iY⌒ヽ,イ'ヽ-! .|::::::::::::::;ハr、::::Y
:: '! ,ィ〈 `y'´`ヽ!::::::::::::/´⌒'/'
::: Y´ヽ、)-'、___ノ、::::::::/ /
0337デフォルトの名無しさん
2010/08/30(月) 18:44:43, ' 、 ` ,
/ ! \
/ / i 、 ' ,
/ / / / ト ヽ ',
,' / / / イi } \ ! , i
,' i i / イ / i | ', ! i .|
| |// / //_/ | / | _ ! ! i |
| !/-// / / ̄ /, イ /  ̄ i !ト ! |
| .i !'// レ__、/イ /!/-_ =-、V i i/
! i レ' /ィ=ヽ ` レ ' /:て}ヽ 1 ! _ -, -──‐-、
', i ! イ、|{:し::リ 弋=ソ ヾイ |/ /: : : : : : : : : \. | _|_ |_L /
' ! i ` = '  ̄ / ! / ' ___: : : : : : : : : :ヽ | _|  ̄| _ノ (
! ! 、 i i/ /:::::::::::::, '' ゙̄ヽ: : : : : '.. レ(__ノ\ | \
',、 ! __ "/'´ |:::::::::::::::{::::::::::::::}: : : : : :|
i!、 、 ト、 / ヽ r‐'了 |:::::::::::::: 、::::::::::ノ: : : : : :| ____ |
!ヽ\ !ヽ 、 、_ ノ|::::::| ∨:::::::: '´ ̄: : : : : : : :/ /ヽ, l  ̄|7/ヽ
\\! >! ' , ̄ , '_::::\__ \'´ : : : : : : : : : : / /ヽ/ .| ̄ ./| |
ノ::::! く _ , !' |::\>N、 l¨'''¬ー- 、 _____, '´ / |___i. ′| ▽ヽ,
ィ:::::::::! >< ' /:::::::::/ .二\
, /o /::::::::::::! / || .! /:::::::::/ -‐、∨\
,..:::{__ == !::::::::::::::!ノ // ヽ /:::::::::::{ ィヽソ|:::::::|
0338デフォルトの名無しさん
2010/08/30(月) 18:45:28|
| 最近、スレッド荒れてるね…
|
|_____ ________________
∨
三三三三三三三三[BAR KUMAR]三三三三三三三三三三三
_i^i__i^i_ i^i ._i^i_ __, -―- 、___ _i^i_
|*||*| ∩___∩ i^i _i^i_ | | |@ll|(_/,,,, ,,,, ヽ_) |@|
|≡||≡|| ノ ヽ ([])|;□;|.(≡)|_| |● ● | |_|
. 二二/ ● ● | 二二( (二二二二 彡(_●_ ) ミ二二二
| ( _●_) ミ ) ) i二i__/` ''∪'' / ヽ
彡、 |∪| ノ ,Gノ'フ= ___(___ノ_/i ` ー '" iヽ |
/ ヽノ ヽ / / | ! | | | l
..──|ヽ ヽ___i二i ヽ./─;==i─Y────────(⌒)─
____.ヽ\____)ノ └-┘ ┴  ̄
| i ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ̄ ̄ ̄ (ヽ |_ \ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄∧ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
:::::::::::::::::::||\ | / /:::::::::| ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
:::::::::::::::::::||::::| |\___):::::::::::::| 夏休みだからねぇ…
:::::::::::::::::::||:::( \:::::::::::::::::::::| せめて宿題終わってからにしてほしいよ…
:::::::::::::( )\_):::::::::::::::::::|
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
0339デフォルトの名無しさん
2010/08/30(月) 18:49:350340デフォルトの名無しさん
2010/08/30(月) 19:04:33質問の仕方も分かってないような気がする
0341デフォルトの名無しさん
2010/08/30(月) 19:42:13char[10] に入れている 0〜99の乱数10個をできるだけ小さなバイト数に纏めてしまいたいのですが、
int型の変数に数字とした4組並べて置く程度しか思いつかず、これじゃ変わらないじゃないか、と。orz
何か良い圧縮〜展開する方法は無いでしょうか・・?
0342デフォルトの名無しさん
2010/08/30(月) 19:45:270343デフォルトの名無しさん
2010/08/30(月) 19:56:45少なくとも 100/256 で 約 39% までは圧縮可能
とりあえず bit 幅縮めることを検討してみ
0344デフォルトの名無しさん
2010/08/30(月) 19:59:000345デフォルトの名無しさん
2010/08/30(月) 19:59:07おすすめはしないが
7bitで0-99の値を表せるのでビットフィールドを使いつつアライメントと詰めるようにように設定すれば削れるんじゃないかな
これでも冗長性はあるので情報理論的にはまだ削れるらしいんだが
0346デフォルトの名無しさん
2010/08/30(月) 20:02:2180bit -> 70bit だからまだかなり無駄があるね
0347デフォルトの名無しさん
2010/08/30(月) 20:07:540348デフォルトの名無しさん
2010/08/30(月) 20:11:36100^10 = 10^20 > (2^8)^8 = 2^64 = 1.84467441 × 10^19じゃね?
普通に格納したら67ビット必要だろ?
0349デフォルトの名無しさん
2010/08/30(月) 20:30:37ありゃ
計算間違えたか
でも理論的には 67bit 未満も可能なんでしょう?
0350デフォルトの名無しさん
2010/08/30(月) 20:35:050351デフォルトの名無しさん
2010/08/30(月) 20:40:04どのパターンでも格納するという条件ならで67未満は不可能
(いや、符号理論の定義で行けば66.なんとかバイトまで削れるってことになりはするが)
ある0-99の10個の並びというものを突っ込むのであれば圧縮できる場合がある
あたりまえだが
0352デフォルトの名無しさん
2010/08/30(月) 20:44:08平均で10バイト未満に出来る(66ビット以下に出来る)っていうことですね
0353341
2010/08/30(月) 21:04:24少し難しい話でハッキリと理解できないものがありますが、
7bitずつ並べてしまえば圧縮できるのですね・・ありがとうございました。
0354デフォルトの名無しさん
2010/08/30(月) 22:07:438192(2**13) < 10000(100**2) < 16384(2**14)
524288(2**19) < 1000000(100**3) < 1048576(2**20)
数字3つを記録するのに21bitは多く,20bitもあれば十分であることがわかる
あとは100**10のときの上界と下界を求めれば必要なbit数は導き出せる
0355デフォルトの名無しさん
2010/08/30(月) 22:09:030356デフォルトの名無しさん
2010/08/30(月) 22:15:22を
int a[ 10 ] = {};
って書くのは正式な仕様ですか?
0357デフォルトの名無しさん
2010/08/30(月) 23:32:400358デフォルトの名無しさん
2010/08/30(月) 23:36:12という配列は定義できますか?
0359デフォルトの名無しさん
2010/08/31(火) 00:37:220360デフォルトの名無しさん
2010/08/31(火) 00:42:450361デフォルトの名無しさん
2010/08/31(火) 00:53:18それがその上のほうで出てる66とか67だよ
0362デフォルトの名無しさん
2010/09/01(水) 00:40:21そんなに重くない(1MBもいかない)のをリンクするだけで使えて、
JavaScriptやLispなどの文法で
最低限、条件分岐と、四則演算と、簡易な文字列制御と
(C++アプリ側での定義済みの)関数の呼び出しができる、(欲張りか)
インタプリタ的なプラグインを実装できるという
都合のよいライブラリをオススメを教えてください…
0363デフォルトの名無しさん
2010/09/01(水) 00:42:270364デフォルトの名無しさん
2010/09/01(水) 10:24:010365デフォルトの名無しさん
2010/09/01(水) 10:45:590366デフォルトの名無しさん
2010/09/01(水) 15:17:48定義出来ないことを利用して
static_assertを書くことができるよね。
0367デフォルトの名無しさん
2010/09/01(水) 15:21:38boost.pythonオヌヌメ
0368デフォルトの名無しさん
2010/09/01(水) 15:53:49Boost.Pythonは確かにすごい。
0369デフォルトの名無しさん
2010/09/01(水) 22:27:08struct A
{
C::B* b;
};
namespace C
{
struct B
{
};
}
これ通らないんですが、解決する方法ありますか?
0370デフォルトの名無しさん
2010/09/01(水) 22:29:20stるct A{C::B*b;}
なめsぱせC{stるctB{};}
0371デフォルトの名無しさん
2010/09/01(水) 22:33:05どんなセンスのなさだよ
0372デフォルトの名無しさん
2010/09/01(水) 22:33:280373デフォルトの名無しさん
2010/09/01(水) 22:55:130374デフォルトの名無しさん
2010/09/01(水) 22:57:320375デフォルトの名無しさん
2010/09/01(水) 23:16:13typenameじゃないん?
0376デフォルトの名無しさん
2010/09/01(水) 23:30:05typeof
0377デフォルトの名無しさん
2010/09/02(木) 00:06:36> 派生クラスのポインタから、基底クラス名を取得するにはどうすればよいのでしょうか。
> typenameじゃないん?
C++スレにいるとは思えないな
0378デフォルトの名無しさん
2010/09/02(木) 00:11:230379デフォルトの名無しさん
2010/09/02(木) 00:28:19C++にはリフレクション機能ないでしょ
0380デフォルトの名無しさん
2010/09/02(木) 00:29:24>>373こうですか?わかりません><
0381デフォルトの名無しさん
2010/09/02(木) 00:29:53objective-cならいける
0382デフォルトの名無しさん
2010/09/02(木) 00:32:520383デフォルトの名無しさん
2010/09/02(木) 00:52:450384デフォルトの名無しさん
2010/09/02(木) 00:53:36お前の頭がおかしい。断定するな。
多くの人がそう思うならそれは曲解じゃない。
質問者もそうは思っていないかもしれない。
なぜ断定できる?え?なぜ?
お前=質問者じゃないと断定は不可能だ。
0385デフォルトの名無しさん
2010/09/02(木) 01:00:39質問者はそうは思っていないかもしれないけどな
0386デフォルトの名無しさん
2010/09/02(木) 01:12:15例えば、文字列 std::string を返す関数は、何も考えないで書くと、
std::string hoge() { return "hoge"; }
になると思うんですが、
void hoge(std::string &dst) { dst = "hoge"; }
という感じで返してるソースを見かけました。
後者の方が効率的なんですかね
0387デフォルトの名無しさん
2010/09/02(木) 01:16:040388デフォルトの名無しさん
2010/09/02(木) 01:25:17> なぜってそれが普通だからだよ
普通も何も、お前一人がそう思っていて、
他の人がそうレスしていないんだから、
少なくとも曲解というお前の指摘は的外れだろう?
そうは思わないか?
0389デフォルトの名無しさん
2010/09/02(木) 05:32:35なんども無駄なコピーされるね
0390デフォルトの名無しさん
2010/09/02(木) 08:10:35たいていは「俺は」と言うべきところの多数派工作。
0391デフォルトの名無しさん
2010/09/02(木) 08:11:47前者は必ず新しい領域の確保が必要。
後者は確保済みの領域をそのまま使える。
小さなループ内で繰り返し呼び出すのなら、
後者のほうが効率が良くなる可能性が高い。
0392デフォルトの名無しさん
2010/09/02(木) 08:37:11それは技術者に限った話じゃないな
0393デフォルトの名無しさん
2010/09/02(木) 09:45:310394デフォルトの名無しさん
2010/09/02(木) 10:31:17他の人ってどのみち数人じゃないか
そもそも同意レスが大量に付くレスが『普通』なの?
ついでに言うと俺は>>382じゃない
だから俺一人がそう思っていると思っているのはお前の思い込み
0395デフォルトの名無しさん
2010/09/02(木) 10:32:57後ろの const が?
0396デフォルトの名無しさん
2010/09/02(木) 10:43:53ttp://homepage2.nifty.com/well/const.html
0397デフォルトの名無しさん
2010/09/02(木) 10:48:26いやそうじゃなくてな
0398デフォルトの名無しさん
2010/09/02(木) 10:49:380399デフォルトの名無しさん
2010/09/02(木) 10:54:220400デフォルトの名無しさん
2010/09/02(木) 11:14:48参照渡しとかどんだけ全時代のコンパイラつかってんだよ
0401デフォルトの名無しさん
2010/09/02(木) 12:14:26すまん、ムーブされるってなんだい?
用語の説明頼む・・・。
アセンブラではmovは単なる値のコピーなので、
ついついコピーと変換されてしまう。
0402デフォルトの名無しさん
2010/09/02(木) 12:17:59unique_ptr と勘違いしてるんじゃまいか
0403デフォルトの名無しさん
2010/09/02(木) 12:27:51説明はめんどうだ
ムーブセマンティクスでぐぐれアホ
0404デフォルトの名無しさん
2010/09/02(木) 12:33:53スレタイ読めますか?
0405デフォルトの名無しさん
2010/09/02(木) 12:41:38は?スレタイのどこにC++03限定って書いてあるの?
ここはC++全般に関するスレなんで0xも余裕でありだよ
0406デフォルトの名無しさん
2010/09/02(木) 12:46:49これならstaticの呪縛から開放されてstd::string返り値とかもやり放題だな
0407デフォルトの名無しさん
2010/09/02(木) 12:51:340408デフォルトの名無しさん
2010/09/02(木) 12:55:010409デフォルトの名無しさん
2010/09/02(木) 13:09:210410デフォルトの名無しさん
2010/09/02(木) 13:13:51ひょっとして
const string & func() { static string s; /*〜*/; return s; }
みたいなことしてそうでこわい
0411デフォルトの名無しさん
2010/09/02(木) 13:31:00一般的な代入と同じように記述できる、staticを使う方法と同じくらい
容易でよりスマートな方法があれば別だけどまだ俺には見つからないからね
0412デフォルトの名無しさん
2010/09/02(木) 14:16:18使えるよ。つーか必要なのは string の内部だよ。
既にそう実装されてる処理系もあるよ。VS2010とかね。
0413デフォルトの名無しさん
2010/09/02(木) 14:40:33サーバーでリクエストを待って動かすようなプログラムを
1PCで4〜5個同時稼動させたいと思っているのですが、
1つの実行ファイルに処理を纏めるのと
複数の実行ファイルに分けそれらを同時稼動させるのとでは
どちらの方が開発・動作(安定性)的に良いのでしょうか?
そもそもUNIX・LINUXは複数同時稼動できたり、適しているのでしょうか。
複数に分けた方がマルチコアCPUを活用できるという話はガセでしょうか?
些細な情報、ご指摘、何でも構いませんのでご助言頂けますと幸いです。
0414デフォルトの名無しさん
2010/09/02(木) 15:04:13* Unix/Linux(それ以外マルチタスクOSでも)複数プロセスは同時に走らせられる
* cpu/コアが複数であれば同時稼働スレッドを増やした方が有効活用できる
(そうでないと1つのコアだけしか実質動かない)
* 単純に分けて走らせる(たとえば同じのパラメタ変えるとか)だけで良いの
ならその方が楽で普通効率も良い(人的にもコンピューターにもマルチスレッ
ドのプログラミングのオーバーヘッドが無い).マルチスレッドプログラミ
ングの経験が無いならなおさら.
0415デフォルトの名無しさん
2010/09/02(木) 15:15:58相変わらず低レベルな人間が多い。
俺は無駄な書き込みして逃げよ。
0416デフォルトの名無しさん
2010/09/02(木) 16:19:49日本語が不自由ですか?
0417413
2010/09/02(木) 16:52:23マルチスレッドプログラミングの経験・・無いですので
単純に分けて走らせる事にします。
そこそこ無駄なオーバーヘッド(?)というのか同じ内容をメモリに溜め込む
形になりますが、他のコアが利用できないなんて事より、格段にマシでしょうから。
解りやすいご回答、ありがとうございます。方向性が定まりました。
0418デフォルトの名無しさん
2010/09/02(木) 18:11:570419デフォルトの名無しさん
2010/09/02(木) 19:06:51Test foo()
{
return Test();
}
void bar()
{
const Test& t = foo();
/* t を使った処理 */
}
これって問題ない?
それとも寿命切れ?
0420デフォルトの名無しさん
2010/09/02(木) 19:15:04return main();
}
0421デフォルトの名無しさん
2010/09/02(木) 19:31:14問題ない
0422デフォルトの名無しさん
2010/09/02(木) 19:35:570423デフォルトの名無しさん
2010/09/02(木) 19:58:250424デフォルトの名無しさん
2010/09/02(木) 20:46:06極力配列変数の書き込み/読み出しに費やす計算時間を小さくしたいです。
今のところ領域を
int** array;
array = new int*[N];
array[0] = new int[M];
for(int i=0;i<N;i++) array[i] = array[0] + i*N;
と確保してそれから必要な時にarray[i][j]とアクセスしていますが、
もしかしてこれより速い方法ってあったりします?やはりこれが最速ですか?
0425424
2010/09/02(木) 20:48:01array[0] = new int[M]; // 誤
array[0] = new int[N*M]; // 正
です。
0426424
2010/09/02(木) 20:50:31for(int i=0;i<N;i++) array[i] = array[0] + i*M; // 正
スレ消費して済みませんorz
0427デフォルトの名無しさん
2010/09/02(木) 21:03:15array = new int[N*M];
必要な時にarray[i*M+j]とアクセス
0428デフォルトの名無しさん
2010/09/02(木) 21:10:350429デフォルトの名無しさん
2010/09/02(木) 21:22:40NとMがコンパイル時に決定していないという意味だろ
それを動的というのか遅延評価というのかは知らんが
0430デフォルトの名無しさん
2010/09/02(木) 21:23:480431デフォルトの名無しさん
2010/09/02(木) 21:42:280432デフォルトの名無しさん
2010/09/02(木) 21:44:42動的でいいんじゃね
0433デフォルトの名無しさん
2010/09/02(木) 21:47:23意外とそっちが最速かもな
一番コンパイラの最適化の恩恵受けられそう
0434デフォルトの名無しさん
2010/09/02(木) 21:48:29{
namespace pad
{
class Pad;
}
namespace sound
{
class Sound;
}
namespace draw
{
class Draw;
}
}
名前空間使うときは上と下どっちがいいですか?
namespace ps3
{
class Pad;
class Sound;
class Draw;
}
0435デフォルトの名無しさん
2010/09/02(木) 22:05:31どう書くとダサくない?
コピーコンストラクタでコピー?
0436デフォルトの名無しさん
2010/09/02(木) 22:12:30たとえば引数ってわけにはいかないのか?
0437362
2010/09/03(金) 02:03:21レスThanksです!
>>363
そうそうこんなの!
手軽でいいっスね!!
>>364,365
DとかQtは違うような…
>>367,368
おっと、そんなものが…
0438デフォルトの名無しさん
2010/09/03(金) 02:47:20まあそもそも(ちょっと違うけど)言語をこねくりまわしてる段階の俺には言語を作るというのが意味不明だ
0439デフォルトの名無しさん
2010/09/03(金) 04:39:56QtにはQtScriptっていうECMAscriptの実装があるんだよ
0440デフォルトの名無しさん
2010/09/03(金) 13:49:19vectorみたいにこっからここまでっていう目印をつける
オブジェクト1つに対してフラグになるものも余分にひとつどこかに用意する
ほかになんかいい方法ありますか?
0441デフォルトの名無しさん
2010/09/03(金) 15:05:15死ね
0442デフォルトの名無しさん
2010/09/03(金) 15:56:23くたばれ屑
埃でも食ってろ
0443デフォルトの名無しさん
2010/09/03(金) 15:58:31てめーは巣に帰れ
0445デフォルトの名無しさん
2010/09/03(金) 16:17:18すいません。息が臭い人には訊いてませんのでお引取りください
0446デフォルトの名無しさん
2010/09/03(金) 16:20:460447デフォルトの名無しさん
2010/09/03(金) 22:25:530448デフォルトの名無しさん
2010/09/04(土) 02:14:09ムーブがあっても >>391 の差は残るだろ。
0449デフォルトの名無しさん
2010/09/04(土) 02:16:090450デフォルトの名無しさん
2010/09/04(土) 02:54:480451デフォルトの名無しさん
2010/09/04(土) 02:55:48mallocよりも遅くないnewを搭載したコンパイラがほしいです。
0452デフォルトの名無しさん
2010/09/04(土) 03:43:20確保にかかる時間を clock() で計ってみた。
http://codepad.org/22ViLVxO
Cygwin g++
g++ (GCC) 4.3.4 20090804 (release) 1
----
malloc: 1408
operator new: 1454
malloc: 1463
operator new: 1204
malloc: 1155
operator new: 1331
----
Visual Studio 2008 Express Edition
----
malloc: 361
operator new: 233
malloc: 313
operator new: 312
malloc: 357
operator new: 420
----
誤差程度の違いしか見られない。
0453デフォルトの名無しさん
2010/09/04(土) 04:41:26わざわざ測定した意味が分からない。
newがmallocよりも速くなることはないことぐらいすぐに分かるでしょう?
0454デフォルトの名無しさん
2010/09/04(土) 05:03:29いちいち細かい奴だな
将来禿るぞ
0455デフォルトの名無しさん
2010/09/04(土) 05:17:02どういう理屈?
new が malloc() を呼び出すという実装を決め付けて言ってないか?
しかも関数呼び出しですごいオーバーヘッドが発生すると思ってる?
0456デフォルトの名無しさん
2010/09/04(土) 07:21:590457デフォルトの名無しさん
2010/09/04(土) 07:48:280458デフォルトの名無しさん
2010/09/04(土) 09:22:14> newがmallocよりも速くなることはないことぐらいすぐに分かるでしょう?
何を恥ずかしいことを
0459デフォルトの名無しさん
2010/09/04(土) 10:49:050460デフォルトの名無しさん
2010/09/04(土) 10:53:030461デフォルトの名無しさん
2010/09/04(土) 14:31:52質問は "メモリプールの使われてる領域と使われてない領域を判別する方法を知りたい" だよね?
ないんじゃないかなー
前者のほう(に基本的には似てるfree listって手法)が広く使われてると思うよ
0462デフォルトの名無しさん
2010/09/04(土) 14:36:20{
static void test(){}
};
void (*func)() = B::test;
func();
void (*func)() = &B::test;
func();
これどっちも同じ結果になるんですけどどちらが正しいのですか?
0463デフォルトの名無しさん
2010/09/04(土) 14:42:54どっちでも正しいから気にするな
0464デフォルトの名無しさん
2010/09/04(土) 14:49:420465デフォルトの名無しさん
2010/09/04(土) 14:55:440466デフォルトの名無しさん
2010/09/04(土) 14:57:050467デフォルトの名無しさん
2010/09/04(土) 15:30:000468デフォルトの名無しさん
2010/09/04(土) 18:31:560469デフォルトの名無しさん
2010/09/04(土) 18:54:13staticで全然違ったようです
0470デフォルトの名無しさん
2010/09/04(土) 21:34:48mallocとnewのヒープ確保処理の内容って同じじゃないの?
0471デフォルトの名無しさん
2010/09/04(土) 21:39:27確保できない場合の動作以外はほとんど同じ要件なので根っこは同じ可能性が高いけど、
同じとは限らない。
同じ要件の処理であれば、十分に最適化されていることを前提として、差が出る理由が無い。
この点で >>430 が何を根拠に「newは遅い」と言ってるのかわからない。
0472デフォルトの名無しさん
2010/09/04(土) 21:50:260473デフォルトの名無しさん
2010/09/05(日) 01:09:41{
Boo() : b( 111 ){}
int b;
};
struct Foo
{
Boo boo;
int f;
};
Foo foo[ 100 ];
fooの全要素のFoo::fが0、Boo::bが111になるような初期化方法はありますか?
Fooにはコンストラクタが追加出来ないとして。
0474デフォルトの名無しさん
2010/09/05(日) 01:54:360475デフォルトの名無しさん
2010/09/05(日) 05:44:160476デフォルトの名無しさん
2010/09/06(月) 14:09:40> Foo foo[ 100 ]={0};
| こいつ最高にアホ | 同意
\ \
 ̄ ̄ ̄ ̄V ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄V ̄ ̄ ̄ ̄ ̄ ̄
∩_
〈〈〈〈 ヽ /  ̄ ̄ ̄ ̄ \
〈⊃ } /、 ヽ
/ ____ヽ|__| |ヘ |―-、 |
| | /, −、, -、l ! ! q -´ 二 ヽ |
| _| -| ・|< || | / ノ_/ー | |
(6 _ー っ-´、} / \ | /
\ ヽ_  ̄ ̄ノノ/ O=====|
/ __ ヽノ / / |
(_|__) / / / |
0477デフォルトの名無しさん
2010/09/06(月) 14:15:200x 知らないのか・・・
0478476
2010/09/06(月) 14:36:440xならおkなのか。
| 俺が最高にアホだった | 同意
\ \
 ̄ ̄ ̄ ̄V ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄V ̄ ̄ ̄ ̄ ̄ ̄
∩_
〈〈〈〈 ヽ /  ̄ ̄ ̄ ̄ \
〈⊃ } /、 ヽ
/ ____ヽ|__| |ヘ |―-、 |
| | /, −、, -、l ! ! q -´ 二 ヽ |
| _| -| ・|< || | / ノ_/ー | |
(6 _ー っ-´、} / \ | /
\ ヽ_  ̄ ̄ノノ/ O=====|
/ __ ヽノ / / |
(_|__) / / / |
0479デフォルトの名無しさん
2010/09/06(月) 14:57:080480デフォルトの名無しさん
2010/09/06(月) 17:46:50まあ規格自体が決まってなくてアレだけど
0481デフォルトの名無しさん
2010/09/06(月) 17:55:51業界が業界なら普通に数万〜数十万円するくらいの技術が詰まってね?
0482デフォルトの名無しさん
2010/09/06(月) 18:02:47まぁコンパイラだけでってわけでもないけどね。
0483デフォルトの名無しさん
2010/09/06(月) 19:56:18スレに対応するdatファイルを引数として受けるクラスを作成し、そのクラスの中で
uint SearchWord()
uint SearchDate()
uint SearchID()
といったメソッドを定義し、おのおののメソッドがスレを1番から1000番まで通しで検索、
その結果条件に該当するレスナンバーを返し、最後に全てのメソッドが返したレスナンバーの
ORを取れば全ての条件を満たすレスナンバーが抽出できるという算段です。
おそらくこれがもっとも直感的な方法かと思いますがC++が持つクラスの機能等を使って
より洗練された拡張性のあるプログラムにすることは可能でしょうか?
プロ級のみなさんでしたらどういうプログラム構造にするか教えて頂けないでしょうか?
0484デフォルトの名無しさん
2010/09/06(月) 20:07:250485デフォルトの名無しさん
2010/09/06(月) 20:43:00map.insert() でpair<string, string> のデータを追加しているのですが、 どうも map に追加されていないようです。
なにが悪いのでしょうか
http://codepad.org/FbsbG9pI
実行例
$./a.exe
Add, List, Quit? : A
name: test
tel: 123
Add, List, Quit ? :L
Add, List, quit ? : <- データを全表示させているつもりだが、全然表示されない。
お知恵をお貸しください。よろしくお願いいたします。
0486デフォルトの名無しさん
2010/09/06(月) 21:03:04mがdoのスコープの中で作って消してを繰り返している
からではないだろうか
0488485
2010/09/06(月) 21:11:42map の宣言の位置を変えることで、意図どおりに動くようになりました。
なるほど、おっしゃるとおりでした。
簡単なテストプログラムで行き詰ってしまい、どうにもこうにも仕方がないところでした。
アドバイス感謝いたします。
0489デフォルトの名無しさん
2010/09/06(月) 21:15:17なんか微妙な設計。
0491デフォルトの名無しさん
2010/09/06(月) 21:51:45検索結果を内部にもってるってのがいやな感じ。
三つのメソッドを呼び出して、それぞれの結果を中にもってるって状態を持ちすぎのような。
0492デフォルトの名無しさん
2010/09/06(月) 22:00:14重複する検索だけを考えるなら既に見つけたのは無視みたいこともできるけど
拡張性とか自由度考えるとそれでいいような気がする
(たとえば OR でも AND でも検索できるようにするとか)
0493デフォルトの名無しさん
2010/09/06(月) 22:01:25結果のコンテナは一つでよくね?
ORで全ての条件を満たすというののも不明だし。
0494デフォルトの名無しさん
2010/09/06(月) 22:04:04普通にコレクションなり、イテッレータなりを返すだけだと思うけど。
なんでこんな気持ち悪い実装にしなければと思ったのか、
そのあたりを明らかにしないと有意義な回答は得られないと思う。
0495デフォルトの名無しさん
2010/09/06(月) 22:04:520496デフォルトの名無しさん
2010/09/06(月) 22:35:350497デフォルトの名無しさん
2010/09/06(月) 22:44:572chのスレ程度なら、書き込みをばらして、それをコレクションとして扱って
Articles result = articles.searchWord(…).searchId(…).searchDate(…);
とかやっても十分動くとは思う。
(C++だとコレクションを返すとかやりにくいのかな?)
0498483
2010/09/06(月) 22:59:02vector<uint> SearchDate()
vector<uint> SearchID()
のようにvector型の配列を返すメソッドにし、最後にそれらのANDを取るというのがスマートな方法ということでしょうか?
0499デフォルトの名無しさん
2010/09/06(月) 23:52:49vector<レス> スレ;
list<レス*> 結果;
Set(スレ, &結果);//全部ポインタ埋める
list<レス*>::iterator last=remove_if(結果.begin(),結果.end(),PredWord);
last=remove_if(結果.begin(),last,PredDate);
last=remove_if(結果.begin(),last,PredID);
結果.erase( last,結果.end());
叙述関数を一つにまとめてORにも対応させた方がスマートだろうけど。
0500デフォルトの名無しさん
2010/09/07(火) 01:24:02C++0x だとデフォルトコンストラクタしかないクラスが 0 で初期化できるの?
0501デフォルトの名無しさん
2010/09/07(火) 10:07:52struct BasicStruct {
int x;
float y;
};
struct AltStruct {
AltStruct(int _x, float _y) : x(_x), y(_y) {}
private:
int x;
float y;
};
BasicStruct var1 = { 5, 3.2f };
AltStruct var2 = { 2, 4.3f };
とかが可能
配列はシラネ
0502デフォルトの名無しさん
2010/09/07(火) 13:24:43effective c++によると#defineよりenumやstaticを使えって
書いてあるじゃないですか?
例えば定数の1から10までを名前のある定数にして
11以上を数字そのものが定数の名前にするには
どうやるもんですか?
0503デフォルトの名無しさん
2010/09/07(火) 13:42:26#define は定数ではない
たとえば #define a b() で case a: はできない
その 11 以上ってのは本当に「定数」か?
他の何かから演繹される数値ではないのか?
0504デフォルトの名無しさん
2010/09/07(火) 13:47:46X_CARROT,
X_SANDAL,
…
X_11,
X_12,
…
ってことか?頑張って手動で入力するしかないんじゃ無いだろうか
0505デフォルトの名無しさん
2010/09/07(火) 14:18:05//1から10の場合
T a =ONE
T b=TWO
11以上の場合
T c=11
T d=12
0506デフォルトの名無しさん
2010/09/07(火) 14:19:03a,
b,
c = 8,
d,
e,
}XXX;
こんなんじゃだめかいね?
0507デフォルトの名無しさん
2010/09/07(火) 14:39:50それってどういうことだ?
0508デフォルトの名無しさん
2010/09/07(火) 15:07:30#define ONE 1
#define TWO 2
...
#define TEN 10
とやれば
11以上は普通に数字が使えるでしょ。
0509デフォルトの名無しさん
2010/09/07(火) 15:11:24static int ONE=1;
static int TWO=2;
ってやればいいですか?
0510デフォルトの名無しさん
2010/09/07(火) 15:11:27普通に数字が使えるよ
0511デフォルトの名無しさん
2010/09/07(火) 15:13:22ご迷惑おかけしました。
0512デフォルトの名無しさん
2010/09/07(火) 15:26:40たとえば
template <class X> void func(void);
が実体化したときに
Xが組み込み整数以外ならコンパイルエラー
Xが非負なら警告
みたいな感じでやりたいんですが
0513デフォルトの名無しさん
2010/09/07(火) 15:49:12さらにMFC付のstandardEdition買おうと思ったら売り切れてるし。
javaみたいに、そういうクラスって何処かに転がってない?
0514デフォルトの名無しさん
2010/09/07(火) 18:56:00template <class X> class Y { public: enum{ Z = -1 }; };
template <> class Y<int> { public: enum { Z = 1 }; };
template <class X> void fun(void) { typedef char dummy[Y<X>::Z]; };
int main() {
fun<int>(); // OK
fun<float>(); // error
}
こんな感じ?
警告は無理じゃね
0515デフォルトの名無しさん
2010/09/07(火) 18:58:13dll_func( A* a );
という感じなんです。
Aというのは、クラスでもPODでも良いのですが、これはhoge.hに定義されています。
メインの方は、dll_funcを呼び出してAを渡すだけです。
DLLを作成するのは不特定多数です。
という状況なのですが、もし仮にhoge.hのAの定義を変える必要があった場合、
不特定多数のDLL製作者全員に、新しいhoge.hで再コンパイルしてもらう必要がありますよね。
こういった事態を防ぐ、何か上手い方法はありますでしょうか。
0516デフォルトの名無しさん
2010/09/07(火) 19:05:48a) stdio.h の FILE 構造体みたいに、DLL 側で構造体を確保・解放し、中身に触れてはいけないことにする
b) BITMAPINFOHEADER 構造体みたいに最初のメンバに構造体のサイズを入れさせ、受け取り側がどのバージョンのヘッダを使っているのか判断できるようにする
c) 元の dll_func と A はそのまま残して、 dll_funcEx と AEx を新しく定義する
d) A の定義は変えず、メンバの解釈を変えて (BOOL って書いてあるけど実は INT でした!)、強引に必要なデータをねじ込む
0517516
2010/09/07(火) 19:13:26代わりに
e) 構造体の最後に新しいメンバを追加するだけなら前の部分は変わらないので、新しく増えたメンバは単に無視する
0518515
2010/09/07(火) 20:02:54いやはや、5案も挙げていただき恐縮です。
DLL側が変更無しでいけるという点で、e)案は魅力的ですねぇ。
結局、追加したAのデータには関係ないDLLにまで、再コンパイルを強いるのが辛いわけですから。
Aとして配列データなんかを渡さなければいけそうな…検討してみます。c)案も結果は似てますね。
d)はWinAPIにも良くある、予約してあるけど使用しないメンバみたいな感じですかね。
b)は安全対策という感じでしょうか。
お付き合いいただき、ありがとうございました。
0519デフォルトの名無しさん
2010/09/07(火) 22:06:26A + B - D → A - B + D
` C - E ` E
同じ機能を持つが引数の型が異なる2つの関数(左側のB, C)を
1つに(右側のB)まとめたいのです。
http://codepad.org/rc48PS6D
という形では、うまくいくのですが、
下記のように別の関数へ処理を渡すとコンパイルが通りません。
http://codepad.org/IqJI4gVf
実際には、この別の関数(右側のB)をstd::sortとするつもりでいます。
DとEはsortに渡す型毎のプレディケートとするつもりです。
以上よろしくお願い致します。
0520デフォルトの名無しさん
2010/09/07(火) 22:15:27お前のやっているのは、以下と同じだ。
void sub1(const vector<int>& a) ;
void sub2(const vector<vector<int> >& a) ;
int main()
{
vector<int> s;
vector<vector<int> > d;
sub1(s) ;
sub1(d) ; // エラー
sub2(s) ; // エラー
sub2(d) ;
}
Tの型はコンパイル時に決まっているから、
vector<int>はvector< vector<int> >に変換できないし、その逆もできない。
お前の問題を解決するには、コンパイル時の条件分岐が必要だ。
C++ Template Metaprogrammingでも読め。
0521デフォルトの名無しさん
2010/09/07(火) 23:40:47こうしたいのか?
template <class T, typename Predicate>
void foo(T oh, Predicate predicate)
{
predicate(oh);
}
int main(void)
{
vector<int> bar1; bar1.push_back(8);
vector<vector<int> > bar2; bar2.push_back(bar1);
foo(bar1, sub1<int>);
foo(bar2, sub2<int>);
return 0;
}
0522519
2010/09/08(水) 00:00:57>>519のsort云々に合わせるとこうなります。
#残念なことにコンパイルは通りませんが。
sortに合うようにsub*は返り値を、boolにしてあります。
template <class T>
bool sub1(const vector<T>& a, const vector<T>& b)
....
template <class T>
bool sub2(const vector<vector<T> >& a, const vector<vector<T> >& b)
...
template <class T, typename Predicate>
bool foo(T oh, Predicate predicate)
{
return predicate(oh);
}
int main(void)
{
vector<int> bar1; bar1.push_back(8);
vector<vector<int> > bar2; bar2.push_back(bar1);
sort(bar1.begin(), bar1.end(), sub1<int>);
sort(bar2.begin(), bar2.end(), sub2<int>);
return 0;
}
0523519
2010/09/08(水) 00:03:42foo使っていなかったりと結構おかしいことになってますね。
うーむ。
0524519
2010/09/08(水) 00:33:05http://codepad.org/HU57E14p
を書いてみましたが、これもコンパイルが通りません。
複数の型に対応した1つの関数を作りたいだけなのですけど、
結構難しいものですね。
0525デフォルトの名無しさん
2010/09/08(水) 00:59:52http://codepad.org/NjtHOvUp
こういうことじゃないの?
TMPとかちょっと行きすぎでしょ
0526デフォルトの名無しさん
2010/09/08(水) 01:19:281度テンプレートの実体化を頭で追いかけて、仮引数の型と実引数の型を見比べてごらん。型が食い違ってるから
0527519
2010/09/08(水) 07:00:52そういうことですが、
http://codepad.org/NjtHOvUpの方ですが、
sとd用の関数をそれぞれ作りたくないので、そこをtypeidでまとめようと思いました。
また、後出しになってしまって申し訳ありませんが、
27,28行目のように一度でどちらも処理することはなく、
一回の処理では片方だけが処理されるのを想定しています。
>>526
http://codepad.org/HU57E14pの40行目で、
sub0に返り値が無いのに、subT::retTを返してしまっているのを
修正しました。まだ問題が残っているみたいです。
仕事いってきます。まずはご報告までに。
0528デフォルトの名無しさん
2010/09/08(水) 07:07:59テンプレートでやればいいだろうが。
0529デフォルトの名無しさん
2010/09/08(水) 10:29:09少し知識に毛が生えたら(少し工夫がいるものの)全く静的な問題でした
0530デフォルトの名無しさん
2010/09/08(水) 11:23:52Boost.MPLを勉強すれば簡単じゃね。
0531デフォルトの名無しさん
2010/09/08(水) 11:24:39ごめん警告は厳しい。
そういう意味の英語の型名を作ってコンパイラに表示させる様にするしかない。
0532デフォルトの名無しさん
2010/09/08(水) 12:09:01http://codepad.org/WzgvDtWb
こんな感じかな(エラーででてるけど、自分の環境でコンパイルしてくれれば通ると思う)
はっきりいって無駄が多いから素直にオーバーロード解決したほうがいいよ
ところで↑なんでコンパイルエラーになるかわかるひといる?
とくにおかしなことはしてないと思うし、VC++だと何の問題も無くコンパイルできるんだけど
selectが名前衝突してるらしいけどcstdioってグローバルにselect定義してんの?
0533デフォルトの名無しさん
2010/09/08(水) 12:11:37codepadのバグ…かな?
0534デフォルトの名無しさん
2010/09/08(水) 15:06:51それとも何か間違ってるのかな。
double a = 0.052;
double b = 1000;
int c = int(a * b); //VC=52 BC=51
a *= b;
int d = a; //両方52
0535デフォルトの名無しさん
2010/09/08(水) 15:11:490536デフォルトの名無しさん
2010/09/08(水) 15:23:17違うってことですか。
一度doubleに入れれば同じ結果になるのに・・・。
気をつけます。
0537デフォルトの名無しさん
2010/09/08(水) 15:59:55メモリ上に戻すと元の精度に戻るらしい。
>>534の挙動の違いはレジスタへの上げ下ろしのタイミングの違いじゃないかな。
0538デフォルトの名無しさん
2010/09/08(水) 16:05:02さらに言えば、IntelとAMDで微妙に計算結果が違う事があるとか、
FPU使った時とSSE2使った時とで微妙に違う事があるとか…
(VCではいくつかの関数はコンパイルオブションでFPUとSSE2を切り替えられたはず。他のコンパイラは知らない)
0539デフォルトの名無しさん
2010/09/08(水) 16:31:050540デフォルトの名無しさん
2010/09/08(水) 16:35:21わかってると思うけど一度 double に入れれば良いという問題じゃないからね
int casting を使ってる限りは切り捨て
四捨五入使えば一番近い整数になる
double は10桁精度があるといっても 51.9999999999 とかもありうるわけだから
そういうコーディングしていたら整数に精度は無い
0542デフォルトの名無しさん
2010/09/08(水) 17:08:33int e = (int)(a * b);
0543デフォルトの名無しさん
2010/09/08(水) 17:39:15わかってたつもりでしたが、どうもわかって無いようでした。
確かにdouble に入れれば良いというのでは根本的な
解決にはなっていないとは思ってますが・・。
double a = 0.052;
double b = 1000;
double c = a * b;
int d = int(a * b); //VC=52 BC=51
int e = (int)(a * b); //VC=52 BC=51
int f = static_cast<int>(a * b); //VC=52 BC=51
int g = int(c); //両方52
int h = (int)(c); //両方52
int i = static_cast<int>(c); //両方52
int j = c; //両方52
doubleに精度や切捨ては知ってましたが
int e = (int)(a * b); //VC=52 BC=51
int h = (int)(c); //両方52
これが同じ結果にならないのが不思議で・・・。
これって実は全然違うキャストなんでしょうか?
0544デフォルトの名無しさん
2010/09/08(水) 17:47:03見逃してました。ありがとう。
なるほど・・。予想以上に少数を扱うのは難しいんですね・・。
0545デフォルトの名無しさん
2010/09/08(水) 18:06:080546デフォルトの名無しさん
2010/09/08(水) 18:10:150547デフォルトの名無しさん
2010/09/08(水) 18:20:25int e = (int)(double)(a * b);
やっぱりBCだと51になるようでした。
>>546
これは・・初めて見ました。
標準ですか?
0548デフォルトの名無しさん
2010/09/08(水) 18:28:56int g = int(c); //両方52
これって何が違うんだ?
0549デフォルトの名無しさん
2010/09/08(水) 19:03:19レジスタ
0550デフォルトの名無しさん
2010/09/08(水) 19:27:26http://ml.tietew.jp/cppll/cppll/article/4275
0551デフォルトの名無しさん
2010/09/08(水) 19:32:36だから整数で扱って、後で10^nで割ってやるのが末吉
0552483
2010/09/08(水) 20:02:00あれからやや話を進めまして一レス単位で検索をかけていくにはどうしたらいいかということを思案しています。
基本方針は一レス全体の文字列
名前<>mail<>登校日<>ID<>本文
ごとをオブジェクトとして保存するクラスを作成し、そのクラスの中に検索用のメソッドを用意しようと思っています。
class Res
{
・・・
bool SearchWord()
bool SeachID()
bool SeachDate()
}
という感じのクラスが真っ先に思いつきましたが、それ以外に
0553483
2010/09/08(水) 20:02:44class Res
{
・・・
virtual bool Search()
}
class Word : Res
{
bool Search()
}
class ID : Res
{
bool Search()
}
class Date : Res
{
bool Search()
}
という様に多態性を重視したクラスを設計するのも手かなと言う気がしてきました。
こうするとfor文で1レスから1000レスまでサーチをかける際、本文検索もID検索も日付検索も
同じ Seach() メソッドで行うことができるのですっきりとしたプログラムに仕上がります。
さらに本文、ID、日付以外にたとえばメール欄で検索をかけたくなったときとか容易に
拡張できます。
みなさんでしたらどう実装されますか?
0554デフォルトの名無しさん
2010/09/08(水) 20:05:31>>537(と暗黙的に>>456)が言ってるように、FPU上では80bit幅で計算されてる
VCしか持ってないから妄想で答えるけどBCCで前者をやると80bit幅のまま、FPUスタック上からfist命令か何かで直接整数に変換してるんじゃないかな
VCは一度(メモリの)スタックに書き出すようにしてるから結果は後者と同じになる
原因がこの場合、
BCCで使えるか知らないけど_control87関数で64bit幅で計算するようにFPUを設定しておけばこの違いはなくなるはずだよ
それかVC BCCともにコンパイラオプションでSSE使うようにするとか?
0555デフォルトの名無しさん
2010/09/08(水) 20:18:17それはおかしいだろ。
http://www.atmarkit.co.jp/im/carc/serial/object05/object05.html
↑このページの下のほうに集約の解説があるけど、このたとえなら、
ハンドルクラスやらエンジンクラスを継承して車クラスを作ってるような感じ。
おれならスレッドクラスを作って、それにレスクラスをもたせるよ。
0556デフォルトの名無しさん
2010/09/08(水) 20:53:03それじゃIDで検索したレスを日付でさらに検索したいとかするときわざわざResオブジェクトを
コピーしなきゃいけなくなるじゃないか
0557デフォルトの名無しさん
2010/09/08(水) 21:00:130559デフォルトの名無しさん
2010/09/08(水) 22:21:550560デフォルトの名無しさん
2010/09/08(水) 22:22:38コピー元の開始位置を指定できる関数ってないでしょうか?
文字列にヌル文字が含まれてるのでsubstrが使えません。
0561デフォルトの名無しさん
2010/09/08(水) 22:25:06つーか、std::string使いなよ。
0562デフォルトの名無しさん
2010/09/08(水) 22:27:48ありがとうございます。それでなんとかなるんですね。
std::stringに代入するとたとえばaaaaa\0\0\0eeee\0のようなchar配列はaaaaaで切れてしまいませんか?
0563デフォルトの名無しさん
2010/09/08(水) 22:43:280564デフォルトの名無しさん
2010/09/08(水) 22:47:51stringでいろいろ試してみますありがとうございます。
0565デフォルトの名無しさん
2010/09/08(水) 22:52:45何か悪いこと起こりますか?
0566デフォルトの名無しさん
2010/09/08(水) 23:03:590567デフォルトの名無しさん
2010/09/09(木) 01:02:00なんで Res のクラス内に検索入れるの?わかんない
Res の集合(vector とか)をベースにしたクラスならわかるけど
Res は既に日付持ってるんでしょ?
0568デフォルトの名無しさん
2010/09/09(木) 01:18:51それができたからって >>474 はコンパイル通らねーだろ。
0569デフォルトの名無しさん
2010/09/09(木) 09:40:15Foo のメンバ変数は一つなんだよ
コンパイラ通らないっていうけど、C++0x に準拠したもので試してるのか?
0570デフォルトの名無しさん
2010/09/09(木) 10:17:380571デフォルトの名無しさん
2010/09/09(木) 11:52:26C++0x なら Foo foo[ 100 ]={} でいいだろ。
>>474 のように 0 を書いちゃうと、 boo を 0 で初期化することになって、
Boo に int を受け取るコンストラクタが無いから、エラーになるだろう。
0572デフォルトの名無しさん
2010/09/09(木) 13:47:32>Boo に int を受け取るコンストラクタが無いから、エラーになるだろう。
C++0xの話だといってるのに・・・
0573デフォルトの名無しさん
2010/09/09(木) 14:08:300574デフォルトの名無しさん
2010/09/09(木) 14:17:28特定の条件を満たす要素を巡回するイテレーターを作りたいと思ってるんだけど
1:まったく別の新しい型としてイテレーター型を実装する
2:型消去を使って隠蔽する
3:アダプタをかませる
とりあえずこんな方法が思いつくけど、どれも一長一短でいまいち
1はコードが重複するしクライアントがイテレーターの型を意識しないといけない
2はクライアントは楽だけどメモリ、実行効率ともに若干劣る
3は1よりコード重複が少ないけれどクライアントが型を意識しなければならない点は同じ
なにかほかにいいアイデアはないですかね?
0575デフォルトの名無しさん
2010/09/09(木) 14:51:04C++0x勉強中だけど、どのコンパイラなら
Foo foo[ 100 ]={0};
がエラーにならないの?その場合配列はどのように初期化されるの?
手持ちのgcc 4.3.3では-std=gnu++0x指定しても当たり前のように
エラーになるけど。
0576デフォルトの名無しさん
2010/09/09(木) 15:21:16何がしたいのかか全然わからん
作るべきはコンテナじゃないのか?
0577575
2010/09/09(木) 15:37:26×手持ちのgcc 4.3.3
○手持ちのgcc 4.4.3
0578デフォルトの名無しさん
2010/09/09(木) 15:41:11やりたいのは boost::filter_iterator みたいなもの?
0579デフォルトの名無しさん
2010/09/09(木) 15:44:45当たり前だ
その一行だけを書いて通るわけがない
エラーメッセージとか読めないのか
0580575
2010/09/09(木) 15:50:46その一行だけ書いてコンパイルするほどバカじゃないです。
コードは↓ですよ。
struct Boo
{
Boo() : b( 111 ){}
int b;
};
struct Foo
{
Boo boo;
int f;
};
Foo foo[ 100 ];
0581デフォルトの名無しさん
2010/09/09(木) 15:51:200582575
2010/09/09(木) 15:52:32Foo foo[ 100 ];
↓変更
Foo foo[ 100 ]={0};
でエラーになります。
0584デフォルトの名無しさん
2010/09/09(木) 15:56:58全角が混じってるとエラーになるよ
0585デフォルトの名無しさん
2010/09/09(木) 16:00:45ググって見た感じそれっぽいすね(在るの知らなかった)
やりたいことはフィルターだけじゃないけど参考にしてみます
どうもでした
>>576
たとえば二分木なら幅優先で、深さ優先で巡回するイテレーター
あるいはノードを指定したらその子ノードのみ巡回するイテレーターとか
線形配列でも偶数値のみとか、1つおきにとか、逆順で、とかで巡回するイテレーター
同じコンテナのイテレーターといっても複数のバリエーションが考えられる場合があるわけでして
それらをひとつのインターフェースにまとめてかつ実行効率もそれなりに保ちたい方法は無いものかなと質問したんだけどはしょりすぎたかな…?
0586デフォルトの名無しさん
2010/09/09(木) 16:07:220587デフォルトの名無しさん
2010/09/09(木) 16:12:17全角ってどこにあるんだ?
0588デフォルトの名無しさん
2010/09/09(木) 16:17:44それって、現存のコンテナは使えないわけだから、
新しいコンテナを作るってことであって、そのコンテナをどう作るのかって問題だよね。
0589デフォルトの名無しさん
2010/09/09(木) 16:19:43reverse_iteratorみたいな感じにすれば?
0590デフォルトの名無しさん
2010/09/09(木) 16:23:11遊ばれてるのがわからないのか?
初心者としての質問なら、エラーメッセージの内容を貼るぐらいしろ。
でなく、0x の仕様に関する質問なら
ttp://hibari.2ch.net/test/read.cgi/tech/1275375522
へ逝け!
0591デフォルトの名無しさん
2010/09/09(木) 16:36:43そういうイテレーター作ったとしても、他のコンテナでは利用できないんだから、
イテレーターとしての存在価値はないでしょ。
イテレータは違う種類のコンテナに対しても同じように使えるからいいんだよ。
イテレータは今の物を使い、そういう動作をするコンテナを作ればよい話じゃないの?
0592デフォルトの名無しさん
2010/09/09(木) 16:38:40この時間に2chしてる奴とも仕事したくないw
0593デフォルトの名無しさん
2010/09/09(木) 17:13:560594デフォルトの名無しさん
2010/09/09(木) 17:16:180595デフォルトの名無しさん
2010/09/09(木) 17:30:20vector であろうが map であろうが同じコードで使えるのが重要
専用のコンテナでしか使えないイテレーターなんかイラネーヨ
0596デフォルトの名無しさん
2010/09/09(木) 17:35:00やっぱりw
使い回しているのはイテレータではなくアルゴリズムだろ
0597デフォルトの名無しさん
2010/09/09(木) 17:46:35ひょっとして異なるコンテナのイテレーターも同じひとつのクラスなんだって勘違いしてない?
0598デフォルトの名無しさん
2010/09/09(木) 17:46:49アルゴリズム以前だよ。
どんなコンテナでも for 文で begin() と end() で回したりできるだろ。
イテレーターとはそういう物だよ。
君が抽象化の意味を理解できていなことはよくわかったぞ。
0599デフォルトの名無しさん
2010/09/09(木) 17:50:10同じクラスでなく、同じイテレーターとして抽象化されてることに意味がある。
違う種類のコンテナでも同じコードでアクセスできるってこと。
専用コンテナでしか使えないイテレータでは意味が無い。
イテレーターである必要もない。
0600デフォルトの名無しさん
2010/09/09(木) 17:50:47begin()、end()で両端を取るのはイテレーターそのものの性質じゃなくてSTLコンテナのポリシーだろ
0601デフォルトの名無しさん
2010/09/09(木) 17:51:45そのポリシーこそが抽象化だろ
0602デフォルトの名無しさん
2010/09/09(木) 17:53:35専用コンテナでしか使えないイテレーターってどれのこと?
そんな話題どこにも出てないと思うんだけど
0603デフォルトの名無しさん
2010/09/09(木) 17:55:12>>585 で作ろうとしてるイテレーター
0604デフォルトの名無しさん
2010/09/09(木) 17:55:440605デフォルトの名無しさん
2010/09/09(木) 17:56:13そう抽象化だよ。ただしそれはコンテナの抽象化ね
イテレーターの抽象化ではない
今話してるのはイテレーターそのものについてなのよ
0606デフォルトの名無しさん
2010/09/09(木) 17:57:31違うしwww
0607デフォルトの名無しさん
2010/09/09(木) 17:59:05>>585が作りたいのもfor文で回したりできるやつだと思うぞ
0608デフォルトの名無しさん
2010/09/09(木) 17:59:26もちろん個々のイテレータはSTLのイテレータとしての要件を満たすように作るだろうし、
そうすれば各種アルゴリズムにも使える。
0609デフォルトの名無しさん
2010/09/09(木) 17:59:38そういうイテレータを作ることは可能だけど、
作ったところでそれをサポートするのは専用コンテナだけなわけで、
つまりイテレーターとしての価値はない。(イテレーターは抽象化されるのが前提)
イテレータである必要もない。
0610デフォルトの名無しさん
2010/09/09(木) 18:01:220611デフォルトの名無しさん
2010/09/09(木) 18:04:45>>608
けどそのイテレータを begin() では取得できないでしょ。
そのイテレータを返す専用メソッドが必要であり、
そのメソッドは vector には存在しない。
だからイテレータの種類を変えるのではなく、
同じ begin() で動作が変わるイテレータを返すコンテナを作ればいいと言ってるんだよ。
もちろんアルゴリズムでもそのまま使用できる。やりたいことはできるんだし、それが抽象化でしょ。
0612デフォルトの名無しさん
2010/09/09(木) 18:08:09イテレータはコンテナを抽象化するための物だよ
幾らイテレーター自身を抽象化しても、元の目的が果たせなければ、全然意味ないよ。
0613デフォルトの名無しさん
2010/09/09(木) 18:09:32begin()で取得できますよ。残念でしたね
0614デフォルトの名無しさん
2010/09/09(木) 18:12:24イテレータはコンテナに属している必要は無いよ。
std::istream_iteratorやboost::counting_iterator、boost::filter_iteratorなんかが例。
イテレータは値の列の抽象化ではあってもコンテナの抽象化ではない。
0615デフォルトの名無しさん
2010/09/09(木) 18:14:35rbegin
rend
についてどう思われますか?
これもイテレーターを返しますがbeginとendでないと認められないのでは?
0616デフォルトの名無しさん
2010/09/09(木) 18:15:12は?
begin() は従来のイテレーターが返ってくるだろ。
それとは別の動作をするイテレータが必要なんだろ。当然別メソッドになる。
そうではなく begin() で従来のイテレータを返すんなら、
それは新しいイテレータを作るという話でなく、
単に新しいコンテナを作るという話だろ。
0617デフォルトの名無しさん
2010/09/09(木) 18:20:14こいつらセットになることが多いけど本質的には関係ないからね
0618デフォルトの名無しさん
2010/09/09(木) 18:20:28リバースイテレータ、コンストイテレータの類は異種のコンテナでも共通で使えるから意味がある
専用のコンテナでしかつかえない専用イテレータは本来のイテレータとは趣旨が変わってくる
イテレータである必要もない
0619デフォルトの名無しさん
2010/09/09(木) 18:24:12とりあえず専用イテレータって表現やめてもらえますか
おそらく「専用に決まってんだろ」って人と「専用じゃ意味ないだろ」って人が出るんで
0620デフォルトの名無しさん
2010/09/09(木) 18:25:41専用のコンテナでしか使えない専用イテレーターってのがよくわからないんだけど
プライベートなイテレーターってこと?
ちょっと具体的に擬似コードでいいから示してくれないかな
0621デフォルトの名無しさん
2010/09/09(木) 18:26:08class xyz_iterator {
Contaner *contaner;
Iter iter;
...
};
0622デフォルトの名無しさん
2010/09/09(木) 18:30:05begin() で帰ってるイテレータとは別の種類のイテレータだから、
例えば nbegin() とかでしょ。
この nbeing() が他のコンテナには存在しないんだから、
それをサポートするコンテナは専用コンテナだってこと。
0623デフォルトの名無しさん
2010/09/09(木) 18:33:54そうだねnbeginはそのコンテナ専用かもしれないね
でもそのnbeginが返すイテレーターは別にそのコンテナ専用でもなんでもないよね
それで特定のコンテナ専用のイテレーターって何なの?
0624デフォルトの名無しさん
2010/09/09(木) 18:34:07元の質問は「その複数種類のイテレータを別な型にすべきか否か」だっけ。
動的にやれば同じ型にできるけど、オーバーヘッドがある。
例えばrbegin()とbegin()が同じ型のイテレータを返す、というやつ。
iteratorとreverse_iteratorみたいに探索の種類ごとに別々の型にしようとすると、
コンテナをどの順番で辿るかを型の中に書く必要があるけど、これは避けるべき?
という話だった。
0625デフォルトの名無しさん
2010/09/09(木) 18:38:45array.begin()で先頭アドレス取れねーつうかコンパイルエラーだよね
ポインタはイテレーターでないという解釈でいいのかな?
0626デフォルトの名無しさん
2010/09/09(木) 18:39:57だからそのときにイテレータの種類を変えるのではなく、
begin() だけしか持たないコンテナを2種類用意(切り替えでも可)すればいいじゃん。
それがイテレータの思想でしょう。
0627デフォルトの名無しさん
2010/09/09(木) 18:47:20幅優先と深さ優先の例だと、最後の位置が変わるから
別な型にするしかないんじゃ無いだろうか
0628デフォルトの名無しさん
2010/09/09(木) 18:51:16せめてアダプタにしろ
それとイテレータの思想じゃねーよ
begin/endはSTLコンテナの思想だ
0629デフォルトの名無しさん
2010/09/09(木) 18:57:00>>627は忘れてる下さい
0630デフォルトの名無しさん
2010/09/09(木) 19:26:45どういう見解を持っているのか知りたい。
0631デフォルトの名無しさん
2010/09/09(木) 19:33:30標準は曖昧すぎなのです。
明日会社休んで1日企画書と睨めっこして
標準委員会への具体的な提案を考えたいと思います。
0632デフォルトの名無しさん
2010/09/09(木) 20:11:04even_row_iteratorとかodd_column_iteratorとか
diagonal_iteratorとかchecker_black_iteratorとか
empty_cell_iteratorとかtitle_iteratorとか
目的別に作って使い分けたりしないの?
0633483
2010/09/09(木) 21:43:01> なんで Res のクラス内に検索入れるの?わかんない
オブジェクト指向というのはそういうものかと思いまして(;´Д`)・・・
> Res の集合(vector とか)をベースにしたクラスならわかるけど
検索は一レス単位で行うので検索のメソッドもResクラスに入れるのが常套かと思いまして・・・
0634デフォルトの名無しさん
2010/09/09(木) 22:27:38条件にあってるかどうかの判定だろ?
0636デフォルトの名無しさん
2010/09/09(木) 23:11:26あるクラスについて、基本的にある型の変数のみをメンバ変数に持ち
メンバ関数にはその型に関連が強い関数や元の型の痒いところに手がとどくような関数を入れる
例)CHWND h = hWnd; if( h.IsWindow() ) return;
CTCHAR str1="abc",str2="abc"; str1 += str2;
このようなたぐいのクラスには何か名前がついてますか?
0637デフォルトの名無しさん
2010/09/09(木) 23:35:37プリミティブ型をオブジェクトとして扱うためのラッパークラスみたいなやつのこと?
0638デフォルトの名無しさん
2010/09/09(木) 23:47:00ラッパークラスぐぐってみましたがまさにこれですね
ラッパークラスというのは耳にしたことはあるのですがこれがそうだったんだ
どうもありがとうございます
0639デフォルトの名無しさん
2010/09/09(木) 23:49:180640デフォルトの名無しさん
2010/09/10(金) 00:13:45Resは検索される方なんだから、引数のIDや名前、日付と一致するか等々を
返す関数を持たせておけばいいじゃん。
検索する関数はコンテナクラスに入れるのが普通だと思うけどな。
0641デフォルトの名無しさん
2010/09/10(金) 11:04:16他の Res の事なんか知らないはずなのに
ちゃんと考えてるんだろうか…
0642デフォルトの名無しさん
2010/09/10(金) 16:31:42その言語で複雑な条件の検索をできるようにする。
0643デフォルトの名無しさん
2010/09/10(金) 16:46:590644483
2010/09/10(金) 21:26:06> Resは検索される方なんだから、引数のIDや名前、日付と一致するか等々を
> 返す関数を持たせておけばいいじゃん。
おっしゃるとおりです。そう実装しようと思っています。
こんな感じになりますか。
for(i=0; i<1000; i++)
res[i].SearchWord();
たとえば res[1] とは1レス目を格納したクラスオブジェクトです。
1レス目から1000レスまで検索かけて検索に合致したレス番を収集しようと思っています。
>>641
そうなんですよね・・・
どう実装するかが問題でして。
レスクラスに本文、ID、日付等を検索する専用のメソッドを用意するか、
あるいは本文用のレスクラス、ID用のレスクラス、日付用のレスクラスを用意するべきか、
悩みどころです・・・
0645デフォルトの名無しさん
2010/09/10(金) 21:59:27>643じゃないけどSQLiteでも使ったら? 好きなだけ検索方法を試せるよw
0646デフォルトの名無しさん
2010/09/10(金) 22:09:20res.match_date_between()
...
0647デフォルトの名無しさん
2010/09/11(土) 01:23:40上位にくるページのサンプルコードをg++(version4.4.3)で
コンパイルしたところ,呼び出した関数がprotectedだって
コンパイラに怒られました.なんで?
0648デフォルトの名無しさん
2010/09/11(土) 01:27:530649デフォルトの名無しさん
2010/09/11(土) 02:45:100650デフォルトの名無しさん
2010/09/11(土) 03:08:140651デフォルトの名無しさん
2010/09/11(土) 03:50:31方針としては中途半端。
「見えちゃ嫌だけどちょっとは見えたほうが」
そんなの微妙すぎ。
0652647
2010/09/11(土) 07:30:06エラー通りだと思うんですけど,サンプルじゃprotectedになってんです
>>649
勝手にURI載っけていいの?
申し訳程度に改変して載っけると下のコードです.
適当な予想だとvc++では動くとか,動作は未確認でサンプル載っけたとか
class Hoge {
public:
virtual void Dispatch( Hoge* other ) = 0;
protected:
virtual void Action( Hoge_A* other ) = 0;
virtual void Action( Hoge_B* other ) = 0;
};
class Hoge_A : public Hoge {
public:
virtual void Dispatch( Hoge* other ) {
other->Action( this );
}
protected:
virtual void Action( Hoge_A* other ) { Greet( other );}
virtual void Action( Hoge_B* other ) { Eating( other );}
}
class Hoge_B : Hoge {
public:
virtual void Dispatch( Hoge* other ) {
other->Action( this );
}
protected:
virtual void Action( Hoge_A* other ) { Dance( other );}
virtual void Action( Hoge_B* other ) { Greet( other );}
}
0653デフォルトの名無しさん
2010/09/11(土) 08:32:22URLも書いちゃいけないようなところを参考にするなよ、馬鹿。
0654デフォルトの名無しさん
2010/09/11(土) 09:48:40VC++ でも protected の挙動が違うようなことは聞いたことがないなぁ。
たぶん確認せずに載せてるんだろう。
まぁ >>651 ってことで、これにびっくりするようなら protected なんて使わなけりゃいいよ。
0655デフォルトの名無しさん
2010/09/11(土) 10:19:57> class Hoge_B : Hoge {
糞の役にも立たない自説を披露する前にこの辺を指摘してやれよ
0656デフォルトの名無しさん
2010/09/11(土) 10:26:48最初の other->Action( this ) までで問題は明らかなんで、その先は読んでなかった。
あらためて読み直してそこや他もいくつかおかしい気がしたけど、やっぱりどうでもいい。
0657デフォルトの名無しさん
2010/09/11(土) 11:03:08指摘された箇所と親クラスのprotectedをpublicにしたら,
それらしく動きました.ありがとうございました.
0658デフォルトの名無しさん
2010/09/11(土) 11:52:30URL掲載を禁止できるような権利はサイト作成者に発生しないよ。
http://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%B3%E3%82%AF%E3%83%95%E3%83%AA%E3%83%BC
0659デフォルトの名無しさん
2010/09/11(土) 13:14:10>誹謗中傷が少なからずウェブで行われているなど、
>「インターネットの知を豊かにする」というウェブの理念自体が
>一部で形骸化している現実がある。そのような背景から、
>いわゆる「悪意のあるリンク」はモラル面から批判されることがある。
0660デフォルトの名無しさん
2010/09/11(土) 14:16:480661デフォルトの名無しさん
2010/09/11(土) 15:51:480662デフォルトの名無しさん
2010/09/11(土) 15:58:01アルゴリズムだけ入れ替えて実測する
プロファイラ走らす
0663デフォルトの名無しさん
2010/09/11(土) 16:05:55アルゴリズムに癖があるなら、その癖を突くデータを用意したりする。いいほうと悪いほうと汎用なほうと。
0664デフォルトの名無しさん
2010/09/11(土) 16:07:20測るためのコードを教えてください。
0665デフォルトの名無しさん
2010/09/11(土) 16:25:190666デフォルトの名無しさん
2010/09/11(土) 16:26:39C++では測定する関数が無いから出来ないと思った。
Javaならできる確か・・・
0667デフォルトの名無しさん
2010/09/11(土) 16:28:38クラスにしても20行くらいだぜ?簡単だろ?
0668デフォルトの名無しさん
2010/09/11(土) 16:43:22C++でも関数あるでしょ - プラットフォーム依存性はあるが
0669デフォルトの名無しさん
2010/09/11(土) 16:47:51確かC++でも出来ると思ったけど思い出せない。
あまり本とかに出てこないから詳しい人なら分かるかも。
0670デフォルトの名無しさん
2010/09/11(土) 16:51:000671デフォルトの名無しさん
2010/09/11(土) 16:51:440672デフォルトの名無しさん
2010/09/11(土) 16:52:44思い出せないが。
0673デフォルトの名無しさん
2010/09/11(土) 17:08:090674670
2010/09/11(土) 17:08:210675デフォルトの名無しさん
2010/09/11(土) 17:32:320676デフォルトの名無しさん
2010/09/11(土) 17:46:010677デフォルトの名無しさん
2010/09/11(土) 18:01:230678デフォルトの名無しさん
2010/09/11(土) 18:38:40あれ。。。開発環境依存だっけな??
0679デフォルトの名無しさん
2010/09/11(土) 18:51:360680デフォルトの名無しさん
2010/09/11(土) 18:54:210681デフォルトの名無しさん
2010/09/11(土) 19:08:15標準関数だろ。
0682デフォルトの名無しさん
2010/09/11(土) 19:10:44カッコイイ決めぜりふを残したガイキチがいたけど、
まるで同一人物の様だ。
0683デフォルトの名無しさん
2010/09/11(土) 19:34:390684デフォルトの名無しさん
2010/09/11(土) 19:49:320685デフォルトの名無しさん
2010/09/11(土) 19:59:42それは俺も気になります
今は物理的(?)にfor内部に評価前関数自体が展開されるような自前マクロ作って使ってるんですが
なんだかウサン臭く思うので正式なのがあればそれを使いたい
0686デフォルトの名無しさん
2010/09/11(土) 20:21:080687デフォルトの名無しさん
2010/09/11(土) 21:53:42現場のプロクラマーが主張するぜ
コンストラクタとデストラクタ以外を protected にせずに
インターフェース以外は private にすると再利用性の高いクラスが出来上がるんだぜ
protected なメンバーをもつクラスを書くやつは間抜けに見えるんだぜ
0688デフォルトの名無しさん
2010/09/11(土) 22:00:43privateだと派生先では使えなくなるわけだが、再利用性が高いってどういうことだろう。
派生先で元のprivateの機能を使いたくなった場合はどうすりゃいいんだ?
0689デフォルトの名無しさん
2010/09/11(土) 22:03:510690デフォルトの名無しさん
2010/09/11(土) 22:09:28それがほんとうに必要なら派生元が派生先を使う、教える
必要で可能なら派生元を変える
class A {
void f() { g(); }
virtual void g() = 0;
int x;
void h() { h(x); }
virtual void i(int&) = 0;
};
0691デフォルトの名無しさん
2010/09/11(土) 22:09:30いや、protectedは使わずpublic意外は全部privateにしろって話だろ。
要するにprivateな部分は派生先で全部実装し直せってことか。
ちょっと機能を変えたいって場合は、派生なんかしないで元を直せって話なのかな。
0692デフォルトの名無しさん
2010/09/11(土) 22:18:48class Aが抽象クラスになっちゃってインスタンス化できないんだけど、それはいいのか。
利点がよくわかんね、俺protectedでいーや。
0693デフォルトの名無しさん
2010/09/11(土) 22:19:25public以外は全部protected
privateは禁止
だろ常考
0694デフォルトの名無しさん
2010/09/11(土) 22:30:080695デフォルトの名無しさん
2010/09/11(土) 22:37:210696デフォルトの名無しさん
2010/09/11(土) 23:26:290697デフォルトの名無しさん
2010/09/11(土) 23:29:000698デフォルトの名無しさん
2010/09/11(土) 23:29:59つーか、.*でもオーバーロードはできんだろ。
0699687
2010/09/11(土) 23:30:01派生先が派生元の機能を使うとき
派生元を派生先から使われる機能の集合として考えるのではなく
派生元は派生先で特殊化される、振る舞いの雛形として機能させる
ここで最後に、「設計する」ではなく「機能させる」としたのが実務派のこだわり
可能ならば「機能する」ように設計を変えてしまうのも可ってこと
キャラをすっかり忘れてたので適宜「だぜ」を付けて読んでね
0700デフォルトの名無しさん
2010/09/12(日) 02:08:45派生元が持っているべき機能であれば、その機能をメンバ関数として提供する。
この場合、派生先だけに利用を制限する意味はほぼ無いので、 public でいい。
protected は「派生先だけに理由を制限する」わけだが、でっちあげでも何でも
派生クラスさえ作ってしまえば呼び出せてしまうので、カプセル化には寄与しない。
そもそも「派生元のprivateの機能」という考え自体も少しおかしい。
private であればそれは機能ではない。
0701デフォルトの名無しさん
2010/09/12(日) 02:23:360702デフォルトの名無しさん
2010/09/12(日) 02:31:360703デフォルトの名無しさん
2010/09/12(日) 02:47:510704687
2010/09/12(日) 03:02:48そのクラスツリーはいつでも必要なときに簡単に分割できる
以下で、Aの派生クラスがAのprotectedなメンバーを参照していない場合は
f と x は派生先への影響をあまり考えることなく、カプセル化を妥協することなく、BとCに分割できる
class A {
int a, b;
public:
void f() { g(a); }
void x() { y(b); }
private:
virtual void g(int&) = 0;
virtual void y(int&) = 0;
};
class B {
int a;
public: void f() { g(a); }
private: virtual void g(int&) = 0;
};
class C {
int b;
public: void x() { y(b); }
private: virtual void y(int&) = 0;
};
0705デフォルトの名無しさん
2010/09/12(日) 03:12:27クラスツリーを分割するってどんな状況だよ、根本的に設計ミスだろそれ。
そこまでするなら派生なんか不要で、抽象クラスだけ使えってことになるだろう。
0706687
2010/09/12(日) 03:51:07まぁ>>704がすべてじゃなくて、そんなことも簡単にできるほど再利用性が高いってことね
それに設計ミスなんてよくあることでしょ
最初は分割不可能な機能群だと思っていたものが
良く考えてみると全く直行してることに気づくなんて、しょっちゅうあるんじゃない?
完璧になんてできないから、多くの場合に上手くいき、良い設計を導き勝ちなノウハウが重宝するんだ
0707デフォルトの名無しさん
2010/09/12(日) 06:54:51お禿さんの本に書いてあったよ。どんな理由かは忘れたけど。
0708デフォルトの名無しさん
2010/09/12(日) 15:20:020709デフォルトの名無しさん
2010/09/12(日) 15:24:05ないです。
0710デフォルトの名無しさん
2010/09/12(日) 15:24:140711デフォルトの名無しさん
2010/09/12(日) 17:49:40基本てきに賛成だけど。
0712デフォルトの名無しさん
2010/09/12(日) 17:54:15特に良い事なんて無いからなぁ。
0713デフォルトの名無しさん
2010/09/12(日) 18:01:02テンプレートライブラリ書く時には普通に使うし
0714デフォルトの名無しさん
2010/09/12(日) 18:13:51基底の挙動が把握せずに拡張するからバグの元ってことじゃない?
やっつけ仕事には便利だけど、基本デコレーターでいきたいなぁ。
0715デフォルトの名無しさん
2010/09/12(日) 18:18:09デコレーターは実行時の動的拡張のためのパターンだ
静的拡張ならただの継承でいいんだよ
0716デフォルトの名無しさん
2010/09/12(日) 18:18:550717デフォルトの名無しさん
2010/09/12(日) 18:25:590718デフォルトの名無しさん
2010/09/12(日) 18:30:180719デフォルトの名無しさん
2010/09/12(日) 18:30:42{
void func();
};
class HogeEx : public Hoge
{
void func_ex();
};
拡張しましたよ
0720デフォルトの名無しさん
2010/09/12(日) 18:31:590721デフォルトの名無しさん
2010/09/12(日) 18:40:12オーバーロードや新しいメソッドを継承先が作ったら抽象的にあつかえないでしょ。
0722デフォルトの名無しさん
2010/09/12(日) 18:44:29Hoge::func();
}
0723デフォルトの名無しさん
2010/09/12(日) 19:03:08{
virtual void func();
};
class HogeEx : public Hoge
{
void func_ex();
void func() { func_ex(); }
};
つーか抽象的に扱えなくても拡張は拡張だろ
>>721の言ってることは意味不明
0724デフォルトの名無しさん
2010/09/12(日) 19:08:59{
private:
virtual void func();
};
class HogeEx : public Hoge
{
void func_ex();
void func() { func_ex(); }
};
0725デフォルトの名無しさん
2010/09/12(日) 19:13:120726デフォルトの名無しさん
2010/09/12(日) 19:21:10機能階層と実装階層が分離できてなくてクラスの数が爆発したり、
継承した分オーバーライドしたメソッドの挙動がつかみにくくなるとおもうんだけど。
0727デフォルトの名無しさん
2010/09/12(日) 19:24:420728デフォルトの名無しさん
2010/09/12(日) 19:24:55つ MFC
0729デフォルトの名無しさん
2010/09/12(日) 19:44:35ではprotectedを使ったスマートな正解をどうぞ
0730デフォルトの名無しさん
2010/09/12(日) 19:46:310731デフォルトの名無しさん
2010/09/12(日) 19:56:52べつに継承しなくても拡張すればクラスなり関数が増えるでしょ
それとvirtualにするってことはシンタックス的には派生クラスに何されても仕方ないって基底クラスが認めてるに等しいの
だから派生クラスの挙動を把握なんていちいちしてたら死んじゃうから何されてもいいように設計する
ま、完璧なコードなんて無いからしかたなくセマンティックス的に派生クラスを縛ってそこからもれなければ大丈夫なように基底を書くわけだけどね
0732デフォルトの名無しさん
2010/09/12(日) 20:02:08友達なんていねーんだよ。さっしてやれ。
0733デフォルトの名無しさん
2010/09/12(日) 20:53:550734デフォルトの名無しさん
2010/09/12(日) 21:15:38メンバが意味不明になっちゃうんだもん
0735デフォルトの名無しさん
2010/09/12(日) 21:19:04雪駄とかゲッ他で20個とかになるなら、機能分離したほうがいいと思う。
自分流だが、機能別に細かいクラスを作って、統括するクラスで細かいの全部使うっていうのは結構やるな。
0736デフォルトの名無しさん
2010/09/12(日) 21:22:39そんで必要なら後でひとつにまとめたラッパークラスを作る
0737デフォルトの名無しさん
2010/09/12(日) 21:25:50それに総ての規定クラスの共通の祖先がないのがC++の最大の欠点
0738デフォルトの名無しさん
2010/09/12(日) 21:28:210739734
2010/09/12(日) 21:28:290740デフォルトの名無しさん
2010/09/12(日) 21:28:580741デフォルトの名無しさん
2010/09/12(日) 21:39:570xでは属性ではキーワードじゃないがアトリビュートで追加される予定
0742デフォルトの名無しさん
2010/09/12(日) 21:41:070xではキーワードじゃないがアトリビュートで追加される予定
0743デフォルトの名無しさん
2010/09/12(日) 21:42:440744デフォルトの名無しさん
2010/09/12(日) 21:46:000745デフォルトの名無しさん
2010/09/12(日) 21:49:02でも、C#のset、getみたいなのがあるとちょっと便利だよね〜って話でしょ。
templateで似たようなことは出来るけど、、、
0746デフォルトの名無しさん
2010/09/12(日) 21:53:180747デフォルトの名無しさん
2010/09/12(日) 22:53:140748デフォルトの名無しさん
2010/09/12(日) 23:13:00get、setはどこから参照されているかわからないと困るから窓口設けておきましょってことだろ。
0749デフォルトの名無しさん
2010/09/12(日) 23:14:21ゲッターセッターでラップしてもおんなじなんじゃないの。
0750デフォルトの名無しさん
2010/09/12(日) 23:15:53パブリックフィールド晒すよりはマシっていうだけ。
多少はget/setも必要になるが、大半のメソッドがget/setってのはどっか間違ってる
0751デフォルトの名無しさん
2010/09/12(日) 23:18:390752デフォルトの名無しさん
2010/09/12(日) 23:22:36どうしても必要な特定の部分に自分で書けば済む
0753デフォルトの名無しさん
2010/09/12(日) 23:37:080754デフォルトの名無しさん
2010/09/12(日) 23:39:170755デフォルトの名無しさん
2010/09/12(日) 23:42:390756デフォルトの名無しさん
2010/09/13(月) 00:01:38ここ何年かでようやくC++の効果的な設計の仕方みたいなのが
熟達者たちによってまとめられてるんじゃないかなあ。
0757デフォルトの名無しさん
2010/09/13(月) 00:04:180758デフォルトの名無しさん
2010/09/13(月) 00:08:12そのうち新人に笑われるようになるから、勉強したほうがいいよ
0759デフォルトの名無しさん
2010/09/13(月) 00:09:47ゲッターとセッターが両方あるなら直接フィールドを公開するのと対してかわらん
・参照元(関数を呼び出しているところ)の確認
・フィールドのアドレスを隠す
ぐらいの効果しかないだろ
0760デフォルトの名無しさん
2010/09/13(月) 00:10:480761デフォルトの名無しさん
2010/09/13(月) 00:13:46関数かませれば後で実装を差し替えることができるでしょ
たとえば参照回数をカウントする機能とかもはじめから関数なら後で追加するのも簡単
0762デフォルトの名無しさん
2010/09/13(月) 00:14:01ゲッターとセッターかましただけでもう安心なんておかしな話だと思わない?
0763デフォルトの名無しさん
2010/09/13(月) 00:15:080764デフォルトの名無しさん
2010/09/13(月) 00:15:240765デフォルトの名無しさん
2010/09/13(月) 00:20:040766デフォルトの名無しさん
2010/09/13(月) 00:20:400767デフォルトの名無しさん
2010/09/13(月) 00:21:450768デフォルトの名無しさん
2010/09/13(月) 00:22:08だから「たいてい」って言ったんだよ
コレクションみたいな場合は別だよ
0769デフォルトの名無しさん
2010/09/13(月) 00:24:050770デフォルトの名無しさん
2010/09/13(月) 00:24:36なにか操作をもつべきでない
0771デフォルトの名無しさん
2010/09/13(月) 00:24:51だめです!設計本に書いてありますから!
0772デフォルトの名無しさん
2010/09/13(月) 00:30:550773デフォルトの名無しさん
2010/09/13(月) 00:33:18だからpublic変数はやめろと良く言われているわけ。
そこにgetとset追加したら(もちろん後で変更しやすくなったり、バグが追いやすくなったりはするが)
設計としては根本的に何も解決してないことになる。
0774デフォルトの名無しさん
2010/09/13(月) 00:36:41なんで何回も同じこと言ってんの?
0775デフォルトの名無しさん
2010/09/13(月) 00:38:040776デフォルトの名無しさん
2010/09/13(月) 00:43:13struct { int x };
こんなのにget/setが必要かなんていう話はどうでもいい。
0777デフォルトの名無しさん
2010/09/13(月) 00:48:45ちゃんとカプセル化して使う人が困らない様にする(上手な設計能力が必要)か、
いっそ変数まで全部publicにして使う人は内部動作も理解してね!って言うか。
どっちかがベスト
0778デフォルトの名無しさん
2010/09/13(月) 01:24:510779デフォルトの名無しさん
2010/09/13(月) 02:39:440780デフォルトの名無しさん
2010/09/13(月) 02:50:590781デフォルトの名無しさん
2010/09/13(月) 03:51:540782デフォルトの名無しさん
2010/09/13(月) 05:22:18中身の値が絶対に変更されることのないキャストって
reinterpret_castだけという認識でいいでしょうか?
0783デフォルトの名無しさん
2010/09/13(月) 05:34:470784デフォルトの名無しさん
2010/09/13(月) 06:38:19それはクラスにget/setがいらないって言うのとは全然別の話
やっぱりわかっていない
0785デフォルトの名無しさん
2010/09/13(月) 06:48:26全部publicにするなら、デフォルトがpublicなclass であるstructでいいだろ
っていう単純な話だろう
0786デフォルトの名無しさん
2010/09/13(月) 06:55:38structはデータの所有者がclassと違って自分以外にどっか別にいるからgetsetがいらんてだけで
0787デフォルトの名無しさん
2010/09/13(月) 07:37:09設定しようとした値以外の、内部状態が変わるようなのは、
雪駄下駄とは言わない。雪駄下駄が必要になるのは、二つ
以上の変数や構造体をアトミックに変更する必要がある場合や、
変数の値が変更された事を通知する必要がある場合に限る。
そんなの普通は設計段階で分かるだろって事だ。
0788デフォルトの名無しさん
2010/09/13(月) 07:57:26googleさんはgetは付けないらしい
setterにsetはつけるが
0789デフォルトの名無しさん
2010/09/13(月) 09:17:38>設定しようとした値以外の、内部状態が変わるようなのは、
こっちが駄目で、
>二つ以上の変数や構造体をアトミックに変更する
こっちはOKだって。
こいつセンスないわ。
0790デフォルトの名無しさん
2010/09/13(月) 10:30:25>結果的には一緒だが、structをデフォルトpublicなclassとして認識するのはどうかと思うぞ
認識もなにも,C++ってそういう言語じゃないの
0791デフォルトの名無しさん
2010/09/13(月) 10:44:04>結果的には一緒だが、structをデフォルトpublicなclassとして認識するのはどうかと思うぞ
逆にお前がやばいぞ
0792デフォルトの名無しさん
2010/09/13(月) 10:44:20なんで>>786はこんなに頭がカチンコチンなんだぜ?
0793デフォルトの名無しさん
2010/09/13(月) 10:46:46ほとんどの場合はgetだけpublicかな。
setは特別な状態を設定するとき意外はpublicにならないとおもう。
0794デフォルトの名無しさん
2010/09/13(月) 10:51:16もうね、初級者が口挟まなくていいから。
0795デフォルトの名無しさん
2010/09/13(月) 10:52:37そういう場合もあるだろうけど、それはむしろ特殊なケースでしょ
0796デフォルトの名無しさん
2010/09/13(月) 11:04:06上級者はフィールドに直接アクセスしちゃうんですね!
カッコイイデスwww
0797デフォルトの名無しさん
2010/09/13(月) 11:15:05思ったとおりだ、全然技術論が交わせるような相手でなく、ただのど素人だわ。
まぁ age てる時点でそういう感じがしたけどな。
0798デフォルトの名無しさん
2010/09/13(月) 11:37:47なんでそうなるw
0799デフォルトの名無しさん
2010/09/13(月) 11:52:280800デフォルトの名無しさん
2010/09/13(月) 12:15:580801デフォルトの名無しさん
2010/09/13(月) 12:32:45>>793
> set、getはフィールドに必ずつけるけど、
なんで必ず付けるのか?
必要なものだけに付ければ良いし、多くの場合はクラス内部の
データを加工したものが必要なだけ
データを投げ込む時も内部でどう保持しているかまで知る必要は無い
0802デフォルトの名無しさん
2010/09/13(月) 12:45:08Sourceを出させた方が速い様な気がします…
0803デフォルトの名無しさん
2010/09/13(月) 12:46:440804デフォルトの名無しさん
2010/09/13(月) 13:03:430805デフォルトの名無しさん
2010/09/13(月) 13:10:49アクセッサを作るのはデバッグを楽にするためだよ。
そこにブレークしかければどこで使われているかわかる。
検索より確実。
0806デフォルトの名無しさん
2010/09/13(月) 13:15:23あぁ public で変数晒してるのに比べればマシだね。
でも、みんなそんなところの比較をしてるんじゃないんだ。
わかってもらえないだろうか?
0807デフォルトの名無しさん
2010/09/13(月) 13:17:09アクセッサを作ると何がまずいの?
説明よろしく。
0808デフォルトの名無しさん
2010/09/13(月) 13:17:14アクセッサでラップしておくことの利点は理解してるつもりなんだけど、
Pointクラスを持つWindowクラスが、ウインドウの移動(Move関数)を提供するのか、位置を指定(Setter)することを提供するのか
という感じに、クラスによってはgetter,setterばかりになることもあると思うんだけども、その辺について聞きたい。
0809デフォルトの名無しさん
2010/09/13(月) 13:24:45デバッグ中に入れるのはわからんでも無いがそんなものを
デザインに入れればクラスのカプセル化や柔軟性は失われると思うが
まさかデバッグ中だけの話をしてるわけじゃないよね?
0810デフォルトの名無しさん
2010/09/13(月) 13:29:00アクセッサはpublicでないといけないルールでもあるのかよw
必要なものだけpublicにすればカプセルもこわれないだろ。
あとアクセッサで柔軟性云々は理解できなかった。
具体的な例をたのむ。
0811デフォルトの名無しさん
2010/09/13(月) 13:52:41Move関数を提供、でおしまいな気がするんだけど、なんでそれが
「getter,setterばかりになる」例になるの?
0812デフォルトの名無しさん
2010/09/13(月) 13:55:35アクセッサを作ることが問題なんじゃなくて、メンバ変数の存在に基づいてアクセッサを作ろうと
考えること、つまり実装の詳細に基づいてインターフェースを設計することに問題がある、という話。
多くの場合、そのような設計はカプセル化に反し、たとえばクラスの実装を変えるだけで
済むはずの変更がクラス利用者のコードにまで波及したりする可能性を高める。
0813デフォルトの名無しさん
2010/09/13(月) 14:00:36private なアクセッサって、アクセッサ使わなくてもアクセスできちゃうから、 >>805 のような
利点は得られないよね?
0814デフォルトの名無しさん
2010/09/13(月) 14:04:400815デフォルトの名無しさん
2010/09/13(月) 14:38:11Pointクラスを持つWindowクラスは、Point型変数の具体的な操作であるMove関数を提供するべき?
それともSetterを提供するべき?
.NETのライブラリではプロパティが多用されていることがあったので、どういう指針で決めたらいいか悩んでます。
言語側でプロパティのサポートがあるかないかという環境の違いなんでしょうか。
0816デフォルトの名無しさん
2010/09/13(月) 15:09:06前半は同意だが後半はむしろ逆だよ
アクセサをはじめからおいておけばよほどのことが無い限りはクライアントに影響しないコードが書ける
class Hoge
{
int x;
public:
void Set(int xx) { x = xx; }
int Get(void) const { return x; }
};
↓
class Hoge
{
Impl * pImpl;
public:
void Set(int xx) { pImpl->x = xx; }
int Get(void) const { return pImpl->x; }
};
身近な例だとこんな感じね
0817デフォルトの名無しさん
2010/09/13(月) 15:09:29public では無い場合にフィールドに必ず accessor が何故必要なの?
直接アクセスできるのに
つければ手間も増えるし class も煩雑になる
public にして他のもので使うことにすれば class 内の変更はしにくくなる
0818デフォルトの名無しさん
2010/09/13(月) 16:48:52{
FugaFuga fugagaaa;
};
class Kaibutsu
{
Hoge hoge;
};
こういう状況でメンバのhogeを任意の値で初期化するにはどういうコンストラクタを書くんですか?
0819デフォルトの名無しさん
2010/09/13(月) 16:54:130820デフォルトの名無しさん
2010/09/13(月) 17:15:14C++ではsetter,getterメソッドなんていりません。
C++では全てのメンバをpublicにしておいて、
必要なときにメンバを新しいclassにすればいいの!
暗黙の型変換と代入の定義でいいの!
0821デフォルトの名無しさん
2010/09/13(月) 17:39:36自分の中でどこからアクセスされるかものすごく明示的になっている時点で便利だとおもうけどね。
おれも以前はprivateについてはつくってなかったけど、いまはつくってるよ
0822デフォルトの名無しさん
2010/09/13(月) 17:41:450823デフォルトの名無しさん
2010/09/13(月) 17:46:520824デフォルトの名無しさん
2010/09/13(月) 17:47:440825デフォルトの名無しさん
2010/09/13(月) 18:06:23フィールドに必ずつけるって書いてるよね >>793
フィールド一つ増やしたらまたアクセッサ付けるわけ?
ほとんど get は public ということは作ったフィールド減らしにくいよね
0826デフォルトの名無しさん
2010/09/13(月) 18:08:27最悪ダミーにしてもいいし
0827デフォルトの名無しさん
2010/09/13(月) 18:16:57とそれを使ってる class やコード全てに影響及ぶ
よって、変えないかダミーにするとか
必要なくても全てに public な get を付けるのはそんなに賢いのかなぁ
0828デフォルトの名無しさん
2010/09/13(月) 18:18:360829デフォルトの名無しさん
2010/09/13(月) 18:34:32内部でしか使わないものはpublicなんかにしないよ、なにかんがえてんの。
外部で状態を参照したいものだけgetをpublicするんだよ。
なんでもpublicになんてしない。
0830デフォルトの名無しさん
2010/09/13(月) 18:40:10だから初心者が口を出すなとさっき怒られたんじゃないの?
0831デフォルトの名無しさん
2010/09/13(月) 18:44:35上級者はアクセッサごときでソースが煩雑になり管理できなくなるんですか?
0832デフォルトの名無しさん
2010/09/13(月) 18:51:03>>793
> set、getはフィールドに必ずつけるけど、
> ほとんどの場合はgetだけpublicかな。
って書いてるからほとんど get は public なんでしょ
0833デフォルトの名無しさん
2010/09/13(月) 19:31:31なんでアクセッサで煩雑になったり、拡張性が悪くなったりするんですかね?
0834デフォルトの名無しさん
2010/09/13(月) 19:51:21職場でメンバ変数、メンバ関数とかいうのオレだけだ
他人に強制したりしないが良くは思われてないかもな
もちろんC#やるときはそっちの用語使うんだが
0835デフォルトの名無しさん
2010/09/13(月) 19:58:05アクセッサが増えたら設計ミスなので、
何としても回避しなければ上級者とは呼ばれないでしょう。
0836デフォルトの名無しさん
2010/09/13(月) 20:00:16アトリビュートとかメッセージとか言い出すよりマシ
0837デフォルトの名無しさん
2010/09/13(月) 20:01:33エラー値チェックとか、ストレージの抽象化とか、遅延読み込みとか、
ちょっとでも雑務が入ったらアクセッサとは呼ばないのですか?
0838デフォルトの名無しさん
2010/09/13(月) 20:07:050839デフォルトの名無しさん
2010/09/13(月) 20:08:470840デフォルトの名無しさん
2010/09/13(月) 20:12:16いまだにウォーターフォール式ですか、なんだ老害かよ。
0841デフォルトの名無しさん
2010/09/13(月) 20:18:240842デフォルトの名無しさん
2010/09/13(月) 20:20:360843デフォルトの名無しさん
2010/09/13(月) 20:21:270844デフォルトの名無しさん
2010/09/13(月) 20:46:330845デフォルトの名無しさん
2010/09/13(月) 21:31:25ここで講釈してる人って公開されてるコードはレベル低すぎて話にならんって感じなのかな
リアリティ感じないが
0846デフォルトの名無しさん
2010/09/13(月) 21:35:15いきなり無い書いてんの、でなおせよ。
オレ様チャン知ってるオープンソースのコードは世界一ですか?
0847デフォルトの名無しさん
2010/09/13(月) 21:36:42単に日本のPG/SEの脳が足りないだけだろう。
海外では頭が良いやつがちゃんと報酬のもらえるPG/SEになっている。
日本は頭がお粗末なやつがろくに報酬のもらえないPG/SEになっている。
0848デフォルトの名無しさん
2010/09/13(月) 21:38:54海外のコーダーが書いたものについて言ってるんだが
0849デフォルトの名無しさん
2010/09/13(月) 21:46:19で、具体的にどのオプソプロジェクト?
0850デフォルトの名無しさん
2010/09/13(月) 22:18:31RoRみてみろ
0851デフォルトの名無しさん
2010/09/13(月) 22:44:42便利だから使いたいとかそんなレベルの話ではない
0852デフォルトの名無しさん
2010/09/13(月) 22:45:56ど
い
0853デフォルトの名無しさん
2010/09/13(月) 22:47:070854デフォルトの名無しさん
2010/09/13(月) 22:49:450855デフォルトの名無しさん
2010/09/13(月) 23:00:53なんでアクセッサがpublic前提なんだよおまえは。
0856デフォルトの名無しさん
2010/09/13(月) 23:02:570857デフォルトの名無しさん
2010/09/13(月) 23:03:09>>855
何度目だwww
0858デフォルトの名無しさん
2010/09/13(月) 23:04:28マルチプラットフォームにするためにqtやgtkを使って作られていたら
簡単にクラックやプロトコルの解析がされていましたか?
0859デフォルトの名無しさん
2010/09/13(月) 23:05:32ここってC++のスレなんだけど RoRって C++で書かれてるの?
0860デフォルトの名無しさん
2010/09/13(月) 23:06:13全然
0861デフォルトの名無しさん
2010/09/13(月) 23:08:55うんこ
0862デフォルトの名無しさん
2010/09/13(月) 23:11:290863デフォルトの名無しさん
2010/09/13(月) 23:14:220864デフォルトの名無しさん
2010/09/13(月) 23:15:100865デフォルトの名無しさん
2010/09/13(月) 23:16:120866デフォルトの名無しさん
2010/09/13(月) 23:16:550867デフォルトの名無しさん
2010/09/13(月) 23:17:100868デフォルトの名無しさん
2010/09/13(月) 23:17:18ゲッタやセッタがたくさんあるとね実装が丸見えになって、内部の実装変えたときに動作が変わらないようにするのが大変なのよ
0869デフォルトの名無しさん
2010/09/13(月) 23:19:110870デフォルトの名無しさん
2010/09/13(月) 23:21:070871デフォルトの名無しさん
2010/09/13(月) 23:23:360872デフォルトの名無しさん
2010/09/13(月) 23:26:330873デフォルトの名無しさん
2010/09/13(月) 23:28:290874デフォルトの名無しさん
2010/09/13(月) 23:29:45フィールド丸出しにしてるといろんな方法で操作できて統制ができなくなるんでデバッグ不能のバグの宝庫になる。
ゲッターやセッターがたくさんあると同じことだ
0875デフォルトの名無しさん
2010/09/13(月) 23:43:14アクセサ必要になったらhoge.aを使ってるとこを
全部自動でhoge.geta()に変えてくれるような機能ってないの?
あればそれで解決じゃん
0876デフォルトの名無しさん
2010/09/13(月) 23:44:50いや、アクセッサがあるからいけないってわけじゃねえだろ。
フィールドを沢山抱えていたり、むやみにpublicにしている設計がわるいんだろ。
思い込みでアクセッサはダメとかかいてんじゃねえ。
0877デフォルトの名無しさん
2010/09/13(月) 23:46:05struct hoge{
__declspec(property(get=geta, put=seta)) type a;
};
0878デフォルトの名無しさん
2010/09/13(月) 23:46:25アクセッサが増えるのは設計に問題がある兆候って感じだな
0879デフォルトの名無しさん
2010/09/13(月) 23:53:230880デフォルトの名無しさん
2010/09/13(月) 23:54:21アクセッサが悪いわけじゃねえよな。
0881デフォルトの名無しさん
2010/09/13(月) 23:58:010882デフォルトの名無しさん
2010/09/13(月) 23:58:400883デフォルトの名無しさん
2010/09/13(月) 23:59:130884デフォルトの名無しさん
2010/09/14(火) 00:01:200885デフォルトの名無しさん
2010/09/14(火) 00:05:19本に書いてあったんだもん!じゃなくてよ。
それを理解したお前の言葉でその理由をちゃんと説明しろよ。
あとその本を晒せ。
0886デフォルトの名無しさん
2010/09/14(火) 00:06:47毎回引数でしていして受け渡し。。。
0887デフォルトの名無しさん
2010/09/14(火) 00:13:110888デフォルトの名無しさん
2010/09/14(火) 00:18:23みたいなサイト(和訳だったか?)がちょっと前に貼られてたのだが思い出せない。
暇な人よろしかったら教えてください。
0889デフォルトの名無しさん
2010/09/14(火) 00:20:50なんだよ、自分の言葉で語れるほど理解して使いこなしてねえのかよw
0890デフォルトの名無しさん
2010/09/14(火) 00:32:310891デフォルトの名無しさん
2010/09/14(火) 00:36:31| | | | | | | | | | || | |
| | | レ | | | | | J || | |
| | | J | | | し || | |
| レ | | レ| || J |
J し | | || J
| し J|
J レ
/V\
/◎;;;,;,,,,ヽ
_ ム::::(l|l゚Д゚)| …うわぁ
ヽツ.(ノ::::::::::.:::::.:..|)
ヾソ:::::::::::::::::.:ノ
` ー U'"U'
バカがC++でコード書いて会社が潰れようが
それはそいつを雇った会社が悪いわけであって、
ちゃんと「C++でOOPやると決めた時にはOOPらしい正しい設計できる」やつらは
むしろ他者は潰れてくれた方がいいじゃん。
0892デフォルトの名無しさん
2010/09/14(火) 00:44:120893デフォルトの名無しさん
2010/09/14(火) 00:58:020894デフォルトの名無しさん
2010/09/14(火) 01:07:41思い出した。コレだ。でも今見るとインパクト薄いな。
OOコード養成ギブス
http://d.hatena.ne.jp/akkt/20080424/1209051266
0895デフォルトの名無しさん
2010/09/14(火) 01:48:40まず、 Windows クラスが Point を内部に持つかどうかという実装の詳細は関係ない。
そのうえで Move() 関数か、 setter か、どっちか呼び出し元のコードが自然になるほうを
選ぶといい。呼び出し元のコードがどうなるかに基づいて設計するのがポイント。
C# のプロパティはインターフェースを作る際の選択肢として、関数呼び出しの表記よりも
直感的な object.property = value というような表記を選べるようにしたのであって、内部に
そのようなデータを持っていることを前提としておらず、ここで非難されている、
実装を暴露するような getter/setter とは違う。その点で「言語側でプロパティのサポートが
あるかないかという環境の違い」という認識は間違ってないと思う。
0896デフォルトの名無しさん
2010/09/14(火) 01:59:56みんな「アクセッサ」といえば public なやつのことだと思ってます。
private は好きにしてくれたらいいです。
public な get/set がたくさんあることに問題を感じるのであれば、
ここでほかの人と意見の衝突はありません。
0897デフォルトの名無しさん
2010/09/14(火) 02:31:24だいぶ流れてたのにレスありがとう。
>そのようなデータ
というのは先ほどの例でいうとPointのことですよね?
Pointを内部に持つかということに関わっていたら実装を隠蔽できてないことになる、と。
0898デフォルトの名無しさん
2010/09/14(火) 02:34:12private:
friend class Test;
int hoge;
って定義してある場合、自前でTestクラスを作って、
hogeにアクセスするのはありなの?
0899デフォルトの名無しさん
2010/09/14(火) 02:36:360900デフォルトの名無しさん
2010/09/14(火) 02:40:14そうなってる場合はどっかに同じく「既存の」 class Test があるだろうから、
自前で Test クラスを作った場合、良くてコンパイルエラー、あるいはリンクエラー、
悪ければ ODR 違反による未定義動作でわけのわからない動作。
0901デフォルトの名無しさん
2010/09/14(火) 07:47:55http://codepad.org/1iSGL0Zv
set<class_name>::iterator::p
で
*p
はクラスを指すことにならないのでしょうか?
0902901
2010/09/14(火) 07:50:54stl の教科書でつまずいています。
http://codepad.org/1iSGL0Zv
set<class_name>::iterator p
で
*p
はclass_name のオブジェクトをあらわすことにならないのでしょうか?
0903デフォルトの名無しさん
2010/09/14(火) 08:13:48↓
ostream &operator<<(ostream &s, const state &o) {
setの中身が直接書き換えられるのはまずいから
0905デフォルトの名無しさん
2010/09/14(火) 09:21:06はどこで初期化しますか?
初歩的な質問ですがおねがいします。
0906デフォルトの名無しさん
2010/09/14(火) 12:02:49あるいはAbstractionの切り替えメンバを用意する
0907デフォルトの名無しさん
2010/09/14(火) 12:07:01実装はきまりきってるから
ポインターにする意味なくないですか?
0908デフォルトの名無しさん
2010/09/14(火) 12:12:050909デフォルトの名無しさん
2010/09/14(火) 12:13:50スイッチできるんじゃないんですか?
0910デフォルトの名無しさん
2010/09/14(火) 12:25:500911デフォルトの名無しさん
2010/09/14(火) 12:30:100912デフォルトの名無しさん
2010/09/14(火) 12:34:54で き な い
0913デフォルトの名無しさん
2010/09/14(火) 12:37:390914デフォルトの名無しさん
2010/09/14(火) 12:37:53implementation body;
Abstraction():body(implementation())
{}
出来ますがなにか?
0915デフォルトの名無しさん
2010/09/14(火) 12:40:10できてねーよカス
0916デフォルトの名無しさん
2010/09/14(火) 12:42:090917デフォルトの名無しさん
2010/09/14(火) 12:44:460918デフォルトの名無しさん
2010/09/14(火) 12:45:07クラス数の爆発を抑えるためのbridgeパターンだろうが
真逆の方向に行ってどうすんだハゲ
0919デフォルトの名無しさん
2010/09/14(火) 12:46:540920デフォルトの名無しさん
2010/09/14(火) 12:58:360921デフォルトの名無しさん
2010/09/14(火) 13:03:13Abs2<Impl>を作るとかの発想は無いの?
0922デフォルトの名無しさん
2010/09/14(火) 13:05:140923デフォルトの名無しさん
2010/09/14(火) 13:06:310924デフォルトの名無しさん
2010/09/14(火) 13:06:400925デフォルトの名無しさん
2010/09/14(火) 13:10:510926デフォルトの名無しさん
2010/09/14(火) 13:23:150927デフォルトの名無しさん
2010/09/14(火) 13:24:220928デフォルトの名無しさん
2010/09/14(火) 13:33:57できない
0929デフォルトの名無しさん
2010/09/14(火) 15:03:51できる
0931デフォルトの名無しさん
2010/09/14(火) 21:31:050932デフォルトの名無しさん
2010/09/15(水) 22:36:22{
A():a(),b(),c(){}
int a, b, c;
};
struct A
{
A():a(0),b(0),c(0){}
int a, b, c;
};
どっちのコンストラクタがいいですか。
0933デフォルトの名無しさん
2010/09/15(水) 22:47:14お好きにどうぞ。
私の場合、0という値に意味がないなら前者ですね。
0934デフォルトの名無しさん
2010/09/15(水) 22:48:200935デフォルトの名無しさん
2010/09/15(水) 22:52:58じゃなく
A a();
って常に書くならむしろ要らんな
0936デフォルトの名無しさん
2010/09/15(水) 22:56:45デフォルトコンストラクタとか作られないんじゃなかったっけ
0937デフォルトの名無しさん
2010/09/15(水) 22:58:18コンストラクタも振る舞いといえばそうだ
0938デフォルトの名無しさん
2010/09/15(水) 23:00:39なんだよCスタイルって
0939デフォルトの名無しさん
2010/09/15(水) 23:02:030940デフォルトの名無しさん
2010/09/15(水) 23:18:150941デフォルトの名無しさん
2010/09/15(水) 23:23:040942デフォルトの名無しさん
2010/09/15(水) 23:26:570943デフォルトの名無しさん
2010/09/16(木) 00:02:53後者は関数宣言。
0944デフォルトの名無しさん
2010/09/16(木) 00:09:51コンストラクタ消したらPODだろ
0945デフォルトの名無しさん
2010/09/16(木) 00:11:540946デフォルトの名無しさん
2010/09/16(木) 07:18:04>935の後者はPODかどうかに関係なく関数宣言。
0947デフォルトの名無しさん
2010/09/16(木) 10:55:17classでもメンバを適当にすれば POD型になるんですか?
0948デフォルトの名無しさん
2010/09/16(木) 11:08:460949デフォルトの名無しさん
2010/09/16(木) 11:09:110950デフォルトの名無しさん
2010/09/16(木) 20:09:39ダイアログはGUIビルダーを使っているというパターンが多いと思います
このメリットを教えてください
0951デフォルトの名無しさん
2010/09/16(木) 20:14:040952デフォルトの名無しさん
2010/09/16(木) 20:18:46なに訳の分からないことを
0953デフォルトの名無しさん
2010/09/16(木) 20:19:320954951
2010/09/16(木) 20:26:270955デフォルトの名無しさん
2010/09/16(木) 20:30:17object
domestic
0956デフォルトの名無しさん
2010/09/16(木) 20:46:47* Plain Old Documentation (POD) - Perl等のプログラムソース内に記述されたマニュアルの記述方法。
* Plain Old Data (POD) - C++において、Cの構造体との互換性を持つクラスのこと。
0957デフォルトの名無しさん
2010/09/16(木) 20:48:52ソースにwikipediaってのはどうなのよ
0958デフォルトの名無しさん
2010/09/16(木) 21:04:42お前がな
0959デフォルトの名無しさん
2010/09/16(木) 22:02:08未だに定義を俺は理解できないんだけど。
だんだん理解しようとする気迫が薄れてきた。
0960デフォルトの名無しさん
2010/09/16(木) 22:04:44で初期化できるのがPOD
0961デフォルトの名無しさん
2010/09/16(木) 22:11:090962デフォルトの名無しさん
2010/09/16(木) 22:15:26個人的にはメンバ関数持ってるPODbネんて勘弁してbルしいが。
staticメンバならいいけれども。
0963デフォルトの名無しさん
2010/09/16(木) 22:15:440964デフォルトの名無しさん
2010/09/16(木) 22:19:110965デフォルトの名無しさん
2010/09/16(木) 22:21:280966デフォルトの名無しさん
2010/09/16(木) 23:00:480967デフォルトの名無しさん
2010/09/16(木) 23:20:42全然おkじゃないのか?
何が聞きたいのか分からん。
それで設計がおかしくならないならいいんじゃん。
既にあるクラスの再利用なんだし、むしろそれが継承の醍醐味な気がするが。
0968デフォルトの名無しさん
2010/09/16(木) 23:39:00いえ、自分まだ素人でして↑のレスを読んでると
そういうCの関数用のstruct、つまりクラスとか想定されてないところに
勝手にC++の付属物をくっつけるのがなんだか怖くなってきて
0969デフォルトの名無しさん
2010/09/16(木) 23:44:490970デフォルトの名無しさん
2010/09/16(木) 23:49:23それがextern "C"とかで宣言されている外部の関数とかとやりとりするための
structなら、しないほうがいいかもね。
継承ではなくて、別のクラスにくるんで使う方がいい場合もある。
指針としては、dynamicキャストを使わないで(staticキャストはOK)、書ける間は
そんなに気にしなくていいんじゃないかな。
0971951
2010/09/16(木) 23:58:49void p(){puts("ごめんなしゃい");}
int ackermap(int m,int n,void(*f)()){
f();
if(m==0){return n+1;}
if(n==0){return ackermap(m-1,1,f);}
return ackermap(m-1,ackermap(m,n-1,f),f);
}
ackermap(4,4,p);
0972デフォルトの名無しさん
2010/09/17(金) 00:06:34>extern "C"とかdynamic_cast
聞いたことはありますがまだ実際に使ったことはないですね
普通に正式っぽいのでよかったです
問題にぶち当たったらまた再考してみます、俺みたいなヘタレにどうもありがとうございました
0973デフォルトの名無しさん
2010/09/17(金) 00:24:20相当な初心者だったのか。
道はめっちゃ険しいけど、まあまあ楽しいし、頑張ってくれ。
0974デフォルトの名無しさん
2010/09/17(金) 00:25:52dynamicキャストを使うなんて、C++のクラスだろうが何だろうが、逃げです。
デスマーチへの近道です。
しかし逃げだろうが納期からは逃げられないから
仕方なく最後の仕様変更の際には使うんです。
0975デフォルトの名無しさん
2010/09/17(金) 00:28:37そして、結局どつぼにはまる、と…w
やっぱり手抜きしないでstaticキャストしときゃよかった、と泣くことになるんだろう?w
0976デフォルトの名無しさん
2010/09/17(金) 00:35:05今に負けず劣らず凄惨を極める・・・今に負けず劣らず
0977デフォルトの名無しさん
2010/09/17(金) 00:39:36それは、dynamic_castが必要だよ、とコンパイラがいわないから、もっとひどいことに
なるんじゃなかったっけ?
0978デフォルトの名無しさん
2010/09/17(金) 22:03:06そんなこと無いですよね?
0979デフォルトの名無しさん
2010/09/17(金) 22:06:01そうじゃなきゃいけないってことはないけど、
そんな感じの名前にする方が一般的
それに、一口にイテレータといってもだな…w
0980デフォルトの名無しさん
2010/09/17(金) 22:10:50そうしておけば、C++0x になったときに
range-based for が黙ってても使えるようになる。
0981デフォルトの名無しさん
2010/09/17(金) 22:15:280982デフォルトの名無しさん
2010/09/17(金) 22:16:26STLと違う使い方を覚えろというのか
0983デフォルトの名無しさん
2010/09/17(金) 22:16:300984デフォルトの名無しさん
2010/09/17(金) 22:16:53rangeを取得する一般的な関数名も欲しいな。
begin,endがあればrangeが取れるんだけど、rangeをイテレータに分解した後またrangeに組みな押されるのが無駄に感じるんだなあ
0985デフォルトの名無しさん
2010/09/17(金) 22:18:25お前がそう思うんならそうなんだろ
0986デフォルトの名無しさん
2010/09/17(金) 22:19:03rbegin
rend
lower_bound
upper_bound
find
find_if
STLでもすでにバリエーションいくつもあるしbegin/endにこだわること無いと思うよ
0987デフォルトの名無しさん
2010/09/17(金) 22:21:22お前どんだけアホなの
0988デフォルトの名無しさん
2010/09/17(金) 22:24:20別にあほでもないだろ。
そもそも、>>978の質問が抽象的にすぎるんだよw
0989デフォルトの名無しさん
2010/09/17(金) 22:25:42君がイテレータ取得メンバはbeginとend以外覚えたくない
つまりそれだけで十分だと考えてるようだからから
それは幻想だよって教えてあげたんじゃないか
0990デフォルトの名無しさん
2010/09/17(金) 22:30:46それらは全て機能が異なる。バリエーションではない。
たとえば、beginと同じ機能の、startとかfirstとかあったらバリエーションだろう。迷惑なは無しだけどな
0991デフォルトの名無しさん
2010/09/17(金) 22:32:210992デフォルトの名無しさん
2010/09/17(金) 22:35:070993デフォルトの名無しさん
2010/09/17(金) 22:38:11まあでもこれはセンス無い命名だと思う
誰が見ても最初は何かを始めて、何かを終わらせる関数
つまりイニシャライザとファイナライザに見えて不安になる
0994デフォルトの名無しさん
2010/09/17(金) 22:39:560995デフォルトの名無しさん
2010/09/17(金) 22:42:14いや、でも、begin()はイニシャライザといってもいいし。
ま、end()はちょっとあれかなw
0996デフォルトの名無しさん
2010/09/17(金) 22:44:27tail
にしてほしかった
0997デフォルトの名無しさん
2010/09/17(金) 22:46:46ああ、確かにそっちの方がセンスいいかもしれねーな…
ただ、head()、tail()とかリンクドリストとかでよく使ってるからな…
0998デフォルトの名無しさん
2010/09/17(金) 22:51:51tailだと最後の要素を指すのか?非合理だね
0999デフォルトの名無しさん
2010/09/17(金) 22:53:351000デフォルトの名無しさん
2010/09/17(金) 23:01:50盲信しろとは言わんがもう少し先人の苦労に敬意を払えよ
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。