C++相談室 part39
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
05/01/24 09:49:52ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いします。
IDE(VC++など)などの使い方の質問もその開発環境のスレに
お願いします。
前スレ part38
http://pc5.2ch.net/test/read.cgi/tech/1101473340/
過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0002デフォルトの名無しさん
05/01/24 09:50:482 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
0003デフォルトの名無しさん
05/01/24 09:51:5017 http://pc5.2ch.net/tech/kako/1047/10475/1047560042.html
18 http://pc5.2ch.net/tech/kako/1050/10501/1050177746.html
19 http://pc5.2ch.net/tech/kako/1052/10526/1052625846.html
20 http://pc5.2ch.net/tech/kako/1055/10551/1055162298.html
21 http://pc5.2ch.net/tech/kako/1057/10575/1057580107.html
22 http://pc5.2ch.net/tech/kako/1060/10603/1060361082.html
23 http://pc5.2ch.net/tech/kako/1062/10626/1062690663.html
24 http://pc5.2ch.net/tech/kako/1066/10665/1066546387.html
25 http://pc5.2ch.net/tech/kako/1067/10679/1067949669.html
26 http://pc5.2ch.net/test/read.cgi/tech/1070164402/ (迷子)
27 http://pc5.2ch.net/test/read.cgi/tech/1074454641/ (迷子)
28 http://pc5.2ch.net/test/read.cgi/tech/1077985164/
29 http://pc5.2ch.net/test/read.cgi/tech/1082047479/
30 http://pc5.2ch.net/test/read.cgi/tech/1084030770/
31 http://pc5.2ch.net/test/read.cgi/tech/1086185282/
32 http://pc5.2ch.net/test/read.cgi/tech/1088236078/
33 http://pc5.2ch.net/test/read.cgi/tech/1090180012/
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/
0004デフォルトの名無しさん
05/01/24 09:52:48[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/ (日本語)
0005デフォルトの名無しさん
05/01/24 09:53:40amazon.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/
0006デフォルトの名無しさん
05/01/24 09:55:15■Books(Templateまわり)■
Effective STL
http://www.amazon.com/exec/obidos/ASIN/0201749629/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
http://www.amazon.com/exec/obidos/ASIN/0201704315/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
http://www.amazon.com/exec/obidos/ASIN/0321227255/
0007デフォルトの名無しさん
05/01/24 09:56:01[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
[他]
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
0008デフォルトの名無しさん
05/01/24 12:17:14【C++】template 統合スレ -- Part6
http://pc5.2ch.net/test/read.cgi/tech/1101384692/
どこかで誰かがC/C++の宿題を片付けます 38代目
http://pc5.2ch.net/test/read.cgi/tech/1105541524/
C/C++でのWindowsPrograming議論スレ(質問お断り)
http://pc5.2ch.net/test/read.cgi/tech/1049790146/
managed C++ やろうぜ!!
http://pc5.2ch.net/test/read.cgi/tech/1014486422/
ATL/WTL Part3
http://pc5.2ch.net/test/read.cgi/tech/1095442366/
0009デフォルトの名無しさん
05/01/24 12:18:180010デフォルトの名無しさん
05/01/24 12:19:19環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
0011デフォルトの名無しさん
05/01/24 12:20:36すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
0012デフォルトの名無しさん
05/01/24 12:21:30#include <stdafx.h>
後氏ね。
0013デフォルトの名無しさん
05/01/24 12:22:27言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0014デフォルトの名無しさん
05/01/24 13:16:43個人的に技術系スレで【】は勘弁
0015デフォルトの名無しさん
05/01/24 13:23:040016デフォルトの名無しさん
05/01/24 13:23:110017デフォルトの名無しさん
05/01/24 13:26:08しかも総合スレだしな
0018デフォルトの名無しさん
05/01/24 13:26:570019デフォルトの名無しさん
05/01/24 13:37:160020デフォルトの名無しさん
05/01/24 15:16:25普通に淡々と書けばいいのにな
0021デフォルトの名無しさん
05/01/24 15:26:090022デフォルトの名無しさん
05/01/24 17:29:17STLに関しては、スレタイに含めず>>1に書けば十分な気もするけどな。
どのみちtemplateスレもstlじゃ引っかからないんだし。
0023デフォルトの名無しさん
05/01/25 14:44:050024デフォルトの名無しさん
05/01/26 21:58:08class point{
private:
int x;
int y;
public:
point(int a,int b){x = a; y = b;}
virtual void show();
};
void point::show()
{
cout << "x:" << x << endl;
cout << "y:" << y << endl;
}
class 3Dpoint:public point{
private:
int z;
public:
3Dpoint(int a,int b,int c):point(a,b){z = c;}
void show();
};
void 3Dpoint::show()
{
cout << "x:" << x << endl;
cout << "y:" << y << endl;
cout << "z:" << z << endl;
}
0025デフォルトの名無しさん
05/01/26 22:03:553Dpoint ←数字で始まる識別子は許されない。
0026デフォルトの名無しさん
05/01/26 22:05:11あと、基底クラスのメンバをprivateにしているが、これだと派生クラスからアクセスできない。
protectedにすべき。
0027デフォルトの名無しさん
05/01/26 22:14:31どうもです。
コンパイルできました。
0028デフォルトの名無しさん
05/01/27 09:52:580029デフォルトの名無しさん
05/01/30 22:03:270030デフォルトの名無しさん
05/02/04 01:52:120031森
05/02/04 09:28:35例え:車3d画像)、サンプル source code がございませんか?
教えて頂ければ、幸いです。有難う。
Email: [email protected]
0032デフォルトの名無しさん
05/02/04 09:52:14外人さんですか?
0033デフォルトの名無しさん
05/02/04 23:06:00なんでエラーメッセージを読まないのか知りたい。
0034デフォルトの名無しさん
05/02/07 17:04:160035デフォルトの名無しさん
05/02/08 02:28:02でリークチェックしたんですが、ファイル名、行番号が表示されない。
どなたか原因分かる方いらっしゃいませんでしょうか。
リーク情報は表示されますがファイル名、行番号のみが表示されません。
#define CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
の順で記述してます。
_CrtSetDbgFlagマクロは、プログラムエントリポイント始めに記述。
VC++スレが無いのでここで質問させて頂きました。
0036デフォルトの名無しさん
05/02/08 03:42:10あんたの目は節穴か?
http://pc5.2ch.net/test/read.cgi/tech/1104843249/
http://pc5.2ch.net/test/read.cgi/tech/1101931660/
0037デフォルトの名無しさん
05/02/08 03:47:420038デフォルトの名無しさん
05/02/12 09:32:10日本以外では共通なのかな。
私は英語とタイ語ぐらいしか分からないけど
0039デフォルトの名無しさん
05/02/25 13:43:540040デフォルトの名無しさん
05/03/02 00:04:380041デフォルトの名無しさん
05/03/04 01:54:21http://pc5.2ch.net/test/read.cgi/tech/1106466303/
↑の次スレとして再利用する?
0042デフォルトの名無しさん
05/03/04 02:18:41うん。
0043デフォルトの名無しさん
05/03/04 09:54:21テキストファイルの一行の処理1024バイトについて。
0044デフォルトの名無しさん
05/03/04 10:50:581行全部読みきる必要があるならそれなりに処理しなければいけないのは言うまでもないとして。
私のところでは、設定ファイルみたいなものを処理するときには1行200バイト以内という前提で書くことが多い。
あー、そう言えば1024なんて仮定はしたことないな。その長さのテキストファイルを想定するなら素直に全部読みきる対処するから。
0045デフォルトの名無しさん
05/03/04 10:59:150046デフォルトの名無しさん
05/03/04 11:14:36fgets使う意味でもさ。
0047デフォルトの名無しさん
05/03/04 11:18:340048デフォルトの名無しさん
05/03/04 11:21:37状況によるんじゃ。
テキストファイル 「全般」 に対して処理することが要求されるなら、
一行の文字数によって、無条件に読めない部分があってはならない。
プログラムのconfigファイルを処理したいなら、そのconfigファイルの仕様によって変わる。
configファイルでは(おそらくコンソールの横幅との歴史的関係で)一行80文字くらいにすることが多い。
この場合は1024文字でも(あるいは256文字でも)差し支えないだろう。
最も、configファイルに限定するなら、boost::program_optionsの使用を検討した方が良いかもしれない。
付け加えるなら、行という概念で扱うより、XMLなど行依存のないフォーマットを採用するのも手だ。
クラスのコンストラクタあたりに
class X {
const size_t size_;
public:
X(const size_t& size = 1024) : size_(size) {};
};
とデフォルト値を忍ばせる手もあるのかな。スマートじゃないな。
0049デフォルトの名無しさん
05/03/04 11:22:580050938
05/03/04 11:26:44A B C
/\ /\ /\
D E F G
| | | |
H .I. J K
\/ \/ \/
L M N
/\ /\ /\
O P Q R
\ | × | /
S T
\/
U
0051デフォルトの名無しさん
05/03/04 13:08:280052デフォルトの名無しさん
05/03/04 13:37:24利用用途を考えて見たが、
A B
/\ /\
D E F
まずここから用途が無い
0053デフォルトの名無しさん
05/03/04 13:59:00つまり、一行読むのに可変長で読むか固定長で読むかは
C++の範囲で選択できるんじゃないの?
C言語の関数使う必要ない気もする。
streamにしとけば、いろいろSTLの恩恵受けられる可能性あるしさ。
0054デフォルトの名無しさん
05/03/04 15:51:46std::istream::getlineは選べるが、std::stringに文字列を格納するstd::getlineは文字数を指定できない。
0055デフォルトの名無しさん
05/03/04 17:35:27Windowsのc++コンパイラでコンパイル時間が一番速いのってどれよ?gcc?やっぱVCのcl?
0056デフォルトの名無しさん
05/03/04 17:39:50コンパイル時間が速いとは? 時間が速いと言う概念は理解しかねるのだが。
#俺の時間は速いがお前の時間は遅いとでも言うのかな?
0057デフォルトの名無しさん
05/03/04 17:40:480058デフォルトの名無しさん
05/03/04 18:15:49コンパイル開始からビルドが終わるまでにかかる時間はbccが速かった。
ただしbccはnamespaceやtemplate周りがイマイチ。最適化もイマイチ。
そもそも漏れはtemplate厨なのでビルド時間はデフォルトで長いのと
言語の標準サポート具合や最適化の質のが重要なファクタなので
Win32/64環境で動作するC++コンパイラのビルドに要する時間は気にしない方がいいんじゃ。
Boostに書いてあったコンパイラリスト↓
* GNU C++ 2.95.x, 3.0.x, 3.1.x, 3.2
* Comeau C++ 4.2.45.2
* SGI MIPSpro 7.3.0
* Intel C++ 5.0, 6.0
* Compaq's cxx 6.2
* Microsoft Visual C++ 6.0, 7.0
* Borland C++ 5.5.1
* Sun WorkShop 6 update 2 C++ 5.3
* Metrowerks CodeWarrior 8.1
0059デフォルトの名無しさん
05/03/04 18:57:110060デフォルトの名無しさん
05/03/04 19:24:35>その長さのテキストファイルを想定するなら素直に全部読みきる対処するから。
全部読みきる時点で素直ではないでしょ。
単に、チョー長い行を扱う場面に遭遇しなかっただけだと思う。
普通は弾く。自分の想定外の長さは弾いてこそ、安全なわけで。
0062デフォルトの名無しさん
05/03/05 00:24:55どんな入力がくるか分からない、ということを想定する程度には、どんな仕様があるか分からない、
ということも想定するべきではないか?
その意味で 1024 超えは想定(゚�听)イラネ には釈然としないものを感じる。
0063デフォルトの名無しさん
05/03/05 00:55:48これが全てだろう。
で、どんな仕様が良いのかって話が別に存在するんだろうて。
0064デフォルトの名無しさん
05/03/05 08:00:25struct aaa{ void f(){} } a;
template<class T>struct bbb{ void f(){} } <int> b;
int main()
{
a.f();
b.f();
return 0;
}
0065デフォルトの名無しさん
05/03/05 08:24:26クラステンプレート使う意味がないジャン。
006664
05/03/05 11:17:070067デフォルトの名無しさん
05/03/05 11:58:46不可能
0068デフォルトの名無しさん
05/03/05 12:56:14あるか?
0069デフォルトの名無しさん
05/03/05 13:51:57これはだめ?
template<class T>struct bbb{void f(){}static bbb x;};
template<class T>bbb bbb::x;
int main()
{
bbb<int>::x.f();
}
0070デフォルトの名無しさん
05/03/05 13:54:55template<class T>bbb<T> bbb<T>::x;
0071デフォルトの名無しさん
05/03/05 18:16:21使いたいのですが、こうやって空関数を作らないと、コンパイルが通りません。
何か、空関数を使わないで、コンパイルを通す方法無いでしょうか?(VC6)
class CAa
{
public:
CAa() {printf("bone aa\n"); }
CAa(string s) {printf("bone(%s)\n", s); }
virtual void print() = 0;
};
class CMona : public CAa
{
void print() { printf("mona\n"); }
public:
CMona(string s) {} // ここ
};
class CGiko : public CAa
{
void print() { printf("giko\n"); }
public:
CGiko(string s) {} // ここ
};
void main()
{
string s = "hage";
CMona mona(s);
CGiko giko(s);
CAa* pAa;
pAa = &mona;
pAa->print();
}
0072デフォルトの名無しさん
05/03/05 18:24:25コンストラクタは継承されない。
よって、省略できない。
0073デフォルトの名無しさん
05/03/05 18:38:06デフォのコンストラクタは継承されるのに?
0074デフォルトの名無しさん
05/03/05 18:43:20継承されるわけではなくて、自動生成されると考えた方が分かりやすいと思う。
struct base {base(){}};
struct derived : public base{};
の場合、derivedのデフォルトコンストラクタが次のように生成される。
struct derived : public base { derived(){}};
で、これはbaseのコンストラクタを明示的に呼び出していないから、
baseのデフォルトコンストラクタが使われる。
struct derived : public base {derived() : base() {}};
結果的に、継承されたように見える。
007574
05/03/05 18:46:14デフォルトコンストラクタは自動生成されない。
たとえば、>>71の例でCMonaにデフォルトコンストラクタはない。
このことからも、デフォルトコンストラクタが継承されないと分かると思う。
0076デフォルトの名無しさん
05/03/05 19:27:15すんまそ。ここ読んで、もう一度出直します
http://www.kab-studio.biz/Programing/Codian/Cpp/05.html
0077332
05/03/06 03:48:20・仮想関数=上書きされちゃう関数
・仮想継承=共用されちゃうクラス
・仮想デストラクタ=派生デストラクタも呼ぶデストラクタ
という事になるよな?
一貫して無くないか?皆はどうやってこの紛らわしい物を納得してるんだ。
0078デフォルトの名無しさん
05/03/06 03:53:19C++流。static とかもそうだな。
0079デフォルトの名無しさん
05/03/06 04:07:38純粋仮想関数の =0; ってのもなかなか苦しいよな
0080デフォルトの名無しさん
05/03/06 04:40:330081デフォルトの名無しさん
05/03/06 06:48:07C#みたいに気持ちよくOOできないし
0082デフォルトの名無しさん
05/03/06 07:00:43使用しているコンパイラが何か(マニファクチャとバージョン)を識別するマクロが
掲載されているところを知りませんか?
0083デフォルトの名無しさん
05/03/06 09:40:480084デフォルトの名無しさん
05/03/06 10:09:41> C++使うケースだとOO使わないでtemplateにしちゃうんだよね。
それだとコンパイル時に確定しない動的バインディング使えないじゃん。
ありえんよ。
0085デフォルトの名無しさん
05/03/06 10:46:15でも、コンパイル時にできることはコンパイル時にやっちゃおう、って気にはなる。
0086デフォルトの名無しさん
05/03/06 13:01:400087デフォルトの名無しさん
05/03/06 14:22:59その手の極論を言うなら、アセンブリ言語でも OO できる、というところに辿り着く。
なんか詭弁のガイドライン通りの展開でアレだが。
0088デフォルトの名無しさん
05/03/06 15:41:030089デフォルトの名無しさん
05/03/06 15:43:160090デフォルトの名無しさん
05/03/06 16:18:28毛の生えた女と生える前の女くらいのさ。
0091デフォルトの名無しさん
05/03/06 16:26:31・毛が生えているからこそ女だ
・毛の生えていない女しか無理だ
・実は毛のない方が好きだが、生えていても問題なく行える <- 俺は、この辺
・どちらも駄目だ
0092デフォルトの名無しさん
05/03/06 18:03:07毛の生えた女と生える前の女は、雲泥の差だがな(・∀・)
0093デフォルトの名無しさん
05/03/06 18:10:26virtualな継承・・・・ 一度だけ菱形継承するためにやった
いまは反省している
0094デフォルトの名無しさん
05/03/06 20:30:550096デフォルトの名無しさん
05/03/06 21:50:06仮想継承はそれ以外に使い道は無いのかな
0097デフォルトの名無しさん
05/03/07 03:11:59外道な使い方だが、「派生禁止」。
0098デフォルトの名無しさん
05/03/07 21:00:40全然外道じゃない。そういう考え方もある。
0099デフォルトの名無しさん
05/03/07 21:14:240100デフォルトの名無しさん
05/03/08 11:59:40毛が生えていれば剃ればいいじゃない
マリーアントワネット
0101デフォルトの名無しさん
05/03/08 13:06:570102デフォルトの名無しさん
05/03/08 14:50:000103デフォルトの名無しさん
05/03/08 15:39:55全然外道じゃない。そういう考え方もある。
0104デフォルトの名無しさん
05/03/08 16:28:410105デフォルトの名無しさん
05/03/09 09:10:06そのために生まれたのがJavaだし。
0106デフォルトの名無しさん
05/03/09 12:46:36↓のように STL の map に値を格納した場合,pair のメモリの解放は
どのように行えば良いのでしょうか?
hmap->insert(new pair<hoge, int>(new hoge(), 0));
「new hoge()」の方は以下のコードでクリア出来るのは分かるのですが,pair
の方はどうすれば良いのか分からず困っています.
for (typename hoge_map::const_iterator i = hmap->begin(); i != hmap->end(); i++) {
delete i->second;
}
アドバイスお願いします.
0107デフォルトの名無しさん
05/03/09 12:52:32それ、コンパイル通る?
0108デフォルトの名無しさん
05/03/09 13:00:14pairへのポインタを格納してるなら、delete *iでいけるべ。
0109106
05/03/09 14:42:36hmap->insert(hpair);
delete hpair;
でいけました.
(念のため,memset で hpair を上書きした後も hmap を通じてアクセス出来ることも確認しました.)
delete *i はダメみたいです.
あと,もとのコードでは typename つけないと implicit declaration とかい
うエラーが出てました.gcc v3.3.5 です.
0110デフォルトの名無しさん
05/03/09 14:49:54boost::shared_ptrでも使ったら?
0111デフォルトの名無しさん
05/03/09 17:03:13std::mapにはstd::pairを格納するわけだが、そのポインタをinsertするって?
ポインタでなかったとして、std::map<hoge*, int>なのにi->secondをdeleteって?
delete i->first;の間違いだったとして、std::mapのkeyを変更するって?
deleteするくせにconst_iteratorって?
0112デフォルトの名無しさん
05/03/09 17:33:200113108
05/03/09 22:50:26いったいなぜpairをnewで生成する必要がある?根本的に間違っている。
0114111
05/03/09 23:42:10何もかもnewしようとしているところを見ると、もしかして君は普段
JAVAをやってるんじゃないか?ソースをさらした方が何をしたい
のかも分かるし、それに対してC++ではどういう風にソースを書く
のかも示される可能性が高いぞ。
0115デフォルトの名無しさん
05/03/09 23:49:340116デフォルトの名無しさん
05/03/10 00:06:02BCBもnew多用する罠。(Delphi型クラスはnewでしか生成できない)
0117デフォルトの名無しさん
05/03/10 00:14:50ネタはネタだと…
0118106
05/03/10 01:04:56本当はこんな感じです.(まだおかしなところがあるかも)
fbpair = new pair<foo , bar>(new foo(), new bar());
fbmap->insert(*fbpair);
delete fbpair;
> いったいなぜpairをnewで生成する必要がある?根本的に間違っている。
ある関数から,pair<foo , bar> * を返して,それを map に格納してるからそういう構成にしてます.
pair<foo , bar> だと NULL が返せないので,いまのところ,ポインタを使ってます.また,
pair<foo , bar> hbpair(new foo(), new bar());
return &hbpair;
とかだと,return した直後に hbpair がなくなるのでダメですよね?NULL 使
わずに例外を使え,ていう話もあるかもしれませんが,NULL を返すのはそれほ
ど例外的な状況ではないので出来れば避けたいです.
> 何もかもnewしようとしているところを見ると、もしかして君は普段
> AVAをやってるんじゃないか?ソースをさらした方が何をしたい
> のかも分かるし、それに対してC++ではどういう風にソースを書く
> のかも示される可能性が高いぞ。
はい,その通りです.構文としては理解できても,new しないオブジェクトと
いうのがどうにも自分のなかで整理できてくて困ってます.
0119デフォルトの名無しさん
05/03/10 01:28:19map::insert()の仕様をよく読むのが先決。
0120デフォルトの名無しさん
05/03/10 01:35:42落ち着け。さもなくばもっと注意深くあれ。
0121106
05/03/10 01:58:44すみません.おっしゃる意味がよく分かりません.
もう少しわかりやすく教えて頂けないでしょうか?
http://www.wakhok.ac.jp/~sumi/stl/header/map.html#insert によると,次の
ようになってます.
> // xを挿入し、挿入された位置を指すイテレータと成否のペア(pair)を返す。
> pair<iterator, bool> insert(const value_type& x);
引数はリファレンスとして受け取る(?)ようですが,これと関係あるのでしょう
か?
0122デフォルトの名無しさん
05/03/10 02:23:57君のやりたいことは次で事足りる。むやみにnewを使うな。
std::pair<foo, bar> make_foo_bar()
{
return std::make_pair(foo(), bar());
}
int main()
{
std::map<foo, bar> fbmap;
fbpair = make_foo_bar();
fbmap.insert(fbpair);
}
0123デフォルトの名無しさん
05/03/10 02:25:20というか1からC++の勉強をしなおせ。そもそもメモリについて理解してない。
0124122
05/03/10 02:30:29#include <map>
#include <utility>
struct foo{int x;};struct bar{};
bool operator<(const foo& a, const foo& b){return a.x < b.x;}
std::pair<foo, bar> make_foo_bar()
{
return std::make_pair(foo(), bar());
}
int main()
{
std::map<foo, bar> fbmap;
std::pair<foo, bar> fbpair = make_foo_bar();
fbmap.insert(fbpair);
}
0125デフォルトの名無しさん
05/03/10 02:44:082ch上で教えてもらおうなんて虫が良すぎる。
0126デフォルトの名無しさん
05/03/10 05:44:25ttp://www005.upp.so-net.ne.jp/episteme/html/stlprog/
0127デフォルトの名無しさん
05/03/10 07:16:24「知ってるが、お前の態度が気に入らない」
のAAおながいします。
0128デフォルトの名無しさん
05/03/10 07:25:54多分お前はJavaすらまともに理解してない。
そんな状態でC++をやったら混乱してさらにひどいことになるぞ。というかなってる。
0129デフォルトの名無しさん
05/03/10 09:54:17setにはinsertするためのメンバ関数が2つ
ありますよね。値のみを指定するものと、
ヒントとなる位置を反復子で一緒に渡すものと。
で、setはユニークでなくてはならないので、挿入失敗
のケースがあるかと思います。前者のメンバ関数だと
pair型が帰ってきてbool値で成功失敗が判断できますが
後者のメンバ関数の戻り値は反復子だけですよね?
なぜ後者は成功失敗のフラグを返さないのでしょうか?
0130106
05/03/10 10:03:51{
return std::make_pair(foo(), bar());
}
情報不足ですみません.これだと,make_foo_bar() から NULL を返せないので,
ダメなんですが.元のコードは以下のようになってます.
std::pair<foo, bar> *hbpair;
while ((hbpair = make_foo_bar_p()) != NULL) {
hbmap.insert(*hbpair);
delete hbpair;
}
そもそも C++ ではこういった書き方はしないものなんでしょうか?
0131デフォルトの名無しさん
05/03/10 10:18:54悪いことはいわんからC++の入門書100回読み返せ。
0132デフォルトの名無しさん
05/03/10 10:21:47deleteしてどうする。
どう考えても筋悪すぎ。
0133デフォルトの名無しさん
05/03/10 10:27:13C++やりたいんだったら入門書一冊くらいは
読めっつーの。
0134106
05/03/10 10:36:57つまり,C++ では(普通)そういった書き方はしない,ということで良いでしょうか?
>> 130
std::pair<foo, bar> *hbpair;
while ((hbpair = make_foo_bar_p()) != NULL) {
hbmap.insert(*hbpair);
memset(hbpair, 'a', sizeof(std::pair<foo, bar>));
delete hbpair;
}
のようにしても,後から hbmap の中身に問題なくアクセス出来たんで,
delete しても問題ないと思ったんですが,違うのでしょうか?
すぐ delete するなら new するな,というのは分かるんですが,それだと
make_foo_bar_p() から NULL 返せないのでどうしたものかと.
手元に プログラミング言語 C++ あるんで,大体どのあたりが参考になりそう
か教えて頂けないでしょうか?
0135デフォルトの名無しさん
05/03/10 10:38:39初めて半年経ってからEffectiveC++は読んだけど。
0136デフォルトの名無しさん
05/03/10 10:39:50勉強しても身に付かないよ、きっと。
C++ とか、言語どうこうじゃない。
0137デフォルトの名無しさん
05/03/10 10:40:34それは読んでるっていうだろ
ってわざとか?
0138135
05/03/10 10:48:41いやぁ、昔から入門と名のつくものは読まないもんで。
EffectiveC++も読んで驚いたよ。半年試行錯誤したことがみんな書いてあったから。
それから半年経つからそろそろ何か読もうと思ってるところ。
0139106
05/03/10 10:50:45std::map<foo *, bar *> fbmap;
foo *f;
bar *b;
while (make_foo_bar_x(&f, &b)) {
hbmap.insert(std::pair(f, b));
}
のようにしろ,ってことですか?
0140デフォルトの名無しさん
05/03/10 11:07:400141106
05/03/10 11:14:200142デフォルトの名無しさん
05/03/10 11:15:27・make_foo_barが返す値はいつでも有効というわけではない。そのため、返り値が有効かどうか確かめる手段が必要。
・有効な値だった場合、そのペアをmapに挿入したい
・無効な返り値は結構な頻度で発生するため、例外は使えない
ということですか?
0143106
05/03/10 11:16:46はい,その通りです.
0144106
05/03/10 11:53:30情報隠匿の点からいってちょっと気持ち悪く感じるのですが,C++ ではそこは
我慢するものなんでしょうか?
0146デフォルトの名無しさん
05/03/10 12:08:46誰も>>122,124に突っ込まないのか?
0147デフォルトの名無しさん
05/03/10 12:11:04>ああいった感じで処理すると pair の中身がむき出しになってしまって,
>情報隠匿の点からいってちょっと気持ち悪く感じるのですが,
それならそもそもmapは使うな。
foo*, bar*をメンバにもつ十分隠蔽されたクラスを定義して
それをsetなりvectorなりに格納汁。
ともかくC++以前にヴァカ過ぎ。
0148デフォルトの名無しさん
05/03/10 12:16:49map::insert()の引数渡し時にstd::make_pair()の利用を推奨する
愚劣な解説書の存在も問題だな。
・・・ま、俺も持ってるんだけどね、その解説書。
0150106
05/03/10 12:32:36他にも,いろいろとやりようはあるでしょうけど,手軽にやるなら typdedef ってことで.
0152デフォルトの名無しさん
05/03/10 12:36:41ポインタをキーにするってか。
つか、挿入できたかどうか見ないなら
hbmap[f] = b;
でいいじゃんか。態々 pair 使わずとも。
0153106
05/03/10 12:47:55あー,なるほど.入門書よめっていわれてた理由が分かりました.ありがとうございます.
現段階では,map に入れた後は,iterator を通してしかアクセスしてなかった
ので,ダメダメだということに気づけませんでした.
> つか、挿入できたかどうか見ないなら
> hbmap[f] = b;
> でいいじゃんか。態々 pair 使わずとも。
いわれてみればそうですね.
0154106
05/03/10 12:54:37で
> ああいった感じで処理すると pair の中身がむき出しになってしまって,
といったのは誤りで,
> ああいった感じで処理すると pair の定義がむき出しになってしまって,
の方が正しかったです.つまり,どの型とどの型の pair かがむき出しになっているという意味です.
pair で使う型変えたときに,make_foo_bar の宣言も書き換えるの面倒じゃん,ってことです.
なので >>149 で typedef の話が出てきてます.
0155106
05/03/10 12:57:09map や pair の方は当たり前のように typdef してますです.
変なこといってすみません.
0156>>129
05/03/10 12:59:05それとも設計者にしかわからないことなんでしょうかね。
0157デフォルトの名無しさん
05/03/10 13:05:54他のコンテナとインターフェースを合わせるため。
挿入に失敗=すでに同じ項目があった
だから、特別に失敗をチェックする理由が無いなら
問題にはならない。
0158129
05/03/10 13:26:48統一のためですか。
でもまぁ引数1つだけのバージョン使えばいいだけですよね。
挿入のヒントになる反復子ってのもよくわからないし。
0159デフォルトの名無しさん
05/03/10 13:34:490160129
05/03/10 14:40:37自動的に保とうとしますよね?内部構造は木構造のようですが。
ということは挿入位置は自動的に決まるわけなんですが、
それでもヒントになるiteratorを与えるとすこし速くなるとか
なんでしょうか。ヒントっていってもいまいちピンとこないですが。
0161デフォルトの名無しさん
05/03/10 14:46:360162デフォルトの名無しさん
05/03/10 15:07:41自分でset風のものを実装してみるとわかるけど、何かの初期化などで沢山の
ものを挿入したいときのために、N個の追加を O(N^2)とか O(N log)N ではなく
O(N log log N)程度で実行するための手段を用意したくなるのは人の常。
・・・あとでメンテが面倒になって、インタフェイスだけのこって実装はタダの
O(N log N)の挿入に変更されてしまう、というのもありがちだけど。
0163デフォルトの名無しさん
05/03/10 15:21:34車輪を再発明した人たちが必ず通過する。
お前だけじゃない。安心汁。涙
0164デフォルトの名無しさん
05/03/10 15:28:35それは、若いほどダメージが少ないw
若い頃にSTLみたいなのをまねして作るのは良いこと。
年食ったら無駄な時間
0165129
05/03/10 16:10:16ことにできるってことですか?じゃ、ヒントの位置が先の位置だったら
遅くなるのですか?
0166デフォルトの名無しさん
05/03/10 16:20:240167デフォルトの名無しさん
05/03/10 16:32:082分木風の構造に対する要素の追加ってのは、
a. 追加するべき位置を探す処理
b. 追加する処理
c. 追加した後の木の構造を適当に保つ処理
からなるわけだけど、初期化や以前に保存したファイルからの読み込みなどで
大量追加したい場合、「昇順に追加するから a は省略できんか」と思うでしょ?
そのためのヒントですよ。
0168デフォルトの名無しさん
05/03/10 16:46:370169129
05/03/10 17:00:49実装に依存してるってことですか?
0170デフォルトの名無しさん
05/03/10 17:17:08ピンポン
0171デフォルトの名無しさん
05/03/10 18:00:100172デフォルトの名無しさん
05/03/10 18:33:45実際のトコは昇順か降順に前回のinsertが返してきた iter をヒントにしてinsertすると効率が良い、
ってことだと思ってるけど。ランダムな要素を追加していくならヒントは使えない、と。
0173デフォルトの名無しさん
05/03/12 22:36:180174デフォルトの名無しさん
05/03/12 22:38:01クソレスしてんじゃねぇ知的障害。
おまえどうせ無職だろw
0175デフォルトの名無しさん
05/03/12 22:39:430176デフォルトの名無しさん
05/03/12 22:41:42クソレスしてんじゃねぇ痴女。
おまえどうせ無職だろw
0177デフォルトの名無しさん
05/03/12 22:55:38死んで下さい
0178デフォルトの名無しさん
05/03/12 23:01:550179デフォルトの名無しさん
05/03/12 23:08:13class A と class B があったとして、
class A
{
class B
......................
}
上記のように、class A の中に class B と書くのは
どういう意味でしょうか?
関連のときは、B *b
集約のときは、B b
と書くのはわかりますが。。
0180デフォルトの名無しさん
05/03/12 23:19:47インターフェイスは公開されているが
実装は完全に隠蔽したいケースかな。
AbstractFactoryで使うことが多いかな。
0181デフォルトの名無しさん
05/03/12 23:21:400182デフォルトの名無しさん
05/03/12 23:26:230183デフォルトの名無しさん
05/03/12 23:34:380184デフォルトの名無しさん
05/03/12 23:39:370185デフォルトの名無しさん
05/03/12 23:41:440186デフォルトの名無しさん
05/03/12 23:45:130187デフォルトの名無しさん
05/03/12 23:49:10見えちゃうけど、Bって言うのはAを使う人にも見えてるYO
0188デフォルトの名無しさん
05/03/12 23:51:14private は可視性制御ではなくアクセス制御だな確かに
0189デフォルトの名無しさん
05/03/12 23:52:100190179
05/03/12 23:52:49名前を外に見せる必要がないと言われても、よくわからないです。。
すみません、もう少し詳しく書くと、
class A
{
class B;
.....................
vector < B *> b;.
}
vector で関連を定義しているのに、さらにclass B と書く意味が
わからないのですが。
0191デフォルトの名無しさん
05/03/12 23:54:16namespace A
{
class B { /* ・・・ */ };
}
と同じだよね?
0192デフォルトの名無しさん
05/03/13 00:00:57前方宣言。
Bというクラスがありますよ、とコンパイラに知らせてる。
普通はBをincludeするんだけど、それができない理由があるんだろ。
0194デフォルトの名無しさん
05/03/13 00:06:03任意のURLをブラウザ(IE)で表示させるときに、ShellExecuteを使用しています。
ShellExecute(Handle, "open", URL, NULL, NULL, SW_SHOWNORMAL);
上記だと、リンクするたびに同じIEウインドウ上に表示されてしまいます。
これを別のウインドウに表示させる方法はありますか?
具体的にイメージしているのはHTMLのtargetタグのようなコントロールです。
よろしくお願い致します。
0195デフォルトの名無しさん
05/03/13 00:10:00スレ違い。
APIスレに逝け。
0196デフォルトの名無しさん
05/03/13 00:35:290197デフォルトの名無しさん
05/03/13 00:37:210198デフォルトの名無しさん
05/03/13 01:14:41gcc で分割コンパイルを行うと、a.cpp で
throw runtime_error("あいうえお");
みたいに投げた例外を、b.cpp で
try {
} catch(exception &ex) {
cerr << "Error: " << ex.what() << endl;
}
として catch すると ex.what() の中身が St9exception になってしまいます。
何が問題なのでしょうか?
a.cpp で catch した場合は正しく「あいうえお」となります。
以下の用にして確認しました。
} catch(exception &ex) {
cerr << "Error: " << ex.what() << endl;
throw ex;
}
0199デフォルトの名無しさん
05/03/13 04:27:58News 2005-03-11: The C++ Standard Library Issues List (Revision 35) is available
News 2005-03-11: C++ Standard Core Language Issues List (Revision 34) is available
0200デフォルトの名無しさん
05/03/13 09:47:27throw ex; → throw;
0201デフォルトの名無しさん
05/03/13 21:00:57メンバ変数をコンストラクタで初期化中に例外が発生すると、
デストラクタが発動しない。だからスマートポインタを使え・・・
ってのはよく聞きますが、実際どのくらい使われているのかと思って。
0202デフォルトの名無しさん
05/03/13 21:06:58あんまり使わない
欲しい機能がいちいち保証外だから
0203デフォルトの名無しさん
05/03/13 21:15:45俺はよく使うかな。
でもコンストラクタ中での例外に対処するために使うことはない。
bad_alloc以外が発生しそうな処理はコンストラクタに含めないようにしてる。
0204デフォルトの名無しさん
05/03/13 21:24:52保証外の欲しい機能って何?
不完全型によるインスタンス化ができないのは痛いと思ってるけど、
ほかにもあれば教えて。
>>203
メンバやベースクラスの初期化時に bad_alloc が発生したらどう対処してんの?
その基準じゃ、結局 auto_ptr 相当の必要性に変わりが無いんじゃない?
0205デフォルトの名無しさん
05/03/13 21:34:580206デフォルトの名無しさん
05/03/14 03:01:390207デフォルトの名無しさん
05/03/14 03:04:320208デフォルトの名無しさん
05/03/14 03:13:08コンテナに入らないから参照型も使いませんってか?
0209デフォルトの名無しさん
05/03/14 03:30:26何より標準で入ってるってのがでかい
0210デフォルトの名無しさん
05/03/14 09:39:51クラスを作るときに、コンストラクタを1つも定義しなかった場合、
そのオブジェクトを作るときに何もしないデフォルトコンストラクタが
呼び出されるのかと認識していたのですが、とある本には、コンストラクタを
1つも定義しない場合は、コンストラクタが呼び出されないという表現になって
いました。動きとしては変わらないですが、どちらが正解なんでしょうか?
てっきりデフォルトコンストラクタを自分で定義することは、オーバーライド
することだと思ってましたが、デフォルトコンストラクタを定義せずに他の
コンストラクタを定義した時点で、デフォルトコンストラクタが使えなくなる
という点では、ちょっと異質ですよねぇ。
0211デフォルトの名無しさん
05/03/14 09:52:21「何もしないデフォルトコンストラクタが呼び出される」が正解。
だがデフォルトコンストラクタを自分で定義することは、
ちょっと異質な点があることからわかるように、オーバーライドすることではない。
0212デフォルトの名無しさん
05/03/14 10:04:27その「とある本」の題名を晒した後、焼き払え。
0213210
05/03/14 10:12:35そうですか、やはりコンストラクタはいかなるときも呼び出される
わけですね。
ちなみに読んだ本は「C++ Primer」ですが、翻訳本ですし、自分の
とり方が間違った可能性もあるので、もう一度読み返してみます。
今は手元にないですが・・・。
0214デフォルトの名無しさん
05/03/14 11:32:19class complex {
T re, im;
public:
complex& operator+=(complex a) {
re += a.re;
im += a.im;
return *this;
};
// ...
};
この定義で、complex a, b; a += b;といったコードが書けるようになります。
このクラスに、例えばdouble型の値を加算する、double d; a += d;を実現するには
complex& operator+=(double a) { re += a; return *this; };
をメンバに追加します。
ここで、double型に限らず、T型とのoperator+=が定義されている任意の型との加算を
実現するには、
template<class T> complex& operator+=(T a) { re += a; return *this; };
と書きたくなります。ところが、これではテンプレートのTがcomplexを含んでしまうため、
template<> complex& operator+=<complex>(complex a);
と特殊化を定義します。が、これはコンパイルが通りません、、
このように、「complex型(自分自身)」の場合と、それ以外の型の場合とで処理を分けるには
どう書けば良いのでしょうか。
0215デフォルトの名無しさん
05/03/14 11:35:51「complex型(自分自身)」の場合を非templateで宣言して、
それ以外の型の場合に使われるtemplateを宣言したのではダメですか?
0216デフォルトの名無しさん
05/03/14 11:37:31コンパイルが通りませんって、エラーメッセージくらい貼れよ。
0217デフォルトの名無しさん
05/03/14 12:06:31- T re, im;
+ double re, im;
const complex& aのようにリファレンス使えといった点は、単純化のため考えないとしてください。
>>216
main.cpp:42: error: explicit specialization in non-namespace scope `class complex'
main.cpp:42: error: invalid use of undefined type `class complex'
main.cpp:37: error: forward declaration of `class complex'
main.cpp:42: error: abstract declarator `complex&()(complex)' used as declaration
main.cpp:42: error: syntax error before `{' token
main.cpp:44: error: syntax error before `+=' token
main.cpp:47: error: syntax error before `}' token
main.cpp: In member function `complex& complex::operator+=(T) [with T = complex]':
main.cpp:54: instantiated from here
main.cpp:41: error: no match for 'operator+=' in 'this->complex::re += a'
37: class complex {
38: double re, im;
39: public:
40: complex() : re(0), im(0) { };
41: template<class T> complex& operator+=(T a) { re += a; return *this; };
42: template<> complex& operator+=<complex>(complex a) {
43: re += a.re;
44: im += a.im;
45: return *this;
46: };
47: };
0218デフォルトの名無しさん
05/03/14 12:11:07その場合、template<class T> 〜operator+=(T a)の定義はインスタンス化は行われないのですか?
つまり、コンパイラは、正確に一致する場合(§7.4[禿3rd]の[1])と、それ以外とを識別するので
テンプレートの特殊化を使わなくてもいいということですか?
次のコードはコンパイルが通り、望み通りの動きをします:
complex& operator+=(complex a) { re += a.re; im += a.im; return *this; };
template<class T> complex& operator+=(T a) { re += a; return *this; };
0219デフォルトの名無しさん
05/03/14 12:15:05コピーコンストラクタの大量発生が起きない?
0220デフォルトの名無しさん
05/03/14 14:59:06・複数のプログラムからそれぞれDLLがロードされたら
1.スレッドもメモリも共有される
2.そんなバナナ
・同じプログラムから複数回DLLがロードされたら
1.スレッドもメモリも共有される
2.そんなバナナ
0221デフォルトの名無しさん
05/03/14 15:05:430222デフォルトの名無しさん
05/03/14 15:07:13上:2(やろうと思えばメモリの共有は出来る)
下:1
同一プロセスなのかどうかが分かれ目。
0223デフォルトの名無しさん
05/03/14 15:47:01実際には const 参照渡しすべきですが、>>217で書いたとおり、単純化のためと考えてください。
>>218
調べ直したところ、「§13.3.2 関数テンプレートの多重定義」[禿3rd]に
多重定義解決規則が載っていました。疑問は晴れました。
例(これも引数は本来const T&とすべきです):
class complex {
double re, im;
public:
complex() : re(0.0), im(0.0) { };
complex(double a, double b) : re(a), im(b) { };
virtual complex& operator+=(complex a) { re += a.re; im += a.im; return *this; };
template<class T> complex& operator+=(T a) { re += a; return *this; };
};
これを使い、
complex a(5.0, 3.0), b(2.0, 4.0); double d = 10.0;
a += b; // ok, 多重定義解決規則[4]適用
a += d; // ok, T=double
complexを継承した場合、すなわち
class dcomplex : public complex {
public:
friend class complex;
dcomplex(double a, double b) : complex(a, b) {};
};
の場合の挙動について微妙に気になる点がありますが、それについてはもうちょっと整理します。
0224デフォルトの名無しさん
05/03/14 16:50:10http://www.biwa.ne.jp/~chu0296/laboratory/vcl1-50.html#vcl49
こんなことがやりたいんじゃないのか
0225デフォルトの名無しさん
05/03/14 17:06:47TlsAlloc()で取得したインデックスってどうやってスレッド毎に管理してるんだ?
呼び出しもとのスレッドから引数が渡されてるようにも見えんし、dllマネージャ
みたいのがいて、管理してんのかな。
0226デフォルトの名無しさん
05/03/14 17:07:570227デフォルトの名無しさん
05/03/15 13:37:22たとえばソートの基準の型(クラス)でMyCmpクラスをつくってですね、
MyCmp mcmp;
set<int> iset(mcmp);
のようにsetのコンストラクタ引数にソートの基準を定めるオブジェクトを
わたしてやるという寸法です。このMyCmp自体は、コンストラクタ引数で
なんらかの情報をうけとり、それによりソートの基準を変化させるように
すれば、動的に基準を変えることができるかと思います。
MyCmp mcmp(MyCmp::desc); //クラス内でenum型{asc, desc}を定義 デフォルトはasc
set<int> iset(mcmp);
ここで思ったのは、一時オブジェクトわたせばいいのでは?ということでやってみると
set<int> iset(MyCmp()); // ok
set<int> iset(MyCmp(MyCmp::desc)); // エラー VC++.net
ということになってしまいました。
もともと一時オブジェクトを渡すこと自体が、文法エラーなのでしょうか?
それとも渡し方に問題があるのですかね。
あと、エラーメッセージが、関数がどうたらとわけわからんものでしたので、
もしや関数の宣言としてとられたりとか、そういうことなのでしょうか?
ちなみにこれは「標準C++ライブラリ チュート&リファ」の内容を参考にした
のですが、同書ではいったんオブジェクトを作成してましたね。
この問題は、どう考えればいいのでしょうか?
0228デフォルトの名無しさん
05/03/15 13:48:36不可能
0229デフォルトの名無しさん
05/03/15 13:49:450230227
05/03/15 13:54:04set<int>じゃなくてset<int, MyCmp>ですかね。
0231デフォルトの名無しさん
05/03/15 14:17:430232227
05/03/15 14:22:31前の話ですよ?その前の段階でMyCmpオブジェクトの振る舞いを制御
するということですよ。一度setオブジェクト作ったら基準は変えませんよ。
0233デフォルトの名無しさん
05/03/15 14:52:180234デフォルトの名無しさん
05/03/15 14:58:51要するに述語のインスタンスに(降順か昇順か等の)状態を持たせて,
それをsetやmapに渡してソートの基準を制御しようとしているんですか?
だとすると言えるのは以下です.
-setやmapには述語のインスタンスを渡す方法は存在しない.
テンプレート引数として渡すことができるだけ
-そもそも述語に状態を持たせるのは基本的に避けるべき
-set<int> iset(MyCmp());が通るのはいわゆる「最も奇妙な解析」の結果.
227さんが期待しているものとは全く異なる
0235227
05/03/15 15:01:12setのインスタンスを確保する前段階で、MyCmpオブジェクトの
パラメータを動的にいじり、振る舞いを変えることは可能ですよね?
動的の意味を、setの生存期間中にという意味にはき違えてるのでは?
というかなぜ質問してる自分がレクチャーしてるのだろう・・・鬱
0236234
05/03/15 15:01:48>-setやmapには述語のインスタンスを渡す方法は存在しない.
> テンプレート引数として渡すことができるだけ
これ間違いです.すいません.
0237234
05/03/15 15:04:05これが関数宣言として認識されているんじゃないですか?
set<int> iset((MyCmp(MyCmp::desc)));
としてみるとか.
0238デフォルトの名無しさん
05/03/15 15:04:08「引数を取らずMyCmp型を返す関数」へのポインタを引数として取り、
set<int>型を返す関数isetの宣言ですな。
0239227
05/03/15 15:05:43おお、ようやく本題に・・・w
MyCmp mcmp(MyCmp::desc); //クラス内でenum型{asc, desc}を定義 デフォルトはasc
set<int> iset(mcmp);
これは可能ですよね?というか、可能です。
setやmapのコンストラクタには、ソートの基準を引数として受け取るものがあるので。
これができるということを受けて、一時オブジェクトでは?という話です。
0240デフォルトの名無しさん
05/03/15 15:07:080241デフォルトの名無しさん
05/03/15 15:07:110242デフォルトの名無しさん
05/03/15 15:07:37>>230でいけるはず。
>>234
explicit set( const Compare& comp = Compare(),
const Allocator& allocator = Allocator() );
setのデフォルトコンストラクタは比較関数オブジェクトを引数にとるんだよ。
ただし一度生成されたsetの持つ比較関数オブジェクトの状態を変更する
ことは当然出来ないが、227氏はそれを承知しているみたいだ。
0243デフォルトの名無しさん
05/03/15 15:08:43ならできるだろ? Cがmogeをコンストラクタ引数に取れる関数オブジェクトである必要があるが。
0244227
05/03/15 15:10:58やっぱりそう解釈されてしまいますかね。
それを回避するテクニックで、
set<int, MyCmp> iset(MyCmp(MyCmp::desc));
において、コンストラクタの引数となっているMyCmp(MyCmp::desc)をさらにカッコで囲み
set<int, MyCmp> iset((MyCmp(MyCmp::desc)));
とやってもダメなようです。たとえ関数宣言の誤解を解いたとしても
一時オブジェクトを渡すのはだめなのでしょうかね。
0245デフォルトの名無しさん
05/03/15 15:17:24パラメータを括弧でかこってもダメだから問題になってるんあろ
アホか
0247デフォルトの名無しさん
05/03/15 15:22:00パラメータを括弧でくくったら宣言としては不正だよ
0248デフォルトの名無しさん
05/03/15 15:26:29VCはその初期化を関数宣言だとみなした上で文句を言っている。
確か、規格では、関数宣言として正しくなければ、
初期化として見直さなければいけないはずだから、これはVCが悪いと思う。
g++3.4.1(mingw)だと通ったし。
0249デフォルトの名無しさん
05/03/15 15:26:34いや,それで通らないのはおかしいです.一時オブジェクトを受け付けるはずです.
疑うとすればMyCmp::descあるいはMyCmpのコンストラクタかと.
0250デフォルトの名無しさん
05/03/15 15:28:260251デフォルトの名無しさん
05/03/15 15:28:560252デフォルトの名無しさん
05/03/15 15:31:23std::set<int, my_cmp> s(my_cmp(static_cast<my_cmp::order>(my_cmp::desc)));
(orderはdescの型)
0253デフォルトの名無しさん
05/03/15 15:31:24cl ver13.10.3077でコレ通った。多重の括弧を除くと、insert()の行で
「isetが'overloaded-function'だ」と言うお叱りを受ける。
#include <set>
struct MyCmp
{
enum rule {asc, desc} r_;
MyCmp() : r_(asc) {}
MyCmp(rule r) : r_(r) {}
bool operator()(int x, int y)
{
return r_ == asc ? x < y : x > y;
}
};
int main()
{
std::set<int, MyCmp> iset((MyCmp(MyCmp::desc)));
iset.insert(3);
}
0254デフォルトの名無しさん
05/03/15 15:32:39set<int,MyCmp> iset( MyCmp( MyCmp::desc ) );
set<int,MyCmp> iset( ( MyCmp( MyCmp::desc ) ) );
この2つでテストしてダメならエラーメッセージを提示してくれ。
上はともかく下は通るはずだ。
通らなかったら、MyCmpが怪しい。
0255248
05/03/15 15:32:560256デフォルトの名無しさん
05/03/15 15:39:10MyCmp::desc は変数名としても型としてもおかしいし
0257デフォルトの名無しさん
05/03/15 15:40:54昨日実験してだめだったコードは、本から引っ張ってきたものですが
今、家ではないので正確にはわかりません。
帰宅してから、貼り付けます。夜になってしまうと思いますが。
0258デフォルトの名無しさん
05/03/15 15:41:05#include <set>
class MyCmp{
public:
enum order{asc, desc};
MyCmp(order const &o)
{ }
};
int main(){
std::set<int, MyCmp> iset(MyCmp(MyCmp::desc));
//std::set<int, MyCmp> iset((MyCmp(MyCmp::desc)));は通る
}
error C2751: 'desc' : the name of a function parameter cannot be qualified
一重のカッコが通らないのはVCの欠陥でしょうね,恐らく.(>248)
0260デフォルトの名無しさん
05/03/15 15:43:300261デフォルトの名無しさん
05/03/15 15:44:21だめだった。
0262デフォルトの名無しさん
05/03/15 15:46:54トンクス
VC は相変わらず詰めが甘いですなあ
0263デフォルトの名無しさん
05/03/15 15:51:45Metrowerks CodeWarrior for Windows v8.3でも
std::set<int, MyCmp> iset(MyCmp(MyCmp::desc));が関数宣言だとみなされる。
0264デフォルトの名無しさん
05/03/15 16:05:21struct S {
S(int);
};
void foo(double a) {
S w(int(a));
}
(ISO/IEC 14882:1998 8.2 Ambiguity resolution -1 Exampleより)
0265デフォルトの名無しさん
05/03/15 16:12:46そのwはint型引数aをとるSを返す関数でしょ
今回のとはちと違うと思う
0266デフォルトの名無しさん
05/03/15 23:18:05無いものを呼び出すことはできんがなあ……
暗黙に何もしないデフォルト・コンストラクタが合成されることはないはず……
0267デフォルトの名無しさん
05/03/15 23:26:500268デフォルトの名無しさん
05/03/16 00:07:000269デフォルトの名無しさん
05/03/16 00:22:59std::string first;
std::string second;
};
は、safe だろうか、out だろうか。
コンストラクタを定義しないと、インスタンスを作った時に
何もされないと思ったので、std::string のコンストラクタも
呼ばれなくて、まずいんちゃうかと思ったんだが…
実際、BC++ で実験してみたが、特に問題なく動作してしまっている。
std::string を自前のクラスにしてみたところ、ちゃんと
メンバーのコンストラクタも呼ばれているみたいなんだが、
これって、処理系依存コードなんだろか。規格上は、どうなってんだろ。
(その Effective C++ とかの本を持ってないので、教えてくれー)
0270デフォルトの名無しさん
05/03/16 00:31:49そいつは包含(コンポジション)だから、クラスそのもののコンストラクタの有無に
関わらず、クラスメンバのデフォルトコンストラクタが呼び出される。
0271デフォルトの名無しさん
05/03/16 00:32:500272デフォルトの名無しさん
05/03/16 00:33:110273デフォルトの名無しさん
05/03/16 00:39:16ありがとん。それを聞いて一安心だ。
マジで感謝!
# C言語経験済みのC++初心者に、
# 「std::string 使えー」と言っちゃった時に
# struct の中で使われて、ハマらないか心配だったんだ。
#
# コンストラクタを説明するのが面倒というわけじゃないんだけど
# 一度に説明すると、頭があふれちゃう人が多いから…
0274デフォルトの名無しさん
05/03/16 00:45:19コンストラクタを宣言しなければ、 class C に対して
C() {} というコンストラクタが暗黙のうちに定義される。
コンストラクタの初期化リストに現れないメンバに対しては
それぞれデフォルトの初期化が適用される。
デフォルトの初期化では、PODは不定値となり、
それ以外はデフォルトコンストラクタが実行される。
(PODに対しては「何も行わない」という実装が可能)
0275デフォルトの名無しさん
05/03/16 00:48:55デフォルトコンストラクタは呼び出されないや。規格書だなこういう時は。
0276269
05/03/16 01:03:29ふむふむ、なるほど。
POD って、文脈からすると、古典的な型(int とか、コンストラクタの無い構造体)っぽく
聞こえますが、そういう認識でオケーでしょうか?
あと、調子に乗って、も一つお聞きしたいんですが、
以上を踏まえると、コピーコンストラクタの未定義時の動作も
メンバ単位でのコピーコンストラクタ呼び出しを試みてくれると
考えてよろしい…んでございますよね?
いや、実験はして、呼び出してくれてるみたいなんで、
多分、そうなんかなとは思うんですが。
(この夜中にしょうもない質問につきあっていただき、実にありがたく)
0277デフォルトの名無しさん
05/03/16 01:15:45そんなに心配なら、規格なりFDISなり読めよ。
0278デフォルトの名無しさん
05/03/16 01:17:11あー、たしかに調子に乗りすぎました。
とりあえず、ここまで教えていただいただけでも
とても助かりました。どうも、ありがとうございました。m(_ _)m
0279デフォルトの名無しさん
05/03/16 01:20:52このやり取り見てて思ったんだが(馬鹿な質問だったらすまん)内包クラスのことだよな?
つまり、クラスの中で宣言されてるクラスの事、と認識したんだけど合ってる?
合ってるなら話を先に進めて、内包クラスって外からもクラス定義として見えるの?
見えるんだったら内包する意味がわからないし、
見えないんだったらこの会話がおかしいよな。
っていうか、俺がおかしいのか?
0280デフォルトの名無しさん
05/03/16 01:30:35「内包クラスのことだよな?」って、何を指して言ってるのかもわからないし、
「内包クラス」自体もはっきりわからない。
つまり、おまえがおかしい。
0281デフォルトの名無しさん
05/03/16 01:38:230282デフォルトの名無しさん
05/03/16 01:44:51> std::string
> このやり取り見てて思ったんだが(馬鹿な質問だったらすまん)内包クラスのことだよな?
> つまり、クラスの中で宣言されてるクラスの事、と認識したんだけど合ってる?
多分あっているような。。
> 合ってるなら話を先に進めて、内包クラスって外からもクラス定義として見えるの?
見えるように、内包クラス(?)の型宣言を、そのソース(あるいは#include している
ヘッダ)の中に置かないと、そのクラスのインスタンスを(別のクラスのメンバーとしても)
宣言できないし(参照やポインタだけなら、その限りにあらず)
0283282
05/03/16 01:46:59この限りにあらず。多分、ちゃうと思うけど
0284デフォルトの名無しさん
05/03/16 01:55:36>>280,>>282
無駄にスレ消費してしまうだけから回答するな。
0285デフォルトの名無しさん
05/03/16 02:12:05言ってる事はオカシイが、言いたい事は解る。
お前、内部クラスと間違ってないか?JAVAの世界に帰れ。
内包(コンポジット)ってのは、その、まあ、簡単に言うと、
メンバにオブジェクトを持つ事だ。「オブジェクトコンポジション」で検索して来い。
0286285
05/03/16 02:15:58269が心配してるのは、
---------------------------------
struct onepair {
int first;
int second;
};
メモリは確保されますか?
---------------------------------
とかそのレベルの話だ。お前の考えてる事とはかなり違う。
0287279
05/03/16 02:24:230288デフォルトの名無しさん
05/03/16 02:27:410289デフォルトの名無しさん
05/03/16 02:31:23早急に↓こちらへ非難してください。
ttp://pc5.2ch.net/test/read.cgi/tech/1096687703/
ttp://pc5.2ch.net/test/read.cgi/tech/1068752664/
0290マイク ◆yrBrqfF1Ew
05/03/16 04:25:37初心者はよく`m_'のサフィックスを使う。
0291マイク ◆yrBrqfF1Ew
05/03/16 04:26:190292デフォルトの名無しさん
05/03/16 06:40:23スレの無駄だし、馬鹿にしてる気がするが一言、
stdがnamespaceだってのは当然分かってるよな?
0293デフォルトの名無しさん
05/03/16 08:48:37似たようなケースで
自分自身を再構築するというのもありだよね?
あるclassが、内部に持っている別のデータ(のポインタ)に極端に依存していて
そのデータが大幅に更新されていた時に作り直したいんだけど、
具体的には
class hoge {
Data *data;
...;
hoge(Data *) { ... }
void update() {
Data *np = check_update(data);
if (np != data) {
this->~hoge();
new (this) hoge(np);
}
//以下、何事もなかったかのように続行
}
};
のような。
メンバ関数を、「thisを引数に持つ以外は普通の関数と同じ」と仮定すれば
当然動くはずなんだけど
以後も処理が継続するメンバの内部でこれをやるのは
規格上はあまりよろしくないのかな。
0294デフォルトの名無しさん
05/03/16 08:57:16最初のthis->~hoge()が終了した時点でもthisの値が有効であることは、
規格上はおそらく保証してないんだろうな。
とするとnew (this) hoge()の呼び出しをする時のthisは
どこを指しているかわからないから
やっぱり鼻から悪魔なのかも。
0295デフォルトの名無しさん
05/03/16 09:32:32thisを直接使わないで
一時変数に代入してそれを使って再構築すれば
仕様上も問題ないか。
0296デフォルトの名無しさん
05/03/16 09:39:26あれこれ試行錯誤するのは構わないから、検証してから報告してくれ。
0297デフォルトの名無しさん
05/03/16 10:05:36何もしないコンストラクタまたは定義したコンストラクタの初期化メンバ
リストにないメンバーは、自動的にデフォルトコンストラクタを呼びだすの?
じゃ、クラスをメンバにもってたら、そのクラスのデフォルトコンストラクタ
を読んだあと、そのクラスのメンバのデフォルトコンストラクたも呼びだす
みたいなループになったりもするの?
0298デフォルトの名無しさん
05/03/16 10:21:06EffectiveC++でも読め。
それから日本語も勉強しとけ。
クラスのメンバであるクラスは、大きなクラスの初期化に先立って初期化リストに従って初期化される。
0299デフォルトの名無しさん
05/03/16 10:36:57よく解読できたな。
0300デフォルトの名無しさん
05/03/16 11:07:32明に呼び出したりするものなんですか?
0301デフォルトの名無しさん
05/03/16 11:10:41あまりない。
0302227
05/03/16 11:20:24ソートの基準クラスはこれ。昨日参加してない人はスルーしてください。
template<class T>
class MyCmp{
public:
enum cmp_mode{asc, desc};
MyCmp(cmp_mode m=normal):mode(m){}
bool operator()(const T& t1, const T& t2) const{ //要素の比較
return mode == asc ? t1 < t2 : t2 < t1;
}
bool operator==(const MyCmp& mc){ //ソートの基準の比較
return mode == mc.mode;
}
private:
cmp_mode mode;
};
0303227
05/03/16 11:26:56#include <iostream>
#include <set>
using namespace std;
int main()
{
MyCmp<int>::cmp_mode vmode;
char c;
do{
cout << "Input order(a or d)=>"; cin >> c;
switch(c){
case 'a': vmode = MyCmp<int>::asc; break;
case 'd': vmode = MyCmp<int>::desc; break;
default : c = '\0'; break;
}
}while(!c);
MyCmp<int> mcmp(vmode);
set<int,MyCmp<int> > iset(mcmp);
// 代替案(一時オブジェクト) TEST: Borland C++ 5.5.1
//set<int,MyCmp<int> > iset(MyCmp<int>(vmode)); //エラー
//set<int,MyCmp<int> > iset((MyCmp<int>(vmode))); // ok
//set<int,MyCmp<int> > iset(MyCmp<int>()); //エラー
//set<int,MyCmp<int> > iset((MyCmp<int>())); //エラー
iset.insert(4);iset.insert(3);iset.insert(5);
iset.insert(1);iset.insert(6);iset.insert(2);
copy(iset.begin(),iset.end(),ostream_iterator<int>(cout," "));
}
0304デフォルトの名無しさん
05/03/16 11:27:43> cmp_mode m=normal
コレ、コンパイル通るのか?
0305227
05/03/16 11:32:24できませんでした。今はBorlandしか試せません。コンパイラによって
クセがあるのかもしれませんね。著者もそのあたりを気にして
一時オブジェクト使わなかったのかもしれません。
0306デフォルトの名無しさん
05/03/16 11:32:43map > set > list > vector
後々、順序づけの方法を変えたくなるのが人の常。仕様変更に弱い。
並べ替えされた配列も欲しくなる。setだけでなく、mapも仕様変更に弱い。
素直にvectorにするというのが普通だと思う。
0307227
05/03/16 11:34:59cmp_mode m=asc
にしてください。昨日asc,descでやったので、本のコードも
それに書き換えたのですが、漏れがありました。(本はnormal,reverse)
ってことで、デフォルトコンストラクタのものもエラーに
なりませんかね。失礼。
0308227
05/03/16 11:37:44コンパイル通るbcc素敵ですね。
0309デフォルトの名無しさん
05/03/16 11:38:29vector > deque > map > set >
後々、要素数の規模を変えたくなるのが人の常。仕様変更に弱い。
無効化されないイテレータも欲しくなる。vectorだけでなく、dequeも仕様変更に弱い。
素直にsetにするというのが普通だと思う。
0310デフォルトの名無しさん
05/03/16 11:39:25cl ver13.10.3077
//set<int,MyCmp<int> > iset(MyCmp<int>(vmode)); //エラー
//set<int,MyCmp<int> > iset((MyCmp<int>(vmode))); // ok
//set<int,MyCmp<int> > iset(MyCmp<int>()); //エラー
//set<int,MyCmp<int> > iset((MyCmp<int>())); //ok
Metrowerks CodeWarrior for Windows v8.3
//set<int,MyCmp<int> > iset(MyCmp<int>(vmode)); //エラー
//set<int,MyCmp<int> > iset((MyCmp<int>(vmode))); // ok
//set<int,MyCmp<int> > iset(MyCmp<int>()); //ok ←コレは誤りだろ…鬱
//set<int,MyCmp<int> > iset((MyCmp<int>())); //ok
0311227
05/03/16 11:48:57.netがクソというオチでは済まなかったようですね。
0312デフォルトの名無しさん
05/03/16 11:51:57vector::reserve()を知らないの?
配列の途中にinsert()する意味は何なの?
無論、不可能ではないがわざわざinsert()する人は稀。
あらかじめ全体サイズの概要がわかっている、
あるいは、大きく余裕をもって確保して大丈夫という場合が多い。
この条件に該当してないかどうか、よく吟味してみることだ。
0313デフォルトの名無しさん
05/03/16 11:55:58哀れな>>309・・・。
良い上司・仕事に恵まれない、自己満足の世界に長く居すぎたのだろう。
0314デフォルトの名無しさん
05/03/16 12:04:040315デフォルトの名無しさん
05/03/16 12:06:19相手にすんな。
>>309は、該当機能があたかもsetだけのもののように思い込んでる真性だ。
listを検討対象から除外している時点で完全に真性。
0316デフォルトの名無しさん
05/03/16 12:09:04コンテナの選択について議論すること自体が不毛。
0317デフォルトの名無しさん
05/03/16 12:10:41reserve() しても途中に insert() するときの要素移動にかかるコストは消えない。
set の替わりに vector 使うなら途中に insert() するのは当たり前。
> あらかじめ全体サイズの概要がわかっている、
> あるいは、大きく余裕をもって確保して大丈夫という場合が多い。
それが理由になるのであれば、逆に
あらかじめ順序づけの方法がわかっている、
且つ、並べ替えされた配列はイテレータで代用して大丈夫という場合が多い
とも言える。
vector で代用したほうがいいケースがあるのも確かだが、
特に前提が無い場合は素直に set を使ったほうが、
ソースコード量、複雑さともに優れている。
0318デフォルトの名無しさん
05/03/16 12:19:30は挿入位置の後の参照とiteratorうんぬんのことじゃないの?
0319デフォルトの名無しさん
05/03/16 12:32:030320デフォルトの名無しさん
05/03/16 12:39:32眼科行ったほうがいい。
0321デフォルトの名無しさん
05/03/16 12:44:18が起きないようにあらかじめ空コンテナを用意しておくだけの話だぜ。別に呼び出さなく
ても、空コンテナがなくなると自動的にreserve()してくれるしな。
ただし、デフォルトコンストラクタを呼び出すstd::vector::resize()とは違い、要素
の数が増えるわけではない。
0322227
05/03/16 12:47:23言語学習の過程で起きた疑問からです。
何を作ってるわけでもないです。
まぁ設計論もけっこうですが、自分は関わりませんw
0323デフォルトの名無しさん
05/03/16 12:54:220324デフォルトの名無しさん
05/03/16 12:54:39俺も設計論はどうでもいいが、
>まぁ設計論もけっこうですが、自分は関わりませんw
馬鹿かお前。
0327デフォルトの名無しさん
05/03/16 14:09:15アホにしか見えん 使ってる奴探してみ
0328デフォルトの名無しさん
05/03/16 14:14:240329デフォルトの名無しさん
05/03/16 14:17:42俺も君の意見に賛成できるな。
技術系スレの真剣な質問・回答のハザマに出現する荒しは、かなり見苦しい。
0330デフォルトの名無しさん
05/03/16 14:24:37具体的には>>313とか、勝ち馬に乗りたいだけな気がする
0331デフォルトの名無しさん
05/03/16 14:31:40荒らしってのは、無根拠に馬鹿とかアホとかいって煽ってる
連中だな。
それに、むしろム板とか言ってここに精通してますみたいな奴の方が
人間として終わってる場合が多い。
0332デフォルトの名無しさん
05/03/16 14:32:35限りなく反省文・始末書に近くなるだろうが、逃げずに頑張れ。
0333デフォルトの名無しさん
05/03/16 14:40:53それを明らかにする必要はあるな
少なくとも227は、単に解説書を読んでいて
躓いた箇所を質問しているだけのようだし
コードも解説書から引用してるだけなので
set厨ではないわけだが…
0334デフォルトの名無しさん
05/03/16 14:44:13↓こちらへどうぞ。
最高に頭悪そうな発言してください in ム板 (IV)
http://pc5.2ch.net/test/read.cgi/tech/1108989422/
0335デフォルトの名無しさん
05/03/16 15:03:49人が vector 使ってるのを見つけて
「素直に set にするのが普通」などと
莫迦な事をいう >>309 の事じゃないかと推測。
0336デフォルトの名無しさん
05/03/16 22:29:54「素直に vector にするのが普通」などと
莫迦な事をいう >>306 はvector厨?
0337デフォルトの名無しさん
05/03/16 23:21:260338デフォルトの名無しさん
05/03/16 23:24:48簡単だ。それは誰も求めない結論だからだ。
0339デフォルトの名無しさん
05/03/16 23:25:11お前、対人コミュニケーションできないだろ?
0340309
05/03/17 00:05:080341デフォルトの名無しさん
05/03/17 02:05:18お前だ
0342デフォルトの名無しさん
05/03/17 02:53:29お前のほうができなさそうなのは、一種の自爆ギャグ?
0343デフォルトの名無しさん
05/03/17 03:06:22set厨の>>336が必死にlistの話を避けているのが涙ぐましい。
0345デフォルトの名無しさん
05/03/17 09:03:240346デフォルトの名無しさん
05/03/17 11:19:19ハッシュ最強ということで。
0347デフォルトの名無しさん
05/03/17 11:26:110348デフォルトの名無しさん
05/03/17 11:32:46なぜ?
0349デフォルトの名無しさん
05/03/17 11:45:01STLportにあったから。
…かどうかは知らんが今作ってる最中。
標準C++ライブラリにunordered_mapって名前で入ることになったしな。
0350デフォルトの名無しさん
05/03/17 11:52:30なんかサイトがあるの?
0351デフォルトの名無しさん
05/03/17 12:34:33あるけど、お前にだけは教えてやら無い。
0352デフォルトの名無しさん
05/03/17 12:59:490353デフォルトの名無しさん
05/03/17 12:59:59見てて悲しくなってきた。日本人の知能の低さ…
0354デフォルトの名無しさん
05/03/17 13:02:350355デフォルトの名無しさん
05/03/17 13:03:20朝鮮人はお呼びじゃないです ;-)
0356デフォルトの名無しさん
05/03/17 13:03:49お前、ひょっとして「竹島問題」でファビョり中の、話題の韓国人か?
0357デフォルトの名無しさん
05/03/17 13:06:580358デフォルトの名無しさん
05/03/17 13:08:20しかもC++本スレ…
0359デフォルトの名無しさん
05/03/17 13:09:19開発するということにしよう
0360デフォルトの名無しさん
05/03/17 13:13:00竹島のライフラインを停止するプログラムか?
Kの御世話にならないように心とは裏腹に反対と言っておこう。
0361デフォルトの名無しさん
05/03/17 13:19:12if( korea.claim() ){
use_atomic_bomb();
}
else{
std::cout << "Yonsama Saiko-" << std::endl;
}
0362デフォルトの名無しさん
05/03/17 13:27:590363デフォルトの名無しさん
05/03/17 13:42:090364デフォルトの名無しさん
05/03/17 13:51:240365デフォルトの名無しさん
05/03/17 14:41:100366デフォルトの名無しさん
05/03/17 14:55:22単なる定数とかはstatic constで型チェックさせる。
マクロもinlineにして型チェックさせる。
0367デフォルトの名無しさん
05/03/17 15:14:34無名namespaceは使わないの?
0368デフォルトの名無しさん
05/03/17 15:17:04ブロック開いて閉じる手間も増えるし。
0369デフォルトの名無しさん
05/03/17 15:26:31テキストエディタの自動インデント機能がうざくなる瞬間でもあるね。
0370デフォルトの名無しさん
05/03/17 18:32:26大好評発売中!
http://openuser10.auctions.yahoo.co.jp/jp/user/dancexxx1960?
市販SOFTやオンラインSOFTのパスワード集です。
オークション関係から画像・OS・表計算・CAD・・・・etc
国内・国外のあらゆる分野のSoftを解析済です。
これを初めて手にされた時には、驚愕される事でしょう。
そして・・・手当たり次第にインストールを始める筈ですw
パソコンをご使用の方なら、必ず!満足されると思います。
解析結果のデータベースには15,000点を越えるパスワードが入ってます。
このパスワード集から検索するだけで、登録や制限解除が出来てしまいます。
シェアウェアを購入して、正規登録したのと同じ状態になります。
余りにもデータが多すぎる為、辞書引のようなパスワード検索SOFTで提供します。
シェアウェア以外にもパッケージ版をVectorなどでオンライン販売してるSOFTにも
多数対応しています。これらをダウンロードして無期限に試用する事も可能です(^^;
WindowsXPやOfficeなどのCDキー(プロダクトキー)ジェネレーターを使えば複数のパソコンに
インストールする事も可能です。デスクトップとノートPCなど2台以上持ってる場合は特に有効ですね。
オンラインSOFTを購入した経験は有りますか?
ありとあらゆる分野の優れたSOFTが、数多くありますよね。
しかし、ほとんどが試用期間や機能制限をして、「気に入ったら購入してください」です。
もう少し使いたいが使用期限切れで、削除・・・再インストールを繰り返していませんか?
0371デフォルトの名無しさん
05/03/17 20:55:500372デフォルトの名無しさん
05/03/17 21:07:100373デフォルトの名無しさん
05/03/17 21:30:25ただのconstの場合は、初期化したら不変のままで
オブジェクトごとに値が違うみたいな使い方ですかね。
0374デフォルトの名無しさん
05/03/18 01:50:06私C++のプログラマでがんばりたいのですが
派遣とかに声掛けると、制御系の知識あるかとか
ネットワーク知ってるかと聞かれて凹んでます。
0375デフォルトの名無しさん
05/03/18 01:54:11結構とっつき難いね。
参考書籍買う金もないのでWeb探しまくってお勉強中だけど。
('A`)普通にプログラム書ける人間がすげー偉く思える。いや、実際偉いのか
0376デフォルトの名無しさん
05/03/18 01:55:55板違い
>>375
書籍代だけは惜しまない方が良い
0377375
05/03/18 01:58:51やっぱそうですか。Web上のだけじゃ足りないですよねぇ…
ちょっと明日(今日)にでも本屋行って見てきます。どもです
0378デフォルトの名無しさん
05/03/18 04:20:26int→char[]とか、都合のいい16進数解釈関数とか、。
そういったのが多くなったので、これまでother.cppとしてまとめていたものをこの際分割して管理しようと思います。
何かこうしたほうがいいとか、陥りやすいmissとかありますか?
0379デフォルトの名無しさん
05/03/18 05:41:23陥りやすいmiss
「自分用関数がどんどんふえていく」
趣味や勉強程度で、コードの再利用を考えるのは無駄なことが多い。
プロジェクト内で完結させておけばいい。
コピペの手間 << コードの管理
0380デフォルトの名無しさん
05/03/18 07:20:34自分用関数が増えていくのが楽しかっただけにちょっとショック。
ありがとうございました。
0381デフォルトの名無しさん
05/03/18 07:45:51いや、16進数解釈関数程度ならば、役に立つよ。
CライブラリをつかわずWindowsAPIだけを使いたい場合、
atoi()の代用品をCライブラリ非依存で作っておくと、重宝する。
0382デフォルトの名無しさん
05/03/18 08:08:32なんでこんなバカなことをする必要があるん?
0383デフォルトの名無しさん
05/03/18 08:09:110384デフォルトの名無しさん
05/03/18 08:12:10んー、思考停止かな?
「_ATL_MIN_CRT」でぐぐってみて。
君が知らない世界があるから。
0385デフォルトの名無しさん
05/03/18 08:45:56_ATL_MIN_CRTを使うのはバカだ、ということが分かった。
お前バカなん?
0386デフォルトの名無しさん
05/03/18 09:53:140387デフォルトの名無しさん
05/03/18 10:09:180388デフォルトの名無しさん
05/03/18 10:39:430389デフォルトの名無しさん
05/03/18 10:51:060390デフォルトの名無しさん
05/03/18 10:51:42メソッド名が曖昧になるから。
その場合は、foo::hoge()とかbar::hoge()って感じで呼び出す。
ダイヤモンド継承も同じ。
0391デフォルトの名無しさん
05/03/18 10:57:07俺も知らなかったからググって見た。
この間抜けな仕様は何の為に存在するんだろ、と思った。
// なんだよ、C++ の例外が使えないって…
0392デフォルトの名無しさん
05/03/18 11:48:020393デフォルトの名無しさん
05/03/18 12:32:3225KBのコードサイズとランタイム添付の手間のためにコードが糞になるんですかそうですか
0394デフォルトの名無しさん
05/03/18 12:50:15ttp://www.uri.sakura.ne.jp/~cosmic/yuno/lab/cpp_virtualbase.html
既出だと思うけど、ここ見れ。
継承は、楽しいよ。たのしい。
0395デフォルトの名無しさん
05/03/18 13:00:21継承は知ってるけど、そのページダイヤモンド継承について書いて無くない?
仮想継承=ダイヤモンド継承
なんか?
0396デフォルトの名無しさん
05/03/18 13:19:21/ \
B C
\ /
D
この形のことをダイアモンドっていうんだろ?
0397デフォルトの名無しさん
05/03/18 13:33:29だから、>>389-390のように、foo::hoge()とかbar::hoge()って感じに明示的にアクセスしなければならない。
一方、仮想継承の場合は、その共通部分を全部くくってしまうケース。
A
/ \
B C
\ /
D
この例だと、クラスAにメンバーhogeがあった場合、クラスDにはA::hoge、B::hoge、C::hogeが出来る。
仮想継承だと、その共通部分であるhogeは一つしか出来ない。
これで間違っていないよね?
0398397
05/03/18 13:39:37クラスDに出来るのは、B::hogeとC::hogeだ。
0399デフォルトの名無しさん
05/03/18 14:24:21内部結合の識別子として認識するという記述を読んだのですが
namespace {
const int foo;
static const int bar;
class X {
public: const int baz;
static const int qux;
};
}
上のコードでfooとbar、bazとquxは同じ意味になるという理解で
良いのでしょうか?
0400デフォルトの名無しさん
05/03/18 14:44:280401デフォルトの名無しさん
05/03/18 15:17:46>C++では記憶域クラス指定子が無いconst型修飾された識別子は
「"名前空間スコープにある"記憶域クラス指定子が無いconst型修飾された識別子は」ですね.
無名名前空間とstaticはほとんど同じ効果を持ちますけれど微妙な違いがありますよ.
bazとquxですが,クラスの非静的データメンバに対するconstは
リンケージとは関係ないですし,staticの指定もリンケージとは無関係です.
そもそもクラスの非静的データメンバにはリンケージの概念がないような・・・?
0402デフォルトの名無しさん
05/03/18 15:29:41CLASS_A:CLASS_A():Hensu1(0),Hensu2(1)
{
処理
}
CLASS_A:CLASS_A():Hensu1(0),Hensu2(1)
~~~~~~~~~~~~~~~~~~~~<=ここの意味がわからん。
Hensu1とかはprivate変数らしい
以上、暇だったら教えて・・・
0403デフォルトの名無しさん
05/03/18 15:32:06コンストラクタでこんな感じで書いてあるのはどういう意味なのでしょう?
CLASS_A:CLASS_A():Hensu1(0),Hensu2(1)
{
処理
}
上記の記述のなかで
Hensu1(0),Hensu2(1)
の意味がわからん。private変数らしいが・・・。
以上、暇だったら教えて・・・
0404デフォルトの名無しさん
05/03/18 15:45:23コンストラクタでの、メンバ変数の初期化
初心者ならば、ttp://pc5.2ch.net/test/read.cgi/tech/1108924728/で質問汁
0405デフォルトの名無しさん
05/03/18 16:14:24なるほど 399が適用されるのは名前空間スコープ上、fooとbarに
対してなんですね。クラススコープ上の場合は異なり、baz は
staticではないので非staticメンバに準ずるということなのですか…。
複雑ですね。(^^;
とても勉強になりました。ご指摘ありがとうございます。
0407デフォルトの名無しさん
05/03/18 16:29:58ゆくゆくは移行してもいいかとお考えですか?
ここで聞くなと言われるかもしれませんが、C++に熟達した
人の意見も聞いてみたいと思って…。
一部にはC++で挫折した人間がDへ、とも言われてるようですし。
0408デフォルトの名無しさん
05/03/18 16:36:560409デフォルトの名無しさん
05/03/18 16:52:44class Hoge{
public:
DWORD(Hoge::*m_pFunc)();
Hoge(){g_pHoge=this;}
void Func00(){;}
...};
Hoge *g_pHoge=NULL;
void Hage(){
g_pHoge->m_pFunc=Hoge::Func00}
Hageで設定したHoge::Func00はHogeが複数の場合、
どのHogeを指すことになるのでしょう?
また、クラス外(Hage())からg_pHoge->Func00()を明示的に
m_pFuncに代入する方法を教えてください。
0410デフォルトの名無しさん
05/03/18 16:54:55メンバ関数へのポインタの値は、メンバ関数の「名前」に相当する。
従って、特定のインスタンスを指すものではない。
0411410
05/03/18 16:57:53void (Hoge::*pFunc)() = &Hoge::Func00;
Hoge a, b;
a.*pFunc(); // a.Func00(); と同じ。
b.*pFunc(); // b.Func00(); と同じ。
0412デフォルトの名無しさん
05/03/18 17:01:01即レス有難うございます。
インスタンスが複数ある場合、どのインスタンスのメンバ変数を操作することになるのでしょう?
この場合だとg_pHoge->m_pFunc=で入れているのでg_pHogeが使われるということでしょうか。
0413デフォルトの名無しさん
05/03/18 17:02:53有難うございます。納得いたしました。
0414デフォルトの名無しさん
05/03/18 17:02:59よく読め。
使われるときに決定される。
0415デフォルトの名無しさん
05/03/18 19:38:43以下のソースプログラムをコンパイルしようとしたところ、下のようなエラーメッセージが出てしまいました。
コンパイラは、lcc-win32 です。
【バージョン情報】
Logiciels/Informatique lcc-win32 version 3.8. Compilation date: Jul 25 2004 22:17:17
【ソース(ファイル名:cout.cpp)】
#include <iostream.h>
int main(int argc, char** argv)
{
cout << "Hello, world!\n";
return 0;
}
【コンパイル時の状況】
C:\Documents and Settings\・・(個人情報があるため省略)・・\lcc\test>\lcc\bin\lcc cout.cpp
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~
↑作業ディレクトリ ↑入力したコマンド
C:\Documents and Settings\・・(個人情報があるため省略)・・\lcc\test>\lcc\bin\lcclnk cout.obj
cout.obj .text: undefined reference to '_cout'
cout.obj .text: undefined reference to '__op_leftshift_piostream_pchar'
C:\Documents and Settings\・・(個人情報があるため省略)・・\lcc\test>
【以上】
lcc-win32 は C:\lcc 以下にインストールされていて、C:\lcc\include の中には iostream.h がちゃんとあるので、
恐らくコンパイラのバグなどが原因だと思うのですが、どうすれば良いのでしょうか?
0416415
05/03/18 19:43:35作業環境は、
【本体の商品名】e machines
【OS】Windows XP
【CPU】celeron 2.20GHz
【Memory】128MB
【HDD】40GB
です。よろしくお願い致します。
0417デフォルトの名無しさん
05/03/18 19:43:59その前に自分を疑えよ。さすれば汝は救われる。
0418デフォルトの名無しさん
05/03/18 19:52:180419415
05/03/18 19:54:11自分を疑えとはどういうことでしょうか?
>>415 のソースプログラムは、g++ だと正常にコンパイル・実行出来ました。
よって、ソースプログラムは(C++として)問題ないと思われます。
もしかして、lcc-win32 はそもそも C++ をコンパイルできないのでしょうか?
iostream.h 等が入っているから C++ にも対応していると思ったのですが・・・・・・
0420415
05/03/18 19:59:55本当ですか?それは初耳です。
C++ を使い始めたのはおよそ8年前ですが、当時の入門書には iostream.h が出て来ました。
それとも、C++ のプログラムで標準入出力を扱う他の新しい方法が出来たのでしょうか?
そうでなければ、stdio.h 等を使うしかないのでしょうか?
尤も、Windows のプログラムでは標準入出力という概念が無いかもしれませんが・・・
0421デフォルトの名無しさん
05/03/18 20:02:26<iostream>
は使うんだろ
0423デフォルトの名無しさん
05/03/18 20:15:440424デフォルトの名無しさん
05/03/18 20:17:21名前空間なんて知らないよね
0425デフォルトの名無しさん
05/03/18 20:17:25|
|
|
/V\ ,J
/◎;;;,;,,,,ヽ
_ ム::::(;;゚Д゚)::| ジー
ヽツ.(ノ::::::::::.:::::.:..|)
ヾソ:::::::::::::::::.:ノ
` ー U'"U'
0426デフォルトの名無しさん
05/03/18 20:22:020427デフォルトの名無しさん
05/03/18 20:28:37> g++ だと正常にコンパイル・実行出来ました。
> よって、ソースプログラムは(C++として)問題ないと思われます。
> iostream.h
……
0428415
05/03/18 20:35:320429デフォルトの名無しさん
05/03/18 20:36:070430デフォルトの名無しさん
05/03/18 20:36:240431デフォルトの名無しさん
05/03/18 20:37:53おいらハード屋
0432415
05/03/18 20:41:10g++でコンパイルできたのがなによりの証拠
0433デフォルトの名無しさん
05/03/18 20:42:34ttp://homepage1.nifty.com/MADIA/vc/vc_bbs/200403_04030031.html
><iostream>は標準C++ライブラリのヘッダファイルですが,
><iostream.h>は非標準の(古い)ヘッダファイルです。
>理由がない限り,<iostream.h>は使うべきではないです。
これか?
0434デフォルトの名無しさん
05/03/18 20:50:05C++ の規格は ISO/IEC14882
この規格では iostream.h の添付を義務づけていない
よって iostream.h がない処理系も大手を振って C++ を名乗れる
0435デフォルトの名無しさん
05/03/18 20:51:520436デフォルトの名無しさん
05/03/18 20:55:08std空間を使わないバージョンをインクルードするのは鬼のように嫌われる昨今。
Linuxでさえ、そういう状況。
0437415
05/03/18 21:12:39ググってみたら、「lcc-win32 は C++ コンパイラではないけど、一部 C++ の機能が付いている」
というようなことが書いてありました。lcc-win32 は Cコンパイラ+α といったところでしょうか。
では、Windows 環境で使える無料の C++ コンパイラってあるのでしょうか?
もしご存知でしたら、是非教えて下さいm(_ _)m
0438デフォルトの名無しさん
05/03/18 21:17:56http://pc5.2ch.net/test/read.cgi/tech/1110099763/3
0439デフォルトの名無しさん
05/03/18 21:26:18Microsoft Visual C++ Toolkit 2003
ttp://msdn.microsoft.com/visualc/vctoolkit2003/
0441デフォルトの名無しさん
05/03/18 22:45:26今後 lcc を使うことはないだろうけど、参考までに。
http://stingray.campus.luth.se/lcc/AnApplication.htm
あと、Project->Configuration->Linker で iostream.lib を追加する必要があると思う。
スレ違いだけど、未解決のまま放置するのも何なので。
0442440
05/03/18 23:00:04ご親切にどうもありがとうございます。
lcc を使いやすい設定にしてしまっているので、cygwin 向けの環境に切り替えるまでの間は
しばらく lcc を使うことになると思うので、少し助かりました。
0443デフォルトの名無しさん
05/03/19 23:27:04gcc(g++)のwin32環境対応版には
cygwinエミュレーション版とmingw版とがある
文字コードの関係やライセンスの関係から、漏れはmingw版(IDEはDev-C++)を使用している
SubVersionやLaTeXも使うので、競合を恐れたというのもひとつだが
もしcygwinが使いづらいということがあれば、mingwがお勧めだ。
0444デフォルトの名無しさん
05/03/19 23:42:180445デフォルトの名無しさん
05/03/20 21:40:49あったり、デストラクタのアドレス取得の問題とかあるようですが、
コンストラクタってinlineにしても副作用ないですか?
というか普通はinline?
0446デフォルトの名無しさん
05/03/20 22:58:32>あったり、デストラクタのアドレス取得の問題とかあるようですが、
ここからして初耳なんだが。 詳細キボン。
0447デフォルトの名無しさん
2005/03/21(月) 14:25:26ここで問題が起きるような糞コンパイラならそもそもinline指定してもインライン化されないから大丈夫
0448デフォルトの名無しさん
2005/03/21(月) 18:02:58普通のメンバ関数と同じ考え方でいいんですか?
0449デフォルトの名無しさん
2005/03/21(月) 18:16:230450デフォルトの名無しさん
2005/03/21(月) 19:33:17開発している人ってたくさんいるんですか?
それとも単に祭り好きな人がたくさんいるってだけですか?
0451デフォルトの名無しさん
2005/03/21(月) 19:34:020452デフォルトの名無しさん
2005/03/21(月) 21:26:04basic_ofstreamって、ファイルに対する出力ストリームで、
オープンモードでバイナリを指定すれば、バイナリーで
書き出せるわけですが、メモリーに対するバイナリー出力の
ストリームってないのでしょうか。
0453デフォルトの名無しさん
2005/03/21(月) 21:30:460454452
2005/03/21(月) 21:43:18あ、ほんとだ。openmodeがありました。
ありがとうございます。
0455デフォルトの名無しさん
2005/03/21(月) 21:56:160456デフォルトの名無しさん
2005/03/21(月) 21:59:43俺もそう思う
0457デフォルトの名無しさん
2005/03/21(月) 22:09:22Cと同じ書き方もできるから。
問題はプログラミングスタイルだね。
初心者はまずアルゴリズムとデータ構造を勉強せにゃならん(異義は却下)から、
オブジェクト指向の事は後回しでよろしい。
0458デフォルトの名無しさん
2005/03/21(月) 22:21:27俺もCやらずにC++から今勉強してるけど
0459デフォルトの名無しさん
2005/03/21(月) 22:21:47だが先に学ぶ必要は無いな。
0460デフォルトの名無しさん
2005/03/21(月) 22:23:32なに言ってるのか良く解からない。
Cの構文規則が基礎なんだから、C++を理解するのにCが必要なのは当り前だろ??
0461デフォルトの名無しさん
2005/03/21(月) 22:24:15意味不明
0462デフォルトの名無しさん
2005/03/21(月) 22:30:49一度D&Eを読んでみるといい。
その辺に対する禿の見解が書いてある。
0463デフォルトの名無しさん
2005/03/21(月) 22:32:22Fileに保存するとき以外はバイナリモード、テキストモードの区別なんて無いよ。
0464デフォルトの名無しさん
2005/03/21(月) 22:40:420465デフォルトの名無しさん
2005/03/21(月) 23:21:41どこにあるのかな?
0466デフォルトの名無しさん
2005/03/21(月) 23:23:280467デフォルトの名無しさん
2005/03/21(月) 23:27:49自分でやれってか?
C言語で書いたのはあるけど、ダルイ。
0468デフォルトの名無しさん
2005/03/21(月) 23:29:230469デフォルトの名無しさん
2005/03/21(月) 23:35:44技術的なことを言ってるの?
それは見当違いだね。
ここは、素人専門かい?
0470デフォルトの名無しさん
2005/03/21(月) 23:47:15「C言語で書いたの」をC++でコンパイルした(できるように調整した)ものでは何が不満なのかね?
0471デフォルトの名無しさん
2005/03/21(月) 23:56:040472デフォルトの名無しさん
2005/03/21(月) 23:57:12ただ、フーリエって言いたかっただけだろw
0473デフォルトの名無しさん
2005/03/21(月) 23:58:100474デフォルトの名無しさん
2005/03/23(水) 03:34:39microsoft visual stdioとどっちがいい?
0475デフォルトの名無しさん
2005/03/23(水) 03:42:350476デフォルトの名無しさん
2005/03/23(水) 03:42:49cygwin+gcc
0477デフォルトの名無しさん
2005/03/23(水) 03:53:420478デフォルトの名無しさん
2005/03/23(水) 11:02:18.hppにするのが一般的なのですか?.hしか使ってなかったけど
たまに.hppもみかけるし、ソースも.cppだし・・・。
0479デフォルトの名無しさん
2005/03/23(水) 11:11:06でも好きな方使えばいいと思う。
0480デフォルトの名無しさん
2005/03/23(水) 11:40:38でも以前は hpp と cpp 使ってた。
知り合いには仕事以外では h++ c++ を貫いてるやつがいる。
GNU Make がデフォルトで hh と cc を認識するから
それを使ってるだけ。
>>479 よかったら URL 教えて。
0481デフォルトの名無しさん
2005/03/23(水) 11:43:21無いならhでいい。あればちょっと考える。
0482デフォルトの名無しさん
2005/03/23(水) 12:02:22本
0483478
2005/03/23(水) 12:57:45ないんですね。仕事ではチームの風潮に合わせるみたいな感じですかね。
0484デフォルトの名無しさん
2005/03/23(水) 17:39:45ttp://www.metrowerks.co.jp/information/2005/info0323.html
お客様各位
2005年3月23日
メトロワークス株式会社
CodeWarrior Desktop製品販売終了のお知らせ
拝啓 時下ますますご清栄のこととお喜び申し上げます。平素は格別の
ご高配を賜り、厚くお礼申し上げます。このたび弊社では、2005年4月30日
をもちまして下記のDesktop向けCodeWarrior各製品の販売を終了いたし
ます。一部の日本語版製品につきましては在庫終了のため、本日をもって
販売を終了させていただきます。長年にわたり弊社製品にご愛顧を賜り
誠にありがとうございました。今後もGame、Embeddedシステム向けに、
より良いCodeWarrior開発ツールとサポートを提供してまいる所存です
ので、何卒よろしくお願い申し上げます。
(後略)
0485デフォルトの名無しさん
2005/03/23(水) 18:21:45残念…
CodeWarrior1.7からのユーザだったから、ちょっと感慨深い
0486デフォルトの名無しさん
2005/03/23(水) 19:20:22Func();
}
void Func(void){
double *d;
d = malloc(沢山);
<中略>
free(d) ←ここ
}
関数Funcが終わったらポインタdは使えなくなるんですよね?
それでもfree(d)は必要なんですか?
0487デフォルトの名無しさん
2005/03/23(水) 19:31:43例えば、土地を借りて(malloc)住所を紙に書いて(d)
その紙を捨てたとしても(dがスコープから外れる)土地を返したことにはならないよね。
0489デフォルトの名無しさん
2005/03/23(水) 21:25:37あれだけ有名な製品でもある日突然消えちゃうんだね。
Borlandも心配。
0490デフォルトの名無しさん
2005/03/23(水) 21:46:13なるって本当?!
0491デフォルトの名無しさん
2005/03/23(水) 21:50:220492デフォルトの名無しさん
2005/03/23(水) 21:55:470493デフォルトの名無しさん
2005/03/23(水) 21:58:23開発者に.NETは見向きもされないってことになるかな。
0494デフォルトの名無しさん
2005/03/23(水) 21:58:46Intelに儲けさせようという壮大な計画です。
0495デフォルトの名無しさん
2005/03/23(水) 23:53:330496デフォルトの名無しさん
2005/03/23(水) 23:54:01ネイティブと.NETの立場が入れ替わるんじゃないの?
.NETがネイティブになって今のネイティブがエミュレーション動作
0497デフォルトの名無しさん
2005/03/24(木) 00:04:20いいとなってるのが、今後、連続配置を標準で保証する動きがあるとか
本で読んだのですが、今どうなってんですかね。
0498デフォルトの名無しさん
2005/03/24(木) 00:10:38今はメモリ上で連続してることが保障されてるはず。
0499デフォルトの名無しさん
2005/03/24(木) 00:24:38保証されている。
0500デフォルトの名無しさん
2005/03/24(木) 00:25:350501デフォルトの名無しさん
2005/03/24(木) 00:27:20もうこの言語、限界なんじゃない?
言語仕様に対して無理しているように見える。
0502デフォルトの名無しさん
2005/03/24(木) 00:42:59随分前からそう言われてるけど、結局生き残ってるわけだ
0503デフォルトの名無しさん
2005/03/24(木) 00:46:160504デフォルトの名無しさん
2005/03/24(木) 00:50:170505デフォルトの名無しさん
2005/03/24(木) 00:54:250506デフォルトの名無しさん
2005/03/24(木) 00:55:150507デフォルトの名無しさん
2005/03/24(木) 01:01:210508デフォルトの名無しさん
2005/03/24(木) 01:02:490509デフォルトの名無しさん
2005/03/24(木) 03:07:20あり得ない話とも言えない。
0510デフォルトの名無しさん
2005/03/24(木) 03:13:100511デフォルトの名無しさん
2005/03/24(木) 03:17:54ex. Lispマシン
0512デフォルトの名無しさん
2005/03/24(木) 03:38:540513デフォルトの名無しさん
2005/03/24(木) 09:55:25メンバ関数の実体って、オブジェクトごとに確保されるのでしょうか?
staticメンバ関数というのがある以上、普通のメンバ関数はそういう
ことになると思えるのですが。でもどのオブジェクトでも処理としては
同じなのに、複数用意するのも変に思えるのです。せいぜいthisポインタが
指すオブジェクトが違うだけですよね。実際はどういう仕組みなのでしょうか?
0514デフォルトの名無しさん
2005/03/24(木) 10:01:20せいぜいthisポインタが違うだけなので、
一般的な実装ではthisポインタを引数に取る関数がひとつ生成される。
このため、非staticメンバ関数の型は宣言(見た目)どおりの型とは違う。
staticメンバ関数はthisポインタを受け取らないので、
宣言どおりの型を持つ関数が生成される。
0515デフォルトの名無しさん
2005/03/24(木) 10:02:30> 指すオブジェクトが違うだけですよね。
これが大問題だと思うのは気のせいでしょうか?
メンバ変数がひとつもないのであれば、それこそstaticでいい
0516デフォルトの名無しさん
2005/03/24(木) 10:36:30なんとなく、thisポインタだけを動的に差し替えてみたいな
感じでいけないのかなぁ・・・と思ったんですよね。
処理としては同じで対象が違うってことなので。
そういうわけにもいかんのですか。
0517デフォルトの名無しさん
2005/03/24(木) 10:44:45読解力ないな。
>514が書いているとおり、一般的にはthisを引き数として受け取る関数のように実装されるのだけどね。
つまり、オブジェクトごとに存在するのは(staticじゃない)メンバ変数と仮想化に必要なポインタのみ。
コンストラクタを含めて関数はオブジェクトごとに生成されるわけではない。
0518デフォルトの名無しさん
2005/03/24(木) 10:49:43public:
int i;
void func() { i = 0; }
};
A a;
a.func();
は、Cではこんな感じかな。
struct A {
int i;
};
void A_func(A* this) { this->i = 0; }
A a;
A_func(&a);
0519513
2005/03/24(木) 11:12:37十分納得できました、どうもです。
0520517≠514
2005/03/24(木) 11:58:50まさしく>518のようなことをしていたと思われ。
#いや、関数名は型も含んだ長い名前になるけど。
今時のコンパイラはthisはスタックに積まずにレジスタで渡すなどしているから
厳密には違うんだろうけどね。
0521デフォルトの名無しさん
2005/03/24(木) 12:26:150522デフォルトの名無しさん
2005/03/24(木) 15:08:13例えばクラスは、ヘッダファイルにインタフェース、実装ファイルに
実装、という様にわかりやすくできると思いますが、main関数の
実装ファイルにおいて、そういったインターフェースをどうやって
取り込むのか、グローバル変数の取り込み方とか、いろいろ悩むところが。
いろんなヘッダをまとめて取り込んだ代表ヘッダみたいなのを使う方法や、
依存関係を極力少なくした取り込み方もあると思いますが、何を基準に
判断していいのか・・・。それによってコンパイル速度とかも変わって
くるんでしょうか?
0523デフォルトの名無しさん
2005/03/24(木) 15:18:18C++で書かれたソースを公開しているフリーソフトウェアがいくらでもあるだろ。
そういうのを読むんだよ。
まずは真似ることからはじめようね。
0524デフォルトの名無しさん
2005/03/24(木) 15:20:310525522
2005/03/24(木) 15:38:56すみませんが、勉強になるもので何か1つ適当なのを
紹介してもらえませんか?
0526デフォルトの名無しさん
2005/03/24(木) 15:41:33自分で探しな。
http://sourceforge.net/
0527デフォルトの名無しさん
2005/03/24(木) 16:22:290528デフォルトの名無しさん
2005/03/24(木) 16:24:510529デフォルトの名無しさん
2005/03/24(木) 16:36:09可読性ってなんですか
おいしいですか?
0530デフォルトの名無しさん
2005/03/24(木) 16:51:370531デフォルトの名無しさん
2005/03/24(木) 16:57:27コンストラクタの気持ち…ちゃんと受け止めてあげましたか?
0532デフォルトの名無しさん
2005/03/24(木) 16:58:20恐がってはダメです。
前向きに、向き合っていかないと…
でないと…
0533デフォルトの名無しさん
2005/03/24(木) 17:42:56[COS1345] 幻のソース 「どろソース」
兵庫・神戸 ========ソース(株)
ソースタンクの1番下で、どろどろとした、原料の野菜の旨みを吸い込
んだ
「どろソース」は、一部のグルメにしか知られていなかった幻のソースです。
”そばめし”には欠かせないソースで、その他カレーの隠し味に、焼きそば・
お好み焼きや、他のソースと
ブレンドしてトンカツやフライ系に幅広くご利用いただける万能調味料ソース
です。
ピリリと辛く、その豊かな味わいは癖になります。
360g ¥400− [0]本[かごに入れる]
0534デフォルトの名無しさん
2005/03/24(木) 17:44:310535デフォルトの名無しさん
2005/03/24(木) 17:51:520536デフォルトの名無しさん
2005/03/24(木) 18:01:54どういう意味?
0537デフォルトの名無しさん
2005/03/24(木) 18:11:460538デフォルトの名無しさん
2005/03/24(木) 18:14:44よく分からん。簡単なコード例を挙げてくれないか?
0539デフォルトの名無しさん
2005/03/24(木) 18:20:56Breakの変わりに使うことを推奨している言語もあるよ。
一概にそうとは言えない。
0540デフォルトの名無しさん
2005/03/24(木) 18:22:150541デフォルトの名無しさん
2005/03/24(木) 18:37:32hoge.open(hage);
} catch(AlreadyOpenException e) {
hoge.close();
hoge.open(hage);
}
0542デフォルトの名無しさん
2005/03/24(木) 18:39:26どんな言語?興味アル
0543デフォルトの名無しさん
2005/03/24(木) 18:40:03サンクス。理解した。
0544デフォルトの名無しさん
2005/03/24(木) 18:48:41OCaml!!!!
0545デフォルトの名無しさん
2005/03/24(木) 18:49:18○代わり
ね。
0546デフォルトの名無しさん
2005/03/24(木) 20:40:50検索するしかないのでしょうか。
0547デフォルトの名無しさん
2005/03/24(木) 20:42:030548デフォルトの名無しさん
2005/03/24(木) 20:42:510549デフォルトの名無しさん
2005/03/24(木) 20:46:560550デフォルトの名無しさん
2005/03/24(木) 20:57:560551デフォルトの名無しさん
2005/03/24(木) 22:40:25どんなファイル名ですか?
0552デフォルトの名無しさん
2005/03/24(木) 22:41:46すみません、馬鹿なので理解できません
どの辺がいけないポイントなのでしょうか
0553デフォルトの名無しさん
2005/03/24(木) 22:45:30AlreadyOpenなんてしょっちゅうありえそうな事態だからちっともExceptionではない。
0554デフォルトの名無しさん
2005/03/24(木) 22:53:09単なる意地悪か何かでしょうかね。
0555デフォルトの名無しさん
2005/03/24(木) 22:54:140556デフォルトの名無しさん
2005/03/24(木) 22:55:40仕様コンパイラ:MinGW(mingw-jp-20040224.zip)
環境:WindowsXP SP2
char型とかは1バイトですよね?
http://www.bohyoh.com/CandCPP/FAQ/FAQ00046.html
ここによると符号付charは-127 〜 127 となっております。
しかし、例えば
char ch;
ch = 1024;
としても最大値を超える値が代入できてしまいます。
出力結果は無茶苦茶になりますが。
10進1024は2進で0111 1111 1111で、
char型が1バイトなら、最大値は2進で1111 1111だと思うのですが、
char型に1024を代入した場合、あふれた0111の部分はどこへ行ってしまうのでしょうか?
質問が少しわかりにくいかと思いますがよろしくお願いします。
0557デフォルトの名無しさん
2005/03/24(木) 22:57:45>>549ではなくて?
0558デフォルトの名無しさん
2005/03/24(木) 22:59:39桁あふれしてる分は消える。それだけ。
式があってれば代入は可能。その式に意味があるかどうかは
コンパイラの判断するところではない。プログラマが決めるとこ。
signed charの「有効な」値の範囲が-127 〜 127てだけ。
0559デフォルトの名無しさん
2005/03/24(木) 23:03:59あふれた部分は捨てられる。
signed charの範囲が-127〜127と言うのは規格が要求している最低限の値。
それ以上の範囲になっている事もありえる。(具体的には2の補数を使って-128〜127としている実装が多い)
自分のはどうなっているのか知りたければSCHAR_MAX/SCHAR_MINを読めばいい。
0560デフォルトの名無しさん
2005/03/24(木) 23:04:03> char ch;
> ch = 1024;
> としても最大値を超える値が代入できてしまいます。
> 出力結果は無茶苦茶になりますが。
それは代入できているとは言わないだろ。
あふれた場合、代入後の値は実装依存。
0561デフォルトの名無しさん
2005/03/24(木) 23:04:53それでは、有効な値を超えた場合、例えば
最大値が127なのに1000を代入した場合、
代入された変数には何が代入されるのですか?
char ch;
ch = 1000;
の場合chには1111 1111が代入されているのですか?
0562デフォルトの名無しさん
2005/03/24(木) 23:05:49下位ビットが入るだけ(実装依存?)
0563560
2005/03/24(木) 23:06:19かぶった。
・・・と思ったら、
「桁あふれしてる分は消える。それだけ。」?
「あふれた部分は捨てられる」?
そんなルール決まってんの?「実装依存」じゃなくて?
0564デフォルトの名無しさん
2005/03/24(木) 23:09:430565デフォルトの名無しさん
2005/03/24(木) 23:11:35コード書いて試せばいいじゃん
>>563
char hoge[4];
hoge[1] = 10000;
とかなら捨てられないと困らない?
0566デフォルトの名無しさん
2005/03/24(木) 23:13:43>>562の言うように、下位ビットが入るだけ。
CPUでの実際の演算がレジスタで行われていることを考えれば、
有効なビット幅をメモりにストアすると考えるのが普通。
0567デフォルトの名無しさん
2005/03/24(木) 23:14:181000(DEC) = 3E8(HEX)
だから
char = 8bit の場合は E8
char = 9bit の場合は 1E8
char = 12bit の場合は 3E8
が入る。
0568560
2005/03/24(木) 23:16:07捨てられようが捨てられまいが、
代入しようとした値と結果の値が同じにならない時点で困る。
そのコードで「捨てられる」のなら困らないってこと?
0569デフォルトの名無しさん
2005/03/24(木) 23:16:430570デフォルトの名無しさん
2005/03/24(木) 23:19:35君にはむずかしすぎたかな?^^;
0571デフォルトの名無しさん
2005/03/24(木) 23:19:45他の領域まで書き込まれちゃ変数の単位の区切りなんて意味なくなるじゃん
(char)1で代入するなら上位ビットを0で埋めるというより、下位ビットを代入するだけだと思うけど
0572デフォルトの名無しさん
2005/03/24(木) 23:20:426.5 式
6.5.16 代入式
6.5.16.1 単純代入
(略)
意味規則 単純代入は,右オペランドの値を代入式の型に型変換し,左オペランドで指し示されるオブジェクトに格納されている値をこの値で置き換える。
6.3 型変換
6.3.1 算術オペランド
6.3.1.3 符号付き整数型及び符合無し整数型 整数型の値を_Bool型以外の他の整数型に変換する場合,その値が新しい型で表現可能な場合,値は変化しない。
新しい型で表現できない場合,新しい型が符合無し整数型であれば(略)
そうでない場合,すなわち,新しい型が符号付き整数型であって,値がその型で表現できない場合は,結果が処理系定義の値となるか,または処理系定義のシグナルを生成するかのいずれかとする。
0573デフォルトの名無しさん
2005/03/24(木) 23:20:59いや、レベルが低すぎ。
このすれ以前にも益してレベル下がってる。
0574デフォルトの名無しさん
2005/03/24(木) 23:21:31>「代入しようとした値と結果の値が同じにならない時点で困る。」
そもそも桁あふれする値を入れて「結果が違う」なんて言うのは糞プログラマ。
hoge[1] = 10000; で「捨てられ」無かった場合どうなるか。
ヘタするとhoge[0]やhoge[2]が上書きされる。困るだろ。
0575572
2005/03/24(木) 23:26:560576デフォルトの名無しさん
2005/03/24(木) 23:27:20範囲に収まらない整数型への変換では
・変換先が符号無しなら収まらないビットを切り捨て
・変換先が符号有りなら実装定義
ということになるらしい。
char の場合は符号の有る無しが実装定義なので、
char に収まらない値を代入した結果は
実装定義ということになる。
0577560
2005/03/24(木) 23:34:48なんで配列を持ち出してきたんだろうと思ってたら、そういう意味か。
「捨てられない」=「どこかに書き込まれる」なんて思ってなかったから意味がわからなかった。
代入先以外の変数まで触られちゃ困る。当たり前だ。
0578デフォルトの名無しさん
2005/03/24(木) 23:39:010579デフォルトの名無しさん
2005/03/24(木) 23:39:140580デフォルトの名無しさん
2005/03/24(木) 23:40:40俺んところはそうなっているみたいだ。
0581デフォルトの名無しさん
2005/03/24(木) 23:41:31struct a {
int b;
char c;
char d;
char e;
char f;
char g[4];
} h;
0582デフォルトの名無しさん
2005/03/24(木) 23:42:51そういう実装が多いね。
0583デフォルトの名無しさん
2005/03/24(木) 23:44:16structならそらちゃうだろな
0584デフォルトの名無しさん
2005/03/24(木) 23:46:40そのわりにはちゃんと理解してる人や、
今再確認にした人が多いみたいだね。
0586デフォルトの名無しさん
2005/03/24(木) 23:49:11char hoge_c[8000];
int hoge_i[2000];
double hoge[1000];
} MICCHIRI;
無駄がない。鯖で試そうと思ったけど何と無くやめておいたネタ。
0587デフォルトの名無しさん
2005/03/24(木) 23:50:02そう思わない?
ところで、ボクはCPUとは無関係だと思うなぁ、ハハハ
0588デフォルトの名無しさん
2005/03/24(木) 23:57:40特にCでは。最適化を考慮して、アセンブラにどう展開
されるかを考えてプログラムするだろ、Cの場合。
0589デフォルトの名無しさん
2005/03/25(金) 00:02:42> 特にCでは。最適化を考慮して、アセンブラにどう展開
> されるかを考えてプログラムするだろ、Cの場合。
しない
0590デフォルトの名無しさん
2005/03/25(金) 00:06:560591デフォルトの名無しさん
2005/03/25(金) 00:07:46マジっすか。
0592デフォルトの名無しさん
2005/03/25(金) 00:08:29しない? 漏れは結構考えるけど。
ところで今は何が争点になっているのやら。
0593デフォルトの名無しさん
2005/03/25(金) 00:09:31>されるかを考えてプログラム
しないだろ。そんな事考えなくちゃいけない環境なら最初からアセンブラ使うでしょ
0594デフォルトの名無しさん
2005/03/25(金) 00:14:31いやそこまで厳密にどうアセンブラに展開されるかを考えるんじゃなくて(それなら直接アセンブラで書く)、
アルゴリズムとかを考えるとき、どうすればアセンブラに落としたときに
効率のいいコードになるかとか考えたりしない?
CPUの命令の種類とか、メモリのキャッシュとか、C言語から直接は見えないけど
透かして見て考えるくらいならできるでしょ。
0595デフォルトの名無しさん
2005/03/25(金) 00:15:57あからさまに効率が悪いコードを書かなければ、
最近はコンパイラの最適化の方が優秀な希ガス
0596デフォルトの名無しさん
2005/03/25(金) 00:32:11うむ、だから「最適化を考慮して」と言ったんだ。
最適化がうまくいくようにコードをかく。
0597デフォルトの名無しさん
2005/03/25(金) 00:38:38それはCPU等のハードウェアを透かして見ていると言えるのかな。
0598デフォルトの名無しさん
2005/03/25(金) 00:44:08「最適化がうまくいくように」は言語の規格を意識するべき話だろう。
「アセンブラにどう展開されるか」はCPUの仕組みを意識するべき話だろう。
まぁ、つまりは >>590
0599デフォルトの名無しさん
2005/03/25(金) 00:46:42書くとしてもインラインアセンブラ使うと思うんだが
0600デフォルトの名無しさん
2005/03/25(金) 00:47:170601デフォルトの名無しさん
2005/03/25(金) 00:56:34そうでなくても普段から速度を意識してしまうのは病気みたいなもんだ
0602デフォルトの名無しさん
2005/03/25(金) 01:18:520との比較は最適化されやすいからという理由でカウントダウンループになんぞしない。
#こういう8bitCPU時代のノウハウを得意げに語る携帯Javaプログラマはうざい。
0603デフォルトの名無しさん
2005/03/25(金) 01:20:380604デフォルトの名無しさん
2005/03/25(金) 01:21:420605デフォルトの名無しさん
2005/03/25(金) 01:28:320606デフォルトの名無しさん
2005/03/25(金) 01:31:38速いかどうかは兎も角、命令語長が短くなるとKVM使いがほざいてた。
真っ当なコンパイラならもし速くなるのなら最適化でそう言うコードを吐くべきだし、
プログラマはそんなことに頓着する必要はない。
0607デフォルトの名無しさん
2005/03/25(金) 04:36:10>10進1024は2進で0111 1111 1111で、
|・ω・`) どうしても誰もコレをつっこまないの?
0608デフォルトの名無しさん
2005/03/25(金) 05:36:24書いた本人です。
0100 0000 0000ですね。
ポカミスです。
0609デフォルトの名無しさん
2005/03/25(金) 07:06:50焦点がそこじゃないから気づかなかった・・・
0610デフォルトの名無しさん
2005/03/25(金) 07:25:100611デフォルトの名無しさん
2005/03/25(金) 08:57:560612デフォルトの名無しさん
2005/03/25(金) 14:07:30コンパイラが並列処理最適化ができるようにforループを書かないならないよ。
0613デフォルトの名無しさん
2005/03/25(金) 16:24:34とは言いつつ自分はIntelのコンパイラを使い続けるんだろうけど
0614デフォルトの名無しさん
2005/03/25(金) 16:28:410615デフォルトの名無しさん
2005/03/25(金) 22:16:54RISC 系の CPU だとゼロレジスタ持ってるから、多少は速くなると思われ。
0 以外の数字だと、レジスタにその数字をセットする命令が必要になる。
もっとも、そんなところで速度稼いでも大局的には意味はないと思うが。
0616デフォルトの名無しさん
2005/03/25(金) 22:18:060617デフォルトの名無しさん
2005/03/25(金) 22:34:12微妙。ここか、
managed C++ やろうぜ!!
http://pc8.2ch.net/test/read.cgi/tech/1014486422/
か、
【初心者歓迎】C/C++室 Ver.15【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1111231578/
か…
0618デフォルトの名無しさん
2005/03/25(金) 22:56:580620デフォルトの名無しさん
2005/03/25(金) 23:13:28それぞれを別クラスCMgr/CModuleA/B/Cとします。
CMgrはメンバにCModuleA/B/Cのインスタンスを持っています。
普通はCMgrから各モジュールに命令します。
でも、諸事情でModule同士で直接やりとりしたいのですが、
どのようにすればよいのでしょうか?
CModuleAのメンバ変数にCModuleB、CModuleBのメンバ変数にCModuleAを
定義すると当然ながらコンパイルエラーになってしまいます。
どう解決するのでしょうか?
(C++というかモジュール化の問題?)
0621デフォルトの名無しさん
2005/03/25(金) 23:15:47Manager経由で通信するってのはダメなの?
0622デフォルトの名無しさん
2005/03/25(金) 23:17:41ポインタを持てば?前方宣言して
0623デフォルトの名無しさん
2005/03/25(金) 23:28:40相互に参照する必要があるなら、公開するメンバ関数のみをインタフェイスとして
class IModuleA {
public:
virtual int foo() = 0;
};
のように分離して、CModuleA はそれから派生させて実装を追加するという手も定番。
CMgr には IModuleA* GetA() { return &m_moduleA;} みたいなのを追加して、
CModuleB などからはこれで得たインタフェイス経由でCModuleAのインスタンスを
操作する。
0624620
2005/03/25(金) 23:51:38Module固有のIFをMgrに入れるのは避けたいので、、、
>>622
なるほどポインタならOKですね。
すいません、実体しか試してませんでした。
でも、これってModuleAはModuleBのクラス定義を全て
インクルードするんですよね?
publicしかアクセスできないとはいえ気持ち悪いなぁ。。。
C→C++変換をしてるんですが、
Cではモジュール毎に外部公開ヘッダと内部用ヘッダに分けてました。
C++だと両方をクラス定義に押し込んで外部ヘッダはPublicに
内部用はPlivateと考えています。
>>623
これだとIModuleAのヘッダだけのインクルードで済むんで嬉しいんですが、
CMgrにGetAを追加するのが、気になりますねぇ。。。
0625デフォルトの名無しさん
2005/03/26(土) 15:13:28B b;
C c;
D* d = new (a, b, c) D;
このようにnewした場合、対応するdeleteはどのようになるのでしょうか。
d->~D();
D::operator delete(d, a, b, c);
といちいち書く必要があるんですか?
0626デフォルトの名無しさん
2005/03/26(土) 15:26:07% rm src.cpp
0627624
2005/03/26(土) 15:51:38>626
参考になりました。どうもありがとうございます。
0628625
2005/03/26(土) 15:52:30すいません。624ではなく625でした。
0629デフォルトの名無しさん
2005/03/26(土) 16:34:16# rm -rf /
0630デフォルトの名無しさん
2005/03/26(土) 19:16:50ここはC++のスレです
0631デフォルトの名無しさん
2005/03/26(土) 19:39:54それ、なんて言語?
0632デフォルトの名無しさん
2005/03/26(土) 19:57:36世界バカ発見!
0633630
2005/03/26(土) 20:12:03D* d = new (a, b, c) D;
こんな構文あったっけ?
0634デフォルトの名無しさん
2005/03/26(土) 20:35:35placement new
0635デフォルトの名無しさん
2005/03/26(土) 20:43:240636630
2005/03/26(土) 20:44:530637デフォルトの名無しさん
2005/03/26(土) 21:18:360638デフォルトの名無しさん
2005/03/26(土) 21:24:41簡単に言うと、これはoperator new(sizeof(A), b, c, d)でメモリを確保し
A(e, f, g)を用いてオブジェクトを作っている
0639デフォルトの名無しさん
2005/03/26(土) 21:39:460640デフォルトの名無しさん
2005/03/27(日) 01:44:49T& map::operator [] (const key_type& key)
この演算は
(*((insert( make_pair(x, T()) )).first)).second
に等しいとあったのですが、これって納得できますか?
まず、mapで[]演算子を使うと、キーが同じものがない場合は
強制的に挿入されるということなので、pair型を作ってinsert
に行きますよね。それはいいのですが、insertが返すのは挿入した
要素の位置(反復子)ですよね。それに対して.firstってできる?
pair型そのものじゃなくて、反復子に対して.firstとやることって
できるんですか?またその.firstで何を得てさらに間接参照して
.secondで何を得るのかいまいちわからんのです(まぁ普通に考えれば
最終的には要素の値(キーではなく)のリファレンスを取得するので
しょうけど・・・)
0641デフォルトの名無しさん
2005/03/27(日) 01:48:130642デフォルトの名無しさん
2005/03/27(日) 02:00:02そうなんですか。
それでガテンがいきますね。
メンバ関数ではないinsertがポイントなんですね。
どうもです。
0643デフォルトの名無しさん
2005/03/27(日) 02:35:00分かってないだろ。
0644デフォルトの名無しさん
2005/03/27(日) 02:58:240645デフォルトの名無しさん
2005/03/27(日) 03:36:12一歩前進
0646デフォルトの名無しさん
2005/03/27(日) 03:53:13下記の一文を追加するとコンパイルは通りますがリンクエラーがでまくります。
(runtime_errorクラスが使えません)
throw std::runtime_error("TEST");
環境は Vine Linux2.6 gcc-2.95.3-2vl22
メッセージmain.o: In function `main':
main.o(.text+0xd3): undefined reference to `runtime_error::runtime_error(basic_string<char, string_char_traits<char>, __default_alloc_template<true, 0> > const &)'
main.o: In function `__malloc_alloc_template<0>::_S_oom_malloc(unsigned int)':
main.o(.__malloc_alloc_template<0>::gnu.linkonce.t._S_oom_malloc(unsigned int)+0x1a): undefined reference to `endl(ostream &)'
main.o(.__malloc_alloc_template<0>::gnu.linkonce.t._S_oom_malloc(unsigned int)+0x27): undefined reference to `cerr'
main.o(.__malloc_alloc_template<0>::gnu.linkonce.t._S_oom_malloc(unsigned int)+0x2c): undefined reference to `ostream::operator<<(char const *)'
長いので略
リンクオプションは特になにも設定せずデフォルトのままですが
これがまずいのでしょうか。
0647デフォルトの名無しさん
2005/03/27(日) 04:14:55ま、ここは環境依存スレじゃないんで。
0648デフォルトの名無しさん
2005/03/27(日) 06:24:250649デフォルトの名無しさん
2005/03/27(日) 16:00:57incrementedかとおもたよ
0650デフォルトの名無しさん
2005/03/28(月) 09:14:550651デフォルトの名無しさん
2005/03/28(月) 11:30:51いい。別に.hでも支障ないけど。
0652デフォルトの名無しさん
2005/03/28(月) 13:04:43if(hairetu[0,1,2,3,4,5] == true){
処理;
}
というのは不可能でしょうか?やはりfor文で一つ一つチェック?
また、同じくbool型の変数hairetu[5]を一括でfalseにするには、
hairetu[]=false;
hairetu[0,1,2,3,4,5]=false;
といったかき方はダメでしょうか?
初心者のくせに大きめのプログラムを構築しているもので、
コンパイルして実行できないんです。教えていただけません?
0653デフォルトの名無しさん
2005/03/28(月) 13:09:14その書き方は×
STLのfindとfill使えばいいのでは
0654デフォルトの名無しさん
2005/03/28(月) 13:11:28>というのは不可能でしょうか。
不可能
>やはりfor文で一つ一つチェック?
for文でも&&でずらずら並べるでも好きな様に。
>といったかき方はダメでしょうか?
ダメ。
>教えていただけません?
ません。
0655デフォルトの名無しさん
2005/03/28(月) 13:12:10早速のレスありがとうございます。
findを使って構文を書き直しておきました。
一大ミスにつながるところでした^^;
0656デフォルトの名無しさん
2005/03/28(月) 13:25:52仮令大きなプログラムの一部を書いているのでも、小さな単位で確認する習慣をつけるべき。
まさか、机上コーディングしているわけじゃなかろ?
0657デフォルトの名無しさん
2005/03/28(月) 14:38:120658デフォルトの名無しさん
2005/03/28(月) 15:16:370660デフォルトの名無しさん
2005/03/28(月) 18:36:45それ以前にC++の基本的な文法を覚えるのが先じゃないのか?
>hairetu[0,1,2,3,4,5]
こんなのあり得ないし
0661デフォルトの名無しさん
2005/03/28(月) 18:39:28別に文法的に間違ってはいないけどな
hairetu[5]と同義になるだけだけど
0662デフォルトの名無しさん
2005/03/28(月) 18:39:520663デフォルトの名無しさん
2005/03/28(月) 19:00:44世界バカ発見!
0664デフォルトの名無しさん
2005/03/28(月) 19:17:12struct B{ char data[4];
virtual B~(){} };
仮想関数がないクラスをnewしても
メモリ確保されてないんだがなぜ?
(最適化されてるからかな?)
new A[1000000];//メモリ消費しない
new B[1000000];//メモリ消費する
0665デフォルトの名無しさん
2005/03/28(月) 19:18:350666デフォルトの名無しさん
2005/03/28(月) 19:24:050667デフォルトの名無しさん
2005/03/28(月) 19:29:15メモリへの書き込みがあるまではメモリが増えない、という
実装になってるんじゃないかと。
0668デフォルトの名無しさん
2005/03/28(月) 19:49:45…コンマ演算子の詳細を忘れていたよ。サンクス
0669デフォルトの名無しさん
2005/03/28(月) 20:11:02英語ソフトの日本語化でハマっているものです。
・こちらの開発環境はMS社のVC++ Ver6 日本語版。
・英語版のソースは海外の開発元から頂いております。
・私はVCもCもほとんど触ったことがありません。
ボタンやメニュー上の英語は、フォント名の変更と日本語名称の入れ替えでなんとかなりました。
しかし、印刷の日本語が文字化けしてしまい、上手くいきません。この部分が質問です。
フォント名の指定は日本語も通るように「MSゴシック」に変更しました。印刷上でもフォント名の変更が反映されました。
日本語名称の入れ替えた部分は、見事に文字化けになっています。
考えられる問題点を教えて頂きたいのですが。
自分なりに疑いのありそうな部分を並べますと。
・インストーラ形式で作成していないので、コアらしきexeファイルの
入れ替えのみで日本語化している。(DLL等も入れ替えないとダメ?
・変数の指定が二バイト文字を受け付けない。(そんなことがありえ
るのか全く知りません..
・1バイト文字しか通過できない何かがまだ隠されている。
・開発環境が間違っている。
何方か、アドバイスいただければ幸いです。
よろしくお願いします。
0670664
2005/03/28(月) 20:20:27VC6最適化なしRelease ->増加なし
VC6最適化なしDebug ->増加
667の通りかも、
これだと頻繁アクセスする時だとvirtual使うデメリット大きいなぁ.....
でもどのタイミングで確保されるんだろう?
頻繁に使うときはvirtualの方がいいってケースもありうるかも
0671670
2005/03/28(月) 20:21:50○ これだと頻繁アクセスしない時だとvirtual使うデメリット大きいなぁ.....
0672デフォルトの名無しさん
2005/03/28(月) 20:33:06デメリットは無い
>頻繁に使うときはvirtualの方がいいってケースもありうるかも
そんなケースは無い
0673デフォルトの名無しさん
2005/03/28(月) 21:12:37>でもどのタイミングで確保されるんだろう?
メモリにアクセスしたとき。
仮想関数があるBはvtableへのアドレスを設定するため、newするときに各要素にアクセスがある。
デバッグが有効だと未初期化のメモリは0xCDCDCDCDで埋めるコードが生成されるので
どちらもアクセスがある。
newが実際にメモリ確保に使ってるHeapAllocはアドレスだけ予約して、物理メモリをマッピングしてないっぽい。
で実際アクセスがあったときに物理メモリを割り当てる、と。
0674デフォルトの名無しさん
2005/03/28(月) 21:44:59newしてメモリが確保されていないってどうやって確認したの?
0675デフォルトの名無しさん
2005/03/28(月) 21:50:10スレ違い。
そもそも説明が冗長で肝腎な情報が抜けている。
0676デフォルトの名無しさん
2005/03/28(月) 22:25:47>何方か、アドバイスいただければ幸いです。
・C/C++未経験者が他言語へのポートをする事がそもそも間違い。
・Windows 自体の知識も怪しい。
・ていうか、スレ違い。
煽ってるわけではなく、マジで。
0677669
2005/03/28(月) 23:02:33すいません。
GUI環境は、MS社の開発環境はVBをちょっとかじった程度でした。
Web系でCやPerl、PHPを少々触れていたのですが、場違いだったようです。
この件、自分もタッチしたくなかったのが本音ですが、緊急事態で助けを求められたもので..。
明日、自分なりにもう少し頑張ってみます。
ありがとうございます。
0678669
2005/03/28(月) 23:04:35> GUI環境は、MS社の開発環境はVBをちょっとかじった程度でした。
GUI環境は、MS社のVBをちょっとかじった程度でした。
駄目だこりゃ。
0679675
2005/03/28(月) 23:58:38スレ違いだからこれ以上は避けるが、最後に一言。
>669を読んで、何を印刷しようとしているのか判る?
こちらはどんなプログラムか、どんなデータを扱うのか、何を印刷するのか何もわからない。
それでアドバイスができると思う?
0680デフォルトの名無しさん
2005/03/29(火) 00:25:390681デフォルトの名無しさん
2005/03/29(火) 02:34:41共通の基底クラスを持つ A, B, C などのクラスがあって、ファイルに保存したり
読み込んだりしようと思いました。
そこで、保存する時にクラス名を先頭に書き込んでおいて、読み込むときには
クラス名をキーにして、それぞれのクラスの static な読み込み関数のポインタを
得るマップを作って、それで生成しています。
でも、これだと新しいクラスを追加した時に、先ほどのマップに別の場所で登録
しなければならなくて、なんとなくいやな感じです。
こういうことをもっとスマートにできる方法は、無いのでしょうか?
0682デフォルトの名無しさん
2005/03/29(火) 02:57:300683デフォルトの名無しさん
2005/03/29(火) 02:58:320685681
2005/03/29(火) 05:58:27試してみましたが、すごい便利ですね。
STL のコンテナに対応して、派生クラスの面倒も見てくれるので、
えらくすっきりしそうです。
ありがとうございました。
0686デフォルトの名無しさん
2005/03/29(火) 09:39:24テクニックもありですよね?
0687デフォルトの名無しさん
2005/03/29(火) 09:48:400688デフォルトの名無しさん
2005/03/29(火) 10:21:180689デフォルトの名無しさん
2005/03/29(火) 13:16:51例えばメンバにクラスをもっていたら、デフォルトコンストラクタで
初期化されるんでしたよね?でも組み込み型は、未初期化のようなんですが、
デフォルトで初期化されるのはクラス型のメンバだけということでいいので
しょうか?
0690デフォルトの名無しさん
2005/03/29(火) 14:07:36>dllimport 関数 の定義は許されません。
これが表示されたときにもっとも疑うものはなんですか?
0691デフォルトの名無しさん
2005/03/29(火) 14:13:370692デフォルトの名無しさん
2005/03/29(火) 14:15:27言われると思った。
それで、なんですか?
0693デフォルトの名無しさん
2005/03/29(火) 14:21:17dllimportはDLLからその関数の定義を読み込むって意味だから
自身のソースで関数を定義すると多重定義になるんでは?
0694デフォルトの名無しさん
2005/03/29(火) 14:48:56dllexportとdllimportを切り替えるマクロの不備。
0695デフォルトの名無しさん
2005/03/29(火) 15:05:59いいのです
0696デフォルトの名無しさん
2005/03/29(火) 15:56:31スルーされたと思いきや、どうもです
0697デフォルトの名無しさん
2005/03/29(火) 17:20:56それも某HPに次のような説明があったためです。
public継承
親のpublicメンバ ---> 子のpublicメンバ
親のprotectedメンバ ---> 子のprotectedメンバ
親のprivateメンバ ---> 子のprivateメンバ
protected継承
親のpublicメンバ ---> 子のprotectedメンバ
親のprotectedメンバ ---> 子のprotectedメンバ
親のprivateメンバ ---> 子のprivateメンバ
private継承(デフォルト)
親のpublicメンバ ---> 子のprivateメンバ
親のprotectedメンバ ---> 子のprivateメンバ
親のprivateメンバ ---> 子のprivateメンバ
これをぱっと見て、あぁなるほどね、と最初は思ったのですが、
ものすごい誤解ではないですか?
0698デフォルトの名無しさん
2005/03/29(火) 18:38:52親のprivateメンバ → 子からアクセスできない
0699デフォルトの名無しさん
2005/03/29(火) 19:53:35ID:0700669
2005/03/29(火) 20:56:01ありがとうございます。
お陰さまで、印刷上でも日本語化できました。
キャラクターセットのシフトJISが鍵だったようです。
十数年ぶりのc++、開発環境に慣れるまでが面倒でした。
あとは力作業のみ。
0701デフォルトの名無しさん
2005/03/30(水) 01:51:25ラッパークラスのメソッドを経由してこのグローバルC関数を呼び出したいのですが、
このさい、ラッパークラス側のメソッドは、呼び出される側と同じインタフェースの可変引数にした
いと思っています。ソース公開されているので、呼び出される側のグローバルC関数の方を弄っ
て(vfprintfのように)va_list引数にすれば実現可能なのはわかっているのですが、呼び出される
側に一切手を加えずに、このようなことを実現はできますか。
オーバロード関数を死ぬほど用意するとか、そういうのは無しで。
スタックフレームに依存したコードで、ポータビリティはなくなってもかまいません。(redhat linux)
0702デフォルトの名無しさん
2005/03/30(水) 02:00:44定番のやりとりが嫌だから、俺は回答を書かないけど
0703デフォルトの名無しさん
2005/03/30(水) 03:15:31自分の環境でのvfprintfの実装を参考にしてください。
環境非依存の方法はありません。
0704デフォルトの名無しさん
2005/03/30(水) 03:22:36Cスレの過去ログ倉庫で、最近の方から順番に検索すれば
概ね実現可能な方法が見つかると思うよ。
もちろん、そのまま渡せる引数の最大個数等は
コンパイル時に決定されちゃうけどね。
0705デフォルトの名無しさん
2005/03/30(水) 05:57:590706デフォルトの名無しさん
2005/03/30(水) 08:56:14サンクス。
かなり面倒くさそうですが、
勉強のため調べてみます。
0707デフォルトの名無しさん
2005/03/30(水) 10:09:46前に4バイト分オブジェクトインスタンスだかなんだかのポインタが入るけど、
ここら辺の資料どっかない?構造体が知りたいんだけど。
0708デフォルトの名無しさん
2005/03/30(水) 11:21:330709デフォルトの名無しさん
2005/03/30(水) 11:33:110710デフォルトの名無しさん
2005/03/30(水) 12:54:11if(m_Heap.find(Text)!=m_Heap.end()){
return(true);
}
else{
return(false);
}
VC++.NETのSTLのMapを用いて上記のソースを記述したのですが、
trueが返る筈の場所でfalseが帰ってしまいます。
で、トレース実行してみたところ
if(m_Heap.find(Text)!=m_Heap.end()){
(1)return(true);
}
else{
(2)return(false);
}
と、何故か実行されるステートメントの矢印が移動します。
こんな事は、普通ありえないと思うのですが何か原因があるのでしょうか?
0711デフォルトの名無しさん
2005/03/30(水) 13:05:34ステップデバッグの正常な動き。
自分で似たコードを書いて、returnしたときにどこに矢印がいくか調べてみれば?
0712デフォルトの名無しさん
2005/03/30(水) 13:16:23return m_Heap.count(Text);
のほうが良いと思う。
0713デフォルトの名無しさん
2005/03/30(水) 15:09:53矢印の動きが腑に落ちないなら、最適化が切られていることを確認した上でリビルドしてみ。
あと、スレ違い。
0714デフォルトの名無しさん
2005/03/30(水) 21:22:06リンカ使って、static メンバ関数のシンボルを C 関数の別名扱いに
するとか。思い切り処理系依存だが。
0715デフォルトの名無しさん
2005/03/31(木) 00:32:43ATLのソースでも見てみよ。とエスパーしてみる。
0716デフォルトの名無しさん
2005/03/31(木) 01:39:42>>709に答えが出てるわけだが
0717デフォルトの名無しさん
2005/03/31(木) 01:45:41ATLなんて糞みてーなライブラリのソースなんて見ても何の価値もなし
0718デフォルトの名無しさん
2005/03/31(木) 02:10:45char *a="hoge";
char a[]="hoge";
char a[]={'h','o','g','e','\0'};
0719デフォルトの名無しさん
2005/03/31(木) 02:14:07せめてC FAQは読め。
0720デフォルトの名無しさん
2005/03/31(木) 02:14:11・一番目はポインタであり、それ以外は配列である。
・2番目と3番目は同じ。
0721デフォルトの名無しさん
2005/03/31(木) 02:15:03初期化だけならどれでも問題ない
どう使うかによる
0722デフォルトの名無しさん
2005/03/31(木) 02:17:02ありがとうございました
0723デフォルトの名無しさん
2005/03/31(木) 02:52:58どうやればいいのでしょうか?
0724デフォルトの名無しさん
2005/03/31(木) 03:03:550725デフォルトの名無しさん
2005/03/31(木) 03:09:290726デフォルトの名無しさん
2005/03/31(木) 04:10:45一度も呼び出される事のない関数をコンパイラの判断で
省いてくれる(実行形式ファイルにコードとして含まれない)
ような事ってあるんですか。
構造体のメンバ変数を呼び出すのと、メンバごとに分割した
変数を使用するのとでは、できあがるファイルは同じになりますか。
(例えば、pos.x;pos.yをpos_x pos_yのように分割する。)
int length = str.length;のようにメンバ変数を直接、読み出すのと、
int length = str.getlength();のように、単に単一の変数をメンバ関数か
らreturn length;
のように値を返すのは同じバイナリを吐き出しますか。
0727デフォルトの名無しさん
2005/03/31(木) 04:26:48インラインでない限りcall命令は省かれることないと思うけど
今のコンパイラはまだそこまで頭良くないと思う
0728デフォルトの名無しさん
2005/03/31(木) 04:33:58最後のお題は関数に inline を付けるか
コンパイルオプションで設定すれば
おそらく同じバイナリだな
あと真ん中の例は分かりにくいからもう少し詳しく
0729デフォルトの名無しさん
2005/03/31(木) 04:36:400730デフォルトの名無しさん
2005/03/31(木) 04:42:12ttp://www.microsoft.com/japan/developer/library/vccore/_core_.2f.opt.htm
0731デフォルトの名無しさん
2005/03/31(木) 05:00:34俺知らんかったよ
背のビーして人にアバドイスするもんじゃないね
反省、反省
0732デフォルトの名無しさん
2005/03/31(木) 08:46:08みなさんお答え頂きまして有難う御座います。
真ん中のは、構造体内の変数にアクセスする時に、わざわざ
オフセットを加えたりしないのかという事です。
staticやautoの構造体の場合は、その手間は必要ないのでは
ないかということです。
(ポインタの場合でも同様なのか良く分かりません)
。。つまらないとこ拘ってすいません。。
あと、struct pos[500000];/*int x;int yがメンバ*/
とかした場合には、int pos_x[500000]int pos_y[500000]
とかするよりCPUのメモリのキャッシュヒットが良いかもしれないと
かどうとか、どこかに書かれていた記憶があります。
なんか混乱してきた
0733デフォルトの名無しさん
2005/03/31(木) 09:03:41構造体に纏めるか纏めないか、ということかな?
具体例を書いてくれると判りやすいのだが。
struct Pos {int x; int y;};として、
Pos pos;
と
int pos_x; int pos_y;
を
Pos.x = 0; Pos.y = 0;
と
pos_x = 0; pos_y = 0;
のように使うなら全くといっていいほど同じコードになる筈。
Pos pos[10000];
と
int pos_x[10000]; int pos_y[10000];
の場合、ループ内でx, y を同時に使用するなら確かにキャッシュヒット的には構造体の方が有利。
つーか、C++の場合、構造体化することによって様様なコンストラクタを用意したり、
ちょっとしたハンドリング用のメンバ関数を用意するなどの便利さを重視するべきかも。
0734デフォルトの名無しさん
2005/03/31(木) 09:14:41そういうレベルが気になるならこんなとこで質問してないでアセンブラの読み方覚えてコンパイラが吐いたコード眺めたほうがはやい。
どのみち状況とコンパイラ次第なんだから。
0735デフォルトの名無しさん
2005/03/31(木) 09:17:46言いたかったのはそういうことです。
やはり同じコードになってくれるんですね。
(なってくれなかったりしたら嫌だなと思いまして書かせていただ
きました。)
利便性とか隠蔽とか(環境によってはコード補完とかも?)も考えた
ら素直にメンバ関数使うべきみたいですね。
0736デフォルトの名無しさん
皇紀2665/04/01(金) 00:45:46(一応720とかに書いてあるけどさ)
ポインタと配列なのでsizeofの結果が違うことと、ポインタの方はconstな
文字列を指してるんで変更できない。
int main(int argc,char** argv){
char *a="hogehoge";
char b[]="hogehoge";
//a[1]='a'; //これをやると環境にもよるがSegmentation fault
b[1]='a';
printf("a - %d %s\n",sizeof(a),a);
printf("b - %d %s\n",sizeof(b),b);
}
> ./a.exe
a - 4 hogehoge
b - 9 hagehoge
0737デフォルトの名無しさん
皇紀2665/04/01(金) 00:57:030738デフォルトの名無しさん
皇紀2665/04/01(金) 01:27:260739デフォルトの名無しさん
皇紀2665/04/01(金) 01:35:23いや、ケチつけんじゃなくてマジでさ。
0740デフォルトの名無しさん
皇紀2665/04/01(金) 12:24:19他の板はいろいろバリエーションあるのに。
0741デフォルトの名無しさん
皇紀2665/04/01(金) 12:37:30ム板なだけに、エポック秒で表示しろってか?
0742デフォルトの名無しさん
皇紀2665/04/01(金) 14:52:26それいいね、酸性
管理人にリクエストすれば良かった
0743デフォルトの名無しさん
皇紀2665/04/01(金) 16:41:070744デフォルトの名無しさん
皇紀2665/04/01(金) 16:46:52皇記A69/04/01(金)10:2D:02
皇記101001101001/100/01(金)10000:101101:10
0745デフォルトの名無しさん
皇紀2665/04/01(金) 18:04:312ch用ブラウザとかで好き放題表示変更できるのにな。
0746デフォルトの名無しさん
NGNG0747デフォルトの名無しさん
NGNGint
まず有り得ない。char使うとしても""が足りない。
2ch
変数名の先頭に数字は使えない。
=
全角。超有り得ない。なでしこでも使ってろピザ
0748デフォルトの名無しさん
NGNG0749デフォルトの名無しさん
NGNG0750デフォルトの名無しさん
NGNGint 21h 最強!
0751デフォルトの名無しさん
NGNGことになるのはC++独自の仕様?C言語は違うよな?
0752デフォルトの名無しさん
NGNGCでも同じ
ISO/IEC 9899:1999 5.1.2.2.3 Program termination -1
If the return type of the main function is a type compatible with int,
... reaching the } that terminates the main function returns a value of 0.
0753デフォルトの名無しさん
NGNGC++の書籍だと省略してるのが多い気がしたのは、単なる気のせいか。
それともC言語は昔は自動でリターンしてなくて、そのころの書籍を
見てたのかな。
0754デフォルトの名無しさん
NGNG752のはいわゆるC99
C89では省略すると未定義
http://www.bohyoh.com/CandCPP/FAQ/FAQ00016.html
0755デフォルトの名無しさん
NGNG0756デフォルトの名無しさん
NGNG0757デフォルトの名無しさん
NGNGMFCを使わずにコントロールを作ろうとしています。
継承なしの class CHogeCtrl を定義し、
Create メソッドで CreateWindow を呼んでウインドウを生成していてます。
ところが RegisterClassEx に渡す WindowProc をインスタンスメソッドにできないため、
WindowProc の中で呼び出し元のインスタンスにアクセスする方法が思いつきません。
コントロールのメッセージ処理はどうやって実装するのでしょうか。
知恵をお貸し下さい。お願いします。
0758デフォルトの名無しさん
NGNGSetWindowLong, GetWindowLong, GWL_USERDATA, reinterpret_cast, ...
これ以上必要ならここで聞け
http://pc8.2ch.net/test/read.cgi/tech/1112345886/l50
0759デフォルトの名無しさん
NGNGおお、感謝です!
毎回コールするしかなさそうなのが辛いところですが・・・
0760デフォルトの名無しさん
NGNGSetProp()やWNDCLASSEX::cbWndExtraとSetWindowLongPtrを使う方法や、std::map<HWND, CHogeCtrl *>を使ったり
ATL/WTLみたいにウィンドウ毎にWndProcのHWNDをCHogeCtrlに書き替えてメンバ関数のWndProcを呼び出したり色々手段はある。
0761デフォルトの名無しさん
NGNGありがとうございます。
色々手段があるのですね。
とても勉強になりました。
0762デフォルトの名無しさん
NGNGこの時にコールバック関数を渡して、C++からC関数を
コールバック呼出しすることってできるのでしょうか?
関数呼出し時のスタック内容が違うみたいなんでダメっぽいですが。。。
0763デフォルトの名無しさん
NGNGint hoge(){}
はどっち?
0764デフォルトの名無しさん
NGNG言語が違う。
0765デフォルトの名無しさん
NGNGでも、おそらくコンパイルすれば同じ結果になる。
0766デフォルトの名無しさん
NGNGバカヤロウ、スレ違いのネタ引っ張るんじゃねえ。
0767デフォルトの名無しさん
NGNG{
float m_radius;
float m_height;
int m_segmentU;
int m_segmentV;
float m_milk;
public:
void SetRadius( float m_radius ){ this->m_radius = m_radius; }
float GetRadius( void ){ return m_radius; }
void もみもみ(void);
void つまむ(void);
void わしづかみ(void);
int しぼり( int force ){ return m_milk; }
}
void main(void)
{
Cおっぱい m_cCup;
m_cCup.SetRadius( 20.0f );
}
オブジェクト指向ってこんなかんじ?
0768デフォルトの名無しさん
NGNG0769デフォルトの名無しさん
NGNGどうなのよって何が?
0770デフォルトの名無しさん
NGNG0771デフォルトの名無しさん
NGNG0772デフォルトの名無しさん
NGNG駄目だ駄目だ駄目だ!
そんなんじゃオブジェクト指向は程遠いぞ!
乳輪のメンバ変数と、個人的に舐めるメソッドを追加しないと!
0773デフォルトの名無しさん
NGNGばか?
0774デフォルトの名無しさん
NGNG0775デフォルトの名無しさん
NGNG0776デフォルトの名無しさん
NGNGメンバ変数だということを体現している。
0777デフォルトの名無しさん
NGNGてっきりmyを略した物だと思ってました
0778デフォルトの名無しさん
NGNGマイクロソフトが昔好きだった記法だよ
0779デフォルトの名無しさん
NGNGCカップおっぱいクラス(おっぱいクラスの派生クラス)
ほかはおっぱいクラスで宣言されているのでいらない
*/
class Cおっぱい : public おっぱい
{
public:
Cおっぱい(radius = 20.0) : おっぱい(radius) {}
virtual ~Cおっぱい();
public:
virtual void Doもみもみ();
virtual void Doつまむ();
virtual void Doわしづかみ();
virtual double Doしぼり();
}
int main()
{
Cおっぱい cCup;
cCup.Doもみもみ();
return 0;
}
0780デフォルトの名無しさん
NGNG何か特殊な意味があるのでしょうか?
0781デフォルトの名無しさん
NGNGデストラクタだよ。C++知らないの?
0782デフォルトの名無しさん
NGNG0783デフォルトの名無しさん
NGNG0784デフォルトの名無しさん
NGNGすみませんCしか知りません
0785デフォルトの名無しさん
NGNGそんな貴方も、明日からboost::lambdaで変態に!
0786デフォルトの名無しさん
NGNGが、テンプレに載ってない事で不安になって(;´Д`)
ボンビーなんで・・・コレを買えば間違いないという名著を教えてエロい人!
ちなみに、Cは入門書程度ならイケます
0787デフォルトの名無しさん
NGNG程度ならC++は100年早い
0788デフォルトの名無しさん
NGNG禿本。(>>4を見よ)
誰だって始めは初心者だ。モノになる人材に必要なのは手加減より必要事項が書いてあること。
俺が「初心者」だった頃は、これとコンパイラのマニュアルしかなかった。(初版だったが)
今だって、新しい仕事のたびに何かの初心者で大抵は英語版のマニュアルで必死に憶えている。
0789デフォルトの名無しさん
NGNGそれは本当のλ式じゃないじゃん。Cの関数ってカリー化もできないんじゃん。
0790デフォルトの名無しさん
NGNG0791デフォルトの名無しさん
NGNG結局一番肝心なことがわかってねえなw
0792デフォルトの名無しさん
NGNG肝心な事はなんだ
0793デフォルトの名無しさん
NGNG整式の加減乗除のプログラムを(趣味で)作っているのですが、
class poly
{
private:
int max_dim;
double* coefficients;
public:
/* 中略 */
poly& operator=(const poly& x);
/* 以下略 */
};
/* 中略 */
poly& poly::operator=(const poly& x)
{
/* 代入処理 */
return (*this);
}
とすると、
poly.cc: In member function `poly& poly::operator=(const poly&)':
poly.cc:59: error: passing `const poly' as `this' argument of `int
poly::getdim()' discards qualifiers
というエラーメッセージが出てしまうのですが、どう解決したらよいか分かりません。
よろしくお願い致しますm(_ _)m
0794デフォルトの名無しさん
NGNGメッセージの中に書いてあるint poly::getdim()が怪しいと思わないのか?
0796デフォルトの名無しさん
NGNG「変数」とか言っちゃう時点で、Cすら怪(ry
0797デフォルトの名無しさん
NGNGいや、だから、Cの仕様は数学的におかしいとこだらけなんだって。
0798デフォルトの名無しさん
NGNG数学的な正しさよりも、システムズプログラミングと
アプリケーションプログラミングの両方を
扱えることのほうが重要だから。
0799デフォルトの名無しさん
NGNGそして目も当てられないようなバグに悩まされるんだよね。
苦労が絶えないねぇ。
0800デフォルトの名無しさん
NGNGずっとバグの出にくい言語仕様スレだと思って書いてた。
0801デフォルトの名無しさん
NGNGそれはCの話?C++の話?
C++を知らずにCのことを前提として
C++も似たようなものだと思って
いっしょくたに批判してない?
>>797ではCのことを書いてるようだからそう思ったわけだが。
0802デフォルトの名無しさん
NGNG0803デフォルトの名無しさん
NGNGもちろんC++も知っているよ。
0804デフォルトの名無しさん
NGNG基本的なところは何も変わってないと思う。
0805デフォルトの名無しさん
NGNG0806デフォルトの名無しさん
NGNGポインタとか?ガーベッジコレクションがないとか?
0807デフォルトの名無しさん
NGNG一言で言うなら、「型」ですね。
0808デフォルトの名無しさん
NGNGよくわかんねーー
0809デフォルトの名無しさん
NGNGスレ違いっぽいので。
0810デフォルトの名無しさん
NGNG0811デフォルトの名無しさん
NGNGそうだ、それが正しい
0812デフォルトの名無しさん
NGNGちょっと辛いものがあるね。
0813デフォルトの名無しさん
NGNG僕は自分が解からないことならなんでも批判したがる人を見るとちょっと辛くなる
0814デフォルトの名無しさん
NGNG別に背反する意見じゃなくてどちらも正しいと思う。
それはどうでもいいから
CとC++において基本的なところである「型」のせいで
「目も当てられないようなバグに悩まされる」具体的な例を
示していただければ幸いです。
0815デフォルトの名無しさん
NGNGint a;
double b;
}
main()
{
return 0;
}
コンパイルデキネー
0816デフォルトの名無しさん
NGNGstruct Hoge {
int a;
double b;
};
int main()
{
return 0;
}
0817デフォルトの名無しさん
NGNGstd::locale system_locale("");
std::locale::global(system_locale);
char from_buf[BUFSIZ];
std::cin >> from_buf;
char const * from = static_cast<char const *>(from_buf);
std::size_t from_size = strlen(from);
char const * from_end = from + from_size;
char const * from_next = 0;
boost::shared_array<wchar_t> to_sp(new wchar_t[from_size]);
wchar_t * to = to_sp.get();
wchar_t * to_end = to + from_size;
wchar_t * to_next = 0;
std::memset(to, 0, sizeof(wchar_t) * (from_size));
codecvt_type::state_type state;
std::memset(&state, 0, sizeof(codecvt_type::state_type));
codecvt_type const & cvt = std::use_facet<codecvt_type>(system_locale);
if (cvt.in(state, from, from_end, from_next, to, to_end, to_next) == codecvt_type::error) {
std::wcout << std::strerror(errno) << std::endl;
std::exit(1);
}
std::codecvt を使って char * から wchar_t * を作るコードを書いたんだけど、
std::locale::global(system_locale); しないと動かないのは、こういうものなの?
0818マイク ◆yrBrqfF1Ew
2005/04/02(土) 18:38:070819デフォルトの名無しさん
2005/04/02(土) 23:18:51あげていますが、これってどういう原理なんですかね。クラスの継承で
1クッション置いてるようですが・・・。
それにVC++.netじゃコンパイルでこの例のdarw()の多義性解決できなかったし。
あんまり使えるもんじゃないのかな。
0820デフォルトの名無しさん
2005/04/02(土) 23:50:13解らないなら解るまで読め。
>それにVC++.netじゃ〜
理解してもいないのに使いこなせないのをコンパイラのせいにするな。
0821819
2005/04/03(日) 00:07:31なんで片方のdraw()を限定して呼び出せるのかというところです。
あと、使いこなす以前に、エラーになるという意味ですよ。
0822デフォルトの名無しさん
2005/04/03(日) 00:11:180823デフォルトの名無しさん
2005/04/03(日) 00:31:270824デフォルトの名無しさん
2005/04/03(日) 00:58:12>なんで片方のdraw()を限定して呼び出せるのか
それぞれlotteryDraw()とgraphicalObjectDraw()とに、呼び出す名前を変えたから。
0825819
2005/04/03(日) 01:42:38最初に呼び出してるのはdraw()ですよね、その例だと。
そしてどちらかのdraw()を呼び出すことが決まった結果、
そのdraw関数内の実装により、lotteryDraw()かgraphicalObjectDraw()が
呼び出されますよね。
ポインタの型がLottery*型だとなぜAuxLotteryの方のdarw()と決まるのか。
0826デフォルトの名無しさん
2005/04/03(日) 02:57:15>最初に呼び出してるのは
最初ってなんやねん
>ポインタの型がLottery*型だとなぜAuxLotteryの方のdarw()と決まるのか。
AuxLotteryを継承したクラス(LotterySimulation)でdraw()をオーバーライドしてないから。
0827デフォルトの名無しさん
2005/04/03(日) 05:42:420828デフォルトの名無しさん
2005/04/03(日) 05:52:180829デフォルトの名無しさん
2005/04/03(日) 06:07:520830デフォルトの名無しさん
2005/04/03(日) 06:27:410831デフォルトの名無しさん
2005/04/03(日) 06:51:540832デフォルトの名無しさん
2005/04/03(日) 07:32:340833デフォルトの名無しさん
2005/04/03(日) 09:00:490834デフォルトの名無しさん
2005/04/03(日) 09:33:58>AuxLotteryを継承したクラス(LotterySimulation)でdraw()をオーバーライドしてないから。
でも、AuxGraficalObjectも同じ条件ではないのですか?
こちらにもdraw()があってそれを継承したときにオーバーライドしてませんよね。
0835デフォルトの名無しさん
2005/04/03(日) 11:27:49keybd_eventを使って別のアプリに方向キー押下を伝える処理でつまずいています。
手動でキーを長押しすると、WndMessageにキーイベントが連続して入力されますよね。
例えば、
keybd_event(VK_DOWN,0x50,KEYEVENTF_EXTENDEDKEY,0);
で下キーダウンさせれば、
keybd_event(VK_DOWN,0xd0,KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP,0);
でキーアップするまでの間は、キーがリピートされても良い様な気がするのですが、
如何なものでしょうか?
スキャンコードは、ここから拾ってきました。
http://www.microsoft.com/whdc/device/input/Scancode.mspx
0836デフォルトの名無しさん
2005/04/03(日) 11:29:31初心者なので教えていただきたいのですが、
�@『ある計算を1万回計算して、その結果をすべて出力する
プログラム。』
�A『ある計算を1万回計算して、その結果は出さずに、
その1万回計算した結果の平均だけを出力するプログラム』
この�@と�Aのプログラムはどうやって書いたらいいんですか?
簡単に書けるプログラムですか?
かなり初心者なので、すいませんが教えていただきたいです。
0837デフォルトの名無しさん
2005/04/03(日) 11:31:140838デフォルトの名無しさん
2005/04/03(日) 11:39:39ここは C++ スレなんで、C の話は他でやれ。
宿題は宿題スレへ池。以上。
0839836
2005/04/03(日) 11:42:10C++でもいいです。教えてください
0840デフォルトの名無しさん
2005/04/03(日) 11:53:08>>839
本人なら謝れ。成り済ましならそれくらいにしとけ。
0841デフォルトの名無しさん
2005/04/03(日) 11:53:38出来るところまで自分で書いてから来なさい。
書こうにも全く書けないなら宿題スレが初心者スレへ行け。
0842デフォルトの名無しさん
2005/04/03(日) 11:54:27while(1){
printf(1+1);
}
0843デフォルトの名無しさん
2005/04/03(日) 12:40:58上位2バイトは0で埋められるというのは、
C++の仕様で定義されていますか?
それと、C++スタイルで書きたい場合こういうキャストはreinterpret_castでいいのですか?
0844デフォルトの名無しさん
2005/04/03(日) 14:11:46定義されてない。ポインタ型と同サイズの整数型に関しては、reinterpret_cast で
可逆変換が可能だと規定されてるが、そのマッピング方法は処理系依存。
ただ、一般的なアーキテクチャの CPU を前提とするとビットパターンを保って
変換するのが妥当なので、それで期待通りの動作をすると思うよ。いずれに
せよ処理系依存なので、詳しくは処理系のマニュアルを読むか、処理系を
晒してくれ。
0845デフォルトの名無しさん
2005/04/03(日) 15:59:11なんでそこでAuxGraficalObjectが出てくる?
Lotteryと継承関係はないだろ。
AuxLotteryでLotteryのdraw()をオーバーライドしてlotteryDraw()を呼んでるから、
それ以降の継承でdraw()をオーバーライドしない限りAuxLotteryのdraw()が継承されてlotteryDraw()が呼ばれる。
あー、らちがあかん。
おまえのいう
>VC++.netじゃコンパイルでこの例のdarw()の多義性解決できなかった
このソースをあげろ。
0846デフォルトの名無しさん
2005/04/03(日) 17:23:02は、コンパイルを通り、
std::ofstream fout = std::ofstream("test.txt");
は、コンパイルを通りませんでした。
何が間違っているのか教えてください。
c++初めて2日目なのであまりよくわかりません。
0847デフォルトの名無しさん
2005/04/03(日) 17:27:41コピーコンストラクタが protected だから
最適化で呼ばれなくなったコピーコンストラクタも
アクセス制限のチェックは回避されないことになっている
0848デフォルトの名無しさん
2005/04/03(日) 17:35:130849デフォルトの名無しさん
2005/04/03(日) 17:39:310850846
2005/04/03(日) 18:01:46今の自分には理解不可能なようです。
ありがとうございました。
0851!847
2005/04/03(日) 18:48:41おいおい、簡単に投げ出しすぎだぞ。
前者は、std::ofstream型の実体を一つだけ(fout)作成している。
後者は、std::ofstream型の実体を一時的に作成してからそれを使ってもう一つ(fout)作成しようとしている。
このとき、コピーコンストラクタを使用するわけだが、それがprotectedなのでエラーになるわけだ。
0852デフォルトの名無しさん
2005/04/03(日) 18:51:43どちらもインスタンスを初期化するんですよね?
やさしいc++には
class名 インスタンス名(引数)
は
class名 インスタンス名 = class名(引数)
と書くことができる。と記述されているんですが、>>847によると違うんですよね?
0853852
2005/04/03(日) 19:00:24>>851
そうなのですか。全く同じ処理で書き方が違うのかと思ってました、今まで。
参考になりました。有り難うございました。
0854デフォルトの名無しさん
NGNG0855デフォルトの名無しさん
2005/04/03(日) 19:28:22コンストラクタを書かないとデフォルトコンストラクタが用意されるんですよね?
そう本に書いてありました。
てことは引数ありとかなしとかのコンストラクタを書けば、デフォルトコンストラクタは用意されないんですよね?
引数ありのコンストラクタ、デフォルト引数付き、を一つだけ書いたプログラムがあるんですが、
クラス名 変数名();と書いたら、デフォルト引数が代入されたコンストラクタが呼ばれると思ったら、そのコンストラクタが呼ばれないようなんです。
てかまるでデフォルトコンストラクタが呼ばれているようなんです。
もしかして、デフォルトコンストラクタが定義されるのは、
「コンストラクタを定義しなかったとき」ではなくて
「引数無しのコンストラクタを定義しなかったとき」なんですか?
私は何を勘違いしてますか?先生助けて!
0856デフォルトの名無しさん
2005/04/03(日) 19:29:53関数宣言になるだけだな
0857855
2005/04/03(日) 19:50:33マジっスか!?
main()の中に書いてるんですけど、定義も書いてないんですけど。
関数を宣言して、どうやって使うんでしょうか?
興味が湧いてきたんですが資料がないです。ネットにイイところないですかね。
0858デフォルトの名無しさん
2005/04/03(日) 19:55:45へたに手加減した入門書に頼るからわからない・・・
0859デフォルトの名無しさん
2005/04/03(日) 20:16:28http://www112.sakura.ne.jp/~kaientai-project/creategame2.htm
0860デフォルトの名無しさん
NGNGプログラマが決まってねーじゃんwwwwうんこwww
0861デフォルトの名無しさん
2005/04/03(日) 20:22:450862デフォルトの名無しさん
2005/04/03(日) 20:23:350863デフォルトの名無しさん
NGNGC#っていうのはまぁいいとして、なんでsourceforgeとかじゃいけないのかがわからん。
0864デフォルトの名無しさん
2005/04/03(日) 20:35:05「乳揺れの実装」って…ワロース
0865デフォルトの名無しさん
2005/04/03(日) 20:42:300866デフォルトの名無しさん
2005/04/03(日) 20:51:31関数を宣言したらあとは呼ぶなりなんなりご自由に。
宣言なんだからコンパイラはどこか別のファイルにでも関数の定義があってリンカが解決してくれるだろうと思っている。
0867デフォルトの名無しさん
2005/04/03(日) 21:00:07コンストラクタの引数が1つだけのとき、次の2つは同じ扱いなのは知っているだろ。
class名 インスタンス名(引数);とclass名 インスタンス名 = 引数;
class名(引数)は一時オブジェクトの作成を意味する。
そして普通、クラスは自分自身のクラスを引数に1つ取るコンストラクタ(コピーコンストラクタ)を持っている。
つまりclass名 インスタンス名 = class名(引数)ってやると、
そのインスタンスは一時オブジェクトが実引数のコピーコンストラクタで初期化されていると言うことになる。
0868デフォルトの名無しさん
2005/04/03(日) 21:26:57髪型は、リアルで、2ヶ月は変更不可。
0869855=857
2005/04/03(日) 21:38:47関数宣言だけで、定義が何処にもなくてもコンパイルが通って実行ファイルが出来てしまうんですが、どういうことでしょう?
定義がないと実行ファイルまでたどり着かないんでないんですか?
0870デフォルトの名無しさん
2005/04/03(日) 21:44:15その関数を実際に使おうとしない限り、定義がなくても問題ない
0871デフォルトの名無しさん
2005/04/03(日) 21:54:02渤海国のかたですか?
0872817
2005/04/04(月) 13:11:550873デフォルトの名無しさん
2005/04/04(月) 14:11:57【C++】STL(Standard Template Library)相談室
http://pc5.2ch.net/test/read.cgi/tech/1095583235/139-
0875デフォルトの名無しさん
2005/04/04(月) 17:06:31>>874だってさ、今ごろレス付けられて大変だな。
>>874
139から順に見てくとヒントがあると思うが、それでは足りんのか?
0876デフォルトの名無しさん
2005/04/04(月) 17:23:13ただ単純に 1文字づつキャストしてコピーしてただけだった。
0877817
2005/04/04(月) 17:33:21> std::codecvt を使って char * から wchar_t * を作るコードを書いたんだけど、
> std::locale::global(system_locale); しないと動かないのは、こういうものなの?
そのスレではこの質問の答えが見付からない。
0878デフォルトの名無しさん
2005/04/04(月) 18:19:25お呼びだよ。がんばってね〜
0879876ぢゃないけど
2005/04/04(月) 18:30:17そういうものらしい。
http://www.scl.kyoto-u.ac.jp/scl/appli/appli_manual/SUNWspro/WS6U2/ja/manuals/stdlib/user_guide/loc_io/3_3.htm#332
>アメリカ英語 ASCII ロケールに対応した、標準 C++ ライブラリの定義済みの
>ロケールオブジェクトである locale::classic() を
:
>大域ロケールは、最初は、前述のクラシックロケールになっています。
:
>入出力ストリームのような国際化構成要素では、デフォルトで大域ロケールを使用します。
0880817
2005/04/04(月) 19:18:02サンクスコ。
マルチロケールの場合は std::codecvt を使ってても、
適宜 std::locale::global() を毎回呼び出さにゃならんのか。
自前で std::codecvt 使って変換するより、stream に imbue した方が良さげやね。
0881デフォルトの名無しさん
2005/04/04(月) 20:29:140882デフォルトの名無しさん
2005/04/04(月) 22:36:00↑
こんくらい馬鹿げた分類だ
俗に STL と呼ばれるライブラリは ISO/IEC14882 で定義されている C++ そのものの一部にすぎない
0883デフォルトの名無しさん
2005/04/04(月) 22:47:570884デフォルトの名無しさん
2005/04/04(月) 22:58:52自作するのは悪くない
できの悪い自作を使っていればあふぉ
0885デフォルトの名無しさん
2005/04/04(月) 23:23:36つか、もう STL って呼称は不要じゃないかとおもゆ。
0886デフォルトの名無しさん
2005/04/05(火) 02:28:110887デフォルトの名無しさん
2005/04/05(火) 03:57:26POD-type以外ならば論外
0889デフォルトの名無しさん
2005/04/05(火) 07:35:20>817がcodecvt::state_typeに対してやってるな。<ZeroFill
0890デフォルトの名無しさん
2005/04/05(火) 07:44:37・全てのデータメンバが public(メンバ内メンバについても再帰的に適用)
・vtbl を持たない
つまり、memset を書く側が全ての責任を掌握しているならOK。
0891デフォルトの名無しさん
2005/04/05(火) 08:24:42PODでも、ポインタや浮動小数点数に対する memset が
意味を成さない事を考えると、やっぱり論外だろ。
0892886
2005/04/05(火) 09:54:31つーか、クラス設計側からmemset()せよと言ってこない限りやるなって感じか。
それだったら寧ろ、クラス側で初期化関数でも用意して欲しいもんだ。
0893デフォルトの名無しさん
2005/04/05(火) 10:39:580894817
2005/04/05(火) 12:48:54codecvt_type::state_type == std::mbstate_t です。
これは C の構造体なので、memset() しました。
0895デフォルトの名無しさん
2005/04/05(火) 14:32:480896デフォルトの名無しさん
2005/04/05(火) 17:22:20構造体の初期化なら、こっちの方がわかりやすいのでは。
codecvt_type::state_type state = {0};
0897デフォルトの名無しさん
2005/04/05(火) 20:54:40アーキテクチャに依存して良いこと確定なら、そういうコードを
書いても構わんと思う。ぶっちゃけ Win32 API 使ったプログラム
書いてるなら、そこだけ気をつかっても移植性ないわけで。
0898デフォルトの名無しさん
2005/04/06(水) 01:20:55> アーキテクチャに依存して良いこと確定なら
memset や ZeroMemory で埋めること自体にたいしたメリットが無いのに、
そんな曖昧な条件付で認める意味がわからない。
既に書かれたコードを修正してまわる必要は無い、ということなら話はわかるが。
0899デフォルトの名無しさん
2005/04/06(水) 09:03:43wofstream a;
a << L"ABCDEFG";
のようにやればワイド文字も出力できるらしいことを知ったのですが
同じように日本語を出力すると
a << L"あいうえお";
ファイルを見ても出力されてません。
日本語は無理なんでしょうか。
よろしくお願いします。
0900デフォルトの名無しさん
2005/04/06(水) 09:07:56#include <locale>
int main()
{
std::locale::global(std::locale("japanese"));
0901899
2005/04/06(水) 09:55:42Winアプリのログ出力用に使おうと思って
早速やってみたんですがうまくいかず、
コンソールでやってみたら、うまくいきました。
Win32だとできないんでしょうか・・・。
質問ばかりですみません。
0902デフォルトの名無しさん
2005/04/06(水) 10:02:56WindowsアプリならWinMainとかへ移せよ。
main()じゃなくてもとにかくワイド文字を使ったストリームを使うより前にstd::locale::global(std::locale("japanese"));があれば出来るはず。
0903899
2005/04/06(水) 10:13:04いろいろテストしてみて分かったのは
std::locale::global(std::locale("japanese"));
する前にwofstreamが宣言されているとダメ。
=グローバル変数だとダメ。
とりあえずポインタをグローバルにして
std::locale::global(std::locale("japanese"));
のあとにnewでやってみたいと思います。
ありがとうございました。
0904デフォルトの名無しさん
2005/04/06(水) 10:19:240905デフォルトの名無しさん
2005/04/06(水) 12:18:33それならこうするとどう?
wofstream ofs("hoge"); //グローバル
ofs.imbue(std::locale("japanese")); //WinMainかどこか
0906デフォルトの名無しさん
2005/04/06(水) 14:42:26setlocale( LC_ALL,"" );
0907デフォルトの名無しさん
2005/04/07(木) 00:04:36> memset や ZeroMemory で埋めること自体にたいしたメリットが無いのに、
構造体のサイズが変わっても大丈夫。いや、そのためのコンストラクタなんだが、
C/C++ ハイブリッドでプログラミングせにゃならん場合もまだあるんで。
ついでに構造体の要素に構造体サイズを書き込むようにしておくと、関数
呼び出しインターフェースの後方互換性を保ちつつ拡張しやすい。
0908デフォルトの名無しさん
2005/04/07(木) 00:11:54単にバグ発見を遅らせるだけのような気がするのだが
0909デフォルトの名無しさん
2005/04/07(木) 00:16:07sockaddr_inとかレガシーな構造体をmemsetしてるの結構
みかけるんだけど
0910デフォルトの名無しさん
2005/04/07(木) 00:27:41逆だろ。ポインタが含まれてればアクセスしたとたん落ちる。
0911デフォルトの名無しさん
2005/04/07(木) 00:50:25メンバをひとつひとつ 0 クリア (整数・実数) または NULL クリア (ポインタ)
するのが面倒っちいとき、memset() なら一行で、かつメンバ変数の増減が
あっても気にしなくていい、とか。
個人的には気持ち悪さが先にたつけどね。
0912デフォルトの名無しさん
2005/04/07(木) 01:14:00ってやればmemsetすらいらないんだけどな。
0913デフォルトの名無しさん
2005/04/07(木) 02:02:050914デフォルトの名無しさん
2005/04/07(木) 02:11:23HOGE *hage
hage = malloc(sizeof(HOGE));
*hage = {0};
こうできなきゃ実質意味無い
0915デフォルトの名無しさん
2005/04/07(木) 02:51:290916デフォルトの名無しさん
2005/04/07(木) 10:31:52HOGE const zero_initialized_HOGE = {0};
*hage = zero_initialized_HOGE;
こっちのほうがマシ。
0917デフォルトの名無しさん
2005/04/07(木) 10:33:50calloc使えばええやん
0918デフォルトの名無しさん
2005/04/07(木) 11:02:450919916
2005/04/07(木) 11:07:34あ、それじゃぁ
*hage = HOGE();
でいいのか。
zero_initialized_〜 はCで使ってた方法だったようだ。
0920デフォルトの名無しさん
2005/04/07(木) 20:00:56でたらめこくでねぇ
>>919
よいわけねぇべ
0921デフォルトの名無しさん
2005/04/07(木) 20:02:09違うの?
詳細キボン
0922デフォルトの名無しさん
2005/04/07(木) 21:02:33それじゃ、スタックに乗っちゃうじゃん
0923デフォルトの名無しさん
2005/04/07(木) 21:58:39実際やってみれ
0924デフォルトの名無しさん
2005/04/08(金) 00:06:50static つけるか、 namespace スコープに定義を移すか、 どっちかすればいいだろ。
0925デフォルトの名無しさん
2005/04/08(金) 00:26:02ttp://www.kuzbass.ru/docs/isocpp/expr.html#expr.new
ttp://www.kuzbass.ru/docs/isocpp/expr.html#expr.type.conv
ttp://www.kuzbass.ru/docs/isocpp/decl.html#dcl.init
規格の 5.3.4.15 と 5.2.3.2 により、 T がPOD型であれば
new T() および T() の値はデフォルト初期化されることになっている。
8.5.5 により、POD型に対するデフォルト初期化はゼロ初期化になる。
ゼロ初期化は T x = {0} と同様の初期化である。
>>921
規格への準拠度に不安のあるコンパイラ使ってるんじゃなければ、安心していい。
0926デフォルトの名無しさん
2005/04/08(金) 01:05:550927デフォルトの名無しさん
2005/04/08(金) 01:27:46はいはい関数宣言ね。
0928デフォルトの名無しさん
2005/04/08(金) 06:05:040929デフォルトの名無しさん
2005/04/08(金) 08:49:280930デフォルトの名無しさん
2005/04/08(金) 09:58:230931デフォルトの名無しさん
2005/04/08(金) 09:58:570932925
2005/04/08(金) 10:13:30ttp://www.open-std.org/jtc1/sc22/WG21/docs/cwg_defects.html#178
struct T { int i; std::string s }; のような(PODとは言えない)型についての初期化動作が
新しい値初期化(value initialize)という言葉によって規定されることになっている。
0933デフォルトの名無しさん
2005/04/08(金) 12:14:470934デフォルトの名無しさん
2005/04/10(日) 15:32:220935デフォルトの名無しさん
2005/04/11(月) 01:19:36newをわざと例外をthrowするようにしてstringstreamにoperator<<で書き込んでみたけど
例外は飛んで来ませんでした。
0936デフォルトの名無しさん
2005/04/11(月) 01:25:21自分でいじったnewがoperator<<で呼ばれなかっただけじゃない?
0938デフォルトの名無しさん
2005/04/11(月) 01:55:19ストリームは例外をthrowする。
原因を知りたければソース晒せ。
0939デフォルトの名無しさん
2005/04/11(月) 02:21:51streamは古いC++との互換性を重視し、デフォルトでは例外を飛ばさない
ようにしてあるが、意図的に飛ばす事もできる。
それがメンバ関数 exceptions()。但し飛ばせる例外はstd::ios_base::failure
クラスに含まれるフラグに限られる。具体的にはstd::ios::eofbit、std::ios::failbit、
std::ios::badbit等。
0940デフォルトの名無しさん
2005/04/11(月) 02:23:440941デフォルトの名無しさん
2005/04/11(月) 02:34:00ユーザーがテンプレートを介して例外を飛ばす処理を混ぜた場合は
ストリームの例外マスクは関係ないだろ。
0942デフォルトの名無しさん
2005/04/11(月) 03:08:04#include <iostream>
#include <sstream>
class Except {
};
std::ostream& operator<<(std::ostream& os, const Except& ex) throw(int)
{
throw 1;
}
int main()
{
std::ostringstream ostr;
Except ex;
try {
ostr << ex;
}
catch (const int&) {
std::cout << "int thrown from ostringstream\n";
}
}
0943デフォルトの名無しさん
2005/04/11(月) 11:26:05は?
0944935
2005/04/11(月) 12:28:43exceptions周辺のソースを見たところ
ストリームバッファやnew等が例外を投げた場合はその例外がそのまま飛んできて
例外が投げられなくてもストリームバッファの処理がエラーで返った等の場合はfailureがthrowされるようですね。
0945デフォルトの名無しさん
2005/04/11(月) 23:35:36{
class C;
class B
{
public:
class B(C& r) { int i = r.i; }
};
class C
{
public:
int i;
};
};
A::BのコンストラクタはCの完全な宣言が必要なはずなのにコンパイルが通ってしまいます。(VC++6)
このB, CをAの外に出すとCが認識できない型とエラーになります。
この振る舞いは言語規格として正しいのでしょうか?
0946デフォルトの名無しさん
2005/04/12(火) 00:52:40g++ (GCC) 3.4.1 (cygming special)
:7: error: expected `)' before '&' token
0947デフォルトの名無しさん
2005/04/12(火) 02:11:530948デフォルトの名無しさん
2005/04/12(火) 05:33:00となるような、引数の符号を返してくれる関数って標準にありませんか?
0949デフォルトの名無しさん
2005/04/12(火) 05:52:580950デフォルトの名無しさん
2005/04/12(火) 09:30:24なるほど、こんなもんかな。
template<class T> int sign(const T& a){return (a > 0) - (a < 0);}
0951デフォルトの名無しさん
2005/04/12(火) 09:33:270952デフォルトの名無しさん
2005/04/12(火) 09:57:02「符号」が意味を成すような型に、大小比較を要求して何が悪いの?
0953952
2005/04/12(火) 09:58:020954デフォルトの名無しさん
2005/04/12(火) 09:59:300955デフォルトの名無しさん
2005/04/12(火) 10:03:03template<class T> int sign(const T& a){return (0 < a) - (a < 0);}
で。std::min()/max()にあわせて < のみ必要ということで。
0956デフォルトの名無しさん
2005/04/12(火) 10:04:58それなら漏れも全然文句なし
0957デフォルトの名無しさん
2005/04/12(火) 10:35:010958デフォルトの名無しさん
2005/04/12(火) 10:37:27∩∩
(x0 )
0959デフォルトの名無しさん
2005/04/12(火) 11:08:47ってあるのか?
0960950=955
2005/04/12(火) 11:17:07そう言う横着する香具師もいるかも知らん。
少なくとも、敢えて両方使う必要がないと納得した。
#実際、自分でもそう言うクラス作ってるし。
##まぁ、符号判断はしてないが。
0961デフォルトの名無しさん
2005/04/12(火) 11:33:550962デフォルトの名無しさん
2005/04/12(火) 12:32:25どう定義されているのでしょうか?
自分で作ったクラスにvectorやlistのiteratorと同じものを実装しようとしてます。
0963デフォルトの名無しさん
2005/04/12(火) 12:51:50そこでboost::operatorsですよ
0964960
2005/04/12(火) 14:03:07仕事ではboostを使いにくい事情があるし、個人ではSTLを一通り理解してからと思ってるので
boost::operatorsは知らなかった。よければ簡単に解説してくれないかな。
0966デフォルトの名無しさん
2005/04/12(火) 15:38:41問題はそこではなくて、
単純なシンタックスの方。
>class B(C& r) { int i = r.i; }
これがおかしいと>946は指摘している。
0968デフォルトの名無しさん
2005/04/12(火) 17:36:17let's boostをそのまま引用
「特別な理由がなければ、a > b と b < a は同じ意味にすることが多いと思います。
要するに、operator< を定義してしまえば即 operator> の定義も決まると言うこと。
operator== と operator!=、あるいはこれらと operator<=、operator>= の関係も同じですね。
こういうのを、最低限の演算子だけは定義してから残りを boost::operators に任せることで、
自動的に生成することができます。」
operator>を定義すれば勝手にoperator<も定義してくれる…とかそういう話
operator+=からoperator+ なども。
0969デフォルトの名無しさん
2005/04/12(火) 19:04:38の方がいいんでねぇかなぁ。
0971デフォルトの名無しさん
2005/04/12(火) 21:37:200972デフォルトの名無しさん
2005/04/12(火) 23:04:44>>961
>Effective C++ の第3版
第2版と第3版の差分って何ですか?
>>962
end()で得られるイテレータはそもそもインクリメントの事前条件を
満たさないので結果は未定義です.
0973961
2005/04/13(水) 01:04:27差分というか構成が全然違う。
ttp://www.codecomments.com/showthread.php?s=3bf5b9d9a7292a490bd71acc7abdc171&threadid=408863&perpage=10&pagenumber=2
0974デフォルトの名無しさん
2005/04/13(水) 01:08:13さらに汎用的にするなら、比較の基準となる値を特性クラスで渡すとか。
// 必要なら特殊化する
template <typename T> struct traits { static T const base = T(0); };
// ここも必要なら U に適当なクラスを渡す
template<class T, class U = traits<T> > int sign(const T& a)
{ return (U::base < a) - (a < U::base); }
0975デフォルトの名無しさん
2005/04/13(水) 01:33:20いや。gccでも(>967の修正が済んだ状態で)通る。
VCもgccも、メンバ関数内ではネストされたクラスはすでに完全な型になっているようだった。
しかし規格(FDIS)中にOK/NGを明確に決定するような記述は見つからなかった。
ただ、 9.2.2 に
"the class is regarded as complete within function bodies"
とような記述は有る。
一応関係はしていると思うけど、これで
ネストされたクラスについても同様とは言えないはず。
0976972
2005/04/13(水) 01:48:12うっひょー!買い即決ですっ!今春遅くですね.
http://www.amazon.co.jp/exec/obidos/ASIN/0321334876/
>974
あぁ,そうか.特殊化できるのを忘れてました.
ちなみに,関数テンプレートのテンプレート引数にはデフォルト指定できないですよ.
0977デフォルトの名無しさん
2005/04/13(水) 05:07:190979デフォルトの名無しさん
2005/04/13(水) 11:48:31ゴシップ雑誌と大して変わらない価値しかない。
0980デフォルトの名無しさん
2005/04/13(水) 20:52:55そんなことは聞いていない
0981デフォルトの名無しさん
2005/04/13(水) 20:54:18聞かれなくても意見は言う。
0982デフォルトの名無しさん
2005/04/13(水) 22:11:02お前のレスはゴシップ雑誌と大して変わらない価値しかない。
0983デフォルトの名無しさん
2005/04/13(水) 22:14:01ほう、俺の意見はそんなに価値があるのか。
0984デフォルトの名無しさん
2005/04/13(水) 22:17:11お前、常時このスレ監視してんのか!?
0985デフォルトの名無しさん
2005/04/13(水) 22:22:39仕事中でもレスが付けばすぐに分かる。
0986デフォルトの名無しさん
2005/04/13(水) 23:03:16お前まだ仕事してんのか!?2chなんか見てる暇あるんなら、さっさと仕事片付けろよ!
0987デフォルトの名無しさん
2005/04/13(水) 23:52:410988デフォルトの名無しさん
2005/04/14(木) 00:37:40というか、コレでやり込めたつもりだったんだ。
はは、すげー脳内回路してんな。
0989デフォルトの名無しさん
2005/04/14(木) 00:43:58元の話題は>>977だろ。
というか、コレでやり込めたつもりだったんだ。
はは、すげー脳内回路してんな。
0990デフォルトの名無しさん
2005/04/14(木) 00:58:140991デフォルトの名無しさん
2005/04/14(木) 01:01:44>>977の話題で、やり込めたと思えるお前は一体なんだ。
そして、俺は「やり込めた」とか言ってないからさ。
頭悪い鸚鵡返しはダメでしょ。お前の脳内回路はやっぱアレやね。
0992デフォルトの名無しさん
2005/04/14(木) 01:03:420993デフォルトの名無しさん
2005/04/14(木) 01:05:48ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いします。
IDE(VC++など)などの使い方の質問もその開発環境のスレに
お願いします。
前スレ C++相談室 part39
http://pc8.2ch.net/test/read.cgi/tech/1106527792/
過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0994デフォルトの名無しさん
2005/04/14(木) 01:06:360995デフォルトの名無しさん
2005/04/14(木) 01:07:12俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
0996デフォルトの名無しさん
2005/04/14(木) 01:08:470997デフォルトの名無しさん
2005/04/14(木) 01:09:420998デフォルトの名無しさん
2005/04/14(木) 01:11:06C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問もこのスレにお願いします
IDE(VC++など)などの使い方の質問もその開発環境のスレに
お願いします。
前スレ C++相談室 part39
http://pc8.2ch.net/test/read.cgi/tech/1106527792/
過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0999デフォルトの名無しさん
2005/04/14(木) 01:11:221000デフォルトの名無しさん
2005/04/14(木) 01:11:4410011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。