C++相談室 part34
レス数が1000を超えています。これ以上書き込みはできません。
0001v(^・^)v
NGNGただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いッス。
過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0002デフォルトの名無しさん
NGNG2 http://pc.2ch.net/tech/kako/996/996640937.html
3 http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
4 http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
5 http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
6 http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
7 http://pc.2ch.net/tech/kako/1021/10217/1021787032.html
8 http://pc3.2ch.net/tech/kako/1025/10250/1025010364.html
9 http://pc3.2ch.net/tech/kako/1027/10273/1027347982.html
10 http://pc3.2ch.net/tech/kako/1029/10293/1029315669.html
11 http://pc3.2ch.net/tech/kako/1032/10323/1032345774.html
12 http://pc3.2ch.net/tech/kako/1035/10350/1035005882.html
13 http://pc3.2ch.net/tech/kako/1038/10380/1038031395.html
14 http://pc5.2ch.net/tech/kako/1041/10413/1041328679.html
15 http://pc5.2ch.net/tech/kako/1043/10436/1043605481.html
0003v(^・^)v
NGNG16 http://pc5.2ch.net/tech/kako/1045/10457/1045746245.html
17 http://pc5.2ch.net/tech/kako/1047/10475/1047560042.html
18 http://pc5.2ch.net/tech/kako/1050/10501/1050177746.html
19 http://pc5.2ch.net/tech/kako/1052/10526/1052625846.html
20 http://pc5.2ch.net/tech/kako/1055/10551/1055162298.html
21 http://pc5.2ch.net/tech/kako/1057/10575/1057580107.html
22 http://pc5.2ch.net/tech/kako/1060/10603/1060361082.html
23 http://pc5.2ch.net/tech/kako/1062/10626/1062690663.html
24 http://pc5.2ch.net/tech/kako/1066/10665/1066546387.html
25 http://pc5.2ch.net/tech/kako/1067/10679/1067949669.html
26 http://pc5.2ch.net/test/read.cgi/tech/1070164402/ (迷子)
27 http://pc5.2ch.net/test/read.cgi/tech/1074454641/ (迷子)
28 http://pc5.2ch.net/test/read.cgi/tech/1077985164/
29 http://pc5.2ch.net/test/read.cgi/tech/1082047479/
30 http://pc5.2ch.net/test/read.cgi/tech/1084030770/
31 http://pc5.2ch.net/test/read.cgi/tech/1086185282/
32 http://pc5.2ch.net/test/read.cgi/tech/1088236078/
33 http://pc5.2ch.net/test/read.cgi/tech/1090180012/
0004v(^・^)v
NGNG[C++ FAQ]
http://www.parashift.com/c++-faq-lite/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[禿 Stroustrup]
http://www.research.att.com/~bs/
[C++ International Standard]
http://www.kuzbass.ru/docs/isocpp/
http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf
http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=38110&ICS1=35&ICS2=60&ICS3=
[JTC1/SC22/WG21 - C++]
http://std.dkuug.dk/jtc1/sc22/wg21/
[C/C++ Users Journal]
http://www.cuj.com/
[cppll (ML)]
http://www.trickpalace.net/cppll/ (日本語)
0005v(^・^)v
NGNGamazon.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/
Effective STL
http://www.amazon.com/exec/obidos/ASIN/0201749629/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
http://www.amazon.com/exec/obidos/ASIN/0201704315/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
http://www.amazon.com/exec/obidos/ASIN/0201734842/
0006v(^・^)v
NGNG[Boost]
Boost http://www.boost.org/
(日本語) http://user.ecc.u-tokyo.ac.jp/~s31552/wp/boost/
(日本語) http://www.kmonos.net/alang/boost/
[STL]
STLport http://www.stlport.org/
SGI-STL http://www.sgi.com/tech/stl/
STLFilt http://www.bdsoft.com/tools/stlfilt.html
(日本語) http://www005.upp.so-net.ne.jp/episteme/html/stlprog/
(日本語) http://www.wakhok.ac.jp/~sumi/stl/
[Loki]
http://www.moderncppdesign.com/
LokiPort-MSVC7 http://www.geocities.com/rani_sharoni/LokiPort.html
LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
[他]
ACE http://www.cs.wustl.edu/~schmidt/
Blitz++ http://www.oonumerics.org/blitz/
flex++ Bison++ http://www.idiom.com/free-compilers/TOOL/BNF-15.html
[他ライブラリリンク集]
http://www.trumphurst.com/cpplibs/cpplibs.phtml
(日本語) http://www.kmonos.net/alang/cpp/lib.html
0007v(^・^)v
NGNG【C++】template 統合スレ -- Part4
http://pc5.2ch.net/test/read.cgi/tech/1083550483/
ようかんマンがC/C++の宿題を片付けて見せます 28棹
http://pc5.2ch.net/test/read.cgi/tech/1089974839/
C/C++でのWindowsPrograming議論スレ(質問お断り)
http://pc5.2ch.net/test/read.cgi/tech/1049790146/
managed C++ やろうぜ!!
http://pc5.2ch.net/test/read.cgi/tech/1014486422/
ATL 相談室
http://pc5.2ch.net/test/read.cgi/tech/1029029882/
COM の世界を斬る!
http://pc5.2ch.net/test/read.cgi/tech/981823340/
WTLお勉強スレッド
http://pc5.2ch.net/test/read.cgi/tech/1078150663/
0008v(^・^)v
NGNGタダで最強!フリーC/C++コンパイラ
http://pc5.2ch.net/test/read.cgi/tech/1035882599/(html化待ち)
GCCについて part3
http://pc5.2ch.net/test/read.cgi/tech/1072484422/
タダで使えるVisual C++ $2
http://pc5.2ch.net/test/read.cgi/tech/1086287039/
タダで使えるBorland C++ Part3
http://pc5.2ch.net/test/read.cgi/tech/1054390397/
OpenWatcom C++
http://pc5.2ch.net/test/read.cgi/tech/1033433728/
"Code of the Nerds" Digital Mars C/C++
http://pc5.2ch.net/test/read.cgi/tech/1044210976/
0009v(^・^)v
NGNG★初心者にVisual C++を教えるスレ★ Part13
http://pc5.2ch.net/test/read.cgi/tech/1089011118/
■MFC相談室 mfc11.dll■
http://pc5.2ch.net/test/read.cgi/tech/1088084875/
C++Builder相談室 Part10
http://pc5.2ch.net/test/read.cgi/tech/1089299158/
Borland C++ BuilderX
http://pc5.2ch.net/test/read.cgi/tech/1065260556/
0010v(^・^)v
NGNGスレが立てられるなら何でも良かった.
今はあらかじめ串を用意しておくべきだったと反省している.
0011v(^・^)v
NGNG0012v(^・^)v
NGNG環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
0013v(^・^)v
NGNGすげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
0014v(^・^)v
NGNGとかいうエラーが出るんだけどこれってどうすればいいの?
0015v(^・^)v
NGNG#include <stdafx.h>
後死ね。
0016v(^・^)v
NGNG言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0017デフォルトの名無しさん
NGNG0018デフォルトの名無しさん
NGNGあるイベントに対応するハンドラを関数ポインタで設定しておき、
ウィンドウプロシージャからその関数ポインタを呼ぶようにしてます。
ですが関数ポインタは型に厳しくて、
typedef void (*EventProc)(CEvent&);
これだとクラスのメンバ関数は突っ込めないし。
typedef void (CEvent::*EventProc)(CEvent&);
こっちだとメンバ関数はOKだけど自分以外のクラスの関数ポインタはダメだし。
それに多重継承しているクラスのメンバは型が合わなくてコンパイルエラーになります。
何かよい解決策はありませんか?
0019デフォルトの名無しさん
NGNG処理ごとにハンドラ型をいっぱい用意する
0020デフォルトの名無しさん
NGNG(;´Д`)
002118
NGNG{
CButton btn;
public:
void CMainWindow ::Init()
{
btn.pClickEvent = (CEvent::EventProc)OnClick;
}
void CMainWindow ::OnClick(CEvent& e) {}
};
btn.pClickEvent = (CEvent::EventProc)OnClick;
この部分は関数ポインタでは無理なんでしょうかね・・・。
0022デフォルトの名無しさん
NGNG0023デフォルトの名無しさん
NGNG0024デフォルトの名無しさん
NGNG002518
NGNGそれも考えたんですがそれだとハンドラからメンバへのアクセスってコンテクスト経由ですよね。
もっといいアイデアがあるんではないかなーと思ってるんで今の所保留にしてます。
>>24
そうですね。仮想関数なら実装は簡単なんですよね。
でも派生しないとハンドラ書けないじゃないですか。
それにCButtonを派生してハンドラ書いてもはっきりいって不便ですよね?
ボタンのハンドラはやっぱりウィンドウに記述したいじゃないですか。ってわがままかなぁ。
0026デフォルトの名無しさん
NGNGhttp://pc5.2ch.net/test/read.cgi/tech/1091264964/120
http://pc5.2ch.net/test/read.cgi/tech/1091264964/130
0029デフォルトの名無しさん
NGNG0030デフォルトの名無しさん
NGNG0031デフォルトの名無しさん
NGNG0032デフォルトの名無しさん
NGNG0034デフォルトの名無しさん
NGNG0035デフォルトの名無しさん
NGNG0036デフォルトの名無しさん
NGNG0037デフォルトの名無しさん
NGNGboost::functionとboost::bind、boost::lambdaのあたりを使う
boost.signalsも手か。
0038デフォルトの名無しさん
NGNG0039デフォルトの名無しさん
NGNGstruct A{
A(const A& a) { lock(); assign(a); unlock(); }
~A() { lock(); release(); unlock(); }
};
たとえば上のようにした場合、タイミングによっては破棄されたコンテナを
コピーしようとしてしまう事がありますよね?
コンテナが保持するオブジェクトへのアクセスのみロックで保護して、
コンテナ自体へのアクセスのロックは利用側が気をつけるしかないんでしょうか?
0040デフォルトの名無しさん
NGNG通常のスレッドセーフ対策と同じ。
0041デフォルトの名無しさん
NGNG0042デフォルトの名無しさん
NGNGそういわれても分からないから質問してるんです。
通常っていうと、保護したいオブジェクトにアクセスする前後で
lockとunlockをするというだけだと思うのですが、
それはオブジェクトを利用するクライアント側でコードを書かなきゃならないので
言ってしまえば面倒であると言う事なのですが。
STLPORTとかで提供されるスレッドセーフなコンテナと言うようなものは、
コンテナへのアクセス自体は自分で保護しないとならないのでしょうか?
0043デフォルトの名無しさん
NGNG>そういわれても分からないから質問してるんです。
逆ギレ キター。
>通常っていうと、保護したいオブジェクトにアクセスする前後で
>lockとunlockをするというだけだと思うのですが、
そのとおりです。必要な場所でロックするように実装すればOK。
0044デフォルトの名無しさん
NGNGそれはスレッドセーフというよりも寿命管理の問題じゃないの?
>>39 のコードだと「タイミングによっては」完全に破棄された後でコピーされてしまう
ことがあるわけだけれども、それはスレッドの問題ではなく、寿命管理が全くできていない
からだと思うし。
参照カウンタを儲けてアトミックに操作するとか、そういう普通の方法でよいと思うけど。
0045デフォルトの名無しさん
NGNGデストラクタに入った直後にコピーコンストラクタが呼び出されると、
カウント0のオブジェクトをコピーしようとする事になるから
0046デフォルトの名無しさん
NGNGコピーコンストラクタを呼び出す側が参照を保持してるから、
ゼロにならないと思うけど・・・
どういう状況を想定してまつか?
004746
NGNG参照カウンタによる寿命管理って普通そういうものですよね。
強制的に delete したりしたらどうしようもないけど。
0048デフォルトの名無しさん
NGNGvoid assign(const A& a) {p=a;++p->c;}
void release() {if(--p->c){delete p;p=9;}}
struct counter {int c;} *p; };
39の例だと、こうした場合には
(スレッド) 処理 // コメント
(0) A::~A()
(0) A::lock()
(1) A::A(const A&)
(1) A::lock()
(0) A::release() //p->c=0, p=0
(0) A::unlock()
(1) A::assign() // error
ということになる。
・・・と思ったけど、Aのインスタンスをカウンタで管理すると言う事かな?
0049デフォルトの名無しさん
NGNG/p=9/p=0/
0050デフォルトの名無しさん
NGNG>・・・と思ったけど、Aのインスタンスをカウンタで管理すると言う事かな
そういうことです。
「コンテナの寿命管理」なんて設計段階でやっておけば十分なような気も
しますけど、元々のネタ(>>39)がそういうお題なのでしようがない。
++ とか -- はスレッドセーフじゃないのでOS 固有の何らかのAPIで
アトミックに実行する必要がありますが。
0051デフォルトの名無しさん
NGNG0052デフォルトの名無しさん
NGNG0053デフォルトの名無しさん
NGNGあれってスレッドセーフだっけ?
0054デフォルトの名無しさん
NGNGスレッド周りの対応が山盛りでおなかいっぱい。
0055デフォルトの名無しさん
NGNG調べてみた。
boost:shared_ptr は、同一のインスタンスについては、多重の読み込みしかスレッドセーフではない。
スレッド毎にコピーを作ってあげれば、参照カウントは共有され、かつ変更に対しても安全になる。
0056デフォルトの名無しさん
NGNG0057デフォルトの名無しさん
NGNG0058デフォルトの名無しさん
NGNGboost::function 使う。
0059デフォルトの名無しさん
NGNG乙。
0060デフォルトの名無しさん
NGNGC言語を勉強する必要があるのでしょうか?
0061デフォルトの名無しさん
NGNG>>4見て出直せクッソタレ!
0062デフォルトの名無しさん
NGNGC#ってのはどうなんかと思って。
C++とC#を将来使いこなしたい ってのをCC#を将来使いこなしたい
にしとけばよかった。スマソ
ほかのスレでC++は得意だけれどC#は苦手とかC#はいけるがC++はダメポとか
いうレスみたんで。。 得意な方からいわせるとやはりC++とC#は違うのですかね?
違うと言うことになればいきなりC#から勉強できるのかな??
0063デフォルトの名無しさん
NGNGこんな奴がC#やっても時間の無駄
0064デフォルトの名無しさん
NGNGならC言語だけでデザインパターン23種類全部書いてみい。
0065デフォルトの名無しさん
NGNGC++でできることも、C#でできることも、Javaでできることも、
みーんなアセンブラ使っても出来るんだぞ!!!!!!!
インターネットもリナックスもみんなアセンブラしてるんだぞ!!
友達のスーパーハッカーもアセンブラだって言ってたぞ!!!!
0066デフォルトの名無しさん
NGNG0067デフォルトの名無しさん
NGNG夜からずっとやってますが根性だけはあるんでアドバイスお願いいたします。ペコ
0068デフォルトの名無しさん
NGNG0069デフォルトの名無しさん
NGNG調べ直していろいろさらに分かり、思ったのですが、Cはもう古いそうなんで
思い切ってC++から勉強したいと思います。
C++やっているみなさんから言いマストやはりそれは無謀でしょうかね?
ちなみに今高校1年生ですので難しい数学はやったことないレベルであります。汗。
0070デフォルトの名無しさん
NGNGCがわからんとC++ほとんどわからんらしいっす。 いままでスマソ
0071デフォルトの名無しさん
NGNGそしてなんでもかんでもすぐ人に聞く奴は向いてない
0072デフォルトの名無しさん
NGNG>そしてなんでもかんでもすぐ人に聞く奴は向いてない
禿堂
0073デフォルトの名無しさん
NGNGいや全く。
とりあえず手元にPCはあるようですから、実際に動かしつつ勉強すればいいですな。
書店で適当な入門書を見繕ってきて、まずは1冊を読み通しながら。
gccならネットから無償で入手できるし、学生さんならMS製品もアカデミック価格でしたっけ?
0074デフォルトの名無しさん
NGNG#include <string>
using namespace std;
int i,k;
int main()
{
string str[4][2];
str[0][0] = "就職 ";
str[0][1] = "活動 ";
str[1][0] = "会社 ";
str[1][1] = "訪問 ";
str[2][0] = "集団 ";
str[2][1] = "面接 ";
str[3][0] = "学校 ";
str[3][1] = "推薦 ";
for(i=0;i<4;i++){
for(k=0;k<2;k++){
cout << str[i][k] << endl;
}
cout << "\n";
}
return 0;
}
これってどうよ?
0075デフォルトの名無しさん
NGNG初期化の仕方がダサすぎ
0076デフォルトの名無しさん
NGNGRelease のスレッドセーフな実装でさんざん悩んでドツボにはまったことがある。
0077デフォルトの名無しさん
NGNG根性あるなら我慢して真剣にCを1ヵ月勉強しなさい。
それで身の振り方もわかるようになるだろう。
Cでやった事はJavaなりC++なりC#なりで必ず役に立つ。
それに1つの言語をマスターすれば他の言語を覚えるのに時間はかからない。
0078デフォルトの名無しさん
NGNGコピペニマジレスカコワ(ry
0079デフォルトの名無しさん
NGNG本当にありがとうございます。
実は10時間くらい調べて聞いたのですがまだ調べたりなかったようです。ペコ
77さん本当に参考になりましたっす。C言語の入門書慎重に選んで熟読しプログラミングは覚えるより慣れろ
らしいのでがんばってやっていきたいと思います。
0080デフォルトの名無しさん
NGNGBASICやアセンブラの場合は、他の言語覚えるのにまだまだ時間かかると思うけどな。
0081デフォルトの名無しさん
NGNG0082デフォルトの名無しさん
NGNG日本語の勉強もしておけよ。
仕事でプログラミングをする積もりなら読解力と文章構成力が必要になるからな。
0083デフォルトの名無しさん
NGNGそうか?アセンブラ知っていればCは楽勝。とくにポインタでつまづくことがない。
0084デフォルトの名無しさん
NGNGそうかなぁぁぁぁ?
0085デフォルトの名無しさん
NGNGアセンブラ理解できるセンスがあればCは理解できそうな気がする。
C++はまた別のセンスが必要だけど。
0086デフォルトの名無しさん
NGNG勉強すりゃ誰でもできるわ。
0087デフォルトの名無しさん
NGNG困ったことに勉強しても出来ない奴はごまんといます。
0088デフォルトの名無しさん
NGNGセンスというか相性だね。C++やり始めたらあまりの難しさに根をあげてしまう香具師は
いくらでもいる。反対にそんなに難しく感じずあっさりと身につけてしまう香具師もいる。
>>86
考え方が甘い
0089デフォルトの名無しさん
NGNG0090デフォルトの名無しさん
NGNG0091デフォルトの名無しさん
NGNG君はどうも努力万能主義だね。君の考え方に従えば、100人いれば100人が
努力すれば全員東大に合格して、エリートコースを歩めるという風に読める。
で、君は無事に東大を卒業してエリートコースを歩いているかね?それとも
ただの妄想ですか?ププ
0092デフォルトの名無しさん
NGNGそんなに難しいことかい?
0093デフォルトの名無しさん
NGNG東大卒ですか?
0094デフォルトの名無しさん
NGNG努力すれば誰でも東大に受かるなんて風には、とても読めませんが。
0095デフォルトの名無しさん
NGNGF1は誰にでも乗りこなせるものじゃないが、運転免許程度なら取れん奴のほうが珍しいだろ。
0096デフォルトの名無しさん
NGNG0097デフォルトの名無しさん
NGNG同一人物ですか。東大とは拡大解釈しすぎかもしれんが、だからと言って君は
C++を舐めすぎ。エピステーメーみたいになれるんかよ?
0099デフォルトの名無しさん
NGNG0100デフォルトの名無しさん
NGNG妄想はお前の方。逃げるなよ。誰も脳無しのお前を責めたりしないから。
0102デフォルトの名無しさん
NGNG0103デフォルトの名無しさん
NGNG010494
NGNG0105デフォルトの名無しさん
NGNG0106デフォルトの名無しさん
NGNG同一人物なのにそうでないと言い逃れするとはチキンな野郎だ。
嘘つきは相手をしても無駄なエネルギーを使うだけなので放置。
0107デフォルトの名無しさん
NGNG010894
NGNG0109デフォルトの名無しさん
NGNG0110デフォルトの名無しさん
NGNG0111デフォルトの名無しさん
NGNG0112デフォルトの名無しさん
NGNG0113デフォルトの名無しさん
NGNG0114デフォルトの名無しさん
NGNG0115デフォルトの名無しさん
NGNG0116デフォルトの名無しさん
NGNGどっちもバッファのオーバーラップが許されないとあるのですが、
だったらmoveの意義が無い気がするのですが。
0117デフォルトの名無しさん
NGNG氏ね。そうすれば悩まなくて済む。
0118デフォルトの名無しさん
NGNGお前自身が子供のようにな。
0119デフォルトの名無しさん
NGNGすいません、この人を引き取ってもらえませんか?
0120デフォルトの名無しさん
NGNG0121デフォルトの名無しさん
NGNG明らかにスレ違いだハゲ
0122デフォルトの名無しさん
NGNGmoveは重なってても大丈夫のはず。
何の記述を見たのですか?
0123デフォルトの名無しさん
NGNGCと日本語がんばります! ありがとうございました。
0124デフォルトの名無しさん
NGNGVC6に付いてるMSDNには許されないと書いてあるな。
0125デフォルトの名無しさん
NGNGオンライン版(英語)を見た。→ttp://msdn.microsoft.com/library/en-us/vclang98/html/STRING2_CHAR_TRAITSCCMOVE.asp
"The source and destination may overlap." と書いてある。
日本語訳が間違ってるのかな?
0126デフォルトの名無しさん
NGNGオーバーラップがないのが確実なら
オーバーラップが許されないほうを使うほうが速い。それだけ
0127デフォルトの名無しさん
NGNGなにいってんだ
0128126
NGNGなんか変だった
ttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vcstdlib/html/vclrf_string_chartraitsmove.asp
ttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vcstdlib/html/vclrf_string_chartraitscopy.asp
copyはsequences must not overlap
moveはpossibly overlapping sequence.
0129デフォルトの名無しさん
NGNG0130デフォルトの名無しさん
NGNG0131デフォルトの名無しさん
NGNG0132デフォルトの名無しさん
NGNG今はifstreamでファイルをオープンして最後までなめる処理を
してるんですがあまりにもナンセンスなんで・・・
string strLogFileName = "hogehoge.txt";
ifstream in;
in.open(strLogFileName.c_str(), ios::in);
if (in.is_open())
{
// サイズを見る
uint nCount = 0;
char c;
while (!in.eof())
{
in.get(c);
nCount++;
}
}
in.close();
cout << nCount << endl;
0133132
NGNG0134デフォルトの名無しさん
NGNGif (i.is_open()) {
i.unsetf(std::ios::skipws);
std::istreambuf_iterator<char> it(i);
size_t s = std::distance(it, std::istreambuf_iterator<char>());
}
0135デフォルトの名無しさん
NGNG0136デフォルトの名無しさん
NGNGで、普通はANSI標準じゃないけど
POSIX標準なstat/fstatを使うんじゃないかなあ。
0137デフォルトの名無しさん
NGNGC++の標準にファイルサイズという概念はない。環境依存。
0138デフォルトの名無しさん
NGNGfstreamではseekは推奨できないんじゃないか。
0139デフォルトの名無しさん
NGNGi.unsetf(std::ios::skipws);は必要無いんじゃないか?
0140デフォルトの名無しさん
NGNG概念は無くともファイルが存在すれば、
その格納データ量という意味で意味づけはできるんじゃない?
0141デフォルトの名無しさん
NGNGfseek()で終端に位置づけてftell()で位置を取得で終わりじゃん。
テキスト、バイナリの区別は必要かもしれないが、
その辺は調べてちょ。
0142デフォルトの名無しさん
NGNG次期標準だろ。
0143デフォルトの名無しさん
NGNG0144デフォルトの名無しさん
NGNG0145デフォルトの名無しさん
NGNGたとえばifstreamを使って読み込むなら、
スペースのスキップや改行コードの変更によって
読み出せるデータ量が変わってくるんだから
132のように一文字ずつ数えるしかないんじゃ?
0146デフォルトの名無しさん
NGNG0147デフォルトの名無しさん
NGNG定番の釣りだな。アフォクサ。POSIXで答えでてるじゃん。
0148デフォルトの名無しさん
NGNG0149デフォルトの名無しさん
NGNGiostreamだけ使えとは誰も言っていないにも拘らず、定期的に湧く。
0150デフォルトの名無しさん
NGNG0151デフォルトの名無しさん
NGNG0152デフォルトの名無しさん
NGNG0153デフォルトの名無しさん
NGNG// 省略
};
class B{
// 省略
};
class C : public A, public B{
// 省略
};
ポリモフィズムの事なんですが、
A* a = new C;
は、期待どおりの動作をし、
B* b = new C;
は、期待している動作をしてくれない、
(つまり、多重継承の場合、ポリモフィズムにできるのは1つ目に継承したクラスへのポインタだけ)
というような事を、以前、本かサイトで見た(読んだ)ような気がするのですが、
調べなおしてみても、どうもそのような事が書いてある部分を見つけられず、
以前見た(読んだ)と思っているのは、ただの勘違いのような気がしてきました。
B* b = new C;は可能か不可能か教えてください。
更に、
class D{
// 省略
};
class E : public C, public D{
// 省略
};
C* c = new E;
これは可能でしょうか?
お願いします。
0154デフォルトの名無しさん
NGNG>B* b = new C;は可能か不可能か教えてください。
可能。
>C* c = new E;
>これは可能でしょうか?
可能。
やってみてから聞け。
0155デフォルトの名無しさん
NGNG0156153
NGNGコンパイルが通るかは試しましたが、ちゃんと動作するかどうかとなると、
規格では駄目でも、たまたま動いちゃったりするかもと思ったからです。
どうもありがとうございました。
0157デフォルトの名無しさん
NGNGこれは継承と、基底クラスのポインタへの代入というだけでは?
0158デフォルトの名無しさん
NGNG「期待どおりの動作」が何を指して言ってるのか分からないので
C++言語的には正当な行為だとしか言い様がない。
まあ
C* c = new E;
こんな事してたらおおよそ期待通りの動作はしないだろうけど。
0159デフォルトの名無しさん
NGNG趣味のプログラミングなら話は別。
0160153
NGNG申し訳ないです。
言われてみれば、153に書いた例では、単に基底クラスへのポインタに代入ができるかどうかしか問題にしていませんね。
良い例が思いつかず、クラスの中身を全部省略してしまいましたが、
基底クラスには仮想関数が宣言してあって、継承したクラスを「基底クラスへのポインタ」に代入し、
仮想関数を「基底クラスへのポインタ」から呼び出す事ができるかどうか。
また、基底クラスに仮想関数がない場合でも、継承したクラスを「基底クラスのポインタ」に代入すれば、
基底クラスに含まれるメンバ関数とメンバ変数(publicであれば)を「基底クラスへのポインタから」操作できるかどうかなどの事が聞きたかったです。
もっと具体的(実践的)に、現在、知りたかった事は、インターフェース・クラスは、一番最初に継承されていなければいけない物なのかどうかです。
0161デフォルトの名無しさん
NGNG0162デフォルトの名無しさん
NGNG誤爆スマソ
0163デフォルトの名無しさん
NGNG0164デフォルトの名無しさん
NGNG0165デフォルトの名無しさん
NGNG0166デフォルトの名無しさん
NGNGCVSにはもう追加されてます。
次のリリースからつかえるでしょう。
0167デフォルトの名無しさん
NGNG> 仮想関数を「基底クラスへのポインタ」から呼び出す事ができるかどうか。
できる。というか、仕様書読め。
> また、基底クラスに仮想関数がない場合でも、継承したクラスを「基底クラスのポインタ」に代入すれば、
その用途のためには、規定クラスに純粋仮想関数(実態はないが型の定義だけしてある)を
定義しておく必要がある。
> もっと具体的(実践的)に、現在、知りたかった事は、インターフェース・クラスは、一番最初に継承されていなければいけない物なのかどうかです。
別に。
0168デフォルトの名無しさん
NGNGそれも自分でコード書いてみればすぐに分かる事じゃない?
少なくとも返事を待つよりは早く結果がでるぞ。
呼び出される関数について、オーバーライドはインスタンスの型によって決まり、
オーバーロードは呼び出し時のポインタの型によって決まる。
0169デフォルトの名無しさん
NGNG> 仮想関数を「基底クラスへのポインタ」から呼び出す事ができるかどうか。
悪いけどこんな基本的なこと人に聞く人にC++は向いてないよ。
0170デフォルトの名無しさん
NGNGPOSIXで確定だよ。
今調べてみたが、フリーのVC++ToolKitにも
ちゃんとstat.hヘッダーが含まれていた。
今はファイルサイズに限定した議論になっているけど、
実用から見るとタイムスタンプ・属性などの情報もいずれ必要になってくるだろうし。
ANSI標準でのファイルサイズ取得に固執する行為は、初心者呼ばわりされるだけ。
0171デフォルトの名無しさん
NGNGパターンAとBの違いは、Baseクラスの関数にvirtual指定があるか、ないかです。
■パターンA
class Base {
virtual void Func(); // 仮想関数
}
class Deliver {
void Func();
}
■パターンB
class Base {
void Func(); // 仮想関数
}
class Deliver {
void Func();
}
0172デフォルトの名無しさん
NGNG質問に真摯に答えると、vtableが出来るからsizeofの値が違う。
できれば質問の意図を教えて欲しい。
0173デフォルトの名無しさん
NGNG違いって見たまんまだろ
パターンBのBase::Func()は仮想関数じゃないだけ
もしかしてDeliverはBaseから派生させたかったのか?
>>172
171に対してそれは無理な相談だ
0174デフォルトの名無しさん
NGNG確かに。ワロタ。
0175デフォルトの名無しさん
NGNG先にリロードして正解だった。
>173がシンプルに説明をしてくれている。
後はBase::Funk()が仮想関数でないということは、どういうことかを
考えればよい。
つまり仮想関数であることにより期待される動作(これは勉強するべし)
を数え上げれば、それがすなわち2つのパターンの違いである。
0176デフォルトの名無しさん
NGNGBase* a = new Deliver;
a->Func();
したときにBaseとDeliverどっちのFunc()が呼ばれるかを書いて欲しいんだろうな。
0177>>171
NGNGあ、そういうことです。
と、いうことは、
パターンAの場合は、基底クラスが呼ばれて、
Bの場合は、派生クラスが呼ばれるということでいいんでしょうか?
0178デフォルトの名無しさん
NGNG0179デフォルトの名無しさん
NGNGだから仮想関数とは何かを勉強しなよ。
>176が好意的に書いてくれた丁寧なレスの内容なんて、
本読むなりサイトの記述をチェックすればすぐにわかること。
調べたけどわからなかったからここで聞いているんですなんて
いうのは却下だよ。それは自分の無能さを公に宣言するような
ものだからな。
0180デフォルトの名無しさん
NGNGそのクラスのprivateメソッドとするべきかどうかで迷ってます。
クラス宣言が見づらくなるという、つまらない理由で
単なるstatic関数としてのみ扱うのは横暴でしょうか
0181デフォルトの名無しさん
NGNG意味がわかりません。
もっと詳しく、読んで理解できる日本語で説明するか、コードで語ってください。
0182デフォルトの名無しさん
NGNG*.cppにstaticで書いてるってことね。
関数内で関数定義が出来ればいいんだろうけど、出来ないんだよね。
そういう場合、俺はstructのoperator()で擬似的に関数内関数にしてる。
0183デフォルトの名無しさん
NGNG> そういう場合、俺はstructのoperator()で擬似的に関数内関数にしてる。
不要なハックは感心しない。
0184180
NGNGそうです、すいません
モジュール内でstatic(=ローカル)な関数の意味でした
うーん、無理矢理、関数内関数っぽくしちゃうわけですか
元々、切り分ける意味が薄い関数なんですよね。
再帰や、ちょっとしたまとまった処理程度で。
確かに散らすよりは気分はいいかも…
早速試してみます、レスありがとうございました
0185デフォルトの名無しさん
NGNGそもそもprivate関数とモジュール内staticな関数の違いとして、
メンバにアクセスできる、できない、があるんだが。
0186デフォルトの名無しさん
NGNGSTLと同じ流儀なんだから標準的技法なんじゃないかと
0187デフォルトの名無しさん
NGNG謝るこたーない、static関数で合ってるよ
>>181はどこが分からなかったんだ
0188デフォルトの名無しさん
NGNG俺も一瞬そう解釈した。
0189デフォルトの名無しさん
NGNGnamespace {} で囲っちゃえば?
0190デフォルトの名無しさん
NGNG0191デフォルトの名無しさん
NGNGオナニー以外の何物でもない。
>>180
横暴というかアホ。
0192デフォルトの名無しさん
NGNG何のためにoperator()が使われているか理解してないんだね。
関数内関数(←全然違うw)を模倣するためじゃないことくらい分からないと。
0193デフォルトの名無しさん
NGNG0194デフォルトの名無しさん
NGNG0195デフォルトの名無しさん
NGNGん?無名namespace使えばいいだろ。
0196デフォルトの名無しさん
NGNG0197デフォルトの名無しさん
NGNG0198デフォルトの名無しさん
NGNG確か、コンテナ内部で使われるんだっけ?
フォローお願い。
0199デフォルトの名無しさん
NGNGstatic関数に頼らないC++的な解決法とか・・・?
0200デフォルトの名無しさん
NGNG0201デフォルトの名無しさん
NGNG逆だ
オーバーライドとオーバーロードの区別をしろ
ポリモフィズムを理解しろ
0202デフォルトの名無しさん
NGNG無理に「C++流」にせず、「C流」で構わない部分ってのもあるとは思う。
staticもそうだけど、stdioの関数群とかキャストとか。
0203デフォルトの名無しさん
NGNGうむ。漏れもそう思う。
0204デフォルトの名無しさん
NGNG0205デフォルトの名無しさん
NGNGstringstream使えとか言われたら
俺絶対泣くし。
0206デフォルトの名無しさん
NGNGstdio.hとか、strstreamとか、リテラルからchar*への変換とかと同等。
0207ぼるじょあ ◆yBEncckFOU
NGNGdeprecated
【形】 《コ》〔仕様{しよう}などが〕廃止{はいし}される可能性{かのう せい}がある、
廃止予定{はいし よてい}の、
将来{しょうらい}のサポートが保証{ほしょう}されない(ので使用{しよう}すべきでない)、
0208153
NGNGどうもありがとうございます。
>>168
ポリモフィズムの時のデストラクタのように、
試してみるだけでは気付かない事があるかも知れないと思って聞きました。
(ここで聞くより本やサイトで調べろって言われれば、そのとおりなんですけども)
皆様、ご迷惑おかけしました。
今度こそ、消えます。
0209デフォルトの名無しさん
NGNGだから「聞く」とか「本やサイトで調べる」とかじゃなくて、
その前に、自分でコード書いて実行すれば結果が分かるだろう?
っていう話をみんなしてる訳で・・・
0210デフォルトの名無しさん
NGNG>ポリモフィズムの時のデストラクタのように、
>試してみるだけでは気付かない事があるかも知れないと思って聞きました。
それこそ、試した方が簡単に、確実に、良くわかるだろ・・・
0211デフォルトの名無しさん
NGNG0212デフォルトの名無しさん
NGNGstatic関数よりも無名namespaceを使うべき、って聞いたことがあるんですけど、
(規格書にもそう書いてあった気がする。)
(1) なんでか知ってますか?
(2) みなさんはどっち使ってますか?
とりあえずワシは、規格書をもう一回読んできます。
0213デフォルトの名無しさん
NGNG同意。
まず試すことはとても重要。
でも、試して大丈夫だからといって安心してはだめ。
質問するときは
「こういう目的のために、こういうコードを書いてみました。試したら上手く動きました。でも正しいか不安です。教えてくれ。」
って感じでよろしく。
0214デフォルトの名無しさん
NGNG1. deprecated
2. neither
0215デフォルトの名無しさん
NGNG質問する側は相手からうまく情報を引き出すコツを身につけるべきだ。
相手の為ではなく自分の為にな。
0217デフォルトの名無しさん
NGNGstaticは使う場所によって意味が幾つにも分かれてしまう(のでわかりにくいと言われている)から減らすため
0218デフォルトの名無しさん
NGNGへえ。そんな理由だったんだ。
だったら、なんでクラスメンバにstaticなんてキーワードをあてたんだろう。
矛盾してるよね。
0219デフォルトの名無しさん
NGNGstaticというキーワードに複数の意味を持たせる事で
実際に混乱してるからね。
でも、絶対に「非推奨」が「不可」にはならないと思うけどね。
Cが無くならない限り。
むしろ(単語の意味はともかく)、staticメンバのするために、
既存の「static」というキーワードを利用したのが混乱の原因なんだから。
関数内staticな変数だって
C++がマルチスレッドを前提とした言語にならない限り
無くなることはないだろうし。
0220デフォルトの名無しさん
NGNGfile local = static
ってのは、staticって単語の誤用だからでしょ。
infinite existence = static
に統一したんでしょ。
>>219
> 関数内staticな変数だって
> C++がマルチスレッドを前提とした言語にならない限り
> 無くなることはないだろうし。
そんなことはないです。
マルチスレッドだってstaticなlock変数は極めて有効です。
0221デフォルトの名無しさん
NGNG> 相手からうまく情報を引き出すコツ
2chで一番有効なのは、
その場の人間達を小馬鹿にするような口調で間違った主張を披露して、
知識をひけらかすことに命を賭けてる厨が「正解」を携えて突っ込んでくるのを
待つって戦法ですね :-)
0222デフォルトの名無しさん
NGNG0223デフォルトの名無しさん
NGNGextern宣言は関数スコープでもファイルスコープでも同じように書けるのに
infinite existence変数の記法は関数内外で違う書き方が推奨されるってのがね。
違うのはスコープ(可視性)だけで、寿命その他は同じなのに。
(初期化タイミングは違うけど、「スコープが初めて有効になった時に初期化される」という意味では同じ)
0224デフォルトの名無しさん
NGNGクラスメンバと infinite existence って違う概念のような気がするなあ。
グローバル変数だって infinite だし。だからグローバルな static関数/変数は非推奨にしたって考えればいいのかな。
マルチスレッドで使うstaticなlock変数と、auto変数じゃないstatic変数って別ものじゃないかなあ。
再入可能性の制御ってこと?
0225デフォルトの名無しさん
NGNGstd::や#include <c...>あたりから、なんとなく
Cとの互換性(というよりCしか知らない人の移行しやすさ)を軽視する方向のような気もしてるけど
それならそれで仕方ないかなって気もするし。
0226デフォルトの名無しさん
NGNGオート変数へのstatic qualifierが「変更する」のは、
寿命でしょ。スコープは変えないよ。
qualifierの行う変更について、
static: 寿命
extern: スコープ(defaultだから基本的に意味なし)
と統一したんでしょ。
で、名前のスコープはnamespace使えと。
> 違うのはスコープ(可視性)だけで、寿命その他は同じなのに。
はとんちんかん。
グローバル変数の元から持っている性質とオート変数の
static qualifierが変えた性質が同じだからって何だって言うの?
0227デフォルトの名無しさん
NGNG> クラスメンバと infinite existence って違う概念のような気がするなあ。
infinite existence: クラスメンバの性質の一つ
オブジェクトが存在しなくても存在し続けるメンバ。
staticなオート変数が関数実行中でないときも存在するのと同じ。
後半については何言いたいのかサパリ
0228デフォルトの名無しさん
NGNG>寿命でしょ。スコープは変えないよ。
なにわけわかんないこと言ってるの?
auto変数は常にauto変数であって、決してstaticではないよ。
関数スコープのローカル変数に、autoとstaticの2種類があるだけ。
0229デフォルトの名無しさん
NGNG要するに、
「いろんなタイプの変数や関数が存在するけど、とりあえず寿命がinfiniteなものに付けるキーワードはstaticでいいや」
って標準化委員会が考えたってことだね。
変なのぉ〜とは思うけど、まぁ理解はできる。
0230デフォルトの名無しさん
NGNGプログラムの中でソケットを扱うのですけど、Cでは直接socket()等のシステム
コールを叩きますよね。
でもC++でそれをやるとC++らしくなくなる気がします。
特にselect/pollで多重化して非ブロックにして…、なんてのをやると
「オブジェクトは何所行った?」って感じがするんですよね。
そこで聞きたいのですが、みなさんはC++でネットワーク関連のプログラム
を書くときどういう設計にしますか。sourceforge.netで調べていたら
cppsocketというソケットのクラスラッパがあったりするので
そういうのをみなさんも使用(または自作)しているのかなと想像しているのですが。
ソケット周辺だけでなく、どうもC++を書いているとどこでシステムコールの
ような低レベルインターフェースを叩くか迷うんです。理想と現実というか…。
0231デフォルトの名無しさん
NGNG0232デフォルトの名無しさん
NGNGhttp://www.cs.wustl.edu/~schmidt/ACE.html
http://www.boost.org/
0233デフォルトの名無しさん
NGNG所詮通信路でしかないんだから、そこはそれで割り切って、
オブジェクトのシリアライズ経路のひとつとして考えたほうがいいと思う
0234デフォルトの名無しさん
NGNGhttp://www.kegel.com/dkftpbench/doc/Poller.html
0235デフォルトの名無しさん
NGNGレスありがとうございます。
ACEってのは気になるますね。
サイトの方に文章が大量にあるので、いまから読んでみます。
本も出てるみたいですね。
一方で無理にオブジェクト化すると標準入出力と同列に扱えなかったり
するんですよね。
>>232, 234さんらはやはりその手のライブラリを使うのでしょうか?
いろいろ考えてるとソケット自体をオブジェクトにするのでは無くて、
もっと上位のクラスを作って、その中で生のソケットを扱うのが良いのかなぁ、と。
例えばHTTPServerやFTPClientのようなクラスを用意して、その中で
プロトコルとソケットを管理するような感じ。
結局Socketクラスを作っても
Socket sock;
sock.setsockopt(HOGEHOGE);
sock.bind(Foobar);
みたいなことをやり始めると結局やってることはC流とは変わらないし。
0236230
NGNG0237デフォルトの名無しさん
NGNG0238230
NGNGデストラクタでソケットを閉じるということですか?
ソケットを閉じるときって結構デリケートな処理が必要になったりしますよね。
相手の為にできるだけ早く閉じたかったりすることも。
あ、そういうことをクラス内に隠蔽すると嬉しいという話か。
非同期IOなんかも隠蔽出来るとうれしいかな。
その場合select/poll等の関数は誰が保持しますか?
>>234のような専用クラス?
0239デフォルトの名無しさん
NGNG環境依存にしてスレ違い。
専用スレ逝ってください。
ネットワークプログラミング相談室 Port10
ttp://pc5.2ch.net/test/read.cgi/tech/1090385857/
0240デフォルトの名無しさん
NGNG黙れ。ここはCスレじゃないんだからそんなことにこだわるな。
0241デフォルトの名無しさん
NGNG0242デフォルトの名無しさん
NGNGいやいや、そうでもない。
特にサーバアプリの場合、完全に環境依存。
ちょっとやそっとのことで汎用的なラップをできるものじゃない。
0243242
NGNGメンバ変数に直接アクセス出来るようにしておく事をお奨めする。
デストラクタ機能はあくまでオマケ感覚のつもりで。
0244デフォルトの名無しさん
NGNG死んどけや
0245デフォルトの名無しさん
NGNG0246デフォルトの名無しさん
NGNGそうか?
プラットフォーム、実装が複数ある中では異例の成功だと思うけども。
0247242
NGNGなぜに死すべしや?
ついでに書くと、ソケットハンドルをいつでもAttach/Detachできるようにしないとかなりツライ。
デストラクタ処理がかえって邪魔になる事もあるからね。
0248デフォルトの名無しさん
NGNG0249デフォルトの名無しさん
NGNGまさか。あんなのtoy programでしか使わないよ
0250デフォルトの名無しさん
NGNG0251マイク ◆yrBrqfF1Ew
NGNGQtのSignal/Slotでいい感じじゃねえか。
0252デフォルトの名無しさん
NGNGなりません、まだ使われる可能性があるのにインスタンスを破棄するアホでもないかぎり。
0254デフォルトの名無しさん
NGNG0255デフォルトの名無しさん
NGNGタコ助だな
0256デフォルトの名無しさん
NGNG生のソケットを渡したりするから、生ソケットにアクセスする手段は
必要だって。完全なカプセル化じゃなくFacadeと考えた方がいい。
0257デフォルトの名無しさん
NGNGsetsockoptし忘れて・・・なんてことが
環境依存で起こりまくりですよもう
0258デフォルトの名無しさん
NGNG>>255
通信プログラム初心者は黙ってた方がいいね。
0259デフォルトの名無しさん
NGNG#include <iostream>
int main()
{
std::cout << "hello\n";
}
こういうエラーが出てきます。どなたか解る方がいましたら教えてください。
cstdlib(22): error C2873: 'exit' : シンボルを using 宣言の中で使用することはできません。
cstdlib(19): error C2873: 'abort' : シンボルを using 宣言の中で使用することはできません。
cstdlib(22): error C2039: 'exit' : 'operator``global namespace''' のメンバではありません。
cstdlib(19): error C2039: 'abort' : 'operator``global namespace''' のメンバではありません。
0260デフォルトの名無しさん
NGNGあとsignalも
0261デフォルトの名無しさん
NGNG#include <cstdlib>
0262デフォルトの名無しさん
NGNG必死でググりながら調べてるのかな?
勤勉で結構。
0263デフォルトの名無しさん
NGNG再インストールでしょうか。。。
0264デフォルトの名無しさん
NGNG0265デフォルトの名無しさん
NGNG0266デフォルトの名無しさん
NGNG> 環境依存部をラップする事が不可能って断言
具体的にどのレス?
0267デフォルトの名無しさん
NGNG0268デフォルトの名無しさん
NGNGそんなこと稀だし、ドキュメントに不備あるし、
OSのverupやパッチで動作変わったりするし
だから結局 >>256 のいうような形になると思うんだ
想像がつかない奴もいるようだが
0269デフォルトの名無しさん
NGNGだからカプセル化するんじゃねーのか?
つうかメンバ変数に直アクセス出来るようにしとくってギャグか?
0270デフォルトの名無しさん
NGNG>>269は、ソケットプログラム作ったことないの?
0271デフォルトの名無しさん
NGNG> メンバ関数でやれることは、限りなく「お約束」処理だけだよ。
んなわきゃない。
俺はネットわープログラミングは専門外のゲーム屋だが、メンバ変数を
直接触らせるような設計にはしてないぞ。機種固有のメンバ関数を定義
することはあるが。
実務経験があるから偉いってわけじゃなし、「ソケットプログラム作った
ことないの?」なんていわずに、もすこし具体的な指摘をしとけ。
あとネットワークの話に絞りたいなら、スレ違いだから続きは
よそで頼む。
0272デフォルトの名無しさん
NGNG0273デフォルトの名無しさん
NGNGラッピングの目的にもよるような気がしてきたなあ
javaやmfcみたいな、大勢向けのフレームワークなのか、
ちょっとした共通化を施したいだけの話なのか・・・
>>269
> だからカプセル化するんじゃねーのか?
仕様が決まればカプセル化できるのはアタリマエのような・・・
(と別のスレで似たことを書いたな)
>>270
ゲーム屋はそこで動けば済む話だから楽だよね。
0274デフォルトの名無しさん
NGNG0275デフォルトの名無しさん
NGNG> ヒントをいうと、あまりカプセル化しすぎないこと。
> メンバ変数に直接アクセス出来るようにしておく事をお奨めする。
> デストラクタ機能はあくまでオマケ感覚のつもりで。
このくらい低い目標を持った方がいいということ。無理はいかん。
0276デフォルトの名無しさん
NGNG0277デフォルトの名無しさん
NGNGお約束なるものをコードで表現するのがクラスでありメンバ関数では?
約束(仕様)に沿って提供する機能(メンバ関数)を設けて、
その実装(内部仕様)は外部から見えなくするというのがクラスではないかと。
お約束以外にいろいろできるようにするというなら、そもそもクラスを使う
意義がなくなるような気がするんです。
メンバ変数を外部から操作できてしまうと、メンバ関数の動作において
状態を把握・管理できかねる状況が生じませんか?
なんでもありにするなら、最初からクラスにせず、普通にCのライブラリのように
直接的に使うほうが楽な気もします。
0278デフォルトの名無しさん
NGNG場合によるが、ソケットやファイルでスクリプタを public にするのは
かなり終わってると思われ。
0279デフォルトの名無しさん
NGNGそれだとそれに最適な実装方法を持ち出して、それで終わりだからなー。
とはいえ >>278 は何もわかってないな
0280デフォルトの名無しさん
NGNG> 意義がなくなるような気がするんです。
これも頭痛いな。
0281デフォルトの名無しさん
NGNGコテハンつけてくれ。
メンバ変数を公開しないというのは、それを公開すると状態の一貫性を
保ちにくくなるから。たとえば文字列クラスで文字列を記憶するバッファと、
文字列長をメンバ変数にしていた場合、それを公開したら容易に矛盾
する状態を作れてしまう。
ソケットも同様で、ソケットを直接ユーザに見せたらソケットのオープン・
クローズ状態などをライブラリ側で把握できなくなってしまい、エラー処理や
assert() による実行時検査が事実上不可能になる。
Win32 のハンドルのように、すでに OS 側で管理機能が入ってる場合は
ともかく、生のソケットやファイルでスクリプタを直接ユーザに露出すると
誤用に対してきわめて脆弱なライブラリになってしまう。小規模なプログラム
ならそれでも良いんだが、規模がちょっと大きくなったり、複数のプログラマが
共同で作業する場合には、そのエラー検出・バグ取りの時間が馬鹿にならん。
0282デフォルトの名無しさん
NGNGそういう奴にsocketを触らせる時点ですでに間違ってると思う。
0283デフォルトの名無しさん
NGNGで、終了でいいんじゃない?
後はOOP一般論スレにでも行って。
0284デフォルトの名無しさん
NGNGだからカプセル化するんだが? (w
0285デフォルトの名無しさん
NGNGラッパーとしてだけにしかクラスを使う事が出来ないんだよ。
抽象化とかそういったことはハナから頭にない。
0286デフォルトの名無しさん
NGNG静的な世界のことしか考えてない人たちがライブラリ設計しちゃイカンと思う
0287デフォルトの名無しさん
NGNG0288デフォルトの名無しさん
NGNG0289デフォルトの名無しさん
NGNGそういうことだね。
C++使って書かれsocketプログラムというのを何個かみたことがあるけどありゃC++じゃねぇ。
0290デフォルトの名無しさん
NGNG0291デフォルトの名無しさん
NGNGなんでそこまで張り切るのかが分からん
ガチガチに作っても、OSのパッチひとつでダメになるのは目に見えてるのに
その例がjavaのsocket。
抽象化の工数はもっと意義のあるところに使おうぜ。
0292デフォルトの名無しさん
NGNG0293デフォルトの名無しさん
NGNG不必要なところまで低レベルな機能を提供しなけりゃいい。
socketなんてクラスはsocketそのまんまだし(.NETも然り)
0294デフォルトの名無しさん
NGNG結局そこに行き着くと思うんだがなあ・・・
このスレで頑張ってる抽象バカって、単純に
socket_some_func_01(socket, params);
を
socket->some_func(params);
に置換して満足してるんだろうか。
この程度で抽象化なんてほざいてたらイタいが。
0295デフォルトの名無しさん
NGNGjavaのsocketの歴史を見ると笑えるよ。
だんだん低レベルなメソッドが追加されてくの。
NIOではとうとう分離しちゃったけどな。つまるところ、破綻。
0296デフォルトの名無しさん
NGNG0297デフォルトの名無しさん
NGNG0298デフォルトの名無しさん
NGNG> だんだん低レベルなメソッドが追加されてくの。
メンバをpublicすることとは、全く別の話だが?
>>294
> このスレで頑張ってる抽象バカって、単純に
> socket_some_func_01(socket, params);
> を
> socket->some_func(params);
> に置換して満足してるんだろうか。
プラットフォームの違いを、型システムで扱えるのだが?
0299デフォルトの名無しさん
NGNGJavaなんてどうでもいいから。
0300デフォルトの名無しさん
NGNG意味わからん。
覚えたての単語を使ってみようなんて思わなくていいから。
0301デフォルトの名無しさん
NGNG満足してるのはお前だけ。お前用のクラスは
class socket { public: int socket; };
だけで良いじゃん、どうせメンバ関数すべて標準関数へのスタブにするんだろうし。
0302デフォルトの名無しさん
NGNG0303デフォルトの名無しさん
NGNG考え方が違うんだろうし、無理に意見一致させる必要も無いし。
0304デフォルトの名無しさん
NGNGACEの設計が理解できない池沼
0305デフォルトの名無しさん
NGNG実戦でやられると迷惑なだけだが。
0306デフォルトの名無しさん
NGNGこんなクソ言語を使ってるダメプログラマは腹をくくって死ぬべきだ。
0307デフォルトの名無しさん
NGNG【厨房】言語叩き討論スレッド【隔離】
http://pc5.2ch.net/test/read.cgi/tech/1064841627/
0308デフォルトの名無しさん
NGNGという定義があった場合に、これをどのように理解すればいいのでしょうか?
aaa<bbb>をcccとして置き換える、というところまでわかりまっす。
でもaaa<bbb>の括弧の部分がわかりません。
これは、C++独自の仕様なのでしょうか?
どなかた、ご教授お願いします。
0309デフォルトの名無しさん
NGNG0310デフォルトの名無しさん
NGNGそれではさっぱりわかりません!!!!!
0311デフォルトの名無しさん
NGNG0312デフォルトの名無しさん
NGNGという定義などない
0313デフォルトの名無しさん
NGNGのような宣言のことだろうな
0314デフォルトの名無しさん
NGNG0315デフォルトの名無しさん
NGNG× ><313
○ >>313
0316デフォルトの名無しさん
NGNG0317デフォルトの名無しさん
NGNG0318デフォルトの名無しさん
NGNGテンプレーって何ですか?
0319デフォルトの名無しさん
NGNG0320デフォルトの名無しさん
NGNGあ、テンプレートか。
なるほどね。
0321デフォルトの名無しさん
NGNGstd::stringからCORBA::W_String_varに変換する方法を教えてください。
0322デフォルトの名無しさん
NGNGDWORD* Dw;
::GetFileSize(FHnd,Dw);
こう書くと"値のない変数を参照しました。"と警告がでます。
値があればいいのだから、
DWORD* Dw = 0;
::GetFileSize(FHnd,Dw);
こう書けってことですか?
それとも他に書き方があるんでしょうか?
0323デフォルトの名無しさん
NGNG::GetFileSize(FHnd,&Dw);
じゃダメか?
0324デフォルトの名無しさん
NGNGできました!ドウモアリガトウ
0325デフォルトの名無しさん
NGNG出来ましたじゃねーよ
お前はCやめるか必死でポインタ勉強するのどちらかだろ
GetFileSizeとか書いてる場合じゃねーよ
0326デフォルトの名無しさん
NGNG【初心者歓迎】C/C++室 Ver.8【環境依存OK】
http://pc5.2ch.net/test/read.cgi/tech/1091264964/
0327デフォルトの名無しさん
NGNG0328デフォルトの名無しさん
NGNG0329デフォルトの名無しさん
NGNGclass B
{
private:
~B() {}
};
class D: public B
{
//~D() {}
};
これがコンパイルを通ってしまうんだけど標準的にはどうなの?
ちなみに、コメントを解除するとちゃんとエラーになるんだけど。
0330デフォルトの名無しさん
NGNG0331デフォルトの名無しさん
NGNGおそらく
D d;
と実際に変数を定義すると、その段階で D::~D() をコンパイラが作ろうとして
コンパイルエラーになるんじゃない?
0332329
NGNGまあ悪名高き某VC6だけど、
タダのVC Toolkit 2003でも試したら、警告は出たけどコンパイルは通った。
>331
それならVC6でもエラーになったけど。
D *d = new D;
delete d;
この場合だと通ってしまいます。
0333デフォルトの名無しさん
NGNGせずともD d;の時点でコンパイルエラーになって通らない。
ポインタに書き換えてもコンパイルエラーになって通らない。
0334デフォルトの名無しさん
NGNG5
デストラクタが暗黙的に宣言されているクラスがinaccessibleな
デストラクタを持った基底クラスを持っている場合、プログラムは
不適格(ill-formed)である。
多分>>329は、D d;としてもD* d=new D;としても通らないのが正しい。
0335デフォルトの名無しさん
NGNG悪名高くないだろVC6。
何と比較して言ってんの?
0336デフォルトの名無しさん
NGNGforのスコープがあんなにひどいコンパイラはVC++6くらいだろ
0337デフォルトの名無しさん
NGNG0338デフォルトの名無しさん
NGNG0339デフォルトの名無しさん
NGNG素人まるだしだからやめとけ
0340デフォルトの名無しさん
NGNG0341デフォルトの名無しさん
NGNG0342デフォルトの名無しさん
NGNG呼んだ?
0343デフォルトの名無しさん
NGNGえーっと、「・・・」が帰ってくるのを期待してたのかな?
forのスコープ問題って散々既出だけど、コンパイルスイッチで制御できるし
出た当時の仕様には準拠していたはずだよね。
VC6が出た時代背景も考慮に入れるなら、
叩けるところはnewがbad_alloc投げない事くらいでないの?
>>340
付属STLはパッチ出ててバグ修正されてるはず
Dinkumwareのページになかったっけ?
0344デフォルトの名無しさん
NGNGこれはかなり問題ではないかと…
0345デフォルトの名無しさん
NGNGそうだっけ?
本当にそうだったら、これほどいつまでもウダウダ言われないと思うし、
#define for if (0) ; else for
なんてのがまかり通る事もないと思うけど。
0346デフォルトの名無しさん
NGNGDinkumwareのページ古くて、SP5以降だといくつか直ってたり修正ファイルの方が古かったりする。
結局差分とってソース追って正しいか確かめるのに大変だった。
0347デフォルトの名無しさん
NGNG_set_new_handler()でどうにかなるし。
>>345
forのスコープはコンパイラスイッチで変更できるが、変更した場合付属のライブラリ群の動作が保証されないとかだった気がするが。
0348デフォルトの名無しさん
NGNGnew_handler 書いたり、アロケータ用意したりとかマンドクセ
0349デフォルトの名無しさん
NGNGってやるのと、必要になる都度
std::
ってやるのとどっちがいいですか?
あと、どっちの方が主流なコーディングですか?
0350デフォルトの名無しさん
NGNGusing namespace std; しちゃうと string, vector, list, map 等々、
ありきたりな名称で名前空間を汚されるのが嫌。てかうっかり名前
被らせて知らぬ間にバグを埋め込みそうで怖い。
0351デフォルトの名無しさん
NGNGやはり std:: ってやる方がいいですか。
せっかく分けた名前空間をごっちゃにしちゃ意味ないですもんね。
ありがとうございました
0352デフォルトの名無しさん
NGNG重要なのはコンパイルスイッチでの制御の可否じゃなくて、当時の仕様だ。
>>347
windows.hが通らないだけだった気がする
0353デフォルトの名無しさん
NGNGヘッダのグローバルな部分ではusing namespaceは使っちゃ駄目、絶対。
でも小さなソースファイルとか、関数単位ならそれほど問題ない。
0354デフォルトの名無しさん
NGNG自分でも using namespace std; って書いててかなり疑問に感じてました。
名前空間の持つそのものの利点が失われるので。
std:: とその都度打つ方が主流みたいですし、はっきりした利点もあるようなのでこれからはこう書いていきます
0355デフォルトの名無しさん
NGNG名前空間の持つ欠点も失われるけどね。
0356デフォルトの名無しさん
NGNG0357デフォルトの名無しさん
NGNG次どうなるかまったく予測がつかなくなった例
0358デフォルトの名無しさん
NGNG0359デフォルトの名無しさん
NGNG読んでても一貫して無くて、むきーっとなるなw
0360デフォルトの名無しさん
NGNGで、やっぱ、こういうのって、文字列操作が、からんで、くるじゃないですか?
ってことは、やっぱり、PERLがいいのでしょうか?
それとも、C++?
皆さんも仕事で、コーディングチェックのための、ツールを、作っていると、思うのですが、
言語は、何が、おすすめでしょうか?
0361デフォルトの名無しさん
NGNG文字列操作なんて言ってるようじゃ無理ぽ。
そんなの、先人の作ったオプソのツールを活用せい。
それと、手段を目的にしてるようじゃダメだね。
0362デフォルトの名無しさん
NGNG> 皆さんも仕事で、コーディングチェックのための、ツールを、作っていると、思うのですが、
作ってないし使ってない。人が作ってるものを探してるなら C++ beautifier あたりで
検索かけてみ。
0363デフォルトの名無しさん
NGNGコーディングチェックって、具体的にはなにをするの?
0364デフォルトの名無しさん
NGNG0365>>360
NGNGなるほど、人が作っているものが、あるのですね。
そうします。
>ヘンな読点には突っ込まないのか。大人だなおまいら。
すいません、リアル中国人SEなので。
話すのは流暢なのですが、文章苦手です。
在日10年で、この7月に永住許可、もらっちゃいましたよ。(帰化ではないですよ)
0366デフォルトの名無しさん
NGNGそうか。すまんかった。
0367デフォルトの名無しさん
NGNGできれば>>363に答えて欲しい。
0368デフォルトの名無しさん
NGNG南京大虐殺、の被害者数捏造とかです。
0369デフォルトの名無しさん
NGNG>>360は西村京太郎だろ
0370デフォルトの名無しさん
NGNG技術者の場でそういうネタを持ち込むはやめれ。
0371デフォルトの名無しさん
NGNGいやあ、技術に国境は確固として存在するよ。それに伴う偏見や雑言もね
0372デフォルトの名無しさん
NGNG0373デフォルトの名無しさん
NGNG言語はC++です。
int型の数値をchar型の文字列に変換したいときは
どのような関数を作ればよいですか?
同じように、
double→char
など。
初心者の質問で申し訳ないですが
宜しくお願いします。
0374デフォルトの名無しさん
NGNGchar c = 2;
double d = 3.0;
c = static_cast< char >( n );
c = static_cast< char >( d );
こういうこと?
0375デフォルトの名無しさん
NGNGsprintf()
0376デフォルトの名無しさん
NGNGfgets()
0377373
NGNG374さんが書いたコードは、
int i;
char j;
j = (char)i;
といったかんじの普通のキャストとは
やはりどこか違うんでしょうか?
>>375
sprintfという便利なものが
あったのですね。
とりあえずがんばってみます!
ありがとうございました。
0378デフォルトの名無しさん
NGNGワラタ
暗にマルチポストを指摘しているな。
0379デフォルトの名無しさん
NGNGそういうことなら
ostringstream ってのがある
0381デフォルトの名無しさん
NGNGboostかな?
うわおれc++忘れてる
0382デフォルトの名無しさん
NGNG0383デフォルトの名無しさん
NGNGまた他にもっと良い方法はありますか?
A get( ){
return a;}
const A a = get( );
この方法は値渡しがネックです。
void get( A& a ){
a = b;}
A a;
get( a );
この方法だと2行必要ですし、constが付けられません。
0384383の続き
NGNGreturn a = b;}
const A a = get( );
この方法はオーバーライドした際、バグの元になりやすいです。
例)
A& get2( ){
return get();}
A& get( ){
static A a; // TLSでも可
return a = b;}
const A a = get( );
この方法だとなんだか無駄が多い気がします。
キャッシュミスも起こりそう。
0385デフォルトの名無しさん
NGNGNRV 最適化でググれ。
0386デフォルトの名無しさん
NGNGNRVとは初めて知りました。
自分のコンパイラ(VC)で適用されるのか試してみます。
ありがとうございました。
0387デフォルトの名無しさん
NGNG0388デフォルトの名無しさん
NGNGあれほんとに何も最適化しないもんな。
定数式の最適化位だろ。
0389デフォルトの名無しさん
NGNGclass Personal {
string name, sex, tel, email;
int age;
}
例えば、こんなクラスで、あるときはnameで、あるときはageでソートや検索をしたいという場合です。
operator== や operator< はクラスで1つしか持てないので、別の比較関数(or関数オブジェクト)を用意する必要があると思いますが、
どこで用意するのが管理しやすいでしょうかね・・・。
マネージャクラスを別に作って、そこにstaticな比較関数を持たせるのが一番楽かなと思っているんですが・・・
class PersonalManager {
public:
static bool AgeCompareLessl(Personal &p1, Personal &p2){ return p1.age < p2.age}
;
}
としておいて、
vector<Personal> v;
sort(v.begin(), v.end(), PersonalManager::AgeCompareLess);
これじゃぁ、あんまり頭よさそうじゃないですよね。
もっといい案あったら教えてください。
0390デフォルトの名無しさん
NGNG{
bool operator() (const Personal &p1, const Personal &p2){ return p1.age < p2.age; }
}
vector<Personal> v;
sort(v.begin(), v.end(), PersonalComparator());
0391デフォルトの名無しさん
NGNG○PersonalAgeComparator
0392デフォルトの名無しさん
NGNGttp://www.tietew.jp/cppll/archive/549
0393デフォルトの名無しさん
NGNGそれだとやっぱりメンバの数だけ、関数オブジェクトが出来てしまいますよね。
なんか分散しちゃうのが感覚的に嫌な感じ・・・。
>>392
ありがとうございます。そういう奴がほしかったんです。
templateつかってうまいことできないかなぁと。
とりあえずそこ読んで研究してみます・・・・。
0394デフォルトの名無しさん
NGNGprintf("\x1b[30m");
とか。
VC++.NETを使っています。
0395デフォルトの名無しさん
NGNGhttp://book.mycom.co.jp/user/preview/4-8399-1555-5/index.shtml
この本に日本の未来に光を感じました。
これのC言語版がほしいのですが、どこで売ってるのか教へてください。
おながいします。
はふはふ。
0396デフォルトの名無しさん
NGNG0397デフォルトの名無しさん
NGNGちなみにコーディング規約でsprintf使用禁止になっています。
std::stringにそのようなメソッドはないでしょうか?
0398デフォルトの名無しさん
NGNG0399デフォルトの名無しさん
NGNG0400デフォルトの名無しさん
NGNG#include <iostream>
using namespace std;
int main(){
stringstream ss;
string s;
int n;
cin >> n;
ss << n;
ss >> s;
cout << s << endl;
return 0;
}
0401デフォルトの名無しさん
NGNGメンバ変数ポインタと Boost Bind もしくは Boost Lambda を使う。たとえば名前をキーに
したければ
boost::bind(std::less<string>(), boost::bind(&Personal::name, _1), boost::bind(&Personal::name, _2))
あるいは
using namespace boost::lambda;
bind(&Personal::name, _1) < bind(&Personal::name, _2)
ってな感じで、望みの関数オブジェクトが作れる。
0402デフォルトの名無しさん
NGNG馬鹿な規約ですね。
0403デフォルトの名無しさん
NGNG0404デフォルトの名無しさん
NGNG0405デフォルトの名無しさん
NGNGsprintf 禁止でも snprintf なら OK とか?
0406デフォルトの名無しさん
NGNG0407デフォルトの名無しさん
NGNG>401
ちなみにlambdaなら
using namespace boost::lambda
&_1->*&Personal::name < &_2->*&Personal::name
こういう書き方もできますよ.
0408デフォルトの名無しさん
NGNG0409デフォルトの名無しさん
NGNGstd::cout << "\x1b[30m";
0410>>397
NGNG0411デフォルトの名無しさん
NGNGできないです。
どうすればいいでしょう。
もしかしてVC++についているコマンドプロンプトみたいのを使ってるから?
0412デフォルトの名無しさん
NGNGVC++付属じゃないけどな。
0413デフォルトの名無しさん
NGNGコマンドプロンプトでする方法ないですか?
0414デフォルトの名無しさん
NGNG0415デフォルトの名無しさん
NGNG0416デフォルトの名無しさん
NGNG0417デフォルトの名無しさん
NGNGSTLつかうと(ry
0418デフォルトの名無しさん
NGNGこういうのはどうだ?
http://www.kumei.ne.jp/c_lang/intro/no_58.htm
0419デフォルトの名無しさん
NGNG環(ry
0420デフォルトの名無しさん
NGNGすげ(ry
0421デフォルトの名無しさん
NGNG0422デフォルトの名無しさん
NGNG0423デフォルトの名無しさん
NGNG0424デフォルトの名無しさん
NGNG0425デフォルトの名無しさん
NGNG0426デフォルトの名無しさん
NGNG0427デフォルトの名無しさん
NGNGって話かとオモタ。
0428デフォルトの名無しさん
NGNGfor( int i = 0; i < 10; ++ i ){
...
}
std::cout << i << std::endl;
みたいな風に、for を抜けても i を参照することって許されてるんですか?
0429デフォルトの名無しさん
NGNG0430デフォルトの名無しさん
NGNGマジデスカ…
おのれ VC7.1 …
0431デフォルトの名無しさん
NGNG0432デフォルトの名無しさん
NGNGおぉ、THX!
これやってみます
0433デフォルトの名無しさん
NGNG#define for if (0) ; else ; for
0434デフォルトの名無しさん
NGNGイテレータが2種以上あるとき無力だにょなあ
map::iterator im = m.begin();
for( int i = 0; i < 10; ++i, ++im)...
結局こうなっちゃうし。
俺は古い仕様のままでいいと思うけど。
0435デフォルトの名無しさん
NGNG0436デフォルトの名無しさん
NGNGi<10;
++i, ++im) {}
でいいじゃん
0437デフォルトの名無しさん
NGNGそれ、コンパイル通る?
0438デフォルトの名無しさん
NGNGなら通るんだけどねぇ
0439デフォルトの名無しさん
NGNGテンプレートが16種類もあるんだけど
どれが何用とか決まってんの?
0440デフォルトの名無しさん
NGNG0441デフォルトの名無しさん
NGNGint i = 0, map::iterator im = m.begin();
が、
int i = 0; int map::iterator im = m.begin();
と解釈されちゃうんだね。
forの初期化部には一つの型しか書けないわけか。
0442デフォルトの名無しさん
NGNGmap::iterator im = m.begin;
for (int i = 0; i < 10; ++i, ++im)
{
}
}
0443デフォルトの名無しさん
NGNG0444デフォルトの名無しさん
NGNG禿げしく却下
0445デフォルトの名無しさん
NGNG0446デフォルトの名無しさん
NGNG人にとって
0447デフォルトの名無しさん
NGNGんなアンコモンケースに対応することの方がどうでもいい。
0448デフォルトの名無しさん
NGNGそうか?
つーか現状のfor構文の方に
不備があるだろ、どっちかって言うと。
for()内のカンマをセミコロンに、
セミコロンを別の適当な記号に置き換えれば
無問題になるし意味的にも自然だ。
0449デフォルトの名無しさん
NGNG0450デフォルトの名無しさん
NGNG0451デフォルトの名無しさん
NGNGint main(int argc, char **argv)
??<
printf("%d??/n", argc);
??>
0452デフォルトの名無しさん
NGNG0453デフォルトの名無しさん
NGNG0454デフォルトの名無しさん
NGNGmap::iterator im = m.begin;
int i = 0;}
whlie( i < 10){
...
++i; ++im;);
0455デフォルトの名無しさん
NGNGoperator delete( p );
と、
int* p = static_cast< int* >( operator new[]( 10 * sizeof( int ) ) );
operator delete[]( p );
は何か違いがあるのでしょうか?
あるのなら何を基準に使い分ければいいのでしょうか?
0456デフォルトの名無しさん
NGNGreinterpret_cast ちゃうか?
0457デフォルトの名無しさん
NGNGここ読め。
http://www.fides.dti.ne.jp/~oka-t/cpplab-placement-new-3.html
new int[10]だと10 * sizeof(int)以上の領域を確保しなければならない可能性がある。
0458デフォルトの名無しさん
NGNGint flag = 1;
if (EndChr == "n"){
flag = 0;
}
このような式においてEndChr == "n"がfalseになります。
なぜなのでしょうか?
0459デフォルトの名無しさん
NGNG>>455のような例では両者に領域の違いも何もないということですよね?
new 演算子で配列を確保場合、必要以上の領域を確保する可能性があると。
0460デフォルトの名無しさん
NGNGそもそもoperator newはnewから呼び出される為の物だということを忘れるな。
0461デフォルトの名無しさん
NGNGは?
0462デフォルトの名無しさん
NGNGアドレス比較してるから。char[10] の代わりに std::string 使うか strcmp() で比較。
0463デフォルトの名無しさん
NGNGclass C{ ... };
C* p = static_cast< C* >( operator new( 10 * sizeof( C ) ) );
for( int i = 0; i < 10; ++ i )
new( p[ i ] ) C( ... );
...
for( int i = 0; i < 10; ++ i )
p[ i ].~C();
operator delete( p );
と、
C* p = static_cast< C* >( operator new[]( 10 * sizeof( C ) ) );
for( int i = 0; i < 10; ++ i )
new( p[ i ] ) C( ... );
...
for( int i = 0; i < 10; ++ i )
p[ i ].~C();
operator delete[]( p );
はどっちも正しい?
0464デフォルトの名無しさん
NGNG0465デフォルトの名無しさん
NGNGどちらも正しくないんじゃない?動くとは思うけど。
malloc でも動くけどね。
0466デフォルトの名無しさん
NGNGあ、スイマセン…
new( &p[ i ] ) C( ... );
です
0467デフォルトの名無しさん
NGNGまー確かに、全く平等な条件で選んでた言語かって聞かれると・・・・だな。
市場のデカさは間違いなく判断基準に入ってる。
0468デフォルトの名無しさん
NGNGそれで、オブジェクトの事を詳しく説明しているサイトがあれば、教えて頂けないでしょうか?
よろしくお願いします。
0469デフォルトの名無しさん
NGNGは、人文で言うと、
「文化について詳しく説明しているサイトを教えてください」
くらい、条件が広くて絞り込めない。
0470デフォルトの名無しさん
NGNGC++関連の書籍を扱っている書店に行ける環境ですか?
Amazonなどの通信販売でも構いませんので、
まずは1冊、自分で良さそうと思った本を読破することをお勧めします。
高くて買えないという場合は、立ち読みしちゃうとか図書館を覗いてみるとか。
時にはネット以外の情報源に当たるのもいいですよ。
0471デフォルトの名無しさん
NGNGえっと、オブジェクトの事で知りたいのは、オブジェクト=オブジェクトとか、
クラスで、メンバ関数の引数でオブジェクトでの参照渡し、値渡しです。
0472デフォルトの名無しさん
NGNG0473471
NGNG0474デフォルトの名無しさん
NGNGchar hoge[256] = {0}; // hoge文字列の初期化
この書き方って一般的でない?
レビューで「わかりにくい」と言われてしまったんだけど。
#memsetやるより良いと思うんだけどなぁ・・・
0475デフォルトの名無しさん
NGNG0476デフォルトの名無しさん
NGNGhoge[0]='\0';
特に意味が無いのならこうすべきだ。
初期化指定子は無駄な領域も初期化するからな。
0477デフォルトの名無しさん
NGNGこれで
0478デフォルトの名無しさん
NGNGでも構造体配列だと・・・
0479478
NGNG0480474
NGNGchar hoge[256];
hoge[0]='\0';
これってVC6のDebug(Releaseでは大丈夫だった)で起動するとこうならない?↓
hoge[0] : 0x00
hoge[1] : 0xcc
hoge[2] : 0xcc
・・・
hoge[255] : 0xcc
まあ、問題はないんだけど・・・。
0481デフォルトの名無しさん
NGNG0で埋めたいわけじゃないんだろ?
0483デフォルトの名無しさん
NGNGせめて
for (int i = 0; i < 256; i++) hoge[i] = '\0';
だろ。
0484デフォルトの名無しさん
NGNGじゃぁコードが合っててコメントが糞ってことだな。
0で埋めるコードとしては、>>474のものが最も効率が良くなる可能性が高い。
0485デフォルトの名無しさん
NGNGおまえはたぶん回答者に向いてない。もうちっとROMで雰囲気つかめ。
0486デフォルトの名無しさん
NGNGC++ならせめて std::fill 使うだろ。
0487484
NGNG>485
テメーで解答してから言え ぼけ
0488デフォルトの名無しさん
NGNG0489デフォルトの名無しさん
NGNG0490デフォルトの名無しさん
NGNG0491484
NGNG関数を想定してるなら全部埋める必要があるだろ。0で埋めるってのはそういう話だと
思ったが。
0492デフォルトの名無しさん
NGNG1byteずつ初期化すると遅いから4byteか8byteずつ初期化しなさい。
0493デフォルトの名無しさん
NGNGあー、すまん。>>483=487=491だ
0494デフォルトの名無しさん
NGNG0495デフォルトの名無しさん
NGNGCしか知らんて、Cでも配列の初期化は={0}で同じことできる。
これが通らないとか言ってるからROMっとけと言ってるんだ。
0497デフォルトの名無しさん
NGNG0498デフォルトの名無しさん
NGNGいや、意図は、hoge[0] だけ0で埋めるという意味だよ。
全部埋まったのは、そのコンパイラがたまたまそうだっただけ。
0499デフォルトの名無しさん
NGNGレビューで文句言われたならとりあえず従っておいたら。
コメントが微妙にずれてるのがわかりにくいと言われたのなら直せばいいだけだ。
0500デフォルトの名無しさん
NGNG知らなかった、正直すまんかった。
で、スレ違いではあるがよければK&Rのどのへんにそういうのが載ってるのか教えてくれないか。
索引で配列関連を引いてみたが見つからなかった。
0501デフォルトの名無しさん
NGNG「4.9 初期化」
0502474
NGNG了解。コンパイラ依存という事で。
>>497,499
実際のコメントは○○文字の初期化、という感じで書いていました。(○○がわかると会社がばれる)
レビュアーの言う通りにmemsetで統一、という事になりそうなので訊いてみた次第です。
たくさんの意見蟻が�d。
0503デフォルトの名無しさん
NGNGP.104〜P.105の
『指定した個数より配列に対する初期値が少なければ、残り要素は外部変数、静的変数および
自動変数については0になる。』
ここかー!ありがとう。ほんとK&Rは隅々まで読んどかないと変なとこで足下掬われるな
0504デフォルトの名無しさん
NGNG0505504
NGNG0506デフォルトの名無しさん
NGNG0507デフォルトの名無しさん
NGNG所詮STLの知名度なんてそんなもんなんですな
0508498=504=505
NGNGちょっと混乱中。
0509474
NGNGデータ構造関係は、ほぼ使ってますよ。
Boostも使いたかったけど「実績」を証明するのがめんどくさかったので諦めましたが。
>>508
VC6 VC7 mingw gcc にて確認、全部0で埋まりました・・・。
0510デフォルトの名無しさん
NGNG={0}と=""は同じです。
どっちも={'\0'}です。
0511デフォルトの名無しさん
NGNG0512デフォルトの名無しさん
NGNGなんで既出の意見を何度も繰り返す必要があるよ?
つうかこの場合={0}がstd::fillよかいいだしょ。
0513デフォルトの名無しさん
NGNG激しく同意。とでも言って欲しかったんじゃないか。
寂しい奴なんだよ。
0514デフォルトの名無しさん
NGNGコンパイラ依存じゃねーよ
{0}は残りの配列の要素(クラス、構造体のメンバ)も0で埋める。
0515デフォルトの名無しさん
NGNGhttp://www.kuzbass.ru/docs/isocpp/decl.html#dcl.init.aggr
の8.5.1-7-がそれ.
>512,513
すいません.愚痴垂れ流しただけになってました.
0516デフォルトの名無しさん
NGNGPoint* pt = (Point*)new char[sizeof(Point)];
*pt = Point(10, 10);
delete [] pt;
1). 2行目のコードででptのコンストラクタが呼ばれますが、
ptはビット的な変化はあるんでしょうか?
2). ptのアドレスは変わらない様ですがこの行為は正当でしょうか?
0517デフォルトの名無しさん
NGNG釣れますか?
0518デフォルトの名無しさん
NGNGPoint* pt=new(buffer) Point(10, 10);
pt.~Point();
delete[]buffer;
こういうことがやりたかったんじゃないのかい?
0519デフォルトの名無しさん
NGNGあまりエレガントな記述を追求しても、
同じデータを再初期化する時に破綻するのがわかってんだから、
大人しく一般的な初期化をしとけ。
memset、ZeroMemory、std::fillで決着。
反論は受け付けない。以上。
0520デフォルトの名無しさん
NGNG知名度はそんなに高くないから「わかりにくい」という意見には
一理あるかもしれんけど、だからと言ってそこで memset を使う理由にはならない。
オーバーロードは分かりにくいから使用禁止って言うのと同レベルだよ。
0521デフォルトの名無しさん
NGNG最初期化、それは名高い変数の使いまわしと言うものですか!?
0522デフォルトの名無しさん
NGNG変数使いまわしも何も、クラスのメンバ変数が思い切り該当するっしょ。
0523デフォルトの名無しさん
NGNG0524デフォルトの名無しさん
NGNGまったく同意見
519は論点ずれてるうえ
反論は(ry とわざわざ自爆する奇特なピエロ
0525デフォルトの名無しさん
NGNGそれはやってみるしかない
同じ処理系でも条件次第で違ったりもする
アセンブラ読めない人と、実測できない人は、蚊帳の外
0526デフォルトの名無しさん
NGNG> memset、ZeroMemory、std::fillで決着。
これらは一般的な「初期化」ではない。
未初期化のPODに対して行う場合に限定して
「初期化」と呼べるかもしれない、くらいのものだ。
0527デフォルトの名無しさん
NGNG何に該当するって?
0528デフォルトの名無しさん
NGNG0529デフォルトの名無しさん
NGNG具体的には、
char hairetu[256];
std::string str = "ぬるぽ";
hairetu = str.c_str();
これでいけると思うのですが・・だめなのでしょうか・・・
0530デフォルトの名無しさん
NGNG0531デフォルトの名無しさん
NGNGネタ?
配列名には代入できない。strcpyを使え。
0532デフォルトの名無しさん
NGNGだめです。
char配列を文字列として使うなら、C言語の文字列処理を知るべきです。
0533マイク ◆yrBrqfF1Ew
NGNG↓
>std::string str("ぬるぽ");
0534デフォルトの名無しさん
NGNG文字列処理なんてどんな入門書にも書いてるし、これ間違えるなんてあり得ない
0535デフォルトの名無しさん
NGNG0536デフォルトの名無しさん
NGNG0537デフォルトの名無しさん
NGNGbuffer overrun が気になる
0538デフォルトの名無しさん
NGNG0539>>529
NGNG自分C++ラーなので、知りませんでした。
まじで、ネタじゃありませんが(あせ
0540デフォルトの名無しさん
NGNGhenkaku[str.length()] = '\0';
0541540
NGNG0542デフォルトの名無しさん
NGNG>>537
0543デフォルトの名無しさん
NGNGstd::vector<char> hairetu(str.begin(), str.end());
hairetu.push_back('\0');
0544デフォルトの名無しさん
NGNGchar const* const c_str = str.c_str();
std::vector<char> hairetu(c_str, c_str + str.length() + 1);
0545デフォルトの名無しさん
NGNG0546mike ◆yrBrqfF1Ew
NGNGchar carray[256];
std::string nullpo("ぬるぽ");
std::istringstream strstrm(nullpo);
strstrm>>setw(sizeof(carray))>>carray;
0547デフォルトの名無しさん
NGNGint len = std::max(str.length(), sizeof(hairetu) - 1);
std::copy(bgn, bgn + len, hairetu);
hairetu[len] = '\0';
0548デフォルトの名無しさん
NGNG0549デフォルトの名無しさん
NGNG0550デフォルトの名無しさん
NGNG勝手に後ろを切り捨てちゃまずいだろ。
char hairetu[256];
if(str.length() >= sizeof(hairetu)) throw std::range_error("長すぎ");
strcpy(hairetu, str.c_str());
0551マイク ◆yrBrqfF1Ew
NGNG0552デフォルトの名無しさん
NGNGgap::sweet texture;
という記述があるのですが、
これはどういう構文なのでしょうか?
初心者で申し訳ない。
0553デフォルトの名無しさん
NGNG名前空間(またはクラス型) gap のメンバである sweet 型の変数 texture の定義。
インクルードの次の行であることには意味が無い。
0554デフォルトの名無しさん
NGNG0555マイク ◆yrBrqfF1Ew
NGNGnamespace gap {
typedef void sweet();
}
//sourcefile
gap::sweet texture; //declare
//omit
gap::sweet texture //def
{
std::cerr<<"\0m0th3rfuck3r"<<std::flush;
std::teminate();
}
0556522
NGNG名前空間 gap のメンバである sweet 型の変数 texture を
グローバル変数に定義しているということで間違いないでしょうか?
0557マイク ◆yrBrqfF1Ew
NGNG0558デフォルトの名無しさん
NGNG0559522
NGNGnamespace gap{
void sweet::print()
}
としておいて、ソースの中で
gap::sweet texure
texture.print()
となっているのですが、これは
sweet型の変数textureがprint()という関数を
呼び出しているということであってますでしょうか?
0560デフォルトの名無しさん
NGNGいや、それだとコンパイル通らないはず。
ところで、そのプログラム全部ここで解説させるつもりなのか?
0561デフォルトの名無しさん
NGNGセミコロンくらい見逃してやれよ。
0563デフォルトの名無しさん
NGNGchar*に対するfillはmemsetで特殊化している実装が多いです
0565デフォルトの名無しさん
NGNG頭悪そうだと思っていたが、もういいかげん頭悪いんだとわかった。
もう触りません。スレ汚して悪かった。
0566デフォルトの名無しさん
NGNG名前おかしいよ藁
0567デフォルトの名無しさん
NGNG複雑になるにつれ、クラスに纏めたいと思い、C++に手をだしました。
ただ、CもC++もまだ初心者で、中々苦労しています。
特に困っているのが、何をクラスにして派生クラスは何になるのか、メンバは何を持たせるか
みたいな部分が中々把握できません。
基礎的な書き方のようなものは、本を買ってプログラム組んでみました。
こういったことに慣れるための良い練習法のようなものがあれば教えてください。
0569アイク ◆uCUYQ8/A2w
NGNG0570デフォルトの名無しさん
NGNGワラタ
0571デフォルトの名無しさん
NGNG包含関係に気を配るとよろしいかも。
あと、Effective C++あたりが定番かな。
0573デフォルトの名無しさん
NGNGアドバイスありがとうございます。
本も探してみます
0576マイク ◆yrBrqfF1Ew
NGNG0578デフォルトの名無しさん
NGNGどのようにすればいいんでしょうか・・・
void Hage::OutLog(const char* fmt, ...)
{
va_list argp;
va_start(argp, fmt);
vfprintf(stdout, fmt, argp);
va_end(argp);
fprintf(stdout, "\n");
}
0579デフォルトの名無しさん
NGNGstd::string sss;
sss = "abc<TAB>bbb";
※<TAB>は制御コードのTABだと思ってください。
で、このストリングを、
sss.find();で見つけたいのですが、どうすればできますか?
そもそも、find()で制御コードを検索することってできるのでyそうか?
0580デフォルトの名無しさん
NGNG0582デフォルトの名無しさん
NGNG\
0583デフォルトの名無しさん
NGNG0584デフォルトの名無しさん
NGNG>※<TAB>は制御コードのTABだと思ってください。
嫌です。
0585デフォルトの名無しさん
NGNG典型的な宗教論争だね。2ch なら煽り入れて楽しむところだが。
058611063
NGNG>>580,>>585
そんなこと言ってないでお前らも参加しろよー
ほれ、よく言うじゃん、「踊る阿呆に、見る阿呆。同じ阿呆なら踊らにゃそんそん。」って。
0587デフォルトの名無しさん
NGNG触りたくないです
0589デフォルトの名無しさん
NGNG0590デフォルトの名無しさん
NGNGVC6のときにお世話になりますた。
0591デフォルトの名無しさん
NGNGその「踊る阿呆に・・・」って阿呆なのが前提じゃないと意味無いと思う。
0592デフォルトの名無しさん
NGNGたぶん放置されるはず。
0593デフォルトの名無しさん
NGNG0594デフォルトの名無しさん
NGNG0596デフォルトの名無しさん
NGNG「継承するとき、いちいち基底クラスのprivateな定義まで読みたくねーよ」
って事か。
俺もprivate virtual使いだけど、一理ないこともないかも。
0597デフォルトの名無しさん
NGNG見なくていい(普通の)privateとは分けて、しっかりコメントつけておかないと、
読み飛ばされる可能性が高いね。
ただ、C++使いとしては、アクセス指定とvirtual指定とが
まるで関係ないということは知っておいて欲しい。
public virtual を派生先で private にしてオーバーライドとか、
逆に private virtual を派生先で public にしてオーバーライドとか、
いくらでも有り得るし、相応の効果がある。
実際に役に立つかとか、良し悪しはまた別にして。
0598デフォルトの名無しさん
NGNGDoxygenのようなドキュメント生成ツールでは一般的にprivateなメンバは
ドキュメント化されない。
だからドキュメントを信じてコーディングすると予期せぬエラー
をうけることになるわけだ。だからprivate virtualはイクナイ。
でも、やる人の気持ちがわからないわけではない。
やるなら何らかの形で明示的に示してほしいなぁ。
0599デフォルトの名無しさん
NGNGそりゃDoxygenの問題だろ。提案すれば対応してもらえそう。
0600デフォルトの名無しさん
NGNG0601デフォルトの名無しさん
NGNGから、aaaaとbbbbを切り取って、それぞれstringに格納したいのですが、
いい方法はないでしょうか?
0602デフォルトの名無しさん
NGNG0603デフォルトの名無しさん
NGNGすぺしゃるさんくす!!!
0604デフォルトの名無しさん
NGNGありゃ? いいたいことが伝わんなかった…。
Doxygenでもprivateなメンバをドキュメントに含めさせることは可能なはず。
言いたいことはそれが可能かどうかではなくて、すべきでない場面が多々あるってこと。
例えばなんらかのライブラリを作って、それ用のAPIドキュメントを作るときは
privateなメンバを含めないでしょ、多分。
だって、それを使用するユーザは内部でのみ使用されるprivateなメンバを
意識する必要は無いし、しちゃいけない。
ところが、そのライブラリの中にprivate virtualな関数があると、ユーザ
privateな関数まで見てコーディングしなくちゃいけなくなる。
問題ありだよね?
0605デフォルトの名無しさん
NGNGC++ではprivateでもvirtualであればユーザーに関係有るんだから、
ドキュメント作るなら含めないといけないだろ。
Doxygenがそれには対応してないだけ。
private virtualが否定される理由としては理不尽。
0606デフォルトの名無しさん
NGNGtemplate メソッドの場合は、規定クラスの公開メソッドのドキュメントに
「派生クラスでこれこれのメソッドをオーバーライドすること」と書くから、
大差ないと思うが。
なんにしても、どっちでも良いよ、そんなの。
0607デフォルトの名無しさん
NGNGそもそもprivate virtualの是非について話しているのに
>C++ではprivateでもvirtualであればユーザーに関係有るんだから、
という前提を持ち出すのも理不尽。
俺はprivateなのにユーザに関係することが問題だと思う。
多分、これはpublic, private等の捉え方の違いなのかな?
俺はクラスの使用者に対する可視性だと思っているから、privateなのに
使用者に見えることが気持ち悪い。
これを可視性ではなくてアクセス権として捉えるとprivate virtual肯定派
のいいたいことが理解出来る。
なんだかんだ言って
>>606
>なんにしても、どっちでも良いよ、そんなの。
に賛成。 消えます。
0608デフォルトの名無しさん
NGNG0609デフォルトの名無しさん
NGNGnothrow は最適化に使えるけど、他の例外指定って使う価値あるか?
未処理例外で死ぬか、terminate() で突然死するか程度の差しか無いような。
C++はデフォルトの例外指定が throw(...) なので
一箇所でも指定していない関数があると誓約が途切れてしまうし。
0610デフォルトの名無しさん
NGNGvoid hoge(){ throw; }
set_unexpected( hoge );
で
0611デフォルトの名無しさん
NGNGclass C
{
...
struct CImpl;
CImpl* pimpl_;
};
を
class C
{
...
struct CImpl* pimpl_;
};
と書く事って認められてるんですか?VC7.1じゃコンパイル通んないんですが…
0612611
NGNGstruct C::CImpl{ ... }
ってやるとです。。
0613デフォルトの名無しさん
NGNGCImplはどこで定義してんの?
0614デフォルトの名無しさん
NGNG;が抜けてるけど,それがCImpl(Cのインナークラス)の定義ってことなんでしょう.
gccだとこんな感じ.規格では???
class C {
struct CImpl; // (a)
CImpl* pimpl_; // (a)
struct CImpl* pimpl_; // (b)
};
struct C::CImpl {}; // (1)
struct CImpl {}; // (2)
(a)-(1) ○
(b)-(1) ×
(a)-(2) ○
(b)-(2) ○
0615デフォルトの名無しさん
NGNGExceptional C++ では通して
(b)-(1)
の形式で書かれてるのですが、規格ではどんなもんでしょう…
0616デフォルトの名無しさん
NGNGこれは宣言じゃないんだから、
b-1が不可能なのは当然でない?
0617デフォルトの名無しさん
NGNGその説明だと本来は(b)-(2)も通っちゃいけないってこと?
0618デフォルトの名無しさん
NGNGvirtualなデータメンバって何故できないのでしょうか?
あれば便利だとおもうのですが。
0619デフォルトの名無しさん
NGNGたとえばどんな感じに使いたい?
0620デフォルトの名無しさん
NGNGテンプレートクラスって知ってるよね?
0621デフォルトの名無しさん
NGNGいったいどういう挙動をするものなのか、まるで思いつかない。
protectedメンバ変数とか、参照を返すvirtual関数で満たされないものなのか?
0622デフォルトの名無しさん
NGNG(b)-(2)は(2)で宣言と定義を同時に行ってるんだから、問題ない。
0623デフォルトの名無しさん
NGNG参照を返す virtual メソッドで我慢しとき。
0625デフォルトの名無しさん
NGNG> Exceptional C++は誤植なのかもしれないですね.
例えば何ページ?
0626618
NGNG// あるライブラリで定義されてるクラス
class B {}
class B1 : public B {}
class B2 : public B {}
// 自分のクラス
class A
{
vritual B b:
void proc(){ b に対して色々な処理}
}
class A1 : public A { B1 b1;}
class A2 : public A { B2 b2;}
みたいな感じです。
>>623
>参照を返す virtual メソッドで我慢しとき。
この方法がよさげなので、ためして見ます。m(_ _)m
0627デフォルトの名無しさん
NGNGclass B { virtual void age() = 0; };
class B1 : public B { void age() { fusianasan(); } };
class B2 : public B { void age() { mokorimoko(); } };
class A
{
B* sage;
void proc() { sage->age(); }
};
class A1 : public A { A1() { sage = new B1; } };
class A2 : public A { A2() { sage = new B2; } };
0628618
NGNGあ〜あ〜ぁあ〜ぁあ〜ぁあぁ。正にその通りです。
最初からインスタンス作ろうしたからダメなんだ。orz
muchas gracias、merci beaucoup、danke schon、grazie mille、非常感謝
0629デフォルトの名無しさん
NGNG上が class C 内に struct CImpl を宣言している。
下がグローバル名前空間に struct CImpl を宣言している。
初めて class/struct XXXX の形で現れた名前の宣言されるスコープは、
それが他の宣言中に含まれるか、単体で文になっているかで変わるらしい。
詳しくは規格の 3.3.1 -5- 。
ちなみに friend 宣言のときはまた別のルールになる。
0630デフォルトの名無しさん
NGNGclass A
{
virtual B& sage() = 0;
void proc() { sage().age(); }
};
こっち(参照を返す virtual メソッド)のほうがいいと思う。
0632デフォルトの名無しさん
NGNGポインタを保持するサイズが節約できる。
(>>627の例ではvtableと相殺するが、たぶんAにはvirtualなデストラクタが必要だろう。)
所有権の混乱を避ける。
(>>627のコードでnewしたB1,B2をだれがdeleteするべきなのか不明。)
ポインタへの代入忘れを防げる。
0634デフォルトの名無しさん
NGNG本当にそれがネックになるケースは、プログラム効率で有名な話の8:2より
はるかに小さいんだから、あんま気にしてもしょーがないだろ
0635デフォルトの名無しさん
NGNG0636デフォルトの名無しさん
NGNG" - "のような、空白を含む文字列を正しく検索するにはどうしたらいいでしょうか?
string sss = "100-100";
sss.find(" - ");
で検索すると、検索できてしまうのです・・・ORX
0637デフォルトの名無しさん
NGNG見つからなかった時の戻り値が string::npos だってのは知ってる?
0638デフォルトの名無しさん
NGNG↑顔文字に見える
0639デフォルトの名無しさん
NGNG- STLPort4.6.2
0641デフォルトの名無しさん
NGNG0642デフォルトの名無しさん
NGNGはっとりくんの弟に似てんな。
0643デフォルトの名無しさん
NGNGもまえの友達の弟なんて知らん。
0644デフォルトの名無しさん
NGNG「検索できてしまう」って、 find() の戻り値はどうなってたの?
0645デフォルトの名無しさん
NGNGstd::string nlp( " -" );
std::search( sss.begin(), sss,end(), nlp.begin(), nlp.end() ) == sss.end();
これでは?
0646デフォルトの名無しさん
NGNG0648デフォルトの名無しさん
NGNGしんぞー
0649デフォルトの名無しさん
NGNG0650デフォルトの名無しさん
NGNG検索されなかったって言っただろ。
いや、検索は出来たな。マッチはしなかったけど。
0651デフォルトの名無しさん
NGNG0652デフォルトの名無しさん
NGNG仕様のバージョンとかリビジョンならあるんだろうけど(auto_ptrとか)
番号がついてるかはわからん。
0653デフォルトの名無しさん
NGNGSTLのバージョンってVC++のバージョンそのものじゃないの?
私の認識では、STLはVC++そのものということになっている。
0654デフォルトの名無しさん
NGNG0656マイク ◆yrBrqfF1Ew
NGNGどうなるんだろうな?
0657デフォルトの名無しさん
NGNG使ってるコンパイラで↓のプログラムの実行結果を確認してください。
ちなみに g++ (GCC) 3.3.3 (cygwin special) では not found になります。
#include <string>
#include <iostream>
int main()
{
std::string s = "100-100";
std::string::size_type p = s.find(" - ");
if( p != std::string::npos ) std::cout << p << std::endl;
else std::cout << "not found" << std::endl;
return 0;
}
0658デフォルトの名無しさん
NGNG0659657
NGNGお?そういえば前はそうだったような気がします。
でもこれは g++ --version からコピペしてます。
こないだ入った更新をインストールしたから、それで変わったのかもしれません。
0660デフォルトの名無しさん
NGNG自分の環境でためしたところ、not foundになりました。
findでは空白文字を含む文字列の検索は正しくできるけど、
find_last_ofは、空白文字を含む文字列の検索は正しくされないのでしょうか?
0661デフォルトの名無しさん
NGNGなんで>>636の時点で find_last_of() と書かなかった?
find_last_of() の仕様知ってるのか?
欲しいのは rfind() じゃないか?
0662デフォルトの名無しさん
NGNG0663662
NGNG0664デフォルトの名無しさん
NGNG救えねぇやつ。
なんか ttp://www8.ocn.ne.jp/~tsugaru3/shakkinn1.htm これを思い出しちまったよ。
0665デフォルトの名無しさん
NGNGinline T* Create()
{
return new T;
}
こんな感じの関数を見たんですけどこれはどうやって呼び出すんですか?
0666デフォルトの名無しさん
NGNG0667デフォルトの名無しさん
NGNGほーなるほどありがとう
0668デフォルトの名無しさん
NGNGint *じゃなくてT *でしょ?
0669デフォルトの名無しさん
NGNGなにいってんの?
0670デフォルトの名無しさん
NGNG0671デフォルトの名無しさん
NGNG0672デフォルトの名無しさん
NGNG0673デフォルトの名無しさん
NGNG神様、ありがとうございますぅ^_~
0674デフォルトの名無しさん
NGNGテストコードを実装できるスキルがまだないので教えてください。
0675デフォルトの名無しさん
NGNGスキルがないんだったら今知らなくてもいいこと
答えは出来ません
非仮想関数の再定義が起こるようなら設計を見直すべき
0676デフォルトの名無しさん
NGNGありがとうございます。
不安なら現時点ではvirtual指定しておいたほうが嬉しいことが多い、という理解で勉強を進めます。
0677デフォルトの名無しさん
NGNGという理解はお勧めしない。
virtual になれないメンバや virtual が効かない場面で
かえって深い混乱の原因になるからだ。
根を理解せずに使いたい人には C++ は向かない。ここを忘れるな。
0678デフォルトの名無しさん
NGNGそもそも、やたらと継承するな。てきとーに設計して、てきとーに継承するから
オーバーライドできるか否かで悩むことになる。
0679デフォルトの名無しさん
NGNG0680デフォルトの名無しさん
NGNGオーバーライドされる可能性があるメンバ関数と、未来永劫絶対にオーバーライドされない
メンバ関数を見分ける方法があったら教えてください。状況に依存とかいうのはナシの方向で。
0681デフォルトの名無しさん
NGNG0682680
NGNGこういう疑問って無用なのかな・・・?
0683デフォルトの名無しさん
NGNG自分が今何を作っているのかを考えたら答えでるだろうが
0684680
NGNG0685デフォルトの名無しさん
NGNGいや、ご尤もな質問だぞ?
本気で聞くがまじめに考えたことあるか?? いや現在形で考えてるか?
0686デフォルトの名無しさん
NGNG糞言語なので、ありません。
0687デフォルトの名無しさん
NGNG>>683
0688デフォルトの名無しさん
NGNG死ねJava厨
0689デフォルトの名無しさん
NGNG設計なんか考えたこともない奴隷は気楽でいいよなw
0690デフォルトの名無しさん
NGNG何でそこで Java が出てくるんだよスカタン
0691デフォルトの名無しさん
NGNGhttp://pc5.2ch.net/test/read.cgi/tech/1077985164/27
昔の疑問↑が解決したっ!ありがとうございました!
0692デフォルトの名無しさん
NGNGdat落ちしているスレッドにリンクを貼っても見られないから、コピペしてくれ。
0693デフォルトの名無しさん
NGNG27 名前:デフォルトの名無しさん 投稿日:04/02/29 16:48
当方、以下のコードが通りません。どこが悪いかご指摘願います。
Metrowerks CodeWarrior 8.2 Pro for Winを使っております。
(hello.cpp)
class hoge
{
public:
hoge();
~hoge();
private:
struct impl* pimpl_;
};
struct hoge::impl{};
hoge::hoge() : pimpl_(new impl){}
hoge::~hoge(){delete pimpl_;}
int main()
{
hoge hage;
return 0;
}
0694デフォルトの名無しさん
NGNG(メッセージ)
エラー: 宣言シンタックスエラー
hello.cpp 行: 9 struct hoge::impl{};
エラー: 宣言シンタックスエラー
hello.cpp 行: 10 hoge::hoge() : pimpl_(new impl){}
警告: 不完全な struct/union/class 'impl' の使い方が不当です。
hello.cpp 行: 11 hoge::~hoge(){delete pimpl_;}
ちなみに
struct impl;
impl* pimpl_;
とあらかじめ宣言すれば通ります。
0695デフォルトの名無しさん
NGNGググっても出てこねぇ…
0696デフォルトの名無しさん
NGNG過去ログ見たが、その書き込みから30分で>>629と同じ答えが出てないか?
0697デフォルトの名無しさん
NGNG0698デフォルトの名無しさん
NGNG0699デフォルトの名無しさん
NGNGサンクス!
0700691
NGNGglobalでどのようなときにinner classなのか、また規格のどこに
根拠があるかがはっきりしたということで。
0701デフォルトの名無しさん
NGNG本一冊を通してコンパイラを通らない規格外のコードを載せてたことになるが
0702デフォルトの名無しさん
NGNGいや、はっきりしてただろ。
28 名前:デフォルトの名無しさん[sage] 投稿日:04/02/29 17:16
>>27
'struct impl'の形はelaborated-type-specifierといって、でてくる文脈によって働きが微妙に異なる。
struct impl;
とかくと、そのスコープでimplが宣言され、
struct impl* pimpl_;
とかくと、「そのスコープを含む、最も内側の、非クラス、且つ、非関数宣言の」スコープ(この場合はグローバル名前空間)
でimplが宣言されたことになる。
詳しくは規格の3.3.1の5を参照すべし
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
0703デフォルトの名無しさん
NGNG0704デフォルトの名無しさん
NGNG・参照はリンクリストで管理(使用に付随するnewや埋め込みカウントが無い。)
・スマートポインタ間での自動アップキャスト可能
・明示指定時のみスマートポインタ間でダウンキャスト可能
・関数内定義クラスのポインタのハンドリング可能
なんか最後のが無理っぽい気もするんですが、どうなんでしょう?
0705デフォルトの名無しさん
NGNG0706704
NGNG最初の条件は
http://boost.cppll.jp/HEAD/libs/smart_ptr/smarttests.htm
こういう意味でした。
0707デフォルトの名無しさん
NGNGFoo b = Foo(10);
bの場合は一時オブジェクトが作成されてコピーコンストラクタによって、
メンバがコピーされますよね。
効率面から言えばbは非効率でしょうが、
bのような初期化を積極的に利用する状況ってどんなものがあるんでしょうか?
0708デフォルトの名無しさん
NGNGテンポラリが作られる場合、コンパイラはそれを積極的に最適化出来る
RVO でググれ
0709デフォルトの名無しさん
NGNGVC++について調べたい人は、
http://blogs.msdn.com/slippman/archive/2004/02/03/66739.aspx
g++のswitch
`-fno-elide-constructors'
The C++ standard allows an implementation to omit creating a
temporary which is only used to initialize another object of the
same type. Specifying this option disables that optimization, and
forces g++ to call the copy constructor in all cases.
規格的には、12.8.15。
0710デフォルトの名無しさん
NGNGT t = u は operator = ではなくコピーコンストラクタによるので混乱させやすいし。
0711デフォルトの名無しさん
NGNGあとは >>710 氏の言うように可読性の向上ってくらいなんでしょうか。
0712デフォルトの名無しさん
NGNGたとえば、WindowsでIShellFolderを抽象化したディレクトリクラスを作るとして、
class directory {
IShellFolder* sf;
public: ... };
とすると、このクラスのクライアントコードがIShellFolderに直接触れなくても、
このヘッダを使うソースではIShellFolderを含むヘッダをincludeしないとならなくなりますよね?
それを避けるための手段のひとつにpimplとかインターフェイスベースってのがあるんでしょうが、
手間も掛かるし、なんかどうも納得いかないんですよね。
0713デフォルトの名無しさん
NGNGインターフェースベースだと実装が変わってもクライアントの再コンパイルが必要ないな。
使うのは自分の中だけ。DLLなどで外部に公開しないんならメンバを含めてもいいと思うけど。
0714デフォルトの名無しさん
NGNG実装の詳細が含まれるヘッダをincludeする必要はないけどね。
そしてその考え方の延長上にpimplがあったりする。
インターフェイスクラスはまたちょっと考え方が違うけど。
で、privateメンバも含めて実装の詳細をヘッダ(class定義)に書かなきゃいけないのは
C++の採った効率上の妥協だと思われる。
すぐわかる利点のひとつに「スタック上に生成出来る」点がある。
0715デフォルトの名無しさん
NGNG何が悪いのでしょうか?
ここのサイトを参考にして設定して ttp://goldfly.ld.infoseek.co.jp/program/directx/bcc90b.html
ここのサイトの2Dの描画のサンプルを ttp://www.geocities.jp/toru_website/sample/index.html#dxg
コンパイルしようとしたのですが上手くいきません。
エラー・詳細です。 ttp://shiva.dip.jp/up/box/up0951.gif
◆bcc32.cfg
-I"c:\DXSDK\Include;c:\Borland\Bcc55\include"
-L"c:\DXSDK\Lib\BLib;c:\Borland\Bcc55\lib"
◆ilink.cfg
-L"c:\DXSDK\Lib\BLib;c:\Borland\Bcc55\lib"
0717デフォルトの名無しさん
NGNGdxguid.lib dxerr9.lib d3d9.lib d3dx9.lib をリンクしる
0718715
NGNGBCCはBCCDeveloper(?)を使わずにコマンドラインでやっているので
プロジェクトの設定とかないんです。
どうしたらいいのでしょうか?
0719デフォルトの名無しさん
NGNG0720715
NGNGありがとうございます!
なんとかできました!
通常のコンパイル時のコマンドの後に>>717のライブラリ名を並べて書いたらできました。
bcc32 -W -emain.exe main.cpp c:\dxsdk\blib\dxguid.lib c:\dxsdk\blib\dxerr9.lib c:\dxsdk\blib\d3d9.lib c:\dxsdk\blib\d3d9.lib
となってかなり長くなりましたが。
でもわざわざこれを書かなくてはならないということは、
bcc32.cfgやilink.cfgでDirectXのライブラリの設定した意味があるのでしょうか?
0721デフォルトの名無しさん
NGNGで、bcc32.cfgに-Lをつけてディレクトリを指定し、
#pragma comment(lib,)を書いたヘッダでも用意しときゃ
少しは楽になるんじゃないかな。
0722デフォルトの名無しさん
NGNGstd::vector<int> func();
void func(std::vector<int>& collection);
の二通りがすぐに考え付くのですが、後者の場合funcの中でclear()するべきなのか、
それとも後ろに追記するべきなのか。
コメントに書けばいいというのはそのとおりなのですが、前者ならその辺迷わないので悩みます。
std::auto_ptr< std::vector<int> > func();
というのもアリなんでしょうが、あまり誉められた形じゃない気もするし・・・
0723デフォルトの名無しさん
NGNG後者にして、後ろに追記する機能を関数としておけば、
clear() すべきかどうかは使う側で選べる。
あとは適切な関数名を与えてコメントは不要にすればいい。
0724デフォルトの名無しさん
NGNGvoidポインタは駄目みたい。
0725デフォルトの名無しさん
NGNGメンバ関数なら::*
0726デフォルトの名無しさん
NGNG俺は必ずin、out、inout修飾子をつけてる。COMのパクリね。
outならコレクションは初期化される、inoutなら初期化されない。
void func(/*[out]*/std::vector<int>& collection);
0727デフォルトの名無しさん
NGNG0728デフォルトの名無しさん
NGNG726 じゃないけど、COM 相互運用のコードでは interface の宣言のときに >>726 のような
コメントにするのがデファクトなので、それに則ってるわけです。
(要するに RPC の idl 風の記述にしてるわけ)。
0730デフォルトの名無しさん
NGNG0731デフォルトの名無しさん
NGNG[in, out] ってのもあるし。既存の何かを更新する関数とか。
0732デフォルトの名無しさん
NGNGCの関数ポインタ調べて書いたら通ッタ
0733デフォルトの名無しさん
NGNG0734デフォルトの名無しさん
NGNG2chでの質問の仕方。
0735デフォルトの名無しさん
NGNGSTLとMFC。
STLは必須だから。
MFCは学習意欲を維持するため。
0736デフォルトの名無しさん
NGNGマジレス
0737デフォルトの名無しさん
NGNG決まったカリキュラムは無いから、好きにやってくください。
0738 ◆Z0vd5w812U
NGNGやる気を維持するために、見栄えがあるDirectXアプリ。MFC使って。
その後MFCを捨ててWin32で作る。
0739デフォルトの名無しさん
NGNG逆にC++ベースのプログラムから各種スクリプト言語を呼んでインタプリタ等で解析する、
そういうライブラリってありますでしょうか?
Tclという言語は出来るようですが、RubyやJavaScriptのようなOOPがいいんですが。
0740デフォルトの名無しさん
NGNG0741 ◆Z0vd5w812U
NGNGsystem()。
CreateProcess()でもいいかもしれない。
0742デフォルトの名無しさん
NGNG0743デフォルトの名無しさん
NGNGWindows だけでいいなら ActiveScript で JScript や VBScript とかが使える。
Netscape 由来の Spidermonkey (JavaScriptエンジン) も悪くない。
0744デフォルトの名無しさん
NGNGActiveScriptRubyというものがあるそうです。これは関係ありませんかね?
http://www.geocities.co.jp/SiliconValley-PaloAlto/9251/ruby/
0745デフォルトの名無しさん
NGNGそれらです!!求めていたのは!
ありがとうございます!
0746デフォルトの名無しさん
NGNG0747デフォルトの名無しさん
NGNG小学校の学級委員殿ですか?
0748デフォルトの名無しさん
NGNG0750デフォルトの名無しさん
NGNGそれこそC++の文法ぐらいしか質問の幅がなくなると思う。
それはそれで不便だと思うけど。
0751デフォルトの名無しさん
NGNG以下のコード(>>752)をコンパイルすると二つのエラーが出ます。
エラーの内容は下の通りです。
(1) エラー
request for member 'action' in 'sclass()', which is of
non-aggregate type 'SampleClass ()()'
(2) エラー
request for member 'doAction' in 'uc(SampleClass (*)())',
which is of non-aggregate type 'UserClass()(SampleClass (*)())'
この二つのエラーは同じ系統のものかと思いまして、一度に質問させて
いただきました。何かヒントか検索キーワードでも良いので、なぜ
これがエラーになるのか教えていただけないでしょうか。
特に(2)のエラーは納得できません。代替策はあるのでしょうか?
コンパイラ:g++ (GCC) 3.2.2 Red Hat Linux
0752>>750 からの続き
NGNG#include <string>
#include <iostream>
using namespace std;
class SampleClass
{
public:
SampleClass() {}
void action() {cout << "SampleClass::action" << endl;}
};
class UserClass
{
SampleClass sc;
public:
UserClass(SampleClass sc_) : sc(sc_) {}
void doAction() { sc.action(); }
};
int
main(int argc, char *argv[])
{
SampleClass sclass();
// SampleClass sclass; とすればエラーは出ないが、上記のように
// 宣言しても引数無しのコンストラクタが呼ばれると思ったのですが…
sclass.action(); // (1) エラー
UserClass uc(SampleClass());
uc.doAction(); // (2) エラー
}
----------------------------- コードここまで
0753デフォルトの名無しさん
NGNG正しくは「>>751からの続き」です。
0754デフォルトの名無しさん
NGNGC++ の最も奇妙な解析にはまっちゃってるな
0755デフォルトの名無しさん
NGNG0756デフォルトの名無しさん
NGNGスレの書き方・質問の仕方から察するに、プログラマに向いてない。
それが一番の問題。巻き添えを食うであろう同僚PGが気の毒。
0757デフォルトの名無しさん
NGNGなんだと
0758デフォルトの名無しさん
NGNGこりゃまた強引なネタで C++ の話題に戻しにかかってきたねぇ・・・
もしネタじゃないなら、ネタじゃありません、とか書いておいた方が良いよ。
0759751
NGNGそうなんですか?
なにがおかしいのでしょう。
>>758
C++の話題に戻すのが目的でもありませんし、ネタでもないのですが
なにがおかしいのか教えていただけませんか?
みなさんのレスから想像すると、何か変なこと聞いてます、俺?
0760デフォルトの名無しさん
NGNGこれは関数宣言
0761デフォルトの名無しさん
NGNGこの書き方は何が問題なの?
0762デフォルトの名無しさん
NGNG0763デフォルトの名無しさん
NGNG0764デフォルトの名無しさん
NGNGoperator new
std::get_temporary_buffer
どっち使うのが主流?
0765デフォルトの名無しさん
NGNG756 じゃないけど「・・・と思った」とか「納得いかない」っていうのは、
自分でアレコレ調べてみる動機としては結構だけれども、
単に「・・・と思ったけど違った。納得がいかない」っていう質問はちょっとアレだろ、
訊かれたほうも困るだろ、ということでは?
>>751-752
ちなみにエラーの意味はだいたいこんなところ。
(1) エラー
非集合体の型 'SampleClass ()()' として定義された 'sclass()' に対して
メンバ 'action' が要求されました。
(2) エラー
非集合体の型 'UserClass()(SampleClass (*)())' として定義された
''uc(SampleClass (*)())' に対してメンバ 'doAction' が要求されました。
0766751
NGNG>>760
あ、言われてみればそうですね。
ということは>>753のいう奇妙な解析というのはこれのことだったのですね。
実引数の無い時は関数宣言と解釈されるから、そのときは特別扱いで
空の括弧はなし、と。
ということは(2)に関しても
UserClass uc(SampleClass());
SampleClass()という関数として解釈されてるということでしょうか?
しかし、次の行のuc.doAction()をコメントアウトするとコンパイル&実行
できます。ただし、SampleClass::SampleClass()は呼ばれていないようです。
こちらはどういうことなんでしょう。
>>762
(More) Effective C++なら持っているんですが、その本は持っていません。
明日大至急立ち読みしてきます。
0767デフォルトの名無しさん
NGNGUserClass uc(SampleClass());
これは 引数 void、関数値 SampleClass の関数へのポインタを引数に取る関数の宣言だ
(More) Effective C++ 持ってるのに分からないなんて終わってるなお前
0768デフォルトの名無しさん
NGNGuc っていう関数として認識されてる。この関数の型は UserClass()(SampleClass (*)())
SampleClass を返す引数無しの関数ポインタを引数とする、UserClass を返す関数。
型の記述を読めるようになった方が良いよ。
0770デフォルトの名無しさん
NGNG配置new…かな?
0771デフォルトの名無しさん
NGNG何をするためにそいつら使うの?
0772デフォルトの名無しさん
NGNG{
char a[10];
int b;
char c[5];
public:
func();
};
こんな感じのクラスがあったとします。
これのインスタンス class Test test;
を定義して、例えば char c[5]
の先頭アドレスを取得したいんですが、
良い方法はないですか?
0773デフォルトの名無しさん
NGNGclass Test
{
char a[10];
int b;
char c[5];
public:
func();
char* get_address(int i) { return c + i; }
};
Test test;
char* p = test.get_address(5);
0775デフォルトの名無しさん
NGNGC++のクラスでもoffsetofマクロがそのまま使える。調べてみるべし。
0776デフォルトの名無しさん
NGNG先頭アドレスってそういうことだったのか?読みが深いな。
0778722
NGNGにキャストされているマクロになってました。
>>772のc[5]のアドレスを指定されてそこに書き込む関数、
を考えると
static Test test;
SetAAA(const char *str)
{
Test* p;
size_t offset;
char* dest;
p = &test;
offset = offsetof(Test, c);
dest = p + offset;
strcpy(dest, str);
}
のような事をしたいのですが、この場合、安全なキャスト
はどのようになりますか?
dest = (char*)(p+offset);
と強引にやってしまってよいでしょうか?
0779デフォルトの名無しさん
NGNGC++を使うなら(char *)とやらずにreinterpret_cast<char*>(p + offset) と書くべき。
働きは変わらないが。
0780デフォルトの名無しさん
NGNGまあいいけど。
0781デフォルトの名無しさん
NGNGメンバへのポインタはアドレスじゃないから、>>778への最適解にはならんな。
実際内部クラスへの委譲をするにはメンバへのポインタではなくoffsetofマクロ
を使ってアドレスを求める必要があるしな。ケースバイケースかな。
0782デフォルトの名無しさん
NGNGoffsetofを使ってメンバのアドレスを求めるときは、
まずchar *にキャストしてそれからoffsetを加え、さらに実際のメンバの型にキャストするから
えらい汚くなるのよん。
dest = reinterpret_cast<char*>(p + offset);
じゃ正しく動かないねん。
0783デフォルトの名無しさん
NGNGi->m_p = NULL;
これを「for_each」を用いた式に変更したいんですが
出来るでしょうか?
0784デフォルトの名無しさん
NGNG0785デフォルトの名無しさん
NGNG{
char a[10];
int b;
public:
func();
char c[5];
};
Test test;
char *p = test.c;
ところでこれじゃだめなのか?
0786デフォルトの名無しさん
NGNGとかか?
0787デフォルトの名無しさん
NGNGmem_func1をパクってmem_assignを作りました。
ありがとうございました。
0788デフォルトの名無しさん
NGNGprivate:
int hage; //他メンバ変数が「20」個
public:
void func( int n ){
switch(n){
case CASE0: hage達に関する複雑な処理; break;
case CASE1: hage達に関する複雑な処理; break;
//以下延々と「30」個
}
}
};
case文が多いので、そこの処理だけを他クラスに切り分けたいと思ったのですが(Stateパターン?)、
切り分けたクラスからHogeのメンバ変数であるhage達にアクセスする良い手段は無いでしょうか。
・getter/setterを20個ずつ用意する
・friendを30行書く
・メンバ変数を全て構造体にまとめ、切り分けたクラス達に渡す
思いついたのは、どれもいまいち _| ̄|○
0789デフォルトの名無しさん
NGNG0790デフォルトの名無しさん
NGNG・必要なメンバ変数に相当するものを構造体にまとめ、切り分けたクラス達に(getter, setterで)渡す
に1票。インタフェイスが明確になるし。
0791デフォルトの名無しさん
NGNG0792デフォルトの名無しさん
NGNGスレ違い
0793デフォルトの名無しさん
NGNGレスありがとうございます。
やはりそういうやり方(俺のより遙かに洗練されてますが)しか無いのですね。
リファクタリングの本なんか見ると、switch-caseは全てstateパターンに
しろと言いかねない勢いで記されていますが、こういう風に分けなければとなると、
かえって解りづらい気がしてしまいますねぇ・・・。
0794デフォルトの名無しさん
NGNG0795デフォルトの名無しさん
NGNG「参照されないstatic変数・関数は削除される」という変更が入っているらしいので、
早速試してみたところ、たしかに削除された。
static int x = 0; // この定義に対する領域の確保は無い
ふと思い立って、無名名前空間に置き換えたところ、変数領域の確保が出力された。
namespace { int x = 0; } // この定義に対する領域が確保される
無名名前空間によるファイルローカルな変数・関数は、
staticと同様に参照されない場合に削除してはいけないのでしょうか?
0796デフォルトの名無しさん
NGNG0797795
NGNGttp://gcc.gnu.org/ml/gcc/2004-01/msg02323.html
ttp://gcc.gnu.org/ml/gcc/2004-01/msg02341.html
gcc開発者側の言い分を勝手に要約すると、
「無名名前空間がstaticのかわりに使えるようにしたかったのは分かるが、
現状の規格に従う限りそれらは意味的に違うものになってしまっている。
最適化のために規格に則ったプログラムを犠牲にするわけにはいかない。
今までどおりの"static"として扱って欲しいのなら、"static"と書け。」
という感じ。
gccの現在の実装を盾にしている感もあったのだが、
ソースを見ずしてそこを非難するわけにはいかない。
ついでに、標準委員会の関連する動きも貼っとく。
ttp://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#223
ttp://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#167
ttp://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#174
cwg_active.html#223 ってのが最悪で、
「deprecatedだからどうなの?」っていう話が未だに決まってないらしい。
激しく萎えた。
0798デフォルトの名無しさん
NGNG0799デフォルトの名無しさん
NGNGきれいに消えるんだろうか?
0800デフォルトの名無しさん
NGNG消えたからって特になんの効果もなさそうな気が。
0801デフォルトの名無しさん
NGNG処理系によっては、いくつか main() 走る前にコンストラクタが動いて、
動的メモリ割当を行うオブジェクトがあったりする。メモリ管理に手を
入れる場合に、ひじょーに面倒臭い。
0802デフォルトの名無しさん
NGNGそんなオブジェクトも削除されるのか?
0803デフォルトの名無しさん
NGNG「A」というクラスに「B()」というメソッドがあった場合の、
Bのポインタ変数の宣言を教えて下さいでつ。
0804デフォルトの名無しさん
NGNG0805デフォルトの名無しさん
NGNGvoid B(); なら void (*A::f)();
0806デフォルトの名無しさん
NGNGあ、*の位置間違えた、と思ったら >>804 が書いてた。
0807デフォルトの名無しさん
NGNG例えばhoge.cppとhoge.hが共に、stdhoge.hを必要とする場合
hoge.hの先頭に#include<stdhoge.h>する方法と
hoge.cppの先頭に、stdhoge.h>hoge.hの順で#includeする方法がありますが・・・。
後者は他でhoge.hを使う場合にも同順でやらなければと不便で、今まで避けていましたが、
世のライブラリを見ると、特定の順序でincludeせよという物も多く、疑問に思った次第です。
0808デフォルトの名無しさん
NGNGおかしなことになるだろうし、してあればコードの解釈は1回ですむ
からそこまで効率が落ちるってことはないだろうし。
0809デフォルトの名無しさん
NGNGファイルは単独で意味を持つ方が望ましいという観点から見ても、前者がいい。
>世のライブラリを見ると、特定の順序でincludeせよという物も多く、疑問に思った次第です。
標準ライブラリがそうでないように、そういう注文を付けるライブラリは怠慢だと思う。
0810デフォルトの名無しさん
NGNG0811デフォルトの名無しさん
NGNGC++スレでそんな事を嘆くべきかな?
テンプレートが記述されたヘッダをインクルードする時に、
避けられないことだと思うけどなぁ。
0812デフォルトの名無しさん
NGNG0813デフォルトの名無しさん
NGNGC++のstatic宣言されていないメンバ関数を渡して、
実行させることはできますか?
staticでないC++のメンバ関数の実行には、仮想関数など
ランタイム時に決定される種類のものがある。だから、
Cライブラリ関数がそれを関知して動作することは不可能
→ゆえにstaticしか通らない。
と考えているのですが。
0814807
NGNGとりあえず唯一解みたいのが無くて安心しました。。
>>808
私の使っている駄目なIDEだと、cppの方にincludeしてないと
入力補助が働かないので、実利の面からその考えは納得できます。
>>809さんのレスが、最も同感です。
ちなみに私が悩んだライブラリの筆頭がWTLです。
>>810-811
それもまた、もっともですよね…。かなり嫌ではあります…が。
0815デフォルトの名無しさん
NGNG概ねその通り。
まあ、渡せない理由は
仕様的には、型が違う
実装的には、暗黙のthisが引数に含まれる
からだけどな。
0816デフォルトの名無しさん
NGNG仮想関数などを使っていなくても、C 風の関数ポインタは
"this"が何であるのかっていう情報を持っていないので、
C風の関数ポインタを用いてメンバ関数を呼び出すことは出来ません。
0817デフォルトの名無しさん
NGNGプログラミング言語C++ 第3版 15.5
> メンバポインタは、変数ポインタや関数ポインタとは異なり、
> メモリの位置を指すポインタではない。
> メンバポインタは、ポインタというよりも構造体オフセット、
> 配列の添え字に近い。
0818813
NGNG最初、スレッドの初期化等を抽象化する基底クラスを
用意し、派生クラスではrun()メンバ関数のみを実装
すれば、コンストラクタ内部で自動的に
pthread_create(..., run, ...);
が呼ばれてスレッドが生成される...みたいな
スレッドライブラリを考えていたのですが....
スレッド生成はWin32ならbeginthreadex_だし、
Linuxならpthread_createだしで、けっこう相違が
あるので、隠蔽したいんですよ...。
どういう設計にするのが妥当でしょうか?
いままでCだけで書いて来たので、実際に応用しようと
するといろいろわからないことが...
0819デフォルトの名無しさん
NGNGスレッドで実行される関数に少なくともポインタが格納できるサイズのパラメータが渡せるはずだから、
そこに this を reinterpret_cast して渡してあげて、スレッドの開始関数 (static) では単に
static int ThreadProc(..., void* arg)
{
return reinterpret_cast<ThisClass>(arg)->run();
}
0820デフォルトの名無しさん
NGNGreturn reinterpret_cast<ThisClass *>(arg)->run();
0821デフォルトの名無しさん
NGNGどうでもいいけど、スレッドのクラスによるカプセル化は止めた方がいいよ。
ま、C中心だったのであれば、潔癖なカプセル化はしないだろうけど、念のため。
0822デフォルトの名無しさん
NGNG> スレッド生成はWin32ならbeginthreadex_だし、
> Linuxならpthread_createだしで、けっこう相違が
> あるので、隠蔽したいんですよ...。
差異の吸収はboostにやらせるのはどうでしょ?
0823デフォルトの名無しさん
NGNGそうなの?漏れけっこうガチガチにカプセル化しちゃたけど
特に不便を感じた事はなかったな。。。
>818みたいに,いろんな場所で動かす事を考えると
大変になるって事?
それとも漏れのカプセル化がまだユルユルだったのかな。
0824813
NGNGすみません。
reinterpret_castを使ったスレッド生成関数の
startup_routineを作っても、pthread_createや
親クラスへもっていく方法がわかりません。
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
class Thread {
public:
virtual int run(void *) = 0;
protected:
pthread_t t_;
};
class TSub : public Thread {
public:
TSub();
int run(void *);
protected:
};
static void * stub_thread(void *pParam)
{
reinterpret_cast<Thread *>(pParam)->run(pParam);
return NULL;
}
(つづきます)
0825813
NGNG{
pthread_create(&t_, NULL, stub_thread, (void *)this);
}
int TSub::run(void *pParam)
{
sleep(3);
return 0;
}
我ながら....情けなくなるのですが、TSubのコンストラクタに
書いてある内容をThreadのコンストラクタかメンバ関数に
もっていきたいわけです。
0826813
NGNGスレッドAPIを#defineで再定義していました。返り値なども。
ただ、スレッドプログラミングを進めるにつれ、
スレッドが使うヒープなどを終了時に自動的に回収したいとか、
pthreadそのままなのでprimitive過ぎて使いにくいとか、
いろいろ不満がでてきたのです。
Boost、恥ずかしながら今初めて聞きました。
ドキュメントを読んでみようと思います。
0827デフォルトの名無しさん
NGNGclass Thread {
public:
int Start()
{
return pthread_create(&t_, NULL, stub_thread, reinterpret_cast<void *>(this));
}
int Join(void** value_ptr = 0)
{
return pthread_join(t_, value_ptr);
}
protected:
static void * thread_func(void *pParam)
{
Thread *pThis = reinterpret_cast<Thread *>(pParam);
return pThis->run(pParam);
}
virtual int run(void *) = 0;
protected:
pthread_t t_;
};
class TSub : public Thread {
public:
TSub();
protected:
int run(void *) { sleep(3); return 0; }
};
0828デフォルトの名無しさん
NGNGreturn pthread_create(&t_, NULL, stub_thread, reinterpret_cast<void *>(this));
の stub_thread は thread_func の間違い。
ただ、今から書くのならば
class IRunnable {
public:
int run() = 0;
};
みたいなのを単独でインタフェイスとして定義して、Thread クラス本体と run を実装する
クラスを分ける方がよいと思う (Thread::Start の引数として IRunnable* を取る)。
0829813
NGNGキタ━━━━(゜∀゜)━━━━!!
最初思っていたことは上記のコードでできそうです。
ありがとうございました。
で。IRunnableの話なのですが、Thread I/Fとして
のclass Threadから、run()を追い出すとどのような
メリットがありますか?
まずThreadクラスのインスタンスを生成/管理する
ThreadFactoryとかThreadPoolとか作っておいて...
それらとは別に作っていたクラス
(例えばScreenManagerとか)で、値の監視的要素が
出てきたら、おもむろにIRunnableをくっつけて
run()だけ実装して、
ThreadFactoryに「スレッドにdispatchしてくれ」と
頼む、みたいな感じでしょうか。Start()が参加で、
Join()が脱退みたいな。
0830デフォルトの名無しさん
NGNG0831デフォルトの名無しさん
NGNG0832デフォルトの名無しさん
NGNGSocketとかコンソールとか、どのOSでも似たような機能を備えていそうなものだけカプセル化するべきだ。
0833デフォルトの名無しさん
NGNGグローバル変数はアプリケーションインスタンスの
インスタンス変数って考え方でいいじゃん。
あとアクセス制御をどうするかって論点に絞るだけ。
0834デフォルトの名無しさん
NGNGここはC++でどうやるのがいいか悪いかを論じる。
0835デフォルトの名無しさん
NGNGポータビリティを重要視したライブラリを真っ向から否定ですか?
0836デフォルトの名無しさん
NGNGプラットホーム間のポータビリティとは限らんでしょ。
スレッドやソケットはさすがに微妙だと思うよ。
もろシステムコールじゃん。明らかに他のジャンルと異質。
0837デフォルトの名無しさん
NGNGポータビリティはOSの特色を生かせない低賃金がする言い訳
個々のOSの特徴や性能を100%引き出してこそプロ
0838プッ
NGNGポータビリティのある言語だからプロ向けじゃ(ry
0839デフォルトの名無しさん
NGNG0840デフォルトの名無しさん
NGNG決して「切り込み隊長」的な仕事をしない
0841デフォルトの名無しさん
NGNG0842デフォルトの名無しさん
NGNG移植性を追及すべきか、アーキテクチャへの最適化をついきゅうすべきかを合理的に判断してこそプロ
0843デフォルトの名無しさん
NGNG0844デフォルトの名無しさん
NGNG両立してこそプロ(の技量)
0845デフォルトの名無しさん
NGNG0846デフォルトの名無しさん
NGNG0847デフォルトの名無しさん
NGNG無能ですね
0848デフォルトの名無しさん
NGNG0849デフォルトの名無しさん
NGNGお前が出来ないからって、他の人も出来ないと思うな
0850デフォルトの名無しさん
NGNG0851デフォルトの名無しさん
NGNG0852デフォルトの名無しさん
NGNG0853デフォルトの名無しさん
NGNG0854デフォルトの名無しさん
NGNGその逆のメソッドはありませんか?
MFC CStringのMakeUpper()やMakeLower()みたいな感じの。
0855デフォルトの名無しさん
NGNG0856デフォルトの名無しさん
NGNGlocale対応バージョンがうまく書けない。
0857デフォルトの名無しさん
NGNG0858デフォルトの名無しさん
NGNG派生クラス作っときゃええやん
使えるクラスができたら売るとか・・・
0859デフォルトの名無しさん
NGNGそりゃ、localeのせいだろ。
0860デフォルトの名無しさん
NGNG純粋仮想関数の中身を実装しないとコンパイル時に関数がないと言われるのですがなんででしょう?
↓ソースはこんな感じです。
#include <time.h>
#include <iostream>
class DyingMessage{
virtual void say1() = 0;
virtual void say2() = 0;
protected:
~DyingMessage(){
( time(NULL) %2 ) ? say1() : say2();
}
};
class JiipanKeiji : public DyingMessage {
void say1(){ std::cout << "なんじゃこりゃー"; }
void say2(){ std::cout << "おらぁ死にたくないよ、死にたくない、死にたくないよ・"; }
};
class RAOU : public DyingMessage {
void say1(){ std::cout << "我が生が(略"; }
void say2(){ std::cout << "我が生涯に一片の悔いなし!ウオァァァアア!"; }
};
int main(void){
JiipanKeiji jk;
RAOU r;
}
0861デフォルトの名無しさん
NGNG~DyingMessage() が実行されるときには、ジーパンもラオウも既に死んでいる。
0862デフォルトの名無しさん
NGNGコンストラクタとデストラクタ内では、仮想関数が仮想になれない。
デストラクタを仮想にしてそこに書くしか。
0863デフォルトの名無しさん
NGNG内容的に古いらしいのですが、大丈夫なのでしょうか?
0864デフォルトの名無しさん
NGNGまじで
台詞はいてからじゃないと名シーンが台無しに・・・。
>>862
すみません、virtual抜けてましたね。
でもデストラクタにvirtualつけてもやはりコンパイル通らないっす
って仰っているのはデストラクタにvirtualつけろってことではない?
それで実験としてDyingMessageのsay1とsay2を
cout << "犯人はヤス"; と定義してみたらと、
ジーパンもラオウも「犯人はヤス」しか言わなくなりました。
な、なにゆえ?
0865デフォルトの名無しさん
NGNG処理の順番はこうなる。
DyingMessage()→RAOU()→ラオウの生涯→~RAOU()→~DyingMessage()
~RAOU()のタイミングでラオウは天に還ってしまう。
0866デフォルトの名無しさん
NGNG関数呼び出しは(virtualであっても)「そのクラス」として行われるよ。
DyingMessageクラスではsay1, say2の中身は存在しないから、
コンパイラのメッセージは正しい。
実行時にヌルポ(pure virtual function call)を出す実装もある。
細かい話をすると、デストラクタやコンストラクタが親クラス→子クラス
と渡るときに、vtblのポインタが書き換わる。
これ、Javaと逆だから、多言語を渡り歩く人は要注意ッス。
Java方式もまたそれで問題あるんだけどね・・・
0867860
NGNG中身(インスタンス)はRAOUだから、say1、2はラオウのものを呼んでくれてもいいのに( ´Д⊂ヽ
>>866
>細かい話をすると、デストラクタやコンストラクタが親クラス→子クラス
>と渡るときに、vtblのポインタが書き換わる。
まじですか。vtblのポインタが書き換わるんですか。
main関数内と ~DyingMessageでのジーパン、ラオウのインスタンスのメモリアドレスが一緒だったんで、
ジーパンとラオウのvtblのsay1、say2が呼び出されてうまくいくかと思ってたのですが納得です。
結局のところ、どうしよう。
~DyingMessage上でラオウのsay1が実行させたいのですが。なんか考えます。
ありがとうございました。
0868デフォルトの名無しさん
NGNG> ~DyingMessage上でラオウのsay1が実行させたい
そうはいってもそのときにはもうラオウは居ないから、
ラオウに追加したメンバは触れないぞ。
生きているうちに遺言を作っておいて DyingMessage に保持させるといいかもしれない。
0869デフォルトの名無しさん
NGNG~DyingMessageが実行される時には
「お前(ラオウ)はもう死んでいる」から
ラオウのメンバを無理矢理呼び出すのもダメだよ。
0870860
NGNGできれば、>>860のラオウやジーパンクラスのソースのようにsay1、say2のみを定義するだけで他は何も手を加えず、
後は親クラスのDyingMessageがsay1、say2を使って処理してくれるようなのが理想なんです。
できるだけ子クラスは記述しなければならないソースを減らしたいんです。
でも、確かにラオウは破棄されてしまうわけだから今回の場合は無理っぽいですね。
>生きているうちに遺言を作っておいて DyingMessage に保持させるといいかもしれない。
それはいいアイデアかもしれないっす。ありがとうございます。
0871デフォルトの名無しさん
NGNG0872デフォルトの名無しさん
NGNGstd::stringの派生クラスを作る奴は糞。
0873デフォルトの名無しさん
NGNG{
public: ~x() { std::cout << "x::dtor" << std::endl; }
};
main()
{
std::string* p=new x();
delete p;
}
実行結果
x::dtor
問題なし。
0874デフォルトの名無しさん
NGNG環境は?
0875デフォルトの名無しさん
NGNGお前が気にするのはそこなのか?
この場合問題なのはデフォルトコンストラクタしか使えんことだろ。
0876デフォルトの名無しさん
NGNG実行結果
0877デフォルトの名無しさん
NGNGOh! Me としたことが釣られてしまいましたNeー!
0878デフォルトの名無しさん
NGNG0879デフォルトの名無しさん
NGNG0880デフォルトの名無しさん
NGNG> std::stringの派生クラスを作る奴は糞。
まぁ、作るなとは言わんが、この場合は
tolower(std::string&);
toupper(std::string&);
っつーフリー関数にしておいた方が、何かと幸せになれる気がする。
0881デフォルトの名無しさん
NGNG0882デフォルトの名無しさん
NGNGstd::ifstream fin("somefile");
char str[1];
fin.getline( str, 256 ); // この結果勝手に256に拡張されるっぽい
などとできてしまうのですけどこれって仕様ですか?
0883デフォルトの名無しさん
NGNG未定義動作です。
0884デフォルトの名無しさん
NGNG拡張をしないまま暴力的に 256 byte 書き込んできてしまうだけ
道路の拡幅工事を立ち退き交渉も予告もせずにおっぱじめるようなもの
何が起きるのかは、おそらくご想像のとおり・・・
0885882
NGNG今度から気をつけます。ありがとうございました。
0886デフォルトの名無しさん
NGNGuppercase_traits作るんでもいーけどさ、
stringとの混用を前提とする場合、他にどーしよーもねーだろ
0887デフォルトの名無しさん
NGNG0888デフォルトの名無しさん
NGNGそのuppercase_traitsって、何してくれるの?
0889デフォルトの名無しさん
NGNG>>880
でいいやん。
なんで継承したがる?
つうか良く考えろよ。今から分かりやすく説明するからな。
お前は機能XXXを追加したくなった。
機能追加は継承だという浅はかな考えからstringから派生することにした。
class MyString : public std::string{
public:
void XXX();
/* 他のメソッドは略 */
};
こうしちゃったらさぁ、機能XXXを使うには
必ずMyStringクラスを構築する必要が出来るよな
MyString mystr=std_string_variable;
mystr.XXX();
これってかなーりムダだよな。
0890デフォルトの名無しさん
NGNGちっとも解りやすくないぞ。何が言いたいんだ?
アップキャスト後に追加メソッドを使うコンテキストでへ来ちまったら
ダウンキャストが必要になるのはどんな作りのクラスでも一緒やん。
継承を全面否定したいのなら、同意はしないが理解はできる。
0891デフォルトの名無しさん
NGNG馬鹿はスルーしろよ
0892デフォルトの名無しさん
NGNGvirtual じゃないんじゃね?
>>889はJava厨の釣りと見た。
0893デフォルトの名無しさん
NGNG0894デフォルトの名無しさん
NGNG0895デフォルトの名無しさん
NGNG↑
メソッド追加するだけなのにpublic継承してる所が釣り
0896デフォルトの名無しさん
NGNG機能追加つーたら継承そのものやんけ
なんで「異常」な手段に拘るんだよ
0897デフォルトの名無しさん
NGNG0898デフォルトの名無しさん
NGNG0899デフォルトの名無しさん
NGNG0900900ズサーーー!!!
NGNG∩___∩ |
| ノ\ ヽ |
/ ●゛ ● | |
| ∪ ( _●_) ミ j
彡、 |∪| | >>899
/ ∩ノ ⊃ ヽ
( \ / _ノ | |
.\ “ /__| |
\ /___ /
0901デフォルトの名無しさん
NGNG0902デフォルトの名無しさん
NGNG0903889
NGNGよし、じゃあXXXとか言わずにuppercaseで書いたるか。
struct MyString : public std::string{
void uppercase();
};
ほれ、出来た。これでMyStringの大文字化はラクショーさ。
ああだけど、std::stringを使ってる部分もあるんだった。
これも大文字化しないといけない。
継承で機能追加
MyString mystr=std_string_variable;
mystr.uppercase();
std_string_variable=mystr;
外部関数で機能追加
uppercase(std_string_variable);
これでどうやろう?
基本的に継承は仮想関数のオーバーライドのためか
protectedなメンバに触りたい時くらいにしか使うべきではない。
0904デフォルトの名無しさん
NGNG>MyString mystr=std_string_variable;
おまえ追加機能つかうちゅーてる時に予めアップキャストしとくんかい
アフォ言いな、比べ方の条件がちゃうやないけ!
0905デフォルトの名無しさん
NGNGJava厨っぽいな
継承悪
コンポジットサイコーみたいな
思考停止したデザパタ厨
0906889
NGNG?
じゃあstd_string_variableを大文字化するにはあんたならどうするん?
てかさっきから気になってたんやけど、アップキャストなんてしとらへんよ
アップやないし、そもそもキャストでもない
>>905
オレのことじゃないよな。俺は外部関数使えいうとるし
0907889
NGNGstd::stringを継承して、そのサブクラスにメンバ関数追加するのが一番だと思ってるんか?
0908デフォルトの名無しさん
NGNGああ、確かにstd_string_variableの定義を隠したままだねw
0909デフォルトの名無しさん
NGNG同じことじゃん、所詮はthisの渡し方
色んな書き方ができる中で今回はどれって選ぶだけ
0910889
NGNG定義?
std::string std_string_variable;
これでいいのか?
>>909
いやいや同じじゃないよ。
継承メンバ関数追加バージョンのuppercaseはstd::stringに対しては使えないんだよ。
継承メンバ関数追加を他の2、3人の奴がやってみ
A君は大文字化を追加したUppercaseStringを作った
B君は最後の文字を取り除く機能を追加したChopStringを作った
C君はその文字列をurlエンコードする機能を追加したURLEncoderStringを作った
じゃあ、大文字化の機能と最後の文字を取り除く機能とurlエンコードする機能全部を使いたいとき
一体どれを使ったらいいんだい?
外部関数でその機能を作ればこんなアホな自体にならないと思うけど。
0911デフォルトの名無しさん
NGNG>これでいいのか?
ああ、それでいい。
派生クラスで protected にアクセスできなくなるのと
同根の仮定を勝手に持ち込もうとしていることが判ったからな
また3人て新たな仮定を追加するのかよ、いい加減にしろや
色んな書き方ができる中で今回は継承を選ばないって場合の例ばかり持ち出しては
継承そのものを否定しようとする態度はよくわかった
0912デフォルトの名無しさん
NGNG3人でよけりゃ仮想継承って手もあるなw
0913デフォルトの名無しさん
NGNGだから880には噛み付いてない
さっきも言ったがあんた自分の態度に思い当たるフシあるんじゃないの?
0914889
NGNG>継承そのものを否定しようとする態度はよくわかった
あれ?継承そのものを否定なんてしてないけど?
というか、オレは継承しまくり人間だよ。
実装継承もよくするしね。template<class T> class A : public T とかもしまくり。
ただ今回のケース、(>>854ね
は継承してメンバ関数追加 (>>858ね
は愚の骨頂やん?
だからいってるんやけど?なんか気に障った?
ヘタな説明にイラついたんやとしたらあやまるわ。ゴメン。
0915デフォルトの名無しさん
NGNG0916デフォルトの名無しさん
NGNGあんたのキャラクタか
0917889
NGNGじゃあなんでオレに噛み付いたんだよ。
>さっきも言ったがあんた自分の態度に思い当たるフシあるんじゃないの?
聞いてないし、フシも無い。
>>916
はは、関西弁なんて知らんからな。酷く疲れたぜ。
0918デフォルトの名無しさん
NGNG0919デフォルトの名無しさん
NGNG890 が ToLowerCase, ToUpperCase を追加した MyStringUL を作った。
俺が EUC, SJIS の相互変換できる MyStringES を作った。
で、両方の機能が使いたくなったらどうする? 気がつくと似て非なる
互換性のない文字列型がたくさん出来てることになりかねんぞ。
ねじ・くぎのような「部品」として使うクラス、プログラミング言語 C++ で
言うところの具象クラスは、可能な限り安易な仕様を早期に固めて、
安易な拡張はしない方が良い。まして継承は最悪の選択肢の一つだ。
0920デフォルトの名無しさん
NGNGvirtual で多重継承して、C++の繊細さを堪能するというのもアリだと思うぞ。
堪能ってのは、実質デバッグの堪能だけどな。
ま、無理ではない。
0921デフォルトの名無しさん
NGNGiterator使ったgeneric function書く。> toupper
0922デフォルトの名無しさん
NGNGすでに MyStringUL 使って書かれてるコードが大量にあったら、MyStringES に
クロスキャストするの? それは死にそうだ。
0923デフォルトの名無しさん
NGNG890 が ToLowerCase, ToUpperCase を追加した MyString を作った。
俺が EUC, SJIS の相互変換できる機能を、 MyString に追加した。
となるわな。インフラグループとかが、普通にやってることだ。
0924デフォルトの名無しさん
NGNGフリー関数を作る
どちらかでしか実現できないことなら仕方ないが、どっちでも実現できて
一方にはかなり痛いデメリットがある場合には、選択肢は自ずと決まると
思うんだが。
0925デフォルトの名無しさん
NGNG機能追加はなんでもかんでも継承だ、という安直な考えを持った、
オブジェクト指向習い始めて3日目くらいの奴がそのグループに多いとやっちゃうわな。
だけどそんなフツウを、世の中のフツウと勘違いしたらダメだ。
0926デフォルトの名無しさん
NGNGとりあえずやってみたらって言うのをずいぶん調子に乗って拡大解釈してるな、おまえ
選択以前のことを言ってるところへあーしろこーしろと思考まで代行してくれなくていいんだよ
それとも最後まで代行をやり通す責任感があって言ってるのか?
人が自分で物事を考えるときに金切り声で騒ぎ立てるのがただうるせえんだよ
物作ってるより人に暴言吐いてる方が楽しい奴が何か憶えたのを使いたくてこっち来たのか?
0927デフォルトの名無しさん
NGNG何切れてんだお前?
責任とって欲しいならそもそも2chに来るなよ。
0928デフォルトの名無しさん
NGNG文字列操作系のグローバル関数満載かよ。
どんなプロジェクトだよ(w)
0929デフォルトの名無しさん
NGNG0930デフォルトの名無しさん
NGNG0931デフォルトの名無しさん
NGNG0932デフォルトの名無しさん
NGNGclass A { ... };
class B { ... };
class C : public A, public B { ... };
A, B, C全て仮想デストラクタを持っている
C* pc = new C;
B* pb = pc;
delete pb;
デストラクタは正しく呼ばれるが、pbのアドレス(pc != pbは確認済み)でメモリが解放されておかしくなる
と思ったのですが、operator newとdeleteをオーバーライドしてトレースしてみたところ
operator deleteではpcのアドレスが来ました。
delete pb;ではpbが指すのがCのオブジェクトなのかBのオブジェクトなのか区別できないはずなのに
どうしてpcのアドレスが求めることができたのでしょうか?
0933デフォルトの名無しさん
NGNG反論できないと荒しかよ(ゲラ
0934デフォルトの名無しさん
NGNGExceptional C++ 嫁
0935デフォルトの名無しさん
NGNG浅はかな考えを指摘されたからって逆切れするなよ
>>928
お前の糞プロジェクトを中心にものごとを考えるなよ。
0936デフォルトの名無しさん
NGNG0937デフォルトの名無しさん
NGNG浅はかかどうかをお前が決めてやらなくていいんだよ
自分の設計に同意を求めたくて余裕なくしてるのはお前だろ
0938デフォルトの名無しさん
NGNG0939デフォルトの名無しさん
NGNGMSVCの例だが。
ttp://www.microsoft.com/japan/msdn/vs_previous/visualc/techmat/feature/jangrayhood/
0940デフォルトの名無しさん
NGNG明らかに継承の方が劣ってたじゃん。
>自分の設計に同意を求めたくて余裕なくしてるのはお前だろ
この一文がどっから出てきたのかわからないけど、そっくりそのままお返しします。ノシ
0941デフォルトの名無しさん
NGNG0942デフォルトの名無しさん
NGNG>この一文がどっから出てきたのかわからないけど
じゃ、何を必死になってるんだよ
0943デフォルトの名無しさん
NGNG必死なのはお前だw
なんだよ >>926は
文面が必死すぎ、余裕無さ過ぎ
0944デフォルトの名無しさん
NGNG必死になっているのはあなた一人に見えます。
あなたが「必死だな」と判断したのはどのレスですか?
レス番で教えてください。できれば理由も添えてください。
0945デフォルトの名無しさん
NGNG0946デフォルトの名無しさん
NGNG0947デフォルトの名無しさん
NGNG0948デフォルトの名無しさん
NGNG工数が増えたりするのはアフォらしいってのは、
みんな賛成してくれるだろ?な?駄目?
0949デフォルトの名無しさん
NGNG0951デフォルトの名無しさん
NGNGむしろ泥臭い。
最適解なら泥臭くても使う。
それは継承でもグローバル関数でも変わらない。
0952デフォルトの名無しさん
NGNGSTL はコンテナ系も便利だが <algorithm> も便利だよ。
0953デフォルトの名無しさん
NGNGclass MyConstants
{
static const std::string TEST_TEST1;
static const std::string TEST_TEST2;
static const std::string TEST_TEST3;
}
こういうクラスから継承するときはどうするのが普通なの?
private virtualあたり?
class MyTest : public MyTestAbstract, private virtual MyConstants
{
}
教えてね♪
0954デフォルトの名無しさん
NGNGポリシークラスでググる。
0955デフォルトの名無しさん
NGNGC++でいうところのclassの継承は
似てるようで全然違うよ。
手段と目的を履き違えないようにね☆
0956デフォルトの名無しさん
NGNG何が違うの?
C++のクラスはOOPLのクラスと同じように扱う事もできるのに。
0957デフォルトの名無しさん
NGNGJava厨はスルーしろ
0958デフォルトの名無しさん
NGNG扱うこと「も」できるのに。
この「も」が重要。
0959デフォルトの名無しさん
NGNG~~~~~
0960デフォルトの名無しさん
NGNG違いはせいぜいスタックに生成できる事と、デストラクタの存在くらいなもんだ。
0961デフォルトの名無しさん
NGNG>手段と目的を履き違えないようにね☆
無粋なやっちゃな、そこを敢えて履き違えるのが粋ってもんだろ?
0962デフォルトの名無しさん
NGNG0963デフォルトの名無しさん
NGNGえーそれだと学生みたいでヤだ
0964デフォルトの名無しさん
NGNGプロが敢えて履き違えるのが興
0965デフォルトの名無しさん
NGNG上司がPGあがりのPMだったら、厨房扱いされて査定に響く怖れアリ。
0966デフォルトの名無しさん
NGNGclass C{ ... };
を、T を省略して
template <typename>
class C{...};
と書く事って認められてます?
テンプレートパラメータに template 入れるときに省略したいんだけど…
0967デフォルトの名無しさん
NGNGこんなの?
template <typename T, template <typename> class U>
struct Hoge {
};
0968デフォルトの名無しさん
NGNGそうです
0969デフォルトの名無しさん
NGNG文法上は問題ない。
0970マイク ◆yrBrqfF1Ew
NGNG何が全然違うんだ?
0971953
NGNG質問した者ですが……
すいません、>>954さんの言われたとおり
「ポリシークラス」でぐぐったのですが、
関係しそうなのは見つけられませんでした。
もう少しだけ詳しく教えて頂けませんか?
0972デフォルトの名無しさん
NGNG0973953
NGNGそ、そうですか。。。
定数だけ宣言・定義しているクラスを他のクラスに
継承させる場合、どういう風にするのが正しいのか
知りたいのです。
Javaではこういう場合 implements を使いますが、
C++ ではどうすればいいのかはっきりと分かりません。
private virtual でも動いてはいるのですが、(>>953)
きちんとした裏付けがあれば、、、と思ったわけです。
0974デフォルトの名無しさん
NGNGそもそもそんなクラスは作らないのが普通。
0975デフォルトの名無しさん
NGNGわざわざそんなクラスを使う場合には、定数を付け替える意図アリと見て、ポリシークラスとしてパラメータ化して
<template class T> class MyTest : public MyTestAbstract, T { ... };
などして、使う側では MyTest< JPY_YeildRate > とか MyTest< USD_YeildRate > するんデネーノ。
という気がします。
private 継承、 public 継承は別に適切な方を使えばヨシ。
0976デフォルトの名無しさん
NGNGprivate継承、virtual継承の仕様を知らずに使ってるの?
仕様さえ知ってればそれで裏付けになるんじゃないの?
0977953
NGNG普通はこういうクラスは作らないものなんですか。。。
せっかくなので今の状況を説明しておきます。
あくまでイメージとして見てください。
class MainManager {
void registFoo(Foo & foo) {
_fooByFooNameTable.put(foo.getClassName(), foo);
_fooByTypeNameTable.put(foo.getTypeName(), foo);
_fooByBarNameTable.put(foo.getBarClassName(), foo); }
Array<Hashtable> enumerate(type); // 外部API
Hashtable getvalue(type, hashtable); // 外部API };
class Foo {
enumerateBarList();
createBar(Hashtable);
getClassName();
getTypeName();
getBarClassName(); };
class Bar {
toHashTable();
getClassName(); };
FooAbstract : public virtual Foo;
BarAbstract : public virtual Bar;
MyFoo : public FooAbstract;
MyBar : public BarAbstract;
YourFoo, YourBar, HisFoo, HisBar, HerFoo, HerBar, ...
と、こんな具合のクラス群があります。(続く)
0978953
NGNG--(uses)--> Foo --(creates/uses)--> Bar
外部からMainManagerが呼び出されると、対応するFooが呼ばれます。
MainManager::enumerate(type) -> Foo::enumerateBarList()
MainManager::getvalue(type, hashtable) -> Foo::createBar(hashtable)
Fooの側ではenumerateBarList()でvalueをどっかから
取り出してきて一つ以上のBarを作成するか、
createBar(Hashtable)で既存のhash tableから
一部を読み出してそれを元にBarを作成します。
で、Barの側ではtoHashTable()を呼ばれると
自分を元にhash tableを作ります。
Barは内部的にはさまざまなところで使われます。
内部的にはもっぱらBarのインスタンスをやりとりしますが、
外部のAPIのからみがあってhash tableの操作は必要です。
で、この場合 KEY_NAME_A, KEY_NAME_B とかの定数を
両方のクラスで共有しないとすると、たとえばBarクラスで
定義して、Fooクラスで使うときにはBar::*としなければ
いけなくなってしまいます。
0979953
NGNGhash tableで登録されていて、Fooのクラス名、Barのクラス名、
あるいは外部APIのtype名で呼び出せるようになっています。
(ここでクラス名は単に識別名の役目)。
そのためにFooでは自分のクラス名、Barのクラス名、type名を
定数として持っておきたいんですが、同時にBarでも自分自身の
クラス名(識別名)は知っておきたいのです。
この場合やはり両方のクラスで同じ定数を共有したいと思います。
さらにさらに、実はFoo、BarのほかにBazクラスなども出てきそうです。
となると、やはりMyConstans, HisConstants等があったほうが
便利だと思うのです。
さらにさらにさらに、My*, Your*, His*, Her* クラスたちの大枠を
XMLファイルから自動生成するCode Generatorを作って、
includeを活用して人力の部分を少なくしようという計画も進行中です。
なので (機械化を楽にするためにも) 多少クラスは増えても
各々がシンプルになればと思っています。
定数を共有するためにもっといい方法があればご教示ください。
>>975さんの「ポリシークラス」は、当てはまる部分では役立ちそうな
情報だと思いましたが、今回のケースではそこまでする必要もなさそうです。。
0980デフォルトの名無しさん
NGNG実行してみると、コマンドプロンプトが一瞬表示されて
直ぐに終了してまうのですが、こうやれば
#include <stdio.h>
main() {
printf("Hello!");
rewind(stdin); //追加行:標準入力を初期化する
getchar(); //追加行:一文字入力を待つ
return 0;
}
一文字打つまで終了しないらしいのですが、一瞬で終了してしまいます。
何故なのでしょうか?何処か違っていたら訂正お願い致します。
0981953
NGNG書いちゃってますけど、あくまでイメージということで。。。
0982デフォルトの名無しさん
NGNG#include <stdio.h>
main() {
printf("Hello!");
rewind(stdin); //追加行:標準入力を初期化する
getchar(); //追加行:一文字入力を待つ
return 0;
}
0983デフォルトの名無しさん
NGNGrewind(stdin); が禿しく実装依存。標準ではファイルポインタを戻せない
コンソール入力に対しては未定義動作。ファイルにリダイレクトされて
いればいいが。
取り除いてやってみろ。それからC++ではなくCスレに行った方が幸せになれる。
0984デフォルトの名無しさん
NGNG0985デフォルトの名無しさん
NGNG何の因果か知らないけども、あまり正気の沙汰とは思えない状態だな。
定数を共有するいい方法があったとしても、その混沌ぶりの前では焼け石に水と思われ。
結局定数なんだったらアクセス指定緩くても安全なわけで、
namespace My/Yout/His/Her とかに定義してしまえば終了な気もする。
0986953
NGNGだからあくまでイメージなのです。。。
書いてあるのはほとんどpublicと思ってください。
>>985
そんなに混沌としていますか。。。すごく不安です。
namespaceはなんだか増やしちゃいけない空気です。
YourFooからYourBarの一覧を取り出すのに
HisBarを呼んできたりとかしますから。。
0987デフォルトの名無しさん
NGNG助言ありがとうございました。
Cで訊いてみます詳しくは
0988デフォルトの名無しさん
NGNG0989デフォルトの名無しさん
NGNGそんな空気は無い。
0990デフォルトの名無しさん
NGNG>そんな空気は無い。
あるよ。
namespaceとヘッダファイル・クラスを混同してしまう人がいる。
namespaceは少ないに越した事はない。
悪意を持って他人の仕事の邪魔をしたいなら別だが。
0991デフォルトの名無しさん
NGNG0992デフォルトの名無しさん
NGNGアホかお前?
0993デフォルトの名無しさん
NGNG漏れなら継承を利用して定数を共有するなんて中途半端なことしないで、
virtual void DoSaveLoad(Hashtable h, bool bLoad) {
base::DoSaveLoad(h, bLoad);
if (bLoad) m_ver1 = h["Ver1"]; else h["Ver1"] = m_ver1;
};
に展開される4つのマクロ:
BEGIN_PROPERTY_EXCHANGE
DECLARE_BASE_CLASS(base)
DECLARE_PROPERTY(m_ver1, "Ver1")
END_PROPERTY_EXCHANGE
とか作るけど。3行目のようなのは必要に応じて増やす。
定数を剥き身で使ってちゃミスの元だし。
0994デフォルトの名無しさん
NGNGバグもちゃんととってくれよぉ!!
0995デフォルトの名無しさん
NGNG>あるよ。
無い。
>namespaceとヘッダファイル・クラスを混同してしまう人がいる。
そんな超々低能を基準にバカいってんじゃねぇ。
>悪意を持って他人の仕事の邪魔をしたいなら別だが。
悪意を持って他人の仕事の邪魔をしたくないなら、そんなキチガイ発言は止めろ。
0996デフォルトの名無しさん
NGNGライブラリ作ってる香具師がバカだとglobal namespaceになんでも詰め込みやがるから、
こっちで
namespace UnkoLib
{
#include <library.h>
}
とかやってもうまく動かないし。
0997デフォルトの名無しさん
NGNG強度のロープを提供してます。
0998デフォルトの名無しさん
NGNG0999デフォルトの名無しさん
NGNG1000デフォルトの名無しさん
NGNGその場合ライブラリ作ってる香具師がウンコだよ。
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。