1 :
v(^・^)v :
03/08/09 01:44 C++に関する質問はこちらへどうぞ。
ただし質問の前にFAQに一通り目を通してください。
また、テンプレートライブラリ(STL含む)に関する質問は
専用の別スレへどうぞ。
過去スレ、関連スレ、関連リンクなどはこちら
>>2-7
2 :
v(^・^)v :03/08/09 01:45
3 :
v(^・^)v :03/08/09 01:45
4 :
v(^・^)v :03/08/09 01:45
5 :
v(^・^)v :03/08/09 01:46
6 :
デフォルトの名無しさん :03/08/09 01:48
__ノ | _ | | | ノ\__ヽ ヽ二二 ヽ -―人 、 | \ノ◎) _____/ /'(__)ヽ____| / / _(__)∩ \ | |/ ( ・∀・ )ノ RUBY! \ .\ヽ、∠___ノ\\ \ .\\::::::::::::::::: \\ \
7 :
v(^・^)v :03/08/09 01:49
8 :
v(^・^)v :03/08/09 01:56
なんかここって5連続以上で投稿するとはねられるのか。知らなかった。。。
10 :
デフォルトの名無しさん :03/08/09 02:37
嫌です
12 :
v(^・^)v :03/08/09 02:44
13 :
v(^・^)v :03/08/09 02:44
14 :
v(^・^)v :03/08/09 02:45
15 :
v(^・^)v :03/08/09 02:47
↑この名前は決まり事ですか?
16 :
デフォルトの名無しさん :03/08/09 02:50
CとC++ってもう終わっていまはC#なんじゃないんですか?
17 :
デフォルトの名無しさん :03/08/09 02:52
std::list < std::string > で特定の文字列を含む要素を削除したいのですが どのようにすればいいのでしょうか?
remove_if
>>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;と書くべきという事になるのだが…
>>21 んにゃ。"full expression containing the call" の終わりまで有効です。
前スレ829 (827ではなく) 参照。
>>22 829は関数呼び出しの参照パラメータに結合した場合で
827はコンストラクタの初期化リストに結合した場合だから
827が適用されるように見えるのだが?
試して見ます。ありがとうございます。
>>23 コンストラクタの初期化リスト( ctor-initializer / 12.6.2.1 )とは
constructor()
: parent_class( ... ), member( ... ) ← これ
のことであって
new constructor( ... ) ← これ
のことではない。こっちはコンストラクタ関数呼び出しの際の参照パラメータへのbind。
>コンストラクタの初期化リスト( ctor-initializer / 12.6.2.1 )とは それはもちろん承知だが、つまり contains() : key(string("hoge")) {} は駄目という事か。なるほど 具体例がないからよく分からなかった。
うまくいきました。ありがとうございました。
>>27 こっちもためしてみな。
lst.remove_if( contains( "hoge" ) );
30 :
デフォルトの名無しさん :03/08/10 08:23
ヘッダー1をインクルードしたヘッダー2を インクルードするとヘッダー1が受け継がれてしまうのですが、 これを受け継ぎたくないのです。 ヘッダーのみでインラインクラス作る時にこの制約が生じると思うのです。 cppでインクルードしたいヘッダーをインクルードすればこれを回避できるのですが、 2つのファイルに分離してしまいます。 解決策はあるのでしょうか?
templateがないなら分割コンパイルすればいいが あるなら(今のところ)あきらめるしかない。 あるいは独自のネームスペースに閉じ込めてもいいが マクロはどうにもならない。
>>30 たとえばヘッダ2で必要としている(ヘッダ1内の)宣言が型名で、
ヘッダ2の中ではそれへのポインタとして利用されているだけなら、
ヘッダ2の中でその型名だけ(それが型名であると)宣言してやれば、
ヘッダ2がヘッダ1をインクルードする必要はなくなる。
もしヘッダ2がインクルードされる前にヘッダ1がインクルードされていれば
中身のあるその宣言を使えばいいし、逆にインクルードされていなければ、
ヘッダ2の中で自前で必要最低限の宣言だけしてやれば良い。
...しかしたとえそれが型名であっても、ヘッダ1でテンプレートが使われていたり、
ヘッダ2でポインタや参照以外の使われ方をしていたりすると、
>>31 のいうとおり、どうしようもないだろうな。
ってゆーか漏れはそもそも、そういう構成自体がどうかと思うが。
ちょいと質問です。変な状況かもしれないのだけど。 C++で書かれた二つのライブラリを組合わせて一つのプログラムを 作りたいのですが、それぞれに別のメモリ管理ポリシーをもってます。 つまりそれぞれで operator new() を別のものにしてやりたいのですが、 うまい方法はないでしょうか? それぞれのライブラリはもう書きあがっているので、できるだけ ライブラリのコード自体はいじらずに、ヘッダをちょこっといじるだけで すむとうれしいのですが..
( ´_¬`)プ──ン
クラスライブラリなら、メモリアロケーションをポリシー化して、 継承させればいいんでないか?
38 :
デフォルトの名無しさん :03/08/10 13:46
前スレからきますた。 C++のRTTIについて質問なのですが、これってC++は どうやって実現しているのですか? 文字列で各インスタンスに埋め込んでいるのでしょうか?
>>38 普通は、仮想関数テーブルに型情報を置いてある。
仮想関数テーブルがどこにあるかは前スレを見れ。
>>39 レスありがとうございます。
仮想関数テーブルの質問も私ですた。(苦笑
ってことは仮想関数をもたないクラスのインスタンスも
vptrを持っているということですか?
>>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).
>>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*みたいなのがあるか)。
>>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 )
>>48 あぅ。
こんなのがあったのですね。知りませんですた。(--);;
でもやっぱりダメみたいですー。(TT)
>>49 理解できますた。
コードまで書いていただいてすんまそん。
お騒がせしますた。
逝ってきます。。。
>>51 > cout << typeid(*p).name() << endl;
これで CDerived と表示されない?
>>53 なりますた。
ポインタの型を表示させていますた。(TT)
>>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のとおりだが、
他に、相互参照したときにエラーになるなど。
>>58-59 さん
なるほど...
.cppでインクルードすると#includeを書く順番に気を
つけないといけないので、.hに書けばいいのにと
思ったのですが、書籍によっては徹底的に.cppで
まとめてインクルードしているもので。
58さんの方法、まだ初心者なのでよくわからないのですが
もっと勉強しますです。。。
> .cppでインクルードすると#includeを書く順番に気を > つけないといけないので それはヘッダの書き方が間違ってる気がする。
>>60 さん
ありがとうございます。
でも、Grid.hとCell.hがあったらGrid.h中でCell.hを
インクルードしておいて、プログラム中ではGrid.h
だけインクルードするようにしたいですね、やっぱり...
みなさんみたいにもっといっぱい経験を積まなきゃぁ
>>63 GridだけでCellを使わないならCell.hをインクルードする必要はないでしょ。
Cellも使う時だけCell.hをインクルードすればいいだけだし。
勝手にまとめてインクルードされて些細な変更でまとめて再コンパイルされるより、使うものだけインクルードした方がマシ、
何十個もインクルードするわけじゃないんだから。
>>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 何も考えずに
CTest():m_nValue(100){}
使え
組み込み型の値ならたいした違いはない。と思う
継承する時とかに違いが出る
出るか?
出ない
75 :
デフォルトの名無しさん :03/08/11 03:44
標準ライブラリの名前付け規則(アンダースコア区切りの小文字)について、 なぜあのようになっているか理由が示された文書はありますか?
UNIXではあれが普通だから。
77 :
デフォルトの名無しさん :03/08/11 07:23
map型のコンテナの宣言の時に判定関数を付けたいんですが その判定関数のはどうしたらいいんでしょうか? 戻り値がboolで仮引数がpairにしているんですけどエラーでコンパイルできません
ダメ質問の典型例
>>35 それオレも知りたい。
引数を微妙に変えたoperator new()を用意して、
MFCのデバッグ用operator new()とぶつからないようにしたりしてる。
もうちょっとなんとかならんのか…
別のプログラムにしてタスク間通信する
bool haitei(const double& a, const double& b) { return a < b; } と関数を書いて map<string,double> x(hantei); とかいています。 したいことはコンテナの並び順をdoubleの値で順番が決まるようにしたいんです。
map<double,string>でいいだろ
( ´_¬`)プ──ン
なんでコンストラクタに比較関数を渡してるのかが分からん。 1.釣り 2.参考にした文献にそう書いてあった 3.やっぱり釣り
>>81 > したいことはコンテナの並び順をdoubleの値で順番が決まるようにしたいんです。
無理。んなことしたらmapじゃなくなる。
あと比較関数はテンプレートの引数に。
麻雀かとおもた typoだよね
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 には関数オブジェクトのクラスを指定すればいけるばず。
みんな、SCO にお金払ってる? 俺、払ってないんだけど…
MSに金払ってるからC++は関係ねーな
まったくの初心者なんですが、 C++でキーのログをとりたいんですがどーすればいいですか? JAVAみたいにキーイベントあるんでしょうか?
javaでやれば?
スパイウェア市ね
>>95 それは C++ にあるとかないとか、の問題じゃないと思う。
つーか、使っている OS のイベントハンドラにアクセスするためのライブラリがあればできるんじゃない?
99 :
デフォルトの名無しさん :03/08/12 00:39
初心者は何(の本)から手をつけたらいいでつか? 独習?
麻奈たんハァハァ…
その前に 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; }
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に手を出すと挫折する
>>106 サンクスコ。
そうか、7では通るのか...。
なんかvector(unsigned int, T, allocator)
に解釈されてるっぽい。
>>114 VC6だとSTL関連は通らないことが多いかも
116 :
デフォルトの名無しさん :03/08/12 14:29
他スレでも関連したことを聞いたのですが教えてください。 みなさん自作の共通関数とかってどうやってプロジェクト に取り込んでコンパイルしていますか? cppに例えばSumという関数を定義して、それを別のcpp から呼びに行くと「定義されていない識別子です」と 叱られるのですが。
ハラショー
>>116 ヘッダーファイルというものを知らんのか
>>121 そこまで根源的な初歩を知らないなら
まずは入門書嫁
遅れてしみません。 121は私ではありません。TT ヘッダ.hと実装.cppに分けて、ヘッダ を取り込んだのですが、関数を呼んでいる部分で 「グローバルネームスペースにない」といって 叱られます。
>>123 namespaceが本当に違っているのでなければ、
ヘッダに書いた関数プロトタイプの引数のどっかが違ってるとかじゃないの?
でヘッダにネームスペースCommonを定義したのですが、 別のcppでそのヘッダをインクルードして using namespace Common; とやっても、 Common::Func(); だと通るのですが、ただの::Func() だと通りません。 遅れたのですがVC++6.0です。
>>126 ::Func()はusingの外のグローバルネームスペースから探すから当然では
Func()だろ
>>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() は違うぞ。後者に汁
>>127 みなさんおさわがせしました。TT
逝って来ます。。。
Cの入門書を終わらせていざC++の入門書を紐解くと Cの知識が全然役に立たないのは仕様ですか? 他言語からの移行組はCやる必要なかった?
>>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);
のようにしたいんですが。
>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);
>>144 こんな方法もあるんですね。勉強になります。
>>145 たしかに地道に代入するのが手っ取り早いかも。
>>147 どうやるんだろう。全然思いつかないです。
>>149 と思ったらboostにはこんな便利なものがあるんですか。これを機会に導入してみよう。
Visual C++やgccなど色々なソフトの名前を聞きますが、 エディタ等が違うだけですか?作れるプログラムの種類が違って来たりするのでしょうか?
>>152 私はVC++でコンパイルするソースもgccでコンパイルするソースも
同じエディタを使ってますが。
ボーランドしぃプラプラのインスコと環境変数の設定は終わった。 簡単なソースも書いた。拡張子も.cppにした。 cd使って.cppが置いてあるフォルダまで行く事も出来た。 で、コンパイルするには後なにをすれば良いんだ? HSPはボタン一発で全部やってくれたんだが CとかC++ってなんか小難しいのな。
>>155 makefile で ググれ。
俺はVCしか使ったこと無いんで、これ以上説明できん。
bbc failname
>>157 > bbc failname
なんか失敗しそうだな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
auto のみ予約語
>>167 thx
*
**
***
****
*****
と表示する事に成功したよ。
tdsとかobjファイルって消したらまずい? 激しく邪魔なんだけど。
>173 いいよ。
>>173 かまわんが。ソースコードの管理だけはちゃんとしとけよ。
177 :
デフォルトの名無しさん :03/08/13 13:10
中盤にかかれている、 >実は、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
184 :
デフォルトの名無しさん :03/08/13 17:09
visual c++ とフツーの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!
「何入力してもぬるぽ」ってのは「何出力してもぬるぽ」の間違いちゃうんかと。
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...というオチ
>>203 サンクスコです。
でもboost入ってないんです。TT
>>204 それもやってみたのですがダメです。
10000をかけると23299になりますた。
ウォッチだと2.33000ってなってるのに
なんなんでしょう。TT
どうもです。。。
>>205 >実は232.9999...というオチ
実際そのようです。TT
どうすればいいでしょうか?
四捨五入じゃダメ?
作業的には、intは用紙幅でfloatはプレビュー倍率です。
>>208 四捨五入、あるいは切り上げはできたらしたいのですが
nWidth * fZoom のどこでしたらいいのでしょう。
初心者質問でしみません。。。
210 :
デフォルトの名無しさん :03/08/14 01:58
floatがはじめからdoubleならうまくいくんだけどねぇ。 floatをdoubleにキャストしても駄目みたい。 内部表現の問題だろうな。
>>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はいらんかも。
VC6か。std外さないと通らないかも。
>>211 俺が確認したのはBCCだったよ。結果は同じだった。
みなさんレスありがとう。 212さんの切り上げでみごと解決しますた。(端数の 原因はわからないので保留しますた。stdははずしたら 通りますた。) 遅くにほんとにどうもありがとう!!...(TT)...
216 :
デフォルトの名無しさん :03/08/14 02:14
floatの2.33自体が実は内部表現では2.299...となっているから、 根本的に無理かもしれない。もとデータがすでに2.33ではないのだから。 この場合は四捨五入で逃げられるかもしれないが、 今度は.5境界近辺で同じ問題に遭遇するので根本的解決にはならないかも。
浮動小数点数の計算は数学のようにはゆかない。
>>216 だからBCCでもVCでも同じ現象なんでしょうか。
>今度は.5境界近辺で同じ問題に遭遇するので根本的解決にはならないかも。
印刷のズレ程度なのでとりあえず保留しておくことにします。
端数ってムズいですね。。。
こういうのって(最終的にintが必要なら)100倍とか10000倍とかで倍率を整数値で保持しておいて 最終結果を1/100なり(必要なら50足してから)するのが、一番まともな気がするけど。 利息や消費税計算とかはそうじゃないのかな?知らないけど。
>>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 を想定して作られてるから。
>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 class benki {
static const int unko=0xBAD;
};
定数になりますた
>>247 class benki {
static const int unko=0xF00D;
};
定食になりますた
>>252 Scatologyパターンってやつですね
255 :
デフォルトの名無しさん :03/08/14 22:29
C++超初心者なのですがよろしくお願いいたします。m(__)m 関数を実装するのに func(CPoint* pPoint) とポインタで実装するか func(CPoint& Point) と参照を使って実装するか迷うのですが どういう風に使い分ければいいのでしょうか。
>>255 いろいろ流派があるんだけど、大きく分けると2派。
1. NULL が来る可能性がある場合のみポインタで後は参照。
2. 関数内部で値を書き換えるならポインタ、そうでないなら参照
(呼び出し側で、値渡しと明らかに区別が付くように)
俺は 1 の方。
>>257 レスありがとうございます!
あっ、ヌルポインタが来る場合があるのですね。
MFCを勉強しているのですが、たいていポインタで渡して
いるのでなんでだろうと思ったのですが、積極的に
参照を使ってもいいんですね。納得です!
>>258 MFC ってもうかなり古いから、
MFC の設計方針はあんまり当てにならんよ。
まあ、古いから駄目と言うわけでもないんだが、 折れは特別な理由がない限りはほとんどポインタ。 最悪、仕様変更があったときでも対応しやすいし。 (賛否があるのはわかった上でね。)
おれは
>>257 のでいくと2かな。
だからint unko(const hoge& hage)とかしかつかったことないなぁ。
俺はオブジェクト指向上の要素としてのクラスは全部ポインタ経由だな。 つか、どうせ生成〜保持〜破棄とポインタで扱うことがほとんどだから、 いちいち関数の引数に渡すときにデリファレンスするのも馬鹿らしいって 理由なんだが。
値で多態ができる仕組みが欲しい。 RTIを駆使すれば実装できるんじゃないかねえ
実際にどうなるかなど気にしない方がいい
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. 憧れのあの子はウンコなんてしない 」と書きたかっただけだろ?
>>267 いや、いたって真面目な質問です。
6. は定数なんて使わないって意味。
1. static const int unko = 100; 3. enum { unko = 100, }; これ以外は機血画位
特に4と5はな。
2はクラス内定数じゃない気が
ごめん、今まで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 をお薦めしとくよ。
共有するソースなら3を、そうでなければ1を。 状況に応じて4を使い分ければいいかな? 所で文字列定数ってどうしてる? クラス外で const char* unko = "もりもり"; これは逝って良し?
どんなプログラムかによってどんな手段がいいかは変わってくる。 フォーマルにやる必要がある場合は、面倒くさいけど 文字列定数に関してはそれだけをひとつのファイルに まとめたりするのがベスト。 おちゃらかでいい場合はリテラル文字列をその場で直埋め。
const char * const unko = "もりもり"; じゃねぇーの?
(⌒V⌒) │ ^ ^ │<これからも僕を応援して下さいね(^^)。 ⊂| |つ (_)(_) 山崎パン
285 :
デフォルトの名無しさん :03/08/15 17:16
age
あげ
>>281 static const char unko[];
をクラス内に作って、
.cpp 内で const char Unko::unko[] = "もりもり";
と初期化。
>おちゃらかでいい場合はリテラル文字列をその場で直埋め。 ファイルかリソースだな
>>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だけ。
,演算子(コンマ演算子)を調べるべし。
296 :
まりりんまんそん :03/08/16 16:39
>>293-294 サンクスです。マンコ^h^h^hコンマ演算子、調べてみます。
>>295 今のところ適当なループを書いてクラッシュするまでまわしたりしてますが・・・。
そうですか、ありませんか・・・。;_;
回答ありがとうございました。m(__)m
デストラクタが呼ばれた時に何らかの情報を出力するクラスを作って試せばいいじゃない。
ごめんなさい。虚偽を書きました。 294氏が正しい。
300 :
デフォルトの名無しさん :03/08/16 22:05
んなことで所構わず貼って回るなよな。
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(参照渡し) である。
それは、それは、空を越えて〜 やがて、やがて、迎えに来る〜♪
クラスのstaticな関数はインライン展開されるのでしょうか? コンパイラ依存であれば、VisualC++ 2003 について 教えて欲しいです。
インライン展開を期待する書き方(クラス定義内に書くかinline指定する)をしており、 コンパイラがインライン展開可能な関数であればインラインになる。 コンパイラにも依存するが 関数自体にも依存するので一概には言えない。
インライン展開に関係ありそうなことと、なさそうなことを考えてみれ。 ・再帰 ・関数ポインタ ・リンケージの種類
316 :
デフォルトの名無しさん :03/08/17 16:36
それほど多くを知らないせいか、そこら辺のフリーソース見ても、 例外処理をしているものは、ほとんど皆無です。 趣味グラムくらいでは、例外処理って、あまり有用じゃないのでしょうか?
>>316 んなこたない。
けどC++の例外クラスは腐ってるから簡単お手軽に使う気はあまりしないよ。
せめてエラーの原因をstringで持たせりゃいいのに。
>>317 はぁ?
stringで持たせるクラスを派生させればいいだけじゃ?
プロとアマの違いは、エラー処理の厳密さだ!と指摘され、ショックのあまり気がふれ
例外処理でコードを埋めようとしたところ、あまりの例のなさに、がっかりしてたとこでした。
>>317 レスありがとうございます。やっぱり使いづらいのですね。
stringなら簡潔でよかですねぇ。処理の流れを分けて、
可読性を高めるはずなのに、かえってシンプルじゃ無くなったりで…。
どっかで綺麗に実装してるコード例とかないかなぁ…。
それよりstringを投(ry
ぉぅ、書いてる間に…
>>318 なるほどなるほど、やはり皆さんそれぞれ独自に
自分用例外クラスを設けてるんでしょうか。
例外ってC言語のsetjmp,longjmpに相当するぐらいの負荷があるのでしょうか?
>>323 うーーむ、すいません。熱心に読んでは見たのですが
使い方が良く分からなくて….NETが無いと駄目なのかな…。
なんとなく、すごそうだってのは良く分かりました。
>>323 ハァ? それと同じようなモン派生させてそれ使えばいいだろ。何度も言わせんな馬鹿。
>>325 レス番違うけど、俺へのレスかな…すんません、もう何がなにやら。
あまり長引いても迷惑ですし、まだしばらくは分相応に 返り値でエラーチェックに戻ります…レスありがとうございました
レス番違うく無いけどね
厨房用例外クラス 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で十分
>>331 自分でasmファイル吐くコンパイルオプション付けて調べてみたらどうですか?
チンカス
プ
↓以下厨の煽りあい
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 只なんだよ、只。
乞食根性は仕方ないが
少しは隠せ、恥を知れ。
ブラクラ
>>346 ある
# 人に聞くよりプログラム書いて時間計れ!
チンカス
無限ループの予感!
while (true) {
ところで、
>>322 について誰か知りませんか?
自分で調べてみたら?
知らないならだまっててね
チンカス
}
#ってなに C#って単語を時々きくけど。
>>348 は騙りかJava厨、C#厨だと思うが
アセンブラで見るか、それがわからなきゃ
簡単なベンチマークぐらい書けよ。つーか、レベル低杉。
#
>>352 は釣りと見た。
うう、すいません・・・つまらない質問してしまって・・・
私は322以降発言していないのですが・・・
私のせいでなんかスレが荒れてしまって本当に申し訳ない・・・
話は変わるのですが、
>>322 のレスについて誰かご存知の方はいらっしゃいませんか?
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が入ってないだけ? お願いします。
理論抜きでいきなりベンチとったりアセンブラソース眺める奴は馬鹿。
>>355 知らないならズボンのチャックを閉じていてください。
オブジェクトのアンワインドの分だけ例外が遅い。
>>357 アセンブラのソース眺めれば理論が分かるだろ
>>359 拡張子は「c」になってます。
>>360 図書館でC++関連の本を探したらコレしかなかったんで・・・。
>>365 拡張子cppにして本屋にいって本を買ってきなさい
>>366 あっ!
出来ました!
ありがとうございます・・・。
何度もスイマセンが
独習用として買う場合のお勧めを教えて下さいませんか?
値段は安ければ文句無いですがひとまず保留として、
C++初心者分かりやすいのをお願いします。
なんでできるんだろ .hつけるとstd::がいらなくなる???
>>368 .h 付きのヘッダは namespace std が無かった頃の負の遺産なので。
>>369 参考になりました。
ありがとうございます。
一般的には .h 付きのヘッダは推奨ではないが、 移植性を考えると現状では .h 付きのヘッダのほうがよかったりする。
C++本気でマスターしようとするなら、本代は最低2万はかかるよねぇ
>>374 英語が読めれば、ネットで読みきれないほどの記事があふれてる。本要らない。
>>354 だから
「ある」
ってさっき言ったじゃん
>>370 わしの使っている本にはusing namespaceに関する表記がまったくないのですが、
なんかいいサイトを知りませぬか?;q;
>>373 .h 付きでないヘッダに対応している処理系を対応し始めたバージョンを併記して
5つ以上リストアップしてくれ。それができないならそんなこと言うな。
できたら負けを認めよう。
380 :
デフォルトの名無しさん :03/08/17 21:55
C++勉強中です。 とあるクラスでひとつのメンバ関数をconstにしたら、連鎖的に書き換える必要がでてきて、 最終的に全てのメンバ関数がconstになり、全てのメンバ変数がmutableになりました。 これってたぶん使い方を誤ってますよね。 mutableの効果的な使用法を解説しているサイトはありませんでしょうか?
>>380 mutable使わない方向でお願いします。
>>381 STLportって printf とか C 言語のときからの標準関数も含んでるの?
mutable を使う例としては参照カウントぐらいで、 それ以外で mutable を使うことは滅多にない。
>最終的に全てのメンバ関数がconstになり、全てのメンバ変数がmutableになりました。 意味なし。最強
VC7.1でSTLPortって使えるの?
388 :
デフォルトの名無しさん :03/08/17 22:07
通報しました
>>382 >>384 ありがとうございます。
しばらくは mutable は存在しないものとして学習を進めていくことにします。
>>385 やっぱり・・・。そんな気はしたんですよね。
メンバ変数を変更するメンバ関数ではconstを付けるな メンバ変数を見るだけのメンバ関数にはconstを付けろ
メンバ変数を見るだけのメンバ関数なのにiteratorで舐め回すとエラーが出ます。
>>392 const_iteratorじゃだめ?
>>379 > .h 付きでないヘッダに対応している処理系を対応し始めたバージョンを併記して
> 5つ以上リストアップしてくれ。それができないならそんなこと言うな。
知らんが、今後シェア最大になるであろう Visual Studio .NET 2003 には .h 付きヘッダが
含まれていないのだが。それでも .h を入れた方が移植性が高いと思うのか?
C++って一貫して一貫性がないな。
322と名乗っている教えて君に【無礼者】のレッテルを貼る 教授または先輩に見放された理由がよくわかる
それは一貫性だな。
>>396 それは今後の話だろ?
現状では同じ VC でも未だにバージョン6が主流。
メタ一貫性だろ
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
gccでも最近のバージョンは警告出す。
414 :
デフォルトの名無しさん :03/08/17 22:56
>>414 それはどこが公表してるどういう数字?
できたらソースきぼんぬ。
ウザ
>>414 VC++.NET 2002は .h付きもサポートされてるよ。
で、その67%のシェアって、2003のシェアじゃないよな。
.hつけなきゃいけない処理系って何?
421 :
デフォルトの名無しさん :03/08/17 23:09
>>419 VC6。
あと、最近のバージョンなら大丈夫だと思うが CodeWarrior も。
VC++6.0にiostreamとか入っているよ?
stdio がアウト。( cstdio なら大丈夫 )
ハードリンクも作れない低脳どもが
あと付け加えとくと VC6 は cstdio にしても 標準関数が std 名前空間に入ってくれないから意味が無い。
>>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 があるってことですか?
>>436 そうなんだ、知らなかったよ。情報ありがとう。
でも
>>431 によると STLport を使う事で問題が
万事解決ってわけでもなさそうですね。
>>429 > #include <stdio>
そりゃアウトだろう。
初めて見たよ
で、結局のところどういうことなの? .h 付きだとダメな処理系は VC++.NET 2003 オンリーで、 .h 無しだとダメな処理系は?
>>443 >.h 付きだとダメな処理系は VC++.NET 2003 オンリー
これが正しいわけだが。つーか規格嫁。
>>444 規格も大切だが移植性の話してるんだから
現状がどうなっているかは重要。
規格にしたがったからって実際に現実の移植性が
いいかとは別問題。
>>447 その参考にする為に訊いてるんだから
つけているかつけていないか別問題だろ。
頭悪いなぁ。
>>448 規格は一つ。
現実問題は処理系の数だけある。
どっちに依るかは使う処理系によって自ずと決まろう。
規格にすがる気持ちは無いけど、一定の拠り所はほしいよな。
規格規格逝ってる香具師はANSIC++規格に100%準拠したコンパイラが出るまで、 C++を使わないで下さい。
>>450 そうそう。規格通りに実装されてなければ意味をなさないし、
実際問題、まだ全てが規格通りに実装されるわけでもないんだし。
移植性移植性逝ってる香具師はembedded系のC++コンパイラサブセットでも通るコードだけ書いて下さい。
>>453 実際にそれを使う奴は他の処理系でも意識してコード書くだろ。
特に共通で使えそうなコードならなおさら。
要するにだ、今の規格は現場のニーズを満たしていないと。現場のニーズは 規格化するにはあまりにも多岐にわたっていると。そういうことだな?
拠り所が欲しい奴は↓に従え。 まず規格通り .h 無し。 エラーが出るようなら STLport を検討。 それでダメなら .h を足して、対応する std:: の使用を変更する。 このとき、移植性が必要なソースなら処理系で定義済みの プリプロセッサシンボルで .h の追加、namespaceの変更をスイッチ可能にしておく。 それでだめなら諦めて実装を変える。 このとき、移植性が必要なソースなら処理系で定義済みの以下略
プププ 流石低能ばかりがいるスレですね。
ああっ、なんてレベルが高いスレッドなんだ。これじゃ誰もついていけない。 2ちゃんねるも捨てたもんじゃないな。まだこんなレベルが高いスレッドが あるんだもんな。しかし、ここに書き込んでいる連中は相当なレベルの高さ だよなぁ。これじゃ、こんなにレスがつくのも当たり前だよ。本当に322の レベルは高いと思うけど、それについて行ける奴も凄いな。まったく尊敬 するよ。おれもみんなを見習ってレベルの高い人間になれるように精進する。 そして、みんなについて行けるような立派なプログラマになるよ。まだ見習い だけど3ヶ月後の俺を見ていてくれよ。みんなをアッと言わせるプログラマに なるからさ。その時まで、みんなもレベルが高いのを持続してくれよな。 ほんと、2ちゃんねるに来て幸せだよ、オレは幸せものだなぁ。
>>460 長文オツカレー、だけどみんなもう飽きちゃってんだよねぇ…。
//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;} };
//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' となってしまいます。どうしたらよいのでしょうか?
とりあえずインクルードガード
>>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で用意されたものを使うことにしました。
ありがとうございました。
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でそのまま使えます?
Microsoft Visual C++ .NETとBorland C++Builder 6のどちらを買ったほうがいいですか? 使用目的はC++の勉強や趣味にしたいと思っていますが、本格的なアプリケーション作成も十分出来るなどの点を踏まえて教えて下さい。
>>484 VC .NET 2003 にしとけ。
Borland はもう結構長いことバージョンアップしてないし。
>>484 .NET Frameworkかcygwinでまずは遊ぶのがいいよ。
金出したからといってプログラミングができるようになるわけじゃない。
書籍に金をかける方がいい。
IDE無しじゃ学習効率は大幅にダウンする。 書籍以前の問題だな。
>>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にしていいの?
えと、抽象クラスということで、pure virtualありです。 > 純粋仮想関数をもってないならprotected は何故なのでしょうか? おしえていただけると嬉しいです。
>>492 Abstract not_implemented;
って感じに抽象クラスのインスタンスを作ってもエラーにならないから。
ああ、なるほど。サブクラスでoverrideしなくてもいいけど、 抽象クラスそのものをインスタンス化してもらっちゃ嫌だと いうことですね。ありがとうございます。
496 :
デフォルトの名無しさん :03/08/19 03:20
教えてください。 int i=15 * 6 * 0.7; // 62 int i=15 * 0.7 * 6; // 63 で前者は62に後者は63になるのですが これは一体なんなんでしょうか?
C++に関係あるんでしょうか
500 :
デフォルトの名無しさん :03/08/19 06:40
質問です。 プログラムの実行中に、関数を動的に書き換えたいと考えています。 そこで、オリジナルの関数を宣言した時、 その関数のポインタを得ることは出来ますが 関数の終端を得るにはどうすればよいでしょうか? (この「終端」はアセンブラ命令でいうretの位置だと捉えてください)
>>500 オリジナルを動的に書き換えるのは(確か)無理。
char型の配列を書き換えてcallならできるだろうけど。
502 :
デフォルトの名無しさん :03/08/19 06:52
配列にコピーしたいから終端を知りたいんですけど。
>>502 だから無理。はじめから配列にアセンブラで命令入れとけ。
回答どうもありがとうございます。 WriteProcessMemoryでどうにかなるかな? と思ったのですが、無理なのですね〜勉強になりました。 御教授いただいたchar型配列のcallを試してみます。 どうもでした。ちなみに502は私ではありませんが、すいませんです。
じゃあなんで終端を知りたいんだろう。
>505 そうでした・・すいません。 最初と変わって申し訳ないのですが、オリジナルの関数以外も視野に入れさせてください。 書き換えは不可能でも、関数の内容の読み取りを行いたいんです。 そこで、ちょっと終端検出を考えて試してみたのですが void a(〜) { 〜 }; void b(〜) { }; と隙間無しに宣言して、aとbのポインタを見てみると bはaの直ぐ後ろに確保されているようで b-1がaの終端ということでいいのかも、と思ったのですが この方法は、あまりよくないんでしょうか・・? メモリの確保のされ方はOSのほうの話になりますか?
>>506 OS じゃなくてコンパイラの出すコード次第だと思う。
(リンカも多少仕事する余地があるかな)
>この方法は、あまりよくないんでしょうか・・?
どっちにしろ移植性ゼロなんだから、C++ の話題じゃあないし、
あまり気にせず出来るやり方でやればよいと思うよ。
Win32 ならコード書き換えるんなら VirtualProtect(Ex) でチャクチャキっと。
>>506 書き換えとか読み取りとかって・・・
コンパイルというものを理解しているかな?
アセンブラとか、マシン語とかって知ってる?
メモリーの中に、Cの関数が入っているわけじゃないよ。
最近はソースコードデバッガがあたりまえだから、そういう錯覚に陥りやすいのかもしれないけど。
書き換えたいんだったらOpenC++のMOP使う方が格好いいよ。
てか、関数ポインタを使えと小一時間・・・
スレ違い+マルチ 氏ね
>>506 >と隙間無しに宣言して、aとbのポインタを見てみると
>bはaの直ぐ後ろに確保されているようで
そんな保証はない! ・・・と断言してみせた。
さあ次はお前の番だ。保証があると反駁してみせろ。
コンパイラの設定によってはインラインになるかもしれんしな。
515 :
デフォルトの名無しさん :03/08/19 21:45
ぶっちゃけ最初どういうプログラムかいて勉強すりゃいい? javaだったらGUI簡単につかえてやる気がでるんだが・・・ どこかほどほどに大きいサンプルプログラムおちてるとこないっすか?
今は大概のアプリケーションがフリーであったりするから プログラミングのためのモチベーション維持するのが大変だよな。 大きなものはいきなりは作れないだろうし。
518 :
デフォルトの名無しさん :03/08/20 02:38
クラスのメンバ変数?で三次元配列使いたいんですけど、初期値を代入する方法としてファイルも使わずスマートに記述する方法ってありますか?
Qtよりgtkmmがいいよ
>>518 もうちょっと、詳細な状況説明をおながいします。
>>520 理解できない馬鹿は黙ってろよ。
わかってる人、よろしくお願いします。
単次元配列に初期値用意してループ使って初期化。
粘着Java厨、C#厨警報! 質問者はトリップを忘れずに。
ジサクジエンカコワルイ
三次元配列を使いたいといっている時点でスマートじゃない罠。
C++ でメソッドの定義を記述するとき、 あいまいさがない限りは this-> を省略できますよね。 これの this-> を強制するようにはできますか? それってコンパイラごとのオプションで #pragma で指定するようなものなんでしょうか。 ローカル変数で同じ名前の変数を使ってしまって、 それがバグの原因になるということが頻繁にあるので、 明示的に this-> を使うように強制したい、と思うんです。 使用しているのは gcc 2.95.2 です。
コーディング規約
>>529 みんなが規約をきっちりと守ってくれたらいいんですが…
>>528 コンパイラでは規制はできない。
そんな腐ったルールを強制するよりは
名前ルールのほうで回避するのが普通
(ローカル変数は小文字だけ、とかメンバ変数はm_つけるとかそういう類。
コーディング規約スレ参照)
>>531 やっぱりそうですか…
現状、ローカル変数は aaa_bbb_ccc 系の命名方法、
クラスの変数は aBbbCcc 系の命名方法にしているんですが
(Windows 系のプロジェクトとあわせるためもあって)、
守ってくれない人もいるんで強制できたらなぁと思った次第です。
PHP のようにデフォルトで強制される言語もあるんで、
Web がらみの仕事も多いうちではどうせなら C++ でも強制してしまえ、とばかりに。
>>532 名前ルールで分割しない場合、
人間が見てもthisを付けるべきかの判断がそもそも困難なので
コードレビューをしてもミスを残す危険がある。
(問題をおこす場面というのは同一の名前の場合なわけだからね)
しかし名前ルールで分割する場合、宣言をレビューした時点で
誰もが違反を指摘できる。
>>534 宣言を見た時点で、その名前の付け方は違反だと指摘できる、ということですね。
問題は無意識にメンバ変数と同じ名前のローカル変数を使ってしまっても、
コンパイラにはそれを検出するすべがないということだと思うんです。
まぁコンパイラによっては警告を出してくれるものはあるみたいですけど。
ん?もしかしたら -Wall で g++ は警告出してくれるんじゃないか?
んなことないか。
>>535 組織でやってるのなら確実にレビューをすればそういうチェックと共に
多くの問題を発見できるんだが脳。
ちなみに名前を隠蔽する場面ってのは、メンバ変数以外にも
引数やらローカル変数同士ですらあるし、 namespace + usingも罠だな。
>>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 書いているうちにすいません。なるほど、生成にかなりコストが…。
ちょっと貧弱なマシンも考えなければなので、これは根本から見直さないと…。
いやはや本当に助かります。レスサンクスです。
C は sizeof を使わないとビット幅が確定しないのがなぁ。 あと、符号{つき|無し}{右|左}ローテートとかもあったら便利なのになぁ。 ビット演算やりたければアセンブラつかっていう話もあるけど、 そういう低レベルのところを言語仕様に入れてくれてもいいのになぁ。 歴史的には高級言語としてそういうのを隠蔽しようとしてきたんだろうけど、 いまの C の価値はむしろそういうレベルのコード生成の透明性にあるからなぁ。
ビットフィールド
つまり、shared_ptr だの、smart_ptr だのをあまり利用せず、 IUnknown 継承して、CComPtr つかえってことですね。
>>550 ローテイトもってる CPU じゃないと
実装が面倒になるというのもあったのではなかろうか。多分。
>>553 ははぁ、そうなのかもね。でもなぁ 8bit の時代からあったからなぁ。
ところで、皆さん整数の桁あふれとかはちゃんと対処しています?
加算命令で int の幅を超えちゃっても、
C の言語仕様上は検出するすべがありませんよね。
多くのプロセッサは桁あふれを検出することができると思うんですが、
C からも使えたら便利だとは思いませんか?
ローテイトを何に使いたいんだ? それが気になる
C言語の生い立ちから考えるとやっぱりその辺は 「アセンブラを使用汁」ってことに尽きるんでしょうなぁ。
>>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であってます?
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;
}
その手があったかと汗吐かせてみたんですが、よく考えたらアセンブラ読めませんでした(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;
}
#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 独自拡張っぽい? 余計な真似しやがって。
> 以後、main 内では単に a と書くだけで A::a が参照される。 あれ?そうだった。 漏れんとこではただのローカル変数ができたようなコードが出てたんだけど。
>>576 ごめん、推測。
コード見てなかったりする。
gcc のバグかな?
#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
>>581 まじすか!
諦めるというかちょっと気になったもので
ありがとうございました
>>581 new 演算子をオーバーロードすると出来ると思う。
素直にvectorでも使えばいいんじゃないんだろうか。
boost::tupleにしておけ
この板みてるとboost使えってよくでてくるけど、流行ってるのか? うちの会社(中小だが)では俺しか使ってない。 c++自体はみんなつかってんだが・・・。
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&);
でもどちらにしろクラスオブジェクトしか渡せないじゃん。
初期化値とは全然関係ない。
>>608 そしたら、次の例はC++第3版のnew(P660)のどれに
該当するんですか?
static void* operator new[]( size_t siz, int param1 )
{
cout << param1 << endl;
return malloc(siz);
}
>>609 ふーん、そうなんだ。配列のnewは配置構文にならずに任意の
パラメタを渡せる仕様なんだね。初めて知った。
>>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]
----
それ以上でも以下でもない。
size_t引数がテンプレート引数だったらいいのにな。
>>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
628 :
デフォルトの名無しさん :03/08/25 05:08
(゚∀゚)ATLってなに?
>>628 Active Template Library
>>628 Antano Tameno Library
631 :
デフォルトの名無しさん :03/08/25 10:10
CとC++ってまったく違うものなんでしょうか? 文法が違うだけ? それとも、考え方そのものが別物・・・?
>>631 C++はCの文法を引き継ぎ、それに色々な概念を導入したものです。
#突込みどころ1
ですので、Cの概念だけで使っても構いませんが、
#突込みどころ2
どうせならC++らしい考え方も習得してみましょう。
#突込みどころ3
あなたがプログラミングになれているなら、
#突込みどころ4
難しくはありません。
#突込みどころ5
C++独自の機能の内、関数のオーバーロードだけ使っています。。。
参照くらい使ってやれ。
>>634 (゚Д゚)クラスも使ってないのか?(゚Д゚)!!
ローカル変数を好きな所で定義できる機能だけだな…
C++を業務で使い始めて3ヶ月、やっと自分でテンプレートを使う(設計する)ようになったが
未だにMFCの部品以外のクラスの継承は書いていない。
関数のオーバーロードや引き数の省略、参照は最早ないと不便に思うようになった。
>>637 //コメントは使わない?
#いやまぁ、Cでもあるところにはあるから含めなかったのかもしれんが。
大抵の機能は使うよ。
>>638 俺の場合、テンプレートより継承の方が多用するけどな。
valarrayは使ったことがない
>>643 そんなのArrayの初期化の時に設定すればいいじゃん。
それよりC++標準になるとSTN(Standard Template for Numeric)
とか呼ばれるようになるのかな。FORTRANを駆逐できるかも。
>>644 三角行列用の対角化とかしたいんだけどな。
自分で LAPACK と繋げて使ってるけど、
標準であったら激しく便利。
Blitz++はArrayのiteratorを持っているから、対角化は簡単にできる。 LAPACK++もあるけど、こちらは効率の面から見ると問題があるので 標準化の予定はない。あくまでも効率の面でFORTRANに劣らない 速度を実現しようとしている、それがBlitz++なのだ。
>>646 できるんか。
標準化が結構楽しみになってきた。
ただBlitz++はあまりアルゴリズムに関しては多く持ってないので、 三重対角化のルーチンを手前で組んで持っておく必要があるだろう。 しかしBlitz++で書けば簡単に書ける。 あくまでvalarrayの後継ぎを意識している。現在の標準C++のvalarray は未完成のまま発表されたと言われている。中心人物が途中で抜けて しまったため、後に残された人はやる気をなくしたのだ。
人の書いたプログラムを読んで勉強したいのですが、 勉強をはじめたばかりで、良いソースと悪いソースの区別がつきません。 何かお勧めのものはありませんか。
extern "C"ってエクスタシーでいいのか
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>
なんて書いてある参考書を捨てるところから始めろ。
回答ありがとうございます。
>>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文字列なんて使ってられません。
>>664 >絶望的に古い本です。
>>665 >概ねゴミ
・・・。(´・ω・`)
あした本屋行ってきます・・・。
>>666 CStringはBASICみたいに利用できるから楽なんですけど、
なるべくMFCを使わないで作るっていうのが、今の勉強の指針なもので。
MFC使うとブラックボックスな部分が多すぎて
プログラムの中の人がどんな風に働いているのか分からないんですよね。
マカーなんですけど今度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; }
違ったスマソ。
>>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
>>687 オーバーライドした派生クラスのデストラクタがコールされると
アップキャストされたポインタが示す領域だけじゃなく
その派生クラスのオブジェクトが完全に開放されるということですか?
>>689 そう。多態を実現するには必須なので
これを知らないのはまずい
自分で言ってて訳和姦ねー・・・ もう少し勉強して来ます
と思ってたら・・・
>>690 ありがとうございました
コンストラクタはどうやってオーバーライドするの? コンストラクタにvirtual付けたら怒られた
superも無いみたいだし
>>693 どういう風に「コンストラクト」したいの?
答えはそれによる
>>693 コンストラクタを virtual にして
どうしようというのか小一時間(ry
>>693 コンストラクタの中で基底クラスのコンストラクタを呼び出す。
要するに基本を知らなかった故の質問だろ?
しかし、仮想コンストラクタ(クラスファクトリ)という言葉はあるワナ。
>>698 そういう言葉だけ書いて後放置して、初心者が
コンストラクタにも virtual 付けれるんだと勘違いしたらどうする。
よく分からんが、↓みたいなことがしたいんじゃないの? class CHage : public CHoge { CHage(int boo, int foo, int woo) : CHoge(boo, foo, woo) { } };
多態性を用いたプログラムでは”パラメータによって違うクラスを生成したい” という欲求が生じがちです。 これをスマートに実装するために作る専門の関数(クラス)をクラスファクトリといいます。 仮想コンストラクタという言い方もしますが、どちらかというとマイナーです。 クラスファクトリの例としては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 その答えは以下の質問への答えと同様だろう。
「おろしニンニクがテーブルに置いてあるラーメン屋のラーメンはどのくらいニンニク風味なんだぁ?」
テーブルのおろしニンニク全部かけてもまだ物足りない罠。
生ニンニクとおろし金をテーブルに置かれた気分。
C++で田体制書くときこんなんでええの? method(int d); method(double d); これで田体制の実装完了?
>>710 否。
この場合、JAVAはニンニクラーメンに相当する。
すなわち注文した時点ですでに強烈なニンニク風味は確定しているのである。
>>715 じゃこうか?
virtural void method(void);
実装したら多々異性完了?
>>714 オブジェクト嗜好=にんにく
じゃヴぁ=にんにくラーメン
C++=テーブルのうえにあるにんにくかけても足りないラーメンと
いうことでいいでつか?
720 :
デフォルトの名無しさん :03/08/27 13:26
オーバーロードもポリモの一種かと思っていたのにぃ
そのうち、 「ポリモルフィズムをポリモと呼ぶスレ」がたったり、 山崎が「ポリモ」とか言い出したりしそうだ。
>>721 いや、そうだよ。
オーバーロードもポリモーフィズムの一種。
コンパイル時に確定するから静的ポリモーフィズムって言われる。
仮想関数なんかは動的ポリモーフィズム。
えっと、多々異性についてレスされてるのは 本気でレスしてますか? ネタならネタと悪いけど教えてください。混乱してきたんで(;´Д`A ```
∧_∧ ( ^^ )< ぬるぽ(^^) ぐぐったらわかるっぽ!
∧_∧ ( ^^ )< ポリモ(^^)
基本クラスのデータメンバはprotected属性にしてた方がいいっすか?
>>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
>>734 もう少し建設的な意見を期待していたんですが。。。(笑)
738 :
デフォルトの名無しさん :03/08/27 20:18
>>732 それは君が屁たれだからです。もっと精進しましょう。
740 :
デフォルトの名無しさん :03/08/27 21:05
VC.netでコンパイルしたプログラムを.netフレームワークなしで 動かすにはどうすればいいの? mscoree.dllがロードできないって言われて終わる。 検索しても.netフレームワークをインストールすれ、っていう 文献は見つかったけど、コンパイルをどう工夫するのか、ってのはない。 なんか簡単なプログラムを書いた友達はデフォルトで動く、 って言ってたけど、なんかオプションとかあるの?
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でも できるの? できるなら教えて
マルチでなくても回答したくないなw
>>750 ヌヒよ、STLport の runtime_error は、感心なことに char の静的配列で
メッセージを保持しているので、単純に std::string を渡せないよ
755 :
デフォルトの名無しさん :03/08/28 20:16
C++を使いたいんだけれど、Cのコンパイラしか用意されていない環境を渡されました。 C++のコードをCに変換するツールで、どんなのが有名ですか? どなたかよろしくお願いします。
756 :
デフォルトの名無しさん :03/08/28 20:21
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ってつかえるんだ。
>>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は情報へのポインタをください。
>798 why?
>>799 最近 sage を覚えたのがうれしいんだよ。
そっとしておいてやんな。
なにかとすぐ「ワラタ」
>>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. (略)
よそでやれボケども
811 :
デフォルトの名無しさん :03/08/29 19:50
std:string s; char c[16]; s = "おまんこぺろぺろ"; c = (char *)s; みたいなことはできませんか?
strcpy(c, s.c_str());
>812 たいがいの文字コードでスタックが壊れるぞ。
>>814 じゃあ、どうすりゃいいのさ、すんすすん。
>>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にした方が良かったな。
つーか固定長の配列にstrcpyすんなよ
ひゃっほう。みなさんありがとうございます。m(__)m s.c_str()で直接参照ですね。勉強になりました。
つーか、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;
この程度の最適化はやってくれそうだけど。
>>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
>>832 a(=b+c)が計算される前にd(=a-e)を求めるときの内部μOPの
ストールのことを言ってるなら、d=b+cを求める最短パスは
a(b+c)がすでに通ってる。メモリに直接アクセスするような
指定がないなら、d=b+cはあまり意味がないと思うな。
aとdの間にストールを和らげる計算を入れるくらいしか漏れには
思いつかない。
>>832 仮にそのままマシン語に落ちたとしても、
b + c の出力を forward して a - e の入力に(レジスタを介さず)
直接たたき込むくらいのことは今時のCPUならやってるので、
気にせんでいいと思う。
小手先の最適化は無駄でFA
結局フリーのC++ to C translatorはないということでファイナルアンサーですよね?
>>838 タイトなループ中で参照するデータだと、数行の変更で大きな効果が
得られる場合もある。多次元配列のループ順序を入れ替えるとデータ
キャッシュのヒット率が劇的に向上するとか、テーブルのサイズを
2^n にしておくと検索が速くなったりとか。
数値演算とかやってるのでなければ、あまに気にしなくて良いと思うけど。
いろいろアドバイスありが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なわけです。
// そしてもちろんそのときには関数内部で実際に引数を変更しようとすればコンパイル通りません。
866 :
デフォルトの名無しさん :03/08/31 15:53
他ライブラリ(stdioとか)に依存しないフリーのiostreamの実装って在りますか?
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かどうかは関係ない。
>839 Comeauがあるってば。
>>861 レス有難うございます。
Effective C++という本の63ページにこう書いてあるのですが、
これはそういう意味なんでしょうか?
(すいません、初心者なんですがほかの本には、こういうnewの引数
の例が載ってないので解りません。)
>>862 ご指摘有難うございます。
あの、2行目のoperator deleteというのは、この場合はこう書かなければ
メモリが開放されないということですか?
その本嫌いで捨てちゃったから例題の意図がわかんないんだけど >Base *p1 = static_cast<Base *> (::operator new(sizeof(Base)*5)); こんなんじゃコンストラクタ呼ばれないんじゃない? 861みたいなんで万事OKと思うんですが。
>>873 レス有難うございます。
普通に割り当てると、管理用の追加データ領域が含まれるので、
小さいオブジェクトをたくさん割り当てる場合この方がメモリ
が節約されるって書いてあります。
はい、コンストラクタは呼ばれませんでした。
>>874 そうなのですか、有難うございます。
876 :
デフォルトの名無しさん :03/08/31 20:15
vector<Base *> base_vec; base_vec.resize(5); よーするにこういうことがしたかったのでは無いだろうか・・・
>>875 ....
Effective C++のp.63だな?
それ、operator newを実装するときの処理じゃんか。
ならそれでいいよ。
>>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 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";
}
遅くなりましたけど、863さん、867さん、868さん、 ありがとうございました。 868さんが書いてくれたルールの為、constで無ければ駄目 という認識でいいのかな? もう少し基礎的な所をしっかり勉強しないと駄目ですね。 また本買ってくるか・・・
いまさら
>>35 です。ちょっとほっぽいておいたんですが
おいたんですがやはり問題が再燃しました。
>>183 さんへ:
残念ながら targetは VC++じゃないのです。
組み込み系で、どんな compilerが使われるかわからんので、
処理系依存の方法はとりたくないし...
ちなみに static operator new とかを headerで宣言してやれば
いいのじゃないか、とか思いましたが、operetor new は externって
決ってるらしいですな。
どうやらしこしこ手で置き換えるしかなさそうな雰囲気です。
まったく、糞ライブラリめ...
895 :
デフォルトの名無しさん :03/09/02 02:16
クラスを継承することは出来ないの? operator newだけ書き換える形で。
お前ら、C++ のソースファイルの拡張子は何にしていますか? cc & hh 派? cpp & hpp 派? それともその他?
Win : cpp & h PS2 : cc & h
>>898 そういや、新しい(漏れの仲ではまだ新しいほうなんだよ)規格(?)では
<iostream.h> じゃなくて <iostream> って書くことになってるけど、
これはソースコード内に処理系依存の拡張子に関するごたごたを持ち込まないためなのかな?
a.h a.hpp なんかが混在する場合にどれが使われるかは処理系依存?
900 :
GNU 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 {
...
};
>>911 むむ、それもトリッキーですな。
しかしやりたいことはちと違って、
ヘッダは書き換えてもいいんだけどライブラリの version up
について行くのが面倒だからなるべく手をいれたくない。
って、感じです。
あと、classの new/delete operatorじゃ、
new char[m_size]とかにも対応できないし。
結局約100個の class宣言に : public MemManager とかいれて
primitive type の new[]、delete[]を手で置き換えてます。
やれやれ。
# M-x tags-searchえらい
うーん、やはり見当違いでしたか。申し訳ない。 要するに、標準のnewオペレータ自体を入れ替えるという事ですか。
いえいえ、アドバイスありがとうございます。 煽られなかっただけよかったです。 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 #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;
}
お、まだ反応がある...
>>915 さん、それも考えたんですが、 deleteの方が問題で..
それって別々の deleteが呼ばれるようになるんですかねえ??
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++プログラミングの落とし穴 ↑コレ読んだ人いる? どうだった?
>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); } みたいな仕掛けを用意すればよろしい。
なるほど、1byte無駄になりますがほしい機能は 実現できますな。 実はもう書き換えちゃった後だったりするんだけど その方法でもできないか暇ができたら試してみます。
普通のdeleteでたまたま先頭バイトが重なってしまった場合はいかがするのか?
ptr[-1]も読めない可能性はあるし
アライメントも考えないようなプログラムは組むなよ
ノーマルnewも自分で再定義すれば良い ・・・が、汚いな。
普通の 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)
>>944 さんきゅ、わかりやすい説明で理解できました
946 :
デフォルトの名無しさん :03/09/04 12:19
__gcってMicrosoft 仕様?それともStandard 仕様なの? Visual Studio って独自の拡張してるからよくわからないよ。
Managed C++?
>>946 '__'と'pragma'は処理系拡張のしるし。
>>946 .NETはC++よりC#の方がええよ。
俺はテンプレートのあるC++が好きやけど。
>>947 ガベージコレクション
('__')
953 :
デフォルトの名無しさん :03/09/04 22:03
おしえて! newしたときのメモリサイズってどうなるんですか? 私はC使いなんですが、Cの場合必ずサイズを指定するけど、 newってサイズ指定がありませんよね? 内部的にはどうなってるんだろ・・・ あと、operator newってなんでoperator new( size_t size)とか定義されているの? このサイズって何? newを再定義したら、 Unko* unko = new Unko( 100 ); とかやんないとだめなん?
__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 多分
959 :
デフォルトの名無しさん :03/09/04 23:08
ツールを開始できません。 この操作を正しく終了しました。 ツールを開始できません。 'vcspawn.exe' 実行時のエラーです。 ビルドを実行できませんでした。 というエラーが出てコンパイルできません。 解決方法を教えてください
>>957 sizeof(int)以上なのは確実だが、== sizeof(int)とは限らない。
そろそろ次スレよろ
963 :
デフォルトの名無しさん :03/09/04 23:34
#define private public #define protected public
>>955 ありがとうございます。
コンパイラは VC++ です。
「インライン展開」と「処理系依存の機能」というのはなんですか?
>>966 それはどこに住んでるのと聞かれた時、地球と答えてるのと同じです。
>>967 僭越ながら、そのたとえは違うかと。
「これについてしってる?」と聞かれたとき、「図書館で探せば」と答えているのと同じです
要するに的を射ている回答だと
質問はどこで調べればいいのかを聞いているのではないから 的を射ていないのは明らかだ。
そんなことより次スレ
972 :
デフォルトの名無しさん :03/09/05 00:44
逃げてぇー、早く逃げてぇー
まぁ答えてもいいけど、954には理解してもらえないかも。 インライン展開は関数呼び出しのオーバーヘッドを無くす代わりにサイズが大きくなる 処理系依存の機能というのは一般に処理系に依存した機能全体をさす。
976 :
デフォルトの名無しさん :03/09/05 00:51
梅梅
979 :
デフォルトの名無しさん :03/09/05 07:44
メモリの再利用について、その考え方や簡単なコード等を 教えていただけないでしょうか? もしくは、参考となるようなサイトがあれば、教えていただきたいのですが・・・・ おねがいいたします。
>>979 new で確保したメモリはdeleteするまで
開放されません。お好きなように利用して下さい。
ってことじゃないよな…
>>前スレの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
指定したディレクトリ内にあるファイル名をすべて取得する 関数はありませんか?
メンバ変数にデフォルトコンストラクタなんてあるのか?
990げと
ほーたーるの
>>987 C++標準ライブラリの中にはない。
boostならfilesystemあたり。
その他Win32API等の環境依存ライブラリには当然ある。
>>988 全ての組み込み型に0で初期化するデフォルトコンストラクタがある。
ひーかーぁり
>>992 >全ての組み込み型に0で初期化するデフォルトコンストラクタがある
ほんとに?
>自動では呼ばれない。 ってどゆこと?
1000!
ずさーーーーーーーーっ
げと
999 :
デフォルトの名無しさん :03/09/05 16:53
うめうめうめうめうめれんじゃーーー
1000get
ところで、
>>322 について誰か知りませんか?
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。