C++相談室 part22

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

過去スレ、関連スレ、関連リンクなどはこちら>>2-7
2v(^・^)v:03/08/09 01:45
3v(^・^)v:03/08/09 01:45
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq-lite/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****

[禿 Stroustrup]
 http://www.research.att.com/~bs/
[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/
[cppll (ML)]
 http://www.trickpalace.net/cppll/ (日本語)
4v(^・^)v:03/08/09 01:45
5v(^・^)v:03/08/09 01:46
6デフォルトの名無しさん:03/08/09 01:48
__ノ              |    _
| |                    |  ノ\__ヽ
ヽ二二 ヽ -―人 、       |   \ノ◎)
_____/ /'(__)ヽ____| 
   /  / _(__)∩      \
   |  |/ ( ・∀・ )ノ RUBY!  \
   .\ヽ、∠___ノ\\        \
     .\\::::::::::::::::: \\        \
7v(^・^)v:03/08/09 01:49
8v(^・^)v:03/08/09 01:56
■関連スレ■
[【C++】template 統合スレ -- STL/Boost/Loki, etc.]
 http://pc2.2ch.net/test/read.cgi/tech/1047978546/l50
[【C++】Boost使い集まれ!]
 http://pc2.2ch.net/test/read.cgi/tech/1033830935/l50
[C/C++の宿題やらせてください。]
 http://pc2.2ch.net/test/read.cgi/tech/1058283913/l50
[初心者にVisual C++を教えるスレ]
 http://pc2.2ch.net/test/read.cgi/tech/1056280510/l50
[VisualC++(MFC限定)相談室]
 http://pc2.2ch.net/test/read.cgi/tech/1056584836/l50
[ATL 相談室]
 http://pc2.2ch.net/test/read.cgi/tech/1029029882/l50
[C/C++でのWindowsPrograming議論スレ(質問お断り)]
 http://pc2.2ch.net/test/read.cgi/tech/1049790146/l50
[COMの世界を斬る!]
 http://pc2.2ch.net/test/read.cgi/tech/981823340/l50
[managed C++ やろうぜ!!]
 http://pc2.2ch.net/test/read.cgi/tech/1014486422/l50
[C++Builder相談室]
 http://pc2.2ch.net/test/read.cgi/tech/1054280736/l50
[タダで使えるBorland C++]
 http://pc2.2ch.net/test/read.cgi/tech/1054390397/l50
[Code of the Nerds" Digital Mars C/C++]
 http://pc2.2ch.net/test/read.cgi/tech/1044210976/l50
[GCCについて]
 http://pc2.2ch.net/test/read.cgi/tech/1046179115/l50
[OpenWatcom C++]
 http://pc2.2ch.net/test/read.cgi/tech/1033433728/l50
[タダで最強!フリーC/C++コンパイラ]
 http://pc2.2ch.net/test/read.cgi/tech/1035882599/l50
91:03/08/09 01:59
なんかここって5連続以上で投稿するとはねられるのか。知らなかった。。。
10デフォルトの名無しさん:03/08/09 02:37
嫌です
12v(^・^)v:03/08/09 02:44
■関連スレ(テンプレートを用いたライブラリ中心)■
【C++】template 統合スレ -- STL/Boost/Loki, etc.
part1 http://pc2.2ch.net/tech/kako/1037/10377/1037795348.html
part2 http://pc2.2ch.net/test/read.cgi/tech/1047978546/l50
【C++】Boost使い集まれ!
http://pc2.2ch.net/test/read.cgi/tech/1033830935/l50

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
13v(^・^)v:03/08/09 02:44
14v(^・^)v:03/08/09 02:45
15v(^・^)v:03/08/09 02:47
 ↑この名前は決まり事ですか?
16デフォルトの名無しさん:03/08/09 02:50
CとC++ってもう終わっていまはC#なんじゃないんですか?
17デフォルトの名無しさん:03/08/09 02:52
>>16
違う。今はJava。
std::list < std::string >

で特定の文字列を含む要素を削除したいのですが
どのようにすればいいのでしょうか?
remove_if
201:03/08/09 09:26
>>12-15
テンプレ長いので整頓して>>2-8にしたんだけど、ダメすか?

>>18
struct contains {
 const string& key;
 contains( const string& key ) : key(key) {}
 bool operator()( const string& str ) const { return str.find(key) != string::npos; }
};
lst.erase( remove_if( lst.begin(), lst.end(), containe("hoge") ), lst.end() );
>struct contains {
> const string& key;
> contains( const string& key ) : key(key) {}
> bool operator()( const string& str ) const { return str.find(key) != string::npos; }
>};

前スレによるとこの時コンストラクタに渡されるテンポラリstring("hoge")の
生存期間はコンストラクタを抜けるまでという事になっているから
これでは駄目なのではないのか?そうだとすれば
const string key;と書くべきという事になるのだが…
2220:03/08/09 14:00
>>21
んにゃ。"full expression containing the call" の終わりまで有効です。
前スレ829 (827ではなく) 参照。
>>22
829は関数呼び出しの参照パラメータに結合した場合で
827はコンストラクタの初期化リストに結合した場合だから
827が適用されるように見えるのだが?
2418:03/08/09 14:07
試して見ます。ありがとうございます。
>>23
コンストラクタの初期化リスト( ctor-initializer / 12.6.2.1 )とは
 constructor()
  : parent_class( ... ), member( ... ) ← これ
のことであって
 new constructor( ... ) ← これ
のことではない。こっちはコンストラクタ関数呼び出しの際の参照パラメータへのbind。
>コンストラクタの初期化リスト( ctor-initializer / 12.6.2.1 )とは
それはもちろん承知だが、つまり
contains() : key(string("hoge")) {}
は駄目という事か。なるほど
具体例がないからよく分からなかった。
2718:03/08/09 14:30
うまくいきました。ありがとうございました。
>>27
こっちもためしてみな。
lst.remove_if( contains( "hoge" ) );
>>28
それだ!
30デフォルトの名無しさん:03/08/10 08:23
ヘッダー1をインクルードしたヘッダー2を
インクルードするとヘッダー1が受け継がれてしまうのですが、
これを受け継ぎたくないのです。

ヘッダーのみでインラインクラス作る時にこの制約が生じると思うのです。
cppでインクルードしたいヘッダーをインクルードすればこれを回避できるのですが、
2つのファイルに分離してしまいます。
解決策はあるのでしょうか?

templateがないなら分割コンパイルすればいいが
あるなら(今のところ)あきらめるしかない。
あるいは独自のネームスペースに閉じ込めてもいいが
マクロはどうにもならない。
プログラミング言語のC++も当社が保有しており、他社にライセン
スしています。当社はC++から多くのロイヤルティ収入を得ていま
す。カルデラの知的資本の奥の深さには驚かされました。

http://www.zdnet.co.jp/enterprise/0208/20/nw_01.html
>>30
たとえばヘッダ2で必要としている(ヘッダ1内の)宣言が型名で、
ヘッダ2の中ではそれへのポインタとして利用されているだけなら、
ヘッダ2の中でその型名だけ(それが型名であると)宣言してやれば、
ヘッダ2がヘッダ1をインクルードする必要はなくなる。

もしヘッダ2がインクルードされる前にヘッダ1がインクルードされていれば
中身のあるその宣言を使えばいいし、逆にインクルードされていなければ、
ヘッダ2の中で自前で必要最低限の宣言だけしてやれば良い。

...しかしたとえそれが型名であっても、ヘッダ1でテンプレートが使われていたり、
ヘッダ2でポインタや参照以外の使われ方をしていたりすると、
>>31 のいうとおり、どうしようもないだろうな。

ってゆーか漏れはそもそも、そういう構成自体がどうかと思うが。
>>1
乙!!
ちょいと質問です。変な状況かもしれないのだけど。

C++で書かれた二つのライブラリを組合わせて一つのプログラムを
作りたいのですが、それぞれに別のメモリ管理ポリシーをもってます。
つまりそれぞれで operator new() を別のものにしてやりたいのですが、
うまい方法はないでしょうか?
それぞれのライブラリはもう書きあがっているので、できるだけ
ライブラリのコード自体はいじらずに、ヘッダをちょこっといじるだけで
すむとうれしいのですが..
( ´_¬`)プ──ン
クラスライブラリなら、メモリアロケーションをポリシー化して、
継承させればいいんでないか?
38デフォルトの名無しさん:03/08/10 13:46
前スレからきますた。
C++のRTTIについて質問なのですが、これってC++は
どうやって実現しているのですか?
文字列で各インスタンスに埋め込んでいるのでしょうか?
>>38
普通は、仮想関数テーブルに型情報を置いてある。
仮想関数テーブルがどこにあるかは前スレを見れ。
4038:03/08/10 13:53
>>39
レスありがとうございます。
仮想関数テーブルの質問も私ですた。(苦笑
ってことは仮想関数をもたないクラスのインスタンスも
vptrを持っているということですか?
>>40
RTTIは仮想関数画ナイトダメ
4238:03/08/10 13:59
>>41
そうなんですか?
仮想関数を持たないクラスでもRTTI使えますが。。。
>>40
>>40
No, それだと C との互換性がなくなっちゃうから。C++ 標準規格では、
仮想関数を持たないクラスに対して downcast できないことになってる。

5.2.7 Dynamic cast
1 The result of the expression dynamic_cast<T>(v) is the result of converting the expression v to type
T. T shall be a pointer or reference to a complete class type, or “pointer to cv void”. ...
(2-5 upcast とか null ポインタの扱いなど)
6 Otherwise, v shall be a pointer to or an lvalue of a polymorphic type (10.3).
4438:03/08/10 14:19
>>43
なるほど。。。納得です。
となると仮想関数をもたないクラスのRTTIは
どうやって実現しているのですか?
RTTI といえば typeid もあるけど、あれも polymorphic class 以外に
適用すると、実際の型が返ってくるとは限らない。

5.2.8 Type identification
3 When typeid is applied to an expression other than an lvalue of a polymorphic class type, the result
refers to a type_info object representing the static type of the expression.

>>42
処理系とテストコード晒してみ?
まあでも、polymorphic class以外のクラスを、
親クラスから子クラスのポインタにキャストするような
使い方は、あんまりしないわな
(あ、でもCRect->RECT*みたいなのがあるか)。
4738:03/08/10 14:29
>>45
ていねいにありがとうございます。m(__)m
環境はVC++6.0で

#include <iostream>
#include <typeinfo>

using namespace std;
class CBase
{
};

class CDerived : public CBase
{
};

int main(){

 CBase* p;
 p=new CDerived;
 cout << typeid(p).name() << endl;
 delete p;

 return 0;
};

こんな簡単なコードで試しているのですが、出力はCBaseへのポインタ
と出ます。
でCBaseに仮想関数を追加してもやはりダメでした。
VC6 だとデフォルトで RTTI 無効だったような。

メニューバーから [プロジェクト] - [設定] で設定ダイアログ表示
[C/C++] タブ選択
「ランタイムタイプ情報 (RTTI) を有効にする」のチェックボックスを確認
#include <iostream>
#include <typeinfo.h>

class Base {
public:
virtual void vvfunc() {}
};

class Derived : public Base {};

using namespace std;
main()
{
Derived* pd = new Derived;
Base* pb = pd;
cout << typeid( pb ).name() << endl; //prints "class Base *"
cout << typeid( *pb ).name() << endl; //prints "class Derived"
cout << typeid( pd ).name() << endl; //prints "class Derived *"
cout << typeid( *pd ).name() << endl; //prints "class Derived"
delete pd;
}
typeid( type-id )
typeid( expression )
5138:03/08/10 14:37
>>48
あぅ。
こんなのがあったのですね。知りませんですた。(--);;

でもやっぱりダメみたいですー。(TT)
5238:03/08/10 14:43
>>49
理解できますた。
コードまで書いていただいてすんまそん。
お騒がせしますた。
逝ってきます。。。
>>51
> cout << typeid(*p).name() << endl;
これで CDerived と表示されない?
5438:03/08/10 14:47
>>53
なりますた。
ポインタの型を表示させていますた。(TT)
5530:03/08/10 16:05
>>31,33
ありがとうございます。
>ってゆーか漏れはそもそも、そういう構成自体がどうかと思うが。
そうですね。
ヘッダー1(class1)をヘッダー2(class2)でインクルードせずに
プロトタイプ宣言して使っても
結局はヘッダー2もインクルードしないとコンパイルできない...。
ただ、後からヘッダー1以外で定義した(class1)を選択できる
余地は生まれるわけだが、(class1)のあるヘッダーを探さなければいけない罠。
56デフォルトの名無しさん:03/08/10 16:17
しょうもないことかもしれないのですが
#includeディレクティブって、みなさんどこに
書きますか?
.cppにまとめて書いている人を良く見かけますが
.hでそのクラスの実装で必要なのをインクルード
してはマズイでしょうか?
2ちゃんねらーなどの間で、人気のある寺院が有ります。
これらの寺院にて諸願成就を祈願しましょう。(爆)

(1-3件目)
http://www.tctv.ne.jp/matuti/
http://www5b.biglobe.ne.jp/~ryumyoin/
http://www1.ocn.ne.jp/~tatsueji/
(4件目)
--------------------------------------------------------------
寺院名    吉祥山唐泉寺
通称     江戸川不動尊
所属宗派  真言宗泉涌寺派
住所     〒133−0051
        東京都江戸川区北小岩七丁目10−10
        京成電鉄の小岩駅から徒歩約15分
        (JR線の小岩駅は、
        京成電鉄の小岩駅とはもの凄く離れているので不可。)
電話番号  03−3658−4192
住職     高田正圓
        (女住職で、先代住職(高田真快)の奥さんであった模様。) 
本尊     不動明王
祈祷日及び祈祷時刻
        通常は毎日午前6時より(150分前後かかる模様)
        行われるが、毎月28日には(不動明王縁日として)
        午前11時にも(2時間ほどかかる模様)行われる。
祈祷料
(普通護摩)   3000円 5000円 10000円
(特別護摩)   30000円(21日間) 100000円(108日間)
          300000円(365日間)
--------------------------------------------------------------
>>56
継承関係があったりメンバ変数として実態を持つ場合には、当然ヘッダに
書く必要がある。ただし、そうすると

1. ヘッダ A に private メソッドを追加
2. ヘッダ A を include している別のヘッダ A1, A2, A3... も
 影響を受ける (と make や統合環境のビルドシステムは理解する)
3. 結果としてヘッダ A, A1, A2, A3, ... を直接・間接に include している
 ソースコードは全部リコンパイル

となって、規模が大きくなってくるとキツイ。

俺は極力ヘッダ同士の include はせずに、実装も impl イディオムや
インターフェース継承 + FactoryClass などを使って隠蔽するように
してる。
ヘッダの依存関係は少ないほど良い。
>>56
58のとおりだが、
他に、相互参照したときにエラーになるなど。
6156:03/08/10 16:35
>>58-59さん
なるほど...
.cppでインクルードすると#includeを書く順番に気を
つけないといけないので、.hに書けばいいのにと
思ったのですが、書籍によっては徹底的に.cppで
まとめてインクルードしているもので。
58さんの方法、まだ初心者なのでよくわからないのですが
もっと勉強しますです。。。
> .cppでインクルードすると#includeを書く順番に気を
> つけないといけないので
それはヘッダの書き方が間違ってる気がする。
6356:03/08/10 16:47
>>60さん
ありがとうございます。
でも、Grid.hとCell.hがあったらGrid.h中でCell.hを
インクルードしておいて、プログラム中ではGrid.h
だけインクルードするようにしたいですね、やっぱり...

みなさんみたいにもっといっぱい経験を積まなきゃぁ
>>63
GridだけでCellを使わないならCell.hをインクルードする必要はないでしょ。
Cellも使う時だけCell.hをインクルードすればいいだけだし。

勝手にまとめてインクルードされて些細な変更でまとめて再コンパイルされるより、使うものだけインクルードした方がマシ、
何十個もインクルードするわけじゃないんだから。
6556:03/08/10 17:04
>>64
ちょっとこんがらがってきたのでよく考えて見ます。。。
66デフォルトの名無しさん:03/08/10 18:42
C++でAccessに接続したいのですが
何か参考になるサイトがあれば教えてください。
67デフォルトの名無しさん:03/08/10 20:44
質問です。

class CTest{
public:
CTest();
private:
int m_nValue;
};

というクラスがあって、m_nValueを初期化するのに

CTest(){m_nValue=100;}

と書いている場合と

CTest():m_nValue(100){}

と書いている場合がありますが
どう違い、使い分けているのでしょう?
>>67
代入と初期化の違いを調べろ。
>>67
何も考えずに
CTest():m_nValue(100){}
使え
組み込み型の値ならたいした違いはない。と思う
継承する時とかに違いが出る
出るか?
出ない
出るっ、出ますうっ のガイドライン
http://that.2ch.net/test/read.cgi/gline/1038243550/
75デフォルトの名無しさん:03/08/11 03:44
標準ライブラリの名前付け規則(アンダースコア区切りの小文字)について、
なぜあのようになっているか理由が示された文書はありますか?
UNIXではあれが普通だから。
77デフォルトの名無しさん:03/08/11 07:23
map型のコンテナの宣言の時に判定関数を付けたいんですが
その判定関数のはどうしたらいいんでしょうか?
戻り値がboolで仮引数がpairにしているんですけどエラーでコンパイルできません
ダメ質問の典型例
>>35
それオレも知りたい。
引数を微妙に変えたoperator new()を用意して、
MFCのデバッグ用operator new()とぶつからないようにしたりしてる。
もうちょっとなんとかならんのか…
別のプログラムにしてタスク間通信する
8177:03/08/11 08:54
bool haitei(const double& a, const double& b)
{
return a < b;
}
と関数を書いて
map<string,double> x(hantei);
とかいています。
したいことはコンテナの並び順をdoubleの値で順番が決まるようにしたいんです。
map<double,string>でいいだろ
83_:03/08/11 09:01
( ´_¬`)プ──ン
なんでコンストラクタに比較関数を渡してるのかが分からん。
1.釣り
2.参考にした文献にそう書いてあった
3.やっぱり釣り
>>81
> したいことはコンテナの並び順をdoubleの値で順番が決まるようにしたいんです。
無理。んなことしたらmapじゃなくなる。
あと比較関数はテンプレートの引数に。
麻雀かとおもた
typoだよね
8881:03/08/11 09:53
Accelerated C++のp137に
map<K,V> m(cmp);
キーの型が const Kで値の型がVである空のmapを生成する。ただしキーの順番は判定関数の
cmpで決められる。
って書いてあったんです。
キーでしか並べられないことは理解しました。正しくは
map<K,V,cmp> m;
と書くのでしょうか?
デフォルトはless<Key>だからそれを変えなければ意味ない
pointer_to_binary_functionにしとくとか
>>88
コンストラクタに渡せる比較関数は、
map<K,V,CMP> ← としたときの、CMP 型のオブジェクトのみ。

map<K,V, bool (*)(const K&,const K&> m( &cmp );
とでも書くか、もっと綺麗に書くなら比較関数を
関数オブジェクト(わかんなけりゃgoogleれ) にするか。
>>88
前者の記述も間違いではないがこの場合 cmp は less<Key> に限定されるから意味がない。
後者の記述で、cmp には関数オブジェクトのクラスを指定すればいけるばず。
92 :03/08/11 13:45
みんな、SCO にお金払ってる?
俺、払ってないんだけど…
93 :03/08/11 13:47
http://slashdot.jp/comments.pl?sid=112395&cid=373312
MozillaQuestによると、SCOはC++の権利も主張しはじめたようです。
http://mozillaquest.com/Linux03/ScoSource-02_Story03.html
MSに金払ってるからC++は関係ねーな
まったくの初心者なんですが、
C++でキーのログをとりたいんですがどーすればいいですか?
JAVAみたいにキーイベントあるんでしょうか?
javaでやれば?
スパイウェア市ね
98 :03/08/12 00:28
>>95
それは C++ にあるとかないとか、の問題じゃないと思う。
つーか、使っている OS のイベントハンドラにアクセスするためのライブラリがあればできるんじゃない?
99デフォルトの名無しさん:03/08/12 00:39
初心者は何(の本)から手をつけたらいいでつか?
独習?
麻奈たんハァハァ…
>>99
Cマガジン
>>99
Cマガジン
103 :03/08/12 11:31
その前に SCO にかね払わないと…
SCO に吸い取られて餓死しそうです。
VC++6.0 デフォルト
コンパイル通らないけど、こういうのってだめなんだっけ?

#include <vector>
#include <map>

class A{};
class B{};
class C{
public:
C(){}
C(const std::pair<const A, B> &in){}
};

int main(){
std::map<A, B> m;
std::vector< C > v(m.begin(), m.end());
return 0;
}
>>98
ありがとうございます。
調べてみます。
>>104
VC7では通る
less<A>がなくても通るのだろうか
プログラムの勉強をしようと思うのですが、
友達に聞いたところ、ゲームを作ったり本気でやりこむつもりなら、
CやC++が良いと言われました。

そこで質問なのですが、
C++を理解するためにはCの知識は必要ですか?
どういう順序でやっていくのが良いと思いますか?

夏厨ですがよろしくお願いします。
>>108
いきなりC++でじゅうぶん。人並みの頭があれば。
C++は難しすぎ、と言うスレが立っていますが、
それほど難解なのですか?
また、ゲームを作る事を目標にした時、
CよりC++の方が適しているのでしょうか?
(この二つの違いも良く分かってないもので。。)
>>110
難解ということはないが、いろんなことができるので
"全部"使えるようになろうと思うとかなり大変ということ。

一部しか知らなくても十分使えるので、徐々に知識を増やせばいい。

CとC++の違いだが、C++はCを拡張した言語なので、基本的に
C++はCのすべての機能を含み、さらに多機能だと考えて良い。

ただし、Cの機能だけを前提にした書き方と、C++の機能があるときの
書き方の主流は違っているので、C++目的に先にCを覚えるのは遠回りかも。
>>110
C++の方が適している。今時純粋なCで組むやつなんか少ないと思われ。

C++は他の言語に比べると難解と言えるかもしれない。
>>110
(Cと比べて)C++のいいことろ
・オブジェクト指向を実現しやすい
・STLが便利(有り難味はそのうちわかる)
・低水準な部分(ハード周りの部分)を気にしなくてすむかもしれない

悪いところ
C++自身の入門書でよいものがない(大抵はCなどの経験が前提)
細かいことを気にしだすときりがない
はじめにGUIに手を出すと挫折する
114104:03/08/12 13:47
>>106

サンクスコ。
そうか、7では通るのか...。

なんかvector(unsigned int, T, allocator)
に解釈されてるっぽい。
>>114
VC6だとSTL関連は通らないことが多いかも
116デフォルトの名無しさん:03/08/12 14:29
他スレでも関連したことを聞いたのですが教えてください。
みなさん自作の共通関数とかってどうやってプロジェクト
に取り込んでコンパイルしていますか?
cppに例えばSumという関数を定義して、それを別のcpp
から呼びに行くと「定義されていない識別子です」と
叱られるのですが。
ハラショー
>>117
すぱしーば
>>116
ヘッダファイル書け(´д`;)
>>116
ヘッダーファイルというものを知らんのか
>>119,120
知りませんが何か?
>>121
そこまで根源的な初歩を知らないなら
まずは入門書嫁
123116:03/08/12 15:34
遅れてしみません。
121は私ではありません。TT

ヘッダ.hと実装.cppに分けて、ヘッダ
を取り込んだのですが、関数を呼んでいる部分で
「グローバルネームスペースにない」といって
叱られます。
>>123
簡単な例を見せて
>>123
namespaceが本当に違っているのでなければ、
ヘッダに書いた関数プロトタイプの引数のどっかが違ってるとかじゃないの?
126116:03/08/12 15:39
でヘッダにネームスペースCommonを定義したのですが、
別のcppでそのヘッダをインクルードして
using namespace Common;

とやっても、
Common::Func();
だと通るのですが、ただの::Func()
だと通りません。

遅れたのですがVC++6.0です。
>>126
::Func()はusingの外のグローバルネームスペースから探すから当然では
Func()だろ
128116:03/08/12 15:45
>>124-125

レスありがとうございます。
ソースですが

-- Common.h --

namespace Common
{
void Func();
}

-- Common.cpp --

void Common::Func(){//処理...}

-- 別のcpp --

#include "Common.h"

using namespace Common;

void main()
{
::Func(); // 通らない
Common::Func();  // 通る
}

こんな感じです。
>>128
だから、::Func()と Func() は違うぞ。後者に汁
130116:03/08/12 15:47
>>127
みなさんおさわがせしました。TT
逝って来ます。。。
Cの入門書を終わらせていざC++の入門書を紐解くと
Cの知識が全然役に立たないのは仕様ですか?

他言語からの移行組はCやる必要なかった?
132166:03/08/12 15:52
>>129
サンクスコ!です。TT
>>131
うん
>>131
しかし、C++の入門書はCからの差分のみ書かれている場合が多いので、
いきなりclassのソースが出てきてstructとの比較……とかやられても
さっぱり理解できない気がする。

文法からしっかり説明されてる本ならいいけどね。
C相当の知識はWebで収集してしまえ!
136デフォルトの名無しさん:03/08/12 16:31
C++も色々あるみたいですけど
どれを使ったらいーんですか?
一番メジャーなやつ教えてください。
>>136
C++処理系?
unix/linux系ならGCC3.x
WindowsならMS純正ってことでVisualC++.NET2003がC++的に無難かね
vector<string> func();
みたいな関数があって、返り血の各要素を変数
v1,v2,v3...
に格納したいんですけど簡単な方法ありますか?
perlみたいに (v1,v2,v3,...) = func(); とできればよいんですけど
>>138
配列のまま使わない理由は?
v1, v2...のほうが面倒だらけじゃんか
140デフォルトの名無しさん:03/08/12 16:47
directxをがんがんに使ったドハデなゲームを作るには、どのC++がいいですか?
bolandのはダメって友達が言ってたんですが・・・
>>139
ちょっと抽象的過ぎました。すいません。例えば
vector<string> func(string s);

string s = "会社,社員,社員コード";
(company,name,code) = func(s);
のようにしたいんですが。
>>141
ゲイツのC#にしとけ
>142は141じゃなくて>>140
まちがえた欝だ。
>>141
まあ簡単で安全な記法はないが、結果を構造体にすれば多少使いやすくなる:
struct record {
std::string company, name, code;
record(const std::string& com, const std::string& nam, const std::string& cod)
:company(com), name(nam), code(cod) {}
};
record vector_string_to_record(const std::vector<std::string>& v)
{
return result( v[0], v[1], v[2] );
}
>>139
vector ≠ 配列

>>138
vector <string> rtn = func();
company = rtn[0];
name = rtn[1];
code = rtn[2];
じゃだめなん?
>>144
あ、 return result は return record の間違い
footempl<tuppleType>(company, name,code) = someTupple;
を実現するテンプレートは作れると思う。
>>140
microsoft の製品にはmicrosoftの製品で・・・。
つまり vc2003つーことだ。
>>141
boost::tuple<string,string,string> f(string);

string s,s1,s2,s3;
boost::tie(s1,s2,s3)=f(s);
>>149
boost便利棚
151138=141:03/08/12 17:22
>>144
こんな方法もあるんですね。勉強になります。

>>145
たしかに地道に代入するのが手っ取り早いかも。

>>147
どうやるんだろう。全然思いつかないです。
>>149
と思ったらboostにはこんな便利なものがあるんですか。これを機会に導入してみよう。
Visual C++やgccなど色々なソフトの名前を聞きますが、
エディタ等が違うだけですか?作れるプログラムの種類が違って来たりするのでしょうか?
>>152
私はVC++でコンパイルするソースもgccでコンパイルするソースも
同じエディタを使ってますが。
>>152
つくれるぷろcの種類が違います
ボーランドしぃプラプラのインスコと環境変数の設定は終わった。
簡単なソースも書いた。拡張子も.cppにした。
cd使って.cppが置いてあるフォルダまで行く事も出来た。

で、コンパイルするには後なにをすれば良いんだ?
HSPはボタン一発で全部やってくれたんだが
CとかC++ってなんか小難しいのな。
>>155
makefile で ググれ。
俺はVCしか使ったこと無いんで、これ以上説明できん。
bbc failname
>>157
名前をしくじるのか?
>>157
> bbc failname
なんか失敗しそうだなw
>>157
徹夜明けだけど激しくwラタ
162デフォルトの名無しさん:03/08/13 11:09
bcc32 filename でやったぞ
163デフォルトの名無しさん:03/08/13 11:10
いまさらながらだが、bbcじゃなくてbccだよな。
164デフォルトの名無しさん:03/08/13 11:12
いまさらながらだが、bbcじゃなくてbccだよな。
165デフォルトの名無しさん:03/08/13 11:16
いまさらながらだが、bbcじゃなくてbccだよな。
bcc32 filenameでやったらコンパイルできたぞ!
最初bbcとbcc試してダメだったんだが32を付けないといかんのだな。
objファイルとかtdsファイルとかわけわからん物まで出てきたがな!
お前等thx

exeファイルクリックしても一瞬で画面が消えてしまうのは、
ソースにHSPで言うwaitとかstopを入れてないからだろうか。
クリックして実行すんじゃなくて、コマンドプロンプトからfilename[Enter]で
168デフォルトの名無しさん:03/08/13 11:36
Auto〜って予約語ですか?
169デフォルトの名無しさん:03/08/13 11:38
>>168
no
auto のみ予約語
171168:03/08/13 11:42
>>169-170
ありがとうございます
>>167
thx

*
**
***
****
*****

と表示する事に成功したよ。
tdsとかobjファイルって消したらまずい?
激しく邪魔なんだけど。
>173
いいよ。
>>173
全部開発が終了したら消す。
>>173
かまわんが。ソースコードの管理だけはちゃんとしとけよ。
177デフォルトの名無しさん:03/08/13 13:10
このページの後半に書かれていることは間違いですよね?
http://www.kurumi.sakura.ne.jp/~kumicyou/cplusplus/1305.html
中盤にかかれている、
>実は、explicitを使用しない場合、コンストラクタは何回でも呼べる。
> A a = 1; //a = A( 1 );
> a = 2; //a = A( 2 );
このあたりから、間違いなわけだが。
>>177
うへえ、コンストラクタでメモリ確保すると異常終了するだって?
むちゃくちゃですな。
'Resource Acquisition is Initialization'の前提が崩れる(笑)

それより代入演算子定義してないからメモリリーク起こしてそうだけどな。
まさに、「代入演算子定義してない」から、二重解放がおこっているのでせう。
> A a = 1; //a = A( 1 );
これは×
> a = 2; //a = A( 2 );
これは○

>(異なるインスタンスを作れば)コンストラクタは何回でも呼べる。
>>177
A a = 1; // A::A(1)で初期化, a.p確保
a = 2; //a = A( 2 ); これは分解すると:
// 1. 一時オブジェクト tempがA::A(2)で初期化, temp.p確保
// 2. a.operator=(temp)を実行, デフォルトなのでまるまるコピーされ
// a.pが刺していたメモリはリーク、a.pはtemp.pが指す内容になる
// 3. 一時オブジェクトtempが解体, temp.pはfree
// a.pが指している領域は開放済みになってしまう
a = 3;
a = 4;
a = 5;
この時点で、a.pには A(5)の一時オブジェクトのために確保されて
既に開放されたアドレスが入っている。
結果、returnの時点で、aの初期化のときに確保されたpのメモリがリークし、
A(5)の一時オブジェクトで確保されたpが二重解放されてるわけだな。
183デフォルトの名無しさん:03/08/13 14:51
>>35,79
VCなら
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vcmex/html/vcconmanagedtypesmfc.asp
みたいな手は使えない?
試してみたけど、MFCアプリの中でMC++できた。
184デフォルトの名無しさん:03/08/13 17:09
visual c++ とフツーのC++はどう違うんですか?
どっち先に覚えればいいですか?
>>184
フツーのC++って何よ
>>184
少なくとも小文字と大文字の違い以上のものはあると思うぞ。
>>184
どちらか片方でも全て覚えることは無理。
覚えるのではなく、使えるようになればよい。
文法とかは同じだよね?VC++も。
俺borlandのつかってるけどVCとどう違うのか良くワカラソ
しかもC++はじめたばかりの初心者ときたもんだ
いろいろと処理系特有の言語拡張がある
Visual C++, Borland C++ Builder = 製品名
C++ = 言語名

「VC++, BCB は、C++で開発するための環境を提供するアプリ」ってことやん。
まぁ、環境固有の言語拡張とかもあるけどさ…
処理系と言語
誰か俺に宿題を出しておくれ。
ちなみに30分前にC言語ライフをスタートしたペーペー。
知識としてはHSPでシューティングからRPGまで一通り作った程度。
Cの知識はウンコみたいなもんです。
宿題スレの過去問でもやっとけ。
何を入れても ぬるぽ と出力される iostream を実装せよ。
>>194
ぬるぽ と入れたら ガッ と出して欲しいね。
例えばtest()とmain()があって、test()の後にmain()がある。
両方関数だけどtest()の中にcoutとか書かれててもそこでは実行されなくて、
main()以下でtest()が呼び出された場合に初めてtest()の中に書かれてるcoutが実行される。
プログラムはmain()以下で始まってそれ以前にある物はただの宣言(設定)みたいな物。

こういう認識で合ってますか?
>>194
iostreamを実装せよの部分が良くわからんけど、
何か値を入力出来る様にチャット窓みたいなの作って、
そこに何を入れられても「ぬるぽ」って出力すれば良いって事?

つまり入力する所でエンター押された時に入力された値を無視して、
関数nurupo()に飛ばしてcout << "ぬるぽ" << endl;を実行させる様にすれば良いだけか。

まぁそのチャット窓の作り方から調べないといけないわけだけれども。
>>197
basic_iostreamを派生したクラスを実装しろってことでは
>>198
やっぱり俺の理解を超えた難しい意味だったのか。
まぁとりあえず197に書いた「何入力してもぬるぽと表示するプログラム」は出来たよ。

勝手に理解して勘違いしたが勝手に宿題もしたからこれでおk!
>>197 >>199
ガッ
「何入力してもぬるぽ」ってのは「何出力してもぬるぽ」の間違いちゃうんかと。
202デフォルトの名無しさん:03/08/14 01:23
情けない質問なのですがおながいします。
int と float の計算で
100 * 2.33000 が 232 になってしまいます。
コンパイラもwarning(floatからintへの変換でデータが失われている
かもしれない)といっているのですが、
こんなときどうコーディングすればいいのでしょうか?
有理数(boost::rationalとか)
>>202
intの100をfloatに型キャストすればいいんじゃないの?

(float)100*2.33000

俺は試してないからね。自分で試してみてね。
実は232.9999...というオチ
206202:03/08/14 01:50
>>203
サンクスコです。
でもboost入ってないんです。TT

>>204
それもやってみたのですがダメです。
10000をかけると23299になりますた。
ウォッチだと2.33000ってなってるのに
なんなんでしょう。TT
どうもです。。。
207202:03/08/14 01:51
>>205
>実は232.9999...というオチ

実際そのようです。TT
どうすればいいでしょうか?


四捨五入じゃダメ?
209202:03/08/14 01:57
作業的には、intは用紙幅でfloatはプレビュー倍率です。

>>208

四捨五入、あるいは切り上げはできたらしたいのですが
nWidth * fZoom のどこでしたらいいのでしょう。
初心者質問でしみません。。。

210デフォルトの名無しさん:03/08/14 01:58
floatがはじめからdoubleならうまくいくんだけどねぇ。
floatをdoubleにキャストしても駄目みたい。
内部表現の問題だろうな。
211202:03/08/14 02:01
>>210
ですよね。doubleにキャストしてもダメでした。
デバッグウィンドウにも2.33000って出てるのに
タチ悪いです。VC++6.0なんですがこんななんですね。。。
>>209
#include <cmath>
四捨五入:
 static_cast< int >( std::floor( nWidth * fZoom + 0.5f ) );
切り上げ:
 static_cast< int >( std::ceil( nWidth * fZoom ) );

四捨五入のfloorはいらんかも。
213212:03/08/14 02:03
VC6か。std外さないと通らないかも。
>>211
俺が確認したのはBCCだったよ。結果は同じだった。
215202:03/08/14 02:11
みなさんレスありがとう。
212さんの切り上げでみごと解決しますた。(端数の
原因はわからないので保留しますた。stdははずしたら
通りますた。)
遅くにほんとにどうもありがとう!!...(TT)...
216デフォルトの名無しさん:03/08/14 02:14
floatの2.33自体が実は内部表現では2.299...となっているから、
根本的に無理かもしれない。もとデータがすでに2.33ではないのだから。
この場合は四捨五入で逃げられるかもしれないが、
今度は.5境界近辺で同じ問題に遭遇するので根本的解決にはならないかも。
浮動小数点数の計算は数学のようにはゆかない。
218202:03/08/14 02:18
>>216
だからBCCでもVCでも同じ現象なんでしょうか。

>今度は.5境界近辺で同じ問題に遭遇するので根本的解決にはならないかも。

印刷のズレ程度なのでとりあえず保留しておくことにします。
端数ってムズいですね。。。
こういうのって(最終的にintが必要なら)100倍とか10000倍とかで倍率を整数値で保持しておいて
最終結果を1/100なり(必要なら50足してから)するのが、一番まともな気がするけど。
利息や消費税計算とかはそうじゃないのかな?知らないけど。
220202:03/08/14 02:26
>>217
>浮動小数点数の計算は数学のようにはゆかない。

つねにそれを頭に入れておかないといけないんですね。
お金がらみじゃなくてよかたー。

>>219
>こういうのって(最終的にintが必要なら)100倍とか10000倍とかで倍率を整数値で保持しておいて

なるほど...
ちらっと思ったのですが印刷部分でスピードが必要と思い、そのまま
ピクセルで持っちゃったのが悪かったかも。。。
(別のtwipとかの座標系を使うとか...)
221デフォルトの名無しさん:03/08/14 02:32
お金がらみは怖いよね。
昔、COBOL使ってたけど固定小数点だったな。
科学技術計算をさせるときは難儀だったけど。
Currencyとかの通貨型をサポートする環境も増えてきてるよね。
COBOLは給与計算とか販売管理、生産管理とかで
実績は十分証明されているもんね。
昔VBでお金からみのシステムの置き換えをやったけど
稼動後以前のシステムと1円合わないとか言われた。
例えばa * b * cでa*bですぐ端数処理するか、全部終わって
やるかの誤差らしかった。んなもん知るかとw
そんなこと言わずに、丁寧につくってあげてなー。
というか、どう端数処理するかが仕様に含まれていないのは如何なものかと。
>>224
仕様出す方は、切り捨てと四捨五入とJIS丸めの違いを知らないから。

>>202
速度を重視するなら尚更floatなんて使うな。
恐らくはdoubleで充分だし、必要なら整数で実装するべき。
っていうか、boost 入ってないなら今からインストールして rational 使えば?

>>225
印刷関係ってことは多分実行環境は PC だし、
多分 double の方が早いだろ。
JIS丸めとIEEE754って何が違うの?
JIS丸めって、JIS Z 8401だよね。
ってことはISO 31/0かな。
IEEEの番号はしらね。
229デフォルトの名無しさん:03/08/14 12:48
>>225-226
floatは32ビット、doubleは64ビットで
なんでdoubleのほうが早いの?
>>229
80x86 では内部では 80 ビットで計算してるから
どっちでもデータ変換が生じることに変わりはないので、
基本的にはどっちでも速度は一緒。
でも、標準関数では double 型が使われているので、
その関数との受け渡しにおいては
float だとデータ変換が生じて遅くなってしまう。
>>229
ハードウェアが最初から double を想定して作られてるから。
232229:03/08/14 13:10
>>230-231
なるへそ。単純にCPUのビットだけの問題じゃないんですね。
>232
同じような理由で、charの方がshortやlongより早く処理できると思ったら大間違い。
202です。昨晩はどうもでした。

>>226
boost入れたいのですがHDDがあと200Mぐらいしか...

>>225-231
doubleのほうが早いんですね。知らなかた...

ところで昨日212さんに教えてもらった標準ライブラリ関数
std::ceilですが、なぜVCだとstdがついてるとコンパイル
できないのでしょうか?
VCは初心者なのですがVCにはそんなクセみたいなのが
いっぱいあるのでつか?
if(1926 <= a && a <= 1989)
if (1990>a&&a>1925)

この二つは同じ意味だと思いますが、処理の早さに差が出たりしますか?
a+=1よりa++と書いた方が速いというのは聞いた事あるのですが、
そういう細かいところで速度をアップするテクニックって他にどんなものがありますか?
盲目的にdoubleの方が速いと思わない方が良いよ。
CPUやコンパイラに左右されるということを忘れずに。

ちなみに単精度用の関数( sinf とか sqrtf とか )が
用意されているコンパイラもある。
>>235
速度に差は出ない。

>a+=1よりa++と書いた方が速いというのは聞いた事あるのですが、
どこの馬鹿にそんなこと吹き込まれたか知らないけど、それは大嘘。


まぁ、演算子のオーバーロードの実装の仕方によれば変わるかもしれないけど。
最近のx86ならlong doubleが80bitフルでない?
>235
その例なら、
if( (unsigned)( a - 1926 ) <= 1989 - 1926 )
の方がたぶんはやい。
>>235
やー、悪いことは言わない。今は可読性を重視した方がいいと思うよ。
マシン性能があがり、お馬鹿なコンパイラも減ってる昨今だし。
ボトルネック解消なら、別で稼ぐべきかと。

>>237
大嘘ってことは無いと思うけど
>a+=1とa++
今時のコンパイラ(つーかC++コンパイラ)なら同じようなコードを出力するはず。
但し、古い貧弱な環境用のCコンパイラが前者は定数値との足し算、
後者をインクリメントで実装しているのも事実。

>1926云々
単純に年だけで元号を判定することは危険。
なぜならば、1989年はたったの数日しか昭和ではなかったから。
最近の CPU だと
むしろ INC x より ADD x, 1 の方が速いって聞くけどね。
昭和元年も、数日しかないけれど。
一例を挙げると、その他の例を挙げないと気がすまない香具師がいるのはこのスレですか?
まー要するに気にするなってこった。
でもhoge++は++hogeと書こうな。operator++のことも考えて統一した方がいい。

とか書くと「hage[hoge++]とhage{++hoge]は違うだろ」とか言い出すだろうけど
そういう時は
++hoge
hage[hoge]

hage[hoge]
++hoge
と書くもんだ。
>>234
VC6 はそうなるね。
古いから標準仕様に追いついてないだけ。

VC .NET なら大丈夫だった気が。
古いのは使うなってこった。
247デフォルトの名無しさん:03/08/14 14:48
class benki {
 const int unko;
public:
 benkio(void) : unko(100) {} 
};
うんこは定数?それともconstオブジェクト?
>>247
排泄物
便器はオブジェクトなのにウンコはオブジェクトじゃないのか
>>247
class benki {
 static const int unko=0xBAD;
};

定数になりますた
251202:03/08/14 17:59
>>246
ありがとう。。。
>>247
class benki {
 static const int unko=0xF00D;
};

定食になりますた
>>252
Scatologyパターンってやつですね
>>253
ヤヤウケタ
255デフォルトの名無しさん:03/08/14 22:29
C++超初心者なのですがよろしくお願いいたします。m(__)m
関数を実装するのに
func(CPoint* pPoint)
とポインタで実装するか
func(CPoint& Point)
と参照を使って実装するか迷うのですが
どういう風に使い分ければいいのでしょうか。
256直リン:03/08/14 22:29
>>255
いろいろ流派があるんだけど、大きく分けると2派。

1. NULL が来る可能性がある場合のみポインタで後は参照。
2. 関数内部で値を書き換えるならポインタ、そうでないなら参照
 (呼び出し側で、値渡しと明らかに区別が付くように)

俺は 1 の方。
258255:03/08/14 22:50
>>257
レスありがとうございます!
あっ、ヌルポインタが来る場合があるのですね。
MFCを勉強しているのですが、たいていポインタで渡して
いるのでなんでだろうと思ったのですが、積極的に
参照を使ってもいいんですね。納得です!
>>258
MFC ってもうかなり古いから、
MFC の設計方針はあんまり当てにならんよ。
まあ、古いから駄目と言うわけでもないんだが、
折れは特別な理由がない限りはほとんどポインタ。
最悪、仕様変更があったときでも対応しやすいし。
(賛否があるのはわかった上でね。)
おれは>>257のでいくと2かな。
だからint unko(const hoge& hage)とかしかつかったことないなぁ。
俺はオブジェクト指向上の要素としてのクラスは全部ポインタ経由だな。
つか、どうせ生成〜保持〜破棄とポインタで扱うことがほとんどだから、
いちいち関数の引数に渡すときにデリファレンスするのも馬鹿らしいって
理由なんだが。
値で多態ができる仕組みが欲しい。
RTIを駆使すれば実装できるんじゃないかねえ
264247:03/08/15 08:54
>>250-252
コンパイル時に置き換えてくれるの?
実際にどうなるかなど気にしない方がいい
266デフォルトの名無しさん:03/08/15 10:15
ある1つのクラス内でしか使わない定数ってどんな風に定義してる?
1. static const int unko = 100;
2. const int unko;(初期化リストで初期化)
3. enum { unko = 100, };
4. クラス外でconst int unko = 100;
5. #define unko 100
6. 憧れのあの子はウンコなんてしない
>>266
お前、「6. 憧れのあの子はウンコなんてしない 」と書きたかっただけだろ?
268266:03/08/15 10:20
>>267
いや、いたって真面目な質問です。
6. は定数なんて使わないって意味。
1. static const int unko = 100;
3. enum { unko = 100, };

これ以外は機血画位
特に4と5はな。
2はクラス内定数じゃない気が
272266:03/08/15 11:21
ごめん、今まで4の基地外だった。
他人様のソース見る限りでは1は少数派かな?
って事で3で逝きます。
>>266
4.はcppファイルの方に書くんでしょ?
それならよく使う。
ヘッダファイルを汚さない手を他に思いつかないんだよね。
>>273
cpp内で継承クラス作って、そこに書けばいいのでは?
>>272
272 みんな好き好んで 3 を使ってるわけじゃない。
ほんとは 1 にしたいけど、古いコンパイラ(VC6 のとか)は
1 を定数として認識してくれないから。
(固定長の配列の宣言とかに使えない)

>>273
cpp ファイル内で使いたいんなら static つけてファイル内スコープに。
リンケージ
>>275
4.2 -1-
"The use of the static keyword is deprecated when declaring objects in namespace scope."
今から借りてきたあの本を根性で前ページスキャンします。
>277
それがどう関係するのか教えてください。
namespaceスコープではなくclassスコープの話をしているのだと認識していました。
>>272
テンプレートとも相性抜群だからおいらも 3 をお薦めしとくよ。
281266:03/08/15 13:04
共有するソースなら3を、そうでなければ1を。
状況に応じて4を使い分ければいいかな?

所で文字列定数ってどうしてる?
クラス外で const char* unko = "もりもり";
これは逝って良し?
どんなプログラムかによってどんな手段がいいかは変わってくる。

フォーマルにやる必要がある場合は、面倒くさいけど
文字列定数に関してはそれだけをひとつのファイルに
まとめたりするのがベスト。

おちゃらかでいい場合はリテラル文字列をその場で直埋め。
const char * const unko = "もりもり";

じゃねぇーの?
284山崎 渉:03/08/15 15:15
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン
285デフォルトの名無しさん:03/08/15 17:16
age
あげ
>>281
static const char unko[];
をクラス内に作って、
.cpp 内で const char Unko::unko[] = "もりもり";
と初期化。
>おちゃらかでいい場合はリテラル文字列をその場で直埋め。

ファイルかリソースだな
>>288
多言語化しやすいしな。
>>288
お前はたった数十行規模のプログラムでもそんなことするのか?
まぁ、止めはせんが。
>289
YAGNI
292まりりんまんそん:03/08/16 16:19
先輩の皆様、膣問させてください。m(__)m
{
 int *i;
 float *f;
 double *d;

 i = new int;
 f = new float;
 d = new double;

 //何らかの処理

 delete d,f,i; // ←ココ
}

最後の行のdelete文はi,f,dの指す3つの領域をすべて正しく解放しますか?
それとも、

delete d;delete f;delete i;

のようにちゃんとばらばらに記述しないといけませんか?
bcc32でコンパイルしてみてるんですが、いずれもエラーはでません。
ちゅか、メモリが解放されたかどうかのチェックのしかたがわからないよ、ママン。('・c_・` )
>>292
deleteされるのはiだけ。
,演算子(コンマ演算子)を調べるべし。
> delete d,f,i; // ←ココ
ダメ。 これだと d の指す領域しか開放されない。
(delete d), f, i;
http://www.microsoft.com/japan/developer/library/vclang/_pluslang_c.2b2b_.operators.htm
>>292
> ちゅか、メモリが解放されたかどうかのチェックのしかたがわからないよ、ママン。('・c_・` )
Borland の C++Builder を買えば
http://www.borland.co.jp/cppbuilder/papers/codeguard/index.html
とかでチェックできるけど。free版だとなさそうな気がする。
296まりりんまんそん:03/08/16 16:39
>>293-294
サンクスです。マンコ^h^h^hコンマ演算子、調べてみます。

>>295
今のところ適当なループを書いてクラッシュするまでまわしたりしてますが・・・。
そうですか、ありませんか・・・。;_;

回答ありがとうございました。m(__)m
デストラクタが呼ばれた時に何らかの情報を出力するクラスを作って試せばいいじゃない。
298293:03/08/16 17:18
ごめんなさい。虚偽を書きました。
294氏が正しい。
似たような落とし穴にこんなのがある。
ttp://www.tietew.jp/cppll/archive/8838 (後半部分)
300デフォルトの名無しさん:03/08/16 22:05

コーポレイトソフトウェアていうサポセンの馬鹿が
PGに喧嘩売ってます。

http://money.2ch.net/test/read.cgi/haken/1057486349/287

腹立ちました。
みんなでやっつけにいこう。
んなことで所構わず貼って回るなよな。
C++勉強中の者ですが、マクロがいまいち理解できません。
宣言した名前に数字や命令などを入れるんですよね?
それで後から書き換える時に楽にできる、と。

そこで疑問なのですが、例えば数字を入れる場合で、
普通に変数でやる場合と何か違いはあるんですか?
命令を入れる場合でも、普通に関数でやれば良いような・・・

あと、C++とC#を比較するとどの辺が違いますかね?
303まりりんまんそん:03/08/16 22:30
>>302
マクロは「単なる文字列である」ことが重要。

例えば
#define M男 鞭で叩かれ蝋燭で熱せられることに喜びを見出す者。雄
と定義すると、
コンパイル時にソースコード中の「M男」という文字列が
「鞭で叩かれ蝋燭で熱せられることに喜びを見出す者。雄」に置き換わる。
単にテキストが置換されるだけなので、
どんな文字の定義も許される。
逆にいうと、置換された結果が正しいプログラム文であるかどうかは、
プログラマが保証しなければならない。

・・・たしか、こんな感じ。
>>302
マクロはC言語からのレガシー(遺産)で、昔は const や inline なんかがなかったのよ。
だからいまなら const や inline なんかでやるようなことを全部マクロでやってたわけ。
だから const や inline なんかでできることでマクロを使うの避けましょう。

まぁ、よくわかんなかったら今はとりあえずマクロは他に打つ手が無い時の最後の手段だってことだけ覚えとけ。
どんな例だYO!!w
// マクロの簡単な罠ドゾー

#define TAX 1.0+0.05
void main(){
printf("1000*TAX=%.0f", 1000*TAX);
}
const, inline, template, ... などを駆使すれば、
マクロが必要になることってのはあんまりない。
まぁ、完全になくなるってことはないけど。
class fusianasan {
void putchar();
};
マクロはALGOL60で言うところのcall by nameによる呼び出しを実現していると
考えることができる。

普通のC++の関数の呼び出しは call by value である。
ただし、仮引数が参照の場合は call by reference(参照渡し) である。
310春は来ない:03/08/17 00:31
それは、それは、空を越えて〜 やがて、やがて、迎えに来る〜♪
クラスのstaticな関数はインライン展開されるのでしょうか?
コンパイラ依存であれば、VisualC++ 2003 について
教えて欲しいです。
インライン展開を期待する書き方(クラス定義内に書くかinline指定する)をしており、
コンパイラがインライン展開可能な関数であればインラインになる。

コンパイラにも依存するが
関数自体にも依存するので一概には言えない。
>>311
インライン展開される【保証があるか】
インライン展開される【場合があるか】
どっちが知りたいんだ?

前者なら
http://www.webstore.jsa.or.jp/webstore/Com/FlowControl.jsp?lang=jp&bunsyoId=ISO%2FIEC+14882%3A1998&dantaiCd=ISO&status=1&pageNo=0

後者ならアセンブラ嫁
インライン展開に関係ありそうなことと、なさそうなことを考えてみれ。
・再帰
・関数ポインタ
・リンケージの種類
315311:03/08/17 07:19
>>312-314
どうもありがとうございました。
316デフォルトの名無しさん:03/08/17 16:36
それほど多くを知らないせいか、そこら辺のフリーソース見ても、
例外処理をしているものは、ほとんど皆無です。

趣味グラムくらいでは、例外処理って、あまり有用じゃないのでしょうか?
>>316
んなこたない。
けどC++の例外クラスは腐ってるから簡単お手軽に使う気はあまりしないよ。
せめてエラーの原因をstringで持たせりゃいいのに。
>>317
はぁ?
stringで持たせるクラスを派生させればいいだけじゃ?
319316:03/08/17 17:03
プロとアマの違いは、エラー処理の厳密さだ!と指摘され、ショックのあまり気がふれ
例外処理でコードを埋めようとしたところ、あまりの例のなさに、がっかりしてたとこでした。

>>317
レスありがとうございます。やっぱり使いづらいのですね。
stringなら簡潔でよかですねぇ。処理の流れを分けて、
可読性を高めるはずなのに、かえってシンプルじゃ無くなったりで…。

どっかで綺麗に実装してるコード例とかないかなぁ…。
それよりstringを投(ry
321316:03/08/17 17:05
ぉぅ、書いてる間に…

>>318
なるほどなるほど、やはり皆さんそれぞれ独自に
自分用例外クラスを設けてるんでしょうか。
例外ってC言語のsetjmp,longjmpに相当するぐらいの負荷があるのでしょうか?
C++の例外クラスってこれだもんな・・・
始めてみたときハァ?って思ったよ。
class exception {

public:
exception () throw();
exception (const exception&) throw();
exception& operator= (const exception&) throw();
virtual ~exception () throw();
virtual const char* what () const throw();
};

まともな例外クラスとはこういうものを言うんだよ。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemexceptionmemberstopic.asp
324316:03/08/17 17:33
>>323
うーーむ、すいません。熱心に読んでは見たのですが
使い方が良く分からなくて….NETが無いと駄目なのかな…。

なんとなく、すごそうだってのは良く分かりました。
>>323
ハァ? それと同じようなモン派生させてそれ使えばいいだろ。何度も言わせんな馬鹿。
326316:03/08/17 17:50
>>325
レス番違うけど、俺へのレスかな…すんません、もう何がなにやら。
327316:03/08/17 17:52
あまり長引いても迷惑ですし、まだしばらくは分相応に
返り値でエラーチェックに戻ります…レスありがとうございました
レス番違うく無いけどね

厨房用例外クラス

class Error
{
 std::string message;
public:
 Error(std::string msg): message(msg){}
 std::string const &Message(){ return message; }
 static void Check(bool exp, std::string message){
  if(!exp) throw Error(message);
 }
};

int main(int argc, char* argv[])
{
 int n = 0;
 try{
  Error::Check(n==3, "n==0でなければならない");
 }catch(Error &e){
  std::cout << "ERROR:" << e.Message() << std::endl;
 }
 return 0;
}
assertで十分
>>322について誰か知りませんか?
>>331
自分でasmファイル吐くコンパイルオプション付けて調べてみたらどうですか?
>>332
知らないならだまっててね
チンカス
プ
↓以下厨の煽りあい
asmも分からないのに速度なんて気にしてる時点で厨丸出し
てかさぁ、質問されたこと以外のことを書き込んでる時点で荒らしじゃね?
夏全開
340デフォルトの名無しさん:03/08/17 18:47
                   _,,,,,.........,,,,__
                 /:;:;:;:;:;:;:;:;:;:;:;:;:;,丶
..    さっさと教えれ…  /:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;.,ヽ
                 i' ' ' ' ' ' ' ' 'i;:;:;:;:;:;:;:;:;.,|
    ,.-‐¬ ̄-、¨¬‐、  |\,. 、/  L:;:;:;:;:;:;.;.l
   ////""`'""''ヽソ-‐l=・= =・=  ヽ:;/¨iノヽ、
  //////」  -=== }  |         ,ノ./lllll/、
  i//ノソ,._______,.""'  '".i,  l `_       ./lllll/  ヽ
  ヽ彡i.6 ̄ ̄i.,__ノ⌒i.,_ノ ..::ゝ.,_____,,,...- /llllllll/    ヽ
  /ヽ ゝ'    ,rti.l.l.l.、)ゝノlllllllllゝ.,__,ノlllllllllllllソ     .}
⌒`ヽ、ヽ li       ./ヽllllllllllllllllllllllllllllllllllllllliゝ /    /
、   V ヽ ゝ  _,......__ ノノ  ヽllllllllllllllllllllllllllllllllli/    ./
丶、,.、,ヽ     ミ三   ` ¬ ‐‐---‐¬ ¨ ̄
        ((   ̄ ̄ ¨¬‐- ..,_
          l 川 |
あーあ、役に立たねぇ板だな。時間損した。
>>341
使うのが難しい板ですからね。
質問者のレベルによっては何の役にも立たないんですよ。
>>341
只なんだよ、只。
乞食根性は仕方ないが
少しは隠せ、恥を知れ。
おみやげ。

技術系メーリングリストで質問するときのパターン・ランゲージ
http://www.hyuki.com/writing/techask.html
真・技術系メーリングリスト FAQ
http://www.geocities.co.jp/SiliconValley/5656/

メーリングリストを掲示板に置き換えても通用するから読んでね。
345↑↑↑↑↑↑↑↑:03/08/17 19:07
ブラクラ
ところで、>>322について誰か知りませんか?
>>346
ある
# 人に聞くよりプログラム書いて時間計れ!
>>347
知らないならだまっててね
チンカス
無限ループの予感!
while (true) {
 ところで、>>322について誰か知りませんか?
 自分で調べてみたら?
 知らないならだまっててね
 チンカス
}
#ってなに
C#って単語を時々きくけど。
>>348は騙りかJava厨、C#厨だと思うが
アセンブラで見るか、それがわからなきゃ
簡単なベンチマークぐらい書けよ。つーか、レベル低杉。

# >>352は釣りと見た。
354322:03/08/17 20:00
うう、すいません・・・つまらない質問してしまって・・・
私は322以降発言していないのですが・・・
私のせいでなんかスレが荒れてしまって本当に申し訳ない・・・


話は変わるのですが、>>322のレスについて誰かご存知の方はいらっしゃいませんか?
>>354
謝らなくていいから>>353が言っていることを無視するな
356デフォルトの名無しさん:03/08/17 20:07
今日C++を始めたんですが、
BCC5.5で

/////////////////////////
#include <iostream.h>
int main(void)
{
cout << "test002";

return 0;
}
/////////////////////////
をコンパイルすると、

/////////////////////////
致命的エラー F1003 c:\(省略)\include\stdcomp.h 5: erroe 指令: Must use C++ for STDCONP.h
/////////////////////////

と、表示されコンパイルできないんですが、、、

ちなみに堀越一雄著「決定版初めてのC++」を参考にしています。
著者が使用しているg++コンパイラじゃないと使えないんでしょうか?
それともiostream.hが入ってないだけ?

お願いします。
理論抜きでいきなりベンチとったりアセンブラソース眺める奴は馬鹿。
358322:03/08/17 20:08
>>355
知らないならズボンのチャックを閉じていてください。
>>356
拡張子がcppになっていないとか
>>356
本古すぎ
オブジェクトのアンワインドの分だけ例外が遅い。
>>357
アセンブラのソース眺めれば理論が分かるだろ
>>359
拡張子は「c」になってます。
>>360
図書館でC++関連の本を探したらコレしかなかったんで・・・。
364356:03/08/17 20:22
>>357
コレ、私です。
365356:03/08/17 20:23
>>363-364
失礼こっちでした。
焦りすぎ、、、
>>365
拡張子cppにして本屋にいって本を買ってきなさい
367356:03/08/17 20:34
>>366
あっ!
出来ました!
ありがとうございます・・・。

何度もスイマセンが
独習用として買う場合のお勧めを教えて下さいませんか?
値段は安ければ文句無いですがひとまず保留として、
C++初心者分かりやすいのをお願いします。
なんでできるんだろ
.hつけるとstd::がいらなくなる???
>>367
ttp://www5c.biglobe.ne.jp/~ecb/cpp/cpp00.html

所々間違いもあるっぽいがとりあえずこのへんでもみとけ。
>>368
.h 付きのヘッダは namespace std が無かった頃の負の遺産なので。
371356:03/08/17 20:47
>>369
参考になりました。
ありがとうございます。
一般的には .h 付きのヘッダは推奨ではないが、
移植性を考えると現状では .h 付きのヘッダのほうがよかったりする。
>>372 んなこたぁない。
C++本気でマスターしようとするなら、本代は最低2万はかかるよねぇ
>>374
最近はネットですむけどね。
>>374
英語が読めれば、ネットで読みきれないほどの記事があふれてる。本要らない。
>>354
だから
「ある」
ってさっき言ったじゃん
>>370
わしの使っている本にはusing namespaceに関する表記がまったくないのですが、
なんかいいサイトを知りませぬか?;q;
>>373
.h 付きでないヘッダに対応している処理系を対応し始めたバージョンを併記して
5つ以上リストアップしてくれ。それができないならそんなこと言うな。
できたら負けを認めよう。
380デフォルトの名無しさん:03/08/17 21:55
C++勉強中です。
とあるクラスでひとつのメンバ関数をconstにしたら、連鎖的に書き換える必要がでてきて、
最終的に全てのメンバ関数がconstになり、全てのメンバ変数がmutableになりました。
これってたぶん使い方を誤ってますよね。
mutableの効果的な使用法を解説しているサイトはありませんでしょうか?
381373:03/08/17 21:57
>>379
めんどくさい。STLport使えよ。
>>380
mutable使わない方向でお願いします。
>>381
STLportって printf とか C 言語のときからの標準関数も含んでるの?
mutable を使う例としては参照カウントぐらいで、
それ以外で mutable を使うことは滅多にない。
>最終的に全てのメンバ関数がconstになり、全てのメンバ変数がmutableになりました。

意味なし。最強
386381:03/08/17 22:06
>>383
ごめん、聞かれてる意味がわからない。
VC7.1でSTLPortって使えるの?
388デフォルトの名無しさん:03/08/17 22:07
通報しました
389380:03/08/17 22:08
>>382 >>384
ありがとうございます。
しばらくは mutable は存在しないものとして学習を進めていくことにします。
390380:03/08/17 22:10
>>385
やっぱり・・・。そんな気はしたんですよね。
メンバ変数を変更するメンバ関数ではconstを付けるな

メンバ変数を見るだけのメンバ関数にはconstを付けろ
メンバ変数を見るだけのメンバ関数なのにiteratorで舐め回すとエラーが出ます。
>>392
const_iteratorでも?
>>392
const_iteratorにしる。
>>392
const_iteratorじゃだめ?
>>379
> .h 付きでないヘッダに対応している処理系を対応し始めたバージョンを併記して
> 5つ以上リストアップしてくれ。それができないならそんなこと言うな。

知らんが、今後シェア最大になるであろう Visual Studio .NET 2003 には .h 付きヘッダが
含まれていないのだが。それでも .h を入れた方が移植性が高いと思うのか?
C++って一貫して一貫性がないな。
322と名乗っている教えて君に【無礼者】のレッテルを貼る
教授または先輩に見放された理由がよくわかる
それは一貫性だな。
>>396
それは今後の話だろ?
現状では同じ VC でも未だにバージョン6が主流。
>>400
で、だから.hつけるのかね?
メタ一貫性だろ
403デフォルトの名無しさん:03/08/17 22:27
>>396
まじ!?
じゃあCのソースをコンパイルできないじゃん。
>>403
無いのはiosteam.hとかだろ。たぶん。
Cでコンパイルすればいいんだしさ。どうせ。
>>401
.h 付きじゃないとダメな処理系の時にはどうしてるの?
#if をいちいち使ってるの?
>>405
.h 付きだとダメな処理系の時にはどうしてるの?
#if をいちいち使ってるの?
>>406
そんな処理系使ったことないある。
そんな処理系、実際どれくらいあるの?
.h月じゃないと駄目な処理系に出くわしたら
泣く泣く自分で.h付かないヘッダ作って、中で.h付きのファイルをincludeしてください
>>408
で、.h 付きだとダメな処理系ってどれくらいあるの?
410デフォルトの名無しさん:03/08/17 22:51
>>409
VC++.NET 2003
>>410
それだけなの?
gccでも最近のバージョンは警告出す。
>>412
コンパイルは通るんでしょ?
414デフォルトの名無しさん:03/08/17 22:56
>>411
67%のシェアをほこる処理系ですが
>>414
旧バージョン含めたらでしょ
>>414
それはどこが公表してるどういう数字?
できたらソースきぼんぬ。
ウザ
>>414
VC++.NET 2002は .h付きもサポートされてるよ。
で、その67%のシェアって、2003のシェアじゃないよな。
.hつけなきゃいけない処理系って何?
ttp://www.trickpalace.net/cgi-bin/cppll/enq.cgi?mode=enquete&number=5

母数が少ないからあんまりあてにはならんけど、
そんなに現状と激しい差はないと思われる。
421デフォルトの名無しさん:03/08/17 23:09
>>419
VC6。
あと、最近のバージョンなら大丈夫だと思うが CodeWarrior も。
VC++6.0にiostreamとか入っているよ?
stdio がアウト。( cstdio なら大丈夫 )
ハードリンクも作れない低脳どもが
あと付け加えとくと VC6 は cstdio にしても
標準関数が std 名前空間に入ってくれないから意味が無い。
>>425
そんなもの必要ありませんがなにか?
>>424
何それ? いやマジで。cstdioは知ってるぞ。
// VCだとアウト
#include <stdio>

int main() {
  printf("hoge\n");
  return 0;
}
とりあえず、「STLPortを入れて.hを抜いとく」のがいいんかな。
VC7.1にSTLPort入れるとエラー出るよ
>>430
STLportって printf とか C 言語のときからの標準関数も含んでるの?

以下ループ・・・
>printf とか C 言語のときからの標準関数
は処理系依存の物が沢山あるからそういうことはないよ
処理系で用意されているオリジナルのヘッダを読み込むだけの
同名のヘッダは用意されているけど
429 名前:デフォルトの名無しさん[sage] 投稿日:03/08/17 23:38
// VCだとアウト
#include <stdio>

int main() {
printf("hoge\n");
return 0;
}
>>433
例えば stdio.h をインクルードしてるだけの stdio があるってことですか?
>>435
stdio.hもcstdioもある
>>436
そうなんだ、知らなかったよ。情報ありがとう。

でも >>431 によると STLport を使う事で問題が
万事解決ってわけでもなさそうですね。
>>429
> #include <stdio>
そりゃアウトだろう。
初めて見たよ
>>435>>436 は、微妙に話がかみ合ってない。(cの一文字)
で、>>424>>429は、無視でよろしいですか?
>>422
デマはよせ。VC++ は 4.2 から <iostream> を持っとる。

>>440
> で、>>424>>429は、無視でよろしいですか?
>>403とかも無視でよろしいと思う。
結局、 >>372 が諸悪の根源か?
で、結局のところどういうことなの?
.h 付きだとダメな処理系は VC++.NET 2003 オンリーで、
.h 無しだとダメな処理系は?
>>443
>.h 付きだとダメな処理系は VC++.NET 2003 オンリー
これが正しいわけだが。つーか規格嫁。
>>444
なんだその噛み合ってないレスは
>>444
規格も大切だが移植性の話してるんだから
現状がどうなっているかは重要。
規格にしたがったからって実際に現実の移植性が
いいかとは別問題。
>>446
で、きみは.hつけるのかね?
>>447
その参考にする為に訊いてるんだから
つけているかつけていないか別問題だろ。
頭悪いなぁ。
>>448
規格は一つ。
現実問題は処理系の数だけある。
どっちに依るかは使う処理系によって自ずと決まろう。
規格にすがる気持ちは無いけど、一定の拠り所はほしいよな。
規格規格逝ってる香具師はANSIC++規格に100%準拠したコンパイラが出るまで、
C++を使わないで下さい。
>>450
そうそう。規格通りに実装されてなければ意味をなさないし、
実際問題、まだ全てが規格通りに実装されるわけでもないんだし。
移植性移植性逝ってる香具師はembedded系のC++コンパイラサブセットでも通るコードだけ書いて下さい。
>>453
実際にそれを使う奴は他の処理系でも意識してコード書くだろ。
特に共通で使えそうなコードならなおさら。
要するにだ、今の規格は現場のニーズを満たしていないと。現場のニーズは
規格化するにはあまりにも多岐にわたっていると。そういうことだな?
拠り所が欲しい奴は↓に従え。

まず規格通り .h 無し。
エラーが出るようなら STLport を検討。

それでダメなら .h を足して、対応する std:: の使用を変更する。
このとき、移植性が必要なソースなら処理系で定義済みの
プリプロセッサシンボルで .h の追加、namespaceの変更をスイッチ可能にしておく。

それでだめなら諦めて実装を変える。
このとき、移植性が必要なソースなら処理系で定義済みの以下略
457322:03/08/18 01:20
プププ 流石低能ばかりがいるスレですね。
>>457
また来やがったなw
460322:03/08/18 02:19
ああっ、なんてレベルが高いスレッドなんだ。これじゃ誰もついていけない。
2ちゃんねるも捨てたもんじゃないな。まだこんなレベルが高いスレッドが
あるんだもんな。しかし、ここに書き込んでいる連中は相当なレベルの高さ
だよなぁ。これじゃ、こんなにレスがつくのも当たり前だよ。本当に322の
レベルは高いと思うけど、それについて行ける奴も凄いな。まったく尊敬
するよ。おれもみんなを見習ってレベルの高い人間になれるように精進する。
そして、みんなについて行けるような立派なプログラマになるよ。まだ見習い
だけど3ヶ月後の俺を見ていてくれよ。みんなをアッと言わせるプログラマに
なるからさ。その時まで、みんなもレベルが高いのを持続してくれよな。
ほんと、2ちゃんねるに来て幸せだよ、オレは幸せものだなぁ。
>>460
長文オツカレー、だけどみんなもう飽きちゃってんだよねぇ…。
4621:03/08/18 02:29
//Basic.h
class Basic {
public:
int b;
Basic() {b=10;}
};

//C1.h
#include "Basic.h"
class C1 : public Basic {
public:
int cc1;
C1() {cc1 = 1;}
};

//C2.h
#include "Basic.h"
class C2 : public Basic {
public:
int cc2;
C2() {cc2 = 2;}
};
4632:03/08/18 02:29
//Main.cpp
#include <iostream>
#include "C1.h"
#include "C2.h"
using namespace std;

int main(int argc, char** argv) {
C1 c1;
C2 c2;
cout << "c1.cc1=" << c1.cc1<<"c1.b="<< c1.b;
cout << "c2.cc2=" << c2.cc2 <<"c2.b="<< c2.b;
return 0;
}

%c++ Main.cpp
In file included from C2.h:1,
from Main.cpp:3:
Basic.h:2: redefinition of `class Basic'
Basic.h:2: previous definition of `class Basic'

となってしまいます。どうしたらよいのでしょうか?
とりあえずインクルードガード
465322:03/08/18 02:47
>>461
コピペにマジレスオツカレー、だけど俺も飽きてんだよねぇ・・・どうしよう・・・
>>465
とりあえず、話を聞いてくれる友達を作れw
>>464
できましたー。蟻が?ォ。
こんなのに、何時間もかけてたなんて…鬱。
468デフォルトの名無しさん:03/08/18 12:31
標準では
ネットワークサポートしてないのでしょうか?(C or C++)
VCなのですが、sys/socket.hなどが見つかりません。
>>468
Winsockなんてのがあるよ。でも、あまり期待しないでね。
ネットワークは、標準にはならないと思うよ。
ネットワークが不要な環境や不可能な環境もあるわけで、
ネットワークがCやC++の標準になってしまうと、そういう環境では
非標準のコンパイラしか供給できなくなる。
GUIは、標準にはならないと思うよ。
GUIが不要な環境や不可能な環境もあるわけで、
GUIがCやC++の標準になってしまうと、そういう環境では
非標準のコンパイラしか供給できなくなる。
STLは、標準にはならないと思うよ。
STLが不要な環境や不可能な環境もあるわけで、
STLがCやC++の標準になってしまうと、そういう環境では
非標準のコンパイラしか供給できなくなる。
473デフォルトの名無しさん:03/08/18 14:35
>>469-470
とりあえずOSで用意されたものを使うことにしました。
ありがとうございました。


一気にレスを読んで、例外に関する話が出てきたけど、
http://www.cuj.com/documents/s=8250/cujcexp2106alexandr/
で紹介されている Enforce を使ってみてはどうかと思う。
実際に使ってみると Log とる時にすごく便利。

何気に std::runtime_error を std::string で実装している環境向けなので、
STLport では使えなかったりするが。
475デフォルトの名無しさん:03/08/18 17:44
>424 >429
それは、c++の規格通り。
(unsigned int)aは、
coutで変数を表示したりする時に一時的に内容をint型に変更するって理解で合ってますか?
aの型は変わらない
>>476
a を usigned int として解釈する、
もしくは a から usigned int の一時変数を作成することを意味する。
VC++で.h付きのと.h無しのとを混ぜるのはやめような。
どっちをincludeするかで使われるライブラリが異なる。
>>476
a の値を unsigned int に変換した値を得るだけ。
a 自身に変化は無い。
-a が a の値の符号を逆転させた値を得るだけで
a 自身に変化が無いのと同じように。
Javaをあまり知らないので聞きたいのですが、
C++のSTLみたいなgeneric programmingってJavaでそのまま使えます?
>>481
ダウンキャストの嵐でよければ、現状でもそれなりには、
container/iterator/algorithm ... みたいなものはある。

けど、もっとマシな Generics は JDK 1.5 に期待せよ。
http://objectclub.esm.co.jp/JavaGenerics/
>>482
ありがとう。かなり参考になった。
484 ◆uDXNh2HK82 :03/08/18 23:41
Microsoft Visual C++ .NETとBorland C++Builder 6のどちらを買ったほうがいいですか?
使用目的はC++の勉強や趣味にしたいと思っていますが、本格的なアプリケーション作成も十分出来るなどの点を踏まえて教えて下さい。
>>484
VC .NET 2003 にしとけ。
Borland はもう結構長いことバージョンアップしてないし。
>>484
.NET Frameworkかcygwinでまずは遊ぶのがいいよ。
金出したからといってプログラミングができるようになるわけじゃない。
書籍に金をかける方がいい。
IDE無しじゃ学習効率は大幅にダウンする。
書籍以前の問題だな。
488 ◆uDXNh2HK82 :03/08/19 00:30
>>484です。
C++の勉強と書きましたが、GUIの勉強に近いです。
C++の書籍は購入し、Linuxも持っているので標準入出力、反復、条件分岐、ポインタなどはある程度出来ます。
GUIをやろうとするとなんか調子が悪いし、Windowsなどでフリーで提供されているソフトよりもわかりづらい部分もあるので、Windowsでの開発環境を買ってみたいと思いました。
WindowsのAPIも利用したいです。
でもCUIならgccはとてもいいです。
489デフォルトの名無しさん:03/08/19 00:35
抽象クラスのコンストラクタはpublicでOKでしょうか?
>>489
純粋仮想関数をもってないならprotectedにしとくといいよ。
491デフォルトの名無しさん:03/08/19 00:40
privateにしていいの?
492489:03/08/19 00:46
えと、抽象クラスということで、pure virtualありです。
> 純粋仮想関数をもってないならprotected
は何故なのでしょうか? おしえていただけると嬉しいです。
>>492
Abstract not_implemented;
って感じに抽象クラスのインスタンスを作ってもエラーにならないから。
494489:03/08/19 00:54
ああ、なるほど。サブクラスでoverrideしなくてもいいけど、
抽象クラスそのものをインスタンス化してもらっちゃ嫌だと
いうことですね。ありがとうございます。
>>491
全然OK。
そういう設計もある。
496デフォルトの名無しさん:03/08/19 03:20
教えてください。
int i=15 * 6 * 0.7; // 62
int i=15 * 0.7 * 6; // 63
で前者は62に後者は63になるのですが
これは一体なんなんでしょうか?
C++に関係あるんでしょうか
499496:03/08/19 04:28
>>498
ありがとうTT
500デフォルトの名無しさん:03/08/19 06:40
質問です。
プログラムの実行中に、関数を動的に書き換えたいと考えています。
そこで、オリジナルの関数を宣言した時、
その関数のポインタを得ることは出来ますが
関数の終端を得るにはどうすればよいでしょうか?
(この「終端」はアセンブラ命令でいうretの位置だと捉えてください)
>>500
オリジナルを動的に書き換えるのは(確か)無理。
char型の配列を書き換えてcallならできるだろうけど。
502デフォルトの名無しさん:03/08/19 06:52
配列にコピーしたいから終端を知りたいんですけど。
>>502
だから無理。はじめから配列にアセンブラで命令入れとけ。
504500:03/08/19 07:08
回答どうもありがとうございます。
WriteProcessMemoryでどうにかなるかな?
と思ったのですが、無理なのですね〜勉強になりました。

御教授いただいたchar型配列のcallを試してみます。
どうもでした。ちなみに502は私ではありませんが、すいませんです。
505502:03/08/19 07:16
じゃあなんで終端を知りたいんだろう。
506500:03/08/19 07:28
>505
そうでした・・すいません。
最初と変わって申し訳ないのですが、オリジナルの関数以外も視野に入れさせてください。
書き換えは不可能でも、関数の内容の読み取りを行いたいんです。

そこで、ちょっと終端検出を考えて試してみたのですが
void a(〜)
{
 〜
};
void b(〜)
{
};

と隙間無しに宣言して、aとbのポインタを見てみると
bはaの直ぐ後ろに確保されているようで
b-1がaの終端ということでいいのかも、と思ったのですが
この方法は、あまりよくないんでしょうか・・?
メモリの確保のされ方はOSのほうの話になりますか?
507 :03/08/19 08:00
>>506
OS じゃなくてコンパイラの出すコード次第だと思う。
(リンカも多少仕事する余地があるかな)

>この方法は、あまりよくないんでしょうか・・?
どっちにしろ移植性ゼロなんだから、C++ の話題じゃあないし、
あまり気にせず出来るやり方でやればよいと思うよ。
Win32 ならコード書き換えるんなら VirtualProtect(Ex) でチャクチャキっと。
>>506
書き換えとか読み取りとかって・・・
コンパイルというものを理解しているかな?
アセンブラとか、マシン語とかって知ってる?
メモリーの中に、Cの関数が入っているわけじゃないよ。
最近はソースコードデバッガがあたりまえだから、そういう錯覚に陥りやすいのかもしれないけど。
>>508
>>500みるかぎり、その辺は分かってるんじゃないかな
書き換えたいんだったらOpenC++のMOP使う方が格好いいよ。
てか、関数ポインタを使えと小一時間・・・
スレ違い+マルチ
氏ね
>>506
>と隙間無しに宣言して、aとbのポインタを見てみると
>bはaの直ぐ後ろに確保されているようで

そんな保証はない! ・・・と断言してみせた。
さあ次はお前の番だ。保証があると反駁してみせろ。
コンパイラの設定によってはインラインになるかもしれんしな。
515デフォルトの名無しさん:03/08/19 21:45
ぶっちゃけ最初どういうプログラムかいて勉強すりゃいい?
javaだったらGUI簡単につかえてやる気がでるんだが・・・

どこかほどほどに大きいサンプルプログラムおちてるとこないっすか?
今は大概のアプリケーションがフリーであったりするから
プログラミングのためのモチベーション維持するのが大変だよな。
大きなものはいきなりは作れないだろうし。
>>515
Qtはいいよ!!!!
518デフォルトの名無しさん:03/08/20 02:38
クラスのメンバ変数?で三次元配列使いたいんですけど、初期値を代入する方法としてファイルも使わずスマートに記述する方法ってありますか?
Qtよりgtkmmがいいよ
>>518
もうちょっと、詳細な状況説明をおながいします。
521518:03/08/20 03:37
>>520
理解できない馬鹿は黙ってろよ。


わかってる人、よろしくお願いします。
単次元配列に初期値用意してループ使って初期化。
523518:03/08/20 03:47
>>521
禿道。>>520みたいなやつって邪魔だよね。
粘着Java厨、C#厨警報!
質問者はトリップを忘れずに。
>>521>>523
三次元配列は固定長なのか、初期値は定数なのか、その辺次第だろ?
ジサクジエンカコワルイ
三次元配列を使いたいといっている時点でスマートじゃない罠。
528 :03/08/20 13:04
C++ でメソッドの定義を記述するとき、
あいまいさがない限りは this-> を省略できますよね。
これの this-> を強制するようにはできますか?
それってコンパイラごとのオプションで #pragma で指定するようなものなんでしょうか。

ローカル変数で同じ名前の変数を使ってしまって、
それがバグの原因になるということが頻繁にあるので、
明示的に this-> を使うように強制したい、と思うんです。

使用しているのは gcc 2.95.2 です。

コーディング規約
530 :03/08/20 13:08
>>529
みんなが規約をきっちりと守ってくれたらいいんですが…
>>528
コンパイラでは規制はできない。
そんな腐ったルールを強制するよりは
名前ルールのほうで回避するのが普通
(ローカル変数は小文字だけ、とかメンバ変数はm_つけるとかそういう類。
コーディング規約スレ参照)
532 :03/08/20 13:14
>>531
やっぱりそうですか…
現状、ローカル変数は aaa_bbb_ccc 系の命名方法、
クラスの変数は aBbbCcc 系の命名方法にしているんですが
(Windows 系のプロジェクトとあわせるためもあって)、
守ってくれない人もいるんで強制できたらなぁと思った次第です。

PHP のようにデフォルトで強制される言語もあるんで、
Web がらみの仕事も多いうちではどうせなら C++ でも強制してしまえ、とばかりに。
533_:03/08/20 13:14
>>532
名前ルールで分割しない場合、
人間が見てもthisを付けるべきかの判断がそもそも困難なので
コードレビューをしてもミスを残す危険がある。
(問題をおこす場面というのは同一の名前の場合なわけだからね)

しかし名前ルールで分割する場合、宣言をレビューした時点で
誰もが違反を指摘できる。
535 :03/08/20 13:27
>>534
宣言を見た時点で、その名前の付け方は違反だと指摘できる、ということですね。

問題は無意識にメンバ変数と同じ名前のローカル変数を使ってしまっても、
コンパイラにはそれを検出するすべがないということだと思うんです。
まぁコンパイラによっては警告を出してくれるものはあるみたいですけど。

ん?もしかしたら -Wall で g++ は警告出してくれるんじゃないか?
んなことないか。
>>535
組織でやってるのなら確実にレビューをすればそういうチェックと共に
多くの問題を発見できるんだが脳。

ちなみに名前を隠蔽する場面ってのは、メンバ変数以外にも
引数やらローカル変数同士ですらあるし、 namespace + usingも罠だな。
537 :03/08/20 14:01
>>536
ですね、特にヘッダファイルの中に using かかれた日にゃぁ。
それが与えられたライブラリのヘッダファイルだったりすると…最悪。
538デフォルトの名無しさん:03/08/20 14:23
ちょっとくだらない質問なのですが、お願いします。
shared_ptrが使える場合は、徹底的に使った方が良いでしょうか?

使わない方が良いっていう場面が、あったら教えてください。
値でいい場合
もう少しこう……いえ、いいです
541デフォルトの名無しさん:03/08/20 16:22
>>538
間違いなくatd::auto_ptrより速度が遅いと思うので、コンテナに入れる時
以外は使わなくていいんじゃなくて?
542デフォルトの名無しさん:03/08/20 16:22
std::auto_ptrのTYPOですたスマソ
shared_ptrを一回参照はがししてしまった上でもう一回別のshared_ptrに入れたときには
カウンタが分裂してしまうこともあったりするかもね。

そういう使い方をしなきゃならんときはオブジェクト自身にカウンタを持たせて
intrusive_ptrのほうがいいかも、とか。
(メモリ効率もいいし)
544デフォルトの名無しさん:03/08/20 16:33
//hoge.hh
#if __cplusplus
extern "C++"{
#endif //__cplusplus
class Hoge{
Hoge();
~Hoge();
printHoge();
};
#if __cplusplus
}
#endif //__cplusplus

というようなclassを作った時に、
Hoge(), ~Hoge, printHoge
をC言語から呼び出して使う方法はあります?
muri
>>538
new は代表的な重い処理のひとつで、shared_ptr は参照カウンタの為に余分に
new が行われるから shared_ptr を多用し過ぎするとそこそこパフォーマンス影響がでるハズ。
だから、沢山作られるオブジェクトなら shared_ptr を使わずにその本体のオブジェクトに
参照カウントを内臓するような設計にしたほうがいい。
とは言っても例によって最近のマシンはパワフルだからフツーは shared_ptr を
使いまくっても問題ナッシングだとは思う。
>>544
そもそも C では class が作れんし。

まぁ、無理やりそれっぽいことをすることはできる。
IDirectDrawSurface とかの COM のヘッダファイルが
ある程度参考になるのではないかと。
>>541-543
あれから自分でソース読んでたのですがさっぱりで…助かりました。

速度はやはり落ちるのですね。ちょっと特殊な用途なので
参照はがしもありそうで…intrusive_ptrは初耳、勉強しておきます。
やっぱり訊いて良かった…。

ひとまずコンテナのみに使用しておきます。レスありがとうございました。
>>546
書いているうちにすいません。なるほど、生成にかなりコストが…。
ちょっと貧弱なマシンも考えなければなので、これは根本から見直さないと…。

いやはや本当に助かります。レスサンクスです。
550 :03/08/20 17:13
C は sizeof を使わないとビット幅が確定しないのがなぁ。
あと、符号{つき|無し}{右|左}ローテートとかもあったら便利なのになぁ。
ビット演算やりたければアセンブラつかっていう話もあるけど、
そういう低レベルのところを言語仕様に入れてくれてもいいのになぁ。

歴史的には高級言語としてそういうのを隠蔽しようとしてきたんだろうけど、
いまの C の価値はむしろそういうレベルのコード生成の透明性にあるからなぁ。
ビットフィールド
つまり、shared_ptr だの、smart_ptr だのをあまり利用せず、
IUnknown 継承して、CComPtr つかえってことですね。
>>550
ローテイトもってる CPU じゃないと
実装が面倒になるというのもあったのではなかろうか。多分。
554 :03/08/20 17:28
>>553
ははぁ、そうなのかもね。でもなぁ 8bit の時代からあったからなぁ。
ところで、皆さん整数の桁あふれとかはちゃんと対処しています?

加算命令で int の幅を超えちゃっても、
C の言語仕様上は検出するすべがありませんよね。
多くのプロセッサは桁あふれを検出することができると思うんですが、
C からも使えたら便利だとは思いませんか?
ローテイトを何に使いたいんだ?
それが気になる
C言語の生い立ちから考えるとやっぱりその辺は
「アセンブラを使用汁」ってことに尽きるんでしょうなぁ。
557 :03/08/20 17:37
>>555
要素が0と1だけからなり、加算がXORで表現される、
激しく巨大な行列の演算。

グラフ理論なんかでよく出てくる。
>>加算命令で int の幅を超えちゃっても、C の言語仕様上は検出するすべがありませんよね

計算量増えるけど先に確かめておけばいい
C++なら検出つきの整数クラスでも作ればいいだろう
それならすぐ元に置き換えられるし
>>557
やはりローテイトの出番がよく分からんなあ
C# だとオーバーフローを検出できるんだっけ?
Effective STLに書いてあった等価と同値の違いがいまいち分かりません。
詳しく説明して欲しいな。
>>561
んー、あれが一番詳しい(というかわかりやすい)説明だと思うが・・・。
563デフォルトの名無しさん:03/08/20 20:21
C++でXMLやるのに良いサイトありますか?
そもそもXMLは仕様が固まったのでしょうか?
>>560
できるよ。
コンパイラオプションに -checked つけるか、
checked(式) ってやると例外が発生するようになる。
566デフォルトの名無しさん:03/08/20 23:16
XMLは仕様が固まったのでしょうか、っていつの時代の人なんだ。
567デフォルトの名無しさん:03/08/21 00:30
c++で端末を直接制御するためのライブラリって
ncursesであってます?
568 :03/08/21 07:07
>>567
まぁそれが一般的だろうね。
g++ 3.2で
namespace ByteOrder
{
 enum ByteOrder
 {
  LITTLE_ENDIAN,
  BIG_ENDIAN,
  BI_ENDIAN,
 };
}
#if 0
class ByteOrder
{
};
#endif
int main()
{
 int ByteOrder::LITTLE_ENDIAN;
 
 return 0;
}
がコンパイル通ってしまったんですが、
int ByteOrder::LITTLE_ENDIAN;
はどういう風に解釈されたのでしょうか?
570デフォルトの名無しさん:03/08/22 00:08
>>569
アセンブリ吐かせてみたところ、
int型のmain内ローカル変数LITTLE_ENDIANが定義されたようです。
>>569
なんで通るんだろう。絶対変。

解釈的には
int ByteOrder::LITTLE_ENDIAN;
  ↑名前空間  ↑enum ByteOrder の中身。

↓こういうソースもコンパイル通った。
namespace ByteOrder
{
 enum A { a };
 int b;
}
int main()
{
 int ByteOrder::a;
 int ByteOrder::b;
 return 0;
}
572569:03/08/22 00:18
その手があったかと汗吐かせてみたんですが、よく考えたらアセンブラ読めませんでした(asse)

 .file "tst.cpp"
 .def ___main; .scl 2; .type 32; .endef
 .text
 .align 2
.globl _main
 .def _main; .scl 2; .type 32; .endef
_main:
LFB1:
 pushl %ebp
LCFI0:
 movl %esp, %ebp
LCFI1:
 subl $8, %esp
LCFI2:
 andl $-16, %esp
 movl $0, %eax
 movl %eax, -8(%ebp)
 movl -8(%ebp), %eax
 call __alloca
 call ___main
 movl $0, %eax
 leave
 ret
LFE1:

どうなってるのでしょうか?
>>572
あのさ、それ最適かかかって return 0; しか残ってないんだけど。

namespace A{ int a;}
int main
{
 int A::a; // この行をコメントアウトしたのとしてないので出力比較してみて。
 a = 5;
 cout << a;
 return 0;
}
574569:03/08/22 00:30
#include <iostream>
namespace A{ int a;}
int main()
{
int A::a; // この行をコメントアウトしたのとしてないので出力比較してみて。
a = 5;
std::cout << a;
return 0;
}
コメントアウトしたらコンパイル通りません(aが未定義)
汗ソースはcoutへの出力があるから長大でここには書けないです。
ああ、ごめん、
a = 5;

A::a = 5;
に変えて。
でも、コメントアウトしてないのが通ったってことは、
int A::a;
で、
「名前空間 A の中で宣言された a を main 内で使います」
って言う意味かな。
以後、main 内では単に a と書くだけで A::a が参照される。

gcc 独自拡張っぽい?
余計な真似しやがって。
577570:03/08/22 00:34
> 以後、main 内では単に a と書くだけで A::a が参照される。
あれ?そうだった。
漏れんとこではただのローカル変数ができたようなコードが出てたんだけど。
>>576
ごめん、推測。
コード見てなかったりする。

gcc のバグかな?
579569:03/08/22 00:41
#include <iostream>
namespace A{ int a;}
int main()
{
int A::a; // この行をコメントアウトしたのとしてないので出力比較してみて。
A::a = 5;
std::cout << A::a; // コメントアウトしても通る
//std::cout << a; // コメントアウトするとこっちは通らない
return 0;
}
で、全部は無理なので diff だけ
1c1
< .file "coted.cpp"
---
> .file "nrmal.cpp"
24,25c24,25
< movl %eax, -4(%ebp)
< movl -4(%ebp), %eax
---
> movl %eax, -8(%ebp)
> movl -8(%ebp), %eax
質問しといてなんですが、明日も仕事なので今日はこれで寝ます。スミマセン。
580デフォルトの名無しさん:03/08/23 00:27
p = new CA[]でインスタンスの配列を作る場合、コンストラクタに(複数の)引数を渡すにはどうすればいいのでしょうか
ローカル変数のインスタンス配列に引数を渡す方法はわかるのですが
581デフォルトの名無しさん:03/08/23 00:32
>>580
できません。諦めましょう。
582580:03/08/23 00:42
>>581
まじすか!
諦めるというかちょっと気になったもので
ありがとうございました
583 :03/08/23 05:35
>>581
new 演算子をオーバーロードすると出来ると思う。
584580:03/08/23 05:39
>>583
まじすか!
その方法を教えて!
素直にvectorでも使えばいいんじゃないんだろうか。
boost::tupleにしておけ
この板みてるとboost使えってよくでてくるけど、流行ってるのか?
うちの会社(中小だが)では俺しか使ってない。
c++自体はみんなつかってんだが・・・。
>>587
単純に便利なものから若干用途限られるけど便利なものまで多数あって有用
物によってだけど覚えること少ないし
splitとかは除外だが。
ttp://www.kmonos.net/alang/boost/
ttp://www.boost.org/
ttp://boost.cppll.jp/
ttp://www.tietew.jp/cppll/archive/5777

http://pc2.2ch.net/test/read.cgi/tech/1033830935/l50
589デフォルトの名無しさん:03/08/23 11:03
ビットフィールド使ってビット幅指定するのって
配列には使えないんでしょうか?

あと、そうやってクラスのサイズを小さくすると
なんかいいことあるんでしょうか?(アホ
>>584
new演算子をオーバーロードする時にも規則があって、コンストラクタ
への引数はsize_tしか持てないよ。他の引数を持たせようとすると
コンパイルが通らない。
591デフォルトの名無しさん:03/08/23 12:05
>>590
> コンストラクタへの引数はsize_tしか持てないよ。
コンストラクタではなく operator new への引数、の書き間違い?

それだと placement new とかあるから、size_t だけに制限される
ハズないと思うが。
>>592
悪い。そうそう、void* operator new[](size_t); の事です。
ちなみに配置構文のnew[]もクラスや変数へのポインタを第二引数に
取るしかできないね。
>>584
つーことで、一回しか実行できない初期化用のメンバ関数を
public属性で持たせて、new[]した後に実行して下さい。
ああそうか、new[]そのものが何回も呼び出される可能性があるか・・・・
自分で気を付けるしかないね。うっかり呼び出さないように。
>>581
そーゆーことがしたけりゃ、
malloc × 配置構文 new(要素の数だけ) × 明示デストラクタコール(要素の数だけ) × free
で実現しる。
ま、フツーはこんなことするよりは設計を見直すが。
>>590
>>593
newには普通に任意のパラメタ渡せるのだが。

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

struct Hoge
{
static void* operator new[]( size_t siz, int param1 )
{
cout << param1 << endl;
return malloc(siz);
}
};


int main()
{
 Hoge* p = new(15) Hoge[100];
}

いや、だからと言って583の言うようにこれで配列要素の非デフォルト
コンストラクタを呼び出せるかと言ったら、そりゃあ無理だけど。
>>597
これってただのplacement newじゃないの?15番地から強制的に使っている
だけで。
>>598
#include <deque>
#include <iostream>
struct unko{int i;};
std::ostream &operator<<(std::ostream &ost, const unko &unk)
{
    ost << "ヽ( ・∀・)ノ ウンコー " << unk.i;
    return ost;
}
void *operator new(std::size_t size, const std::deque<unko> &u)
{
    std::cout << size << "\n" << u.front() << std::endl;
    return 0;
}
int main()
{
    unko one = {1};
    unko two = {2};
    std::deque<unko> u;
    u.push_back(one);
    u.push_back(two);
    int *p = new(u) int[10];
    std::cout << "p=" << p << "\n";
}
結果:
40
ヽ( ・∀・)ノ ウンコー 1
p=00000000
>>599
わかってもらえなかったかなー。それはmalloc()の戻り値を返している
からでしょう。実際には15番地から少し壊れていると思うよ。
あ、今度は0を返しているのか。じゃあ0番地からぶちこわしているわけだ。
おまけにgcc3.3.1(MinGW)でコンパイルするとコンパイルエラーが4つも出るし。
C:/MinGW/Learn/boost/operater_new4.cpp: In function `void* operator
new(unsigned int, const std::deque<unko, std::allocator<unko> >&)':
C:/MinGW/Learn/boost/operater_new4.cpp:12: warning: `operator new' must not
return NULL unless it is declared `throw()' (or -fcheck-new is in effect)

C:/MinGW/Learn/boost/operater_new4.cpp: In function `int main()':
C:/MinGW/Learn/boost/operater_new4.cpp:21: error: no matching function for call
to `operator new [](unsigned int, std::deque<unko, std::allocator<unko> >&)'
C:/mingw/include/c++/3.3.1/new:83: error: candidates are: void* operator new
[](unsigned int)
C:/mingw/include/c++/3.3.1/new:87: error: void* operator new
[](unsigned int, const std::nothrow_t&)
C:/mingw/include/c++/3.3.1/new:93: error: void* operator new
[](unsigned int, void*)

Execution terminated
newの「返り血」を壊していると主張するのか
「引数」を壊していると主張するのか
>>602
operator newはoperator new[]の間違いでした。
何でコンパイル通るんだよ…
>>604
確かにそうすればコンパイルは通りました。しかし0を返していては
new[]した領域には永遠にアクセスできないでしょう。
>>605
placement newだと主張する人に対してconst std::deque<unko>&
を渡せることを示そうとしただけであるよ。
>>606
ああこれか。C++第3版P660
void* operator new[](size_t, const nothrow_t&);
でもどちらにしろクラスオブジェクトしか渡せないじゃん。
初期化値とは全然関係ない。
>>607

>>597以降を読む限り、
デタラメ言うなと>>593 >>598 >>600に対して言ってるだけで、
既に誰も初期値の話なんぞしてないぞ。日本語大丈夫か?
>>607
5.3.4[expr.new]/12
>>608
そしたら、次の例はC++第3版のnew(P660)のどれに
該当するんですか?

static void* operator new[]( size_t siz, int param1 )
{
cout << param1 << endl;
return malloc(siz);
}
>>609
ふーん、そうなんだ。配列のnewは配置構文にならずに任意の
パラメタを渡せる仕様なんだね。初めて知った。
612608:03/08/23 19:10
>>610
今手元にないから知らん。
つーかなんで、C++の作者が書いたと言うだけの、規格書でもなんでもない
一介の書籍に言語の全てが載っていると期待しているのだキミは?
>>611
> ふーん、そうなんだ。配列のnewは配置構文にならずに任意の
配列だとかそうでないとかは関係ないぞい。まとめたからまあ嫁。
-----

・ new演算子に(size_t以外の)追加のパラメタを指定する形式のことを、
  「new-placement syntax (newの配置構文)」 という。 [5.3.4/11]
 # 既存のアドレスを渡してその位置にオブジェクトを構築…とかいう狭い意味ではない。

・ その追加パラメタリストは他の普通の関数に使えるものと
 比べて何の制限もない。何ならtemplateにもできる。 [3.7.3.1/1] [5.3.4/1]

・ C++の実装側は、new演算子のデフォルトとして最低6つを提供する。
  void* operator new(std::size_t size) throw(bad_alloc);
  void* operator new[](std::size_t size) throw(bad_alloc);
  void* operator new(std::size_t size, const std::nothrow_t&) throw();
  void* operator new[](std::size_t size, const std::nothrow_t&) throw();
  void* operator new(std::size_t size, void* ptr) throw();
  void* operator new[](std::size_t size, void* ptr) throw();
 上の二つは、どっかからメモリを確保してきて返すと期待される関数。
 中の二つは、どっかからメモリを確保してきて返すんだけど、確保不可能だと0を返す関数。
 下の二つは、何もメモリ確保処理はせずそのままptrを返す関数。[18.4.1.1-3]

----
それ以上でも以下でもない。
>>612
ありがとうございます。もう一度refman.pdfや
http://www.kuzbass.ru/docs/isocpp/
を何度も読んでみます。やっぱり難しいなーC++は。
size_t引数がテンプレート引数だったらいいのにな。
>>614
なんかいいことあんの?
>>614
自分で多重定義すれば良いだけでは? 何に使うのか知らんが。
>>614
 void* operator new(size_t N) { ... }
の代わりに
 template<size_t N> void* operator new() { ... }
ってこと?それいいかも。operator new[] には使えなさそうだけど。
サイズが違うたびに別関数?
reinterpret_cast って、口に出して言うとき、何と言えばいいですか?
リインタプリットキャストで通じますかね?
それとも、レインタープレットキャスト?
620デフォルトの名無しさん:03/08/24 18:55
誰に向かって言うのだ?
佐藤課長とか松井とか渡部とか、かな
リインタプリト・キャスト
俺はリインタプリットって読んでる。
interpreter でインタプリタだから
りーんたーrぷりっきぇぁすっ
riintэ':(r)prэt kae'st
>>619
つーか、どっちかで言わないと虫するようなガキんちょの
あやし係はなるべく担当したくない

レポート
リポート
627デフォルトの名無しさん:03/08/25 03:50
>>619
辞書で発音記号調べれば解決。
628デフォルトの名無しさん:03/08/25 05:08
(゚∀゚)ATLってなに?
>>628
Active Template Library
>>628
Antano Tameno Library
631デフォルトの名無しさん:03/08/25 10:10
CとC++ってまったく違うものなんでしょうか?
文法が違うだけ? それとも、考え方そのものが別物・・・?
>>627
ガキんちょですか?
>>631
C++はCの文法を引き継ぎ、それに色々な概念を導入したものです。
#突込みどころ1
ですので、Cの概念だけで使っても構いませんが、
#突込みどころ2
どうせならC++らしい考え方も習得してみましょう。
#突込みどころ3
あなたがプログラミングになれているなら、
#突込みどころ4
難しくはありません。
#突込みどころ5
C++独自の機能の内、関数のオーバーロードだけ使っています。。。
参照くらい使ってやれ。
>>634
(゚Д゚)クラスも使ってないのか?(゚Д゚)!!
ローカル変数を好きな所で定義できる機能だけだな…
C++を業務で使い始めて3ヶ月、やっと自分でテンプレートを使う(設計する)ようになったが
未だにMFCの部品以外のクラスの継承は書いていない。
関数のオーバーロードや引き数の省略、参照は最早ないと不便に思うようになった。

>>637
//コメントは使わない?
#いやまぁ、Cでもあるところにはあるから含めなかったのかもしれんが。
大抵の機能は使うよ。
>>638
俺の場合、テンプレートより継承の方が多用するけどな。
valarrayは使ったことがない
>>641
valarrayは糞。Blitz++
http://www.oonumerics.org/blitz/
が次期標準に取り入れられる噂がある。
>>642
三角行列はないのー?
>>643
そんなのArrayの初期化の時に設定すればいいじゃん。
それよりC++標準になるとSTN(Standard Template for Numeric)
とか呼ばれるようになるのかな。FORTRANを駆逐できるかも。
>>644
三角行列用の対角化とかしたいんだけどな。
自分で LAPACK と繋げて使ってるけど、
標準であったら激しく便利。
Blitz++はArrayのiteratorを持っているから、対角化は簡単にできる。
LAPACK++もあるけど、こちらは効率の面から見ると問題があるので
標準化の予定はない。あくまでも効率の面でFORTRANに劣らない
速度を実現しようとしている、それがBlitz++なのだ。
>>646
できるんか。
標準化が結構楽しみになってきた。
ただBlitz++はあまりアルゴリズムに関しては多く持ってないので、
三重対角化のルーチンを手前で組んで持っておく必要があるだろう。
しかしBlitz++で書けば簡単に書ける。

あくまでvalarrayの後継ぎを意識している。現在の標準C++のvalarray
は未完成のまま発表されたと言われている。中心人物が途中で抜けて
しまったため、後に残された人はやる気をなくしたのだ。
人の書いたプログラムを読んで勉強したいのですが、
勉強をはじめたばかりで、良いソースと悪いソースの区別がつきません。
何かお勧めのものはありませんか。
>>649
C なら
http://www.pro.or.jp/~fuji/mybooks/cdiag/
があるんだけど。
extern "C"ってエクスタシーでいいのか
>>651
まったく問題ありません
Blitz++の標準化っていつ頃の話になるの?
>>653
つーか次の標準化が5〜6年先と言われているからなあ。
Blitz++もまだβ版だし。気長に待つべし。
それまではBoostと同じくインストールしてBlitz++を使っていよう。
腐ったValarrayは絶対に使わないようにしよう。
Blitz++はStencilがもちっとカコ(・∀・)イイ!!くなるといいんだが・・・
657デフォルトの名無しさん:03/08/25 23:21
初歩的な質問で申し訳ありません。

#include <string.h>
struct TestClass{
  char str[256];
};

int main(){
  char str[] = "Test";
  TestClass myTestClass;

  // Okay!
  for (int i = 0; i < 5; i++){
    myTestClass.str[i] = str[i];
  }

  // Okay!
  strcpy(myTestClass.str, str);

  // NG!
  // myTestClass.str = str[];   // ←ココ
  // myTestClass.str = "Test"; // ←ココ
}

どうしてstructやclassのpublicなchar配列に
代入演算子で文字列定数を代入できないのでしょう?
また、代入演算子で無理やり代入できるようにするにはどんな風にしたらよいでしょうか。
演算子のオーバーロードがあるじゃないか。
>>651
語尾はちゃんと発音されない傾向があるから
英語が母国語の人が喋ってるのを日本人が聞いたら
ちょうどそんな感じに聞こえるんじゃない?
配列に代入演算子を使うことはできません。
仕様です。
Java厨か?

>>657
C++でなくCのスレで質問した方が良い。
Java風の知識だけで押し通したいなら char str[256]; ではなくて
std::string str; にしとけ。#include <string> を忘れるなYO!

そもそも、myTestClass.str = str[]; と、意味不明の[]を付けている
時点でC言語すらわかってないのが自明。がんがれ。
>>657
まず、
#include <string.h>
なんて書いてある参考書を捨てるところから始めろ。
663657:03/08/26 01:00
回答ありがとうございます。

>>658
operator + とかいうやつですか?
オーバーロードはまだ勉強してないので・・・。
覚えておきます。

>>660
仕様ですか・・・。CStringみたいに簡単にはいかないんですね。

>>661
Java厨ではないですが・・・単純な文法エラーでした。(〃▽〃)
ところで、僕の使っている本には<string>という標準ライブラリに関する
説明はないんですよね・・・。<string.h>ならあるんですが・・・。

>>662
1994年の本なんですけど、古いですか?
にいやのおさがりなのです。(・ε・)
>>663
絶望的に古い本です。今すぐ捨てた方がいいよ。
iostream.h
stdio.h
stdlib.h
string.h
どれもすでに存在しません。
iostrem
cstdio
cstdlib
cstring
が現存のファイル。
stringはこれらとは別の、標準の文字列クラス。
>>663
C++は1998年のISO標準化前後で言語仕様からライブラリまで大幅に変わったので、
それ以前に書かれた本は概ねゴミといっても過言ではない。
>>664
誤植があった。
s/iostrem/iostream/

>>663
CStringを知っているなら、#include <string> で使えるstd::stringは、
よりマトモな文字列クラスだよ。char文字列なんて使ってられません。
667657:03/08/26 01:17
>>664
>絶望的に古い本です。

>>665
>概ねゴミ

・・・。(´・ω・`)
あした本屋行ってきます・・・。

>>666
CStringはBASICみたいに利用できるから楽なんですけど、
なるべくMFCを使わないで作るっていうのが、今の勉強の指針なもので。
MFC使うとブラックボックスな部分が多すぎて
プログラムの中の人がどんな風に働いているのか分からないんですよね。
>>667
そういうことならVC7.1使おうね。VC6なんてのはゴミよ。
http://boost.sourceforge.net/regression-logs/
マカーなんですけど今度C++を勉強しようと思ってるんですよ・・・使うソフトはCodeWarrior for Mac OSになりそうなんですけど・・・普通にWINDOWSユーザー向けのテキスト使って勉強しても大丈夫でしょうか?
>>669
環境に依存しない(非GUI)であれば大丈夫と思われ。
>>670
ありがとうございます。今度はもっと専門的な事でお邪魔したいですね。すいませんでした。
>>669
Mac は特殊な環境だから GUI に関係せずともちゃんと Mac 用の
テキスト探して勉強したほうが多分いいよ。
>>672
特殊って標準入出力が無いとか、リソースフォークの扱いとか?
確かに C++ の勉強をするのに MacOS(Classic) は厳しいかも。
Mac OS X ならかなりまともな環境だと思うけどね。
675デフォルトの名無しさん:03/08/26 08:31
struct A { int a : 1; };
struct B : A { int b : 1; };

↑このとき、sizeof B == sizeof A となるような最適化
(継承先で定義されたメンバを継承元のパディングに納める)
は、いつの日か期待できますか?
>>675
そういうことをしてくれる特定の処理系が現れることはあっても
それが標準になることはないだろ。 inline だってコンパイラに対する
お願いでしかないし。
>>667
> MFC使うとブラックボックスな部分が多すぎて
ソースコードあるでしょ?
myTestClass.str を = の左辺値にすると、コンパイルできません。

#include <cstring>
#include <iostream>

struct TestClass{
char str[256];
TestClass *operator=(const char *s) {
std::strcpy(this->str, s);
return this;
}
};

int main(){
char str[] = "Test";
TestClass myTestClass;

// Okay!
for (int i = 0; i < 5; i++){
myTestClass.str[i] = str[i];
}
// Okay!
std::strcpy(myTestClass.str, str);
std::cout << myTestClass.str << std::endl;
// OK!
myTestClass = str; // ←ココ
std::cout << myTestClass.str << std::endl;
myTestClass = "Test"; // ←ココ
std::cout << myTestClass.str << std::endl;
}
>>658>>657に対する返答です。
違ったスマソ。>>678>>659に対する返答です。この制限はC++が
C言語の代入演算子の性質を踏襲している所から来ています。
まだ違う。>>678>>657に対する返答です。風邪引いて熱があるからかな・・・・
会社早退しようかな。
>>678
TestClass *operator=(const char *s)
↑これじゃない?

TestClass& operator = (const char* s)
>>682
じゃあこうしとくか。
アカン、風邪薬飲んだらすごく眠くなってきた・・・・・・

struct TestClass{
char str[256];
TestClass& operator=(const char *s) {
std::strcpy(this->str, s);
return *this;
}
};
>>678
operatorは”そのクラスに対する演算子の定義”なので、その仕様で正しい。
もしmyTestClass.str = "Test"とやりたいのだったら
・TestClass::strを自作のoperator=が定義されたクラスにする
・TestClass::strを素直にstd::stringなどあらかじめ用意されてる文字列クラスを使う
のいずれかにするべき。
>>684
じゃあ簡単にstd::stringでも使いましょうかね。

#include <string>
#include <iostream>

struct TestClass{
std::string str;
std::string& operator=(const char *s) {
this->str = s;
return this->str;
}
};

int main(){
char str[] = "Test";
TestClass myTestClass;

// Okay!
myTestClass.str.resize(5);
for (int i = 0; i < 5; i++){
myTestClass.str[i] = str[i];
}
std::cout << myTestClass.str << std::endl;
// OK!
myTestClass.str = str; // ←ココ
std::cout << myTestClass.str << std::endl;
myTestClass.str = "Test"; // ←ココ
std::cout << myTestClass.str << std::endl;
}
basePtr = new derivedClass
派生クラスオブジェクトへのポインタを基本クラス型のポインタ変数に
アップキャストした場合で
delete basePtr としたら、生成されたオブジェクトが完全に開放されずに
ポインタが指している部分(継承した部分)しか開放されないと思うんですが何か?
virtual ~baka
>>686
仮想デストラクタ知らんの?
>>687
オーバーライドした派生クラスのデストラクタがコールされると
アップキャストされたポインタが示す領域だけじゃなく
その派生クラスのオブジェクトが完全に開放されるということですか?
>>689
そう。多態を実現するには必須なので
これを知らないのはまずい
自分で言ってて訳和姦ねー・・・
もう少し勉強して来ます
と思ってたら・・・
>>690
ありがとうございました
コンストラクタはどうやってオーバーライドするの?
コンストラクタにvirtual付けたら怒られた
694693:03/08/26 19:30
superも無いみたいだし
>>693
どういう風に「コンストラクト」したいの?
答えはそれによる
>>693
コンストラクタを virtual にして
どうしようというのか小一時間(ry
>>693
コンストラクタの中で基底クラスのコンストラクタを呼び出す。
要するに基本を知らなかった故の質問だろ?
しかし、仮想コンストラクタ(クラスファクトリ)という言葉はあるワナ。
>>698
そういう言葉だけ書いて後放置して、初心者が
コンストラクタにも virtual 付けれるんだと勘違いしたらどうする。
よく分からんが、↓みたいなことがしたいんじゃないの?
class CHage : public CHoge
{
CHage(int boo, int foo, int woo)
: CHoge(boo, foo, woo)
{
}
};
701698:03/08/27 09:51
多態性を用いたプログラムでは”パラメータによって違うクラスを生成したい”
という欲求が生じがちです。
これをスマートに実装するために作る専門の関数(クラス)をクラスファクトリといいます。
仮想コンストラクタという言い方もしますが、どちらかというとマイナーです。

クラスファクトリの例としてはWindowsのCOMのIClassFactory(を実装するクラス)などがあります。
702デフォルトの名無しさん:03/08/27 12:12
[io]fstreamを使用してファイルの読み書きを行った場合、
明示的にclose()を書いたほうがよいですか、それともデストラクタにお任せでよいですか?
猛勉強中の初心者ですが教えてください。

仮想関数を持つクラスは特別にポリモフィズムクラスとして区別されるんですか?
そのポリモフィズムクラスオブジェクトを指すポインタだけ基本クラスのポインタ変数にdynamic_castできるんですか?
ポリモーフィズムクラスなんて用語があるのかどうかは知らないけど、
実行時型情報を利用できるのは仮想関数を持つクラスだけ。

基本クラスのポインタへの代入は dynamic_cast でなくても出来る。
逆に派生クラスへのキャストは dynamic_cast が必要。
そぼくなギモン
C++はどのくらいオブジェクト嗜好なんだぁ?
>>702
エラー処理したいならclose()しる。
"A class that declares or inherits a virtual function is called a polymorphic class." (10.3 -1-)
>>705
その答えは以下の質問への答えと同様だろう。

「おろしニンニクがテーブルに置いてあるラーメン屋のラーメンはどのくらいニンニク風味なんだぁ?」
テーブルのおろしニンニク全部かけてもまだ物足りない罠。
>>708
じゃJAVAはおろしにんにくかぁ?
生ニンニクとおろし金をテーブルに置かれた気分。
C++で田体制書くときこんなんでええの?
 method(int d);
method(double d);

これで田体制の実装完了?
>>704
( ☆ Д ☆ )さんきゅぽ〜ん
>>710
否。
この場合、JAVAはニンニクラーメンに相当する。
すなわち注文した時点ですでに強烈なニンニク風味は確定しているのである。
>>712
それは関数のオーバーロード
>>715
じゃこうか?
virtural void method(void);
実装したら多々異性完了?
>>714
オブジェクト嗜好=にんにく
じゃヴぁ=にんにくラーメン
C++=テーブルのうえにあるにんにくかけても足りないラーメンと
いうことでいいでつか?
>>716
祖鵜打寝。
>>718
馬路で
720デフォルトの名無しさん:03/08/27 13:26
>>716
鵜祖打寝。
オーバーロードもポリモの一種かと思っていたのにぃ
そのうち、
「ポリモルフィズムをポリモと呼ぶスレ」がたったり、
山崎が「ポリモ」とか言い出したりしそうだ。
>>721
いや、そうだよ。
オーバーロードもポリモーフィズムの一種。
コンパイル時に確定するから静的ポリモーフィズムって言われる。
仮想関数なんかは動的ポリモーフィズム。
えっと、多々異性についてレスされてるのは
本気でレスしてますか?
ネタならネタと悪いけど教えてください。混乱してきたんで(;´Д`A ```
725716:03/08/27 14:56

   ∧_∧
  (  ^^ )< ぬるぽ(^^)
ぐぐったらわかるっぽ!

   ∧_∧
  (  ^^ )< ポリモ(^^)


基本クラスのデータメンバはprotected属性にしてた方がいいっすか?
>>727
手を抜きたいなら
>>723
>静的ポリモーフィズムって言われる。
どこで?
>>729はスレッドが荒れることを狙ったネタです。みなさん放置してください。
732デフォルトの名無しさん:03/08/27 19:28
C時代のファイルアクセス(fopenやfread)を[io]fstreamのものに置き換えたら、激重になりました。
そういうものですか?

733デフォルトの名無しさん:03/08/27 19:34
C時代のカキコ(printfやputs)をiostreamに置き換えたら、ファイルサイズが一気に十倍になりました。
そういうものですか?
734デフォルトの名無しさん:03/08/27 19:46
>>732
そういうものです。
736732:03/08/27 19:48
>>734
もう少し建設的な意見を期待していたんですが。。。(笑)
>>736
ちっとは自分で調べろ。
738デフォルトの名無しさん:03/08/27 20:18
>>732
それは君が屁たれだからです。もっと精進しましょう。
740デフォルトの名無しさん:03/08/27 21:05
VC.netでコンパイルしたプログラムを.netフレームワークなしで
動かすにはどうすればいいの?

mscoree.dllがロードできないって言われて終わる。
検索しても.netフレームワークをインストールすれ、っていう
文献は見つかったけど、コンパイルをどう工夫するのか、ってのはない。
なんか簡単なプログラムを書いた友達はデフォルトで動く、
って言ってたけど、なんかオプションとかあるの?
>>740
うるせーはげスレ違いだ
742740:03/08/27 21:10
>>741
スマソ
激しく逝ってくる。
C++はソフトウェア業界からヘタレを追い出して、
プログラマの給料を上げる為に開発された言語。

効率や速度は2の次。
なるほど、ヘタレの言葉には説得力があるな
Bjarne Stroustrupはヘタレか
なんか細かいとこ気にしだすときりが無い気がするんですが
こういう仕様だって妥協したほうが良いんすかね>C++の文法
え、あのゲーハーそんなこと言ってたか?
>>746
いちおう、理由があってそうなってるものが殆どだからね。
その理由が全然有り難くない(自分と関係ない領分のフォローとか)ことはあるけど。
749デフォルトの名無しさん:03/08/28 02:10
えーっと、std::runtime_errorの派生クラスAをこしらえていて、
A::A(int x, int y); のx,yを適当に整形(文字列化)してから
runtime_errorのコンストラクタに渡したいんですが、どのように
したらできますか...
>>749
struct A : std::rutime_error {
 A(int x, int y) : std::runtime_error( tekito_ni_seikei(x,y) ) {}
 static string tekito_ni_seikei(int x, int y) { ... }
};

簡単な処理なら関数を作らなくても
 : std::runtime_error( (boost::format( "(%d, %d)") % x % y).str() )
とか1行で書いてしまえるが。
751デフォルトの名無しさん:03/08/28 12:32
最適化ってどうやってやるの?Borland C++ Compiler5.5とBCC Developerでも
できるの?
できるなら教えて
>>751
マルチ 回答しないように。
http://pc2.2ch.net/test/read.cgi/tech/1060706382/340
マルチでなくても回答したくないなw

>>750
ヌヒよ、STLport の runtime_error は、感心なことに char の静的配列で
メッセージを保持しているので、単純に std::string を渡せないよ
755デフォルトの名無しさん:03/08/28 20:16
C++を使いたいんだけれど、Cのコンパイラしか用意されていない環境を渡されました。
C++のコードをCに変換するツールで、どんなのが有名ですか?
どなたかよろしくお願いします。
756デフォルトの名無しさん:03/08/28 20:21
>>755
現代的なものは存在しません

757デフォルトの名無しさん:03/08/28 20:23
堤さやかちゃんの引退記念作です。
可愛らしい顔に大きなオッパイ少女っぽいパンティーがそそります。
絡み自体はいたってノーマルですがこの子がやっているだけで下半身に血が集まります。
本気で感じている姿はやっぱいいですね。
モロ見え動画を無料でゲッツ!!
http://www.pinktrip.com/
>>756
そうなんですか?
確かに昔のC++であれば、コンパイラがCのソースコードを
出力してくれるオプションがあったのですが、
出来ればtemplateなども使いたいので別のを探していました。
困ったな…
gccをコンパイルすればよろし。
>>759
それもありだね。気づかなかった、サンクス。
でもコンパイル通るかな…不安
というより、コードセットが全然違うから手におえないぽ。
組み込み系なので、しかも新しいチップらしくて
その会社が提供してくれる開発キットしかつかえない状況(どこのかばれそう)。

調べてみると、CFront系コンパイラがその機能を持っているけれど、
有料みたいですね。で、米では古いg++で可能というデマが出ているらしい。
MIWA C++
>>762
草の根通信時代のコンパイラですか?現存してなさそうですが
大人しく C を使うのが一番かと。
gccの出力を、アセンブラっぽいCにするという手も、、
#if _DEBUG
#define IF_DEBUG
#else
#define CAT(a,b) a##b
#define IF_DEBUG CAT(/,/)
#endif

main(){
IF_DEBUG int i=0;

}

_DEBUGが定義されていないときはその行がコメントアウトされるマクロ、
こんなん考えたのですが、これはC++として正しいプログラムなのでしょうか?
>>764
かもしれませんね。
フリーのC++ to C translatorが無いとは思いませんでした。
意外と作るのは難しいのかもしれませんね。
>>766
激しく処理系依存な予感
つーか、よくあるイディオム使っとけよ

#if _DEBUG
#define DBG(stmt) stmt
#else
#define DBG(stmt)
#else

main(){
DBG( int i = 0; )
}
>>766
昔はそういうことしてたこともあったけど、
ちゃんとしたプリプロセッサなら
// はトークンじゃないから / と / とは繋げられない
って警告されると思う。
gcc ver 3.2.2 の cpp だと / と / が繋げられずに、
間に空白が入ってしまうようだ。
C++ネタではないと思うのでsageで。
「トリッキーなコード」初代スレに
デバッグコードの話題が挙がっていた。

#ifdef DEBUG
#define debug
#else
#define debug 1? (void*)0:
#endif

これでdebug printf("aaaaa");みたいな書き方が出来る。
debug int i=0;は出来ないけれど、
debug for(;;){...} が出来る、らしい。

個人的には面倒でもわかりやすく#ifdef..#endifを使えばいいと思うけど。
>>770
お前のせいでトリッキースレを読み直してしまったじゃないか!
772デフォルトの名無しさん:03/08/28 22:50
>767
意外と、って......
C++の経験あまりないでしょ。

772は無能
皆さんは、命名規則ってはっきり決めてます?
俺は、かなり優柔不断です。
vector<T> の変数が 語尾にs つけたり、Vectorつけたり
カウント変数も nCount だったり iCount だったり
クラス名は、Cで始まるけど、構造体等は、あやふや
ハンガリアンだけじゃ生きていけない。

会社でも、個人でもいいから命名規則おしえてください。

とりあえず、template
■型
クラス              :
インターフェースクラス :
クラステンプレート    :
構造体             :
1行のマクロ        :
複数行(関数)マクロ  :
関数テンプレート      :
名前空間           :

■変数名
数値(個数)     :
文字列         :
文字列クラス   :
std::vectorの変数名   :
std::listの変数名    :
果物の名前を思いついた順に使う
■型
クラス              :先頭に C (CClass)
インターフェースクラス :先頭に I (IClass)
クラステンプレート    :小文字?
構造体             :先頭にST_ (ST_Struct)
1行のマクロ        :
複数行(関数)マクロ  :
関数テンプレート      :普通に
名前空間           :

■変数名
数値(個数)     :nCount
文字列         :sz
文字列クラス   :sz
std::vectorの変数名   :後ろにs
std::listの変数名    :後ろに_list


書き忘れ、
メソッド名         :最初大文字 obj.GetHandle()
std::list 使った型名 :
std::vector使った型名:

たくさんありすぎる・・・。

かなりギモンヌ。
また命名規約ですか?もうお腹いっぱい。
>>777
おなかいっぱいだけど、
ハッキリした答えが見つからぬ。
ギモンヌ
>>779
素敵。
そっちに逃げます。
ありがとう。
>>775
大昔、まだプログラム(アセンブリ)を覚えたてのころ、
ラベルに何をつけていいのかわからなくって、手当たり次第にそれをやってた。
ラベルには意味のある言葉をつけるって学んだのは就職してから。
782デフォルトの名無しさん:03/08/28 23:16
テンプレートがらみの問題について教えてください.
N 分木 ? (2 分木ではなく 1 対 N な関係の木) を実装しようと思い,
#include <vector>
using namespace std;
template<class T> class Tree {
  T data;
  vector<Tree<T> > next;
 public:
  Tree(void) {}
  ~Tree(void) {}
  void PrintTree(void) {
   vector<Tree<T> >::iterator iter = next.begin();
  }
} ;
というクラスを書いたのですが, g++ 3.3.1 (-ansi -pedantic オプション付き)で
コンパイルしたところ,
> tree.h:17: error: 構文解析エラー before `;' token
という error がでました. 17 行目とは
> vector<Tree<T> >::iterator iter = next.begin();
です.
この場合, どのように書くのが正しいのか教えてもらえないでしょうか.
プログラミング言語 C++ も手元にあるので, どこを読めという
アドバイスでもかまいません. テンプレートの章を読んだのですが,
私には分かりませんでした.
>>782
typename vector<Tree<T> >::iterator iter = next.begin();
class Tree {
 vector<Tree> next;
};
って書き方、出来るの?
class じゃなく
struct で

operator や
メソッド 書いてるのがあったりするんですが、
何か特別な意味があるんですか?
継承もできるっぽいし。
>>783
ありがとうございます.
>>783 の書き方でコンパイルできて, とりあえず動いていることを確認しました.
typename は プログラミング言語 C++ では p.969 にのってました.
後で勉強しておきます.

>>784
class Tree {
Tree next;
} ;
はできないのに, vector<Tree> next ならできるのか ? という話ですか ?
一応 error なくコンパイルは通ってます. よく分かってないのですが,
テンプレートなので ? 大丈夫なのだろうと, 自分を納得させてます.
>>785
structとclassは、デフォルトのスコープが違うだけで他は全く同じに使える。
だから、特別な意味を持たせてるかどうかは、書いた本人に聞くしかないな。
>vector<Tree> next ならできるのか
vectorの実装しだいだと思うが
積極的に不完全な型でもいいとはどこにもないな
>>784,786
vector< Tree<T> > は別に Tree の実体を直接確保するわけじゃないからね。
ポインタを持っておいて、動的確保するのが普通だから。
まぁ、厳密に言えば実装依存なんだろうけど、多分問題になることはないと思う。
790デフォルトの名無しさん:03/08/29 00:07
g++で-ansiってつかえるんだ。
791786:03/08/29 00:15
>>788 >>789
なるほど, 実装依存ですか. すると vector<Tree<T>*> としておいたほうが
安全だという理解で正しいですか. ちょっと書き換えてみようと思います.
確かに配列伸ばしたときのコピーが
vector< Tree<T> > のままだと激重になりそうだな。
>>754
>STLport の runtime_error は、感心なことに char の静的配列で
>メッセージを保持しているので、単純に std::string を渡せないよ
詳細説明熱望
>>754
>メッセージを保持しているので、単純に std::string を渡せないよ
ブブー。
>>755
Comeau C++は現代的だとは思うが。
出力はCだよな。
>>795
ページを見てみたが、translator機能が見当たらなかった。
どちらにしろフリーではないようだね
>796
Comeauが使用しているEDG
http://www.edg.com/cpp.html
が、C++から中間言語
The front end translates source programs into a high-level, tree-structured, in-memory intermediate language.
へのtranslateを行なうってだけで、ComeauがC++ to Cを行なうことは
なかったように思われ。795は情報へのポインタをください。

>>797
ageるなよ
>798
why?
>>799
最近 sage を覚えたのがうれしいんだよ。
そっとしておいてやんな。
>>800
ワラタ
なにかとすぐ「ワラタ」
803800:03/08/29 14:22
>>801
心外です。
>>797
http://www.comeaucomputing.com/faqs/genfaq.html#history
Can you tell me more about C Compiler support?

Comeau C++ 4.3.0 is a full and true compiler that performs full syntax
checking, full semantic checking, full error checking and all other compiler
duties. Input C++ code is translated into internal compiler trees and
symbol tables looking nothing like C++ or C. As well, it generates
an internal proprietary intermediate form. But instead of using
a proprietary back end code generator, Comeau C++ 4.3.0 generates
C code as its output. (略)
>>802
ツマンネ
>>805
別に面白がらせるレスじゃねえだろう。
>>806
ワラタ(プ
>>807
ツマンネ
fflush(>>807);
よそでやれボケども
811デフォルトの名無しさん:03/08/29 19:50
std:string s;
char c[16];

s = "おまんこぺろぺろ";
c = (char *)s;

みたいなことはできませんか?
strcpy(c, s.c_str());
813811:03/08/29 20:00
>>812

で、できますたー! ありがd。
>812
たいがいの文字コードでスタックが壊れるぞ。
815811:03/08/29 20:02
>>814
じゃあ、どうすりゃいいのさ、すんすすん。
>>815
なぜ配列にコピーしたいのか
817811:03/08/29 20:07
>>816
char型でないと引数として受け付けない関数があるからです。
MFCとか。
>>817
ならs.c_str()で直接参照するのが普通だが
char*の内容が変更されないと保証できるなら
const_cast<char*>(s)
でもいいと思うが、これってマズい?>識者
>>819
まあ呼ぶたびにキャストするよりは、
変換インライン関数でも作ったほうが安心ね
inline void hoge( const char * ps )
{
// c_hogeの引数は、指す先を書き換えないことが保証されているのに
// 宣言にconstが付いておらず、それを修正することが許されないってことで
// 仲介する
c_hoge( const_cast<char *>(ps) );
}
>>817
ワラタ
初心者にありがちなパターンだな。
やはり、まず何がしたいかを書くべきだったよな。
>>815
s.copy(c, sizeof(c));
823デフォルトの名無しさん:03/08/29 20:26
いつからconst char*に変換できるようになったんじゃstd::stringは!
javaばっかやっててボケたかな?おれ。
配列の大きさは17にした方が良かったな。
>>823
最初からです
つーか固定長の配列にstrcpyすんなよ
>>826
十分なら別にいいだろ
828811:03/08/29 21:25
ひゃっほう。みなさんありがとうございます。m(__)m
s.c_str()で直接参照ですね。勉強になりました。
>>825
そんなかっこわるい仕様あるか!
つーか、MFC使うんだったらCString使えば?
#とは言え、CObArrayを使われるのは勘弁と思う私は半端者。
>829
811は練炭で(r
832デフォルトの名無しさん:03/08/30 07:09
CPUのパイプラインについての読み物を読んでいて思ったのですが
a = b + c
d = a - e
で、データハザードを起こしてしまうのなら
a = b + c
d = b + c - e
と書いた方が速いのでしょうか?
>>832
mov eax, b; add eax, c; mov a, eax;
sub eax, e; mov d, eax;
この程度の最適化はやってくれそうだけど。
834833:03/08/30 07:49
>>832
gcc -O3 -S で出力してみた。最適化されてる。
(extern int a,b,c,d,e; で宣言。)

movl _e, %ecx
movl _c, %eax
movl _b, %edx
addl %edx, %eax
movl %eax, _a
subl %ecx, %eax
movl %eax, _d
835833:03/08/30 08:04
>>832
a(=b+c)が計算される前にd(=a-e)を求めるときの内部μOPの
ストールのことを言ってるなら、d=b+cを求める最短パスは
a(b+c)がすでに通ってる。メモリに直接アクセスするような
指定がないなら、d=b+cはあまり意味がないと思うな。
aとdの間にストールを和らげる計算を入れるくらいしか漏れには
思いつかない。
>>834
なぜ、そこで外部変数が出てくるんだ?
>>832
仮にそのままマシン語に落ちたとしても、
b + c の出力を forward して a - e の入力に(レジスタを介さず)
直接たたき込むくらいのことは今時のCPUならやってるので、
気にせんでいいと思う。
小手先の最適化は無駄でFA
結局フリーのC++ to C translatorはないということでファイナルアンサーですよね?
>>838
タイトなループ中で参照するデータだと、数行の変更で大きな効果が
得られる場合もある。多次元配列のループ順序を入れ替えるとデータ
キャッシュのヒット率が劇的に向上するとか、テーブルのサイズを
2^n にしておくと検索が速くなったりとか。

数値演算とかやってるのでなければ、あまに気にしなくて良いと思うけど。
841832:03/08/30 13:50
いろいろアドバイスありがd。
自分でも調べてみましたが分岐やループが出てこない限り加算減算程度では気にしなくてよさそうですね。
私なんかよりコンパイラの最適化のほうが遙かに工数少なくて賢いや_| ̄|○

おまけ
ただの加算減算でおもしろいなと思った最適化にMMXの飽和演算(paddsw)があったのでご報告。
条件分岐を1個2個減らせます。
842デフォルトの名無しさん:03/08/30 16:53
WideStudioでC++プログラミングに挑戦したいのですが、
使い勝手はどうですか?
>>842
10分ほど触ってみただけだが、所詮はフリーの玩具にすぎないと思った
つーかスレ違い
Windowsを構成している言語はC++なのでしょうか?
そんなこと知ってどーすんの?
NTは約4メガラインのC++と何かに書いてあった
848デフォルトの名無しさん:03/08/30 20:34
OS作る
effectiveC++の105ページで、result = oneHalf * 2; が問題なしって
書いてあるんですけど、本当にコンパイル通るんですか?
やっとeffectiveC++のダウンロードが終わった。
なんだoperator*の話じゃないか。
メンバで定義できるのは右側に引数が結合する場合だけって事。
APIまでC++にしてしまって悲惨なことになったのはBeOSだっけか
>>851
その話のソースって何?
ダミーのvtableエントリやメンバ変数を持たせて
一応は変更に対応できるようにしていたようだけど、やっぱり破綻したの?
>>850
いやそうじゃなくて、
  result = oneHalf * 2;
が暗黙的に
  Rational temp(2);
  result = oneHalf * temp;
になるって所でつまづいていたのです。

コンパイルが通らなかったのは私のタイプミスで、
  const Rational operator*( const Rational& rhs ) const;
と書くべき所を、
  const Rational operator*( Rational& rhs ) const;
というように、引数の型のところにconstを付けてなかったのが原因でした。

でも、なんでconst無いとダメなのかが判りません。
誰か教えてください。
const関数である事が原因?
>>853
2は直接Rational&には変換できないからまずrvalueのRational(2)に変換され
次にこれはrvalueであるからconst Rational&に参照されなくてはならない

のだと思う。
暗黙の型変換ってやつだな
>>850のダウンロード云々というのは、どういう事なのでしょうか?
最近学術目的で、アメリカでは美術書なんかを無料でウェブ公開
しているそうですが、そんな感じだと嬉しいな…。

ただのCDオンライン販売とかだったら、すいません。

それにしてもPDFで48Pまで読めるんですね。ちと得した気分。
普通に検索するとでてくるな。
EffectiveとMore Effectiveの入った英語CD-ROM版で7.4MBのようだ。
正規の配布でないことは間違いない。

web.njit.edu/~dupre/effectivec++/
www.scorpions.net/~fygrave/misc/effectivecpp.tar.gz
www.dingbing.com/book/new/C_C++/standand_c/cppefmef.rar
jztele.com/~coldice/book/C_C++/cppefmef.rar
>>858
レスありがとうございます。

にしても、なんとコメントしていいやら。
あいやーeduドメインまで…。
とりあえず謎は解けました。感謝です。
#include <iostream>
#include <new>
using namespase std;

class Base{
//省略
};

int main()
{
Base *p1 = static_cast<Base *> (::operator new(sizeof(Base)*5));
//省略
delete p1;
}

すいません、この場合なぜスコープ解決演算子が必要なのでしょうか。
あと、確保したメモリはdelete p1ですべて開放されるのでしょうか。
教えてくださいm(__)m
861デフォルトの名無しさん:03/08/31 12:56
>>860
こうか?

class Base {
};

int main( ){
Base* b = new Base[5];
delete[] b;
return 0;
}
namespace
operator delete
>>853
よく読みましょ。
私の手元の「Effective C++ 改定2版」だと105ページの一番下の行です。
暗黙的に変換されるのは
Rational temp(2);
ではなく、
const Rational temp(2);
^^^^^
です。数値リテラル 2 は、そりゃ変更不能ですからconstってことです。
ということは、あなたの
const Rational operator*( Rational& rhs ) const;
の宣言では、関数内で引数を「変更する」と宣言してるので、
当然変更不能なconst Rationalは渡すことができません。
変更されたら困りますからね。っていうかソースコード中に定数で 2 って
書いてあるんだからそもそも変更しようったって無理な話で…

だから、「引数は変更しないよ」と宣言してやれば、OKなわけです。
// そしてもちろんそのときには関数内部で実際に引数を変更しようとすればコンパイル通りません。
>>863
ハァ?
>>863
それ、妄想じゃぁないの?
866デフォルトの名無しさん:03/08/31 15:53
他ライブラリ(stdioとか)に依存しないフリーのiostreamの実装って在りますか?
867 :03/08/31 16:50
863はだいたいあってると思うけど
>数値リテラル 2 は、そりゃ変更不能ですからconstってことです
はちょっと違うと思う。リテラルが変更不能とかはこの場合関係ない。

暗黙の変換で作られる一時オブジェクトを変更しても無意味だし、それを許すとわかりずらいバグの元になるから
暗黙の変換で作られる一時オブジェクトはconstと定義されてるものとしてるんでしょ。

例えば
int x ;
x = 2;
result = oneHalf * x;
この場合xは変数だけど暗黙の変換で作られる一時オブジェクトは
const Rational temp(x)てなかんじになり
result = oneHalf.operator*(temp);
というふうになる。tempはconstだからoperator*の定義で引数はconstへの参照にしないとコンパイルできない。
非const参照は一時オブジェクトで初期化できない。それがルールだ。
一時オブジェクトがconstかどうかは関係ない。
869863:03/08/31 17:03
>>864-865
_;)ノシ ゴメンナサイ

>>867
)ノシ テイセイ アリガトウ




∧||∧
>839
Comeauがあるってば。
>>870
フリーじゃないってことでは
>>861
レス有難うございます。
Effective C++という本の63ページにこう書いてあるのですが、
これはそういう意味なんでしょうか?
(すいません、初心者なんですがほかの本には、こういうnewの引数
 の例が載ってないので解りません。)

>>862
ご指摘有難うございます。
あの、2行目のoperator deleteというのは、この場合はこう書かなければ
メモリが開放されないということですか?
873861:03/08/31 20:03
その本嫌いで捨てちゃったから例題の意図がわかんないんだけど
>Base *p1 = static_cast<Base *> (::operator new(sizeof(Base)*5));
こんなんじゃコンストラクタ呼ばれないんじゃない?
861みたいなんで万事OKと思うんですが。
>>873
同意
やっちゃいけない例なのかな?
>>873
レス有難うございます。
普通に割り当てると、管理用の追加データ領域が含まれるので、
小さいオブジェクトをたくさん割り当てる場合この方がメモリ
が節約されるって書いてあります。
はい、コンストラクタは呼ばれませんでした。

>>874
そうなのですか、有難うございます。
876デフォルトの名無しさん:03/08/31 20:15
vector<Base *> base_vec;

base_vec.resize(5);

よーするにこういうことがしたかったのでは無いだろうか・・・
>>876
そうですか、
有難うございました。
>>875
....
Effective C++のp.63だな?
それ、operator newを実装するときの処理じゃんか。
ならそれでいいよ。
>>878
補足。
それを >>860 のように使うのは駄目。
>>878
>>879
operator newの実装ですか?
(すいません、よく解りません。もっと勉強します。)
有難うございました。
881デフォルトの名無しさん:03/09/01 00:30
cygwinのg++であるテストプログラムをコンパイルしたら次のようなエラーメッセージ
がでました。

g++ -lm -lgdi32 Test.o -o Test
/usr/lib/gcc-lib/i686-pc-cygwin/3.2/../../../libcygwin.a(libcmain.o)(.text+0x7c)
: undefined reference to `_WinMain@16'
collect2: ld returned 1 exit status
make: *** [Test] Error 1

WinMain@16なんて関係ないとおもうんですが・・・・
インストールしているVCの環境変数が禍したりするのでしょうか?
> WinMain@16なんて関係ないとおもうんですが・・・・
何故関係ないとおもうのか500字以内で述べてくれ。話はそれからだ。
>>881
「-lgdi32」しといて「WinMain@16なんて関係ないとおもうんですが」とはこれ如何に。
>>882
説明されてもウザイだろ。スレ違いは追い出せよ。
まぁ>>881はmainでも定義してから適切なスレに逝けってこった。
885デフォルトの名無しさん:03/09/01 09:11
ちょっと曖昧ですいません。STLのbegin()〜end()範囲の外側に
もうひとつポイントがある・・・・なんて話ありましたっけ?

STLじゃなかったかも知れないのですが、確かC++の話でして。
似たような事を何かで聞いたことありましたら、教えてください。
>>885
曖昧すぎる
>>885
end()がコンテナの外側、って話か?
>>887
今やってみました。この話だったみたいです。
助かりました、ありがとうございます!
ccってC++コンパイラでつか?
>>889
普通はCコンパイラ。
OSベンダ製のCコンパイラだったり、
もしかすると gcc へのシンボリックリンクだったりする。
891デフォルトの名無しさん:03/09/01 16:08
質問です。

if( handle == 0 )
 throw std::runtime_error( "error! :: invalid handle" );

上記のような状況で、
std::string の一時オブジェクトを作成中や、
std::string 型のメンバ変数にメッセージをコピーする際に例外が発生した場合、
どのような例外が発生するのでしょうか?

>>891
throwは演算子なのでオペランドが先に評価される。
#include <iostream>
#include <string>
#include <stdexcept>

struct My_exception{};
struct My_class
{
    operator std::string(){throw My_exception(); return "unko";}
};

int main()
try{
    throw std::runtime_error(My_class());
}
catch(My_exception &)
{
    std::cout << "My_exception\n";
}
catch(std::runtime_error &)
{
    std::cout << "std::runtime_error\n";
}
893849:03/09/01 18:21
遅くなりましたけど、863さん、867さん、868さん、
ありがとうございました。

868さんが書いてくれたルールの為、constで無ければ駄目
という認識でいいのかな?

もう少し基礎的な所をしっかり勉強しないと駄目ですね。
また本買ってくるか・・・
89435:03/09/02 02:05
いまさら >>35です。ちょっとほっぽいておいたんですが
おいたんですがやはり問題が再燃しました。

>>183 さんへ:
残念ながら targetは VC++じゃないのです。
組み込み系で、どんな compilerが使われるかわからんので、
処理系依存の方法はとりたくないし...

ちなみに static operator new とかを headerで宣言してやれば
いいのじゃないか、とか思いましたが、operetor new は externって
決ってるらしいですな。

どうやらしこしこ手で置き換えるしかなさそうな雰囲気です。
まったく、糞ライブラリめ...
895デフォルトの名無しさん:03/09/02 02:16
>>35
Javaに乗り換え時かも。
クラスを継承することは出来ないの?
operator newだけ書き換える形で。
897 :03/09/02 16:10
お前ら、C++ のソースファイルの拡張子は何にしていますか?

cc & hh 派?
cpp & hpp 派?
それともその他?
Win : cpp & h
PS2 : cc & h
899 :03/09/02 16:14
>>898
そういや、新しい(漏れの仲ではまだ新しいほうなんだよ)規格(?)では
<iostream.h> じゃなくて <iostream> って書くことになってるけど、
これはソースコード内に処理系依存の拡張子に関するごたごたを持ち込まないためなのかな?

a.h a.hpp なんかが混在する場合にどれが使われるかは処理系依存?
900GNU Make:03/09/02 16:43
Compiling C programs
`n.o' is made automatically from `n.c' with a command of the form
`$(CC) -c $(CPPFLAGS) $(CFLAGS)'.

Compiling C++ programs
`n.o' is made automatically from `n.cc' or `n.C' with a command of the form
`$(CXX) -c $(CPPFLAGS) $(CXXFLAGS)'.
We encourage you to use the suffix `.cc' for C++ source files instead of `.C'.

GNU 厨な漏れは盲目的に *.cc を使ってます。
んでその勢いで *.hh をヘッダファイル用に使ってるんだけど、

The default suffix list is: .out, .a, .ln, .o, .c, .cc, .C, .p, .f, .F, .r, .y, .l, .s, .S, .mod, .sym, .def,
.h, .info, .dvi, .tex, .texinfo, .texi, .txinfo, .w, .ch .web, .sh, .elc, .el

なんだよな… *.h は入ってるけど *.hh は入ってない…

そういや、Borland C++ なんかに付属している make はどうなんだろ…
ヘッダーファイルに拡張子なんてつけなくていいじゃん。
>899
あきれるくらい間違えてるぞ。
>>902
そういう時はどう間違えているのか指摘するのが筋ってものです。
904デフォルトの名無しさん:03/09/02 17:04
>>902
つまり勝手に拡張子の補完(?)なんかはやらない、と…
<iostream.h>
元々のヘッダ。まだnamespaceは、なかった。
<iostream>
 namespaceができた。stdを指定する必要あり。

互換性のため、過去のヘッダも残す必要があったため、新しいヘッダを.hなしとした。
ちなみに、ボーランドのbcc32は、
#include <stdio>
と書くと、stdio.hを探してインクルードしてくれる。
この大きなお世話機能のおかげで、混乱するヤシもいるんじゃないかな。
>>905
iostreamに関するヘッダファイルの実体がなんであろうと、
統一的な指定でincludeするっていう特別扱いではなくて、
単にiostreamってファイルをincludeするだけなの?
>>907
iostream というファイルと iostream.h という2種類のファイルが存在することになっている。
というか、2種類あると思ってよい。
ただ、処理系によってはうまくごまかしている場合もあるということだ。
しかし、それをユーザーが気にする必要はない。
あくまで、2種類のファイルが存在するのだ。
iostreamとiostream.hの違いが、こんなに知られていないとは思わなかった。
めちゃくちゃ

まず#include <name>はnameに処理系依存で対応するヘッダを
読み込むのであってファイル名nameを読み込むのではない。
同名のファイルを読み込むのは#include "name"
そして標準C++ではiostream.hというヘッダは廃止された
だから#include <iostraem>しかないが、このとき読み込まれるファイルが
何であるかは上の規則によって処理系依存。これを踏まえて

>iostreamに関するヘッダファイルの実体がなんであろうと、
>統一的な指定でincludeする
これは正しい

>iostream というファイルと iostream.h という2種類のファイルが存在することになっている
これは間違い

>iostreamとiostream.hの違い
違いというよりも標準C++にiostream.hはない
トリッキースレから来ました。
>>894=35が何を訴えたかったのかよく理解していないんだけど、
もし何らかのクラスにoperator newを付け加えたいだけ
(かつヘッダファイルの変更が認められておらずクラス名も変えたくない)
であれば、こういうのはどうでしょう?

#define CSomeClass CSomeClass_Original
#include "original.h"
#undef CSomeClass
class CSomeClass : public CSomeClass_Original {
...
};
91235:03/09/02 22:03
>>911 むむ、それもトリッキーですな。
しかしやりたいことはちと違って、
ヘッダは書き換えてもいいんだけどライブラリの version up
について行くのが面倒だからなるべく手をいれたくない。
って、感じです。
あと、classの new/delete operatorじゃ、
new char[m_size]とかにも対応できないし。

結局約100個の class宣言に : public MemManager とかいれて
primitive type の new[]、delete[]を手で置き換えてます。
やれやれ。
# M-x tags-searchえらい
うーん、やはり見当違いでしたか。申し訳ない。
要するに、標準のnewオペレータ自体を入れ替えるという事ですか。
91435:03/09/02 23:08
いえいえ、アドバイスありがとうございます。
煽られなかっただけよかったです。
global new/deleteを置き換えられれば楽なんですが値、、、
void *operator new ( size_t Size , int lib);
void __cdecl operator delete(void* p, size_t Size);

#define new new(1)
#include "a_lib.h"
#undef new
#define new new(2)
#incluede "b_lib.h"
...
という手段はどうか。
一応プロのプログラマーです。
仕事でC++もやったことあります。
が、
MSDNを見てもSTLの事がよく分かりませんでした。

オレってアフォですか?
???
918デフォルトの名無しさん:03/09/03 00:24
全角スペースを文字列から取り除きたい
のですが、どうすれば良いでしょうか?
半角スペースなら認識するんですが、
全角スペースの表現の仕方がわかりませぬ・・・
あんたが読んだのがいつのMSDNか知らんが、
VC++6.0付属のはSTLがらみの説明は最悪だった気がするが。
特にalgorithm
>>919
まさにVC6.0のMSDNです。
で、インターネットで個人が解説してるサイト見たけど
やっぱり難しかった。。。
なんで素直に本を読まないんだ
<algorithm> はなんかヘタに解説書かれるより、
実装をそのまんま載せてくれた方がわかりやすい気がするなぁ。
>>918
' '
>>923
おぉ!!ナイスだ!!

>>918

#include <windows.h>
#include <string>
#include <vector>
#include <algorithm>
#include <locale>
int main()
{
    using namespace std;

    locale::global(locale("japanese"));
    wstring ws(L"プ ロ グ ラ ミ ン グ !");
    ws.erase(remove(ws.begin(),ws.end(),L' '),ws.end());
    vector<char> cbuf(256);
    wcstombs(&cbuf[0],ws.c_str(),cbuf.size());
    MessageBox(0,&cbuf[0],"Program Test!",MB_OK);
    return 0;
}
92735:03/09/03 09:35
お、まだ反応がある...
>>915 さん、それも考えたんですが、 deleteの方が問題で..
それって別々の deleteが呼ばれるようになるんですかねえ??
928918:03/09/03 10:24
>>926

ご教示ありがとうございました。
929デフォルトの名無しさん:03/09/03 11:38
ヘッダファイルの諸々について教えてくださった方々、ありがとうございました。
Cスレから移動。
>C++のソースをCにするようなのを探します。
>Cfrontなる物が、それっぽいとわかったんですが
>現行Cfront (C++ 3.0.3)を購入して使えば実現できるんですかね?
>または他の方法があれば教えてください。

問い合わせた結果をメモっとこう。
The Cfront 3.0.3 is a translator that converts C++ code to C.
However, it is an old technology that pre-dates Linux.
The code that we furnish is in source with several reference binaries.
This is a "dead" product, that is, we do not provide any support.
We provide it primarily for those who have used it in the past and
wish to port it to a newer platform, or for those interested in the computer
science aspects of the original code that Stroustrup wrote.
C++ translatorについては、このスレに出てたぞ。
Comeau C++なんかで落ち着いたはず。有料だけど
932デフォルトの名無しさん:03/09/03 13:03
C++プログラミングの落とし穴
↑コレ読んだ人いる?
どうだった?
>>932
それ自体が落とし穴
>927
void *operator new(int size, int type)
{if( type == 1 ){
void* ptr = malloc_1(size+1); (char*)ptr=type;
return (void*)((char*)(ptr)+1);
}if(type == 2 ){
void *ptr = malloc_2(size+1); (char*)ptr=type;
return (void*)((char*)(ptr)+1);
}...
operator delete(void *ptr)
{ if( ((char*)ptr)[-1] == 1 ) free_1(ptr);
else if ((char*)ptr)[-1] == 2 ) free_2(ptr); }

みたいな仕掛けを用意すればよろしい。
93535:03/09/04 00:50
なるほど、1byte無駄になりますがほしい機能は
実現できますな。
実はもう書き換えちゃった後だったりするんだけど
その方法でもできないか暇ができたら試してみます。

普通のdeleteでたまたま先頭バイトが重なってしまった場合はいかがするのか?
ptr[-1]も読めない可能性はあるし
アライメントも考えないようなプログラムは組むなよ
ノーマルnewも自分で再定義すれば良い

・・・が、汚いな。
94035:03/09/04 02:32
普通の deleteはもうなくなっちゃうからいいのです、今回は >>936
という答えでいいのかしらん。
あと、memory 管理も今回は結構のぞけるので、alloc した chunkの
最後の byteに情報をおけば alignmentも心配ないし。
あ、そもそも addressみればどっちの memory領域からぶんどってきたかも
わかるかな... そうすれば 1byteもいらんな...
普遍的に実装しようと思うと難しげだな。

ところで、
> void *operator new ( size_t Size , int lib);
> #define new new(1)
これの意味がわからないのだが、
たとえば普通に
int* p=new int[4];
とやるときに、
int* p=new(1) int[4];
に置き換えられるということだよね?
その場合Sizeとlibにはそれぞれどの引数がとられるの?
>941
5.3.4.12
-new(2,f) T[5] result in a call of operator new[](sizeof(T)*5+y, 2, f)
>>942
どこに書いてあるの?yって何?
>>944
さんきゅ、わかりやすい説明で理解できました
946デフォルトの名無しさん:03/09/04 12:19
__gcってMicrosoft 仕様?それともStandard 仕様なの?
Visual Studio って独自の拡張してるからよくわからないよ。
>>946
それなに?
Managed C++?
>>946
'__'と'pragma'は処理系拡張のしるし。
>>946
.NETはC++よりC#の方がええよ。
俺はテンプレートのあるC++が好きやけど。
>>947
ガベージコレクション
('__')
>>949
__cplusplus
953デフォルトの名無しさん:03/09/04 22:03
おしえて!

newしたときのメモリサイズってどうなるんですか?

私はC使いなんですが、Cの場合必ずサイズを指定するけど、
newってサイズ指定がありませんよね?

内部的にはどうなってるんだろ・・・

あと、operator newってなんでoperator new( size_t size)とか定義されているの?
このサイズって何?

newを再定義したら、

Unko* unko = new Unko( 100 );
とかやんないとだめなん?
954葉月:03/09/04 22:13
__inLine っていうのがよくわかりません。
誰かおしえてください。
>>953
 new TypeName
って書いてあると、コンパイラがこれは
 (TypeName*) operator new( sizeof(TypeName) + α )
だと思ってコンパイルする。operator new が再定義されてても
関係なく↑こうなるので、再定義したnewの size_t にも
コンパイラが良きに計らった値が自動で入ってくると思っていい。

>>954
多分、その関数をインライン展開できたらしてね、というコンパイラへのお願い。
つーか __ (下線2本) で始まるのは処理系依存の機能だ。
何のコンパイラ使ってるかくらいは書くべし。
956デフォルトの名無しさん:03/09/04 22:26
gccがC++実装したときから使ってるんだけど・・・Winはほとんど人様の
作ったアプリを使わせていただく環境だと思ってたので、
Visual C++の解説本読んでも知らないことがいっぱい出てきてびっくり。
プログラマじゃないので最新仕様追っかけてなかったから浦島太郎状態。
うーん、スタンダードの追加仕様なのか、MSの仕様なのかわからない。
C#にするわけにはいかないのよ。C++で書いてきたコードが膨大で・・・
>>953
(・3・) エェー サイズは指定される型によって自動的に決定されるんじゃないNO?
例えば new int なら sizeof(int) の分だけメモリが確保されるんだYO 多分
>>955
__cplusplus
959デフォルトの名無しさん:03/09/04 23:08
ツールを開始できません。
この操作を正しく終了しました。
ツールを開始できません。
'vcspawn.exe' 実行時のエラーです。 ビルドを実行できませんでした。

というエラーが出てコンパイルできません。
解決方法を教えてください
>>959
すれ違い
>>957
sizeof(int)以上なのは確実だが、== sizeof(int)とは限らない。
そろそろ次スレよろ
963デフォルトの名無しさん:03/09/04 23:34
#define private public
#define protected public
964葉月:03/09/05 00:07
>>955
ありがとうございます。
コンパイラは VC++ です。
「インライン展開」と「処理系依存の機能」というのはなんですか?
>>963
だから?
>>964
http://www.google.co.jp/
という素敵なサイトがあるので是非。
967葉月:03/09/05 00:26
>>966
それはどこに住んでるのと聞かれた時、地球と答えてるのと同じです。
>>967
僭越ながら、そのたとえは違うかと。
「これについてしってる?」と聞かれたとき、「図書館で探せば」と答えているのと同じです

要するに的を射ている回答だと
>>967
住所録を渡しているものと思われ。
質問はどこで調べればいいのかを聞いているのではないから
的を射ていないのは明らかだ。
そんなことより次スレ
972デフォルトの名無しさん:03/09/05 00:44
逃げてぇー、早く逃げてぇー
まぁ答えてもいいけど、954には理解してもらえないかも。

インライン展開は関数呼び出しのオーバーヘッドを無くす代わりにサイズが大きくなる
処理系依存の機能というのは一般に処理系に依存した機能全体をさす。
>>972
懐かしいな
>>974
元ネタは?
976デフォルトの名無しさん:03/09/05 00:51
>>976
梅梅
979デフォルトの名無しさん:03/09/05 07:44
メモリの再利用について、その考え方や簡単なコード等を
教えていただけないでしょうか?

もしくは、参考となるようなサイトがあれば、教えていただきたいのですが・・・・
おねがいいたします。

>>979
new で確保したメモリはdeleteするまで
開放されません。お好きなように利用して下さい。






ってことじゃないよな…
981葉月:03/09/05 08:18
>>前スレの973
ありがとうございます。
>インライン展開は関数呼び出しのオーバーヘッドを無くす代わりにサイズが大きくなる
これは、ソース上、関数風な呼び出しを使用しているけど、
コンパイル時に、呼び出し元の関数内にinLineの内容が記述されているというようにあつかうということですか?

#define UNIUNI(i) ++i

みたいなのと似たようなものですか?
>>981
似たようなものです。

その例だと、
inline int& uniuni(int& i){ return ++i; }
が(intに限って)同等(になり得る)。

これ以上はgoogleなり、入門書なりで調べれ。
> >>前スレの973

随分と亀レスだなおい!
984デフォルトの名無しさん:03/09/05 14:29
C++のbool型メンバ変数は初期化される仕様ですか?
コンパイラ依存の話でなくて、C++言語の規定として。
985デフォルトの名無しさん:03/09/05 14:33
C++,C#,Cと綺麗にスレッドが並んだな。
組み込み型のメンバ変数のデフォルトコンストラクタは自動では呼ばれない。
987デフォルトの名無しさん:03/09/05 16:32
指定したディレクトリ内にあるファイル名をすべて取得する
関数はありませんか?
メンバ変数にデフォルトコンストラクタなんてあるのか?
>>987
無い。自分で作れ。
990げと
991991:03/09/05 16:39
ほーたーるの
>>987
C++標準ライブラリの中にはない。
boostならfilesystemあたり。
その他Win32API等の環境依存ライブラリには当然ある。

>>988
全ての組み込み型に0で初期化するデフォルトコンストラクタがある。
993992:03/09/05 16:40
ひーかーぁり 
>>992
>全ての組み込み型に0で初期化するデフォルトコンストラクタがある

ほんとに?
>自動では呼ばれない。
ってどゆこと?
1000!
ずさーーーーーーーーっ
げと
999デフォルトの名無しさん:03/09/05 16:53
うめうめうめうめうめれんじゃーーー
1000get

ところで、>>322について誰か知りませんか?
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。