C++相談室 part18

このエントリーをはてなブックマークに追加
1v(^・^)v
C++に関する質問はこちらへどうぞ。
ただし質問の前にFAQに一通り目を通してください。
また、テンプレートライブラリ(STL含む)に関する質問は
専用の別スレへどうぞ。

過去スレ、関連スレ、関連リンクなどはこちら>>2-15
2v(^・^)v:03/04/13 05:02
■基本■
[Stroustrup]
禿 http://www.research.att.com/~bs/
C++に関するリンクの総本山でもあります。

[C++ Final Draft International Standard]
http://www.kuzbass.ru/docs/isocpp/
http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf

[JTC1/SC22/WG21 - C++]
http://std.dkuug.dk/jtc1/sc22/wg21/
規格書の重箱の隅的な話題などが読めます。

[C/C++ Users Journal]
http://www.cuj.com/
[Object Management Group]
http://www.omg.org/
[Association of C & C++ Users]
http://www.accu.org/

[news]
news:comp.lang.c++
news:comp.lang.c++.moderated

[ML]
cppll(日本語) http://www.trickpalace.net/cppll/
メインページにC++に関する良質なC++日本語リンク集があります。
3v(^・^)v:03/04/13 05:03
■Document■

C++FAQ Lite http://www.parashift.com/c++-faq-lite/
C++FAQ(日本語) http://www.bohyoh.com/CandCPP/FAQ/
Cとその仕様を比較しながらの解説なので分かりやすい。
*** 質問の前に必ずこの二つに目を通してください ***

[STL]
http://www005.upp.so-net.ne.jp/episteme/html/stlprog/
Standard Template Library プログラミング on the Web
リファレンス的内容。http://www.wakhok.ac.jp/~sumi/stl/
STL Programmer's Guide http://www.sgi.com/tech/stl/
[boost]
これに関しては公式のドキュメント、又はソースを読むのが一番です。
ただし日本語でいくつか有益な情報が読めます。
Let's boost http://www.kmonos.net/alang/boost/
shinichiroさん http://user.ecc.u-tokyo.ac.jp/~g940455/wp/
news news:gmare.comp.lib.boost.devel
4v(^・^)v:03/04/13 05:03
5v(^・^)v:03/04/13 05:04
■Compiler■
[GCC]
http://gcc.gnu.org/
(Windows上でのPOSIX環境構築 http://www.cygwin.com)
[Borland C++ Compiler]
http://www.borland.co.jp/cppbuilder/freecompiler/
[.NET Framework SDK]
1.0 http://www.microsoft.com/japan/msdn/netframework/downloads/sdk.asp
1.1βhttp://msdn.microsoft.com/downloads/default.asp?url=/downloads/sample.asp?url=/MSDN-FILES/027/002/056/msdncompositedoc.xml
[MSVC] コンパイラ以外のツール、ドキュメントです。
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
(一括ダウンロードの時は上のURLに続けてこちらを入力してください
default.htm?p=/msdownload/platformsdk/sdkupdate/psdk-full.htm)

なお上記三者を組み合わせたプログラミングにおいてはこちらが分かりやすいです。
http://www.geocities.com/Tokyo/Ginza/5432/documents/winprog/index.html

[DigitalMars]
http://www.digitalmars.com/
[Comeau]
http://www.comeaucomputing.com/
[intel C++ Compiler]
http://www.intel.com/software/products/compilers/
[metrowerks]
http://www.metrowerks.com/mw/default.htm
6v(^・^)v:03/04/13 05:04
■Libraries■
Boost http://www.boost.org/
STLport http://www.stlport.org/
Loki http://www.moderncppdesign.com/
LokiPort
MSVC7 http://www.geocities.com/rani_sharoni/LokiPort.html
MSVC6.0 SP5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport

ACE/TAO http://www.cs.wustl.edu/~schmidt/
Network、Thread、ORBなどのポータブルなライブラリ
Blitz++ http://www.oonumerics.org/blitz/
数値計算ライブラリとして人気がある、らしい
spirit http://spirit.sourceforge.net/
flex++ Bison++ http://www.idiom.com/free-compilers/TOOL/BNF-15.html
パーサジェネレータ

他ライブラリリンク集
http://www.trumphurst.com/cpplibs/cpplibs.phtml
7v(^・^)v:03/04/13 05:05
8v(^・^)v:03/04/13 05:36
■関連スレ(テンプレートを用いたライブラリ中心)■
【C++】template 統合スレ -- STL/Boost/Loki, etc.
part1 http://pc2.2ch.net/test/read.cgi/tech/1037795348/
part2 http://pc2.2ch.net/test/read.cgi/tech/1047978546/l50
【C++】Boost使い集まれ!
http://pc2.2ch.net/test/read.cgi/tech/1033830935/
STLスレッド
part1 http://pc.2ch.net/tech/kako/1004/10042/1004287394.html
part2 http://pc3.2ch.net/tech/kako/1026/10267/1026793823.html
Generic Programming with C++ Template
http://pc.2ch.net/tech/kako/1008/10085/1008593126.html
9v(^・^)v:03/04/13 05:37
10v(^・^)v:03/04/13 05:38
乙カレー。まったりいこうよ。
最近C++をはじめたのですが、main関数の書式ってどう書くのが正しいのでしょうか?

前スレを見たかぎりでは
int main()とかvoid main()とかint main(int ac,char **av) とかvoid main(void)ですよね。
それにreturn 0を書いてあったりなかったり、そもそもreturn 0ってなんですか?
windows上で動いている時などはOSに0を返してるって事ですか?
13デフォルトの名無しさん:03/04/13 09:02
>>12
○ int main()
× void main()
○ int main(int ac,char **av)
× void main(void)

> return 0
あってもなくてもよい。mainだけは、無くても勝手にreturn 0されるはず。

> windows上で動いている時などはOSに0を返してるって事ですか?
そのプログラムを呼び出したホスト環境に0を返してるってこと。
14デフォルトの名無しさん:03/04/13 09:07
>>1
1512:03/04/13 09:17
レスありがとうございます。
Cの本ではvoid main(void)と書いてあったのですが、
× void main() × void main(void)この2つはだめなのですか?
C++ではmain関数にvoidを使わないのでしょうか、書式としてあまり美しくないという意味ですか。
>>3
次からは http://boost.cppll.jp/HEAD/ を追加しる
17デフォルトの名無しさん:03/04/13 09:26
>>1
カレー

>>15
C++ではmain関数はintを返さなくてはならん、のです。
というかそれはCでも同じ。要するに、その本 を 窓から 投げ捨てろ
1812:03/04/13 09:36
>>17
マ…マジデ、1,750円もしたのに…
今から投げ捨てます、レスありがとうございました。
19デフォルトの名無しさん:03/04/13 09:43
>>18
拾いに行くので、待ってろ!
void main(void)のほうが美しいじゃないの。
K&Rにはvoidという型がないので、void main() とは書けません。
また関数や変数の定義で型を書かずにいきなり main() {…} などと
書くことができる(このような場合はintと見なされる)ので、
ANSI Cでは void main() も許されていたと思います。

C++ の規格がどうなっているかは知りませんが、
逆に C++ で void main() と書かれているソースには
お目にかかったことはありませんね。
>>18
その本、安っ!! もっといいのをたくさん購入しなさい。
C++が死滅するのはいつですか?
23デフォルトの名無しさん:03/04/13 09:53
>>20
> また関数や変数の定義で型を書かずにいきなり main() {…} などと
> 書くことができる(このような場合はintと見なされる)ので、
> ANSI Cでは void main() も許されていたと思います。

論理的つながりが全くわかりません。
>>24
マヂで逝ってんの?
>>20 >>25
つまり、double main() や struct str_tag { int i; int j; } main() も
ANSI Cでは認められると?
> ANSI Cでは void main() も許されていたと思います。
何てことを・・・
2824:03/04/13 12:20
>>25
マヂで説明してくれ。
 1: 「明示的に型指定子を書かないと int となる」
 2: 「ので」
 3: 「main の返値型は void でもよい」
と書いてあるようにしか読めないが、どうやったら1から3という結論が出てくるんだ。
>>26
> つまり、double main() や struct str_tag { int i; int j; } main() も
> ANSI Cでは認められると?

Yes.

5.1.2.2.1 Program startup には、int main() と int main(int argc, char *argv[]) が書いてあってその後に、or in some other implementation-defined manner. と書いてあるから。
>>29
ANSI C と言った場合、N739 …というか C99 の
ことは普通は指さないと思われるがどうか。
STLつかうと一気に実行ファイルサイズが10倍に?!
32デフォルトの名無しさん:03/04/13 17:10
cinの(キーボードからの)入力待ちってキャンセルできるんでしょうか
>>31
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
>>33
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
35デフォルトの名無しさん:03/04/13 17:17
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
>>33
コピペネタにマジレ(ry
>>35
#include <stdafx.h>

後死ね。
>>37
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
class foo {
int _id;
public:
foo(int id) : _id(id) { }
foo(foo& f) : _id(f._id) { }
foo& operator=(foo& f) { _id = f._id; return *this;}
virtual ~foo() {}
};
int main(int,char**){
foo bar(0);
bar = foo(1);
return 0;
}
以上のコードを gcc 3.2でコンパイルしたら
no match for `foo& = foo' operator
candidates are: foo& foo::operator=(foo&)
っていわれるんだけど、俺間違ってないよね?
>>39
まちがってる

foo(const foo& f) : _id(f._id) { }
foo& operator=(const foo& f) { _id = f._id; return *this;}

コピーコンストラクタや代入演算子はconstの参照だ
一時オブジェクトは非const参照できない
以上デジャブの(・∀・)ジサクジエーンでした。
>>40
まだやるつもりだったのにー
43デフォルトの名無しさん:03/04/13 18:00
shade_transform.obj : error LNK2005: "double * r_inter" (?r_inter@@3PANA) はすでに
search_joint_point.obj で定義されています

とかいうエラーが出るんですけど、どうしたらいいのでしょう?

下の文を書いたヘッダファイルを3つのファイルで
incluedしてるのですが、何が悪いのか分かりませんので
お願いします。

#ifndef VARIABLE
#define VARIABLE
double r_inter[4] = { 0.237857 , -0.052922 ,-0.113636 , -0.05279 };
#endif
>>43
外部リンケージを持つ配列が複数定義されているのが悪い。

・宣言と定義を分ける(外部リンケージの配列定義を一つにする)
・constを付ける(内部リンケージにする)
45デフォルトの名無しさん:03/04/13 18:15
constつけると解決しました。
ありがとうございます。
4644:03/04/13 18:26
>>45
ほんとに理解したのか?
例は出さずにリンケージの話だけ答えとけばよかったかな。
47デフォルトの名無しさん:03/04/13 19:15
音楽再生機能を持たせたいのだが参考になるものないかなぁ・?
>>45
>>46 の言う通り、その方法でホントに良いのか ?
その数値が何示すかわからんけど、修正する時は両方のファイル共に修正しないといけなくなるぞ。
extern について調べるべきだと思う。
進行早いな。
>>29
実装依存->結果どうなるかも実装依存
ということ。

>>47
OSやデバイスによって書き方が激しく違う。
適切なスレに行くべし。
50デフォルトの名無しさん:03/04/14 07:31
>>49
じゃあ何処逝けばいいですか
すんませーん STL 学び始めたばっかりなんですが
コンテナって 後始末に明示的にデストラクタ呼び出さなくても
良いのですか?

本のサンプルみてても とくに呼び出さず終了してますが
プログラム終了時に自動でメモリ解放してくれる?
そんな便利じゃないですよねえ
5251:03/04/14 10:58

すんません よくわからない文章ですね
つまり デストラクタを自分で実装しない構造体型
のコンテナを作ってるんですが

どのようにメモリを解放しているか
よくわからないんです
>>51
コンテナの自動変数はスコープアウト時に自動でメモリも解放する。
そんな便利なものなのです。
>52
> デストラクタを自分で実装しない構造体型

これなーに?
よけいにわからなくなった。
5551:03/04/14 11:14
>>51
アリガトです 安心しました

>>54
失礼 組込型メンバのみの構造体ってことです
メモリ確保も自分でやってないので
コンストラクタもデストラクタも書いてないという...
つもりだったんですが よけいわかりにくいですね
勝手な造語を乱造するのはやめてくだちぃ
57デフォルトの名無しさん:03/04/14 12:01
ポインタが好き。
リファレンス型は好きだけどC系のポインタの扱いは鬱
59デフォルトの名無しさん:03/04/14 12:32
末尾に'\0'のついたchar型の配列の文字列は「Cスタイル(の)文字列」と言うんですよね?
ぼーよーにはNTBSって書いてあるんですけど・・・・
60デフォルトの名無しさん:03/04/14 13:15
class Base;
class Hasei1 : public Base;
class Hasei2 : public Base;
とありまして, 使う側は"base.h"だけ知っていれば問題無いですよね。
ところが,ファイルに保存した情報からnewしようとすると
具体的な"hasei1.h"や"hasei2.h"が必要になってしまいます。
これはなんとかならないものでしょうか?
意味不明ならスマソ
>>60
必要なのはあたりまえ

必死で意味を読み取ろうとしたんだがhasei1.hで定義されているクラスを
それを読み込まずに宣言したいとしか読めん
6260:03/04/14 13:24
補足しますと
string className;
ReadClassNameFromFile(className);
Base* base = new className;    // ←!!!
みたいなことができないものでしょうか?
6360:03/04/14 13:24
>>61
そのとうりです・・・
64デフォルトの名無しさん:03/04/14 14:02
string型の文字列を、char*へ変換するにはどうしたらよいですか?
よろしくお願いします。
c_str()
6664:03/04/14 14:22
>>65
レスありがとうございます。
そうだと思ったのですが。
const char*型は、 char*型へ変換できないっていうエラーが出ます。
>60
問題点
1) >>62 やりたいことはわからんでもないが
 マクロじゃないんだから型名を変数で置き換えなんてできないぞ
 まだやるなら
 int classKind;Base* base=NULL;
ReadClassKindFromFile(classKind);
switch(classkind) {
 case CLASS_HASEI1:base = new HASEI1;break;
 case CLASS_HASEI2:base = new HASEI2;break;
default:dataerror();break;
}
2)こうしたところで、HASEI1を解決するためには
 "hasei1.h"をインクルードしなきゃいけないのは 当然。
>>66 64
1.受け取る側が値を変更しないならそちらをconst char*にする
2.値を変更せずかつ書き換え不可ならconst_castを使う
3.値を変更するなら適当に領域を確保してコピーすべきなのでは

>>67
ClassFactoryを使えば"hasei1.h"のインクルードは不要になるのでは?
もちろんClassFactoryのほうはインクルードが必要だけど(w
>>66
書き込むためのchar*が必要ならstd::vector<char>で代替できる。
7064:03/04/14 17:57
>>68>>69
ありがとうございます。たすかりました。
7160:03/04/14 19:57
>>67
なるほど。よく考えれば当然ですね。
生成以外は抽象的に扱えるのでここもなんとか,と思いましたが
知らないものを作るのは無理か
>>68
ちょっとすっきりしますね。考えてみます。

テンプレート?を駆使してグローバルなmapにコールバック関数を登録し,
動的に照会してnewする方法をとれば,依存ゼロが可能なようですが
大変そうなので,ClassFactoryがよさそうかなと思います。
ありがとうございました。
72デフォルトの名無しさん:03/04/14 20:29
C++ではヌルポインターはNULLマクロを使うよりも0と書いた方がいいですか?
7372:03/04/14 20:30
多分#define NULL 0となっていると思いますけど、一応。
可読性考えてNULL入れておいたほうが無難だと思う。
おれは0を使う。
NULLが定義してあるヘッダをインクルードするのがメンドクサイ。
foo(bar*);
foo(int);

foo(0);
どっちが呼ばれるんだっけ?
後者だがそんなオーバーロードをする奴とは仕事をしない
78デフォルトの名無しさん:03/04/14 22:51
79デフォルトの名無しさん:03/04/14 23:31
呼び出す側が注意できるやつならば、特に問題なし。

オーバーロードするときは
型の第一候補が見つからないときに起きる
暗黙の標準変換のことも考慮しないとやばいわな。
80デフォルトの名無しさん:03/04/15 01:20
#include <memory>

struct B {};
struct D : B {};

int main() {
    std::auto_ptr<D> bp6(std::auto_ptr<B>());
    //bp6.reset();
    return 0;
}
gcc(3.2.2,2.9.5とも)でこれをコンパイルすると通る上に、//の
部分のコメントを外すと
hoge.cc: In function `int main()':
hoge.cc:8: request for member `reset' in `p', which is of non-aggregate
type `auto_ptr<D> ()(auto_ptr<B> (*)())'
とか言われるんだけど、これってバグだよね?
ちなみに
std::auto_ptr<D> bp6(std::auto_ptr<B>(0));
だと予想通りの挙動になる。
81デフォルトの名無しさん:03/04/15 01:22
std::string s("10");
int i = atoi(s.c_str());

文字列を数字に変換するのってこれでいいの?
とくにatoiとかをC++で使っていいのかYOとか思ってさ。
82デフォルトの名無しさん:03/04/15 01:25
boost::lexical_cast を使いましょう。
せめて std::stringstgream を使いましょう。
それもわからなければ、#include <cstdlib> として std::strtoul()
あたりをつかいましょう。
Print(char *)
Print(int)
は普通にあるだろ。
84デフォルトの名無しさん:03/04/15 01:50
g++ってgccのフロントエンドなんでしょ?
以前は、shellで書いてあったとか何かの本で読んだ記憶がある。

いまのg++って実際にはどんな処理をしてるの?
はつみみです。
>>80
> std::auto_ptr<D> bp6(std::auto_ptr<B>());

そりゃ関数宣言だな。
87デフォルトの名無しさん:03/04/15 01:54
VC++4.0のシリアルください
>>83
そんなときはchar*を捨ててstd::stringにしる。
89デフォルトの名無しさん:03/04/15 02:10
>>84
C++のコンパイル
>>84
cpp0 cc1plus collect2 ld
>>84
g++は最初からネイティブだったと思う。
ベル研の C++ (たぶん最古のC++処理系) は C++ -> C のトランスレータ。
9280:03/04/15 02:59
>>86
確かにエラーを見ても、関数宣言だと思われているみたいだけど、
どうしてそうなるわけ?引数部分はstd::auto_ptr<B>()だから、
型じゃなくコンストラクタの呼び出しでは?
>>80
バグだな
class std::auto_ptr<D> bp6(std::auto_ptr<B>());
>>95
スマン、俺の見た限りでは見つけられなかったんだが引用してほしい。
97デフォルトの名無しさん:03/04/15 04:02
>>91
gpp という名の c++ -> c トランスレータを使った事があるが、これが
g++ の前身かと記憶してます。
10年以上前の話だが...
int f(int x);
これは、「int型の引数を一つ受け取りint型の値を返す関数」の宣言。
int f(int);
これはさっきのと同じ意味の関数宣言。
つまり、仮引数リストでは、宣言子は必要ない。

int F(int g());
これは、「『引数を取らずint型の値を返す関数』型の引数を一つ受け取りint型の値を返す関数」の宣言。
で、仮引数リストでは、宣言子は必要ないので・・・。
int F(int());
これも実は、さっきのと同じ意味の関数宣言。

つまり、(つづく)
Tが型名だとすると、
T a(T());
は、
「『引数を取らずT型の値を返す関数』型の引数を一つ受け取りT型の値を返す関数」の宣言と読める。
しかし同時に、「T()を初期化子とするT型の変数」の宣言にも見える。
これらは実際曖昧で、曖昧さを解決するための鍵は、T()を式とするか、宣言とするかである。

んで、[6.8 -1-]。
〜引用〜
An expression-statement with a function-style explicit type conversion
as its leftmost subexpression can be indistinguishable
from a declaration where the first declarator starts with a (.
In those cases the statement is a declaration.
〜引用おしまい〜
〜引用訳〜
関数スタイルの明示的型変換を最も左の式とする式文は、
最初の宣言子が「(」で始まる宣言と区別できない。
そのような場合、その文は宣言である。
〜引用訳おしまい〜

「式文」ってなってるからちょっと怪しいけど、上記の曖昧さは
このルールで解決される。
ふぅ。
ついでに100でも取っとくか。

あー、Effective STLにも書いてあっただろ。
おぉっと。
>>99
ちょっと誤訳だ。
s/区別できない/区別できない場合がある/
>>99
ちがくないか?
その部分は
T(a)++; が式(aを引数にTのコンストラクタを呼び出し、それをインクリメント)
T(f) = { 1, 2 }; が宣言(T型のfを宣言し、初期値をセット)
を人間が目で見てよくわからないから区別する方法を解説してるんだろ?

それに
int F(int g());

int F(int());
と書けるってのは聞いたことが無いし、VC++ではこれはintの変数になったよ。
int F( int(*)() );
ならわかるんだが。

そのページの最後の
T(*g)(double(3));

In the last example above, g, which is a pointer to T, is initialized to double(3).
って書いてある。
103デフォルトの名無しさん:03/04/15 04:40
Cの話なんですが
動的構造体変数を宣言する時は
構造体を定義した際に、動的変数とは別に変数宣言をしなければならない
のでしょうか?
104あぼーん:03/04/15 04:42
あぼーん
10598-101:03/04/15 04:55
>>102
まずいところを誤訳したかな。
宣言と式の曖昧なところを宣言として解決するのは、
文全体をパースしてもなお曖昧さが解決できない場合の最後の手段。
T(a)++;
これは演算子が続いているので式とされる。
T(f) = { 1, 2 };
これは初期化リストが続いているので宣言とされる。
人間の目で見ても明らかだと思うが・・・。

> 聞いたことが無いし、VC++ではこれはintの変数になったよ。
聞いたことが無いのを理由にするつもり?
そうそう、これのせいでboost::functionのテンプレート引数が
ちょっとかっこ悪くなる。

いい引用元みつけた。
http://www.kuzbass.ru/docs/isocpp/decl.html#dcl.ambig.res
文の曖昧さ解決(>>99)が宣言についても同様に起こることが明記してあるし、
この話にぴったりの例も載ってる。
106デフォルトの名無しさん:03/04/15 05:10
>>103
いや、べつに。
107103:03/04/15 05:19
struct test
{ int n1;//アダプタに存在するモードの総数
int n2;
}c, *pc;
こう定義されている場合にこの動的構造体変数を宣言するには
pc = new test;
ですよね?
こう書けますか?
pc pc2 = new p;
108103:03/04/15 05:21
最後に一文間違えました・・
pc pc2 = new c; でした
>>105
お、ホントだ
int a = 0;
S b( S( 0 ) ); // コンストラクタ
S c( S( a ) ); // 関数

面白いな。
それにしてもこれがあいまいになっちまうくらいなら別の表記があるんだからそっちだけ使ってれば良かったんじゃね?
>>107
×pc pc2 = new c;
○test* pc2 = new test(c);

型名と変数名を区別しる。
おそらく107は最初にtypedefを入れたかったんだと思われ
>>111
typedefなら、
pc = new test;
が書けない。
113103:03/04/15 05:42
typedef struct tag_DisplayModeData
{
D3DDISPLAYMODE DisplayMode;//ディスプレイモードデータ構造体

tag_DisplayModeData* lpNext;//次構造体へのポインタ
tag_DisplayModeData* lpBack;//前構造体へのポインタ

}DISPLAYDAT,*LPDISPLAYDAT;

typedef struct tag_EnumDispChain
{
UINTModeCount;//アダプタに存在するモードの総数

intAdptPoint; //このアダプタの評価点数
D3DCAPS8AdptCaps; //このアダプタのハードウェア情報
DISPLAYDATDispDataTop;//ディスプレイデータ先端ポインタ
DISPLAYDATDispDataEnd;//ディスプレイデータ終端ポインタ
tag_EnumDispChain*lpNext;//次チェイン先端へのポインタ
tag_EnumDispChain*lpBack;//前チェイン先端へのポインタ
}ENUMDISP,*LPENUMDISP;

LPENUMDISP pEnumDispTop = new ENUMDISP;
サンプルプログラムでは、動的変数を宣言するのに型名を使わずに変数名で宣言しているのですが
ビルドできました。どういう書き方なんでしょうか?
>>113
typedefを学べ。
115103:03/04/15 05:45
>>111
>>112
勉強し直します。有難うございました
116あぼーん:03/04/15 06:16
あぼーん
>>97
最初はトランスレータが結構あったね。
じゃぁ、トランスレータ使えば、
多態性やら、STL使ったプログラムなんかも、Cになっちまうって事ですかよ!
ワッショイ!
>>118
アフォですか?
だれかトランスレータ使えっていってる香具師いたっけ?
>>118
どのみち最後は機械語になるんだが。
つーことで、別になんの不思議もないが?
>>118
ちなみに多態は構造体のメンバに関数ポインタを置くことであっさり実現できる。
テンプレートはプリプロセッサによるジェネリックなプログラミングと似てる。

だからなんだってわけではない。
教えてください。初歩的なことですみません。
配列をスレッドで扱うときの処理です。
例えば
for(iterator・・・){
処理;
remove(0);
}
のように複数スレッドで同じ配列をみるようにしたとき、
タイミングによってはバグになると思います。
これを、便利ライブラリとかを使わずにテクニックで解決するには
どうしたらいいでしょうか。
122:10: `便利ライブラリ' undeclared
122:10: `テクニック' undeclared
122:2: `配列' declared but not used
>>123 124
バカにしたい気持ちはわかるが初心者なので大目に見てください。
クリティカルセクションとかいうのを使いたいのですが、標準のライブラリ
のなかにあるのかどうか、なんていう名前なのかも分かりません。
それとも手作りでできるものでしょうか?
125:2: warning: 2ch tech forbids such declaration
>>125
・C++の規格はスレッドなるものを全く考慮に入れてないので、標準ライブラリにはない。
・準標準なら boost::thread
・余計なもんいれたくないなら、pthread なり Windows API なり、
 開発環境でさいしょっから使えるものを使え。「スレッドの作り方」
 がわかるんなら同じとこを探せばCriticalSectionでもMutexでもわかるはず。
・手作りしたいなら Petersonのアルゴリズム、とかでググれ。ネタだが。
128デフォルトの名無しさん:03/04/15 22:32
      ☆ チン     マチクタビレタ〜
                        マチクタビレタ〜
       ☆ チン  〃  ∧_∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
        ヽ ___\(\・∀・) < >>32 マダー?
            \_/⊂ ⊂_ )   \_____________
          / ̄ ̄ ̄ ̄ ̄ ̄ /|
       | ̄ ̄ ̄ ̄ ̄ ̄ ̄|  |
       |  夕張メロン   |/
>>128 EOFつっこめよ。
130128:03/04/15 22:38
>>129
いや、そうじゃなくて、プログラム側で
>>130 ならcinに待たせてるのが間違いだろ。
132128:03/04/15 22:45
>>131
そうです。いつまでも待ってないで処理を取り返したいんですが。
>>132 できねぇってこった。
134128:03/04/15 23:38
                 ┌─┐
                 |も.|
                 |う |
                 │来│
                 │ね│
                 │え .|
                 │よ .|
      ヌルポ   ゴルァ  │ !!.│
                 └─┤    プンプン
    ヽ(`Д´)ノ ヽ(`Д´)ノ  (`Д´)ノ    ( `Д)
    | ̄ ̄ ̄|─| ̄ ̄ ̄|─| ̄ ̄ ̄|─□( ヽ┐U
〜 〜  ̄◎ ̄  . ̄◎ ̄   ̄◎ ̄   ◎−>┘◎
135デフォルトの名無しさん:03/04/16 00:20
おまえ実はそのAA貼りたかっただけだろ!
>>135
わろた
137125:03/04/16 06:32
>>127
ありがとうございます!
標準にはないんですね。
今あるやつを探してみます。
>128
UNIXなら、alarmでもつかえば。
139デフォルトの名無しさん:03/04/16 13:06
他のスレで質問したのですが、答えが得られなかったので、このスレで質問します。
C++はGetMessageの内部ループで待つメッセージループ型と、PeekMessageと組み
合わせることでGetMessageのあるwhileでのループで待つメインループ型の2つが
ありますが、本や情報サイトに載ってるのは殆どがメッセージループ型ですよね。
メインループ型を使えば、時間の処理などを使いやすくなる利点が生まれるのですが
デメリット等があるのですか。
- GetMessageの方がすっきりしてて綺麗。
- Windowsプログラミングの話題なのに、
 C++一般の話題として話してるのが馬鹿っぽい。
- "時間の処理などを使いやすくなる利点が生まれる"という記述が意味不明。
141139:03/04/16 13:27
>>140 お答えありがとうございました。
CFront探してみたんだが行方不明みたいだな…
143デフォルトの名無しさん:03/04/16 16:24
標準コンテナは Copy on Write ですか?
C++がカーネルとかシステムに近いところに向かない理由を
仮想関数関連以外で述べて。
お願い。
>>144
べつに向かないこともないんでは?
仮想関数がシステムに近いところで妙な挙動をするって事もないでしょ。

>> 144
ターゲットによっては、C++ではあまり最適化されなくて遅いって事はある。
>>144
COMみたいな仕組みを用意しとかないと、
バイナリ互換性がとりにくいとか、
compiler間のmangling schemeの違いを吸収できない。
>>144
C++を良く知らない人が多い、とか・・・
誰か cint の C++の規格準拠度を上げてくれないかニャー
151山崎渉:03/04/17 15:17
(^^)
152デフォルトの名無しさん:03/04/18 08:48
標準CはANSIのみ使ったコードですが、標準C++とは何ですか?
C++にも標準規格があるんだが。
BeOSはC++で標準APIがC++のインターフェースだったような。
システム自体どこまでC++で書かれているかは知らないけど。
すいません、質問ですがC++でPerlのIO::SocketやHTTP::Liteモジュールの
ようなものはありますか?
C++に、という表現は変ですね、そのようなクラスライブラリみたいなものは
存在しますか?
例えばCIOSocketやCHttpのような。
C++の勉強がてらPerlのプログラムを移植してみようと思うのですが、あるな
らばそのリソースとか教えて頂けないでしょうか。

OSとコンパイラをのべたまへ
157155:03/04/18 10:54
すいません、Win32環境下のコマンドラインでBC++もしくはGCCを想定しています。
標準のソケットのクラスライブラリというものはないよ。
Windows標準だとWin32APIのWinSock/WinInetがある。
C++Builder/Visual C++にはそれぞれコンポーネント・クラスがある。

http://www.kt.rim.or.jp/~ksk/wskfaq-ja/
159155:03/04/18 11:16
レスありがとうございます。
ということはFreeな環境下、もしくはコンポーネントに頼らない場合は
Win32APIを直接操作してラッピングするようなクラスを自前で設計し
てやる以外に方法はないということでよろしいでしょうか?

と、レスを書いている間にACEというものを見つけたので少し見てみる
事にします。

以下引用(ttp://blue.sakura.ne.jp/~turugina/prog/ace_inst.htm)
そこで登場したのがACEである。 ACEは、Windows、MacOSX、UNIX等、
様々なプラットフォーム上で動作する主なC++コンパイラーで動作する、
ネットワークプログラム用のミドルウェアである。 ACEに含まれるクラス
群は各プラットフォーム間のネットワークコード上の差異を吸収し、さら
にネイティブよりも型安全なコーディング環境を提供してくれる。

http://www.cs.wustl.edu/~schmidt/ACE-overview.html
160デフォルトの名無しさん :03/04/18 11:24
質問です。
c++で、
標準の 演算子のオーバーロードは、できるのでしょうか?
(クラスの演算子では、ありません)
+ , - , * , / とかです。

>>160
できません。できたらとしたら曖昧になってしまう。
インターフェースというのは純粋仮想関数のみのクラスのこと
という理解であってますか?
>>162
間違っています。
boost::.net
でないかな・・・。
>>160
ユーザー定義型を使えば、できる。
組み込み型はだめ。

enum E {};
E operator + ( E , E );
E operator - ( E , E );
E operator / ( E , E );
E operator * ( E , E );

E foo( E e1 , E e2 )
{
  return e1 + e2 * e1 - e2 / e1;
}
166155:03/04/18 13:20
>>164
boost::.netで検索かけてみたのですが発見できませんでした。
よろしければリソースへのリンク等お教え頂けないでしょうか?
>>166
でないかなってのはただの希望かと
ACEは国内情報がほとんどないよ。書籍は出てるけど。
C/C++やるならBSDソケットくらいはやっとけという気はする。
169164:03/04/18 18:36
>>166
すんません、単なる希望です。

boost::_3D
boost::window
とかもでないかな。
って、スレ違いだな。
boost::socket っていうのは Boost の Wiki にあるよ
はやくでないかな
171155:03/04/19 01:09
ふむふむ、やっぱりsocketは手前で使えるほうが何かと便利ですよね。
boost::socketに期待しつつwinsockの勉強してみようと思います。
色々とありがとうございました。
172デフォルトの名無しさん:03/04/19 01:19
デフォルトコンストラクタの無い基底クラスの
コンストラクタを派生クラスのコンストラクタ
の初期化指定子でする書き方ってどうやるんでつか?
>>172
class Super
{
public: Super(int){}
};

class Sub : public Super
{
public: Sub():Super(1){}
};
174デフォルトの名無しさん:03/04/19 01:57
class Super
{
public: Super(int){}
};

class Sub : public Super
{
public: Sub(){
Super(1);
};

これもあり?
>>174
ない。Superクラスの一時オブジェクトが作成されて瞬時にデストラクトされるだけ。
基底クラスですか?基本クラスですか?
どっちが一般的な呼び方?
それとも違うもの?
私が読んでいる本には基本クラスとかいてあります。
(決定版はじめてのC++技術評論社)
>>176
どっちも英語にしたら base class。
俺は基底の方が好き。
俺は「ベースクラス」だなw
179 :03/04/19 19:23
vc7のSTLは安心して使えまつか?
VC++.NET2003のANSI準拠度は98%。
>>180
あとの2%はなんですの?
>>181
MSに聞いてくれよ
>>180
6.0は99%だぞ
184デフォルトの名無しさん:03/04/19 19:34
いつでるの? > 2003
>>184
定番の6/30
なんでたったの1年で新しいバージョンを出すの?
6.0からは4年もかかったのに
187x:03/04/19 19:37

char *buff;

buff = moji("文字列");

printf("buff=%s",buff);
------------------------------
buff=文字列


と言う風に、文字列を=で渡すことってできますか?
>>183
6.0時点じゃまだ標準C++にすら準拠してねーよ(わらい
>>187
そのmoji関数がstrdup(標準じゃないけど)関数みたいなものなら。
std::stringなら=でコピーできる。
今のVS.NET買わなくてよかった
>>187
C++のスレで聞かなくてもいい質問なんじゃないの?
>>190
自分は期待して購入し裏切られました。
>>192
自分はWin98SEを使っているという時点で断念しました。
くそー、いつの間にか新スレがー!
195x:03/04/19 19:54
>>189
>moji関数がstrdup(標準じゃないけど)関数みたいなものなら。

どうすればいいんですか?
>>195
だからさー、それはごく初歩のCの質問じゃないのか?
>>195
<string>インクルードしてstd::stringを使おうよ。
>>195
char*は文字列型ではありません!単なるポインタです!
組み込みではないものの、C++には文字列型stringがあります!これを使いましょう!
つーか、.NETに間に合わなかった分が2003だと思ってるんだが。
当初は.NETの時点でそれなりに標準C++に準拠しようとしてたらしいし。
200x:03/04/19 20:09
>>197
Linuxで
#include <map>
#include <iostream>

used namespaced std

として、gcc -osample sample.cpp
とすると、インクルードだけでエラーがでる。なんでだろう?
>>198
char *operator=(moji a); ・・(略)

オペレータかなにかで実装は不可能ですか?

used namespaced std

なんだこれ(;´Д`)

using namespace std
って書きたかったのか?
202x:03/04/19 20:11
>>201
多少の記述違いはきにしないで、すまそ。
C言語はどこで作られたんですか?
>>200
どんなエラーが出るのですか!
>char *operator=(moji a); ・・(略)
>
>オペレータかなにかで実装は不可能ですか?

>>198の言ってる事が根本的にわかってないみたいなので、
まずC言語をちゃんと勉強した方がいいよ。
206デフォルトの名無しさん:03/04/19 20:14

まじめに恋愛を考える、真剣なあなたのためにこのサイトを作りました。
http://www.h5.dion.ne.jp/~psysys/index.html
207x:03/04/19 20:18
>>204
今Windowsから書きこしてるのでエラーメッセージは表示できまへん。
208x:03/04/19 20:20
>C++には文字列型stringがあります!これを使いましょう!

stringヘッダーと同等の機能を作りたい。
>>208
なんで? お勉強か?
もう、>>208は放置の方向で…
>>x
g++
212デフォルトの名無しさん:03/04/20 01:10
コンテキスト? コンテクスト?

日本語に置き換えて読むとしたら?
このスレと全然関係ないじゃん・・・
>>212
ぬるぽ
>>214
ガッ
216デフォルトの名無しさん:03/04/20 01:33

すまん。C++の洋書の訳版に出てきたからさ。
contextをそのままコンテキストって書いてあるんだもん。。。
テキスト(text)をテクストと書くのは別に変なことじゃない。検索でもしてみりゃすぐ出てくる。
>>212
関係ないが、分野によって標準的な表記が異なる外国語ってあるよな。
テキストは哲学なんかの分野だとテクストだし、
小説のジュヴナイルは競馬ではジュヴェナイルだし。
219デフォルトの名無しさん:03/04/20 01:42
>>216
文脈、事情、背景。
220デフォルトの名無しさん:03/04/20 01:43
device context: 道具事情。
221デフォルトの名無しさん:03/04/20 01:49
彼氏と彼女の事情。
彼氏と彼女の旦那の事情。
223デフォルトの名無しさん:03/04/20 02:00
> 文脈、事情、背景。

寒いんだよ。
そんなの調べりゃわかることだろ?
ソフトウエア的に通じる比喩は無いかっていってんの。
なんで比喩使わなきゃならないんだ
>>212見たらコンテキストとコンテクストのどちらが日本語訳として正しいかを質問してるように見えるよ。

で、そんな単語だけ出されてもどんな"文脈"で使われてるかもわからないのに
どう答えればいいんだ。
>>218
独語由来、仏語由来、英語由来つうのがあるのかもな
227デフォルトの名無しさん:03/04/20 02:44
じゃあ「デバイスコンテキスト」でもいいよ。
デバイスの何よ?

訳がjapaneseフレンドリーじゃないから
比喩つかって読まないと通じない。
原文ないからどうしようもないけど。

載ってたのはこれ。
「デザイン過程においてしばしば有益とされている
経験的知識や真理でも、個々のデザインにおいて、
そのコンテキストで評価が必要なものがある。」

ちなみに「デザイン過程」は「ソフトウエアの設計過程」と
脳内で置換えた。
228名無しさん:03/04/20 02:48
あちこちの板で山崎モナーのぬるぽが増殖しているが,
ここにはいないな。
>>227
それなら直訳で事情、背景でも意味通るんじゃないか?「その状況で」とか。
まあ変な訳の本があることは珍しいことじゃないが、そもそもスレ違いだと思うのよ。
その文、全然C++の話じゃないじゃん。
230山崎渉:03/04/20 02:53
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
デバイスコンテキストは無理に訳さなくてもいいと思うがなぁ
たまたま文はすれ違いだけど
本はC++ベッタリなんだよ。

状況か。。いけるな。 thanx
「昔から「役に立つよ」と言われていることでも、
今の状況に本当に役に立つのかどうか再確認すべきだよ」くらい。
234デフォルトの名無しさん:03/04/20 03:20
冷蔵庫に牛乳があたかもしれない。
問1.「あたかも」を使って簡単な文章を作りなさい。
今日食べた鯖にあたかもしれない(苦しい)
237山崎渉:03/04/20 03:32
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
>>235
「あたかも」とは(多く「似る」「如し」「よう」などの語をあとに伴って)
よく似ている物事にたとえる場合に用いる語です。
239デフォルトの名無しさん:03/04/20 04:02
class base;
class derived : public base;
base::base(){func();};
derived::derived() : base(){};

derivedはfunc()を継承時上書きしてるのですが、
derivedの生成時にbase::func()が呼ばれてしまいます。
derived::func()をよびだすにはどうしたらよいのでしょうか?

また、コンストラクタはなぜvirtualにできないのか教えてください。

>>239
base::baseの時点ではまだderivedの初期化が完了していないので、
オブジェクトとして存在しない。つまり呼べない。
やりたいことを具体的に書いてくれれば、代替案は見いだせるかもしれないが。

もしコンストラクタがvirtualなクラスを書いた場合、
実際の型を誰がいつ決めるか、仮に決まったとして、
どうやってコンパイラにそれを伝えるか、考えてみな。
241デフォルトの名無しさん:03/04/20 04:57
メンバ関数の中で宣言したstatic変数って、同じクラスのオブジェクトの
間で共有されてしまいますよね?
これをオブジェクトの間で共有にならなくする事って出来ますか?
>>241
メンバ変数にする。
243デフォルトの名無しさん:03/04/20 05:08
>>241
これまた阿呆な質問だ!
244bloom:03/04/20 05:08
>>227
糞訳の典型だね。
246デフォルトの名無しさん:03/04/20 11:45
まぁそういう時期だし。
>>239
boost でそんなんあったよ。

<boost/utility.hpp>
boost::base_from_member
基底クラスより先にメンバ変数を初期化

うまくできるかどうかしらんけど。
248デフォルトの名無しさん:03/04/20 15:09
データの数によって配列の数を変えたいのですが、
string s2[n];
とすると、定数にしてくれってエラーがでます。
なにか方法はありますか?
249名無し:03/04/20 15:23
new
250248:03/04/20 15:27
>>249
ありがとうございました。
>>249
なぜvectorを教えない!
252248:03/04/20 17:07
>>251
おお、ありがとう。みてみます。
>>252
初心者はvectorなんか使ってはいけません
>>253
newの方が初心者には危険だろ?
255248:03/04/20 18:02
vectorの
atメソッドがg++に無いということが書かれていました。
g++でも動くように、
v.at(3)=100;
を、
v[3]=100;
って書いていいということですか?
というかatメソッドは、意味無い?
256デフォルトの名無しさん:03/04/20 18:05
クラス定義の中で実装を書くと
明示的に inline って書かなくても
インラインになるの?

class hoge
{
public:
Hoge();
~Hoge();

void Method1(){ ... } //これインラインになる?
};
いぇs
258デフォルトの名無しさん:03/04/20 18:18
>>255
意味はあるさ。オーバーインデックスした時、
atは例外を出すからデバッグしやすい。

>>256
普通はinline展開されない。VC++だと、コンパイルオプションで設定できた。
259tantei:03/04/20 18:18
★あなたのお悩み解決致します!!
●浮気素行調査
彼氏、彼女、妻、夫の浮気を調査致します!!
●別れさせ工作
あらゆる手段を使ってターゲットを別れさせます!!
●盗聴器盗撮機発見
あなたの部屋に誰かが仕掛けているかも!!
●行方調査
行方不明になっている家族の消息を調査致します!!
●電話番号から住所割り出し
一般電話、携帯から住所を割り出し致します!!
その他人生相談からどんなお悩みでも解決いたします!!
 直通  090−8505−3086
URL  http://www.h5.dion.ne.jp/~grobal/
メール  [email protected]
   ■グローバル探偵事務所 

260248=255:03/04/20 18:27
>>258
わかりました。ありがとうございます。
261デフォルトの名無しさん:03/04/20 18:44
あるClassの中に、別のClass型変数を持つのって駄目?
継承して使うべきかな?
>>258
>普通はinline展開されない。
え? 普通はされるだろ
>>261
has-a を is-aに置き換えることは愚行
>>261
effective-C++読んどけ。
コンパイラは inline 化に積極的になってくれるが実際に inline 化
されるかどうかは Method の実装次第てとこだね
>>258
でも、せっかくチェックしてくれるなら、例外なんか投げないで
abort()してくれればいいのに。
結局、STLportのデバッグモードとかの方が有難かったり。
267261:03/04/20 19:01
"has-a" "is-a" でぐぐってみたら

C++でプログラムを設計するということは、"is a”と"has a"の関係に分離し抽出することと考えることができる。
(ttp://toba.yanagi.gifu-u.ac.jp/lecture/prog2/11/)より

ということでした。
ありがとうございました。

でも置き換えるの意味がわかんないです。
>>267

class Engine{};

class Car
{
Engine engine;
};

は正常。車はエンジンを持っている。

class Car : public Engine{};

は異常。車はエンジンではない。
269261:03/04/20 19:08
>>268
なるほど!かなりよく分かりました。
そのまんまのいみでしたね^^;

>>264
今度本屋で立ち読みしてきます。

ありがとうございました。

270デフォルトの名無しさん:03/04/20 19:31
class A;
.
.
.
class N;

A.m_classB.m_classC...m_classN.a = 1; (N回クラスが連結した先の変数aに代入している)
このような繋がりってあんまり多いと駄目ですよね。
最高どのぐらいが限界でしょうか?
>>270
限界なんてものは無いが、クラスを使うということは、複雑な問題を分割・整理するのが目的なのに
外から内側が丸見えでは問題を複雑なままにしているので駄目だな。
272デフォルトの名無しさん:03/04/20 20:03
>>270
なるほど。そりゃそうですよね。
268の例みたいに
CarとEngineを"is-a"の関係で記述したときって
EngineをCarから操作できるようにするんですよね?
例えば、Car.GetEngineType(); とかのように。
Car.engine.GetType(); では駄目駄目だということですよね?
>>272
まだよくわかってないんじゃない?
とりあえず、
Car.engine.GetType();
なんて、メンバ変数(この場合engine)が公開されてる
時点でおかしい
274デフォルトの名無しさん:03/04/20 20:56
悪い例がCar.engine.GetType(); で
Car.GetEngineType(); が良い例です。
これでも駄目ですか? engineは隠蔽されていると思うのですが・・
Car.GetType(ENGINE);
276270:03/04/20 21:08
>>275
ENGINEは定数ですよね?
Carクラスの中で、定数ENGINEを定義して、それを公開するということですか。
GetEngineType(); と同じ気がするんですが・・・気のせいですか?
自分の無知さが恥ずかしいです。
Carの定義もEngineの定義も見ずに良いとか悪いとか言ってる奴は信用できない。
class Car{
public:
Engine &GetEngine(){ return engine; }
}
279デフォルトの名無しさん:03/04/20 21:20
まず、engine の型を外部から知る必要がある設計が駄目。
どうしても知る必要があるなら、>>274 の Car::GetEngineType() でいい。

280デフォルトの名無しさん:03/04/20 21:24
誤解を招いたかもしれませんが、
GetEngineType() とは型番とか、製造社とかを返すつもりで使いました。
例がとっさにうかばなかったもので・・・
>まず、engine の型を外部から知る必要がある設計が駄目。
んなこたないよ。そんなの普通にあるだろ。
282デフォルトの名無しさん:03/04/20 21:28
>>280
その型番とか製造社を使って、
Carクラスの使用者は条件分岐したりするの?
283デフォルトの名無しさん:03/04/20 21:30
>>281
なにそれ。
if( car.GetEngineType() == HONDA ) {
car.アクセルを緩める();
} else {
car.アクセルは固定();
}
とか、こんなコード書くのか?
284270:03/04/20 21:35
>>282
そうですね。使うとしたら・・表示させたり、条件分岐とかですかね。
さきほど言いましたけど、
とっさに考えた例なので、使い道は考えていません^^;
そもそもメンバ変数は公開/非公開どちらにすべき?って質問だよね。
"is-a"の話の流れで書いちゃってるけども、"is-a"の話とは関係ないよね。
286270:03/04/20 21:38
if(car.GetEngineType() == YAMAHA)
car.PointUp(1);
ヤマハのエンジンだったら評価を上げるっていう例です。
さっき思いつきましたが
>>283
多態を使うべき場面っぽいですなー
おまいらdynamic_cast知らんの?
各々がいろんな場面想定して書いてるからまとまらないのな
290デフォルトの名無しさん:03/04/20 21:47
dynamic cast 知りません。
名前だけ知ってる・・・
291デフォルトの名無しさん:03/04/20 21:49
多態って?
>>291
検索してくたたい。
293デフォルトの名無しさん:03/04/20 21:52
ごめん。多種・多様しかC++の特徴として覚えてなかった。
やっぱ一緒だった。タタイ?
294デフォルトの名無しさん:03/04/20 21:54
>>273 はおかしくない。
295デフォルトの名無しさん:03/04/20 22:05
ポインタを理解できないと
プログラムは組めないと言うよりアプリが作れない。
ポインタを理解するのに数年はかかると言われている。

本当のところ、どうなの?
>>295
ポインタはすぐに理解できるよ。
297sage:03/04/20 22:11
アセンブラを習得したら完全に理解できるよ。
アセンブラ習得するのに、数年もかからんでしょ。
>>295
たかがポインタに大げさだなあ
299デフォルトの名無しさん:03/04/20 22:20
>>298
関数ポインタはどんな場合に使うの?
>>299
どの関数をコールするのかを、実行時に決める時に使う。
C++では、virtual関数やtemplateをうまく使えば使わなくてすむ。

つか、>>299よ、なぜ>>298に対して聞くんだ。
301デフォルトの名無しさん:03/04/20 22:26
"is-a"について質問ですが、
"手牌"と、"牌1つ"は"is-a"ですか?"has-a"ですか?(麻雀用語ですみません。)

class HAI{
private:
移動用クラス;
数値用クラス;
};
class TEHAI{
private:
HAI m_hai[14];
};

みたいにしたいんですが、
手牌の中には牌が14枚あるということから、"is-a"としたんですが・・
HAIクラスのメンバにTEHAIクラスからアクセスするのに長々と
TEHAI.GetHai(N番目).移動用クラス.ひっくりかえす(); みたいに書かないといけないですか?
まだよくわかってないみたいですか?
付け加えると、移動用クラスは、別のプログラムでも使えるようにと
汎用化したつもりなんですが。

長々とすみません。
>>299
実装とインターフェイスの分離。多態(笑)
ってこれは概念も分からない人には少し早いんじゃないかな。

まずポインタの基本概念の理解の話なら、
自分の知識にあった説明さえ得られれば瞬時に理解できるんじゃないの。

C言語の複雑なポインタ式の知識は、あるに越したことないけどしっかり把握する
必要もあまりない(一般的に、複雑な式はバグの元なので避ける)
>>299
>関数ポインタはどんな場合に使うの?
あれは、C++を使えない老人のオブジェクト指向ごっこ。
C++では使わない。その必要がない。
304デフォルトの名無しさん:03/04/20 22:30
>>300
298はポインタを理解してるとみた。
300は298ではないね。
信頼して聞いたんだよ。信頼と信用は違うけど。
>>301
手牌は、特定のプレーヤーの管理下の牌の集合を保持したものである。

牌は、山に積むことができる。順番にツモって捨てられることができる。
鳴かれることができる。ドラ表示に使われることがある。

「手牌」は、「牌」の一種といえますか?
手牌は、「牌」の集合を所持するだけとしか思えませんが。
>>303
必要がないわけじゃないよ。
関数メンバポインタがないからイベント通知にとても苦労してるよ。
overrideさせると切り替えが面倒だしそれ以外の解決法もぴったりのものはないからね。
>関数ポインタ
WindowsならDLLからGetProcAddressするときに
>>301
お前のコード、
「手牌 is a 牌」って表現してないだろ。
お前のコードは
「手配 has a 牌」っていうのを、14個分用意している。

自然言語に対する感覚をどうにかしろ。
そして is-a、has-aについて調べろ。

TEHAIクラスのpublicなメンバ関数は
”全部を引っくり返す”とか、
"手牌全部をみて、点数計算をする"とか、
"手配全部を見て、待ち牌をさがす"とか、

そういう、手配全部に対してアクセスする物と、

AddPai( class HAI* p ) // ツモ
removePai( int i ) // 牌を捨てる
とか、こんな感じで、手配の中の一牌をを
どうにかするメンバ関数の2種類を作れ。


あと、"移動用クラス"が何なのか知らねーが、
それは"引っくり返す関数"のなかでこっそり呼べ。

最後に、ストラテジーパターンについて学んでおけ。
309デフォルトの名無しさん:03/04/20 22:38
Templateがあるからvoid*は使わないって本当?
310デフォルトの名無しさん:03/04/20 22:38
ですよね!
でも長々と鎖をたどっていくのはいやなんですけど・・・スマートな
記述方法ってありませんか?
311デフォルトの名無しさん:03/04/20 22:39
>>309
ウソ。
WNDCLASS 構造体に WndProc のポインタを設定したり
Enum〜 系の API にも関数ポインタ必要
>>309
ホント。
314デフォルトの名無しさん:03/04/20 22:42
>>306
virtual関数使やいいだろ。
C++は多重継承を許す言語だぜ。
315デフォルトの名無しさん:03/04/20 22:42
>>309
ウソ。
template があってもなくても、void * は使わない。
template があってもなくても、マシンを直接アクセスしなきゃならないときは
void * を使わざるを得ないこともあるから、その場合だけ使う。
316デフォルトの名無しさん:03/04/20 22:45
>>308
ありがとうございます。
もう一度調べてみます。
>>314
通知イベントが数十あって必要なものだけイベントハンドラ書いて
実行時にイベントハンドラ切り替えたりイベントハンドラ複数登録したり
とかはどうやってやる?
318デフォルトの名無しさん:03/04/20 22:46
>>310
std::for_each() 使えば?
319デフォルトの名無しさん:03/04/20 22:47
もともと、void *っていつ使われるんだろう。
mallocとかの返り値が void * だけど、
他にvoid *って使う価値がないような気がする。

"指しているオブジェクトが何か解らないポインタ"の使い道...
ん-...

>>315
マシンを直接アクセスするとき?void *がどう役に立つの?
>>317
std::map<Event,Handler>じゃないの?
>>319
memcpy使ったこと無いのか?
322デフォルトの名無しさん:03/04/20 22:53
>>321
ああ、そうか、memなんとか系のライブラリ関数では使われることがあるのか。
mallocもそうだけど、c++じゃあんまり使う機会がなさそうだな。void *
323デフォルトの名無しさん:03/04/20 22:54
>>322
うん。ほとんど使う機会がない。ガンガン使っているとしたら設計に問題があるかも。
>>322
templateがあるからな。
325デフォルトの名無しさん:03/04/20 22:55
>>324
template は関係ない。
>>320
やってみればわかるけど死ぬほど面倒だよそれ。
327デフォルトの名無しさん:03/04/20 23:00
>>317
Event - Listener モデル使えば?
>>325
memcpyじゃなくてstd::copyを使うってことだと思うが、関係ないのか?
329デフォルトの名無しさん:03/04/20 23:02
>>317
たとえばイベントがn個あるなら、
class EventListener {
  virtual handleE_0() = 0;
  virtual handleE_n() = 0;
};
みたいなクラスを作って、イベントの影響を受けるクラスで、
これを実装しておけばいいだろ。
330320:03/04/20 23:02
>>326
どの辺が?
>>319
知らず知らずのうちに使っているはず。
抽象化や隠蔽化する際にはとても重要だ。

たとえば、もしキミがGetModuleHandleを直接または間接に呼び出したとする。
ハイ、使いましたね。 → typedef void * HMODULE
でもGetModuleHandleを呼ぶとき、モジュール構造体がどうなっているかなんて
考えないでしょ?


たとえば、もしキミがCreateProcessを直接または間接に呼び出したとする。
ハイ、使いましたね。 → typedef void * HANDLE
でもCreateProcessを呼ぶとき、オブジェクト構造体がどうなっているかなんて
考えないでしょ?

たとえば、もしキミが...(以下省略)

いっぱいあるよ。
#define STRICT
333デフォルトの名無しさん:03/04/20 23:08
memcpy??mem??????????
????????????????????????????????
???memcpy()?????????????
?????????????????????????????
memset()????"????????????????"????????????
???????
334デフォルトの名無しさん:03/04/20 23:08
>>328
std::copy を使っても、シーケンスの operator=() で memcpy が使われているかも
知れないし、std::copy を使わなくても、unsigned char * としてバイナリ・イメージを
コピーすることはできる。
ようは、void * と template とは関係がない。
>>333
なんで?になってるの?
>>331
Windowsに偏ってるのがイマイチだ。
337デフォルトの名無しさん:03/04/20 23:10
HMODULE や HANDLE がどう typedef されていても、関係のない話だね。
338333:03/04/20 23:11
うがー
>>330
>329のようなクラスの定義・登録・呼び出し・スコープの制御もろもろ全部。
イベント通知・受信のメカニズムが全部むき出しだからとても煩雑になる。
>>334
そうか?漏れがmemcpyを使わなくなった理由はstd::copyがあるからなんだが。
だいたい、「operator=() で memcpy が使われているかも知れない」からって、
void*を使ってることにはならんだろ。
Cで使われるって前提なのもイマイチだ
どうやら老人が紛れ込んだようだな。老人 == >>317
C++使いにとって、Cで書かされることほど屈辱的なことはない。
344デフォルトの名無しさん:03/04/20 23:15
>>340
std::copy() が使えるってことは、= 演算子が使えるってことだよね。
なら、memcpy() なんて使わずに、ループでコピーしておけばいいんじゃない?
std::copy() が使えない C でもそれでいけるよ。
345301:03/04/20 23:15
>>308
"is-a" と "has-a"を間違って書いてました。

>「手配 has a 牌」っていうのを、14個分用意している。
これって駄目ですか?

>ストラテジーパターンについて学んでおけ。
なかなかインターネットで見つかりません^^;
googleで検索しても数件しかヒットしませんでした。
本屋で、デザインパターンについて調べたら見つかりそうですか?

移動用クラスってのは、行列をたくさん集めたやつです。
・回転用行列
・移動用行列
・拡大用行列
ってかんじです。
別に「牌クラス」に記述する必要はあまりないですね・・・
クラスの外に宣言してやってみます。
346デフォルトの名無しさん:03/04/20 23:17
>>331
CreateProcess() で得られたものと GetModuleHandle() で得られたものって、
同じようにアクセスしていいの?

つか、"抽象化"って言葉の意味や"隠蔽"の概念は知っているの?
>>339はヴァカという結論で、よろしいか?
>>347
MFCの解説でも読んで、自分が実装してる気になってんだろ。春だしな。
Delphiならこんな議論は起こらないのに(ぼそっ)
C++ではvoid*ってあまり使わないね、って話の時にWin32APIの話出されてもあまり説得力が・・・
C#ならこんな議論は起こらないのに(ぼそっ)
MFCなんて使う気にならないんですが、病気ですか?
353320:03/04/20 23:22
>>339
そういう話なら、mapを実装に使うクラスでラップすればいいだろ。

もとの話し見たら、「仮想関数あるから関数ポインタいらね」って話だったのね。
確かに、仮想関数だけじゃHandler型の実装には役不足だなぁ。
しかし、実装に使うにしても「関数ポインタ」が
表に現れないように実装するのがマナーだろうな。
354デフォルトの名無しさん:03/04/20 23:22
>>345
has-aで表現することは正しい。
C++使いの皆さんに質問です。
MFCは"なんちゃってC++"なのはともかく、WTLはどう思いますか?
MFCよりもマシなC++の使い方してると思いますか?
356デフォルトの名無しさん:03/04/20 23:24
Win32 API は、非 OOPL からでも使えるように、クラスになっていないから void *
が出てきちゃったりするんだね。
C とかから API アクセスできなくてもいいんなら、Win32 API を OO で設計することが
できるから、void * なんて出てきやしないよ。
357デフォルトの名無しさん:03/04/20 23:27
OO で設計するときに、非 OO なライブラリとリンクしなきゃならないときに、
void * が出てくる可能性は高くなる。だって OO じゃないから。
マシでもクソでもATL/WTLはCOM扱う時に楽だ
359デフォルトの名無しさん:03/04/20 23:29
COM 扱うなら、BCB の COM の取り込みで VCL コンポーネントにラップしちゃうのが
もっと楽だ。
いや、COMは扱わなくて良いです。ただのWinアプリを作るライブラリとしてのATL/WTLで。
データ構造を隠蔽化して機能をエクスポートするようなDLLを
作ったことがない達人気取りの厨房は、ママのおっぱいでも飲んで早く寝なさい。

...全く信じられんな、こいつらは。
どうせVBやDelphiで作っても大して変わらないようなGUIアプリしか
作ったことないんだろうな。...可哀想に。



合掌。

もうGUIまわりはなんでもいいと思うのはまちがですか?
>>361が何逝ってるかわからないのでつが。
>>363
やっぱり厨房だな


合掌。
365340:03/04/20 23:33
>>344 なるほど、そうだな。
DLLを作ったことがないのが達人?
DLLを作ったことがあるのが達人?

DLLを作るのって、そんなにすごいの?
367デフォルトの名無しさん:03/04/20 23:36
>>361
>> ...全く信じられんな、こいつらは。
>> どうせVBやDelphiで作っても大して変わらないようなGUIアプリしか
>> 作ったことないんだろうな。...可哀想に。

開発環境に強く依存するようなGUIアプリを開発すると幸せになれるんですか?


DLLを作るのがすごいことだと思っている厨房です。
>>366
全然すごくないが、少なくとも>>361の言うようなDLLを作るときには、
void*や関数ポインタがよく出てくる。
>>366
単にDLLを作るだけならマニュアルを読む能力があるかどうかぐらい
もひとつ言うと、たとえば、
>データ構造を隠蔽化して機能をエクスポートするようなDLL
なんだか覚えたての言葉を無理に使ってるようで、微妙に変だが、
「データ構造を隠蔽して機能をエクスポート」してないDLLってあるの?

ちょっといじめすぎちゃったかな、俺?
大漁だ(藁
>>371
変数dllexportしまくりなDLLとか(藁
あ、>>363==>>366==>>371です。
>>355の話題と混同したのかな?
376デフォルトの名無しさん:03/04/20 23:48
「C++は便利」という結論でよろしいか?
377デフォルトの名無しさん:03/04/20 23:51
「propertyとdelegateとdynamic class loadingがないので糞。
その不便さに気づいてない奴も糞。」という結論でよろしいか?
君が去ってくれるなら、それでいいよ。
もともとのDLLって、C++じゃなくてCを基準に作られてるだろ。
まずいのはDLLの仕様であってC++ではないと思う。
ぼろが出るといやなんであんまり具体的には書かんが。
>>379
じゃあ俺がぼろを出す覚悟で代わりに書いてやるよ。
382デフォルトの名無しさん:03/04/20 23:56
>>353
Qtのsignal/slotなんてのは、関数ポインタへの回帰だと
思うが。クラス単位でなく、オブジェクト単位での関係
を表したい時は、やっぱり関数ポインタの方が直観的
だし、既存の継承階層をいじらずに済むだけ柔軟性も
高いと思う。
仮にDLLをクラスをexportできるような仕様に変えられるとしても、
言語やコンパイラによる縛りが関数単体でexportしている現在より強く出てしまうのではないかなあ。
関数だけだと、呼びだし規約程度しか迷うところが無いけど、
クラスだと、VMTのレイアウトやnew/deleteの挙動を揃えないといけないから。
384デフォルトの名無しさん:03/04/21 00:04
>>383
COM はそうなっている。
385デフォルトの名無しさん:03/04/21 00:04
「VC++.NETに移行すれば万事解決」という結論でよろしいか?
386デフォルトの名無しさん:03/04/21 00:04
>>383
その new や delete の、クラスごとに異なる部分って言うのは、
どこに揃えられると期待してますか?
>>383
エクスポートされたクラスのユーザが、そのクラスのVMTのレイアウトまで
知る必要があるの?
COMを使うのってそんなに大変?
最後の1文は>>384へ。
389デフォルトの名無しさん:03/04/21 00:10
>>386
Windows ならこれで OK。

template<class T>
class myallocator<T> {
IMalloc *pMalloc;
public:
myallocator() { CoGetMalloc(&pMalloc); }
~myallocator() { pMalloc->Release(); }

allocate(...) { return pMalloc->Alloc(...); }
deaclloacte(...) { pMalloc->Free(...); }
};
390デフォルトの名無しさん:03/04/21 00:11
>>387
大丈夫です。Windows 上の VTABLE は事実上 COM 規格で統一されています。
>>390
GNAT(gccのAda)のVTABLEは、少しずれる(先頭に8バイトのメタクラス情報が入る)ので、
直接COMを使えませんでした…。
(C++と関係無い話でごめん)
392デフォルトの名無しさん:03/04/21 00:18
>>391
こんな感じですかね。
http://www.tietew.jp/cppll/archive/1907
393デフォルトの名無しさん:03/04/21 00:22
>>386
Xerces-C の XMLString::release() の実装を見ればわかりますよ。
>>389
コピーしたらあぼーん。
>>392
そうそう。(探してた情報が…サンクス)
あれ?ということは、Adaに限らずgccを使った場合はC++もダメ?
おまえら、Tietewタソのコピペを、あたかも自分で考えたかのように語るのは勘弁してくだちい。

そんくらいにしとかないとぶっ殺しますよ。




つか、最低限、引用しろやコピペ野郎。その上、わざわざageで? 馬鹿じゃねえの?
397デフォルトの名無しさん:03/04/21 00:30
>>395
だめですね。
>>396
名無しに名無しで何言ってんだ。
「おまえら」ってことはコピペが複数あんのか?どれがコピペ?
自分で考えたかのように語って誰かが得したり損したりするほどの内容は見当たらないが。

本人が「見て見て〜」ってageで書いてたりしたら面白いな。
399デフォルトの名無しさん:03/04/21 00:32
>>398
ネタにネタレスカコワルイ!
誰かがMINGW32でDirectXを使っていたような…
lpDirectDraw->lpVtbl->Release(lpDirectDraw);とかやっていたのだろうか


401談 ◆TJ9qoWuqvA :03/04/21 05:27
.



      このスレは終了しました。



403デフォルトの名無しさん:03/04/22 14:01
C++が非手続型言語といわれる意味がわからない。
Cが手続型言語といわれる意味はなんとなくわかる。
だけど俺にはC++ってのはCにクラス機能が付いた程度にしか
思えないので、どうしてそれが非手続型なのかがわからない。

どなたかわかりやすく教えてくれろ。
>>403
> C++が非手続型言語といわれる意味がわからない。
どこに書いてあるのでしょか
>>403
とりあえず、憂鬱本でも読んどけ
templateは関数型っぽいけど、基本的に手続き型じゃないの?
"非手続型"ってじゃあ何型なんだ
>>400

IDirectDraw_Release(lpDirectDraw) みたいにマクロが用意されてる。
>>403
それがわかったところでなにかうれしいことがあるかい?
漏れにはどうでもいいことだとしか思えないが
409デフォルトの名無しさん:03/04/22 17:01
>>408
死ね
410デフォルトの名無しさん:03/04/22 17:46
>>409
つうほうしといたよw
あーあww
死ねとか逝っちゃたねwww
ひろしにIP提出されてタイーホwwww
みじめだねーwwwww
ひろし、って誰だよ。
さくらももこの父親か?
412デフォルトの名無しさん:03/04/22 19:18
ひろしかよ
管理人っていうか、IPを見れる権限がある人の一人だよ。
スーパーハカーキターーーーーーーーーーーーーーーーーーーー!!!!
415デフォルトの名無しさん:03/04/22 19:40
ハッシュテーブルは標準化されてないってホントですか?
ぬるぽも標準化してください
namespace std{

typedef NullPointerExeption Nullpo;

class ( ´∀`){
public:
 Nullpo* ぬるぽ(){
   return hammer_cast<Nullpo*>( ガッ );
 }
}
唐突で申し訳無いけど、ちょっと質問。
今VC++でWin32のアプリを作っているんですが、その自身の中で、
「自分のファイルネーム」って、どうやって取得したらええんでしょうか。
一番目のパラメータにNULLをセットし、モジュールの名前をゲットします。
(´-`).。oO(というかVCスレかWin32APIスレで聞けよ‥‥
       ちなみにBCBだとApplication->ExeNameに入ってたり‥‥)
421418:03/04/22 22:41
>>419-420
そスね。失礼。
422デフォルトの名無しさん:03/04/23 19:52
変数から、その変数の型を取得することって出来ますか?
>>422
typeidでgoogle
424422:03/04/23 20:37
>>423
ありがとうございます
425デフォルトの名無しさん:03/04/23 21:22
VisualC++6.0は-GXオプションをつけないと例外処理が有効にならないみたいなんですけど、
デフォルトで例外処理機構を有効にすると、なにか不都合なことがあるんでしょうか。
最適化の妨げになるとか・・・
>>425
心配するな、お前が考えている「例外処理」は常に有効だ。

(なんでヘルプを読まんのか...。)
>>426
cl /?とやっても-GXに関するヘルプは表示されないけど。
/GXならでるけど、「enable C++ EH (same as /EHsc)」って何よ!? ExceptionHanler?
しかたないからごみの山からMSDNライブラリを出してきて見てみた。

このオプションは、extern C 関数が例外をスローしないと想定して、同期例外処理を有効にします。これは、/EHsc と同じです。

はぁ・・・よくわかんね。
>>427-428
-GXと/GXは同じだ馬鹿
>>429
よくわからないなら、まだお前には関係ないということだ。
そのままにしておくのが吉。
-GXはうざい警告を消すためのものと覚えておけばいいね。
/GundamX
434デフォルトの名無しさん:03/04/24 00:57
435デフォルトの名無しさん:03/04/24 10:05
>>418
argv[0]
436デフォルトの名無しさん:03/04/24 10:47
http://210.153.114.238/img-box/img20030424082109.jpg
どうやって組めば良いですか??
>>436
それで合ってる。問題ない。
>>436は見てないけどあちこちにあるからきっとブラクラ
439デフォルトの名無しさん:03/04/24 11:09
>>438は押す事もできないヘタレの癖にあちこちで同じコメントしてる腰抜けインポ野郎
440デフォルトの名無しさん:03/04/24 11:10
>>436
むしろこっちが聞きたい
強いて点をつけるなら満点だよ 自信持て
マルチのくせに偉そうだな(w
442デフォルトの名無しさん:03/04/24 11:19
>>441=マルチポスト
>>436がマルチなんだからレスもマルチになるよ。当然。
444デフォルトの名無しさん:03/04/24 13:02
書き込み違反の例外ウィンドウが出てしまいます。
string s1="abcdefg123456789";
char *c1;
s1.copy(c1,6,0);
どうしてでしょう。
どうかよろしくお願いします。
445デフォルトの名無しさん:03/04/24 13:19
c1が何もさしてないじゃん
446444:03/04/24 13:54
>>445
レスありがとうございました。動くようになりました。
447デフォルトの名無しさん:03/04/24 18:18
質問ばかりですみません。
string s1="";
string s2="";
string vs1="abcdefg123456789";
char *c1;
c1 = (char *)s1.c_str();
vs1.copy(c1,6,0);
s2=s1;
s1のなかには"abcdef"が入っているのに、s2の中身は""です。
なぜなのでしょうか?
>>447
なんでc_strがconst char*を返すのか考えろ。
s1.c_str()が返すポインタの先にたまたまメモリが確保されてただけの話。
>>447
俺も前それやったが、
vs1.copyの行で、そういう風にコピーすると s1の領域(size)が変更されない
(しかも、s1文字列がNULLで終わるかどうかわからない)
ので、
s2=s1の行で最初に指定されたsizeの分しかコピーしない。
この場合だとNULL文字1文字分か、0文字しかコピーされないので
s2は""になる。
450447:03/04/24 19:45
>>448
レスありがとうございます。
亀レスすみません。長考してます。
>>449
なるほど。
451447:03/04/24 19:54
string s1="";
string s2="";
string vs1="abcdefg123456789";
int n=6;
char *c1=new char[n];
vs1.copy( c1,n,0);
s2=s1=c1;
これでできたみたい。これでいいのでしょうか。
ご迷惑をおかけいたしました。
>>451
良いと言えば良いけど、何でそんなことする必要があるの?
substr使えばいいじゃん。
453447:03/04/24 20:02
そこまでいう理由はないだろ?
別に言えとは言ってないがな。まぁ、がんがれ。
455447:03/04/24 20:08
>>452
うわ、そういうのあったのですね。しりませんでした。
>>453は、
私じゃないですよ。
このスレにも粘着のなりすまし荒らしがいるな……

質問する人はトリップ付けた方がいいと思うよ
捨てトリップでかまわないので
>>447
なぜ、char*を使う必要があるのか疑問なのだが?
せっかくstring使ってるのにねえ
459447:03/04/25 11:41
レスありがとうございます。
>>457
copyメソッドの引数の型がchar*だったのでって単純な理由なのですが。
>>458
その文の意味はつまり、substrを使えばいいのにってことで理解すればいいですか?
>>459
基本的に同種のコンテナなら、それをそのままコピーするメソッドがあるから
stringの場合char*を使う必要はないと思われ。

substr使わなくても
string vs1="abcdefg123456789";
string s1( vs1, 0, 6);


string s1= "";
string vs1="abcdefg123456789";
s1.assign( vs1, 0, 6);

でいいんじゃない?


ところで、char* を引数にとるAPIにstring入れる場合て
int size = 10;
string str(size);
hoge_API( const_cast<char*>(str.data()), str.size() );
とかって、やったりしてるんだけど、やっぱテンポラリな配列なりなんなり作成して
ポインタ代入したほうがよろしいのでしょうか?
461デフォルトの名無しさん:03/04/25 17:37
ぼくはいつもnoge_API((char*)s.c_str(),s.c_str())ですが、コンストポインタのキャスト後の動作に保障はないんっでしたっけ?
有馬線
class AAA {
private:
int m_a;

public:
Set(int a){ m_a = a; }
};

class BBB {
private:
AAA m_aaa;

public:
AAA GetAAA(){ return m_aaa; }
};

class CCC {
private:
BBB m_bbb[100];

public:
Insert(int i){ m_bbb[i].GetAAA().Set(100); }
};
464つづき:03/04/25 22:33
クラスCCCのInsert()関数を実行してもクラスCCCのメンバのm_bbb.m_aaa.m_a
の値が変わりません。なぜでしょう・・・
テストにクラス中のprivate:をpublic:に変えて、
直接代入してみましたところ、ちゃんと値が変わりました。
どこかが致命的に間違っていると思うのですが、グーグルでは調べきれなかったので
皆様の力を貸していただきたいです。お願いします。
(かなり簡単化したので、このプログラム自体にあまり意味はありません。)
> AAA GetAAA(){ return m_aaa; }
コピーを返しているから。参照返せ。
466464:03/04/25 22:40
あ、なるほど・・・
ありがとうございました^^
>>464
クラスのメンバにクラスのインスタンスは持たせないほうがいいと思うが・・・。
比較的小さいのならともかく、 operator= の実装がめんどくさそうな位
でかいクラスなら、ポインタもたしたほうがよくないか?
468464:03/04/25 23:00
>467
あまりわかりませんが、
class CCC {
private:
BBB *m_bbb;
};
こういう風にするんですか?
よろしくお願いします。

469467:03/04/25 23:46
実際の実装は
BBB *m_bbb;
としてコンストラクタで
CCC::CCC(int n)
{
m_bbb = new BBB[n];
}
としていますが。
470464:03/04/25 23:47
464でした。
467とは別人だけど…

>>470
ちゃんとメモリリークの対策してればそれでよいと思う。
データを共有しても問題ないのなら、
参照回数計測を実装したポンタのラッパークラスのテンプレートを使うとベターかな。
場合にもよるけど。
472471:03/04/26 02:59
ポンタってなんだよ…
ポインタですた。
ああ、突っ込もうと思ったのに
ポンタって良い感じだな。
475デフォルトの名無しさん:03/04/26 07:59
「インターフェースの継承」はいいけど「実装の継承」はだめって、
C++ではどういうことなんでしょう。
それとも、これって、Javaマンセー厨のごたく?
>>475
言語は関係ない話だろ。
>>476
で、どーゆー話?
>>475
「実装の継承」はダメって云われたら
private 継承の立つ瀬が無いような気がする。
480470:03/04/26 11:14
>>471
もちろんデストラクタで、delete [] m_BBB; で開放しています。
>参照回数計測を実装したポインタのラッパークラスのテンプレートを使うとベターかな。
どんな利点がありますか?
>>480
デストラクタで、delete [] m_BBB; で開放する必要が無くなる
コピーコンストラクタを特に書く必要が無くなる
代入演算子を特に書く必要が無くなる

他いろいろ
482デフォルトの名無しさん:03/04/26 11:33
>>480
具体的な例は「プログラミング言語C++第3版」のP347以降を読むといいよ。
BCB6で
PNGの解凍をしてGraphics::TBitmapで利用できる形にしたいのですが
GLDPNGは使用条件の関連でアウトなんで
何か簡単な方法ってないでしょうか?
読み込みだけでいいんで・・・

SUSIEも考えたんですが別途SUSIEプラグイン用意しろっていうのも
なんなんで・・・

よろしくおねがいします
ここはBCBスレじゃない。
>>484
スマソ・・該当スレが見つかったんでそちらに移動します
486デフォルトの名無しさん:03/04/26 13:35
>>478
つーか、それVBだからじゃねーの?
「実装の継承」がどうのって言ってるのは、Java廚かブビ廚だけ。
C++の言葉にはない。


と言っておこう。
488480:03/04/26 18:22
>>481,482
え、そんな便利なクラスがあるんですか・・・
作り方なんて載ってるHPなんてないですよね。
やっぱ本を買うしかないんですか。
親切にありがとうございました。
490488:03/04/26 18:50
>>488
ありがとうございます。
やっぱり便利なものは世界の誰かが作ってるもんですね。
こういうライブラリって皆さん使ってるんですか?
ラッパークラスっていうぐらいだから、自分が作ったスーパークラスから
派生させたクラスだと思いました。
491デフォルトの名無しさん:03/04/26 19:18
C++最強のCSVライブラリって、プログラミング作法に
載ってる香具師でいいんですか?
492デフォルトの名無しさん:03/04/26 20:23
C++でC#のデリゲートに相当する機能って実現可ですか?
可です。
>>490
便利といえば便利だが、仕様をしらないで使ってるとはまるので気をつけるべし。

とりあえず、template、参照、継承あたりをきちんと理解してから使ったほうがいいと思われ。
あとは、キャストかな?
dynamic_cast,const_cast,static_cast,reintrupt_castとか大丈夫?

あと、stlが使えることが前提条件かな?
> reintrupt_castとか大丈夫?
...大丈夫?
>>495
再割り込みキャスト?
497494:03/04/26 21:02
reinterpret_castだね。
あんまつかわんから、大丈夫じゃねーや。
回線きって(略
498デフォルトの名無しさん:03/04/26 21:06
すいません。どなたかちょこっとおしえてください。
.NET Microsoft Framework SDK で、C言語のソースを
コンパイルする方法を教えてください。
499492:03/04/26 21:14
>>493
どうやればいいのかわかりませんがやってみます

ありがとうございます
>>498
てきとーにパス通してDOS窓から
cl aiueo.c

>>499
boost::bind とか、あるいは std::mem_fun + std::bind1st とか。
501デフォルトの名無しさん:03/04/26 21:58
ボランドC++パソナルってコンパイラも入ってるんですか??
502デフォルトの名無しさん:03/04/26 22:02
>>501
何だい、それは?
フリーの Borland C++ Compiler のこと?
コンパイラのない開発環境ってなんだ?
インタプリタ?
フロントエンド?
504デフォルトの名無しさん:03/04/26 22:05
C++Builder 6 Personalですた
>>503
RPGツクール
506デフォルトの名無しさん:03/04/26 22:08
>>504
そのものがコンパイラ。
>>479
アホな質問で悪いが、private継承ってどんなときに使えばいい?
508490:03/04/26 23:00
>>494
わかりました。ちゃんと理解してから使いますね。
今作ってるゲームが、C++をちゃんと勉強した後に再度作ると
どれだけちゃんとしたゲームになるかが楽しみです。
>>507
親の顔を絶対に人に知られたくないとき。
>>492
似たような機能は関数ポインタ使えば出来る。
ただ、インスタンスメソッドに対してデリゲートと同じようなことしようと思うとかなり面倒。
一応、関数オブジェクトを作れば可能だけど。
boost::functionがあるから大丈夫。
なぜ素直に「できませんごめんなさい」の一言が言えないんだ?
>>512 何の話?
514名無し:03/04/27 01:05
C#厨がいるな
515 :03/04/27 01:18
delegate 委譲ってよく分からんな。Factory????
516デフォルトの名無しさん:03/04/27 01:20
class B
{
protected:
 int n;
};
class D : public B
{
public:
 D( B const& rhs )
 {
  n = 1;// ok
  n = rhs.n;// error
 }
};
↑のようなアクセスがエラーになります。
自分のn(this->n)にはアクセスできるのに、
他のインスタンスのn(rhs.n)にはアクセスできないということでしょうか?

ちなみに、cygwinのgcc3.2で、エラーメッセージは
: In constructor `D::D(const B&)':
:4: `int B::n' is protected
:12: within this context
となります。
>>515
C#ではシグネチャの一致するメソッドを変数のように扱える仕組み?
じゃなかったか
C#のdelegateは
C++BuilderとかVC7のpropertyと何か違うの?
519よねちん。:03/04/27 01:30
クラス配列の初期亜k子について

class Slave{
public:
Slave(int in);
};

class Master{
private:
class Slave salve[10];
public:
Master() : ???? {};
// ↑ここでslaveクラス配列のコンストラクタに引数を渡したい
};

initializeでSLAVEクラスを初期化したいときは、
どのように記述したらいいんでつか??
520よねちん。:03/04/27 01:31
↑初期化子ね。
initilizerでつ。
>>519
できない。

コピーできるクラスなら、vector使えばいいかもしれない。
>>519
ポインタの配列にしてひとつづつ初期化するしか
524よねちん。:03/04/27 01:40
>>521-523サンクス
見てみまつ。
525デフォルトの名無しさん:03/04/27 01:54
>>516
Bのnはprotectedだから。
仮にDと共通の先祖を持つ
class Z ; public B
{
}
があって
DのコンストラクタにZを渡すとき、DがZのnにアクセスできちゃマズーでしょ?
526516:03/04/27 02:02
んー?
うーん、そうかぁ。そうだなぁ。

やっぱ中途半端はよくないな。
protectedイラネ。
527デフォルトの名無しさん:03/04/27 02:04
なんでアクセスレベルを指定するキーワードはみなpから始まる単語ばかりなの?
529デフォルトの名無しさん:03/04/27 02:48
publicファンクションの一部だけしか見えて欲しくないと思って以下のようにしてみました。

class A {
public:
 void func1();
 void func2();
}

class AExcuter {
private:
 A* a;
public:
 AExcuter( A* _a ) : a(_a) {}
 void func1() { a->func1(); }
}

Aの所有者以外は AExcuter を渡してスッキリとしたいのですが,なんか鬱陶しいんです。
こういうことしますか?
「publicファンクションの一部だけ」をインターフェースにわけるのはダメか?
531529:03/04/27 03:07
>>530
class A1 {
 virtual void func1() = 0
}
class A : public A1 {
public:
 void func1();
 void func2();
}

A a;
A1* pa = a;
ってことかな。このキャストはどうなんだろう。
とりあえず実行は出来ました。
勉強してきます。どうも。
532デフォルトの名無しさん:03/04/27 03:12
カンマ演算子のオーバーロードって何に使うんですか
何に使うのかは自分で決める。それが演算子の多重定義。
534529:03/04/27 03:20
アップキャストと言うそうで。dynamic_castもいらないとのこと。<基本でつね・・・
多重継承とインターフェースっていろいろ組み合わせられて便利でしょ
くらいにしか思ってなかったので感激です。
そして一見C++には見えない変態的なソースが出来上がると。
>>535 例きぼんぬ。
演算子の定義によっては

cout << boost::format("%1% %2%") % "hello" % 100 << endl;
こんなのとか

std::list<int> hoge;
enum_start(hoge), 1, 2, 3, 4, 5, enum_end();

こんな書き方までできちゃうということかなぁ?

538 :03/04/27 07:36
>>537
やっぱ演算子の多重定義って嬉々として使うもんじゃないのでは
ないかと。

複素数の四則演算やデバッグ用の << とか以外だとどんな使い方
が定番なのかな。まず業務系ではお目にかからないもので。
539デフォルトの名無しさん:03/04/27 08:22
きっき、きっき、地球の危機!
540デフォルトの名無しさん:03/04/27 08:48
>enum_start(hoge), 1, 2, 3, 4, 5, enum_end();
代入するより楽なとこがイイ。
541r:03/04/27 09:33
こんなのは?
class ExceptionThrower {
    int r_,s_;
public:
    ExceptionThrower(int r) : r_(r) {}
    operator =(int r) {
        if( ( s_ = r ) != r_ )
            throw std::exception();
    }
};

// intを返すAPIとかを多用する時に使う。
void foo() {
    ExceptionThrower ret( 0 );
    ret = int_return_API();
}
// 代入演算子は、結構優先順位が低いから。
>enum_start(hoge), 1, 2, 3, 4, 5, enum_end();

便利そうじゃねーか
boostに入ってるの?
>>538
配列っぽいオブジェクトの [] とか関数っぽいオブジェクトの () とか
ポインタっぽいオブジェクトの *, -> も定番だろう。

>>536
for_each( v.begin(), v.end(), cout << _1 << '\n' );
とか?
newも欧婆老怒できるよ。
>>542
http://www.tietew.jp/cppll/archive/364
http://www.cs.auc.dk/%7Enesotto/init/
http://www.kmonos.net/alang/klx/
らへん。boostのMLで話題になったこともあるけど結局流れてたような。
546デフォルトの名無しさん:03/04/27 13:20
どなたかちょこっと教えてください。
.NET Frawork Microsoft SDK で、C++を
コンパイル・実行したいのですが、
拡張子とコンパイルコマンドを教えてください。
>>546
もしもVS6.0と同じなら、.cpp cl.exe
>>546
(´-`).。oO(どーでもいいが、.NET SDKのやつはiostreamとかついてないぞ‥‥)
(´-`).。oO(stdioとかはあるけどね‥‥)
>>548
C++というよりC?
stlportでも拾ってきて入れればOK。多分。
551デフォルトの名無しさん:03/04/27 15:13
どなたかちょこっと教えてください。
.NET Frawork Microsoft SDK で、C++を
コンパイル・実行したいのですが、
拡張子とコンパイルコマンドを教えてください。
荒らすな死者布厨
553デフォルトの名無しさん:03/04/27 17:46
struct X { int a,b,c; float d,e,f; std::vector<int> g,h,i,j; };
こんな(いろんな型が並んでいる)構造体について、
bool operator < ( X const& lhs , X const& rhs );
をa,b,c,d,...の順で辞書順として定義したいのですが、
return lhs.a < rhs.b || ( !( lhs.a < rhs.a ) && ( lhs.b < rhs.b || ( ! ....
となって、括弧がどんどん深くなってしまいます。

現状は、この書き方でものすごいソースになってしまっているのですが、
もっと綺麗な書き方はないでしょうか?
>>553
普通に...
if(lhs.a != rhs.a) return lhs.a < rhs.a;
if(lhs.b != rhs.b) return lhs.b < rhs.b;
if(lhs.c != rhs.c) return lhs.c < rhs.c;
...
じゃダメなのか ?
555 :03/04/27 21:47
>>541
うーん、俺の周りではあまり使わないですね。そもそも例外処理
自体を理解している人がいない (俺も含めて) ので、普通に
int にステータス割り当てて値を返すコーディングがほとんどです。

>>543
そうか! 確かに [] は使いますね。漏れはこういうのを定義する側
というより、すでに定義されているクラスライブラリを使う側ですけ
ど。
556553:03/04/28 00:44
>>554
operator < だけ使う、ということにしたいのです。

書き方とは別件だけど、operator != 使ったほうが効率はいいのかな?
おしえて、えろい人。
>>556
> operator < だけ使う、ということにしたいのです。

それ無理じゃん。

struct X { int a, b; };

の場合でいいから、あんたの書き方で書いてみなよ。
558553:03/04/28 01:18
>>557
bool operator < ( X const& lhs , X const& rhs )
{
 return lhs.a < rhs.a || ( !( rhs.a < lhs.a ) && lhs.b < rhs.b );
}
>>553
http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/boost-sandbox/boost-sandbox/boost/utility/lexicographic.hpp?rev=HEAD&content-type=text/vnd.viewcvs-markup

return lexicographic( lhs.a, rhs.a )( lhs.b, rhs.b )( lhs.c, rhs.c )( lhs.d, rhs.d ) ...;

当然ショートサーキット評価はされないので注意が必要なこともある。
560559:03/04/28 01:47
いや、return lexicographic::minus == lexi...()()()().result(); か。
561553:03/04/28 02:12
>>559
ふーむ。そんなものが作られてるってことは、
道具無しで綺麗に書くのはどうやらできないみたいですねぇ。

結構最近できた奴みたいですな。
リリースされてたら使うところだけども、
今回は気合のソースとコメントで見送っとこう。

ありがとうございました。
562559:03/04/28 02:30
>>561
あるいはマクロが嫌いでなけりゃ
#define COMPARE_BY(X) if(lhs.X<rhs.X) return true; if(rhs.X<lhs.X) return false
 COMPARE_BY( a );
 COMPARE_BY( b );
 COMPARE_BY( c );
 ...
 COMPARE_BY( z );
 return false;
#undef COMPARE_BY
とかどーよ。
563553:03/04/28 02:42
>>562
マクロは嫌いだけど、便利に使って#undefするなら問題なし。
そっか、operator < の定義なら途中でreturnも問題ないし、それがいーな。
重ね重ね、ありがとうです。
564デフォルトの名無しさん:03/04/28 03:02
UnWindResume ってなに?
>>553
三項演算子は?
566553:03/04/28 13:22
>>565
ん?どうつかったらいいの?
567デフォルトの名無しさん:03/04/28 23:39
下記のような状況でvalue_==target_valueの要素のiteratorを得たいのですが、
どうするのがよいですか?

typedef boost::shared_ptr<hoge> HogeSharedPtr;

class hoge
{
 int value_;
public:
 int GetValue() const { return value_; }
 void SetValue(int value) { value_ = value; } 
}

void main()
{
 vector<HogeSharedPtr> hoges;
 for(int i=0; i<50; i++)
 {
  HogeSharedPtr p = HogeSharedPtr(new hoge());
  foo->SetValue(i);
  hoges.push_back(p);
 }
 
 int target_value = 27;

 
 vector<HogeSharedPtr>::iterator it = ????????????????????????
}

568567:03/04/28 23:39
下記のような方法は分かるのですが、
値1個取り出すのにファンクタ作るのも面倒だし汚い気がするので、
ファンクタクラスを作らずにできるだけboost無しでも出来る方法を教えて下さい。

class HogeValueCompare
{
 int value_;
public:
 inline HogeValueCompare(int value) { value_ = value; }
 inline bool operator() (boost::shared_ptr<hoge> a)
 {
  return a->GetValue() == value_;
 }
};

vector<HogeSharedPtr>::iterator it = std::find_if(
  hoges.begin(), hoges.end(), HogeValueCompare(target_value));
vector<HogeSharedPtr>::iterator it = hoges.begin();
while( it != hoges.end() && (*it)->GetValue() != target_value ) ++it;
>>569
ループ回すのは良くないとかEffectiveSTLに書いてあるので…
bind1st,bind2nd,equal_to,mem_funあたりでなんとか出来ない物でしょうか?
具体的には、
vector<HogeSharedPtr>::iterator it = std::find_if(
  hoges.begin(), hoges.end(), equal_to(mem_fun(&hoge::GetValue), target_value)
みたいな感じでできないか知りたいのです。これはコンパイル通りませんが。
572569:03/04/28 23:57
>>570
> ループ回すのは良くないとかEffectiveSTLに書いてある

書いてあるのを理由にしてるのか?本質を見るのを忘れるなよ。

> bind1st,bind2nd,equal_to,mem_funあたりでなんとか出来ない物でしょうか?

望みの動作には関数の合成が必要。標準には無い。
shared_ptr使っといてboost無しってのもおかしな話だな。
>>572
ありがとうございます。
boostのcomposeあたりを使うのですよね。
shared_ptrは使ってる人が多いイメージがあるんですが、
composeはほとんど使っている人がいないし、
使うだけでノーマルなC++から離れていくイメージがあったので…
やはりcompose無しでは無理ですか。分かりました。
Visual C++.NETで下の定義がどっちも通らないんですけど、

class Hoge {
public:
  static const void* NURUPO = 0;
  static const double PI = 3.141592653589793238462;
};

これは言語自体の制限なんでしょうか? それともVC++の制限?

マクロで定数を定義するのは非推奨らしいので、
普通にこれがヘッダで通ってマクロ同様に展開してくれないと不便だと思うんですが。
>>574
VC++のバグだから安心して良いよ。
>>574
まあ
class Hoge {
public:
  static const void* NURUPO;
  static const double PI;
};
const void* Hoge::NURUPO = 0;
const double Hoge::PI = 3.141592653589793238462;
なら通ると思うけど、不便だあね
静的メンバの初期化が可能なのは
static const int だけじゃなかった?
578577:03/04/29 05:16
>静的メンバの初期化
ブロック内での静的メンバの初期化
>>577
bool
char
wchar_t
符号有り無しの整数型
enum型

なので、>>575は間違い。
580577:03/04/29 05:42
>>579
さんくす。規格の 'const integral' を int と脳内補正して読んでいた。
581575:03/04/30 03:58
>>579
そうだったのか。しらなんだ。thx。
582デフォルトの名無しさん:03/04/30 12:39
newで確保した領域は、その関数が終わったら自動的に開放されるのでしょうか?
それとも、deleteするまで開放されないのでしょうか?
よろしくお願いします。
関数を抜けたら消えてしまうのであれば使い物にならない。
584582:03/04/30 13:15
>>583
つまり、確保した領域を指すポインタを受け取れば、
newがあった関数がなくなってもその領域を利用できるというわけですね。
そのポインタを使って、他の関数からdeleteもできるのですね。
ありがとうございました。
>>582
(´-`);y=~~ .。oO(mallocとfree考えりゃ当然そうなるだろ‥‥)
>>585
そのセミコロンは何?
587585:03/04/30 13:29
カチャ ;y=-(゚д゚) ・: ターン
MSVC++6.0使用中なのですが、DLしたソースをコンパイルしようとしても、
「インクルードファイル「stdafx.h」がありません」エラーが出ます。
で、こいつについて調べ、プリコンパイル済ヘッダってコトまではわかったのですが、
どの資料を見ても、「自動で生成される」と、書いてありました。

で、VC++の設定いじってみて、「プリコンパイル済ヘッダを使用」にチェックも入れてみたのですが、コンパイルできません…
どなたか、対処法を教授ください…
590588:03/04/30 13:48
>>589
スレ違いだったんですね…ごめんなさい。
さっそく逝ってきます…
すでにあるファイルを上書きしたくないとき、そのファイルがあるかどうか、
どうやって調べるんでしょう。
>>591
ふつーに

if(fopen("hoge.txt","r")){
 puts("ファイルが存在しますYO!");
}

じゃいかんのか?
>>591
Win32なら
GetFileAttributesの戻り血を調べるとかね
template<typename X, typename Y> class A{
public:
void func(void);
};
template<typename X, typename Y> void A<X,Y>::func(void){}
template<typename X> void A<X,char>::func(void){}
template<typename X> void A<X,double>::func(void){}
の様な部分特殊化って出来ないの?
できないな
テンプレート使えねー。ププププ
597594:03/04/30 23:20
・゚・(ノД`)・゚・
598LogWindow:03/04/30 23:56
C++の関数テンプレートの部分特殊化不可の攻撃!
594はC++の前でしくしくと泣き出した!
僕にもC言語できるかな
>>596
かわいそうに。使いこなせないのか
601594:03/05/01 00:11
Modern C++ Design p.30に書かれていることですね?
602デフォルトの名無しさん:03/05/01 03:15
これからCで何かちょっとしたもの作りたいんですが
どの開発環境使うと良いですか?
あんま金ないのでBorland の1万のヤツ買おうかと思ってますが、、
>>602
おまえはハゲだ
604デフォルトの名無しさん:03/05/01 15:44
クラススコープ内で有効な定数(int以外)を定義したいんだけど
なんかいい方法ある?
class aaaa{
#define CONSTANT 1.2345
....
#undef CONSTANT
};
606604:03/05/01 15:56
>>605
それじゃクラス宣言中しか使えないじゃないですか。
>>602
Cもいいけど最強の開発環境Delphiはいかが。
ただなのでお金が無くても問題ありません。

http://www.borland.co.jp/delphi/personal/
>>604
「constは定数か否か論争」をやりたい、ってことでつか?
class aaaa{
static const double bbbb;
};
610604:03/05/01 16:09
>>608
論争はどうでもいいです。
定数っぽく認識できて書き換え不可でデバッガで読めれば何でもいいです。
constで出来るかなと思ってやってみたらうまくいかなかったんで。
enum { concon = 0.1 };
これじゃだめなのか?
class Hoge {
 const double PI_;
public:
 Hoge() : PI_(3.14) {}
};
613604:03/05/01 16:13
あー、
class aaaa{
static const double bbbb;
};
const double aaaa::bbbb = 100.0;

で出来た。定義部の方でstaticつけてたらエラー出たんでダメだと思ってた。
みんなスマソ。
cat > hoge.cpp ; g++ -O2 hoge.cpp ; du -b a.exe
#include <iostream>
int main() { std::cout << "hello, world." << std::endl; return 0; }
448506 a.exe

cat > hoge.cpp ; g++ -O2 hoge.cpp ; du -b a.exe
#include <stdio.h>
int main() { ::printf("hello, world.\n"); return 0; }
19221 a.exe

なんで iostream 使うとサイズが数十倍になりますか?
>>614
Localeとかゴニョゴニョあって大変なのよiostreamの中の人は。
>>614
はぁ? おまえは逆転の発想もできないのか?

iostreamを使うだけで量が数十倍も増えるなんて、なんてお得!!
g++-3.2.1 on Linux だと

-rwxr-xr-x 1 user user 13742 May 2 00:47 cstdio
-rwxr-xr-x 1 user user 15827 May 2 00:48 iostream

だった。あんま変わらんね。cygwinはなんでそんな膨張すんだろか?
vc++6.0sp5 (release build)
40960 cstdio.exe
65536 iostream.exe
bcc32 5.5.1
52224 cstdiob.exe
113152 iostreamb.exe
dmc 8.29n (stlport)
37404 cstdiod.exe
364060 iostreamd.exe

dmc 8.29n (default)
37404 cstdiod2.exe
49180 iostreamd2.exe
MetrowerksCodeWarrior8で両方とも
32768byteになってしまいますた
(;´д`)
きりのいい数字だな。
iostream系ほど実装に差がでるライブラリは無いね
サイズをとるか実行速度をとるか
vc5.0sp0
iostream 64512
stdio 30208
静的リンク・動的リンクくらい理解してくれよ
すみません、質問があります。
クラス(構造体)の宣言内でのみ using を使う方法はないものでしょうか?

>cat t96.cpp
#include <string>
#include <iostream>

struct T
{
using namespace std;

string s; // std::stringと記述する手間を省きたい
};

int main()
{
using namespace std;

T t;
t.s = "test";

cout << t.s << endl;

return 0;
}
627626:03/05/02 17:28
>g++ t96.cpp
t96.cpp:6: parse error before `namespace'
t96.cpp:8: 'string' is used as a type, but is not defined as a type.
t96.cpp: In function `int main()':
t96.cpp:16: `struct T' has no member named `s'
t96.cpp:18: `struct T' has no member named `s'

>bcc32 t96.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
t96.cpp:
エラー E2070 t96.cpp 6: 名前空間 'using' が不正に使われた
*** 1 errors in Compile ***
namespace hoge{
    using namespace std;
    struct T
    {
        string s;
    };
}
using hoge::T;
>>626
private: typedef std::string string;
とかで我慢しとくとか。
630デフォルトの名無しさん:03/05/02 21:21
一通りCの勉強しまして(ポインタ、構造体あたりまで)そろそろC++に移行しようと思ってるんですが
Cの標準関数を完全に使いこなせるようになってから移行すべきでしょうか?
将来はC++のプログラマになりたいんですが、時にはCを使う場面も出てきそうなんで迷ってます。

同じような経験を持つ方、ぜひ感想をお聞かせください。
Cの標準関数なんかあんま関係ないよ。
正直言って標準関数を使いこなせない奴は失格。
処理系依存のものまで覚えろとはいわんが、
ANSI関数ぐらい暗記できなきゃ先は無い。
基礎が大事だから、CをもっとじっくりやってからC++をやれ。
しょっちゅうmanで調べている・・・・失格だな。
634続き:03/05/02 21:38
ただし、頑固な爺にはなるなよ。
635632:03/05/02 21:43
念のため。>>634は俺じゃないよ。
関数を暗記する事ほど不毛な事は無いと思うが……
うーん、まあ、これは人それぞれかも。
637630:03/05/02 21:48
そうなんですか・・・Cの仕様や標準関数を完全に暗記することは無理っぽいんで
わからないことがあればその都度リファレンスブックなんかを見たらいいと思ってましたが

うーん 正直めちゃくちゃC++やりたいんですよね 
コンソールアプリでシコシコやるのは平気なんですがちょっとCで次やることが見えなくなってきてるので・・・

>>630
Cがある程度わかるなら、どんどん先へ進んだ方がいいと思うぞ。
>>637
よ う こ そ
チャンチャランチャン チャンチャンチャンチャン♪
>>638に禿同。
基礎的なことがわかっていればとっととC++に移行すべき。
>>640にはげどう
どっぷりCに浸かる前にC++に移行すべき。
642630:03/05/02 22:07
じゃあ行きます(w
ほんとは行きたかったんですよね  でもちょっと不安でした みんなサンクス!
C++を飛ばしてC#に逝くというのはどうだろう?
>>643
飛ばす必要はない

630がんがれ
>>636
かと言って、毎回 malloc() で確保した奴を解放するにはどうしたらいいんだっけ ? とか悩んでいたら、仕事にならんだろ。
詳細は、man/help 見るとして、やりたいことと関数名の対応ぐらいは覚えておいた方がいいと思うけど。
646630:03/05/02 22:41
そうですね 一応今はCによるアルゴリズムの勉強してまして
malloc()とかfree()とかはなんとなく覚え始めてます。

GW明けぐらいに本を買ってC++はじめます。 この本を選ぶ瞬間がなんとも言えませんなっ!
一応EffectiveC++でも買おうと思ってます。  ほんと楽しみ
中腹越えた辺りから絶壁になってるから気をつけてね。
>>646
必読書スレ(と過去ログ)も参考にすると良い。
そもそもmallocなんか使わねーし
>>649
やっぱりでてきたか...。
そう思って >>645 のメル欄に書いといたんだけど、勝手に釣れちゃうもんなんだな。
そもそもmallocなんか使わねーし
>>650
C++スレだからなあ
俺もC++ではmalloc使わねーし
653デフォルトの名無しさん:03/05/02 23:57
C#って普及するのかなぁ。
C++で十分なような気がする。
これからどんな言語をやるにしても、C++の知識は無駄にならないと思うぞ。
そう、C++こそが次世代言語のインフラストラクチャーとなるのだ!
boost::poolのmallocメソッドも使わないの?
真っ当な意見と見せかけ、実は詭弁で論点をはぐらかす輩が多々おります。


 その6:一見関係ありそうで関係ない話を始める
 「boost::poolのmallocメソッドも使わないの?」
>>653
一度やってみ。
むっちゃらくだから。
文字列操作とかファイルシステム関係なんて特に。
>>658
monoがモノになれば考えてもいいが
>>659 座布団1枚
661デフォルトの名無しさん:03/05/03 11:18
>>653
c#は使うのは楽だけど(C++にboost,STL,Loki入れればそうでもないが)、
高性能コンテナを作るのだったらテンプレートのある
C++の方がイイと思うんだけど
ベンチマークとってるヤシいる?
662デフォルトの名無しさん:03/05/03 12:39
もうC++なんてつかわねーよ!
ごちゃごちゃしすぎてワケわかんね!

これからはC#かJavaだよな、ほんと
663デフォルトの名無しさん:03/05/03 12:42
JavaならメモリリークもCほど気にしなくていいし
領域外への書き込みによるメモリ破壊もないし
意味不明な例外も発生しないし、いいことずくめだよ
664デフォルトの名無しさん:03/05/03 12:48
ぜったいいやだ。全部がポインタなんてふざけてる。俺からいわせればそれがバグのもと。でぃぷこぴーとか作るの面倒。
それにくらべてC++は実態とポインタがきちんと区別できるからいい。
静的な型付けが強い言語でテンプレートが無い言語は使う気がしねぇ
無効な領域に書き込んでもエラーにならないで素通りしちゃう言語は駄目でしょ。
667662-663:03/05/03 13:17
>>664
実体とポインタの区別をしなきゃいけないのがバグの元。
そもそもオブジェクト(配列やクラス)の複製なんてのは
するべきではない。
>>667
わかったから他のスレでやれヴォケ
>>663
Javaは起動時から死ぬほどメモリ消費するから
メモリリークなんて気にしなくていいね。
670デフォルトの名無しさん:03/05/03 13:24
>>669
java コマンドのオプションを見たことないんだ。
>>670
ユーザーはjavaコマンドのオプションなんてわざわざ見ないよね。
開発者じゃないんだし。
672662-663:03/05/03 13:26
>>666
静的言語??ププッ
あと、JavaにはSTLの代用品がほぼ揃ってる
テンプレート?めんどくせえ…
Javaの話はよそでやれ

●●JAVAって死滅しちゃうの???? PART6●●
http://pc2.2ch.net/test/read.cgi/tech/1047748598/
674662-663:03/05/03 13:27
テンプレート?わかんねえ…
最近VB.NETとかJavaとか死滅しそうな言語を他の言語スレに薦めに来る
必死な人が多いね。
>>675
それだけ必死なんだろw
頭がかわいそうな奴は無視に限る
ポインタのポインタみたいな真似ができない言語は嫌だ…

C++が嫌なら、AdaやDをお薦めする。
GCあるし、配列の境界チェックもしてくれるよ。
ともかく一度template(Adaだとgenericだけど)を使ってみるがよろし。
>>677
厨には何言っても無駄だよ
ハナから使う気がないんだし
vector<string> strs;
for(int i=0;i<4;i++)
{
strs.push_back("test");
}

cout << strs.at(5) << endl;

これは境界チェックとは言わないの?
>>677
俺なら素直にJavaかC#をお勧めするよ。
もちろんGCもあるし、配列の境界チェックもしてくれる。
あと少しでGenericも搭載されるしさ。
681662-663:03/05/03 13:36
>>677
>ポインタのポインタみたいな真似ができない言語は嫌だ…

プッ
>>679
そんなことより、無効エリアへのアクセスが問題だと思われ。
[]ではなく、わざわざatを使っていると言う点で、
それは境界チェックと言えるかもしれない、
が、
要らぬ輩を召還するような話題はしばらく控えて欲しいもんだな。
684677:03/05/03 13:39
>>680
いやその…俺は別にC++でいいから…

templateイラネ厨に対して、「template使ってみろ」と言う時に、
まさか「サポートされるまで待て」と言うわけにいかんでしょ…
だから現時点で使える言語を挙げたのだが…

はいはい、俺が悪かった。
もう使えるよ。正式に取り入れられていないだけ。
テンプレートが無いC++は使う価値が無い
へー
>>686
逆にテンプテートがあるから使う価値があるね
ほー
そういや昔のC++にはテンプレート無かったな。
テンプテーション
692デフォルトの名無しさん:03/05/03 13:47
お前ら、文字列扱うときになに使ってますか?
char配列とかstringとかAnsiStringとかCStringとかワケワカです。
他にも文字列型ありますか?
どう違って何がいいんですか?
UNICODE使うときはどーしたらいいですか?
string…標準である。標準コンテナとの親和性(iterator)
AnsiString…VCLを使うとき
CString…ATL,WTL,MF(ryを使う時
UNICODE使うときは
basic_string<wchar_t>
つーかwstringな
全部併用してc_str()で受け渡し合えばOK
プッ
697デフォルトの名無しさん:03/05/03 13:58
一番汎用性があるのはstring、UNICODEの場合wstring。
これだけ使ってればどこでも動くってことでおけ?
あとは用なしですね?
基本的にstd::stringを使おう。
でもIntToStrはboost::lexical_castよりもタイプ数が少なくて便利なので、
std::string("No.:") + IntToStr(number_).c_str()のように使おう。
これをVCLオブジェクトにAnsiStringで渡さなければならなくなったら、
AnsiString((std::string("No.:") + IntToStr(number_).c_str()).c_str())のようにして渡そう。
699デフォルトの名無しさん:03/05/03 13:58
あと、string、wstringの問題点でもあったら教えてくれ。
700デフォルトの名無しさん:03/05/03 14:00
>>698
処理系依存。イヤ。
>>700
char*とsprintfで頑張って下さい。
>>701
退化しちゃってんじゃん
703デフォルトの名無しさん:03/05/03 14:05
うんこどもがlinnyなんつーもんをつくろうとしてるぞ(wwwwwww
http://pc.2ch.net/test/read.cgi/linux/1051890709/l50
http://sourceforge.jp/projects/linny/
http://linny.sourceforge.jp/

Janeなみの2chブラウザすらつくれないやつらにつくれるわけねーだろ(ゲラゲラg
704デフォルトの名無しさん:03/05/03 14:05
>>701
おい! char*以外は処理系依存なのかよ!?

string、wstringってバグ大丈夫〜?
705デフォルトの名無しさん:03/05/03 14:23
>>704
698のVCLのことを言ってるのだと思われ

boost::format("%1%%2%") % "No.:" % number;
でいいじゃん。

CString::FormatのようなCの可変引数の実装はC++では歓迎されない。
706デフォルトの名無しさん:03/05/03 16:11
newで確保した領域は、違う大きさでもう一度newしたら、その大きさになるのでしょうか?
char *p;
p=new char[100];
...
p=new char[200];
それとも、newの一回目の分は確保されっぱなしでdeleteするまで無駄な領域として放置されるのですか?
deleteしないでnewがある関数を何回も呼び続けたら、メモリが無くなってしまうのでしょうか?

このあたりのことが、調べても見つかりません。どうかよろしくお願いします。
>>706
それを「メモリリーク」といいます。
その通り。
709706:03/05/03 16:35
>>707-708
ありがとうございました。HPいっぱいありました。>メモリリーク
> HPいっぱい
ってなぁに?
メモリリークについて解説してるページがいっぱいってことでしょ
長時間動かすソフトでなければメモリリークなんて考えなくていいよ。
713710:03/05/03 17:45
>>711
あ、そっかぁ。

>>712
志ね
newで作ったクラスを開放しないでいると、
終了時にデストラクタは呼ばれないの?
クラスじゃなくてオブジェクトでは。
呼ばれません。
静的な変数の場合も呼ばれるとは限らないんだっけ?
呼ばれます。(静的なポインタにnewで突っ込むんじゃねぇだろうな?)
>>718
> 静的なポインタにnewで突っ込むんじゃねぇだろうな?
違う違う。

そうか。呼ばれるのか。サンキュ。
720719:03/05/03 17:55
呼ばれるタイミングがきちんと決められていないということだったかも・・・
生成の完了と逆順となっております。
でも生成順がきちんと決められてないのなー。
>>675
C++も死滅寸前だけどな
>>722
ま た お 前 か !

いい加減まきらめろ(プ
GWだしね
コンテナをメモリの消費量順に並べてくれませんか?
一番メモリ消費が少ないのはvectorとlistどちらですか?
実相依存な気もするけどvector
どうも。setやmapは他に比べてかなりメモリ消費が多いと考えていいのですか?
オブジェクト本体以外の追加のメモリなら、
map>set>list>deque>vector
と予想できる。
もちろん規格で定まってるわけではない。
vector<deque<list<set<map

多分こうだと思う。 用途が違うのでメモリ使用量を比べてもしょうがない気もするけど
おまえら・・・
>>728-729
ありがとうございました。
>>728>>729は微妙に相性が悪い、に512ビット。
きっと腹違いの兄弟。
>>732
俺もそう思った(笑)
735デフォルトの名無しさん:03/05/03 21:11
初歩的な質問で申し訳ないですが、WINDOWSのMegProcは静的に宣言しないといけないのですか?
もし動的に宣言できるならば、それをクラスのメゾットとして宣言するにはどうすればいいのでしょうか?


LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )


> 動的に宣言
ってなぁに?
>>735
恐らくスレ違い。
>>735
SetWindowLongかSetPropでthisポインタを保持して
メッセージループでGetして使う。
thisとhwndを関連付けよ
740デフォルトの名無しさん:03/05/04 01:23
>>735
できないの?
3.1のときの本でwinのクラスライブラリ作ろうってやつは普通に性的でないメソッドを渡してたがなあ。
>>647
wstringはUnicode系とは限らないし、ましてやUTF-16
なんかになるのはWindowsだけだし、国際化の遅れた
OS、あるいはC/C++ localeを見捨てたOSでは、wchar_tが
飾りで実際には使えないこともある。
というわけで、間違っても「w*を使えばUnicodeで国際化で
みんな幸せ」なんて思わないように。
おっと、>>697だった。
Shift-JISやJISの文字列から正しく検索ができる
文字列クラスってあったっけ?
Shift-JISはVC++のCStringがやってくれそうだけど。
AnsiString
745743:03/05/05 07:40
>744
ども。結局VC依存、BC依存になるってことか。
名前なし名前空間てどういうふうに使うものなんでしょうか・・・。
2ちゃんのこと?
グローバル変数を外部ファイルに見せたくないとき
749746:03/05/05 14:04
>>748
なるへそ・・・。
ところで名前がないだけに
namespaceのブロックの外で

void ???::func(){ /*...*/ }

というような関数の定義はできないということ?
void ???::func は出来ないだろうけど、宣言と同じファイル内であれば
void func で問題ないのではなかろうか(未確認)。
751750:03/05/05 14:15
できないな。
752デフォルトの名無しさん:03/05/05 16:46
>>749
要するに、ファイルに直接
static int a;
とか書くとそのファイル内でしか a にアクセスできないという
ファイルスコープ変数/関数を実現する手段として提供されたのだ。
ファイルごとに違った名前空間名が自動的に与えられるけど、
その名前は実際には使えないような内部名になっている。
だから、namespace { } で囲んだ内部でしか使えないし、
別のファイルからは決して参照できない。

static int a; と書くのは今のC++では非推奨で、
namespace { int a; } などと書くのが推奨されている。
754746:03/05/05 22:47
そうですか。
じゃあ無名の名前空間では関数の定義は中にいれないとだめなんですね・・。
755752:03/05/05 23:50
スマン。間違えてた。

> namespace { } で囲んだ内部でしか使えないし、

# namespace { } のあるファイルでしか使えず、
だったね。
>だから、namespace { } で囲んだ内部でしか使えないし、
嘘を教えちゃ駄目だろ

namespace
{
int a;
}

void foo()
{
a=0;
}

こうできる。
む。
758752:03/05/05 23:57
>>756-757
ごめんちゃい。
759デフォルトの名無しさん:03/05/06 01:22
case文の下を
case 0:
{

}
break;
でかこむのは常識ですか?
非常識
聞くまでもなかろう。
>>759
必要になるまでやらない。
囲む場合のインデントによく迷う。
迷った結果、
  {
  case 0:
   {
    int n = ...
   }
    break;
とかに落ち着いたりする。
>>461
確かにインデントにはよく迷うな。

共通して使う変数なら
switch(a)
{
 int n;
case 0:
 ...
}
とかできるんだが、初期化忘れとかちょっと恐いので
それぞれのブロックで宣言した方がいい。
俺は
case 0:{}break;
と書いてから中身を書く
764デフォルトの名無しさん:03/05/06 10:12
荒しのように見えるかもしれませんが、真剣な質問です。
Borland C++で、ドラクエみたいなゲームは作れるでしょうか?
>>764
煽りのように見えるかもしれませんが、真剣な回答です。
作れます。
766764:03/05/06 10:19
>>765
レス、どうも有り難うございましたm(__)m
現在本を買って勉強中ですが、どうも不安になってしまったのでお尋ねしました。
これで安心して勉強できます(^o^)
>>764
BCCでDirectXやWinAPI(GDI)を駆使して
プログラミングするならドラクエもどきは作れる。
けど、結構な努力とそれなりのプログラミング技術が必要。
貴方が作れるかどうかは知らない。
768764:03/05/06 10:22
>>767
勉強になります!
あんまり気負わずに、のんびり楽しみながら取り組もうと思ってます。
769デフォルトの名無しさん:03/05/06 11:58
柏原さんの標準C++の基礎知識を読んでいるんですが、
仮想関数を用いた実行時ポリモーフィズム(10章)の説明で、
基本クラス:Base
派生クラス:Derived
として、
Base *pbase = new Base;
....
pbase = new Derived;

とやっているのですが、これは、Base型のオブジェクトに Derive型のオブジェクトを
代入していることになって、成り立つ訳が分かりません。
どういうことでしょう?

また、
Base pbase = new Derive;
のような記述もありました。
>>764
「RPGツクール」では、ダ・メ・な・の・か?
10000円くらいするじゃねーか
>>769
継承の意味を勉強しなおせとしか言いようがない。
>>772
ポインタもね。
>>773
あとコンストラクタもかな。
>>769
「 Base pbase = new Derive; 」
って記述が本当にあったなら、著者があほ。
継承クラスのポインタは基底クラスのポインタに代入できる決まりになっているから
代入できる。
>>774
メモリリークもね。
778 :03/05/06 20:44
>>776
それだけじゃ答えになってないと思う。

>>772
オブジェクト指向の多態性について勉強しる。
>>778
アフォか?
ポリモーフィズムを実現する手段の話をしてるんだろ。
>>769の「仮想関数を用いた実行時ポリモーフィズム(10章)の説明で」が読めないか?
決まりとして受け止めて
何故そんなことするか?
何故そんなことするとイイかを考えよ
781デフォルトの名無しさん:03/05/07 04:22
はじめて書きこむ初心者です〜
ファイルオープンできずにセグってしまいあたふたしてます(泣

ifstream inst1;
system("awk '{print $1\" \"$2\" \"$3}' inputfile.dat > hoge.dat");
inst1.open("hoge.dat",ios::in);
とかやろうとしてるんですが
fstreambase::open() from /usr/lib/libstdc++.so.3
でセグったとか言われてしまいます。
なんでだか見当もつかないのですがどうしてだかわかる人いませんか〜ToT
セグった
ってどういう意味なんですか?
質問で自分語使う奴って嫌だよね
ったく、「セグる」って言葉も知らない素人が紛れ込んでいるとは。
レスの質が落ちるわけだ。
セグる
  ∧_∧   
 ( ´∀`)< ぬるぽ せぐった
セグる(笑)
Segmentation Faultかな?
だとしても、そんな妙な省略はしないなあ。
業界10年いるけどセグったなんて用語は聞いた事無いなぁ。
インテル系の用語?
788デフォルトの名無しさん:03/05/07 09:01
きょうもみんなでセグりんこ!
みんなでなかよくセグりんこ!
目・肩・腰にセグりんこ!
聞いたことないやつは一回実際にセグってみようぜ
  ∧_∧   
 ( ´∀`)< せぐふぉ
791781:03/05/07 09:57
う〜ん書き込み増えてるから期待して読んでみたらネタになってるだけでしたね〜

セグって来ます…
792デフォルトの名無しさん:03/05/07 11:05
>>775
Base *pbase = new Derive;
でした。
標準C++の基礎知識には継承クラスのポインタは基底クラスのポインタに代入できる決まりになっている趣旨の内容がどこにも取り扱われていませんでした。
ダメだなこの本。。。大体読んだのに。。。
だれか良い本紹介して〜。
793781:03/05/07 11:24
ついネタに走りましたが
せぐるじゃなくてSegmentation Faultになるということで
教えてください〜よろしくおねがいします〜
>>793
まずはsystemの呼び出しをコメントアウトしてみて動くかどうか・・・。
openを使わずにコンストラクタで開くようにしてみるとか・・・。
>>792
「詳説C++」でも読んどけ
セグルッテナンダ
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>785

プログラミング言語C++とARM

何で読まないの?

入門本で要領つかんだらすぐに捨ててこっち読めよ
798デフォルトの名無しさん:03/05/07 14:58
class CA{};

CA* pca=new CA;
delete pa;

とされた時に、このpaが開放されているか否かを確かめる方法は何か
ありますか?
解放されているじゃん。
800デフォルトの名無しさん:03/05/07 15:06
開放してるけど、あるオブジェクトが開放されているか、否かの判定方法を知りたいんです。

if(pca==何かの値){開放されていない}
else{開放されている}

みたいな。
言っている意味がよくわからない。
本当にシステムに返されているかどうか知りたいわけ?
そうです。何かよい方法ありませんか?
>>802
それって激しく環境依存なのでは?
環境を書くか、その環境専用のスレにゆかなければ答えは得られないのでは。
>>797
ARM
こんな化石本読むんですか?
機種依存しちゃうと話がややこしくなりますので、それでは、

void func(void){
CA* pca=new CA;
}

void main(void){
func();
}
とやると、このpcaはリークしますが、これが既に何者にも参照されていない
ことを知るにはどのような方法があるのでしょうか?
お願いします。
>>805
どんな処理系でも通用する汎用的な方法は無い。
boost::shared_ptr とか使って、そもそもリークしないように汁。
>>798
ポインタの指す先が何なのかは一般的に不明。
参照先が有効かどうかは、雰囲気で察するしかない。

次のルールで、無効なオブジェクトへのアクセスはなんとなく回避できる。
1. オブジェクトを変更できるポインタは、インスタンスごとに一つしか作らない。
2. deleteしたら、すぐにnullを代入する。
3. オブジェクトを変更しないポインタは、自動変数にする。

スマートポインタについては次の人が説明してくれる。
よろしく↓
808↑漏れにはムリ:03/05/07 16:23
επιστημηタソによるauto_ptrの説明
http://www005.upp.so-net.ne.jp/episteme/html/stlprog/_03.html#ref_auto_ptr

某アーカイバ作者K.INABAによるsmart_ptrの説明
http://www.kmonos.net/alang/boost/smartptr.html
VCなら _CRT なんちゃらで 検索すれば、メモリリーク検出できる関数があったりするが・・・。
class object;
vector<object *> objects;

class object
{
object(){ objects.push_back(this);}
~object(){ objects.erase(find(objects.begin(),objects.end(),this)); }
};

ほれ、全てのクラスをこれから継承しろ。 これでできるだろ。


・・・できますか?
>>810
それじゃあ参照されてるかどうか分からないよ?
>>811
むほっ >>800の質問に答えてた。 後のレスをあんま読んでなかった。

>>809
あれはデバッグウインドウに出るだけでは?

というかauto_ptrとか使わずにそういうのを作るっていうのは
つまりはガベージコレクタを作るっていうのと同じなんじゃぁ・・
>>809
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
これですね。

>>813
どの new でリークしたかと、サイズと、内容も出ます。
でも、デフォルトのまま使うと
crtdbg.h の中でリークしたと出てきます(笑
VC6 のでしか確かめてませんけど、
これはどうしようもないはずなので多分 .NET でもそうなってるはず。
こうして NEW を使うようにするのがいいです。

#include <crtdbg.h>
#define _CRTDBG_MAP_ALLOC
#if defined(_DEBUG) && !defined(NEW)
#define NEW ::new(_NORMAL_BLOCK, __FILE__, __LINE__)
#else
#define NEW new
#endif
815813:03/05/07 23:30
>>814
なるほど、勉強になります。
やっぱり810のやり方が一番妥当でしょうね。

デストラクタをvirtualにした方がいい気もしますが
>>815
別に delete するわけじゃないんで
仮想デストラクタにする必要もないかと。
全部のクラスに仮想関数テーブルがくっつくのもいやだし。
CPoint とか CRect とか...。

あとは、仮想継承しないと鬱陶しい事になるのと、
どこで確保した奴がリークしたのか分からないことかな...。
そして、標準ライブラリなどのクラスには対応できないのと。
bcc32を利用した、簡易な開発環境を作ってみたいと思っています。
そのため、ボタンを押すとコマンドプロンプトの窓が開いて中で(別の場所で)指定した
プログラムをbcc32でコンパイルし、その結果がその窓に残るようにしたいと思います。

ですが、うまくいきません。

CreateProcess( NULL, "bcc32 c:\\hoge.cpp", NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, "c:\\", &si, &pi )

みたいなかんじでbcc32 c:\hoge.cppを実行すると、確かにコンパイルされますが、窓がすぐ閉じてしまいます。
かわりにcmd.exeを実行すると窓は開いたままですが、どうやってbcc32を起動するかがわかりません。

どなたかお願いします。
818817:03/05/07 23:48
すみません。スレを間違えました。
C++Builder相談室に逝きます。
cmd /c bcc32 c:\\hoge.cpp
>>816
なるほど。
そういう実装する時は大概最後にリスト辿って解放漏れをdeleteするためだと思ってたもので(汗
確かに継承しないとややこしいことになりますね。
納得です
>>817
スレ違いだよ
>>821
すれ違いだよ
823817:03/05/07 23:56
>>821 すみません。
あとちょっとだけ。

>>819さん、ありがとうございます。
あまりの即レスに感激です。
ただ、残念ながら、ためしたところ、やはりコマンド窓はすぐに閉じてしまいました。
もし、対策がありましたら、お願いします。
内容をリダイレクトして、
自分のプログラムのウィンドウに内容を表示した方がカッコよくない?
825817:03/05/08 00:10
>>824
ありがとうございます。
リダイレクトしようと、
bcc32 c:\\hoge.cpp > c:\\log
とすると、なんだか不調になります。
不調...。
何なんだろ。
あと、調べてみたら、Windows98 とかでは
エラー出力をそのままではリダイレクトできないみたいね。
827817:03/05/08 01:06
>>826
すみません。
やってみると、一瞬で窓が閉じるのでよくわからない(自分が情けない)のですが、
コンパイラの起動後、リンカまでいっていない感じです。
リダイレクトでできるはずのファイルもできません。

すみません。とりあえず、あきらめます。
828デフォルトの名無しさん:03/05/08 11:47
MFCのCWinApp::InitInstance()のオーバーライドのソースに
#include <iostream>を入れると、

>error LNK2005: "void __cdecl operator delete(void *)" はすでに
>libcpmtd.lib(delop.obj) で定義されています
>fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました
>link.exe の実行エラー

というエラーがでまつ。
MSDNでは、マルチスレッド対応してないライブラリが混ざってると。

runtime_errorをキャッチしたいだけなのですが、どうすれば宜しいですか?
なんでMFCスレの話をこっちに持ってくる?
830デフォルトの名無しさん:03/05/08 16:45
標準のC++にfinallyはありませんか?
無いです
すみません、C初心者の者ですが↓のプログラムでエラーがでます。あってると思うのですが・・・。コンパイラはvisualCです。
#include <stdio.h>
#include <math.h>
#include <igraph.h>
int main(void)
{
int i,r;
float th;
double x[5],y[5];
r=100;
th=2*3.1415926535/20;
for(i=0;i<=4;i++){
x[i]=300+r*cos(th);
y[i]=300-r*sin(th);
th=th+(2*3.1415926535)/5;
}
SetLineColor(CL_BLUE);
SetLineStyle(PS_SOLID,1);
Line(x[0],y[0],x[2],y[2]);

SetLineColor(CL_BLUE);
SetLineStyle(PS_SOLID,1);
Line(x[0],y[0],x[3],y[3]);

SetLineColor(CL_BLUE);
SetLineStyle(PS_SOLID,1);
Line(x[1],y[1],x[3],y[3]);

SetLineColor(CL_BLUE);
SetLineStyle(PS_SOLID,1);
Line(x[1],y[1],x[4],y[4]);

SetLineColor(CL_BLUE);
SetLineStyle(PS_SOLID,1);
Line(x[2],y[2],x[4],y[4]);
}
間違ってるとこありましたら、ご指摘お願いします。
エラーメッセージ読め
>>834
エラーメッセージがでないんです。
前はでていたんですが、1回アンインストールして最近もっかいインストールしたら
でなくなってました。
エラーメッセージが出ないのになんでエラーだって分かるの?
エラー 1
とはでるからです・・。
>>837
もう一度インストール
もちろんフルインストールで
>>838
了解っす!
こっこはー! C++ っのー! 相談室だー!
C はスレ違い。

まぁ一応反応しておくと、
int と float と double を混合させて計算するのはどうかと。
精度が違う云々で警告が出ると思う。
i 以外は全部 double に汁。
まぁ、それ以外特に変なとこないと思う。
igraph.h の関数の仕様は分からんが。

前は igraph.h 用のライブラリがないとか、
そういう変な事やっとたんやないかな?

>>838
エラー出なくなったのに、なぜもう一度インストールする必要があるよ。
どうせ前足りなかったものが今回のインストールで入った、ってだけやろ?
まぁ、フルインストールにするに越した事はないけどさ。
841840:03/05/08 18:13
>>838
あ、間違えた。
出なくなったのはエラーじゃなくて
エラーメッセージだったのね。
そら再インストやわ。
すまん。
>>840-841
スレ違いすみません。どのスレに書けばいいか分からなかったので^^;

再インストしたんですが、JINT35.DLL、VBAR332.DLL、MSXBSE35.DLLというファイルが開くことができませんでしたとでました。
無視するとそのままインストールできるんですが、最後にシンボルファイルをセットアップするようにとでてきます。
それをセットアップしないとデバッカは呼び出し関数のコンテキストを決定できませんと・・。
セットアップするアイコンをクリックしてセットアップしようと思ったんですが
このマシン上の対応するdllファイルとマッチしませんとでて、
最後にすべてのシンボルファイルはシステム上へ正しくインストールされませんとでます・・。

スレ違いな上に長文でもうしわけないですが、どうすればいいでしょうか。
>>842
VCなんだからVCのスレ行ったら
>>843
すみませんそうします^^;
みなさんありがとうございました。
C++でファイルロックなんかのいい資料ない?
>>832
     *  *  *
  *         *
 *   Λ_Λ    *
 *   ( ´ρ` )    *
 *  } ガタリナイヨ  *
  *         *
    *  *  *
849デフォルトの名無しさん:03/05/09 00:32
>>847
プ
850デフォルトの名無しさん:03/05/09 01:07
生まれて初めてプログラム書きましたが、エラーがでました・・。
どこが悪いのでしょうか??


#include <iostream>
#include <string>
using namespace std;


int main()
{

string sei;

cout << " 貴方は男性ですか、女性ですか?: 男性ならM、女性ならFと押してください:" ;
cin >> sei;

if(sei == M)
{
cout << " 貴方は男性ですね:" ;
}

else if(sei == F)
{
cout << " 貴方は女性ですね:" ;
}

}
>>850
MとFはどこで定義しているのでしょうか。
"M"と"F"に
どんなエラーだったの?
854デフォルトの名無しさん:03/05/09 01:16
あ、
string M;
string F;
と入れれば良いんですかね・・
やってみます
855850:03/05/09 01:17
>>853
たぶん、定義ができてなかったみたいです。
>>854
#define M "M"
#define F "F"
>>855
ずいぶんアバウトなコンパイラだな。
858名無し:03/05/09 01:21
>>857
wara
>>837のような状態になっているんだと思われ。
860850:03/05/09 01:26
>>856
有り難うございます!お陰様で思うような動作をしてくれました(TOT)!!
初めてのプログラムなので、感激です・・

みなさん、どうもでした!
初めてのプログラムはHello worldだろ!
本気で怒るよ?
リナックスのgccだと
main()
だけでもエラーメッセージが出ないのに
ウィンドウズのbccだと
main()
じゃエラーが出ます。
void main(void)
って書けばエラーが一応出ないのですが
リナックスのソースにも一応
void main(void)
って書いた方が良いのですか?
863850:03/05/09 01:29
>>861
ど、どうしてですか(^^; ?

実は自分、>>764ですが、まだまだ先ははてしなく長いです(笑)
>>862
エラーじゃなくて警告では。
最後にreturn 0;

うーん・・C++ならreturn 0は省略できるはずだけど。
>>860
C++ なら、マクロ使うよりは
const char Male[] = "M";
const char Female[] = "F";
もしくは
const string Male("M");
const string Female("F");
にして Male, Female を使う事を推奨。

M, F じゃ訳分からんのでついでに名前も変えた。
>>863
本気でやっているなら、>>856は参考にしちゃいけません。
>>862
main() は void main() ではなく int main() の略でフ。

>>864
VC6 でもエラーが出た気がする。
うろ覚え。
.NET でやっと main(), return 0 省略が通るようになった。
868850:03/05/09 01:34
>>865
なるほど、勉強になりますm(__)m

>>866
どうしてなのですか?
>>864
あっ、そうです。警告でした。
一応どっちでも
main()
でコンパイルは出来てますが、警告されると気分が悪いのです。
bccでは最後に return 0;
と入れれば警告は出ないのか試してみます。
ありがとうございまいた。
>>869
関数の戻り値の型を省略するとint型と見なされる。
>>870
それは C 。
C++ は main とコンストラクタ、デストラクタ、
キャスト演算子以外は戻り値の型を書かなければならない。
>>872
そうだったの?
874850:03/05/09 01:42
>>871
もしかしてC++って英語必須なのですか(^^;;; ?
むしろプログラミングは英語必須。
プログラムに限らず英語必須
でも条件付きコンパイルには必須だから、#defineは悪ってほどでもないよね。
878850:03/05/09 01:45
>>875
マジッスカ!!
これは思っていたよりハードル高いみたいで・・(;;
879g++ -ansi -pedantic -Wall:03/05/09 01:46
>>872:2: warning: ISO C++ forbids declaration of `main' with no type
> main() must return int. Not void, not bool, not float. int. Just int, nothing but int, only int.
ワロタ。
くどすぎ。
条件付コンパイル以外の用途は悪
>>862ですが

main()

 return 0;
}

でbccでは警告が出なくなりました。
気分が良くなりました。
だからもう寝ます。ありがとう。
>>880
ワラタ
>>880
ワラタ
>>882
intつけようぜ。たったの四文字(空白いれて)だぜ。
意表を付いて

float main()

 return 0.0;
}

とかじゃ駄目?
>>880って日本語で書いてあってもおもしろいのかなぁ。
やっと>>880の英語読めました。

とにかく
int main()
じゃなきゃ駄目なんですね。
mainの返り値はintなんだよvoidじゃねぇーんだよboolでもねぇんだよ
もちろんfloatでもねぇッ!intだよint以外ありえねーんだよぅ
main の返り値は int です。
void でも bool でも float でもなく、int です。
絶対 int です。int 以外だめです。int しかだめです。
そういうことですな
いや、日本語訳はわかるんだけど、それを面白く感じられるのかなぁと思って。
面白い、あげるよ
/*
  この関数は、とにかくint型を返すんや!
  キャストして他の型で受ける事もできるんやけど、
  そんな事したらあかん!
  そんな事するヤツはヘタレや!ヨゴレや!
  男やったら、意地でもintで受けんかい!
*/
http://pc2.2ch.net/test/read.cgi/tech/1030169922/23
なんかこう、jojo風に訳せないものか
「山吹色のオーヴァードライブintッ!!」とか
int int int int int int int int int int int int int int int
int int int int int int int int int int int int int int int
int int int int int int int int int int int int int int int
int int int int int int int int int int int int int int int
int int int int int int int int int int int int int int int
int int int int int int int int int int int int int int int
int main!!!

やれやれだぜ......。
void main()で問題が出た事は無い。
しかし、アフォな後輩がウザイのでしかたなくint main()にしている。
趣味のプログラムは全部void main()
この前それをもっていったらウザイ後輩が口出してきたが。
unix でプログラミングしたことないの?
ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/creating_a_child_process_with_redirected_input_and_output.asp
M$ は main 変えるの好きだな。

DWORD main(int argc, char *argv[])
VOID main(VOID)
C++だもん
http://www.catnet.ne.jp/kouno/c_faq/c11.html
11.14に目を通しておきなよ
902デフォルトの名無しさん:03/05/09 03:17
得意げな顔をして何が「void main()」だ。void といいたいだけちゃうんか。
903Kusakabe Youichi:03/05/09 10:07
呼びました? : )
template の質問ですが

template <class T> class CC
template <typename T> class CC

class と typenameの違い教えてください。


>>904
テンプレートの宣言での意味は同じ、というかどっちでもいいかと。
typenameはむしろ、テンプレートの中で明示的に型名だと指示するために使う方が多いと思うけど。
>>904
どっちでも同じだけど、
ここにはクラス以外の型も入れることがあるので
class よりは typename の方が意味的に好み。
class って書いてても int とか入れれはするんやけど、
何か気持ち悪い。
古い規格のころからつかってたから classをつかってたけど、
あるときtypenameってのがあるんだって気がついてからtypename
だけにスタイルを変えた。

でも、明示的に使い分けるのが、一番よさそうだね。
>>880
声出してワラタ
>>897
そいつはウザイ奴かもしれないが
アフォなのは確実にお前だ。
mainの戻り値の問題は、以前かなり荒れたような気がするが。
return 0; って C++ から正式に略せるようになったんだっけ?
ならもう void main の価値は完全に無くなったね。
だって、int main よりも 1 文字も多いんだよ!
>>897
g++はvoid main()だと怒られてコンパイル通らないよ。
913デフォルトの名無しさん:03/05/10 07:49
C++で参照カウントを用いるタイプのスマートポインタを使いたいと思っています。
で、自作してもいいんでしょうが、もしパブリックドメインなライブラリがあれば
それを使いたいと思ってます。
Windowsに依存しないものがいいんですが、デファクトスタンダードになっている
ような有名なライブラリってあるのでしょうか。。。
昔のプログラムをコンパイルして実行したら、止まるべきところで止まらなくなっていました。
よく見ると、<iostream>では、バッファに何か残っていると、getch()で止まらないようです。
考えてみると、それもそうなのですが、みなさんどうしてるのでしょうか?
つまり、プログラム途中で「進めるにはキーを押してください」として止めるには
どうすればよいのでしょうか。
916大黒学:03/05/10 08:55
C++課外授業のアルファテストのお願い

新北野一丁目の大黒と申します。現在、「C++課外授業」と題する、
プログラミング言語としてC++を使用してプログラムの書き方につい
て解説する文章のアルファ版をHTTPで公開しております(データの形
式はLaTeXのソースです)。この文章を、間違った記述がなくてしか
も理解しやすいものにするために、できるだけ多くの人に読んでいた
だいて、ご意見、ご感想、誤りの指摘などを頂戴したいと思っており
ます。なにとぞよろしくお願い申し上げます。

C++課外授業version alpha39
http://www.gin.or.jp/users/daikoku/cpp/cjugyou.tex

前バージョンからのおもな変更点
* 第16章「配列」に、第16.1節「配列の基礎」を追加しました。
読みたいけど、TeX 入れてないからパス...、っていう奴は多いと思う。
dviかpsかpdfにしてくれれば読むよ。
TeXのソースは人に見せるもんじゃないってことをわかってください。
>>917

921デフォルトの名無しさん:03/05/10 11:16
C++標準文字列は何を使えば良いでしょう?

組み込みコンパイラ、VC++、BCBの全てで使えるヤシ。
>>921
std::string と言いたいところだが

>組み込みコンパイラ

char* でも使っとけ
923921:03/05/10 11:24
thanx!>>922
実はBCBでふつーにstring使ってたのに、
MFCで使えないからstringって標準じゃないと勘違いしちゃった。
試しにMFCでstd::string使ってみるYO!
924デフォルトの名無しさん:03/05/10 11:58
C++を使うにしても、継承とか多態性とか使わなくても、
単純にデータや手続きのカプセル化とか、
コーディングをすっきりまとめやすいっていう安易な考えで
C++使うのはありでしょうか?
アンチパターンに陥らないように気をつけな。
ttp://www.gin.or.jp/users/daikoku/cpp/
にあるpdfでいいの?
よくわからんけど。
ありだよ
順子、修作、桐絵、光雅って、誰ってのはおいといて切り口は悪くないと思う。

各章のはじめに、ここで何を説明しようとしてるのか、どのような目標があるのかを
書いておくと、読みやすくなるよ。
そこらの教科書と同じね。

内容の正確性は、まだ読んでないからわからない。
でもちょっと怪しい気もする。
929921:03/05/10 13:04
引数の省略とかしたくて、

func(std::string sout1, std::string sout2, std::string sout3) {
if (sout1 != NULL) sout1 = ""; //代入
if (sout2 != NULL) sout2 = ""; //代入
if (sout3 != NULL) sout3 = ""; //代入
}
って、やりたいんですが、エラーです。
C++の演算子のオーバーロードの弊害でつか。どうしよう。
>>929
引数の省略がやりたいんなら、素直に↓ってやっとけ。
func(std::string sout1="", std::string sout2="", std::string sout3="");
何でNULLと比較してるの?
何でNULLと比較してるの?
何でNULLと比較してるの?

少なくとも300ページ以上の本を探して索引で「デフォルト引数」のとこを
探して読んでみなさい。
932921:03/05/10 13:19
>>930-931

>func(std::string sout1="", std::string sout2="", std::string sout3="");
この場合って、関数内で、sout1に代入してもメモリ破壊されませんか?
func(char *sout = "", ...)

みたいな引数だったら、かなりの確率で問題が発生する。
君の心配しているように未定義の動作になる。

std::string sout = "" なら平気。
stringは代入演算子で渡された文字列のポインタを保存するわけじゃなくて、
そのつど専用の領域を必要なサイズで確保して、そのコピーをもつ
仕組みになってるから。

soutって名前からして、結果を格納するつもりなんだろうけど
それなら
std::string &sout で受け取るべきじゃないのか?
934921:03/05/10 13:46
>std::string &sout で受け取るべきじゃないのか?
うわ、その通りでした。

今まで、AnsiStringばかりを使ってたつけが...

intを文字列にしてstringに渡す方法が分からないでつ。
string hoge(IntToString(value).c_str);
int n;
std::stringstream ss;
std::string s;

ss << n;
s = ss.str();

もしくは

int n;
char buf[100];
std::string s;
sprintf(buf, "%d", n);
s = buf;

もしくは

int n;
std::vector<char> buf(100);
std::string s;
sprintf(&buf[0], "%d", n);
s = &buf[0];

いんすこ大変だけどboostを使えば簡単
ttp://www.kmonos.net/alang/boost/classes/lexical_cast.html
937921:03/05/10 16:20
int n;
>std::stringstream ss;
>std::string s;
>ss << n;
>s = ss.str();

こちらがC++っぽいんですが、何か行数多いですね。
atoiの逆のitoaが無い問題がC++でも解決してないような...
>>937
あほか。 行数が多くて嫌なら関数にでもしろよ。

>atoiの逆のitoaが無い問題がC++でも解決してないような...
この行は訳がわからん。 解決してるだろ?
#include <xxx>
xxxのところに、string.hを指定すると、string.hファイルが挿入されますよね。
では、stringを指定すると、string名前空間の定義が挿入されるのでしょうか?
どなたか教えてくださいませ。
>>939
#include <string>するとC++のstringヘッダが読み込まれます。
#include <cstring>するとstd名前空間内にstring.hが読み込まれます。
xxxstreamは想像以上に遅いので、
何度も呼び出すようなら素直にsprintfを使え
>>941
実装次第です。あなたの環境が全ての人の環境というわけではありません。
うへへ、そうだね。
sprintfの方がより遅い実装になってるとも限らないからね。
見たことないけどね。
iosの実装が甘いサブセットなstlならそうかもね。
944939:03/05/10 18:06
>>940
即レスサンクスです。
よく分かりました。ありがとうございました。
945デフォルトの名無しさん:03/05/10 18:08
STLが使いたいから、と言う理由で
CではなくてC++を選択するのはありでしょうか?
それくらい自分で考えて下さい
947デフォルトの名無しさん:03/05/10 18:17
意見ぐらい聞かせてくれたってよさげ。
C++に変えることで発生するリスクもあるから、よーく考えてからやれ
949デフォルトの名無しさん:03/05/10 18:21
>>945
ありです。
あと、より安全な C としても使えます。
たとえば、char * を使わずに std::string を使うとか。
個人でやるなら全然問題ないけど
仕事でやる場合、手直ししないと使えない旧来のコードがあったり
C++やSTLがわからないかわいそうな人がいたりするからよーく考えてからやれ。
951デフォルトの名無しさん:03/05/10 18:54
みなさんどうもです。C++よさそうですね。
あくまでも開発ツールですから、いいものは積極的に
取り込んでいこうと思います。
かわいそうな人たちは、かわいそうですが、
向上心が無いということでおいていきます。
それが会社の方針なので(w
952デフォルトの名無しさん:03/05/10 22:03
実数型 float で符号ありのときの最小の絶対値は幾らでしょうか?
環境はリナックスです。
助けて下さい。
0?
リナックスしらんが、サイズを調べりゃいいんでないの?
最大の間違えじゃないかな・・・
>>952
> 実数型 float で符号ありのときの

float が実数型でないとか、符号なしの処理系があるのか ?

それはさておき、0 以外のってことだろうな。

#include <float.h> して、FLT_MIN じゃないかな。
957952:03/05/10 22:38
意味が分からない事言っててすみません。
0以外で御願いします。

int zero,mainasu;
float a,b,c;
zero=0,mainasu=(-1);
a=0.01,b=0.0001;
c=(a-b)/a;
if(c<zero){
c=c*mainasu;
}

aもbも更には,cも思い切り小さくしたいのです。
論理的に考えてc<aとc<bのような...

ソースには
#include <stdio.h>
以外入れたくありません。
>>952
絶対値の定義。

|A| = ( A > 0 ) ? A : -A;

よって最小の絶対値は0。
終了
959958:03/05/10 22:42
|A| = ( A >= 0 ) ? A : -A;

こうだな。
>>957
> 意味が分からない事言っててすみません。

というより、

> #include <stdio.h>
> 以外入れたくありません。

の方が意味不明。
中卒の予感スレの予感。
>>961
日本語変だYO!

次スレまだ〜???
あと3日でちょうど1ヶ月。
964952:03/05/10 23:23
C言語の書き方しか知らないです。
C++の書き方知らないです。
でも使っているのはC++のはずです。

>>957では
aとbの具体的な値を書いてるけどほんとは式で出ます。
a>bにもa<bにもなりえる。そのうちaとbの値が収束する。
aとbの相対誤差を求めてる。相対誤差は絶対値
cは相対誤差でそれを収束の条件にする。
相対誤差をとにかく小さくしたい。

while(c<0,0)

なんて書いたらいつまで経っても計算が終わらないので困っているのです。
#include <stdio.h> 以外は使ったことないのです。

助けて下さい。
965952:03/05/10 23:25
>>964
>while(c<0,0) は

while(c<0.0)

の書き間違いです。すみません

while(c<0,0)
while(c<0.0)

0.1bit位間違ってたのかな…
どれだけの相対誤差にしたいかの問題だと思うんだが
>>965
while(c<=0.0)じゃないの?
収束の条件は予め決めとくものだと思うんだけど。
機械の精度ギリギリまでやりたいなら、それでもいいけど
だったら<stdio.h>だけじゃ無理。
970952:03/05/10 23:49
>>968
そうでした。ごめんなさい。

定数係数の2階線形微分方程式を解こうとしてます。
俺はアホです。逝ってきます。
971デフォルトの名無しさん:03/05/10 23:56
じゃあこの話題はおしまいと・・・
972952:03/05/11 00:12
本当に申し訳ありませんでした

今確認したところ

while(c<=0.0)

って書いてませんでした。"<="の"="を抜かしてました。
ちゃんと書き直したら収束しました。本当にすみませんでした。
おつかれさま
ポインタをリストで扱って最後にdeleteをかけたいのですが
最後の--iがとても変な感じがしてしまいます。
何かもっと綺麗な上手い書き方はないでしょうか?

for( std::list<CPoint*>::iterator i = m_List.begin(); i != m_List.end(); ++i )
{
 delete (*i);
 i = m_TaskList.erase( i );//この時点で削除したiteratorは無効
 --i;//既に次のiteratorを指しているためforループの++iの為に一つ戻しておく
}
1. 高精度で計算したければ float ではなく double を使う。
2. a が 0 の場合を考慮しなくてはならない。
  収束値が 0 から離れてると予想される場合でも
  収束するまでに運悪く 0 にならないとも限らない。
3. 絶対値は #include <math.h> して fabs を使う。
while(!m_List.empty()){
delete m_List.back();
m_List.pop_back();
}
1:
for( std::list<CPoint*>::iterator i = m_List.begin(); i != m_List.end(); ++i )
 delete (*i);
m_List.clear();

2:
for( std::list<CPoint*>::iterator i = m_List.begin(); i != m_List.end(); i = m_TaskList.erase( i )
)
 delete (*i);

3:
while( !m_List.empty() ) {
 delete (*m_List.begin());
 m_List.pop_front();
}
>>974
++i
しなきゃいいだろ?
>>976
eraseに拘りすぎていました。ありがとうございました。
>>977-978
書き込んでいる間にレスが
こんなに色々な解決方法があるんですね。
++iとかほとんど決まり文句みたいに覚えていたので
とても参考になりました。ありがとうございました。
981デフォルトの名無しさん:03/05/11 00:31
>>978
センスなし
>>915だけど。
みんななんで答えてくれないんだ。
わからないのか?ガカーリだよ。
std::cin
>>982
DOS なら
while(kbhit()) getch();
とかしてた気がする。
細かいとこ違うかもしれんけど、気にするな。
> みんななんで答えてくれないんだ。
環境依存だから。ってことでよろしいいか?
>>915>>982 scanfやcin等の標準入力とgetch等の直接コンソール入力は相性が
悪いです。>>915のはたぶん標準入力をした後すぐにgetchで止めようとしたと思う。
そうすると、標準入力したものがバッファから消える前にgetchのところに行って
しまう時がある。使うバッファは同じなので。逆にgetchで分岐入力見たいのを
した後、すぐに標準入力があると、getchで入力した文字が入力されている事がある。
止めるならgetcharを使って改行を押してください見たいにやればよいと思います。
delete this;
ってやっていいの?
その後メンバ変数を使ったりしなければ大丈夫。
vc6で以下のコードがコンパイルできません(山のようにエラー)
vectorやstringなんかは使えるのでmapが原因のような気がするけど、
標準で入ってるSTLに付属してますよね?
だれかわかる方いますか
あとgccでは普通にコンパイルできます

#include <iostream>
#include <string>
#include <map>
using namespace std;
int main(void){
map <string,string> ma;
ma.insert(pair<string,string>("mona","giko"));
cout << ma["mona"] << endl;
return 0;
}
>>989
エラーメッセージぐらい自分で嫁。
>>987
インスタンスをnew以外で作成するのを禁止できないので、あぶない。
992989:03/05/11 11:23
>>990
#pragma warning(disable:4786)
エラーメッセージの識別子が'255'文字・・っていうので検索すると解決しました
すいませんでした

    \∧_ヘ     / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
,,、,、,,,  / \〇ノゝ∩ < 1000とり合戦いくぞゴルァ!!       ,,、,、,,,
    /三√ ゚Д゚) /   \____________  ,,、,、,,,
    /三/ | ゚U゚|\      ,,、,、,,,                       ,,、,、,,,
 ,,、,、,,, U (:::::::::::)  ,,、,、,,,         \ ぶーぶーぶー /
      //三/|三|\              タリー
      ∪  ∪    (\_/)タリー    タリー   次スレまだ〜?
               (  ´Д)    タリー  タリー
               /   つ  (\_/)   (\_/)ノ⌒ヽ、
              (_(__つ⊂(´Д`⊂⌒`つ(´Д` )_人__) ))
>>992
おいおい、それはエラーじゃないだろ
>>991
禁止できるし
#include <boost/mpl.hpp>
#include <this>
umee
D言語に乗り換えます
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。