C++相談室 part44
レス数が1000を超えています。これ以上書き込みはできません。
0001v(^・^)v
2005/10/05(水) 20:45:37ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いします。
IDE(VC++など)などの使い方の質問もその開発環境のスレに
お願いします。
前スレ
C++相談室 part43
http://pc8.2ch.net/test/read.cgi/tech/1124113879/
過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0002v(^・^)v
2005/10/05(水) 20:46:092 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
2005/10/05(水) 20:46:5917 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/
0004v(^・^)v
2005/10/05(水) 20:47:4532 http://pc5.2ch.net/test/read.cgi/tech/1088236078/
33 http://pc5.2ch.net/test/read.cgi/tech/1090180012/
34 http://pc5.2ch.net/test/read.cgi/tech/1092018643/
35 http://pc5.2ch.net/test/read.cgi/tech/1093958200/
36 http://pc5.2ch.net/test/read.cgi/tech/1096304546/
37 http://pc5.2ch.net/test/read.cgi/tech/1098543578/
38 http://pc5.2ch.net/test/read.cgi/tech/1101473340/
39 http://pc5.2ch.net/test/read.cgi/tech/1106466303/
39(実質40) http://pc8.2ch.net/test/read.cgi/tech/1106527792/
40(実質41) http://pc8.2ch.net/test/read.cgi/tech/1113408957/
41(実質42) http://pc8.2ch.net/test/read.cgi/tech/1120190961/
0005v(^・^)v
2005/10/05(水) 20:50:08[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://www.open-std.org/jtc1/sc22/wg21
[C/C++ Users Journal]
http://www.cuj.com/
[cppll (ML)]
http://www.trickpalace.net/cppll/ (日本語)
0006v(^・^)v
2005/10/05(水) 20:51:29amazon.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/
0007v(^・^)v
2005/10/05(水) 20:56:17Effective 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/
0008v(^・^)v
2005/10/05(水) 20:58:23[Boost]
Boost http://www.boost.org/
(日本語) http://www.kmonos.net/alang/boost/
(日本語) http://shinh.skr.jp/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
0009v(^・^)v
2005/10/05(水) 20:59:16[他]
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
0010v(^・^)v
2005/10/05(水) 21:00:42【C++】template 統合スレ -- Part6
http://pc8.2ch.net/test/read.cgi/tech/1101384692/
C/C++の宿題を片づけます 51代目
http://pc8.2ch.net/test/read.cgi/tech/1128493272/
C/C++でのWindowsPrograming議論スレ(質問お断り)
http://pc8.2ch.net/test/read.cgi/tech/1049790146/
managed C++ やろうぜ!!
http://pc8.2ch.net/test/read.cgi/tech/1014486422/
ATL/WTL Part3
http://pc8.2ch.net/test/read.cgi/tech/1095442366/
0011デフォルトの名無しさん
2005/10/05(水) 21:03:560012デフォルトの名無しさん
2005/10/05(水) 21:13:48俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
0013デフォルトの名無しさん
2005/10/05(水) 21:14:390014デフォルトの名無しさん
2005/10/05(水) 21:14:53とかいうエラーが出るんだけどこれってどうすればいいの?
0015デフォルトの名無しさん
2005/10/05(水) 21:36:270016デフォルトの名無しさん
2005/10/05(水) 22:13:29それを実現させようとするとDLLでなくDCL(Dynamic Compile Library)になってしまう。
0017デフォルトの名無しさん
2005/10/05(水) 22:28:43opertor<<=
は C++の構文でこれは、どう解釈するればよいでしょうか?
0018デフォルトの名無しさん
2005/10/05(水) 22:40:400019デフォルトの名無しさん
2005/10/05(水) 22:49:01シフト演算は理解できるのですが、
opertor というキーワード(予約語)が気になっています。
特別な意味があるのかと思いますが、よくわかっていません。
0020デフォルトの名無しさん
2005/10/05(水) 23:07:33void operator<<=(T& x,const T& y){x.i+=y.i;}; //operator<<= という名の関数
#include <iostream>
int main(){
T x,y;
x <<= y; // ここで「operator<<= 」と定義した関数をつかっている
std::cout << x.i << std::endl;
return 0;
}
0021デフォルトの名無しさん
2005/10/05(水) 23:14:03誤記でした。opertor(誤) operator(正)
演算子ではないのですね。
関数を定義しているという理解でよいでしょうか?
頭が固くてもうしわけありません。
0022デフォルトの名無しさん
2005/10/05(水) 23:22:10要するに関数であってると思う。
0023デフォルトの名無しさん
2005/10/05(水) 23:25:06初心者がコードを読むにはまだまだ、知識が必要。
C++言語はむずかしいことを実感。挫折中です。
0024デフォルトの名無しさん
2005/10/05(水) 23:59:24#include <stdafx.h>
あと死ね。
0025デフォルトの名無しさん
2005/10/06(木) 00:00:05言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0026デフォルトの名無しさん
2005/10/06(木) 00:50:08構文上はそうなんだけど、実際には演算子を定義していると思え。
0027デフォルトの名無しさん
2005/10/06(木) 03:35:22一度、サンプルソースをいじろうと思って触ってみたのですが、
フォームに表示する文字のフォントサイズをどうやって帰ればよいのかも判らずそのままになってしまいました。
今度こそしっかりと覚えたいので、よろしくご紹介ください。
よろしければ、フォームに表示する文字(テキスト)のフォントサイズを変える方法もお願いします。
0028デフォルトの名無しさん
2005/10/06(木) 08:26:54C++ Primer (3rd Edition)
Effective C++
More Effective C++
Exceptional C++
More Exceptional C++
ちょwどれもさっぱりなんだが
もう一個下なのはありませんか?
0029デフォルトの名無しさん
2005/10/06(木) 09:00:33Accelerated C++ はどう?
>>27
スレ違い。
0030デフォルトの名無しさん
2005/10/06(木) 09:33:05サンクス!
初心者++スマソw
0031デフォルトの名無しさん
2005/10/06(木) 23:24:08ご支援ありがとうございました。
一般的にコンパイル時の警告メッセージの定義はあるでしょうか?
無視してはいけないものと思えばよいでしょうか。
0032デフォルトの名無しさん
2005/10/07(金) 00:14:18警告は、そのうちエラーになる前兆だと思うといい。
警告が全く出ないようにするのも一つの楽しみ。
0033デフォルトの名無しさん
2005/10/07(金) 00:15:22楽しみじゃなくて常識って言ってくれるかな
0034デフォルトの名無しさん
2005/10/07(金) 00:22:10fstream::get()
などの方法で、ファイルから16ビットの文字、
ひらがなやカタカナなどを直接取得して認識する事は
出来るのでしょうか…?
それともバイナリで処理していかないとダメなのでしょうか?
0035デフォルトの名無しさん
2005/10/07(金) 00:46:35char std::fstream::get()だから、環境依存。
wcahr_t std::wfstream::wget()ってのはあったっけ。あればこちらを使うとよい。
今規格書見たけど無かった。
0036デフォルトの名無しさん
2005/10/07(金) 00:47:12○wchar_t
普段使わないとtypoするなorz
0037デフォルトの名無しさん
2005/10/07(金) 00:47:300038デフォルトの名無しさん
2005/10/07(金) 00:49:10なにか、ソースをコンピュータに評価されている気分になる
0039デフォルトの名無しさん
2005/10/07(金) 01:02:220040デフォルトの名無しさん
2005/10/07(金) 01:08:210041デフォルトの名無しさん
2005/10/07(金) 01:10:400043デフォルトの名無しさん
2005/10/07(金) 01:52:04典型的優等生。窓組にしか顔が利かない社交性の低さはご愛嬌。
今ならタダで付き合ってあげちゃうYO!
VC家次女タン - っていうかお前居たっけ?
VC家3女タン - 難しい問題どころか標準的な問題でも解けずにすぐに泣き出してしまう
ダメな子。でもダメな子ほど可愛い。
GCCタン - 家庭は貧乏だけれども地道な努力を積み重ね安定した実力を築き上げた
努力の子。窓組からペンギン組まで顔の広さも天下一品。
ただ、解かなくてよい問題まで解いてしまういらんことしいな部分も。
ICCタン - 最先端の問題も難なくこなし、解答の内容も一線級。
お高くとまった高飛車なイメージと、差別的な発言が見られるという噂を
どうするかが今後の人気を左右する?
DMCタン - 母国語で出される問題が難しくて嫌だと勝手に自分専用のコトバを
作っちゃった子。その熱意があるなら母国語をもうちょっと頑張りましょう。
BCCタン - っていうかお前超頑張れ。
0044デフォルトの名無しさん
2005/10/07(金) 02:30:490045デフォルトの名無しさん
2005/10/07(金) 02:44:26MCWタン - 標準的な問題はそれなりにこなし、顔もそれなりに広かった。
昔はリンゴ組に人気だったけど、今は身売りされてどうなる事やら。
ゲームは今でも得意。
0046デフォルトの名無しさん
2005/10/07(金) 03:32:40BOOL bOK = InternetReadFile(hFile,myDataBuffer,(DWORD)(size),&dwSize);
ただヤフーのページのため,EUC-JPでエンコードしないと文字化けします
C#では以下のクラスがありますが,C++ではどのようにしてエンコードするのでしょうか?
//C#の場合
Encoding.GetEncoding("EUC-JP").GetString(myDataBuffer);
0047デフォルトの名無しさん
2005/10/07(金) 03:42:11自前。ということで環境依存。以下のスレへ。
【初心者歓迎】C/C++室 Ver.21【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1125743714/
0048デフォルトの名無しさん
2005/10/07(金) 10:07:28ありがとうございます
逝ってきます!
0049デフォルトの名無しさん
2005/10/07(金) 10:34:25public:
Base() { }
virtual void func()=0;
};
class Derived : public Base {
public:
Derived() { doSomething(); }
void func() {}
void doSomething() {}
};
Baseから派生するクラスは全て、
コンストラクタでdoSomethingを実行した後に
派生クラス側のfuncを実行させたいのですが……
私の今の知識では「基本クラスに派生クラスの関数を実行させる」ことは出来ないと認識していますが、
なんとか実行するトリックはないでしょうか。
お願いします。
0050デフォルトの名無しさん
2005/10/07(金) 10:48:15基底クラス“のコンストラクタ”に派生クラスの関数を実行させることができないだけ。
0051デフォルトの名無しさん
2005/10/07(金) 10:56:52なるほど、了解しました。
それは理解したのですが、相変わらずコンストラクタからは実行できずorz
特に「派生クラスのコンストラクタが終了した後に」virtualである関数を実行したいので、
コンストラクタの実行順(基底クラスが先)が壁になっています……
0052デフォルトの名無しさん
2005/10/07(金) 11:57:480053デフォルトの名無しさん
2005/10/07(金) 12:28:52struct base {
base() {}
virtual void func() = 0;
virtual void doSomething() = 0;
void func_wrapper() { doSomething(); func(); }
};
struct derived : public base {
derived() {}
void func() {}
void doSomething() {}
};
derived d;
d.func_wrapper();
0054デフォルトの名無しさん
2005/10/07(金) 21:15:40それでもいいのですが……
・コンストラクト時にdoSomething, funcが完了している保証が必要
・doSomethingはfuncより先に行われる
・doSomethingはDerivedのメンバに依存する
・funcは独立していなければならない(後で別に呼ぶ可能性がある)
……Derivedの作成者に「コンストラクタの最後に必ずfuncを呼ぶ」というルールを強制するしかないのか……
守られるとは限らない訳だが……orz
0055デフォルトの名無しさん
2005/10/07(金) 21:30:06class Base {
protected:
Base() {}
public:
template <class T>
static T *create() {
Base *p = new T;
p->doSomething();
p->func();
}
virtual void doSomething() =0;
virtual void func() =0;
};
struct Derived : public Base {
void doSomething() {}
void func() {}
};
Base *obj = Base::create<Derived>();
・・・汚いな(;´Д`) スマソ
005655
2005/10/07(金) 21:31:34無視してけれ(´・ω・`)
0057デフォルトの名無しさん
2005/10/07(金) 23:48:21もはやDerivedとBaseが継承関係に無いけど、
class DerivedBase {
protected:
Base *owner_;
public:
DerivedBase() : owner_(NULL) {}
virtual ~DerivedBase(){}
void setOwner(Base *o){ owner_ = o;}
virtual void func(void) = 0;
virtual void doSomething(void) = 0;
};
class Derived : public DerivedBase {
public:
virtual void func(void) {}
virtual void doSomething(void) {}
};
class Base{
std::auto_ptr<DerivedBase> derived_;
public:
Base(std::auto_ptr<DerivedBase> d) : derived_(d) {
derived_->setOwner(this);
derived_->doSomething();
derived_->func();
}
};
つまり、is aとかhas aとかの関係が変なんじゃないの?と言いたい。
0059デフォルトの名無しさん
2005/10/08(土) 01:16:33char* Log;
Log="123"; //(1)4byte確保
Log="1234567"; //(2)8byte確保
(2)のときに,(1)で確保された4byteはどうなるのでしょうか?
勝手に開放されるのでしょうか?
0060デフォルトの名無しさん
2005/10/08(土) 01:18:060061デフォルトの名無しさん
2005/10/08(土) 01:21:21それなら
for(int i=0;i<100000;i++){
Log="長い文字列";
}
とすると,大量のメモリを消費するということでしょうか?
0062デフォルトの名無しさん
2005/10/08(土) 01:24:090063デフォルトの名無しさん
2005/10/08(土) 01:26:36Log = "なにか";
は、文字列リテラルへのポインタを代入してるだけ。
0064デフォルトの名無しさん
2005/10/08(土) 01:32:32const char* GetMessage()
{
char* Message;
Message="関数の中で確保";
return Message;
}
0065デフォルトの名無しさん
2005/10/08(土) 01:35:31試してみたら,問題なく使えました!
0066デフォルトの名無しさん
2005/10/08(土) 01:36:210067デフォルトの名無しさん
2005/10/08(土) 01:40:210068デフォルトの名無しさん
2005/10/08(土) 01:40:260069デフォルトの名無しさん
2005/10/08(土) 01:42:05int i;
void f(){
int* p;
for(1000){
p = &i;
}
}
0070デフォルトの名無しさん
2005/10/08(土) 01:43:000071デフォルトの名無しさん
2005/10/08(土) 01:47:39コンパイル時にすでにサイズが決まって,実行時のはじめに領域が確保される(=静的)んですね!!
それだとこの場合は無駄なメモリを確保するんですね!
bool bOK=1;
char* Log;
if(bOK) Log="短い文字列"
else Log="超超長い文字列"
0072デフォルトの名無しさん
2005/10/08(土) 01:49:490073デフォルトの名無しさん
2005/10/08(土) 01:52:17ありがとうございます!
ってか,よく細かいつまらないことまでご存知ですね!
これでもC/C++歴5年ですが,,,
0074デフォルトの名無しさん
2005/10/08(土) 01:52:220075デフォルトの名無しさん
2005/10/08(土) 01:57:410076デフォルトの名無しさん
2005/10/08(土) 01:58:23char str[]="hoge";
の違いを勉強する時に一度は目にする内容だけどなぁ。
0077デフォルトの名無しさん
2005/10/08(土) 04:57:580078デフォルトの名無しさん
2005/10/08(土) 05:28:58ちなみにコンパイラはBCC++5.5です。以下のソースでは「クラスメンバーを初期化できない」というエラーになりました。
名前から関数への変換に、テーブルを使わずにif()の連続攻撃なら、コンパイルできますが、あまりに愚かしいので・・・
#include <string.h>
class X{
public:
void FuncA(void);
void FuncB(void);
typedef struct tagNAMETOFUNC{
char* Name;
void (*Func)(void);
} NAMETOFUNC;
NAMETOFUNC NameToFunc[] = {
{"FuncA", FuncA},
{"FuncB", FuncB},
};
void Select(char *Name){
int i;
for (i = 0; i <= 1; i ++){
if (strcmp(Name, NameToFunc[i].Name) == 0){
NameToFunc[i].Func();
return;
}
}
}
};
0079デフォルトの名無しさん
2005/10/08(土) 06:18:230080デフォルトの名無しさん
2005/10/08(土) 06:30:07{
typedef void (X::*FUNCTYPE)();
struct NAMETOFUNC
{
char* funcName;
FUNCTYPE funcPtr;
};
static const NAMETOFUNC funcList[];
void FuncA();
void FuncB();
};
const X::NAMETOFUNC X::funcList[] =
{
"FuncA", &X::FuncA,
"FuncB", &X::FuncB,
};
0081デフォルトの名無しさん
2005/10/08(土) 08:08:48うわっ、これメンバ関数を呼び出す時は
X x;
(x.*x.funcList[i].funcPtr)();
なんて奇っ怪な書き方をしないとだめなのか。x.とx.*が一個ずつ出てくる所が
気持ち悪い。
0082デフォルトの名無しさん
2005/10/08(土) 08:28:59(this->*funcList[i].funcPtr)();
0083デフォルトの名無しさん
2005/10/08(土) 21:08:15アドバイスありがとうございます。
アスペクト指向的なトリックは使えそうかも……
確かにis aないしhas aの関係がおかしいかもしれません……
というより過度の一般化を試みていると言った方がいいかも。
もう一度その辺りを見直してみて、身の丈にあった設計を考えてみます。
0084デフォルトの名無しさん
2005/10/09(日) 01:45:19int number = 84;
ofstrm.write( (const char*)&number, 4 );
を
ofstrm.write( (const char*)84, 4 );
として読みやすくしたいなと
0085デフォルトの名無しさん
2005/10/09(日) 02:57:05禿げしく遅いけど。boost::format当たりに何かいいのがあると思う。
#include <iostream>
#include <fstream>
class Binary {
int x, y;
public:
Binary(int i = 0, int j = 0) : x(i), y(j) {}
int getx() const { return x; }
int gety() const { return y; }
};
std::ostream& operator<<(std::ostream& os, const Binary& bin)
{
const int x = bin.getx();
for (int i = 0; i < bin.gety(); i++)
if (!os.put(reinterpret_cast<const char*>(&x)[i]))
return os;
return os;
}
int main()
{
std::ofstream test("test.bin", std::ios::out | std::ios::binary);
test << Binary(84, 4);
}
0086デフォルトの名無しさん
2005/10/09(日) 03:03:51第一に環境依存。
第二に4バイトintでlittle endian(x86等)だと3バイト以下が変。バグあり。
第二の方はfor文の中身をいじれば直る。
for (int i = bin.gety() - 1; i <= 4; i++)
それから i = 0の時はエラーを返さないとだめだね。
0087デフォルトの名無しさん
2005/10/09(日) 03:04:33だめだ寝ぼけてる。スマン。
0088デフォルトの名無しさん
2005/10/09(日) 03:14:17自己レス。little endianでなら
std::ostream& operator<<(std::ostream& os, const Binary& bin)
{
const int x = bin.getx(), y = bin.gety();
if (y == 0)
return os;
for (int i = 0; i < y; i++)
if (!os.put(reinterpret_cast<const char*>(&x)[i]))
return os;
return os;
}
big endianなら
if (y == 0)
return os;
else
for (int i = y - 1; i < 4; i++)
かな。うーん汚い。
0089デフォルトの名無しさん
2005/10/09(日) 03:25:10write(fd, &number, sizeof(number))
0090デフォルトの名無しさん
2005/10/09(日) 03:30:11FILE* 使ってもいいならそれでいいんだが・・・・
多分ストリームを使いたいんじゃないかと。
0091デフォルトの名無しさん
2005/10/09(日) 03:31:28もうだめだ寝る。
0092デフォルトの名無しさん
2005/10/09(日) 08:21:34というわけで、具体的に何をしたいのか書かないと有効な回答が得られないのです。
0093デフォルトの名無しさん
2005/10/09(日) 08:35:31お前がやりたいことはofstrm << '\x54';で十分のような。
0094デフォルトの名無しさん
2005/10/09(日) 21:01:38{
int i = 1;
int j;
a[1] = f[1];
while( i < 10 ){
for( j = 2; j <= n; j++ ){
a[j] = f[j] - a[j-1] * i;
}
if( -1 < a[n] && a[n] < 1 ){
break;
}
else{
i*= -1;
if( 0 < i ){
i++;
}
}
}
return i;
}
組み立て除法で割り切れる数値を探すプログラムなのですが、
if( -1 < a[n] && a[n] < 1 )
の判定が上手く出来ません。
勿論
if( a[n] == 0 )
も検証してみました。
判定の直前で a[n] の値を出力すると0と出てくるので原因が分かりません。
どなたか助けてください。
0095デフォルトの名無しさん
2005/10/09(日) 21:55:220096デフォルトの名無しさん
2005/10/09(日) 22:23:47x=iで考えて
while( i < 10 ){
for( j = 2; j <= n; j++ ){
a[j] = f[j] + a[j-1] * i;
}
if( -1 < a[n] && a[n] < 1 ){
break;
}
i++;
}
0098デフォルトの名無しさん
2005/10/10(月) 01:02:29constなメンバ変数を持つクラスを自作したわけなんですが、
operator=が必要になりました。デフォルトで済まそうとすると、
constには代入できねえよボユゲと言われてしまいます。
こいつを代入できるようにするにはどうすればいいでしょうか。
0099デフォルトの名無しさん
2005/10/10(月) 01:03:31operator=を書く
0100デフォルトの名無しさん
2005/10/10(月) 01:15:190101デフォルトの名無しさん
2005/10/10(月) 01:15:43コンストラクタ・コピーコンストラクタはconstやリファレンスにも代入できるだろ。
それを利用してoperator=を書く。
0102デフォルトの名無しさん
2005/10/10(月) 01:18:34代入ではなくて、初期化リストに書く。
010398
2005/10/10(月) 01:20:27レスありがとうございます。
>それを利用してoperator=を書く
な、なるほど!コピーコンストラクタなら既につくっとります!
これでなんとかやってみます!
どうやるのか全然想像つきませんが!
0104デフォルトの名無しさん
2005/10/10(月) 01:24:38const_cast
0105デフォルトの名無しさん
2005/10/10(月) 01:25:01いいじゃないか。
0106デフォルトの名無しさん
2005/10/10(月) 01:29:18代入演算子を定義するのが根本的に設計が間違ってる気がする。
0107デフォルトの名無しさん
2005/10/10(月) 01:33:25これをすると新旧インスタンスが2つできることになるけど
この場合どっちを明示的にdeleteするべきなの?
0108デフォルトの名無しさん
2005/10/10(月) 01:33:32このように代入演算子中で一時オブジェクトを作り、*thisに代入する。
#include <iostream>
class A {
const int i; // 例えば
public:
A(int j = 0) : i(j) {}
A(const A& a) : i(a.i) {}
A& operator=(const A& a) {
return *this = A(a.i);
}
};
int main()
{
A a, b;
a = b;
}
010998
2005/10/10(月) 01:33:52頭こんがらがってきましたがなんとかやってみますorz
>>106
はじめはprivate宣言してたんですが
それをvectorに格納しようとするとoperator=が使えないと
できないよなんて言われまして・・・
ポインタを格納すれば早いんですが
なんとか代入演算子を定義できないものかと
0110デフォルトの名無しさん
2005/10/10(月) 01:34:22newはこの場合使うな。メンバにポインタが含まれている時のみ使う。
0111デフォルトの名無しさん
2005/10/10(月) 01:35:37そういう技術的な話じゃなくてさ
0112デフォルトの名無しさん
2005/10/10(月) 01:39:45> A& operator=(const A& a) {
> return *this = A(a.i);
> }
これは自分自身を読んでね?
0113デフォルトの名無しさん
2005/10/10(月) 01:44:54そいつは永久ループに入ります。
やるとすればこういう風にしないと。
#include <iostream>
#include <new>
class A {
const int i;
public:
A(int j = 0) : i(j) {}
A(const A& a) : i(a.i) {}
A& operator=(const A& a) {
new (this) A(a.i);
return *this;
}
void printi() const {
std::cout << "i = " << i << std::endl;
}
};
int main()
{
A a(123), b;
b = a;
a.printi();
b.printi();
}
0114デフォルトの名無しさん
2005/10/10(月) 01:49:13new(this)の前にデストラクタ呼びましょうよ
0115デフォルトの名無しさん
2005/10/10(月) 01:49:46しかしそれはいろいろ危険性が
0116デフォルトの名無しさん
2005/10/10(月) 01:51:26デストラクタも呼ぶなら自分自身が引数のときに代入をスキップするのも忘れるなよ。
0117デフォルトの名無しさん
2005/10/10(月) 01:54:27完璧なoperator=をコピーコンストラクタ使って書くと結局どう書くのが正解?
0118デフォルトの名無しさん
2005/10/10(月) 01:56:04具体的にどういう設計かは書いてないからこれ以上は指摘しようがない
>117
例外を送出しない swap を実装しているとして
A tmp(a);
tmp.swap(*this);
return *this;
っていうか基本
0119デフォルトの名無しさん
2005/10/10(月) 01:58:22あー、ちなみにこれは const メンバがない場合の話ね。
const メンバがあるクラスの代入については 118 の最初に書いたとおり
0120デフォルトの名無しさん
2005/10/10(月) 02:01:10C++トリビア1と呼ぶか。まあ>>118さんのおっしゃっておられる
ように、constメンバは基本的に初期化しかできないので、
設計に難があるという事になるな。
0121デフォルトの名無しさん
2005/10/10(月) 02:02:33new使うならこんな感じかな。
thisとaが同じインスタンスで、
さらにaがAを多重継承していて且つ、
thisとaでそれぞれ参照しているAが違う場合を考えると不正解だけど。
まぁ、そこまで神経質にならなくてもいいかな。
A& operator=(const A& a) {
if(this != &a){
this->~A();
new (this) A(a);
}
return *this;
}
0122121
2005/10/10(月) 02:03:530123121
2005/10/10(月) 02:07:16二回コピーコンストラクタ呼び出すと回避できるね。
A& operator=(const A& a) {
if(this != &a){
A b=a;
this->~A();
new (this) A(b);
}
return *this;
}
012498
2005/10/10(月) 02:07:16感動しますた
しかし自分では全く思い浮かばなかったばかりか
コードを見た後も処理がいまいち理解できません。
まあそれはこれから勉強します。ありがとうございました!
>>118
球を表わすclass Ballが、メンバにpos,vel,accと定数mass,radius,rebound
を持っているという感じでして、代入は初め禁止してまして。
それを複数個保持したいなと。vector<Ball>を使おうかな、と。
そうすると>>109という
0125デフォルトの名無しさん
2005/10/10(月) 02:12:26new (this) A(b);
こういうnewの配置構文初めて見た。ま、確かにコンストラクタから
コンストラクタを呼び出せない(呼び出しても結果が残らない)C++独特の
trickだね。
0126デフォルトの名無しさん
2005/10/10(月) 02:13:33○newの配置構文の使い方
0127デフォルトの名無しさん
2005/10/10(月) 02:13:56ツッコミたいこととか
0128デフォルトの名無しさん
2005/10/10(月) 02:20:58継承云々を抜きにしても、たとえば A のコピーコンストラクタが
例外を送出した場合のことを想像してみてくださいな
>124 については違和感があるけれど言葉がまとまらないなぁ。妥当な気もするけど
誰かヘルプ
0129121
2005/10/10(月) 02:29:14じゃあ、例外を送出しない コピーコンストラクタ を実装しているとして、とかを条件に加えればOK
問題は自分が定義する外に責任転嫁しちまえ。
......ゴメン、例外忘れてたわorz
0130デフォルトの名無しさん
2005/10/10(月) 02:34:040131デフォルトの名無しさん
2005/10/10(月) 02:40:58一つのメンバの定数性がクラスオブジェクト全体の定数性に伝播するような
モデル(それが良いか悪いかはともかくとして)なので、クラスオブジェクト全体を
非定数にしたいなら、メンバは全て非定数として宣言して、クラス内部における定数性は
クラスの実装者が責任を持つしかしようがない、ということなんですかね?
ちょっと強引かなぁ
0132デフォルトの名無しさん
2005/10/10(月) 04:09:14> クラスオブジェクト全体を非定数にしたいなら、メンバは全て非定数
これは普通に考えて必然だろ。
メンバ radius が定数であるなら、 radius が 1 のインスタンスに
radius が 2 のインスタンスを代入すること自体が論理的に不可。
0133デフォルトの名無しさん
2005/10/10(月) 04:23:36ああ確かにそうだな。やっぱり普通にprivateにしてアクセサ書くか。
クラス内の非constメンバの値の管理は自己責任だというのが
正しいC++の考え方だもんな。
0134デフォルトの名無しさん
2005/10/10(月) 08:52:470135デフォルトの名無しさん
2005/10/10(月) 09:08:140136デフォルトの名無しさん
2005/10/10(月) 09:18:390137デフォルトの名無しさん
2005/10/10(月) 10:05:29どうしても煽りに頼った人目の引き方に走ってしまうんだよね。
0138デフォルトの名無しさん
2005/10/10(月) 10:34:560139デフォルトの名無しさん
2005/10/10(月) 10:38:50セックス・フレンド稲枝
0141デフォルトの名無しさん
2005/10/10(月) 11:59:48スフォルツァンドいーなー
0142namahage
2005/10/10(月) 18:07:540143namahage
2005/10/10(月) 20:31:220144デフォルトの名無しさん
2005/10/10(月) 21:22:30どこらへんが C++ の話題なのか説明できるようになってから出直せ。
0145デフォルトの名無しさん
2005/10/10(月) 21:47:530146デフォルトの名無しさん
2005/10/10(月) 22:16:18ヘッダ部分の宣言
class CSearch :
public CFileData
{ public:
CSearch(char *name);
virtual ~CSearch(void);
int result[300];
int skip[256];
void table(char *key);
char *Search(char *text,char *key);
void str_match(char *key);};
0147デフォルトの名無しさん
2005/10/10(月) 22:17:28cpp部分。
#include "StdAfx.h"
#include "Search.h"
CSearch::CSearch(char *name) {
file_koukyou(name);
for(int i=0;i<300;i++){
result[i]=0;} }
CSearch::~CSearch(void) { }
void CSearch::table(char *key){
int k,n; n=(int)strlen(key); for(k=0;k<=255;k++) skip[k]=n;
for(k=0;k<n-1;k++) skip[key[k]]=n-1-k; }
char *CSearch::Search(char *text,char *key) {
// return strstr(text, key);
int m,n; char *p;
m=(int)strlen(text); n=(int)strlen(key); p=text+n-1;
while(p<text+m) {
if(*p==key[n-1]) {
if(strncmp(p-n+1,key,n)==0)//右端だけを比較
return (p-n+1);// }
p=p+skip[*p];//サーチ位置をすすめる。 }
return 0; }
void CSearch::str_match(char *key) { char *p;
table(key); int m=0; int j=0; int num;
while(strcmp(koukyou[m].name,"")!=0) {
p=Search(koukyou[m].name,key);
while(p != NULL) {
printf("%s\n",p); p=Search(p+strlen(key),key); result[j]=m; printf("%d\n",result[j]); j++; } m++; } }
0148デフォルトの名無しさん
2005/10/11(火) 01:42:36enum Bool{TRUE,FALSE};
union T
{
char a;
struct
{
Bool b :1;
Bool c :1;
};
};
でsizeof(T)が4になる理由をおしえてくれ
0149デフォルトの名無しさん
2005/10/11(火) 01:44:130150デフォルトの名無しさん
2005/10/11(火) 01:53:490151デフォルトの名無しさん
2005/10/11(火) 01:56:27どうパディングされたらビットフィールドの値を無視して4になるのかわからんのです。
0152デフォルトの名無しさん
2005/10/11(火) 02:08:37enum Bool が 32bit になる筈だから、sizeof(T) == 4 になる。
0153デフォルトの名無しさん
2005/10/11(火) 02:16:43レスありがとうございました。
0154デフォルトの名無しさん
2005/10/11(火) 02:24:14ビットフィールドがどう配置されるかは処理系依存だけど、
「オブジェクトの型表現のサイズが指定したビットより大きい場合、余ったビットは詰め物として使われる」
とだけあるから、例えば
struct T {
int a:1;
};
sizeof(T) == sizeof(int)
になるし、
struct T{
short a:1;
};
sizeof(T) == sizeof(short)
になることは確か。
でこの場合、Bool b :1;の時点でsizeof(T) >= sizeof(int) (=4)は確定して、あまりのところにcが詰め込まれたんでしょ。
0155デフォルトの名無しさん
2005/10/11(火) 02:25:00上手く動かないことの方が多いんじゃないか
0156デフォルトの名無しさん
2005/10/11(火) 02:28:29と規格で決まってるから大丈夫。
0157デフォルトの名無しさん
2005/10/11(火) 03:27:270158148
2005/10/11(火) 12:48:49struct S2 { T t; };
とすると(ちょっと古いg++ですが)
sizeof(T) == 8
sizeof(S1) == 1
sizeof(S2) == 8
となることが分かりました.
いろいろと腑に落ちない部分がありますが触れてはいけないようなので別の方法を試みることにしました.レスくれた方ありがとうございます.
0159148
2005/10/11(火) 12:53:08sizeof(T) == 4
sizeof(S1) == 1
sizeof(S2) == 4
の間違いです
0160デフォルトの名無しさん
2005/10/11(火) 22:45:10もともと何も問題起きてないと思うんだが、つか、C++/class じゃなくて、
基本的には C言語でのこの種の理解をしてないだけじゃないかしら
0161デフォルトの名無しさん
2005/10/11(火) 23:03:38自分で作ってみたら?
サイズがシステムに最適化されるプリミティブなクラスでも。
0162デフォルトの名無しさん
2005/10/12(水) 02:14:41> 「オブジェクトの型表現のサイズが指定したビットより大きい場合、余ったビットは詰め物として使われる」
これは規格からの引用?どこ?
9.6.1 だとしたら
「指定したビット数がオブジェクトの型表現のサイズより大きい場合」
の間違いじゃない?
sizeof(T) == sizeof(int) になることも
sizeof(T) == sizeof(short) になることも
確かだと言える根拠は無いでしょ?
全部処理系依存。
0163デフォルトの名無しさん
2005/10/12(水) 02:18:00C だと (signed|unsigned) int しか使えなくて、
C++ でその他の整数型と enum が許されるようになったみたいだから、
移植性を気にする人は使わないんだろうね。
0164デフォルトの名無しさん
2005/10/12(水) 03:00:210165デフォルトの名無しさん
2005/10/12(水) 03:59:19S1の T ってただの型宣言になってるぞ。
sizeof(S1) == 1 になって当たり前w
0166デフォルトの名無しさん
2005/10/12(水) 20:45:23どうすればよいのでしょうか?
普通にnew演算子を使って作るのはできるのですが
vectorを使った方が都合が良いです。
例えば
std::vector< std::vector<int> > matrix;
matrix.push_back(std::vector<int>(4));
…
という具合にmatrix[*][4]は作れますよね。
こんな感じで
matrix[*][9][4]のような物を作りたいのですが、
上手くいかなくて困り果てています…
0167デフォルトの名無しさん
2005/10/12(水) 21:09:28{
public:
int getInstance(){ /* なんちゃらかんちゃら */ };
};
int g_N = CSomething::getInstance();
int main()
{
return 0;
}
グローバル変数を↑こういう風に初期化するのって問題ないですか?
0168デフォルトの名無しさん
2005/10/12(水) 21:12:550169167
2005/10/12(水) 21:14:49class CSomething
{
public:
static int getInstance(){ /* なんちゃらかんちゃら */ };
};
0170デフォルトの名無しさん
2005/10/12(水) 21:14:53いいけどその例ではgetInstanceが静的メンバでないとCSomethisng::で修飾してのアクセスはできないよ。
0171デフォルトの名無しさん
2005/10/12(水) 21:30:14グローバル変数を初期化する意義が読み取れない。
だからまあ、設計に関しての常套文句が二つ三つ出てヤメレって言うしかないわけだが。
0172デフォルトの名無しさん
2005/10/12(水) 22:04:08動的な1次元のプロキシクラスを作って、それの配列クラスという形で、
2次元クラスを作るのが常套手段。
0173167
2005/10/12(水) 22:11:05コード・文法的に問題あるとかってことはないぽってことですね。
ありがとうございました。
>171
確かにサンプルコードだけ見ると、何しようとしてるんだって感じですね。
実際にはもう少し意義ある形なので、ここはお目こぼしを[・∀・]
0174デフォルトの名無しさん
2005/10/13(木) 03:10:23{
bzero(&a, sizeof(a));
}
なんで最初の要素しか0にならんのか
暫く気づかなかった
0175デフォルトの名無しさん
2005/10/13(木) 03:39:31うん。がんばろう。
>>174
なんでなん?orz
0176デフォルトの名無しさん
2005/10/13(木) 04:18:15class A { int i; };
std::cout << std::showbase << std::hex << &a << ' ' << std::noshowbase << sizeof(a) << std::endl;
俺の環境では
0x0023ff77 4
どう考えても最低4バイト初期化されるが・・・・・
0177デフォルトの名無しさん
2005/10/13(木) 04:20:07自分で作るのが面倒ならboost::multi_arrayがその目的まんまだから使ってしまえ
0178デフォルトの名無しさん
2005/10/13(木) 04:27:57>174はポインタを渡して配列を初期化するつもりだったんジャマイカ?
0179デフォルトの名無しさん
2005/10/13(木) 04:35:15なんだそういう事か。
0180デフォルトの名無しさん
2005/10/13(木) 05:08:27納得
0181hoge
2005/10/13(木) 13:58:22�AテンプレートってC++にしかないんですか?
0182デフォルトの名無しさん
2005/10/13(木) 14:04:31�@intに0か1を入れてbool代わりに使う という話ならどちらも大差ない
�Aジェネリクスの概念は他の言語にもある
0183デフォルトの名無しさん
2005/10/13(木) 18:35:13でもC++程強力なテンプレートは
0184デフォルトの名無しさん
2005/10/13(木) 18:44:430185181
2005/10/13(木) 18:52:040186デフォルトの名無しさん
2005/10/13(木) 18:58:120187デフォルトの名無しさん
2005/10/13(木) 19:01:11一応有る。Java Genericsでググるといっぱい出てくるよ。
JavaSDK1.5に入る予定だったけど、結局入ったのかどうかは知らない。
たしかC++程の強力さはないけど。
0188デフォルトの名無しさん
2005/10/13(木) 19:19:19Tになにを求められるか−たとえばTは++演算子が使えるインターフェイスでなければならない
ってのがよみとりにくくて不便じゃない?
0189デフォルトの名無しさん
2005/10/13(木) 19:53:04そこでC++ 0xではコンセプトを導入してそういうことをコードに書けるようにしようということになっている。
0190174
2005/10/13(木) 21:54:52int m1;
int m2;
};
A a;
a.m1 = 1;
a.m2 = 2;
foo(a);
cout << a.m1;
cout << a.m2;
ってな感じなわけですよ!!!!
0191デフォルトの名無しさん
2005/10/13(木) 22:46:58class abstract_status
{
};
class status : public abstract_status
{
string name;
map<set<char>,abstract_status*> transition_map;
};
class automaton
{
status *start;
status *accept;
status *current;
list<status*> status_list;
};
ってな感じで進めているのですが、transition_map の set<char>
のところは単なる char にしたほうが良いかどうか。。。
あるいは、全く別の構造にしたほうが良いのか。。。
アドバスお願いします。
0192デフォルトの名無しさん
2005/10/14(金) 01:44:17で、なんで最初の要素しか0にならんの?
0193デフォルトの名無しさん
2005/10/14(金) 01:45:43set<char> にした場合の使い方がわからない。
0194デフォルトの名無しさん
2005/10/14(金) 02:03:450195デフォルトの名無しさん
2005/10/14(金) 02:21:040196デフォルトの名無しさん
2005/10/14(金) 02:40:23おお、本当だ!ありがとう。
0197デフォルトの名無しさん
2005/10/14(金) 07:14:00あーなるほど。
>>192
sizeof(a)
0198デフォルトの名無しさん
2005/10/14(金) 07:30:17なにが「なるほど」なのやら。両方ともゼロになるだろ。
0199デフォルトの名無しさん
2005/10/14(金) 07:35:260200デフォルトの名無しさん
2005/10/14(金) 08:53:30ならない
0201デフォルトの名無しさん
2005/10/14(金) 09:20:31なるよ。
0202デフォルトの名無しさん
2005/10/14(金) 09:25:36それともC++関連だけか?
0203デフォルトの名無しさん
2005/10/14(金) 10:35:270204デフォルトの名無しさん
2005/10/14(金) 14:46:55sizeof(A) ならいいけど sizeof(a) だからダメって言うこと?
コンパイラがバグってるだけじゃない?
0205デフォルトの名無しさん
2005/10/14(金) 15:43:58って話しだべ?
参照はポインタみたいなもんだから。
どっちが正しいか知らんけど、
VC7.1 じゃ 8 だったな。
0206デフォルトの名無しさん
2005/10/14(金) 15:50:25ISO/IEC 14882:1998
5.3.3 sizeof
2. When applied to a reference or a reference type, the result is the size of the referenced type.
8になるのが正しい
0207デフォルトの名無しさん
2005/10/14(金) 21:38:040208デフォルトの名無しさん
2005/10/14(金) 22:54:12void automaton::tick(char input_char)
{
for(i=0; i<(current->second).size(); i++) {
if (((current->second)->first).count(input_char) > 0) {
current = (current->second)->second;
return;
}}}
0209デフォルトの名無しさん
2005/10/14(金) 22:55:510210デフォルトの名無しさん
2005/10/14(金) 23:01:35map<set<char>,abstract_status*>::iterator tmitr = (current->second).begin();
int i;
for(i=0;i<tmitr->size();i++) {
if ((tmitr->first).count(input_char) > 0) {
current = tmitr->second;
return;
}
tmitr++;
}}
0211デフォルトの名無しさん
2005/10/14(金) 23:02:482段に分けて記述しています。
0212デフォルトの名無しさん
2005/10/14(金) 23:24:04{
public:
CVal(int val, char * name)
{
v = val;
}
~CVal()
{
}
operator int ()
{
return v;
}
private:
int v;
char * n;
};
というクラスがあるのですが、このクラスを次のように使うとintにキャストされてうまくいきます。
CVal val(1, "なんか");
if(val == 1){...
しかし次のようにprintf系に渡すとおかしくなってしまうようです。この場合どう扱われてるのでしょう?
CVal val1(1, "foo");
CVal val2(2, "boo");
printf("%d, %d", val1, val2);
↑
最初の1は正しく出るがval2は変な値になる。
0213デフォルトの名無しさん
2005/10/14(金) 23:29:560214デフォルトの名無しさん
2005/10/14(金) 23:34:36printfでは自分でstatic_castすればとりあえず動く。
printf("%d, %d", static_cast<int>(val1), static_cast<int>(val2));
0215デフォルトの名無しさん
2005/10/15(土) 00:01:51ってことはほかの場所でも実はちゃんとintにキャストされずに動いてる可能性もあるわけですね。
ちょっと怖いですね。
0216デフォルトの名無しさん
2005/10/15(土) 00:15:060217デフォルトの名無しさん
2005/10/15(土) 19:47:40これC言語知ってる人がC++の補足として使えるかと思って書いたやつで
基本的に本から抜粋しただけのものですけど、
間違いとか不足してるところとかありませんか?
0218デフォルトの名無しさん
2005/10/15(土) 19:56:50書いた人ですか?
最初のほうを読んで一つ目だけ。
>高度な型 - C++の構造体
>メンバ関数を持つことができる。(実際のプログラミングでは、使わないこと)
括弧部分が大きなお世話。
関数オブジェクトではstructにメンバ関数を書くのが普通だったりする。
0219デフォルトの名無しさん
2005/10/15(土) 20:00:48標準C++ライブラリを使うには必須の機構だし、普通に使うものなので
今C++を語るなら書かないのは片手落ちだろうなあ。
0220デフォルトの名無しさん
2005/10/15(土) 20:32:11よってunsigned char a=b=200;のときunsigned char c = (a+b > 255) : 255 : a+b;と書いても、予期したとおり動く
Cでも同じなのかもしれんけど。
strstreamよりstringstream使うべき
0221デフォルトの名無しさん
2005/10/15(土) 20:44:13ダメすぎ。
総じて、よく判っていないながら実務経験だけはある香具師が、経験則から得たメモを書いているだけ。
書いた香具師のプロファイリングを楽しむにはいいが、参考にはならない。
0222デフォルトの名無しさん
2005/10/15(土) 20:47:14・参照
・メンバ初期設定リスト
・仮想基本クラス
あとこういうの書くときはC++の設計と進化を読んで書いて欲しい。
0223デフォルトの名無しさん
2005/10/15(土) 21:42:50つっこみどころが多すぎてつっこめません・・・
0224デフォルトの名無しさん
2005/10/15(土) 23:32:18wchar_tはCでもtypedefで用意されている。そしてC++では組み込み型になっている。
> 列挙変数を enum キーワードを使わずに宣言できる。Cでは必要だった
構造体と共用体も同じくstructとunionが不要になったことが書かれてない。
>if (x < 100)
> double g = sin(x);
>else
> double g = cos(x);
この後でgが使えないのは、ifとelseの中身はそれぞれブロックが作られているからのはず。
forの構文は正しくはfor (宣言文または式文 式 ; 式 ) 文 となる。
今はprotectedはC++固有ではない。JavaとかC#とかみんなC++由来だけど。
>基底クラスと派生クラスの代入
本文の基底と派生を入れ替えると正しくなるw。
続く
0225デフォルトの名無しさん
2005/10/15(土) 23:36:12<iostream.h>は古い。今は<iostream>。stdiostreamは非標準。
strstreamは標準にはあるが非推奨。<sstream>のistreamstream/ostringstreamがある。
iostream_with_assign類も非標準。
多重定義の解決には5番目に可変個引数 ... もある。
まあ、知らずとも大体想像通りに解決されるとでも書けばいい。
そういう目標でC++の多重定義解決の規則は作られた。
volatileはC由来。
ファイル内スコープの意味でのstaticは非推奨、無名名前空間が推奨されている。
使うべきでない機能として挙げるだけでなく理由も書け。
あと、本文中に1度もオブジェクト指向、ポリモーフィズムと言った言葉が出てこないのが異常。
テンプレート、名前空間、例外が全く出てこないのもどうかと。
しかしこれらを直しても所詮は付け焼き刃、根本的にお前自身がC++をよくわかっていないだろ。
0226デフォルトの名無しさん
2005/10/16(日) 03:30:30C++においてもintに昇格したのち演算が適用される
8行目にして間違っている解説はなかなかないが
それに気づかない人たちのなにやら難しいつっこみはいっそう無視してよい
0227デフォルトの名無しさん
2005/10/16(日) 07:51:170228デフォルトの名無しさん
2005/10/16(日) 09:47:43inlineも説明なしで使われている。
0229デフォルトの名無しさん
2005/10/16(日) 11:47:240230デフォルトの名無しさん
2005/10/16(日) 16:46:280231デフォルトの名無しさん
2005/10/16(日) 16:51:410232デフォルトの名無しさん
2005/10/16(日) 17:25:030233217
2005/10/16(日) 17:35:35オブジェクト指向の設計については省いた、
C++についてできるだけ簡素にまとめられたドキュメントありませんか?
できれば言語仕様とオブジェクト指向設計、STLやらライブラリがからむのは
分けてかかれたものがいいんですけど。
皆さんのバイブルを紹介してもらってもいいですけど。
0234デフォルトの名無しさん
2005/10/16(日) 17:37:04ttp://www.amazon.co.jp/exec/obidos/ASIN/475611895X
0235デフォルトの名無しさん
2005/10/16(日) 17:37:28JAVA使うならJAVAで使えないC++の仕様とか下手に覚えない方が楽ですよね?
0236233
2005/10/16(日) 17:44:00評価高くてよさそうですが、C++はなにもわからないんでやめときます。
> 個人的には、記述内容の間違いを読みながら補正できる
> 「プロ」レベルの人以外は読むべきではないと思います。
> 少なくともこの翻訳された内容を鵜呑みにするのは問題が多すぎると思います。
0237デフォルトの名無しさん
2005/10/16(日) 17:45:340238デフォルトの名無しさん
2005/10/16(日) 17:45:57じゃあ、これでも読んでろ。
ttp://www.webstore.jsa.or.jp/webstore/Com/FlowControl.jsp?lang=jp&bunsyoId=JIS+X+3014%3A2003&dantaiCd=JIS&status=1&pageNo=0
0239デフォルトの名無しさん
2005/10/16(日) 18:00:54>>5
> http://www.kuzbass.ru/docs/isocpp/
0240デフォルトの名無しさん
2005/10/16(日) 18:05:070241デフォルトの名無しさん
2005/10/16(日) 18:35:59えーご�_
>>237
>Cを使っていて何故オブジェクト指向がいるのか?と思われる方向けです。
>他言語使いであれば買っても言い内容です。
>内容に若干古く臭さを感じる初級本と言える。
よさげですね。
ていうか憂鬱な・・・は昔から評価高いか。
C++の設計と進化
http://www.asahi-net.or.jp/~YD8S-HMD/others/bookshelf/bookshelf.htm
これなんかよさそうだな。
0242デフォルトの名無しさん
2005/10/16(日) 18:36:45D&EはC++の基礎をある程度知った上で読まないと意味がないかと
0243デフォルトの名無しさん
2005/10/16(日) 18:37:16それは読み物。
0244デフォルトの名無しさん
2005/10/16(日) 18:54:07これは?
ttp://www.seshop.com/detail.asp?pid=3236
0245233
2005/10/16(日) 22:17:40> C言語を勉強した人向けとなっておりますが、全くその通りです。
なるほど。
これも定番ですがよさそうですね。
0246デフォルトの名無しさん
2005/10/17(月) 12:27:09場合、何かいい方法はありますか?
0247デフォルトの名無しさん
2005/10/17(月) 12:40:120248デフォルトの名無しさん
2005/10/17(月) 14:37:071.0/pow(10, N);より高速に計算する方法はどうすればいいのでしょうか。
0249デフォルトの名無しさん
2005/10/17(月) 14:43:52環境によってやり方は違ってくるだろうなあ
0250248
2005/10/17(月) 16:33:18template <typename T, int N>
struct decimal_place {
static const T type = 1/std::pow(10, static_cast<T>(N));
};
template <> struct decimal_place<float, 1> { static const float type = 0.1f; };
template <> struct decimal_place<double, 1> { static const double type = 0.1; };
template <> struct decimal_place<long double, 1> { static const long double type = 0.1L; };
...(以下20まで)
としておいて、
double X = decimal_place<double, 1>::type;
のようにしようと考えてみました。これはウンコでしょうか(´д`)
0251デフォルトの名無しさん
2005/10/17(月) 16:38:49Nが整数で20程度ならテーブル参照がいい気がします
0252デフォルトの名無しさん
2005/10/17(月) 17:51:59何でもいいけどtypeじゃなくてvalueにしとけよ気持ち悪い
0253デフォルトの名無しさん
2005/10/17(月) 18:58:230254デフォルトの名無しさん
2005/10/17(月) 19:00:13既出
0255デフォルトの名無しさん
2005/10/17(月) 19:28:24それってコンパイルしなのでは。
0256255
2005/10/17(月) 19:43:54ttp://www.kuzbass.ru/docs/isocpp/class.html#class.static
0257デフォルトの名無しさん
2005/10/17(月) 21:47:37もういっそのこと
各型での結果をそれぞれ float.csv, double.csv, ldouble.csv にでも保存しといて
const float decimal_place_float[] = {
#include "float.csv"
};
const double decimal_place_doulbe[] = {
#include "double.csv"
};
const long double decimal_place_long_doulbe[] = {
#include "ldouble.csv"
};
とかってしたら?
0258248
2005/10/18(火) 00:34:50gccで-O3オプションをつければ、特殊化した1-20については
アセンブラファイルを見る限りコンパイル時に定数にしてくれるっぽいです。
テーブル参照も試してみます。
csvも面白いアイディアです。thxです。
0259デフォルトの名無しさん
2005/10/18(火) 00:43:46template <typename T, int N>
struct decimal_place {
static const T value = decimal_place<T, N - 1>::value / 10;
};
これってできない?
#今臥せっててコンパイラつかえないの。
0260デフォルトの名無しさん
2005/10/18(火) 00:47:28これでgccは通った(他は知らね)
template <typename T, int N>
struct decimal_place {
static const T value = decimal_place<T,N-1>::value/10;
};
template <typename T> struct decimal_place<T, 0> { static const T value = (T)1; };
0261デフォルトの名無しさん
2005/10/18(火) 01:39:450262デフォルトの名無しさん
2005/10/18(火) 02:54:47ヒント:テンプレート引数は整数
0263248
2005/10/18(火) 03:04:56ウチのgccでもコンパイル通りました。
パフォーマンス的にも数字書く方式と変わらないです。
std::pow()で計算するより二桁ほど速く、十分なスピードです。
ありがとうございました。
0264デフォルトの名無しさん
2005/10/18(火) 03:07:00整数型と enum 型だけだよ。
float 等に対応するには value を関数にすればいいんだろうな。
でも最適化されにくそうだな。
0265デフォルトの名無しさん
2005/10/19(水) 14:41:490266265
2005/10/19(水) 14:49:04・ループ
・静的変数
・goto
・再帰
・switch
をやると展開されなくなるっぽいですね。
switchはなんか納得いきませんけど。
他にありますか?
0267デフォルトの名無しさん
2005/10/19(水) 14:52:31コンパイラに依存
0268デフォルトの名無しさん
2005/10/19(水) 15:01:32ここ逝け
【初心者歓迎】C/C++室 Ver.22【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1128872687/
0269265
2005/10/19(水) 15:02:22でも、なんかガイドラインというか、
だいたい、これをやるとだめだ、
みたいなのがあるのかな〜と思って。
0270デフォルトの名無しさん
2005/10/19(水) 15:09:01お前の脳内ガイドラインか?w
規格票ぐらい最低目を通しとけ。
0271デフォルトの名無しさん
2005/10/19(水) 15:18:32あまり頭の悪い煽りすんなよ、寒いから。
0272デフォルトの名無しさん
2005/10/19(水) 16:39:10実際コンパイラによってかなり違うと思う。
g++3.2.3だと、gotoとforループを含む関数をインライン化した(static変数とswitchは試した範囲ではだめだった)。
0273272
2005/10/19(水) 16:46:430274デフォルトの名無しさん
2005/10/19(水) 17:34:41英語が読めない馬鹿か。可愛そうに。氏んでいいよ。
0275デフォルトの名無しさん
2005/10/19(水) 17:55:11説明になってないから。寒けりゃ練炭でも抱いて寝れば?wwww
0276デフォルトの名無しさん
2005/10/19(水) 18:26:21練炭って、どこで売ってますか?
0277デフォルトの名無しさん
2005/10/19(水) 20:38:01Linuxでアプリケーション作っているんですけど、そのアプリケーションの
設定ファイルをそれぞれの一般ユーザーのホームディレクトリに作りたいと
思っています。プログラム自身は/usr/local/binに置くつもりです。
ofstream fout("hogehoge.txt");
でファイルを作ると実行ファイルと同じ場所に出来てしまいます。
というか、/usr/local/binではパーミッションで作れません。
ホームディレクトリはどのように指定してやればいいのでしょうか。
教えてください。お願いします。
FedoraCore4でフルインストール、フルアップデートな状態です。
0278デフォルトの名無しさん
2005/10/19(水) 20:41:17環境依存な質問だから以下のスレで聞いたほうが良い
【初心者歓迎】C/C++室 Ver.22【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1128872687/
0279デフォルトの名無しさん
2005/10/19(水) 20:51:220280デフォルトの名無しさん
2005/10/19(水) 23:03:50もうちょっとマシな負け犬の遠吠えを期待したんだけどな。
練炭ねえ。やっぱり寒いわ、君のセンス。
0281デフォルトの名無しさん
2005/10/19(水) 23:41:320282デフォルトの名無しさん
2005/10/20(木) 02:36:01なんか心洗われるようなシーンだな。
0283デフォルトの名無しさん
2005/10/21(金) 01:24:360284デフォルトの名無しさん
2005/10/21(金) 02:25:48メンバ関数の場合のconstの有無からの連想で質問しているとしたら、要らない。
何故ならばコンストラクタではインスタンスを初期化しなければならないため、常にconstではありえない。
0285デフォルトの名無しさん
2005/10/21(金) 16:48:09そもそもコンストラクタ(・デストラクタ)にconstはつけられない。
0286デフォルトの名無しさん
2005/10/21(金) 17:50:01BoostのURLにある
hamaji _at_ nii.ac.jp / shinichiro.h
最後のhですが、niftyにおける「ハンドル名」は
花田なんてことはないですよね?
0287デフォルトの名無しさん
2005/10/21(金) 17:58:03template<template <typename T> typename U> と書けないのはなんでですか?
いままで template 引数の中の class と typename は同じだと思っていたのですが・・・。
0288デフォルトの名無しさん
2005/10/21(金) 18:02:06おそらくU<T>として使えるのはUがクラステンプレートの場合しかあり得ないからだろう。
ちなみにtemplate<template<typename T> class U>はできる。
0289デフォルトの名無しさん
2005/10/21(金) 18:12:17「Visual C++.net Standard Version2003 アカデミック」
を購入しました。
6枚のCDを出したり入れたりして4段階のセットアップが完了し
早速起動してみました。
よくわからなかったのでとりあえず
ファイル⇒新規作成⇒プロジェクト
で「test」と名づけたプロジェクとを作成したところ
以後「既存のプロジェクトを開く」の一覧から「test」を左ダブルクリックで選択すると
選択した瞬間にエラーが発生してC++が強制再起動します。
また、その後に作成した「test2」というプロジェクトは
選択時はセーフなのですが
プロパティを見ようとすると同様に強制再起動します。
これの解決策をご教授くださいませ・・・
0290デフォルトの名無しさん
2005/10/21(金) 18:13:49スレ違い。
くだすれVisual C++(超初心者用)
ttp://pc8.2ch.net/test/read.cgi/tech/1118781438/
0291287
2005/10/21(金) 18:27:20反例がtemplateな関数ポインタとかで作れないかと考えてみましたが、断念しました。
というわけで、U はクラスしか取り得ないということで覚えておきます。ありがとうございました。
0292デフォルトの名無しさん
2005/10/21(金) 20:21:59template<typename T> class U
でUという型名だとすると、これを
template<typename T> typename U
とは書けないからではなかろうか。
0293デフォルトの名無しさん
2005/10/22(土) 00:07:07実際、やることは簡単で、myapp.exeを指定したフォルダにコピーするだけです。
で、myapp.exeをインストーラと同じフォルダに入れておけば、myapp.exeを
いったん読み込んで、指定したフォルダに書き込むプログラムはすぐできます。
しかし、そうではなくて、インストーラの中にmyapp.exeのデータを埋め込んで
しまいたいのです。ユーザから見えないように。
また、インストーラをファイル1つにするために。
とすると、バイナリのデータファイルの内容を、実行可能ファイル(今の場合、
インストーラ)にマージさせることなどが可能なのでしょうか?
そうでないなら、ファイル1つのインストーラはどのようにできているのでしょうか。
どなたか、教えていただけないでしょうか。
0294デフォルトの名無しさん
2005/10/22(土) 00:11:260295デフォルトの名無しさん
2005/10/22(土) 00:11:52http://pc8.2ch.net/test/read.cgi/tech/1128951330/l50
あとヒントはリソースだ
0296デフォルトの名無しさん
2005/10/22(土) 00:41:34フリーなら、Nullsoft Scriptable Install System はどうか?
http://nsis.sourceforge.net/
結構色んなソフトで使われてる。
スクリプトの仕様も結構簡単。
0297デフォルトの名無しさん
2005/10/22(土) 00:42:480298デフォルトの名無しさん
2005/10/22(土) 18:15:35定義はどこでやるのがよいでしょうか?
今のところmain関数前にまとめて定義してたのですが
数が増えてきたり、初期化が複数行に渡ってるものがあったりで見づらくなってきました
staticクラスメンバ用のヘッダファイルとか用意したほうがいいのでしょうか
0299デフォルトの名無しさん
2005/10/22(土) 18:26:08クラスに対応したヘッダとソースを用意するのが一般的。
static メンバ変数の定義はそのソース側でやればいい。
ヘッダで変数の定義をするのだけはやめとけ。
0300デフォルトの名無しさん
2005/10/22(土) 18:34:51ソースで宣言することにいたします
0301デフォルトの名無しさん
2005/10/22(土) 18:44:270302デフォルトの名無しさん
2005/10/22(土) 18:55:46template でも void * でも同じ動きをする関数では、
普通はどっちを使ったほうがいいでしょうか?
template <class X> void funcTemplate_1 (X **p);
void funcPointer_2 (void **p);
みたいなやつなんですが・・
どなたかよろ m(__)m
0303デフォルトの名無しさん
2005/10/22(土) 19:01:12「いい」の基準がわからん。
まぁ template 版のほうが型を知っている分、
良い仕事してくれるんじゃないかな?
0304デフォルトの名無しさん
2005/10/22(土) 19:05:49型ごとに関数を作るからコードのサイズが大きくなりやすい。
ポインタだと、型情報を失うが、
関数が一つだからコードのサイズは小さく済む。
両方の利点を取るために下の関数を内部で呼び出すだけのinline関数を作るのが良いと思う。
そうすれば使うほうは型情報を失わないし、関数は一つしか作らずに済むから
void funcPointer_2 (void **p);
template <class X>inline void funcTemplate_1(X **p){
funcPointer_2(p);
}
0305304
2005/10/22(土) 19:09:110306302
2005/10/22(土) 19:12:20さっそくためしてみまっす。
>>303 >>304 >>305
ことば足らずですみませんでした。
どうもありがとうございます〜 m(__)m
0307293
2005/10/22(土) 19:28:10ありがとうございます。
わかりました。
>>295
ありがとうございます。
そちらのスレに質問を書きました。
>>296
ありがとうございます。
見てみます。
0308デフォルトの名無しさん
2005/10/22(土) 19:37:20class X
{
vector<int> v;
public:
void show() const;
...
};
void X::show() const {
for(vector<int>::iterator i = v.begin(); i != v.end(); i++) {
cout << *i << endl;
}
}
みたいなコードを書いたらコンパイルエラーになりました。それでiteratorをconst_iteratorに
するとエラーでなくなります。それは、たぶん、showがconstだからかなとも思うのですが、
ちょっと納得がいきません。この解釈でよいのでしょうか。
v自身はconst vector<int>ではないので、const_iteratorでなくてもいいような気もするのですが。
0309デフォルトの名無しさん
2005/10/22(土) 19:43:36constメンバ関数中では、変数はすべてconstと見なされる。
それが嫌なら、mutableと宣言すべき。
0310デフォルトの名無しさん
2005/10/22(土) 19:53:250311デフォルトの名無しさん
2005/10/22(土) 20:22:47アフォがいるよ
0312デフォルトの名無しさん
2005/10/22(土) 20:52:26>>9の他ライブラリリンク集の
http://www.kmonos.net/alang/cpp/lib.html
に紹介してあったVIGRAを使いたいんですが
http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/(公式ページ)
日本語で使い方を解説してあるサイトってありませんか?
もしくはもっといい画像処理のライブラリってありませんか?
0313デフォルトの名無しさん
2005/10/22(土) 20:53:56つ[LeadTool]
つ[google.com]
0314初心者
2005/10/22(土) 22:16:15したいですが。どうすればいいですか?知ってる方是非教えてください。
0315デフォルトの名無しさん
2005/10/22(土) 22:17:330316デフォルトの名無しさん
2005/10/22(土) 22:17:590317初心者
2005/10/22(土) 22:18:40したいですが。どうすればいいですか?知ってる方是非教えてください。
0318デフォルトの名無しさん
2005/10/22(土) 22:21:500319初心者
2005/10/22(土) 22:24:500320デフォルトの名無しさん
2005/10/22(土) 22:30:360321デフォルトの名無しさん
2005/10/22(土) 22:57:27#include <vector>
using namespace std;
class Base{
public:
Base(const string& s) {}
};
class Derived : public Base{
public:
Derived(const string& s) : Base(s) {}
};
int main(){
vector<Base*> data;
data.push_back(new Derived("D"));
}
をBorlandC++でコンパイルすると警告がでます。(上は全角空白を使ってます)
警告 W8030 vec_test.cpp 18: '__x' パラメータ(vector<Base *,allocator<Base *> >:
:push_back(Base * const &))のために一時変数を使用する(関数 main() )
どうしてだかわかる方いますか?頭が変になりそうです。
0322デフォルトの名無しさん
2005/10/22(土) 23:01:590323321
2005/10/22(土) 23:06:02すみません。確かに一時変数を使っているのでそのままですが、
data.push_back(new Base("B"));
では警告がでません。また、コンストラクタを引数無しのものに変えると警告が消えます。
ということで何がなんだかわからないのです。
0324321
2005/10/22(土) 23:07:23警告されるような悪いことかということなんです。
0325デフォルトの名無しさん
2005/10/22(土) 23:08:31とか?
でもそれをsortとかしたらスライシングされるからやめとけ。
0326デフォルトの名無しさん
2005/10/22(土) 23:10:49ttp://www.tietew.jp/cppll/archive/7203
ttp://piza.2ch.net/tech/kako/980/980175292.html
(下は751から)
0327デフォルトの名無しさん
2005/10/22(土) 23:10:52まったく悪くない
0328321
2005/10/22(土) 23:12:19レスありがとうございます。
でも、キャストしても警告は消えません。動作に問題ないようなので警告を無視してもいいのかも
しれませんが、なんだかものすごく嫌なんです。
それとsortでスライシングってどういう意味でしょう。スラインシングの意味がわからないのですが。
0329321
2005/10/22(土) 23:16:42ありがとうございます。
Borlandの警告のバグということでしょうか。
>>326の下の752の「原則」は誤りだと思います。
一時変数をconst参照に渡しても問題ないと思うのです。
0330デフォルトの名無しさん
2005/10/22(土) 23:16:520331デフォルトの名無しさん
2005/10/22(土) 23:17:15いい加減な事を言うな
0332デフォルトの名無しさん
2005/10/22(土) 23:24:08v.push_back(static_cast<Base*>(static_cast<void*>(new Derived("hoge"))));
かもしくは
vector<Base*> v(0); //初期化
のどっちか、そんでv.sort()でスライシングってのは間違い、
だけども delete v.back(); ってやるとスライシングが起きる。
つまりBaseのデストラクタとBase用のdeleteが動くので、
new Derived で確保したデータが残ったりデストラクタが行うプロセスとか無視されたりする
ような気がする、、、
0333デフォルトの名無しさん
2005/10/22(土) 23:26:21それはス雷寝具とは言わない。
0334デフォルトの名無しさん
2005/10/22(土) 23:27:31もういい。バカは黙ってろ。
0335デフォルトの名無しさん
2005/10/22(土) 23:28:01ROMしてろ
0336332
2005/10/22(土) 23:30:400337デフォルトの名無しさん
2005/10/22(土) 23:31:010338デフォルトの名無しさん
2005/10/22(土) 23:31:210339321
2005/10/22(土) 23:34:33(でも、>>321ではデータメンバがないので、問題ないような。
そうとも言えないのかな?)
それはそれとして、BorlandC++のバグということで寝ます。
みなさんありがとうございました。
0340デフォルトの名無しさん
2005/10/22(土) 23:36:290341デフォルトの名無しさん
2005/10/22(土) 23:40:59過去スレのほうはもうちょっと先を読め。
0342デフォルトの名無しさん
2005/10/23(日) 00:31:37(この警告の表示抑止用コマンドラインオプション = -w-nci)
この C++ クラスには定数メンバー member が含まれていますが,member は初期化子を持っていません。
定数メンバーの初期化は可能ですが,定数メンバーへの代入はできない点に注意してください。
0343デフォルトの名無しさん
2005/10/23(日) 00:33:12string s;
cin >> n;
getline(cin, s);
とすると、2行目の入力で3行目まで行っちゃう。
それは、cinで拾えなかった改行がgetlineで拾われるから?
その対策に、getlineの前に、cin.sync();を入れてみたんだが、それでいい?
0344デフォルトの名無しさん
2005/10/23(日) 00:34:23○3行目の入力で4行目まで行っちゃう。
0345デフォルトの名無しさん
2005/10/23(日) 00:35:19「(入力が)3行目まで行っちゃう」の意味がわからない。
0346デフォルトの名無しさん
2005/10/23(日) 00:47:06cin >> n;
で入力待ちになるが、そこでint値を入力すると、次のgetlineで入力待ちにならない。
その対策にcin.sync();って、どこかのホムペで見たことがある。
0347デフォルトの名無しさん
2005/10/23(日) 02:57:25ソースファイルを複数に分けたいのですが
定義をメインのソースでして、中身を別のソースファイルに書いて
g++ メインのソース 別のソースって感じでいけますか?
0348デフォルトの名無しさん
2005/10/23(日) 03:10:40キーワードを教えてやるよ。あとは自分で考えな。
宣言と定義
分割コンパイル
ヘッダファイル
0349デフォルトの名無しさん
2005/10/23(日) 04:22:320350デフォルトの名無しさん
2005/10/24(月) 12:21:07struct Base { int val1; virtual ~Base(){} };
struct Derived : public Base { int val2; };
※sizeof(Base) == 8、sizeof(Derived) == 12 とする
Base * p = new Derived[5];
++p;
上記がスライシング。
++p だと、p から 8Byte しか進まないので、
p が指している場所は、次の Derived ではなく、
Derived の中途半端な位置を指していることになる。
std::vector< Base > vec(5) に対して、
vec.push_back( vec.begin() + 1, Derived() );
をやると、Derived の Base 部分しかコピーされないので、
これもスライシングの一種。
std::vector< Base * > vec2(4); に対して、
vec2.insert( vec2.begin()+1, new Derived() ); とするのは安全。
0351デフォルトの名無しさん
2005/10/24(月) 13:21:150352デフォルトの名無しさん
2005/10/24(月) 16:16:450353デフォルトの名無しさん
2005/10/24(月) 17:19:35元々は後者をスライシングと言い出したような気がするが俺の勘違い?
0354デフォルトの名無しさん
2005/10/24(月) 18:06:100355デフォルトの名無しさん
2005/10/24(月) 18:18:340356デフォルトの名無しさん
2005/10/24(月) 18:42:57別に継承は関係ないだろ。ま、ポインタを代入する時にエラー出るが。
0357デフォルトの名無しさん
2005/10/24(月) 18:53:490358デフォルトの名無しさん
2005/10/24(月) 19:37:21配列をポリモーフィックに扱うなってことだよ
0359デフォルトの名無しさん
2005/10/24(月) 23:03:44それは誰でもわかる。そのためにboost::ptr_vectorなんかがわざわざ
用意されたんだろ。
0360デフォルトの名無しさん
2005/10/24(月) 23:21:46前者はスライシングとは言わない。
勉強しろよ。
0361デフォルトの名無しさん
2005/10/24(月) 23:23:370362デフォルトの名無しさん
2005/10/24(月) 23:25:520363デフォルトの名無しさん
2005/10/25(火) 01:04:020364デフォルトの名無しさん
2005/10/25(火) 01:06:400365デフォルトの名無しさん
2005/10/25(火) 17:14:45そこで質問というか、他人はどう書くのか聞いてみたく。
1. 全メンバがpublicのとき
イ) struct X {
int member;
};
ロ) class X {
public:
int member;
};
2. 一部メンバがpublic、その他はprivateのとき
イ) struct {
int pub_mem;
private:
int pri_mem;
};
ロ) class {
public:
int pub_mem;
private:
int pri_mem;
};
ハ) class {
int pri_mem;
public:
int pub_mem;
};
大学の研究室向けコーディング規約を見直しているところで、
そこそこC++コード書いてる他の人はどうか知りたいのです。
0366デフォルトの名無しさん
2005/10/25(火) 17:27:17もちろん状況によるが
0367デフォルトの名無しさん
2005/10/25(火) 18:01:14定義しなさそうなやつはstructの傾向がある。
0368デフォルトの名無しさん
2005/10/25(火) 18:07:500369デフォルトの名無しさん
2005/10/25(火) 18:13:48何かをカプセル化する場合はclass
0370デフォルトの名無しさん
2005/10/25(火) 18:18:440371デフォルトの名無しさん
2005/10/25(火) 20:22:59けっこうclass/structは意味で分けるのかな。
クラス定義の先頭には公開メンバーを書き、次にprotected、最後にprivateと
隠蔽するにつれて後ろにする書き方があって、そうすると定義の最初は
常にpublicということになる(2-イの書き方)。
こういう書き方の人はいないのかなあ?
もっともこの書式だと、ほとんどclassを使うことがなくなるのだが。
0372デフォルトの名無しさん
2005/10/25(火) 21:41:18意味としてのクラスと構造体は天と地ほどの差がある。
抽象データ型やポリモーフィズムを行うものにstructはおかしいし、
= {}の形式で初期化をするようなものがclassでもなんだか不自然。
まあ、関数オブジェクトや368のようなものはstructでも定石のようなものだから良い。
0373デフォルトの名無しさん
2005/10/25(火) 22:01:26>意味としてのクラスと構造体は天と地ほどの差がある。
おまえが勝手に異なる意味を見出してるだけだと思うが。
先行宣言に便利なように、どっちかに完全に統一するのがいいと俺は思う。
0374デフォルトの名無しさん
2005/10/25(火) 22:35:44#define class struct
俺は使い分ける。
0375デフォルトの名無しさん
2005/10/25(火) 23:00:59蔭でこそこそやるだけのデータ構造ならstruct。
例えば、↓はstruct。
struct foo {
int x;
int y;
foo() : x(0), y(0) {}
};
そして↓はclass。
class bar {
public:
int x;
int y;
bar() : x(0), y(0) {}
void set(int tx, int ty) {x = tx; y = ty;}
};
今悩んでいるのは、オペレータを持つデータ構造をclassにするかstructにするか。
例えば↓みたいな。
struct fooz {
int x;
int y;
fooz() : x(0), y(0) {}
operator double() {return hypot(x, y);}
};
#あくまで例なのでコード内容への突っ込みは勘弁。
0376デフォルトの名無しさん
2005/10/25(火) 23:03:19お前が使い分けるのは自由だが、そのルールを他の人も守ってるとは思わないでくれよ
俺はほとんど全てのメンバが公開されたとき意味を持つものを struct にして ほかは class にしてる
0377デフォルトの名無しさん
2005/10/25(火) 23:58:090378デフォルトの名無しさん
2005/10/26(水) 00:13:430379デフォルトの名無しさん
2005/10/26(水) 00:17:35class Base{ int val1; };
class Derived : public Base { int val2; };
で、
Derived d;
Base b = d; ←これだけだろ。
なんだかご苦労さんって話だよね。
0380デフォルトの名無しさん
2005/10/26(水) 00:28:350381デフォルトの名無しさん
2005/10/26(水) 00:29:530382デフォルトの名無しさん
2005/10/26(水) 00:38:41もちろん>>379のコード内で問題はない。
しかし、派生クラスを作る以上、仮想デストラクタを書いておくべきではないのか、ということだが。
0383デフォルトの名無しさん
2005/10/26(水) 00:42:080384デフォルトの名無しさん
2005/10/26(水) 01:03:37基底クラスのすべてに仮想デストラクタをつけるべきではありません。
基底クラスのポインタで派生クラスのオブジェクトを扱う場合にのみ必要となります。
0385デフォルトの名無しさん
2005/10/26(水) 01:56:41C++ Coding Standardsにそのネタあるな。
基本クラスのデストラクタはpubilc仮想かprotected非仮想にする
だって。
0386デフォルトの名無しさん
2005/10/26(水) 02:01:37438ページに
template <class T, class Allocator = allocator<T>> class vector
ってあるんだけど、
class Allocator = allocator<T>の部分の意味がわからないんだけど・・・
Allocatorはクラス名で、allocator<T>ってのは何者?
クラス名(Allocator)にallocator<T>を代入?
0387デフォルトの名無しさん
2005/10/26(水) 02:04:11テンプレートvectorの第二パラメタAllocatorのデフォルトをallocator<T>に指定している。
このallocator<T>はstd::allocator<T>のこと。
0388デフォルトの名無しさん
2005/10/26(水) 02:05:060389デフォルトの名無しさん
2005/10/26(水) 02:08:210390デフォルトの名無しさん
2005/10/26(水) 02:11:450391デフォルトの名無しさん
2005/10/26(水) 13:47:05>基本クラスのデストラクタはpubilc仮想かprotected非仮想にする
そう言った端から、「そうでないこともある」と書いてあるような。
マレなケースとか書いているが。
ちなみに、Effectiveの方はもっとマイルドに、ポリモルフィックな
基底クラスには仮想関数を付ける。ポリモルフィックでないときは、
メモリ損するから考えろみたいに書いてある様子。英語なんで、
自信ないが。というか、読める奴の受け売りだが。
んで、>>383が正解な希ガス。
0392デフォルトの名無しさん
2005/10/26(水) 15:00:42この流れからすると、どう考えても
「異なる意味を見出す」という所行は>>372の勝手なものではないね。
どう言い訳する?
0393_
2005/10/26(水) 15:52:06ニューラルネットネットワークのバックプロパゲーションの
プログラムってどんくらい難しいですか??
どなたか何か情報を教えてください。
よろしくお願いします。
0394デフォルトの名無しさん
2005/10/26(水) 15:52:55単純な実装なら簡単。
0395デフォルトの名無しさん
2005/10/26(水) 18:17:18俺が「勝手に」と言ったのは
「一般の慣行から離れて」という意味じゃなく
「処理系や言語仕様から離れて」という意味だから、
間違ってるとは思わない。
誤解を招く言いかたスマソ
0396デフォルトの名無しさん
2005/10/26(水) 21:35:00プログラムを起動させることってできるのでしょうか
たとえばテキストエディッタなどを起動するようなプログラムを
作りたいのですが。
お願いします。
0397デフォルトの名無しさん
2005/10/26(水) 21:40:58<cstdio>のstd::system関数。
0398デフォルトの名無しさん
2005/10/26(水) 21:42:22void hoge(int i, char *str,...);
というプロトタイプ関数があるのですが
strの後ろの「...」とはどんな意味があるのですか?
0399デフォルトの名無しさん
2005/10/26(水) 21:46:37そもそもここでC++以外の質問されても困るけどな。
可変長引数でググレカレー
0400デフォルトの名無しさん
2005/10/26(水) 22:28:11と言ってみたりみなかったり。
0401デフォルトの名無しさん
2005/10/26(水) 22:40:19C++にも可変個引数はあるということでいいではないか。
0402385
2005/10/26(水) 23:50:01>そう言った端から、「そうでないこともある」と書いてあるような。
どこに?この前出版された和訳本はそんなことないけど。
ちなみに要旨は
「オブジェクトをどうやって破棄するかを考えてデストラクタを定義しろ」
つうことですな。
0403デフォルトの名無しさん
2005/10/26(水) 23:55:290404363
2005/10/27(木) 00:24:44C++なら素直にstd::vector使っとけと言う事だよな……
0405デフォルトの名無しさん
2005/10/27(木) 00:37:190406363
2005/10/27(木) 01:12:09関係なくはないよ。
0407デフォルトの名無しさん
2005/10/27(木) 01:14:470408デフォルトの名無しさん
2005/10/27(木) 01:17:560409デフォルトの名無しさん
2005/10/27(木) 01:36:50はやはり空関数として実装しておかないといけませんか?
0410デフォルトの名無しさん
2005/10/27(木) 01:38:27自分で宣言しなかったときはコンパイラが勝手に
空のコンストラクタ、デストラクタを定義する。
なので、必要ない。
0411デフォルトの名無しさん
2005/10/27(木) 02:50:34へ?可変長の引数を渡すときは、可変長引数使わずにstd::vector使え
つうことだけど、なんで関係ないの?
0412デフォルトの名無しさん
2005/10/27(木) 05:24:52union types { int i, char c, double lf, std::string s; };
vector<types> args;
printf("%lf %d %c %s", args);
みたいにしろってこと?
0413デフォルトの名無しさん
2005/10/27(木) 06:22:51void func(...); の代わりに、
void func(std::vector<type> args);
こうしたらどうか?ってことなんじゃないかと。
実際やってみれば分かるけど、
これじゃ可変長に出来てもvectorに積める型が1種類だから、
>>412みたいにいちいちunionでラップしなきゃならなくなるのに気が付くはず。
こんなのいちいちやるのアホクサイ。
0414デフォルトの名無しさん
2005/10/27(木) 07:39:410415デフォルトの名無しさん
2005/10/27(木) 07:44:080416デフォルトの名無しさん
2005/10/27(木) 07:54:290417デフォルトの名無しさん
2005/10/27(木) 10:39:040418デフォルトの名無しさん
2005/10/27(木) 10:39:160419デフォルトの名無しさん
2005/10/27(木) 10:51:48News 2005-10-24: The C++ Standard Library Issues List (Revision 39) is available
0420デフォルトの名無しさん
2005/10/27(木) 14:26:51ユニオンなんて古代のCだから捨てろ。その発想がすでにだめなんだよ。
君はC++に向かない。と言うか、C++の勉強が足りない。
と言ってみたりみなかったり。
0421デフォルトの名無しさん
2005/10/27(木) 14:36:48反論できない->とりあえず煽る->予防線を張る
そんなビクビクするくらいなら黙っとけよ(笑
0422デフォルトの名無しさん
2005/10/27(木) 15:55:33ヘルプ表示はたいていの場合固定の(static constな)文字列で、かつ複数行から成り立ちます。
これをC++流で書くと(coutかcerrはともかく)
std::cerr << "hage program\n"
<< "usage: hage [option] target\n"
<< "options:\n"
<< " --ratio N scalp hair density" << std::endl;
のように書き連ねることになります。これを、perlのように
print <<END_OF_HELPTEXT
hage program
usage: hage〜
〜
END_OF_HELPTEXT;
と改行を含めて書きたいのです。
テキストファイルをリソースとして取り込む方法も検討しましたが、Win32限定なら
容易にできるものの、標準C++だけでやる方法がわかりません。
こうしたテキストデータをうまく扱う方法はありませんか?
0423デフォルトの名無しさん
2005/10/27(木) 16:52:55無理。
素直に書き連ねるか、外部ファイルから読み込むか、プリプロセッサを自前で作れ。
0424デフォルトの名無しさん
2005/10/27(木) 19:30:14promotion が入るからってことじゃね?
C++ でも確かにそうなってる。(5.2.2/7) 多分、C との後方互換性のためじゃないかと。
0425デフォルトの名無しさん
2005/10/27(木) 19:49:02C++ でも union は必要になるケースはある。例えばアラインメント解決やメモリをケチりたい場合など。
何の条件付けもせずに捨てろというあなたのほうがよっぽど C++ に向いてないとおもうが。
0426デフォルトの名無しさん
2005/10/27(木) 20:07:04_m128 v;
float vec[4];
};
バリバリ使いますなぁ。
0427デフォルトの名無しさん
2005/10/27(木) 20:27:100428デフォルトの名無しさん
2005/10/27(木) 21:58:530429デフォルトの名無しさん
2005/10/27(木) 22:33:590430デフォルトの名無しさん
2005/10/27(木) 22:42:54それにしてもx86-64の64bitインラインアセンブラ禁止やめてくれ・・・・・
fp87の使用禁止もあり得ねー。
0431デフォルトの名無しさん
2005/10/27(木) 23:02:12{
static int m_counter;
int m_num;
A(){
m_num = ++m_counter;
}
}
int main(){
A arr[100];
}
---
このとき、arr[0] == 1、 arr[1] == 2、 arr[2] == 3、、、 って保障される?
arr[99]の方から初期化される可能性もあるのかな?
0432デフォルトの名無しさん
2005/10/27(木) 23:29:43std::cerr << "hage program\n"
"usage: hage [option] target\n"
"options:\n"
" --ratio N scalp hair density" << std::endl;
ではいけないの?
0433デフォルトの名無しさん
2005/10/27(木) 23:30:52クラスオブジェクトの配列の初期化は添字順に行われることが決まっていたはずだから、
その場合は恐らく保証されている。
デストラクタは逆順。
0434デフォルトの名無しさん
2005/10/27(木) 23:53:20(12.6/3) ですな.
0435デフォルトの名無しさん
2005/10/28(金) 00:00:20そうですた。やっぱり定期的に見ないとあやふやになってていかんなぁ。
補足トンクス
0436デフォルトの名無しさん
2005/10/28(金) 00:35:12それでコンパイル通るんだ。g++3.4.2だと通るね。知らなかった。
0437デフォルトの名無しさん
2005/10/28(金) 00:38:40ちょいまちー。この書式はANSI-C89の時代から使えるぞ。
0438デフォルトの名無しさん
2005/10/28(金) 00:46:450439406
2005/10/28(金) 01:00:53そもそも可変長引数て、型安全て考慮されていたっけ?
手軽に逃げるならvoid*のvectorで、boost使えるならboost::anyか
boost::variantなんかが使えると思う。
0440デフォルトの名無しさん
2005/10/28(金) 01:08:190441デフォルトの名無しさん
2005/10/28(金) 01:23:46どうやればいいのですか。
0442デフォルトの名無しさん
2005/10/28(金) 02:03:41カレンダーを見る。
あるいはここに逝く
【初心者歓迎】C/C++室 Ver.22【環境依存OK】
ttp://pc8.2ch.net/test/read.cgi/tech/1128872687/l50
0443デフォルトの名無しさん
2005/10/28(金) 02:13:33boost::gregorian使うと
date today(day_clock::local_day());
cout << today.month() << endl;
0444デフォルトの名無しさん
2005/10/28(金) 02:38:37std::cerr << "hage program
usage: hage [option] target
options:
--ratio N scalp hair density" << std::endl;
これは?
0445デフォルトの名無しさん
2005/10/28(金) 02:39:49これだと標準じゃないのかな?
#include <iostream>
#include <ctime>
using namespace std;
int main ()
{
time_t now_ (time (NULL));
tm now;
gmtime_r (&now_, &now);
cout << now.tm_mon << endl;
return 0;
}
0446デフォルトの名無しさん
2005/10/28(金) 08:52:42×time_t now_ (time (NULL));
○time_t now_ (time (0));
0447デフォルトの名無しさん
2005/10/28(金) 09:05:35NULLじゃダメなの?
glibc-2.3.5では以下のようになってんだけど
time_t
time (t)
time_t *t;
{
struct timeval tv;
time_t result;
if (__gettimeofday (&tv, (struct timezone *) NULL))
result = (time_t) -1;
else
result = (time_t) tv.tv_sec;
if (t != NULL)
*t = result;
return result;
}
0448デフォルトの名無しさん
2005/10/28(金) 09:30:26これは言語で保証しているのでしょうか?
0449デフォルトの名無しさん
2005/10/28(金) 09:36:430450デフォルトの名無しさん
2005/10/28(金) 10:07:340452デフォルトの名無しさん
2005/10/28(金) 11:33:22別のコンパイラで使っていたコードを VC++.net に持ってきたんですが、
型キャストで warning がでまくってしまいます。
void cHoge::Init( void *start ) {
unsigned int st;
st = (unsigned int)start;
}
: warning C4311: '型キャスト' : ポインタを 'void *' から 'unsigned int' へ切り詰めます。
こんな感じです。
C++自体、使い始めて日が浅いのでいまひとつ解決の仕方が見えてきません。
初歩的な事かもしれませんが、ご助力お願いします。
0453デフォルトの名無しさん
2005/10/28(金) 11:37:27本当はスレ違いなんだが一応答えておくと、
VC.NETではデフォルトでポインタが64bitサイズと仮定されてコンパイルされるから
unsigned intにキャストすると情報落ちが起こるぞ、とWarningを吐く。
押さえたければ、プロジェクトのプロパティのC/C++→全般にある
「64ビット移植への対応」を「いいえ」にすればいいはず。
0454452
2005/10/28(金) 11:44:01即レスありがとうございます。
解決いたしました。
ポインタ類は 32Bit であると疑いもしなかったので・・。
スレ違いの質問でしたが、お答えいただきありがとうございました。
0455デフォルトの名無しさん
2005/10/28(金) 11:49:37あまりよくない希ガス。実際には多くのコードがやっていることだが。
可能ならば、クラス情報を持たないvoid*も使わない方がよいのでは。
0456デフォルトの名無しさん
2005/10/28(金) 12:12:15union使うとどうしてメモリけちれるの?
具体的に書いてみてちょ。
>>426
自分のコードを一度unionなしで書き直してごらん。
(1)できない → ヴォケ
(2)struct使いまくり → 無理せずC使えよ
(3)条件分岐だらけ → ここは爺さんの来るところじゃないよ
0457デフォルトの名無しさん
2005/10/28(金) 12:15:32もちろん426のコードが何を意図しているか理解したうえで煽ってるんだよな?
0458デフォルトの名無しさん
2005/10/28(金) 13:13:31可変長引数に対してアレルギーみたいなのを感じている人もいるようだけど、
boost::is_base_and_derived や、Loki::SuperSubClass は、
可変長引数がないと実装不可能だよ。
0459デフォルトの名無しさん
2005/10/28(金) 13:16:460460仲裁マン
2005/10/28(金) 13:33:52煽りあっても何も得るもの無いよ。
0461デフォルトの名無しさん
2005/10/28(金) 14:57:07unionはどうなの?
0462デフォルトの名無しさん
2005/10/28(金) 15:47:10C++では無用の長物と化していることは事実でしょ。
妙なこだわりを持ってる奴は、なんちゃってCプラプラマ。
そんなことよりオブジェクト指向くらい理解しろよと。
それが無理なら引退しろよと。俺は愛を持ってそう言いたいっすよ。
「おじいさん。ご苦労様でした。次は僕たちの時代ですから、
どうぞ安らかに」
0463デフォルトの名無しさん
2005/10/28(金) 16:15:11union嫌厨はどうも、自分ができないものに蓋をしているようにしか見えないよ。
使いたい香具師は使えばいいし、使いたくない香具師は使わなければいいというレベルのものでしょうが。
まぁ、unionを含むような構造体はできれば公開して欲しくない(≒ラッパを公開して欲しい)とは思うけど。
0464デフォルトの名無しさん
2005/10/28(金) 17:34:34「無用の長物と化している」のはぜんぜん事実じゃあない.
boostやVC7のSTLとか見れば union が必要とされていて,きちんと使われてるのがわかる.
0465デフォルトの名無しさん
2005/10/28(金) 20:07:31君の中ではオブジェクト志向と共有体が相反する概念なのか?
0466デフォルトの名無しさん
2005/10/28(金) 20:14:470467デフォルトの名無しさん
2005/10/28(金) 20:22:330468デフォルトの名無しさん
2005/10/28(金) 21:21:080469デフォルトの名無しさん
2005/10/28(金) 21:26:20ココね。アド書き忘れたわ。OTL
0470デフォルトの名無しさん
2005/10/28(金) 21:34:36内容がほとんどまだ無いサイトみたいだけど、どこが痛いの?
具体的には何をすれば?
0471デフォルトの名無しさん
2005/10/28(金) 21:46:420472デフォルトの名無しさん
2005/10/28(金) 21:59:39だれも見てる人いないのに助けてとか言ってるから
ここの住人で並みのプログラマにしてやろうではないかと。
まぁ本人にそのような意志があったらの場合だが・・・。
>>471
言い方悪かった。スマン。
0473デフォルトの名無しさん
2005/10/28(金) 22:01:010474デフォルトの名無しさん
2005/10/28(金) 22:07:52ここがまずいんなら初心者スレとか。
0475デフォルトの名無しさん
2005/10/28(金) 22:21:47だれか潜入してくれる香具師はいないですかね…。
0476デフォルトの名無しさん
2005/10/28(金) 22:24:26このスレのURLでも貼っとけ。
0477431
2005/10/28(金) 23:52:17おおお、保障されてたのかー
ありがとうございました
0478406
2005/10/29(土) 00:45:49可変長引数の関数は実体化もされませんから!
0479デフォルトの名無しさん
2005/10/29(土) 01:45:250480デフォルトの名無しさん
2005/10/29(土) 02:08:27出させてください。
あるソフトのバグ?を追求している過程で、問題を純化していったら
以下のC++コードの合法性が焦点となることがわかったのですが、規格書
見てもよくわかりません。誰か、これの規格合致・違反・未定義性を
指摘できませんか?
<規格合致か違反か?>
struct foo {} とした場合、foo::foo としてその型(struct foo)を
表記してよい(foo でできるのは当然だが、foo::foo はありか?)
別の見方をすると
namespace foo { void hi(); }
class foo { static void hi(); }
があるとき、両方の hi() が共存することは可能か?それともエラーか?
どのコンパイラで通るって話ではなく(g++ で foo::hi() と
foo::foo::hi() で共存するのは確認済)、規格書の第何項の
どういう解釈によって合致・違反と定まるのか、という点で知りたいです。
そうじゃないと単なるコンパイラのローカル拡張とも思えるので。
規格上はクラス名は名前空間定義とほぼ等価なのだが、じゃあ
それなら上の foo::foo って foo class-scope の中の foo という
解釈になって、それは型名ではなくコンストラクタではないのかとか、
g++ が通しても本当に正しいのかちょっと悩んでます。
0481デフォルトの名無しさん
2005/10/29(土) 03:17:17一点目は残念ながら規格書ではないが。
プログラミング言語C++第3版 5.7 構造体(手持ちではP.141):
> Cの時代に遡る理由から、同じスコープに同じ名前のstructと非構造体を宣言することは可能になっている。
> たとえば、次の通り。
>
> struct stat { /* ... */ };
> int stat(char* name, struct stat* buf);
そして、規格書3.4 Name lookupの3:
> Because the name of a class is inserted in its class scope (clause 9), the name of a class is also
> considered a member of that class for the purposes of name hiding and lookup.
とあるので、class fooはfoo::fooとして参照できる。
よって、合法だと思う。
0482デフォルトの名無しさん
2005/10/29(土) 03:27:10#include <iostream>
using namespace std;
class Kitty {
public:
Kitty(bool , char *);
};
Kitty::Kitty(bool bo , char *str) {
if (bo) cout << str << '\n';
}
int main() {
Kitty obj[3] = {
Kitty(true , "Kitty on your lap") ,
Kitty(false , "Card Captor Sakura") ,
Kitty(true , "Di_Gi_Gharat")
};
return 0;
}
ってコードを見つけたんですけど、これはいいのでしょうか。
Kittyには引数を取るコンストラクタがないので、
Kitty obj[3];
とはできないわけですよね。
それなのに、上みたいに、初期値を与えて配列を作ってもよいのでしょうか。
0484デフォルトの名無しさん
2005/10/29(土) 05:37:12暗黙のコピーコンストラクタ
0485デフォルトの名無しさん
2005/10/29(土) 08:23:50あるじゃん。
0486482
2005/10/29(土) 08:49:02すみません。
「引数を取らないコンストラクタがないので」の間違いです。
だから、「Kitty obj[3];」はできません。
それなのに、配列を作っちゃっていいのかってことなんです。
>>484
すみません。わかりません。
0487デフォルトの名無しさん
2005/10/29(土) 08:59:390488デフォルトの名無しさん
2005/10/29(土) 09:41:43コンパイラは暗黙のうちにKitty::Kitty(const Kitty&)を定義している。(クラス内にこれが宣言されていない場合)
そしてobjの初期化では各要素毎にKittyの一時オブジェクトを作り、それを上記のコンストラクタに渡しているということになる。
0489デフォルトの名無しさん
2005/10/29(土) 11:07:00ありがとう!
結局 struct foo {} ってあったとき、
struct foo *v = new struct foo();
foo::foo *v = new foo::foo();
のどちらも有効なんだね。ということで hi() 問題も
foo::hi(); // namespace foo の hi()
foo::foo::hi(); // struct foo の hi()
で規格合致な形で識別可能ですね。
自分の手元には第二版しかないが、そのあたりがさっぱり見当たらない・・・
ページ構成から完全に違うし、さすがに買いなおすかな。
0490デフォルトの名無しさん
2005/10/29(土) 11:24:40メンバ関数の引数と戻り値の型は統一されています。
メンバ関数がstaticだったらうまくいくのですが、static以外だとコンパイルエラーになってしまいます。
staticではないメンバ関数を格納することは出来ないのでしょうか?
0491デフォルトの名無しさん
2005/10/29(土) 11:28:29例えば
struct A {
A(int x, int y) : a(x), b(y) {}
int a, b;
bool operator<(const A& r) const { a < r.a; }
};
std::multiset<A> hoge;
hoge.insert(A(1, 10));
hoge.insert(A(1, 20));
とした場合、後から追加されたA(1, 20)はA(1, 10)の前と後ろどちらに入るか、ということです。
0492デフォルトの名無しさん
2005/10/29(土) 11:39:42通常のポインタでstaticでないメンバは指せず、代わりにメンバへのポインタというのがある。
もちろんメンバへのポインタはクラスごとに別個の型。
というわけで490のようなことをやるのは結構面倒くさい。
普通はboost::functionの配列にboost::bindを使って格納することになると思う。
0493デフォルトの名無しさん
2005/10/29(土) 11:44:01ttp://www.tietew.jp/cppll/archive/7559
これが参考になるかな?
ちなみにぐぐるさんで「multimap キー 順番」の一番上。
今度からは頑張ろう。
0494デフォルトの名無しさん
2005/10/29(土) 11:48:53ありがとう。
正直言うと、2, 3回ググって面倒臭くなって訊いてしまった。
0495490
2005/10/29(土) 11:52:32Thank!
と言うことは、boost::を使うか、staticメンバの引数にthisのポインタを渡して誤魔化すか
どっちかか。
0496482
2005/10/29(土) 11:53:01ちょっと難しいですが、結論としては、>>482のコードに間違いはないということですね。
Kittyとかあるんであやしいと思ったのですが。
ありがとうございます。
0497デフォルトの名無しさん
2005/10/29(土) 13:06:340498デフォルトの名無しさん
2005/10/29(土) 18:48:53あれとは失礼だぞ仮にも本を出版しているのだから
0499デフォルトの名無しさん
2005/10/29(土) 18:52:090500デフォルトの名無しさん
2005/10/29(土) 20:30:580501デフォルトの名無しさん
2005/10/29(土) 20:32:460502デフォルトの名無しさん
2005/10/29(土) 20:39:100503デフォルトの名無しさん
2005/10/30(日) 01:10:20namespace foo と class foo は同じスコープに存在できないよ。
0504デフォルトの名無しさん
2005/10/30(日) 05:32:16struct MyData
{
int x, y, z;
};
MyData mydata[2] = {{1, 2, 3}, {4, 5, 6}};
うまくいっちゃうのですが、MyDataにコンストラクタはいらないのかなあと。
よろしくお願いします。
0505デフォルトの名無しさん
2005/10/30(日) 05:41:08いいよ。
その例だと、コンストラクタを作ったら初期化が面倒になるだろう。
0506デフォルトの名無しさん
2005/10/30(日) 07:29:32>>445と>>446
むしろ、time_t now_ (time (0)); がわからないんですが。
NULLは0でよいんでしょうか?だったらNULLなんかいらないような。
それともCとC++で違ってるのでしょうか?
0507デフォルトの名無しさん
2005/10/30(日) 09:28:29time(NULL)でいいよ。教条主義者と勘違い野郎は0にするかもしれないけど。
0508デフォルトの名無しさん
2005/10/30(日) 09:38:22C++でNULLは0と同じ。
Cだと(void *)0になっていることがあるのだが、
C++ではvoid *から他のポインタ型への変換にはキャストがいるので単に0となっている。
で、いっそのこと0使えやということになって、
それを実践しているが507のいう教条主義者ということになる。(含む俺)
0509デフォルトの名無しさん
2005/10/30(日) 10:31:360510デフォルトの名無しさん
2005/10/30(日) 10:52:060511デフォルトの名無しさん
2005/10/30(日) 11:02:17NULLならヌルポインタを関数に渡していると一目でわかる。
0を渡すと数値渡してるのかポインタ渡してるのか判らん。
0512デフォルトの名無しさん
2005/10/30(日) 11:15:230513デフォルトの名無しさん
2005/10/30(日) 11:27:300514デフォルトの名無しさん
2005/10/30(日) 11:32:56結局エラー時にコンパイラには補足されない点では同じだし
int *p = NULL;
よりは
int *p = 0;
の方が自然かな、というところで最近は0派。
どっちを使ってても実務で問題になったことはないし、好みの問題だろ。
0515デフォルトの名無しさん
2005/10/30(日) 11:49:250516デフォルトの名無しさん
2005/10/30(日) 11:51:27いや、別スレ立ててるほどのものでもないでしょ。
過去スレみれば腐るほど議論がされているような気がするのだが?
0517デフォルトの名無しさん
2005/10/30(日) 11:54:580518デフォルトの名無しさん
2005/10/30(日) 11:55:040519デフォルトの名無しさん
2005/10/30(日) 11:55:34俺は>>514みたらNULLの方が分かりやすいなとも思うし人それぞれ
0520デフォルトの名無しさん
2005/10/30(日) 12:06:36通常のポインタに対しても使えるようになる。
0521デフォルトの名無しさん
2005/10/30(日) 12:11:21f(NULL);
ていう恐らく意図とは違うコードが
f(nullptr);
でエラーとして捕らえられるってことか。
便利やも。
でもC++/CLIじゃなぁ(´A`)
0522デフォルトの名無しさん
2005/10/30(日) 14:48:44C++って、いつからコマンドラインインタフェースになったの?
0523デフォルトの名無しさん
2005/10/30(日) 14:51:210524デフォルトの名無しさん
2005/10/30(日) 18:07:47using namespace std;
int foo(struct null_ptr*) {cout << " null po " << endl;}
int foo(int i){cout << " int " << endl; }
int main()
{
foo(0);
foo(static_cast<null_ptr*>(0));
}
ってなかんじのコードなら見たことがある。
0525デフォルトの名無しさん
2005/10/30(日) 18:09:51ガッ・・・・してもいい?w
0526デフォルトの名無しさん
2005/10/30(日) 18:20:17hWnd = GetForegroundWindow();
SendMessage(hWnd,WM_LBUTTONDOWN,0,1);
SendMessage(hWnd,WM_LBUTTONUP,0,1);
では動きません、どうすればよいですか?
0527デフォルトの名無しさん
2005/10/30(日) 18:25:11先ずはスレ違いということを認識することから始めよう。
0528デフォルトの名無しさん
2005/10/30(日) 20:55:12すまん、スレ違いだったようだ
0529デフォルトの名無しさん
2005/10/31(月) 07:39:44<cstddef> とかのインクルードをせずに
予約語のごとく使う奴は許さない。
0530デフォルトの名無しさん
2005/10/31(月) 17:08:300531デフォルトの名無しさん
2005/10/31(月) 22:10:230532デフォルトの名無しさん
2005/10/31(月) 22:10:560533デフォルトの名無しさん
2005/10/31(月) 22:13:17<c〜>のヘッダを使っていればもちろん必要。
<〜.h>のヘッダでは内部でusingされているということになっているから、
規格通りの処理系ではstd::size_tなどとしても使えるはず。
0534デフォルトの名無しさん
2005/10/31(月) 23:40:560535デフォルトの名無しさん
2005/10/31(月) 23:46:06<*.h>を使う奴はいないよな?
0536デフォルトの名無しさん
2005/10/31(月) 23:49:13いるわよ〜(*^o^*)
0537デフォルトの名無しさん
2005/11/01(火) 11:48:330538デフォルトの名無しさん
2005/11/01(火) 12:43:55class CTest
{
private:
void func1() {};
void func2() {};
public:
static void (CTest::*fpTable[])(void);
};
void (CTest::*CTest::fpTable[])(void) = {
&CTest::func1,
&CTest::func2,
NULL,
};
void func()
{
CTest test;
void (CTest::**pFList)() = test.fpTable;
for (; *pFList; pFList++) {
(CTest::*pFList)();
}
}
関数コールするところで、error C2059: 構文エラー : '<tag>::*' が出てしまうんですが(VC6)
なにか対策無いでしょうか?(俺に聞けスレからの誘導です)
0539デフォルトの名無しさん
2005/11/01(火) 13:19:26(CTest::*pFList)();
↓
(test.**pFList)();
というか、あまりメンバ関数へのポインタについて理解してないようだから
無理にそういう書き方をしないで、boost::functionとboost::bindを組み合わせて使っておくのが無難かと
0540デフォルトの名無しさん
2005/11/01(火) 13:30:050541デフォルトの名無しさん
2005/11/01(火) 14:24:18サンクスです
今の仕事場、boostはおろか、STLも禁止なんです
正直、関数ポインタはあまり使わないんで、勉強し直すつもりです
0542デフォルトの名無しさん
2005/11/01(火) 14:27:20禁止キター
その仕事場、逃げたほうが良いんじゃないか。
0543デフォルトの名無しさん
2005/11/01(火) 15:07:240544デフォルトの名無しさん
2005/11/01(火) 15:14:29よくある話なんでないの?
0545デフォルトの名無しさん
2005/11/01(火) 17:02:43def sieve(xs):
if (len(xs) == 0): return []
else: return [xs[0]] + sieve([y for y in xs[1:] if y % xs[0] != 0])
print sieve(range(2,1000))
というコードは,C++ ではどれくらい簡単に書けますか?
# Pythonではリストの加算はリストの隣接を表します.
# xs[1:] はリストの二番目の要素から後の部分リストです.
0546デフォルトの名無しさん
2005/11/01(火) 17:46:59#include <list>
#include <iostream>
#include <functional>
#include <iterator>
#include "boost/lambda/lambda.hpp"
#include "boost/lambda/bind.hpp"
namespace lambda = boost::lambda;
template<typename Out>
void seive(std::list<int> xs, Out out)
{
while(!xs.empty())
{
int p = xs.front();
*out++ = p;
xs.pop_front();
xs.erase(std::remove_if(xs.begin(), xs.end(),
lambda::bind(std::equal_to<int>(), 0, lambda::bind(std::modulus<int>(), lambda::_1, p))),
xs.end());
}
}
int main()
{
std::list<int> x;
for(int i = 2; i <= 1000; i++)
x.push_back(i);
typedef std::ostream_iterator<int> oii;
seive(x, oii(std::cout, " "));
}
0547545
2005/11/01(火) 18:24:57remove_if が algorithm のほうの remove_if なので,せっかく list を使っていても,そのメリットがありません.
(algorithm の remove_if は普通は内部で remove_copy_if を呼ぶので,コピーが発生してしまいます)
あと,一応結果を保持しておきたいです(で,できればそっちでもコピーは発生させたくない).
コピーをたくさん発生させてもいいなら,イテレータを回して↓な感じなんですが.
vector<int> primes(2000);
int k = 2; generate(primes.begin(), primes.end(), var(k)++);
vector<int>::iterator it, last;
for (it = primes.begin(), last = primes.end();
it != (last = remove_if(it+1, last, _1 % *it == 0)); ++it);
primes.erase(last, primes.end());
0548546
2005/11/01(火) 18:42:13その通り。
>あと,一応結果を保持しておきたいです(で,できればそっちでもコピーは発生させたくない).
それだと標準アルゴリズムでは扱いきれないはず。
手でループを回すのが一番かと。
0549デフォルトの名無しさん
2005/11/01(火) 20:08:20なんで駄目なんだ
<windows.h>
<stdio.h>
って風に.hで揃えたいじゃないか。
<vector.h><map.h>
0550デフォルトの名無しさん
2005/11/01(火) 20:18:17つ[namespace]
0551デフォルトの名無しさん
2005/11/01(火) 21:22:44いつの時代の人間ですか?
0552デフォルトの名無しさん
2005/11/01(火) 22:18:54ヘッダと互換性を残すためなんだっけ?それだったらstdioくらいは良さそうなもんだが。
0553デフォルトの名無しさん
2005/11/01(火) 23:13:270554デフォルトの名無しさん
2005/11/01(火) 23:34:03っていうか、
玄人は**pFListなんてやらないで、*pFList[]にするよ。
今更ポインタできまつ!おらできまつ!流行んない。
0555デフォルトの名無しさん
2005/11/01(火) 23:39:13public:
int x_, y_;
CBase(int x = 0, int y = 0){
x_ = x; y_ = y;
}
};
// 上のクラスはめっちゃ適当です。
// ソート用に演算子のオーバーロード
bool operator < (CBase &a, CBase &b){
return a.x_ < b.x_;
}
std::list<CBase *> ObjectList;
CBase* BB = new CBase(100, 20);
CBase* BBA = new CBase(200, 20);
CBase* BBB = new CBase(150, 20);
ObjectList.push_back(BB);
ObjectList.push_back(BBA);
ObjectList.push_back(BBB);
// ここでソートしたいがうまくいかない
ObjectList.sort();
CBaseクラスのx_の値でソートしたいのですがうまくいかないんですができないんでしょうか?
std::list<CBase *> ObjectListをstd::list<CBase> ObjectListにして実体渡せばソートできるみたいなんですが
どなたか回答お願いします。
0556デフォルトの名無しさん
2005/11/01(火) 23:42:55ソートしたければSTLのソートアルゴリズムを使え。
0557デフォルトの名無しさん
2005/11/01(火) 23:46:58リストのソートは比較の関数オブジェクトを渡すことができる
0558デフォルトの名無しさん
2005/11/01(火) 23:58:26とエラーがでるのですが、何がいけないのでしょうか?
template <typename T> struct base
{static void test(T){}};
struct ex :public base< int >,public base< int* >
{};
int main()
{
int a;
ex::test(a);
ex::test(&a);
}
0559デフォルトの名無しさん
2005/11/02(水) 00:00:59……ってあれ? コレで良いんだっけ?
0560558
2005/11/02(水) 00:27:50どうも。
using base<int>::test;
using base<int*>::test;
usingしたらVC7.1で通りました。(VC6だとだめぽ)
0561デフォルトの名無しさん
2005/11/02(水) 00:43:14そのエラーメッセージおかしいね。
gccでは
error: `test' is not a member of `ex'
error: `test' is not a member of `ex'
と出る。規格ではどうなってるんだっけか。
0562デフォルトの名無しさん
2005/11/02(水) 01:06:03-ObjectList.sort();
+struct Local {static bool Dereference_Less (const CBase *lhs, const CBase *rhs) {return lhs->x_ < rhs->x_;}};
+ObjectList.sort(&Local::Dereference_Less);
bool operator < (CBase &a, CBase &b)
は
bool operator < (const CBase &a, const CBase &b)
に
0563デフォルトの名無しさん
2005/11/02(水) 03:46:37> (前略)
> If the resulting set of declarations are not all from sub-objects of the same type,
> or the set has a nonstatic member and includes members from distinct sub-objects,
> there is an ambiguity and the program is ill-formed.
隠蔽を考えた上での member name lookup の結果が、
1) 同じ型の sub-objects 由来のものではない場合
2) 非静的メンバを持ち、かつ別個の sub-objects 由来のものを含む場合
のいずれかである場合、曖昧であり ill-formed である、そうな。
オーバーロードの解決はこの後(結果が曖昧でなかった場合)だそうで。
D&E (日本語訳) p.534 にも(非静的メンバだけど)例があった。
0564デフォルトの名無しさん
2005/11/02(水) 09:43:01解説サンクス。
>>561で生じたエラーは、base<int>::test と base<int*>::test はあるが、
ex::test はないために生じたのだと思う。VC7.1は、これらをまるでex::test
のように扱うために、外部からアクセスした時に曖昧エラーが出ているが、
本来は gcc のように、not found エラーとして処理すべきかと。
0565デフォルトの名無しさん
2005/11/03(木) 02:45:22と
m_cell = m_cell & (m_cell ^ rhs.m_cell);
は同じではないのですか?
0566デフォルトの名無しさん
2005/11/03(木) 02:50:38どういうこっちゃ。演算子のオーバーロードとかは無しという方向で?
0567デフォルトの名無しさん
2005/11/03(木) 03:56:11}
class parent:public base{
}
class player{
void inc(base*){
for(int i=0;i<10;i++){
(base+i)->XXX();
}
}
main(){
parent a[10];
player p;
p.inc(a);
}
のように,基底クラスのポインタを扱う関数incに派生クラスの配列のポインタを与えると
エラーが出てしまいます.(実行可能ですが値が破綻します)
そもそもクラスの配列自体がナンセンスなのでしょうか?
0568デフォルトの名無しさん
2005/11/03(木) 04:08:33後者は一時オブジェクトがよぶんに生成される可能性がある。
m_cellが何かによって、同じ効果のある文かどうかは変わる。
0569デフォルトの名無しさん
2005/11/03(木) 04:16:31baseと、baseから派生されたparent(ふつうはderivedと名付けた方がわかりやすいと思う)のサイズが
まったく同じでない場合、結果は不定になる。baseのサイズを元にしてポインタ演算が行われるからである。
たいていの場合は派生クラスの方にメンバが追加されているなどで大きさが異なるので
(何をしているかが分からない限り)配列をポリモーフィズム的に扱うことは避けた方がよい。
0570デフォルトの名無しさん
2005/11/03(木) 04:27:59Visual C++で作られた dllファイルを一行追加したいんだけど、
サクラを入れてみたけど、文字化けで指定のところが編集できませんでした。
なにで編集すれば文字化け解消できますか?
0571デフォルトの名無しさん
2005/11/03(木) 04:37:06釣りは他のスレで頼む。
Visual C++の問題なら → http://pc8.2ch.net/test/read.cgi/tech/1118781438/l50
0572デフォルトの名無しさん
2005/11/03(木) 04:46:05570です。釣りではなく、まじでした。
ご存知でしたら誘導先に建てましたのでお答えいただけません?
0573567
2005/11/03(木) 04:48:58助言を参考にしますと,上記の例ではplayerクラス関数に
inc(derived*){}
を作り直すか,テンプレートを使用する必要があるということですね.
ありがとうございました.非常に良くわかりました.
0574デフォルトの名無しさん
2005/11/03(木) 08:40:14って風すれば要望みたすんじゃないの?
0575565
2005/11/03(木) 10:40:37m_cell, rhs.m_cell 共に bool です。
だから、&=, ^, =, & は全てデフォルトの演算子ですよね?
0576デフォルトの名無しさん
2005/11/03(木) 14:24:05その2つの式が同じバイナリを吐くか、もしくは違うバイナリを吐くかは、
コンパイラにより、さらに最適化レベルにもよる。
一般的に言って、上の式の方がより最適化されたバイナリを吐く可能性
が大きいが、規格では何も決められていない。
0577567
2005/11/03(木) 15:02:15指南いただいた内容より,ポインタの配列を使用しても,実体はparentクラスのサイズ分が確保されるので,
baseクラスのポインタのインクリメントは不可能(不定)なのではないでしょうか?
気が向いたらご返信願えればと.
0578デフォルトの名無しさん
2005/11/03(木) 19:11:55sizeof(base) != sizeof(parent)であってもsizeof(base*) == sizeof(parent*)
厳密には実装依存か?
0579デフォルトの名無しさん
2005/11/03(木) 19:16:47>>574の例では、実際にインクリメントするのはbaseへのポインタのポインタだから、
問題ない。
0580567
2005/11/03(木) 20:12:33なるほど,そのようにインクリメントすればOKなのですね.
これで派生クラスごとに場合分けをしなくてすみそうです.
皆様の適切なアドバイスありがとうございました.
0581デフォルトの名無しさん
2005/11/03(木) 22:31:46template<class T> class CHandleAaa
というのがあったときにTがあるクラスCAaaを継承したクラス限定
という制限をかけるにはどうすればいいですか?
TがCAaaの派生クラスで無い場合コンパイルで怒られたいです。
0582デフォルトの名無しさん
2005/11/03(木) 22:39:46boostのtype_traitsのis_base_ofとBOOST_STATIC_ASSERTを組み合わせればいい。
0583デフォルトの名無しさん
2005/11/03(木) 22:41:560584デフォルトの名無しさん
2005/11/03(木) 22:51:37ありがとうございます。
0585デフォルトの名無しさん
2005/11/04(金) 18:51:15class TestClass
{
public:
typedef void (*LPFUNC_VOID_VOID)();
LPFUNC_VOID_VOID m_lpFunc[3];
…(略)…
void Draw00(void);
void Draw01(void);
void Draw02(void);
…(略)…
};
とし、コンストラクタの中で
m_lpFunc[0]=&TestClass::Draw00;
と代入するとcannot convert〜というエラーが出ます。TestClass::LPFUNC_VOID_VOIDとしてもエラーが出ます。
また、メンバ関数から呼び出そうと
(this->*m_lpFunc[1])();
とするとこれもエラーになるようです。
VC++6.0の時はこんな感じの記述でいけたのですが、VC++2003ToolkitとVC++2005Expressではだめでした。
このように、メンバ関数のポインタをメンバ変数として持ちたい場合、どのようにすればよろしいでしょうか?
0586デフォルトの名無しさん
2005/11/04(金) 19:21:54メンバーへのポインターに成ってないからじゃない。
>typedef void (*LPFUNC_VOID_VOID)();
>LPFUNC_VOID_VOID m_lpFunc[3];
void (TestClass::*m_lpFunc[3])();
0587デフォルトの名無しさん
2005/11/05(土) 00:40:29> >>561で生じたエラーは、base<int>::test と base<int*>::test はあるが、
> ex::test はないために生じたのだと思う。VC7.1は、これらをまるでex::test
> のように扱うために、外部からアクセスした時に曖昧エラーが出ているが、
> 本来は gcc のように、not found エラーとして処理すべきかと。
言わんとするところをちゃんとつかめてないが、その解釈と↓の挙動は矛盾しない?
メッセージの違いは name lookup 段階での曖昧性に対する表現が違ってるだけなんじゃないかな?
#include <iostream>
struct A { static void func(void) { std::cout << 'A' << std::endl; } };
struct B : public A {};
struct C : public A {};
struct D : public B, public C {};
struct E : public A { static void func(void) { std::cout << 'E' << std::endl; } };
struct F { static void func(void) { std::cout << 'F' << std::endl; } };
struct G : public A, public F {};
struct H : public A, public F { static void func(void) { std::cout << 'H' << std::endl; } };
int main(void)
{
B::func(); // A
D::func(); // A
E::func(); // E
// G::func(); // error: `func' is not a member of `G'
H::func(); // H
return 0;
}
0588585
2005/11/05(土) 00:44:05回答ありがとうございます。おかげでちゃんとエラーが出ずに動作するようになりました。
「関数のポインタ」じゃなくて「voidのポインタを返す〜」になってたんですね。
0589デフォルトの名無しさん
2005/11/05(土) 00:45:55ちょっと気になったことなんですが
ポインターの参照を返してみたいとふと思いついて
↓のようなものを書いてみたんですが、戻り値のところが
int*& のような見慣れない形になってるにもかかわらずコンパイルできました。
これって、大丈夫なんでしょうか?
int* a;//どこかで定義
int*& 関数()
{
return a;
}
0590デフォルトの名無しさん
2005/11/05(土) 00:54:03大丈夫。
ついでに、そういうことは習慣じゃなくて論理を基に考えるべきだと思う。
0591デフォルトの名無しさん
2005/11/05(土) 00:58:130592デフォルトの名無しさん
2005/11/05(土) 01:03:19using namespace std;
int main (void)
{
int i=15,*p;
p = &i;
printf("%x %x %x %x %x\n",p,*p,&p,*&p,&*p);
}
実行結果
22ff74 f 22ff70 22ff74 22ff74
当然だね
0593デフォルトの名無しさん
2005/11/05(土) 01:05:43早い回答ありがとう
なるほど、大丈夫ですか。
安心しました。
論理か・・ プログラムって意外と奥が深いんだなあ
0594デフォルトの名無しさん
2005/11/05(土) 05:41:29printf("INT: ");
printf(" %d", value);
printf(" (%08X)", value);
}
displayDouble(double value){
printf("DOUBLE: ");
printf(" %f", value);
printf(" (%16X)", value);
}
displayString(char *value){
printf("STRING: ");
printf(" %s", value);
printf(" (%08X)", value);
}
こういった感じの関数を、各組み込み型すべてについて作りたいのですが、テンプレート、あるいはオーバーロードなどをどういう風に書いたら、コードを短くできるでしょうか?
displayInt/Double/UCharなどと、String/WStringは別物と考えた方がいいのかもしれませんが・・・
0595デフォルトの名無しさん
2005/11/05(土) 06:46:37引数の型を表す名前は関数名に含めずに、オーバーロードを定義すればいい。
iostream を使うと、フォーマット文字を型ごとに変えてやる必要は無くなる。
INT, DOUBLE, STRING なんてのは、それぞれ書かないと無理だろうな。
各関数の3行目は意味が不明瞭なので手がつけられない。
0596デフォルトの名無しさん
2005/11/05(土) 08:59:46template<typename T>
inline const char *TypeName(const T& x)
{
return typeid(x).name();
}
char *をchar *と表示させたくなければ特殊化すればいい。
3行目は各値のビット表現を出力したいということだろ。
こんなものを考えたが駄目だった。
std::cout << std::hex << '(' << reinterpret_cast<const boost::uint_t<sizeof x * CHAR_BIT>::least&>(x) << ')';
0597デフォルトの名無しさん
2005/11/05(土) 09:47:05>INT, DOUBLE, STRING なんてのは、それぞれ書かないと無理だろうな。
typeid(int).name()でいけないか?
0598デフォルトの名無しさん
2005/11/05(土) 10:48:22nameが何を返すかは処理系依存だし、実際gccは「i4」だとか一見意味の分からない文字列を返すから使えない
0599デフォルトの名無しさん
2005/11/05(土) 14:06:42#include <iostream>
#include <iomanip>
#include <sstream>
#include <typeinfo>
template <typename T> struct type {
inline static const char* name() throw() { return typeid(T).name(); }
inline static const char* format() throw() {
std::stringstream ss; ss << "%0" << sizeof(T)*2 << "X"; return ss.str().c_str();
}
};
template <> struct type<int> {
inline static const char* name() throw() { return "INT"; }
inline static const char* format() throw() { return "%08X"; }
};
template <> struct type<double> {
inline static const char* name() throw() { return "DOUBLE"; }
inline static const char* format() throw() { return "%16X"; }
};
template <> struct type<char*> {
inline static const char* name() throw() { return "CHAR*"; }
inline static const char* format() throw() { return "%08X"; }
};
template <typename T> inline void display_type(const T& value) {
using namespace std;
cout << type<T>::name() << ": " << value << " (";
printf(type<T>::format(), value); // OMG
cout << ")";
}
0600599
2005/11/05(土) 14:21:41int i = 12345678; double d = 1234.56; char* c = "test"; unsigned int j = 12;
display_type(i); display_type(d); display_type(c); display_type(j);
return 0;
}
問題を難しくしただけの希ガス(´д`)
「型」と「型の名前」、「型」と「型の出力フォーマット」を
プログラマが思うとおりにしなければならないなら、そのいちいちについて列挙するしかない。
template〜とか書くのがめんどくさい場合、マクロを使う:
#define TYPE(T, NAME, FORMAT) \
template <> struct type<T> { \
inline static const char* name() throw() { return NAME; } \
inline static const char* format() throw() { return FORMAT; } \
};
TYPE(int, "INT", "%08X")
TYPE(double, "DOUBLE", "%16X")
……
糞コードだな(鬱
0601デフォルトの名無しさん
2005/11/05(土) 21:45:14それは無理だろうけど、適当にラッピングすればキーに出来るのではないかと思う。
(デフォルト値はある。ファイルで入力が無かった変数にはそれを使う)
で、質問なんだけど、その変数をpublic変数にしていつでも読めるようにしたい、
でも左辺値にはしたくないって時にどうやってる?
0603デフォルトの名無しさん
2005/11/06(日) 01:42:29「左辺値にする」の意味がよくわからないが、
それが「代入の対象となる」という意味なら、
public な const 参照メンバを置けばよさそう。
0604デフォルトの名無しさん
2005/11/06(日) 01:50:33レス、サンクス。
const参照メンバ?
public:
const int var1;
const double var2;
const string var3;
みたいな?
デフォルト値があって、入力があった時だけはメソッドで読み込んで値を変えたい。
外部で使用するときは参照するだけ。値の変更は許さない、みたいな使い方。
でも、上だと値そのものが変更できないんじゃないのかな?
0605デフォルトの名無しさん
2005/11/06(日) 01:53:22参照したい変数がすっごく多くて、そのつど、その変数の値を返す
だけのメンバ関数を書きたくないんですよ。
だから、public変数にしたい。でも、値は好き勝手に変更できるようにしたくはない、って訳です。
0606デフォルトの名無しさん
2005/11/06(日) 02:13:37まとまったデータとして、struct などにまとめてはどうだ?
0607デフォルトの名無しさん
2005/11/06(日) 02:31:23class C
{
private:
int v;
public:
int const& rv;
C() : rv(v) {}
};
すっごく多いってことなら、これも不味いんだろうな。
606 の言うように構造体にまとめて、
この方法と組み合わせるといいかもしれない。
それでも、奇妙なことせずに値参照用のメンバ関数を
用意するのが最善なのに変わりは無い。
0608デフォルトの名無しさん
2005/11/06(日) 02:51:56> 値参照用のメンバ関数を用意するのが最善なのに変わりは無い。
ああ、それ、いい方法があったら知りたい。
一つ一つの変数ごとに関数を用意するんじゃなくて、なんか汎用に使える方法ないのかな。
0609デフォルトの名無しさん
2005/11/06(日) 03:05:060610デフォルトの名無しさん
2005/11/06(日) 03:10:09設計を見直すのはどうだろう。
折角クラスを設計しているのに内部データを曝け出すのは設計が悪い。
曝け出したいものが一括りにできるのならそうするべき(≒>606)だし、
条件付で曝け出す(≒>607)もいいが、本当に曝け出すべきかどうかも検討してみるべき。
0611デフォルトの名無しさん
2005/11/06(日) 03:11:52そもそも変数の数が膨大という時点で設計を見直した方がいいかもしれない。
private:
T ID_;
public:
const T& ID() const { return ID_; }
を書けばいいということなら、これをマクロにして:
#define readonly(T, ID) \
private: \
T ID##_; \
public: \
const T##& ID##() const { return ID##_; }
というのはどうだろう?
class b {
readonly(int, value)
};
試してないので間違いあるかも。
0612デフォルトの名無しさん
2005/11/06(日) 03:12:340613デフォルトの名無しさん
2005/11/06(日) 03:15:10一つの機能に絞ってまずは分割汁
0614デフォルトの名無しさん
2005/11/06(日) 16:16:090615デフォルトの名無しさん
2005/11/06(日) 16:23:44そんなことしたくなる場面では設計を見直すほうがいい。
0616デフォルトの名無しさん
2005/11/06(日) 16:43:440617デフォルトの名無しさん
2005/11/06(日) 16:52:40初期化したら最後、変更はできない
0618デフォルトの名無しさん
2005/11/06(日) 18:29:52> 初期化したら最後、変更はできない
constの話じゃなくって?
だったら詳しく
0619デフォルトの名無しさん
2005/11/06(日) 18:34:18T& r を一度初期化したら &r は変更できない、ってこと。
それとは別に、 r = x という式は T が const 付じゃない限り有効。
0620デフォルトの名無しさん
2005/11/06(日) 20:05:54ごめん。意味がわからない。
int i,j;
....
int& k = i;
...
k=j;
これができないって意味じゃないね?
0621デフォルトの名無しさん
2005/11/06(日) 20:07:23○ これができないって意味じゃないよね?
0622デフォルトの名無しさん
2005/11/06(日) 20:07:450623デフォルトの名無しさん
2005/11/06(日) 20:09:400624デフォルトの名無しさん
2005/11/06(日) 20:10:53ポインタとの対比で、
int i, j;
int *p = &i;
int &k = i;
p = &j; /* pの参照先を変えることはできるが */
&r = &j; /* もちろんこんなことはできないし、 */
r = j; /* こうしてもrはiを参照し続ける */
>>622
馬鹿はだまってろ
0625デフォルトの名無しさん
2005/11/06(日) 20:15:08まあ餅付けよ
実際に自分で試すのは大事なことだと思うぞ
0626デフォルトの名無しさん
2005/11/06(日) 20:16:04同意。自分で試さないからrなんていう未定義変数を使っちゃうんだよな。
0627デフォルトの名無しさん
2005/11/06(日) 20:16:50失礼しました。
0628616
2005/11/06(日) 21:02:39EffectiveC++買ったは良いけど読んでませんでした・・・。
みなさんこんな質問してすいません。でも、良くわかりました。ありがとうございます。
0629デフォルトの名無しさん
2005/11/07(月) 01:51:40EffectiveC++は一種の思想書だから、他の本の方がいいかも
0630デフォルトの名無しさん
2005/11/07(月) 02:17:46このあたり、厳しいかと思うのですが、標準サポートの
動きはないのでしょうか。
0631デフォルトの名無しさん
2005/11/07(月) 02:27:08次の規格改定で入る予定だにょ
それまで待てないんだったらboostでググってみろにょ
0632デフォルトの名無しさん
2005/11/07(月) 02:31:09これと逆で、あるビットを0にする演算子なにですか?
0633デフォルトの名無しさん
2005/11/07(月) 02:36:500634デフォルトの名無しさん
2005/11/07(月) 02:37:180635デフォルトの名無しさん
2005/11/07(月) 02:37:550636デフォルトの名無しさん
2005/11/07(月) 02:54:34ありがとうがざいます。
0637デフォルトの名無しさん
2005/11/07(月) 03:36:570638デフォルトの名無しさん
2005/11/07(月) 04:22:440639デフォルトの名無しさん
2005/11/07(月) 04:28:590641デフォルトの名無しさん
2005/11/07(月) 06:16:06やっぱりCこそ最強にバランスの取れたプログラミング言語なのか。
0642デフォルトの名無しさん
2005/11/07(月) 07:13:34「あんなに」って言われてもわかんねぇぞ。
0643デフォルトの名無しさん
2005/11/07(月) 07:26:450644デフォルトの名無しさん
2005/11/07(月) 07:57:31>r = j; /* こうしてもrはiを参照し続ける */
vc7.1は普通にjを参照するけど。
つttp://www.kuzbass.ru/docs/isocpp/decl.html#dcl.ref
にはそういうことは記述されてないけど。
0645デフォルトの名無しさん
2005/11/07(月) 08:01:05> vc7.1は普通にjを参照するけど。
それがほんとで assert(&r == &j) が通るなら VC7.1 は盛大にバグっていることになるが、
そんな話は聞いたこと無いのでおそらくお前がバグってるんだろう。
0646デフォルトの名無しさん
2005/11/07(月) 08:17:11STL使って実行ファイルの サ イ ズ が増えたとしても
何の影響もない。今時ハードディスクでヒィヒィ言う奴なんていないだろ。
それよりも開発が楽になることの方が素晴らしい。
STLマンセー
0647デフォルトの名無しさん
2005/11/07(月) 09:02:170648デフォルトの名無しさん
2005/11/07(月) 09:35:05値とオブジェクトを取り違えてないか?
int i = 1, j = 2;
int& r = i;
std::cout << r << std::endl; // rの参照先はiで、iは1だから1が出力される
r = j; // rの参照先はiのままで、jの「値」である2が代入される
std::cout << r << std::endl; // だから、ここで2が出力される
std::cout << i << std::endl; // これも2
r = 3; // rの参照先はiのままだから、この文はiに3を代入する
std::cout << r << std::endl; // 3が出力される
std::cout << i << std::endl; // これも3
std::cout << j << std::endl; // jはrとは無関係、従って2が出力される
0650デフォルトの名無しさん
2005/11/07(月) 11:01:01どうせだから聞かせてくれ。参照を理解できない香具師に教えるヒントになるかも知らん。
0651デフォルトの名無しさん
2005/11/07(月) 11:09:01プ
0652デフォルトの名無しさん
2005/11/07(月) 11:44:56いや、たいした理由じゃないけど勘違いしてた。それも、まじめに。
int& r=a;
は初期化するときaの参照先を受け取るから
r=b;
代入してもそれはbの参照先を受ける
というよなプロセスで勘違いしてた。
0653デフォルトの名無しさん
2005/11/07(月) 11:56:52レスTHX。
なるほど、ありがちとは言え、判っている人間は思いつかないような落とし穴だね。
0654デフォルトの名無しさん
2005/11/07(月) 14:19:04こういう方が直感的に?
0655デフォルトの名無しさん
2005/11/07(月) 14:56:00( ゚Д゚)ハァ?
0656デフォルトの名無しさん
2005/11/07(月) 14:57:36引数と宣言と代入で意味が混ざる。
int instance;
int* pointer = &instance;
int& reference = instance;
void function(int by_value, int* by_pointer, int& by_reference) {
int instance_by_value = by_value;
int instance_by_pointer = *by_pointer;
int* pointer_by_pointer = &by_pointer;
int instance_by_reference = by_reference;
}
0657デフォルトの名無しさん
2005/11/07(月) 14:58:38訳の分からんPascalのポインタよりマシだろ
0658デフォルトの名無しさん
2005/11/07(月) 15:24:08アセンブリソース眺めて調べないと。マンドクセ。
0659デフォルトの名無しさん
2005/11/07(月) 15:33:19それは、判ってないんじゃないかと思う。
実際、r=b;がどちらが参照するかは状況による。
俺も、判っているとは言えない。
0660デフォルトの名無しさん
2005/11/07(月) 15:43:15元の値をホーチしたまま、アドレスが変わったほうが参照した側だ。
0661デフォルトの名無しさん
2005/11/07(月) 16:25:42int *pとかではなく
int* p、もしくは、(int*)pとすると
気持ち見やすいと思う
0662デフォルトの名無しさん
2005/11/07(月) 16:34:56それすると int *ptr, var;としたいときに
int* ptr, var;となってわかりにくくなる
0663デフォルトの名無しさん
2005/11/07(月) 16:36:050664デフォルトの名無しさん
2005/11/07(月) 16:41:030665デフォルトの名無しさん
2005/11/07(月) 16:42:110666デフォルトの名無しさん
2005/11/07(月) 16:44:54(int*)pは文法違反。(int (*p)は問題ない)
ちゃんと統一的な規則があるんだから、宣言を
型名 変数名;
と考えるのはやめた方が合理的だと思う。
0667デフォルトの名無しさん
2005/11/07(月) 16:55:470668デフォルトの名無しさん
2005/11/07(月) 17:00:18のほうが合理的のような気がする。。。
0669デフォルトの名無しさん
2005/11/07(月) 17:02:12であることを考えると、
int* p;
だな。
int *p;
だと*pが変数名?みたいな感じでキモイ。
0670デフォルトの名無しさん
2005/11/07(月) 17:15:52Cジジイは黙っちゃいないよ
0671デフォルトの名無しさん
2005/11/07(月) 17:16:43int *p;と書くと式の中で*pと書けばint値が得られると読める。
0672デフォルトの名無しさん
2005/11/07(月) 17:40:070673デフォルトの名無しさん
2005/11/07(月) 17:43:38*
p
;
0674デフォルトの名無しさん
2005/11/07(月) 18:02:290675デフォルトの名無しさん
2005/11/07(月) 18:47:12>>646はWin32環境の事しか考えてなさそうだが。
0676デフォルトの名無しさん
2005/11/07(月) 18:50:44C++の方が可読性を維持したまま実行モジュールサイズを削減できる可能性が高いと思うが。
#コンテナクラスやstd::stringを使いまくったらワヤだけど。
0677デフォルトの名無しさん
2005/11/07(月) 19:02:47>*pと書けばint値が得られると読める。
そう読むと、既にメモリが確保されているかのような誤解を招く。
0678デフォルトの名無しさん
2005/11/07(月) 19:09:120679デフォルトの名無しさん
2005/11/07(月) 19:25:130680デフォルトの名無しさん
2005/11/07(月) 19:27:11バイナリのサイズが問題になるような使い方をしなければ
C++でもまったく問題無いでしょう。
C++はそう作ろうと思えばそう作れる言語ですから。
(それができないのは、できない人間の能力の問題ですし)
0681デフォルトの名無しさん
2005/11/07(月) 19:28:44俺と同郷の北海道人だろ
0682デフォルトの名無しさん
2005/11/07(月) 19:44:15func(const std::vector<XXX> & data)
みたいなコンテナむき出しの渡し方はダサイですか(´・ω・`)
<algorithm>のようにイテレータで渡したいんだけど・・・
0683デフォルトの名無しさん
2005/11/07(月) 19:53:05> <algorithm>のようにイテレータで渡したいんだけど・・・
それならイテレータで渡せばいいんじゃないかな?
0684デフォルトの名無しさん
2005/11/07(月) 19:53:46おめー、ム板のマルチスレッドスレにも居ただろ?
ここでも丸投げかよ。
0685デフォルトの名無しさん
2005/11/07(月) 20:16:19typedefとか!
…だめ?
0686デフォルトの名無しさん
2005/11/07(月) 20:28:37詳細キボン
0687デフォルトの名無しさん
2005/11/07(月) 20:30:37とかでもいけるんでないの?
0688デフォルトの名無しさん
2005/11/07(月) 20:30:53詳細ってtypedefがわかんないの??
それより682で言ってるようにイテレータでわたしゃいいじゃん
0689デフォルトの名無しさん
2005/11/07(月) 20:32:43いけるいけない以前になぜtypedefでなくdefineなのかと?
それからなぜVが大文字なのかと?
0690デフォルトの名無しさん
2005/11/07(月) 20:33:03せめて
typdef std::Vector<int> iVector;
0691デフォルトの名無しさん
2005/11/07(月) 20:40:29template <typename Iter>
void func(Iter first, const Iter& last) {
while (first != last) {
++first;
}
}
みたいにすればいいんじゃないの。
コンテナがよければ:
template <typename Container>
void func(Container& c) {
typedef typename Container::iterator Iter;
}
0692デフォルトの名無しさん
2005/11/07(月) 20:44:55コンテナの要素に対して変更が行われない限りは使い回していいのかな?
0693682
2005/11/07(月) 21:03:400694デフォルトの名無しさん
2005/11/07(月) 21:04:59682は普通の関数作りたいだけじゃないのか?
0695デフォルトの名無しさん
2005/11/07(月) 21:44:09int型整数をLPSTR型文字列に変換する手順てなにかないでしょうか?
0696デフォルトの名無しさん
2005/11/07(月) 21:50:33そのint型の変数をnとするとboost::lexical_cast<std::string>(n).c_str()とすればよい。
標準ライブラリだけでやりたいのならstd::ostringstreamを活用する。
まあstd::sprintfもなくはないけど……。
0697デフォルトの名無しさん
2005/11/07(月) 23:04:240698デフォルトの名無しさん
2005/11/07(月) 23:07:59MSDN嫁
0699デフォルトの名無しさん
2005/11/07(月) 23:08:280700デフォルトの名無しさん
2005/11/07(月) 23:12:45vector/dequeはコンテナに対して要素の追加時と削除時に無効になる。
list/map/setはイテレータの指す所が削除されたときに無効になる。
unordered_map/setはどうなるんだろうね?
0701デフォルトの名無しさん
2005/11/07(月) 23:12:490703デフォルトの名無しさん
2005/11/07(月) 23:37:45トンクス!
0704デフォルトの名無しさん
2005/11/08(火) 00:00:02回答ありがとうございました
なるべくなら標準ライブラリでやりたいのですが・・・
その先の活用の仕方が思いつきません orz
どうか教えていただけないでしょうか?
0705デフォルトの名無しさん
2005/11/08(火) 00:03:59めんどくさいから、char buf[20]; int num = 100; std::sprintf(buf, "%d", num);とでもしとき。
0706デフォルトの名無しさん
2005/11/08(火) 00:13:37俺もよく分かってないから間違ってるかも知れんが
ostringstreamに出力させた後で、一時的なstringオブジェクト作って
そいつにostringstream.str()で移して、c_str()使えばいいんじゃね?
0707デフォルトの名無しさん
2005/11/08(火) 01:08:48#include <sstream>
int num = 12345;
std::ostringstream oss;
oss << num;
oss.str().c_str(); // ←これを使う。
0708デフォルトの名無しさん
2005/11/08(火) 01:32:560709デフォルトの名無しさん
2005/11/08(火) 02:03:43両方ともテンプレートでCMyObjクラスを指定してあげます。
CBaseClassはLibにして、CMyClassはAPのほうで実装します。
しかしCBaseClassのメソッドを呼び出すとリンクエラーになります。
よく見るとLibファイルにCBaseClassのメソッドが出力されてません。
ソースは以下のようです。
ライブラリを使うアプリ
//App.cpp
template <class T> CMyClass : public CBaseClass<T>
{
};
CMyClass<CMyObj> m_MyClass;
m_MyClass.Foo();
ライブラリ
//BaseClassLib.cpp
template<classs T> CBaseClass
{
public:
CBaseClass(){};
~CBaseClass(){};
void Foo(){printf("foo\n");}
};
というつくりなのですが、CBaseClassのメソッドはBaseClassLib.libに出力されないのですか?
0710デフォルトの名無しさん
2005/11/08(火) 02:11:38テンプレートは型が確定しないと実態を作れないので、ライブラリ化できません。
0711デフォルトの名無しさん
2005/11/08(火) 02:12:24キーワードを教えてやるよ。
テンプレート リンクエラー 定義
あとは自分で考えな。
0712デフォルトの名無しさん
2005/11/08(火) 02:32:18ありがとうございます。やっぱりそうなのか。。
0713デフォルトの名無しさん
2005/11/08(火) 03:19:56B obj_b;
C obj_c;
};
class B{
int hogehoge;
}
class C{
int gehogeho;
}
というAがクラスBとクラスCのオブジェクトをもつとします。
Aの要素としてBからC、CからBのようなアクセスをしたいんですがどうしたらいいでしょうか。
0714デフォルトの名無しさん
2005/11/08(火) 03:39:590715デフォルトの名無しさん
2005/11/08(火) 04:01:53B、Cそれぞれのpublicメンバなら普通に触れるでしょ
なにが問題なの?
0716デフォルトの名無しさん
2005/11/08(火) 04:14:120717デフォルトの名無しさん
2005/11/08(火) 05:05:39.NET2.0だとテンプレートのままライブラリ化できるんだっけ?
0718デフォルトの名無しさん
2005/11/08(火) 05:10:08何がしたいのかよく判らんのだが
無茶なことを考えているらしいということだけは判った
あきらめて寝ろ
目が覚めたら一から勉強しなおせ
0719デフォルトの名無しさん
2005/11/08(火) 05:20:37class C;
class B{
public:
int hogehoge;
C* lp_obj_c;
};
みたいにして、lp_obj_cを介してobj_cのメンバ変数にアクセスする
当然だがあらかじめlp_obj_cにclass A内のobj_cへのポインタを代入しとかないとだめ
0720デフォルトの名無しさん
2005/11/08(火) 09:42:12イテレータを++していって最後まで行ってら自動的に先頭まで戻って、
使う側からしたら永遠にデータを取り出せるような奴。
0721デフォルトの名無しさん
2005/11/08(火) 10:08:390722デフォルトの名無しさん
2005/11/08(火) 10:12:43それって標準コンテナの要件満たすのか?
end で何を返すの?
0723デフォルトの名無しさん
2005/11/08(火) 10:15:03if (it == hoge.end()) it = hoge.begin();
をループに入れるだけで実現できると思うんだが
0724デフォルトの名無しさん
2005/11/08(火) 10:17:24リングバッファはしばしば使うけど、固定長だから自力で実装しているなぁ。
>>720
大した手間じゃないから、標準コンテナのI/F見ながら自分で作ってみよう。
0725720
2005/11/08(火) 10:31:23>>723
それをいれないでグルグルアクセスできたら少しきれいになるかなと
思ったので。
0726デフォルトの名無しさん
2005/11/08(火) 10:44:19だからそれをやるクラスを作ればいいじゃん。
>724は非コンテナって言ってるけどvectorで実装すれば>723をそのまま内部で持てばいい。
単なるリングバッファならend()も要らなきゃbegin()も要らぬ。operator[]があればいい。
0727デフォルトの名無しさん
2005/11/08(火) 11:27:27ローカル変数の使いまわしはバグの基
基本に返って関数分けを考えたほうがヨロシ
0728デフォルトの名無しさん
2005/11/08(火) 11:42:12> >>725
> だからそれをやるクラスを作ればいいじゃん。
別に作りたくないとは言ってないけど、何か誤解されてる?
0729デフォルトの名無しさん
2005/11/08(火) 12:05:450730デフォルトの名無しさん
2005/11/08(火) 12:12:37ローカルクラスオブジェクトは std::for_each() などのファンクタに
指定することはできないのでしょうか?
#include <iostream>
#include <vector>
int main( void) {
struct F {
void operator()(const int & i) const {
std::cout << i << std::endl;
};
};
std::vector<int> vec;
vec.push_back(100);
vec.push_back(200);
std::for_each(vec.begin(),vec.end(),F());
return EXIT_SUCCESS;
}
0731デフォルトの名無しさん
2005/11/08(火) 12:23:26はい
0732デフォルトの名無しさん
2005/11/08(火) 12:27:48ローカルに拘るんだったら以下のようにどうぞ
int main( void) {
- struct F {
- void operator()(const int & i) const {
+ struct Local {
+ static void F (const int & i) {
std::cout << i << std::endl;
};
};
std::vector<int> vec;
vec.push_back(100);
vec.push_back(200);
- std::for_each(vec.begin(),vec.end(),F());
+ std::for_each(vec.begin(),vec.end(),&Local::F);
return EXIT_SUCCESS;
}
0733730
2005/11/08(火) 12:28:30>14.3.1 Template type arguments
>2 A local type, a type with no linkage, an unnamed type or a type compounded from
>any of these types shall not be used as a templateargument for a template
>typeparameter.
>>731
ありがとうございます。
0735デフォルトの名無しさん
2005/11/08(火) 12:59:02一応、標準にはある仕様ってことで
ライブラリ側のクラス定義にexportキーワードを指定すればいいことになってるおw
0736デフォルトの名無しさん
2005/11/08(火) 13:58:25>unordered_map/setはどうなるんだろうね?
今の予定では insert メンバが呼ばれると無効化されるかもしれない,という仕様です.
ただし要素への参照やポインタの有効性は,その要素が削除されるまで常に維持されます.
また,load factor と bucket count の値から iterator が無効化されるかどうかを
事前に知ることができますし,rehash や max_load_factor を用いて
iterator が無効化されるタイミングをある程度調節することが可能です.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1745.pdf>>720
>>720
boost-sandbox に circular buffer があります.参考までに.
>>732
これはあくまで関数ポインタ経由のコールバックなので,関数オブジェクトに比べて
インライン化が効きにくくなるという状況はあるでしょうね.
0737デフォルトの名無しさん
2005/11/08(火) 19:39:11{
T* t;
Hoge(int n){ t = new T[n]; }
};
assert(Hoge<int>(10).t[0] == 0);
↑Tにプリミティブ型を入れたときにtの各要素を初期化する方法ってありますか?
T()を代入するのは非プリミティブ型のときにコストがかかるし・・・
全てのプリミティブ型に対して特殊化するのはスマートではないし・・・
0738デフォルトの名無しさん
2005/11/08(火) 19:48:06すぐ思いつくのは、
・std::uninitialized_fillを使ってT()で初期化する
・boostのtype_traitsで組み込み型を判別する
0739デフォルトの名無しさん
2005/11/08(火) 20:09:09ありがとうございます。
いずれもtype traitsですね。パクってみます。
0740デフォルトの名無しさん
2005/11/09(水) 12:17:21.*
これらはどういうものなんでしょうか?
0741デフォルトの名無しさん
2005/11/09(水) 13:11:27「メンバへのポインタ演算子」でググレ
0742デフォルトの名無しさん
2005/11/09(水) 13:26:50thx
0743デフォルトの名無しさん
2005/11/09(水) 16:33:52「newで生成したオブジェクトはポインタのスコープに関係なく存在するから」
みたいな説明がありますが、スコープに関係ないってのよくないですよね?
理解に苦しみます。
0744デフォルトの名無しさん
2005/11/09(水) 16:47:12>スコープに関係ないってのよくないですよね?
いいや。
0745デフォルトの名無しさん
2005/11/09(水) 16:49:220746デフォルトの名無しさん
2005/11/09(水) 16:54:50不定値な領域を確保したいときはどうするんだ?
0747デフォルトの名無しさん
2005/11/09(水) 18:41:29vtblがあるようなオブジェクトを実体化させる時困る。
0748デフォルトの名無しさん
2005/11/09(水) 18:54:140749デフォルトの名無しさん
2005/11/09(水) 19:19:360750デフォルトの名無しさん
2005/11/09(水) 19:38:25おそらく743はmallocとの違いを聞いているのではないと思う。
0751デフォルトの名無しさん
2005/11/09(水) 19:47:430752デフォルトの名無しさん
2005/11/09(水) 20:29:080753デフォルトの名無しさん
2005/11/09(水) 20:34:280754デフォルトの名無しさん
2005/11/09(水) 21:00:310755デフォルトの名無しさん
2005/11/09(水) 21:00:440756デフォルトの名無しさん
2005/11/09(水) 22:07:560757デフォルトの名無しさん
2005/11/09(水) 22:08:52環境依存は出て行け
0758デフォルトの名無しさん
2005/11/09(水) 22:35:26が、どのようにクラス設計すればいいのか、見当がつきません。
例えば、以下のようなコードがあります。(細かい文法ミスは勘弁してください。)
GUIのグリッドコントロールからデータを取得する処理、入力範囲をチェックする処理、
構造体の各メンバに突っ込む処理です。
3コのメソッドで似たような条件分岐があり、これを取り除こうと思うのですが、
どのようにしてよいかわかりません。
最初は各メンバをクラスにしようかと思ったのですが、
そうすると30コくらいの小さいクラスができてしまいます。
また、各メンバの型も異なります。
新規メンバが追加されたりしても、修正個所が少なくてすむような
クラス設計するにはどうしたらよいのでしょうか?
ご教授いただけませんでしょうか。
0759その2
2005/11/09(水) 22:36:16//グリッドからデータを取得(GUIクラスに記述)
void GetData( int nField, CString& Val )
{
switch( nField )
{
case 1://
Val = m_Grid.GetText( ROW_1, COL_DATA );
break;
case 2:
Val = m_Grid.GetText( ROW_2, COL_DATA );
break;
case 3:
Val = m_Grid.GetText( ROW_3, COL_DATA );
break;
// 以下略 30コくらい
}
0760その3
2005/11/09(水) 22:37:04int CheckData( int nField, CString Val )
{
switch( nField )
{
case 1:
if( ( -10 > atol( Val ) || ( 10 < atol( Val ) ){
return -1;
}else{
return 0;
}
break;
case 2:
if( ( 0 != strcmp( "A", Val ) ) && ( 0 != strcmp( "B", Val ) ) ){
return -1;
}else{
return 0;
}
break;
case 3:
if( ( 0 > atoi( Val ) || ( 5 < atoi( Val ) ){
return -1;
}else{
return 0;
}
break;
// 以下略 30コくらい
}
0761その4
2005/11/09(水) 22:37:27void SetVal( int nField, CString Val )
{
switch( nField )
{
case 1://
stData.Field1 = atol( Val );// long型
break;
case 2:
stData.Field2 = Val;// 文字列型
break;
case 3:
stData.Field3 = atoi( Val );// int型
break;
// 以下略 30コくらい
}
0762デフォルトの名無しさん
2005/11/09(水) 23:02:22GetData(), CheckData()とSetVal()があるクラスを
クラステンプレート(Traitsクラスを引数に取る)にしてしまうのをまず思いついた。
0763758
2005/11/09(水) 23:38:53>>762
即レスありがとうございます。
すいません。
私の力量不足の為、いまいち理解できておりません。
もしよろしければ、参考書籍、参考URL等を教えていただけませんでしょうか?
0764デフォルトの名無しさん
2005/11/09(水) 23:50:300765デフォルトの名無しさん
2005/11/10(木) 00:19:09それから、何故にこれだけ
stData.Field1, stData.Field2, stData.Field3
みたくなってるの?
0766デフォルトの名無しさん
2005/11/10(木) 00:25:18つhttp://www.amazon.co.jp/exec/obidos/ASIN/4894712288/250-1993348-1930636
0767デフォルトの名無しさん
2005/11/10(木) 00:26:16stData の構成自体から考え直した方が良い気もする
0768758
2005/11/10(木) 00:37:22ありがとうございます。
早速、購入してみます。
>>767
この構造体は多数のタスクが参照しており、
構成を変更することは無理なのです。
0769デフォルトの名無しさん
2005/11/10(木) 01:35:190770デフォルトの名無しさん
2005/11/10(木) 01:36:060771766
2005/11/10(木) 01:44:46いや、多態も使えてない様だから、もう少し基礎的な所から始めた方がいいと思う……
そういや、デザインパターン本で基礎的な所をカバーしたやつって見たことないなぁ
0772766
2005/11/10(木) 01:56:50>この構造体は多数のタスクが参照しており
データの管理がうまくいっていないような気がする……
まずは >767の通り、stDataの抽象化からかなあ。
さっきの本の「フィールドのカプセル化」を行って、「メソッドの移動」「クラスの抽出」
あたりを検討する……かな?
『今のコードはプロトタイプ』と割り切って再設計する手もあるけど。
0773デフォルトの名無しさん
2005/11/10(木) 05:15:08違うとしたらどこが違うの?
0774デフォルトの名無しさん
2005/11/10(木) 05:43:41コメント記号 // の扱いが違うだろ。
0775デフォルトの名無しさん
2005/11/10(木) 13:05:26遅レスだが、newを使う効用には「大きなオブジェクト」の確保ってのもあると思う。
関数内で大きなオブジェクトに対して自動変数を使うとオーバーフローしてしまうことがあるから。
ところで、関数用のスタックの大きさってどうやって調整すんだろう?>>誰か
0776デフォルトの名無しさん
2005/11/10(木) 13:09:02せっかく書き直してるんだから、その恥ずかしいcase文を
ダラダラ書いてるところから見直そう
0777デフォルトの名無しさん
2005/11/10(木) 13:09:37コンパイラスイッチ以外はシラネ。
0778デフォルトの名無しさん
2005/11/10(木) 13:10:570780デフォルトの名無しさん
2005/11/10(木) 13:50:170781デフォルトの名無しさん
2005/11/10(木) 13:52:300782デフォルトの名無しさん
2005/11/10(木) 13:58:190783デフォルトの名無しさん
2005/11/10(木) 14:03:210784779
2005/11/10(木) 16:38:26>>781のように親切に答えても>>782のようなレスがあるからだよ。
スタックって一般用語だって知らなかった>>782は痛い。痛すぎるが。
0785デフォルトの名無しさん
2005/11/10(木) 17:47:44ジェネレートすることってできるんですか?
昔のC++コンパイラはCのソースコードを
吐き出していたと聞きます。
今でもそれができるかどうかを教えてもらえませんか?
0786デフォルトの名無しさん
2005/11/10(木) 17:51:45出来ません
0787デフォルトの名無しさん
2005/11/10(木) 17:53:02昔のって、禿のcfrontのことか
comeauなら今でもそんな感じ(バイナリコード生成をするコンパイラを別途用意しなければならない)
0788デフォルトの名無しさん
2005/11/10(木) 18:39:06ありがとうございます。
調べてみます。
しかしcomeauって発音がよくわからないな・・
0789デフォルトの名無しさん
2005/11/10(木) 18:46:400790デフォルトの名無しさん
2005/11/10(木) 19:19:390791デフォルトの名無しさん
2005/11/10(木) 21:45:26std::cout << i << std::endl;
}
int main(){
boost::bind(&foo, _1)("3");
return 0;
}
↑は正しくコンパイルされて動くんだけど、
↓(引数がint)はコンパイルエラーになるのはなぜですか?
void foo(int i){
std::cout << i << std::endl;
}
int main(){
boost::bind(&foo, _1)(3);
return 0;
}
gcc3.4.4 boost1.33.0です
0792デフォルトの名無しさん
2005/11/10(木) 21:50:090793デフォルトの名無しさん
2005/11/10(木) 21:55:19http://www.boost.org/doc/html/lambda/le_in_details.html#lambda.rvalues_as_actual_arguments
0794デフォルトの名無しさん
2005/11/10(木) 22:01:03ありがとう! constじゃないといけないんですね
boost::lambda::make_constを使ってうまくいきました
0795616
2005/11/10(木) 23:11:170796デフォルトの名無しさん
2005/11/11(金) 01:33:07「std::string の実装は、時代遅れの最適化手法である書き込み時コピーを放棄しつつある」
ってあったんですが、COWって時代遅れなんですか?もっといい方法があるんですか?
0797デフォルトの名無しさん
2005/11/11(金) 01:48:02なんかCOW(というかリファレンスカウント?)はマルチスレッドで都合が悪いらしい。
そんで、いまは愚直にコピーしまくる代わりにアロケータを賢くすることで
パフォーマンスを稼ごうって流れだっけ?
0798デフォルトの名無しさん
2005/11/11(金) 02:01:38More Exceptional C++(英語) P118〜
COWはマルチスレッド時のパフォーマンス低下が甚だしいので、
従来の参照カウント方式を使わない方向の方が望ましいような
事が書いてある。
COWは遅延評価の一種であるため、mutexなどを使ってスレッド・
セーフにしないと、バグる理由が説明してある。
但し、シングル・スレッドで走らせるならば、50%程度のパフォー
マンス向上が望めるとも書いてある。
これ早く和訳されないかね〜
0799デフォルトの名無しさん
2005/11/11(金) 02:03:170800デフォルトの名無しさん
2005/11/11(金) 02:06:40俺そのために、More Effective C++は英語版も買ってしまった('A`)
こいつらを付き合わせて読まないと、意味が通らない所があるんで。
0801デフォルトの名無しさん
2005/11/11(金) 02:11:04漏れもだ('A`)
C++FAQとMoreEffectiveC++は原著を読んだ方がいい
0802デフォルトの名無しさん
2005/11/11(金) 08:10:36少々長文になってしまいますが。
自分の環境は、WindowsXP SP2、P4 2.6G HT
コンパイラはBCC 5.5.1です。
単なるローカル変数として宣言したもの同士の割り算、
100万回ループに掛かる時間が
int型同士 約0.769ms、float型同士 約16.763ms、double型同士 約54.38ms
(int a / int b 等)
なのですが、あるクラスのメンバー変数の場合、上記と同じ計算をすると、
int型同士 約22.725ms、float型同士 約16.581ms、double型同士 約16.649ms
(class a.a / class b.b 等)
と、int型が鼻糞な程遅くなります。
使ったコードはクラス、変数の宣言とループと時間計測に必要なコードのみの
単純な物でQueryPerformanceCounterで計測しました。
メンバー変数の場合、色々状況を変えて計測してみても、
ループに掛かる時間の変化はあってもintが絡む場合intだから早いという事にはならず、
結果としてはfloat型の変数が一番高速に計算できるという結果に。
クラスのメンバー変数になったとたんにint型だけが超低速になってしまうのが
どうしても納得いかないのです。
この辺りの事に詳しい方がいましたら、
どういう事でこうなってしまうのか教えて頂きたいのです。
(メンバー変数のint型が遅くなる理由とか)
宜しくお願します
0803デフォルトの名無しさん
2005/11/11(金) 09:23:540804デフォルトの名無しさん
2005/11/11(金) 10:43:29public:
void ff(const char* c){}
};
class B{
public:
void ff(const char* b){}
void foo(){
std::vector< const char* > v;
A a;
std::for_each(v.begin(), v.end(), boost::bind(&A::ff, &a, _1)); // (1)
std::for_each(v.begin(), v.end(), boost::bind(&B::ff, this, _1)); // (2)
}
};
(1)はOKですが(2)はコンパイルがとおりません。
自分のメンバ関数を呼ぶときはどう書くんでしょうか?
VC7.1 boost1.31
0805デフォルトの名無しさん
2005/11/11(金) 11:01:30VC7.1 boost1.33でコンパイル通ったけどなぁ
boost::bind
0806デフォルトの名無しさん
2005/11/11(金) 11:02:55boost::bind(boost::mem_fn(&B::ff), this, _1) にしてみては
0807デフォルトの名無しさん
2005/11/11(金) 11:37:16g++ 3.3.5 boost1.32でそれ通りますね
0808804
2005/11/11(金) 11:50:56class B が関数内クラスになってました。
class A{
...
};
void XXXX(){
class B{
...
};
...
}
class Bを外に出したらうまくいきました。
(が、なぜ関数内だと駄目なのかは理解していない・・)
0809デフォルトの名無しさん
2005/11/11(金) 15:14:22>>730-733
0810デフォルトの名無しさん
2005/11/11(金) 18:45:51笑いを堪えるのに必死。
0811デフォルトの名無しさん
2005/11/11(金) 22:16:49笑い終わったら理由を教えてくれないか
俺もわかんねぇぞw
0812デフォルトの名無しさん
2005/11/11(金) 23:15:37きっと >>810 はVIPPERなんだよ。
0813デフォルトの名無しさん
2005/11/12(土) 03:27:000814デフォルトの名無しさん
2005/11/12(土) 07:14:400815デフォルトの名無しさん
2005/11/12(土) 19:52:22int i = 12345;
(i >> 12) & 0xffff
みたいに任意の場所を2バイト整数として取り出すことができますが(プログラム正しいか?)
逆に値を設定するときはどうするの?
0816デフォルトの名無しさん
2005/11/12(土) 19:54:550817デフォルトの名無しさん
2005/11/12(土) 20:01:14そういう時のためのunion
0818デフォルトの名無しさん
2005/11/12(土) 20:58:02更地にしてからOR
0819デフォルトの名無しさん
2005/11/13(日) 01:27:34家建てたばかりなのでそれは勘弁・・・
0820デフォルトの名無しさん
2005/11/13(日) 02:18:50寒゛。
0821デフォルトの名無しさん
2005/11/13(日) 05:02:33ビット演算ってバイトオーナ関係なかったのか
定番の方法ってないんですね
とりあえず内部的には個別に整数でもってビットパターンがほしいときに(a<<32)|(b<<14)ってして返すようにした。
0822デフォルトの名無しさん
2005/11/13(日) 05:24:590823デフォルトの名無しさん
2005/11/13(日) 09:52:080824デフォルトの名無しさん
2005/11/13(日) 12:03:020825デフォルトの名無しさん
2005/11/13(日) 12:23:270826デフォルトの名無しさん
2005/11/13(日) 12:24:110827デフォルトの名無しさん
2005/11/13(日) 14:01:270828デフォルトの名無しさん
2005/11/13(日) 15:58:11int i=12345;
int mask= 0xffff<<12;
i&= ~mask; /*更地*/
i|= mask&(0xabcd<<12); /*セット*/
0829デフォルトの名無しさん
2005/11/14(月) 05:00:02template <class U>
U operator+(U i, U k){
return i + k + 2;
}
int main(){
printf("%d\n",2+2);
}
これでコンパイルすると"4"と表示されてしまうのですが、
演算子オーバーロードを有効にするには何が足りないのでしょうか?
0830デフォルトの名無しさん
2005/11/14(月) 05:01:30組み込み型の振る舞いを変えることは出来ない
operator+のパラメータのうち最低一つはユーザー定義型でなくてはならないから、
Uはintにはなりえない
0831デフォルトの名無しさん
2005/11/14(月) 05:13:42>operator+のパラメータのうち最低一つはユーザー定義型でなくてはならない
なるほど。試しに以下のようなコードをにしたら演算子オーバーロードが機能しました。どうもです。
#include<cstdio>
struct CLASS{};
template<class T, class U>
U operator+(T t, U k){
return sizeof(t) + k;
}
int main(){
CLASS cls;
printf("%f\n",cls+2.5);
}
0832デフォルトの名無しさん
2005/11/14(月) 05:25:23$gcc foo.cpp
でコンパイル実行できちゃっってた。なんでんだろ・・・
0833デフォルトの名無しさん
2005/11/14(月) 05:40:560834デフォルトの名無しさん
2005/11/14(月) 07:36:440835デフォルトの名無しさん
2005/11/14(月) 08:37:59c == 255;
このcの大きさが任意、例えば10バイトとかでも10進表現の文字列に変換したいんだけど
どうすればできる?
0836デフォルトの名無しさん
2005/11/14(月) 08:42:29頼むから初心者スレに行くか、問題を整理して書くかしてくれ。
0837デフォルトの名無しさん
2005/11/14(月) 17:23:290838デフォルトの名無しさん
2005/11/14(月) 20:55:28多倍長整数っていうのか。検索してみたけどある程度コードかかないとダメっぽいね
0839デフォルトの名無しさん
2005/11/14(月) 22:33:19また,以下みたいな generic な template-class の中で map の全要素を舐めたいときはどうすればよいのでしょうか?
template <class T>
struct X {
std::map<T,int> map_;
void func() {
for (std::map<T,int>::iterator itr = map_.begin();
itr != map_.end(); ++itr) {
cout << itr->first << " " << itr->second << endl;
}
}
};
0840デフォルトの名無しさん
2005/11/14(月) 22:38:28int> > >::iterator' is parsed as a non-type, but instantiation yields a type
note: say `typename std::map<T, int, std::less<_Key>, std::allocator<std::pair<const T, in\
t> > >::iterator' if a type is meant
コンパイルエラーくらい嫁よ。
0841デフォルトの名無しさん
2005/11/14(月) 22:38:51エラーメッセージぐらい書け
0842デフォルトの名無しさん
2005/11/15(火) 20:53:34インクルードしていないヘッダの定義を勝手に表示してくれたり
逆にインクルードしてても表示してくれなかったりわけがわかりません
mfc使ってないのに定義とか表示されると邪魔でしょうがないです
vs2003です
0843デフォルトの名無しさん
2005/11/15(火) 21:00:09ビルドした時点でそのファイル更新して
新規追加したヘッダーのも追加してるんじゃね?
詳しい解説は↓よろ
0844デフォルトの名無しさん
2005/11/15(火) 21:07:460845デフォルトの名無しさん
2005/11/15(火) 21:11:100846デフォルトの名無しさん
2005/11/15(火) 21:22:450847デフォルトの名無しさん
2005/11/15(火) 21:30:220848デフォルトの名無しさん
2005/11/15(火) 21:33:37これは何かの間違いですよね?(集成体の要件には仮想関数を持たないというのがありましたが)
0849デフォルトの名無しさん
2005/11/15(火) 21:52:32不便なままでいろってこと?w
0850デフォルトの名無しさん
2005/11/15(火) 21:53:520851デフォルトの名無しさん
2005/11/15(火) 21:55:310852デフォルトの名無しさん
2005/11/15(火) 22:18:10仮想関数にはvtblが要るじゃあないか。PODとは言えんよ。
0853デフォルトの名無しさん
2005/11/15(火) 22:25:40そう思ったのですが、ISOのドラフトやJISでさえ仮想関数があってはならないとは書いていないです。
0854デフォルトの名無しさん
2005/11/15(火) 22:26:25俺を無視スンナ
0855デフォルトの名無しさん
2005/11/15(火) 22:35:00ttp://pc8.2ch.net/test/read.cgi/tech/1129798459/785-796
0856デフォルトの名無しさん
2005/11/15(火) 22:36:34すいません。見逃していました。
ありがとうございます。疑問ははれました。
0857デフォルトの名無しさん
2005/11/15(火) 22:41:22おまえそこの791だろ
0858デフォルトの名無しさん
2005/11/15(火) 22:50:45どういう理由でそう思ったのかわからんが外れだ
0859デフォルトの名無しさん
2005/11/15(火) 23:02:50typedef T * (this_type::*unspecified_bool_type)() const;
typedef T * this_type::*unspecified_bool_type;
が使われているけど、もっと単純に、
不完全型のポインタ
struct unspecified_bool_type_tag;
typedef unspecified_bool_type_tag *unspecified_bool_type;
や、関数ポインタ
typedef void (*unspecified_bool_type)(void);
なんかじゃ駄目なのかな。
どこかに穴がある?
0860デフォルトの名無しさん
2005/11/15(火) 23:45:530861デフォルトの名無しさん
2005/11/16(水) 12:18:461234という入力を,2バイト分ずつ(12, 34)というように読みたいときに,
aとbをそれぞれ2バイト変数として定義して,
cin >> a >> b;
とやってもa=12, b=34とはならないんですが,
どうやったらうまくできますか?
cin >>の形ではできないんですか?
0862デフォルトの名無しさん
2005/11/16(水) 12:43:291234って16進数での話だよね?
というかその例だと1バイト分ずつだけど・・・
リトルエンディアンとして、
int tmp;
cin >> tmp;
a = tmp & 0xFF;
b = (tmp >> 8) & 0xFF;
じゃだめなん?
0863861
2005/11/16(水) 12:52:23入力は,あるフォーマットされたファイルなんですが,
そのファイルのヘッダ部分だけ一気に読みたいんです.
ヘッダには10個くらい項目があるので,
operator>>を定義して
cin一個で綺麗に読めないかなと思いまして.
0864デフォルトの名無しさん
2005/11/16(水) 13:26:48std::getline()で一度std::stringに読み取っておき、boost::lexical_castで
切り出して変換する。
0865デフォルトの名無しさん
2005/11/16(水) 13:27:43何かもったいない気がしたので。やろうと思えばできない事もないが。
0866デフォルトの名無しさん
2005/11/16(水) 14:01:25ついにboostを使うときが・・・.
いやよいやよと避けてきましたが,やってみます.
0867デフォルトの名無しさん
2005/11/16(水) 14:06:58template <class Target, class Source>
inline Target lexical_cast(Source source)
{
std::stringstream ss;
Target t;
ss << source;
ss >> t;
return t;
}
素人が適当に書いてみるテスト
普通はどう書くんだろう…
0868デフォルトの名無しさん
2005/11/16(水) 14:27:21オケ。
0869デフォルトの名無しさん
2005/11/16(水) 15:10:07無理でつか
0870デフォルトの名無しさん
2005/11/16(水) 15:17:540871デフォルトの名無しさん
2005/11/16(水) 15:48:26Cの関数に、vtblを解析できる能力と、thisを受け取る能力があればな。
0872デフォルトの名無しさん
2005/11/16(水) 17:38:56諦めてstaticにしる
0873デフォルトの名無しさん
2005/11/16(水) 17:42:40BCB(BCC)で__closure
0874デフォルトの名無しさん
2005/11/16(水) 18:26:470875デフォルトの名無しさん
2005/11/16(水) 18:31:060876デフォルトの名無しさん
2005/11/16(水) 18:35:530877デフォルトの名無しさん
2005/11/16(水) 19:04:08vtblはバーチャルリアルリアリティの世界に登場する机
Aggregateは睾丸だ
0878デフォルトの名無しさん
2005/11/16(水) 19:32:370879デフォルトの名無しさん
2005/11/16(水) 20:11:34無理。
でもWinAPIみたいに追加の引数を渡せるようになっていれば何とかなる。
0880デフォルトの名無しさん
2005/11/16(水) 20:59:050881デフォルトの名無しさん
2005/11/16(水) 21:09:040882デフォルトの名無しさん
2005/11/16(水) 21:29:27ウィンドウハンドルに好きなだけデータを関連付けられるから、そっちで何とかすればいい。
0883デフォルトの名無しさん
2005/11/16(水) 22:31:19実装依存だし、できたとしてもやっちゃダメだ。
0884デフォルトの名無しさん
2005/11/16(水) 22:37:21ウインドウをサブクラスして、あるクラスに処理させたいときはどうするの?
0885デフォルトの名無しさん
2005/11/16(水) 23:08:12違いがわからん
0886デフォルトの名無しさん
2005/11/16(水) 23:30:24GetPropでそのポインタを拾ってクラスに処理させればいい
ウィンドウを閉じる前にRemovePropするのを忘れずに
0887デフォルトの名無しさん
2005/11/17(木) 17:35:06IStream ← CStream(IStreamの実装)
↑ ↑
IFile(Open追加)← CFile(IFile::Openの実装)
class CStream : public IStream
interface IFile : public IStream
class CFile : public IFile, CStream
これだとIStreamの各関数が定義されていませんとエラーが出てしまいます。
IStream ← CStream(IStreamの実装)
♂
IFile(Open追加)← CFile(IFile::Openの実装)
class CStream : public IStream
interface IFile : public CStream
class CFile : public IFile
IFileの派生元をCStreamに、CFileの派生元をIFileにすれば
エラーは出ないのですが、何かしっくり来ません。
こういうモノなのでしょうか?
0888デフォルトの名無しさん
2005/11/17(木) 17:46:21IStream ← CStream<IStream>(IStreamの実装)
↑
IFile(Open追加)←CStream<IFile>(IFileのIstream部分を実装)←CFile(IFile::Openの実装)
とでもすれば?
0889デフォルトの名無しさん
2005/11/17(木) 19:05:15CFileの中でIStreamのメソッドそれぞれに対していちいち次のように親のメソッドを呼ぶ方法もないわけではない。
STDMETHODIMP Read(void *pv, ULONG cb, ULONG *pcbRead)
{
return CStream::Read(pv, cb, pcb);
}
ただ、そもそもIFile::Openの存在意義がわからない。何故必要?
0890887
2005/11/17(木) 19:23:56おぉ、ありがとうございます。
こんなかんじで出来ました。
template <class TYPE> class CStream : public IStream
interface IFile : public IStream
class CFile : public CStream<IFile>
ただ、IStreamからの派生物が増えてくると、お腹いっぱいになりそうです。
それとQueryInterfaceでIFileインターフェイスの取得が上手くいかなさげ??
>>889
その方法は面倒臭そうだったので止めました。
> ただ、そもそもIFile::Openの存在意義がわからない。何故必要?
え゛? 他にもIBufferとかICompressとか作って
IStreamでの一括管理がしてみたいから、としか…
COMに拘る理由は無いんですが、勉強にもなるかなと。
0891デフォルトの名無しさん
2005/11/17(木) 19:56:41×class CFile : public IFile, CStream
○
class CFile : public IFile
{
private:
CStream foo;
}
理由もなくprivate継承するな。
めんどくさがらずに、いちいち実装しろ。
0892デフォルトの名無しさん
2005/11/17(木) 20:07:09もひとつ
>890
×template <class TYPE> class CStream : public IStream
○template <class TYPE> class CStream : public TYPE
テンプレートを使うとなると、
実装をモジュールに封じ込めるために別のクラスが欲しくなる罠。
0893889
2005/11/17(木) 20:10:48template <class T> class CStream : public T
おそらく888はこうすることを考えていたはず。
ところで俺はIFile/CFileなどを作らずともSHCreateStreamOnFileとかで十分ではと思った。
0894887
2005/11/17(木) 20:51:42> 理由もなくprivate継承するな。
こ、これはバグです。
>892 >893
public TYPE
これで出来ました。何故なのかは後で考察します。
で、妄想を膨らませたらこうなりました。
template <class TYPE> class CStream : public TYPE
template <class TYPE> class CFile : public TYPE
CFile< CStream<IFileStream> >
> SHCreateStreamOnFile
更に悟りを開いた結果、これが全てを物語ってる気がします。
タイヤの発明 ('A`)
0895887
2005/11/17(木) 21:23:56template <class TYPE> class CStream : public IStream だと
>888 IStream ← CStream<IStream>(IStreamの実装)
固定になってしまうのか。
0896887
2005/11/18(金) 15:21:10でも、これって複数のinterfaceを継承する時どうするんだろ?
IArchive IStream
↑ ↑
IArchiveStream
CStream<IArchiveStream> (IArchiveStreamのIStreamの実装)
CArchive<IArchiveStream> (IArchiveStreamのIArchiveの実装)
だとすると
template <class TYPE> class CArchiveStream : public CStream<TYPE>, public CArchive<TYPE>
CArchiveStream<IArchiveStream>
または
template <class TYPE> class CArchiveStream : TYPE
CArchiveStream< CStream< CArchive<IArchiveStream> > >
前者はIStreamが未実装、後者はIUnknownの変換があいまい、てエラーが出る。
0897デフォルトの名無しさん
2005/11/18(金) 22:51:12正直なところ、
CArchiveStreamの実装が単純なCArchiveとCStreamからの横流しで
できるようなものなのかが疑問だが(それ故の多重継承じゃないのか?)
1.いちいち定義
class CArchiveStream : public IArchiveStream
{
private:
CArchive<IArchive> a;
CStream<IStream> s;
}
2.多重継承なインターフェイスが悪い
interface IArchiveStream
{
virtual IArchive &GetIArchive() = 0;
virtual IStram &GetIStream() = 0;
}
0898デフォルトの名無しさん
2005/11/18(金) 22:57:25ちゃんとしたキャストを実行すればよろし。
static_cast<IUnknown*>(static_cast<IArchive*>(this));か、
static_cast<IUnknown*>(static_cast<IStream*>(this ));かどっちかだろうが。
0899887
2005/11/19(土) 03:19:58レスありがとうございます。
> 多重継承なインターフェイスが悪い
なんとなくそんな気はしてました。
(887の最初のところも含めて)COMの理念にそぐわない設計なんだろーな、と。
キャストに関しては、テンプレートの利点を生かせるように試行錯誤してましたが
やはり明示的に指定してやらないとダメみたいですねぇ。
もうしばらくは色々な文献を漁ってみることにします。
0900デフォルトの名無しさん
2005/11/19(土) 03:46:01キャスト使う時点で設計ミスだ。static_castだとしても。
0901デフォルトの名無しさん
2005/11/19(土) 08:01:49C++用のlint は存在するのでしょうか?
0902デフォルトの名無しさん
2005/11/19(土) 08:51:13> > 多重継承なインターフェイスが悪い
>COMの理念にそぐわない設計
実際、COMのインターフェイスは単独継承しかできない仕様。(だからIArchiveStreamは存在できない)
(それを実装するときは好きなだけインターフェースを継承して実装できるがそれはCOMの世界でないから)
複数のインターフェイスをサポートしたければQueryInterfaceで対応することになる。
0903デフォルトの名無しさん
2005/11/19(土) 12:06:09ない。仮にあったとしたらそれは既にlintではない。
0904デフォルトの名無しさん
2005/11/19(土) 12:25:210905デフォルトの名無しさん
2005/11/19(土) 20:26:070906デフォルトの名無しさん
2005/11/19(土) 20:29:330907デフォルトの名無しさん
2005/11/19(土) 21:13:03つttp://makimo.to
0908デフォルトの名無しさん
2005/11/19(土) 23:45:11あれについてもう少しいろんな具体例が書かれているような本とかってある?
0909デフォルトの名無しさん
2005/11/20(日) 00:10:52Lokiソース
0910デフォルトの名無しさん
2005/11/20(日) 00:14:12サパーリ活用してないが。
0911デフォルトの名無しさん
2005/11/20(日) 00:30:51●買ったらID:???の板とかでも全部ID見えるって本当?
0912デフォルトの名無しさん
2005/11/20(日) 00:33:480913デフォルトの名無しさん
2005/11/20(日) 00:44:24ポリシーってアレだろ。
単に、テンプレート引数で与えられるクラスに「処理」を任せるようにして、
「処理」の中身を選択したり、自分で作ったりできるようにした。
ってだけの事じゃないのか?
0914デフォルトの名無しさん
2005/11/20(日) 13:44:13機能をポリシーに分解する具体例をたくさん見たいんだと思う。
0915デフォルトの名無しさん
2005/11/20(日) 14:14:09ModernC++Designで触れられてないコンポーネントもあるし。
他のライブラリでポリシーを前面に押し出したやつってあるかな?
0916デフォルトの名無しさん
2005/11/20(日) 14:50:440917デフォルトの名無しさん
2005/11/20(日) 16:18:09絡みが激しい
0918デフォルトの名無しさん
2005/11/20(日) 20:07:160919デフォルトの名無しさん
2005/11/20(日) 20:18:15明後日
0920デフォルトの名無しさん
2005/11/20(日) 20:18:330921デフォルトの名無しさん
2005/11/20(日) 20:45:220922デフォルトの名無しさん
2005/11/20(日) 22:53:09STLコンテナ(のアロケータ)
0923デフォルトの名無しさん
2005/11/21(月) 00:07:050924デフォルトの名無しさん
2005/11/21(月) 00:09:30ここではスレ違いだから、頑張れとしか言えない。
0925デフォルトの名無しさん
2005/11/21(月) 00:22:45頑張れ
0926デフォルトの名無しさん
2005/11/21(月) 00:49:48フォーマットを調べればいいと思う。
0927デフォルトの名無しさん
2005/11/21(月) 07:33:32というわけで頑張れ
0928923
2005/11/21(月) 08:01:430929デフォルトの名無しさん
2005/11/21(月) 10:41:50ATL のソース読んでみ。
Loki よりもだいぶ昔にかかれたものだけど、
スレッドモデル選択や、ウィンドウスタイル選択などは
Loki のポリシーに通じるものがある。
0930デフォルトの名無しさん
2005/11/21(月) 12:39:31ATL。MFCよりいい出来なのに、マニアックすぎて人気がいまいちなのが悲しい。
0931デフォルトの名無しさん
2005/11/21(月) 18:03:130932デフォルトの名無しさん
2005/11/21(月) 19:33:33a=10,b=15;
とするのと、
a=10;b=15;
とするのとでは違いというのはでるものなのですか?
0933デフォルトの名無しさん
2005/11/21(月) 19:59:310934デフォルトの名無しさん
2005/11/21(月) 20:33:45「副作用完了点」でぐぐってみ。上の式しか右辺値になれないし。
C++では左辺値にもなれるんだっけ。変態仕様だな。
0935デフォルトの名無しさん
2005/11/22(火) 10:29:44上は式が一つ。下は式が二つ。
実行結果に違いは無いので、下のほうが見た目に違和感が無くて好ましい。
式が一つしか書けない所では上を使うことになる。
0936デフォルトの名無しさん
2005/11/22(火) 10:55:48// n は出力する文字数
basic_ostream::write(const char_type *s, streamsize n);
を利用して出力すると思うのですが、basic_ostream< char > ならば、
n == 出力するバイト数になるので問題は無いのですが、
basic_ostream< wchar_t > の場合、sizeof(wchar_t) >= 1 のため、
バイナリデータをキッチリ出力するのは難しいような気もします。
basic_ostream< wchar_t > にバイナリデータをキッチリ出力する
上手い方法はないでしょうか。
0937デフォルトの名無しさん
2005/11/22(火) 10:58:090939デフォルトの名無しさん
2005/11/24(木) 19:42:04: m_var(0)
{ ... }
というメンバの初期化法を知ったのですが、これは
Hoge::Hoge()
{ m_var = 0; ... }
と同じことなのでしょうか?
0940デフォルトの名無しさん
2005/11/24(木) 19:45:00前者は初期化、後者は代入
0941デフォルトの名無しさん
2005/11/24(木) 19:50:38ありがとうございます
皆さんよく使われる方法なのでしょうか?
今まで私はコンストラクタ内にずらずらと代入してきましたが…
0942デフォルトの名無しさん
2005/11/24(木) 19:54:370943デフォルトの名無しさん
2005/11/24(木) 19:59:160944デフォルトの名無しさん
2005/11/24(木) 20:15:50constオブジェクトとか、オブジェクトのリファレンスは前者の初期化法しか
使えんよ。というか初期化忘れのコンパイルエラーが出る。
0945デフォルトの名無しさん
2005/11/25(金) 16:59:41初期化と代入の違いは大丈夫かい?
int i = 0;
と
int j;
j = 0;
は別物。可能な限り前者を使う。
0946デフォルトの名無しさん
2005/11/25(金) 17:18:06特に自動変数の時。
0947デフォルトの名無しさん
2005/11/25(金) 17:25:03かならず値を代入することが分かっていて、かつ最初の代入が
行われるより前に参照されることはないと分かっているのなら
しなくてもいい
0948デフォルトの名無しさん
2005/11/25(金) 19:47:27初期化しない自動変数はバグの温床。
0949デフォルトの名無しさん
2005/11/25(金) 19:51:29全ておkなんでクセ付けときな。
0950デフォルトの名無しさん
2005/11/25(金) 20:02:39int val;
// valを使った処理・・・
}
と、
int val;
for(;;){
// valを使った処理・・・
}
って、やっぱ後者のが早淫すか?
それともおんなじ?
0951デフォルトの名無しさん
2005/11/25(金) 20:13:32意味が違う。
後者がブロックの外でvalを使わないなら一般的には、全く同じコードを吐くと思われる。
#つーか、何で後者の方が速いと思うんだ? 最適化が蛸なら寧ろ前者の方が速くなることが期待できるぞ。
0952デフォルトの名無しさん
2005/11/25(金) 20:13:33初期化しない int なら同じ可能性がまあまあ高い。もちろんコンパイラ依存だけど。
0953デフォルトの名無しさん
2005/11/25(金) 21:58:02STL等の走査で、iterator の終端の判定用にインスタンス別に作ったほうが早いのかな?
1.
for(list<int>::iterator it = hoge.begin(); it != hoge.end(); ++it);
2.
list<int>::iterator end = hoge.end();
for(list<int>::iterator it = hoge.begin(); it != end; ++it);
前者のほうがソースとしては楽&見た目すっきりだけどどうなんでしょ?
0954デフォルトの名無しさん
2005/11/25(金) 22:14:590955デフォルトの名無しさん
2005/11/25(金) 22:22:400956デフォルトの名無しさん
2005/11/25(金) 22:41:440957デフォルトの名無しさん
2005/11/25(金) 22:55:400958デフォルトの名無しさん
2005/11/25(金) 22:56:21不満事を書いた瓦を頭で割ってるCMの、
ナレーターの台詞を思い出した
0959デフォルトの名無しさん
2005/11/25(金) 22:59:50実用的にはよほど効率を切り詰めたい部分でもなければ,毎回 end 呼んで構わないと思うけど.
0960デフォルトの名無しさん
2005/11/25(金) 23:15:32この例だと、実質同じコードになる希ガス。
0961デフォルトの名無しさん
2005/11/25(金) 23:34:53試したのか? 俺の環境では g++, cl, bcc32 のどのコンパイラでも異なるコードを生成したぞ?
0962デフォルトの名無しさん
2005/11/26(土) 00:26:280963デフォルトの名無しさん
2005/11/26(土) 02:35:460964デフォルトの名無しさん
2005/11/26(土) 02:44:06お前にとってはな。ということでさようなら。
0965デフォルトの名無しさん
2005/11/26(土) 03:01:37switch(c){
case 0: int i = 0 ;return i;
case 1: int i = 1; return i;
case 2: return 2;
}
面倒だからいい加減なサンプルだけどこれだとコンパイルエラーになる。
iをswitchの外側で定義すると初期化できないし。
case文の所を{}で囲めばいいんだけど正直見た目が悪いような。
0966デフォルトの名無しさん
2005/11/26(土) 09:22:19変数の使いまわしなんかするくらいなら、多少見た目は悪くとも
>case文の所を{}で囲めば
これ一択だと思いますけど。
0967デフォルトの名無しさん
2005/11/26(土) 09:33:19メッセージクラッカーを使うから半強制的に各caseの中身が関数に切り出されて、
そんな心配が要らなくなる。あくまで結果的にだけどね。
0968デフォルトの名無しさん
2005/11/26(土) 09:47:550969デフォルトの名無しさん
2005/11/26(土) 10:01:080970デフォルトの名無しさん
2005/11/26(土) 10:14:00たとえばWindowsでSendMessageで文字列をスレッド間で引き渡す場合、
ポインタだったらサブスレッドのスタックにある文字列を指していても、
SendMessageでWPARAMやLPARAMに乗っけてメインスレッドに渡せるじゃないですか。
参照は無理ですか?
0971デフォルトの名無しさん
2005/11/26(土) 10:50:100972デフォルトの名無しさん
2005/11/26(土) 11:05:360973デフォルトの名無しさん
2005/11/26(土) 11:24:350974デフォルトの名無しさん
2005/11/26(土) 11:25:34ポインタ
> 参照は無理ですか?
無理ではないがどっちかに統一したほうがいい
win32apiだとかを呼びまくる場所ではポインタのほうがいい
抽象化が十分になされた、アプリケーションロジックが主体のレイヤでは
参照のほうがいい
混ざってるのはたいへん見苦しいしバグの温床
0975デフォルトの名無しさん
2005/11/26(土) 12:24:23struct test *p = NULL;
int val;
try{
val = p->member;
}
catch(...){
std::cout << "例外をキャッチ" << std::endl;
}
またtryのなかを
val = 100/0;
とかに変更してみても、例外を投げずにアプリケーションエラーとなりました。
そういうものなんでしょうか?
WinXPでmingwを使用しています。
0976デフォルトの名無しさん
2005/11/26(土) 12:26:57そういうものです。
0977デフォルトの名無しさん
2005/11/26(土) 12:44:24自分で例外投げれ
0978デフォルトの名無しさん
2005/11/26(土) 12:48:420979デフォルトの名無しさん
2005/11/26(土) 13:06:38どうしたらうまくいくでしょうか?
以下のような感じなのですが
void example1 (){
MMAP testMap;
testMap.insert(Mvalue([配列]));
}
void example2(MMAP map){
for(MMAP::iterator i=testMap.begin(),end=testMap.end(); i!=end; i++){
cout << *i << endl;
}
}
0980デフォルトの名無しさん
2005/11/26(土) 13:11:21const参照で渡せば?
0981デフォルトの名無しさん
2005/11/26(土) 13:24:00Windowsには構造化処理例外(SEH)というのがある。
SEHではヌルポインタへのアクセスも例外となる。(その名称がNullPointerExceptionでないのが残念)
Winodws用のC++コンパイラは大抵C++例外の実装にこいつを使っているので、
そういう風にヌルポインタアクセスはcatchできる。
0982デフォルトの名無しさん
2005/11/26(土) 13:56:50サンキュ
0983デフォルトの名無しさん
2005/11/26(土) 14:05:40参照とポインタが実態としては同じと言うことは
どうにかコンパイラを騙せばポインタを渡す関数に参照を渡しても、その逆をやっても動きますか?
0984デフォルトの名無しさん
2005/11/26(土) 14:11:46具体的にはどのようにしたらよいのでしょうか?
0985デフォルトの名無しさん
2005/11/26(土) 14:12:010986975
2005/11/26(土) 14:12:06VC8 Expressのコンパイラで__tryと__exceptを使用してみると、確かにキャッチできました。
C++が勝手に投げてくれるのは、標準例外
http://www.02.246.ne.jp/~torutk/cxx/exception/stdexceptions.html
にあるものだけ、という認識でよいのでしょうか。
しかし、newで失敗してもbad_allocを投げないコンパイラがあったり(VCのことだと
思うのですが)するようですので、C++における標準例外の
位置づけがいまいちわかりません…
以下本題とは逸れるのですが。
書籍「.NET&Windowsプログラマのためのデバッグテクニック徹底解説」の記述によると
> catch(...)はC++例外を補足するだけでなく、SEH例外も捕捉することになっているのです
ということでした。
VC6+MFCのプログラムで、NULL参照をcatchしていたのを見て、てっきり
C++の機能で面倒見てくれているのだと思っていました。
# ただ、VC8で>>975を走らせても、やっぱり例外を捕捉してくれない…
# 記憶違い?
0987デフォルトの名無しさん
2005/11/26(土) 14:12:310988デフォルトの名無しさん
2005/11/26(土) 14:14:35newがNULLを返すか例外を投げるかは規定されてなかった希ガス
この2通りの内どちらかになるのは規定されてるが、どっちかはシラネ
0989デフォルトの名無しさん
2005/11/26(土) 14:16:54newが失敗してbad_allocを投げないのは規格違反。
VC7以降ならちゃんと投げるはず。
0990デフォルトの名無しさん
2005/11/26(土) 14:58:19規格上C++のcatchで受け取れるのは下に書いたのとあとはthrowされたもの。
bad_cast(dynamic_castで参照型のキャストに失敗したとき)
bad_typeid(動的なtypeidでヌルポインタが渡されたとき)
bad_exception(例外指定に合わない型の例外を投げようとしたとき)
0991デフォルトの名無しさん
2005/11/26(土) 19:33:02>前者のほうがソースとしては楽&見た目すっきりだけどどうなんでしょ?
for(list<int>::iterator it = hoge.begin(), end = hoge.end (); it != end; ++it);
とか
0992デフォルトの名無しさん
2005/11/26(土) 19:55:400993(*^ー゚)b グッジョブ!!
2005/11/26(土) 21:21:10http://pc8.2ch.net/test/read.cgi/tech/1133007604/
0994デフォルトの名無しさん
2005/11/26(土) 21:27:41class CTest1;
class CTest2;
class CTest1
{
public:
CTest2 *pCTest2;
};
class CTest2
{
public:
CTest1 *pCTest1;
};
0996デフォルトの名無しさん
2005/11/26(土) 22:27:19乙
0997デフォルトの名無しさん
2005/11/26(土) 23:08:410998デフォルトの名無しさん
2005/11/26(土) 23:53:400999デフォルトの名無しさん
2005/11/26(土) 23:54:331000デフォルトの名無しさん
2005/11/26(土) 23:55:0410011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。