C++相談室 part23

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

過去スレ、関連スレ、関連リンクなどはこちら>>2-77
2v(^・^)v:03/09/05 00:51
3v(^・^)v:03/09/05 00:52
■基本■
[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/ (日本語)
おう、乙。でも前スレageたのはよくないね!
5v(^・^)v:03/09/05 00:53
6v(^・^)v:03/09/05 00:54
7v(^・^)v:03/09/05 01:00
8v(^・^)v:03/09/05 01:01
■関連スレ■
[【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
9v(^・^)v:03/09/05 01:11
10デフォルトの名無しさん:03/09/05 01:11
完了〜 連投規制イクナイ!
>>10
ヲ塚レー
v(^・^)v
↑何すか?これ
>>12
Z武の(ry
>>12
にこやかに♥
>>12
そういや以前別の顔文字にしようって案があったような
c(+_+)
c(*p p)
1716:03/09/05 09:27
あ、書いてから分かった
>>15はそういう意味か
わいの完敗や
>>1
乙。
でも 2ch の boost スレって、もう無いよね。
VC++7.1、とうとうboostのRegression testsで
PPass100%(warning 0), Fail0%(0)達成か。
>>18
templateスレに統合したんじゃなかったっけ?
typedef struct { int a } hoge_t;

// ソース内
{
hoge_t h;
if( h )
cout << "hit" << endl;
}

のように if( h ) を適応させるには
どうすればいいのでしょうか?
(オーバーロードする演算子は何か?)

現在は
bool operator!=( hoge_t a ); で演算子を定義してますが、
if( h != NULL ) となっています。
2221:03/09/05 11:33
ミスを訂正
>現在は
>bool operator!=( hoge_t a ); で演算子を定義してますが、
>if( h != NULL ) となっています。
bool operator!=( hoge_t a, int val );
でした。
>>21
基本はoperator bool();だが、整数への暗黙のキャストを排除したいなら
関数ポインタへのキャスト演算子を使う。
2421:03/09/05 11:58
>>23
参考書は 一通り目を通したのですが、operator bool() については
書かれていなかったので、ググってみます。
ありがとうございました。

bool operator!=( hoge_t &a int val ) ← & が抜けてました。
整数の暗黙のキャストですが、
#define NULL 0 を利用しただけで、特にキャストの意図はないです。
>>24
operator boolつーかキャスト演算子だな。
整数型への変換云々つーのはboolへのキャスト演算子が定義されてると
{
 Hoge moge;
 int hage = moge;
}
みたいのなのが通ってしまうつー話。
2621:03/09/05 12:28
>>25
なるほど、副作用もあるのですね。
修行が足りてませんでした。
てっきり
bool operator!=( hoge_t &a, int val ) {
if( obj.a == val )
 return false;
return true;
}
まで 見透かされてると思った次第です。

どっちにしろ 話がかみ合ってませんね^^;
もう少し詳しい参考書を購入します。

関数ポインタへのキャスト演算子とブール代数へのキャスト演算子を
定義したクラスだと、operator [] を定義できなくならない?

class ClassA
{
operator FuncPtr() const;
ValueType operator []( int index );
};

ClassA objA;
ClassA::ValueType val = objA[1]; // operator[] が特定できない?



2827:03/09/05 13:44
う(汗。ClassA 修正。

class ClassA
{
 ...
public:
 operator FuncPtr() const;
 ValueType operator []( int index );
};
29デフォルトの名無しさん:03/09/06 12:28
クラスの宣言の中のメンバ関数なんですけど、
inline をつけなくても問題ないですか?
ないです。
>>29
そうですよね。そんな気がしてました。
ありがとうございます。
29→>>30
inline化したくないときはどうすればいいんだろ?
って、普通に宣言すればいいだけか
>>28
publicかprivateかは作用対象の解釈には影響ない。
よって>>27のままでも質問としては成り立っている。

ところで、objA[1]という式の解釈にはどんな候補があると言いたいんだ?
objA.operator[](1)
までなら解るが
objA.operator bool()[1]
objA.operator Funcptr()[1]
はないだろ?
>>28
の質問の意図がサッパリわからん。
そんな変な演算子オーバーライドしたらソース読めなくなるぞ。
しかも[]で返すべきはリファレンスだろ。
> operator [] を定義できなくならない?
こんなの、やってみれば解決だろ。放置一択。
38デフォルトの名無しさん:03/09/06 13:47
>>36
演算子オーバーライドって何?
39デフォルトの名無しさん:03/09/06 14:02
便乗で質問です。
operatorってvirtualにできるんですか?
> operatorってvirtualにできるんですか?
こんなの、やってみれば解決だろ。放置一択。
41誰でも言える:03/09/06 14:07
こんなの、やってみれば解決だろ。放置一択。
こんなの、やってみれば解決だろ。放置一択。
43デフォルトの名無しさん:03/09/06 15:12
なんで(void*)0;はだめなんだろう
そんなの、やってみれば解決だろ。放置一択。
>>43
C言語プログラマハケーン!
日下部ポインターなんて過去の遺物さ。
47デフォルトの名無しさん:03/09/06 15:25
>>44
'void *' から 'char *' に変換することはできません。
と出ました
これだけだとわかりません
詳しく教えてください
C++ではvoid*はジェネリックなポインタじゃないのさ。
アブノーマルなポインタなのさ。
>>47
void* vp = 12345;
char* cp = 0;
cp = (char*)vp
>>47
ダウンキャストが暗黙にはできないのと基本的には同じことだ。
そのポインタが指し示す先にchar型オブジェクトがあることを
コンパイラは勝手には仮定しない。
C++の標準関数で、同じ符号か、異符号かを返す関数ありませんか?
関数にするとこんな感じだと思うのですが。

bool func (int a, int b)
{
  return ((a>=0 && b>=0))|| ((a < 0 )&&< (b < 0)) ? true : false;
}
>>51
標準関数は知らないが、
return (a >= 0) == (b >= 0);
でいいのか?

それとも、
return a * b >= 0;
か?
inline bool same_sign(int x,int y){return(x<0)?(y<0):!(y<0);}
引数に0があった場合の結果はどうなればいいんだろう?
5551:03/09/06 22:37
>>52-54
ありがとうございます。
関数テンプレートにして使わせていただきます。
0が来た場合は正で処理するつもりです。
>51
最上位ビットが符号ビットで処理系に限って、
(a ^ b) >= 0
5756:03/09/06 22:44
条件を変更。 「符号ビットが存在する処理系に限って」
(a ^ b) >= 0
>>57
符号ビットが0のとき>=0を表すという条件も必要だな。
59デフォルトの名無しさん:03/09/07 00:15
論理XORって
inline bool exclusive_or(bool x,bool y){return x?!y:y;}
こんな関数つくんないとダメ?
演算子だけで綺麗に書ける?
>>59
return x != y;
6159:03/09/07 00:27
>>60
それが>>59にくらべて優れたコードを生成するかどうかは結局CPU依存だから、
コンパイラが実装できるように言語仕様に含まれるべきではないかと思います。
 bool operator ^^ (bool,bool);
とか。
>>61
・・・・・・。
>>61
おまい馬鹿だろ?
6459:03/09/07 01:09
うぉ?漏れ、なんかヘンなこと逝ってるのか?
x != y; って言語仕様に含まれてないの?
>>64
!=こそがあんたの望む演算子だろうが
(mona == giko) != (sine == wara)

確かにキモいぞ
6859:03/09/07 01:44
!=を論理XORの代わりにするには両方をboolにキャストする必要があります。
なので、あんまり綺麗には書けなかったりします。
てか,>>27 に対する結論は結局何だったんすか? コンパイラのバグ?
VC++5.0 でも gcc 3.2 でも問題なかったけど
>>69 >>27の脳がバグってた、と。
>>68
キャストせんでも使える。ちゃんと試してから反論しろよ厨房。
ていうかbool型以外に論理XORなんか適用するなよ。
operatorだの暗黙変換は
主観の産物って知ってた?
>>72
ナニが言いたいのかわからん。てか知らん
7459:03/09/07 03:37
>>71
たとえば LessThanComparable の要件では、式 a < b の型は
bool ではなく、"convertible to bool" となっている。
これを != で比較しても論理XORの意味になるとは限らない。

似たような話で、Cのライブラリ関数 isupper を使って
isupper(a) != isupper(b) と書いても
論理XORを実装したことにはならない。

> ていうかbool型以外に論理XORなんか適用するなよ
論理値に比較演算子はよいと申すか?
潔癖性?
>>74
うるせータコ

!!a!=!!b
これでも使ってろ
!a != !bで十分だろ>>76
!isupper(a) != !isupper(b)でも
59が求める論理XORをもつ言語って何があるのかな。
>>78
perl

a ! b
違った
a xor b
81デフォルトの名無しさん:03/09/07 05:32
>>61
なぜ^^がないのか考えてみたら?
にこにこ顔に見えるから
確かにデバッグ中にそんな顔が見えたらムカつくな
for (; ;)//~~~
while(T_T)
86デフォルトの名無しさん:03/09/07 14:50
GoF本に気になる記述があったので、ちと疑問がわいたのですが、

さぁって、privateメンバ関数を公開しちゃうぞー、ええと…
friend Aには、このメソッドのみ公開
friend Bには、同クラスのこのメソッドのみ公開

なんて振り分けはできませんよね?
出来ない。
>>87
ですよねぇ、GoFめ…ちょっと期待しちゃいましたよ
レスサンクスです
>>86
friend class のことじゃないかな?
まぁそれでも意味不明だが
>>86
GoF今手元にないので、ちょっとずらして
相手ごとに一部を公開するにはって話として。
class Hoge {
 private:
 void ForA();
 class HogeForA {
  Hoge& hoge;
 private:
  HogeForA(Hoge& h):hoge(h) {}
  void ForA() { h.ForA(); }
  friend class A;
 };
public:
 HogeForA& FromA() { return HogeForA(*this); }
...
};
のように相手ごとにproxyとしてインナークラス作って
そちらにfriendつけてやるってことは出来るよね。
(hoge.FromA().ForA(); みたいに使う)
こんなC++はいやだ

int n;
cin(n);
cout("こんにちは") (n) (0.123) (0xfffff);

coutのストリーム入出力がoperator ()で実装されている
>>91
読みやすいですね。
cout にも括弧をつけるとなお良し。
今某サイトのC++初心者講座を読んでいたのですが、
ビット演算のところでその難しさにぶつかりました。

一応基本的な意味は理解したつもりなのですが、
上手くプログラムの中に組みこめるかと言われたらたぶん無理っぽいです。
実際にビット演算ってどのように使うのでしょうか?
ビット演算の応用というか実用例などを教えてもらえませんか?
環境で用意されるフラグの処理に必要なこともあるが
基本的にはわざわざ使わなくていいよ
>>94
おまい59じゃないだろうな

てか2進数勉強しなはれ
必要だから使うのであって、必要でないところに使う必要は無い。
>>94
例えば非同期ファイルI/OしようとするとOS固有のシステムコールを使うことになるが、
そのときオープンモードやシェリングモードの指定にビット演算をよく使う。

組み込みではICにコマンドを送るときにデータバスのmona番をH、giko番をLにする
てなパターンがよく出てくる。

どーせ最適化されてるよ♥ とタカをくくってたある日、なんか遅いんで
コンパイル結果のアセンブラ見たら16で割ってやがったなんてこともよくある。
try{
 char *p = NULL;
 printf("\s", p);
}catch(...){
 for(; ;)//~~~
  printf("ぬるぽ");
}
10094:03/09/07 18:23
応用は上級者の領域っぽいですね。正直言って難しいです。
今読んでいる講座にあった、
「44は44、81は84、というように、その数以上の4の倍数のうち最も小さい数を求める式を作って下さい。」
と言う問題の解答が、「(x + 3) & ~3」
なんとなく意味はわかるのですが、自分でこういう物を発想するのは難しいですね。
勉強して行けばこういう物も自力で考え出せる様になるのでしょうか?
既に才能が無いと思って諦めるべき?

>>96
59ではないです。2進数も一応分かってますよ。
>>100
加算器とかの仕組み勉強していじくりまわすとイメージしやすくなるかも。
あとはモノクロのグラフィック処理を行うときにはイメージが必要になってたけど
最近そんな用事あんまりないか?
>>94
>「(x + 3) & ~3」
コンパイル通らんぞ・・・
10394:03/09/07 18:31
スマン
^ じゃなく~だな
>>102
本当?
105103:03/09/07 18:34
OH 俺もタイポか・・・逝ってくる

上の>>103 は俺な
10694:03/09/07 18:36
103は私ではありません。

>>101
加算器ぐぐって勉強してみます。
解説には、ビットマップを扱う時に必要になる実用ルーチンだと書いてありました。
良く意味はわかりませんが、
色々やろうとするとこういうビット演算の修得も必要とされるみたいですね。

頑張れる所まで頑張ってみます。
>>105
タイ━━━||Φ|(|´|゚|ω|゚|`)|Φ||━━━ポ!!!
108デフォルトの名無しさん:03/09/07 20:54
初心者質問ですがよいですか?
クラスのpublic:の中に

hogehoge() : known1(""),known2(""),known3(""),unknown1(""),unknown2(""){munyamunya();}

といった記述があったのですが、このように関数の後にコロン一つで
区切って複数の関数名?を並べているのはどういう意味があるので
しょうか?本見てもそれっぽい記述が見つからないものですから・・・
すいません。
>108
調べるべきキーワードは「コンストラクタ」、「初期化」。
>>108
コンストラクタの初期化リストだろ?
111デフォルトの名無しさん:03/09/07 21:08
お二方、ありがとうございます
 int& a;
 int &a;

皆さんはどっち派ですか?
>>112
どっちでもいいから
このスレで意味無し論争を巻き起こそうとか思わないでくれ
スレ違いだ
RType f(T v);
の実体(定義)としてコンパイラが
RType f(const T v) {....}
を使うのは仕様で決まっているのですか?
>>112
C++では下の書き方は邪道。
>>114
意味わかんね
int* p;
int *p;
#include <stdio.h>

int hage(int i);

int main() {
hage(0);
return 0;
}

/* オーバーロードに非ず。int hage(int i) の定義なり。*/
int hage(const int i) {
printf("%s\n", "禿はドキュン");
}
>>118
foo(int);
foo(const int);

がそれぞれ定義できるとして
それらをどうやって呼び分けることができると思ってんの?
>>119
別にオーバーロードしたいわけではない
>>144
v=vができなくなるわけか。そいつは初耳だな
>>144
だそうですが、144さん。
>>144
いや、そのクラスの構造は美しくないと思うよ。
基本的にソースってのは書きやすさ(タイプ数の少なさ)より
読みやすさを優先すべきだし。

あと、細かいことだけど、その場合mutableを使うより
constをつけない方がいいんじゃないかな。
>>123
ここは mutable を使うべきだろ・・・と思うが好みの問題?
12559:03/09/08 01:27
お勉強してきました。
ttp://drn.maxwell.syr.edu/drn-bin/wwwnews?comp.std.c%2B%2B/39476

やっぱり論理XOR演算子ホスィ...
禿はどう思ってるんだろう?
>>125
禿って言うなーーーーーーーーーっ!
127デフォルトの名無しさん:03/09/08 03:04
バッファ管理をuint8_tなvectorでやるのってあり?
あり
129デフォルトの名無しさん:03/09/08 16:53
Cで手軽にエラーチェックといえばassertですが、
C++にも、C++らしいassertみたいなものは、あるのでしょうか?
>>129
Cと同様assertしかない。
例外投げるAssertとTraceクラス自前で作って使ってる。
>>130
レスありがとうございます。
当分はassertを使い、いずれ私も自前にチャレンジしてみます。
気になると先に進まないもので…助かりました。
あーあ・・・
うちのC++は獰猛で困っています。
>>133
困らなくていい。
>>129
強いて言えば Enforcement とか
http://www.cuj.com/documents/s=8250/cujcexp2106alexandr/

基本的には assert で十分足りると思うけどね。
136デフォルトの名無しさん:03/09/08 21:35
C++ってなんですか?おしえてください。
私のC++は狂暴です。
マクロやだ。やっぱC++用のスコープが効く仕掛けがホスイ。
namespace + inline でFA
call by nameをサポートしたC++がホシゥィ
>>136
C++=チンプラプラ
まぁ大体の意味はこんな感じ。
>>140
ならC++なんて使うな。
Objective-Cでも使ってろ
C++を勉強している工房です。

AというクラスとBというクラスがあるとして、
それぞれが、それぞれを参照するのはC++的にOKなんでしょうか?

例:
class A{
public:
B m_b;

}

class B{
public:
A m_a;

}

友達に聞いた話だと、上のような場合、相互参照といってC++的によくないとかなんとか聞いたんですけど・・・
コンパイルは通るみたいなんですけど、どうなんでしょ?

C++的にはOKだが、設計としてよくない。
>>143
参照もしくはポインタならいいが、それは不可だ。
>>143
コンパイルはできても実行不可能な気が・・
>>144
C++的にも無理な気が・・・
Aの中にBの実体入ってるし、Bの中にAの実態入ってるよ。
ポインタとかにしてAやBの外部に出さないと・・・
構造的によくないのは同意。
>コンパイルは通るみたいなんですけど
ほぅ コンパイラは何をご使用でしょうか?
>>143-144,146
合わせ鏡状態だ。sizeof(A)はいくつかな?
コンパイルすら通らない気がするんだが。。。
コンパイルが通るって友達に聞いた話なら、騙されてないか?
151その1:03/09/09 21:34
教科書的な+演算子のオーバーロードです。
class Uint64 {
int var;
public:
Uint64(int i) : var(i) {}
};

Uint64 operator+(const Uint64& lhs, const Uint64& rhs)
{
Uint64 tmp(lhs);
return tmp;
}

int main()
{
Uint64 u = 1;
u = 2 + u;
u = u + 3;
}
152その2:03/09/09 21:35
これをテンプレート化すると、うまくいきません。
template <typename T> class UINT {
T var;
public:
UINT(int i) : var(i) {}
};

template <typename T> T operator+(const T& lhs, const T& rhs)
{
T tmp(lhs);
return tmp;
}

typedef UINT<int>Uint64;

int main()
{
Uint64 u = 1;
u = 2 + u;
u = u + 3;
}
エラー!
153その3:03/09/09 21:36
回避法は下記以外にスマートな方法がありますでしょうか?
template <typename T> class UINT {
T var;
public:
UINT(int i) : var(i) {}
UINT operator+(const T& rhs){
T tmp(rhs);
return tmp;
}
};

template <typename T> T operator+(int lhs, const T& rhs)
{
T tmp(lhs);
return tmp;
}

typedef UINT<int>Uint64;

int main()
{
Uint64 u = 1;
u = 2 + u;
u = u + 3;
}
template <typename T> class UINT {
T var;
public:
UINT(int i) : var(i) {}
};

template <typename T> UINT<T> operator+(const UINT<T>& lhs, const UINT<T>& rhs)
{
UINT<T> tmp(lhs);
return tmp;
}

こーじゃねーの?
template <typename T, typename U>
T operator+(const T& lhs, const U& rhs)
{
T tmp(lhs);
return tmp;
}
156155:03/09/09 22:04
あー、>>154が正解だすな
157151:03/09/09 23:25
>>154
ご回答ありがとうございます。
が、残念ながらそれでは状況は変わりませんです。
158デフォルトの名無しさん:03/09/10 00:10
>>144
便乗ですが、やっぱり互いに知ってる状態が
出てくるようだと、設計として駄目なのでしょうか?

今自分のソース見たらそんなのばかりで…。
依存はなるべく少なくしようとは思ってるのですが、どうにも。

>>151-157
1: operator+ でなく operator+=( UINT<T> ) を定義して、
2: boost::addable で UINT<T>+UINT<T>, UINT<T>+T, T+UINT<T> を自動生成

UINTをimmutableにしたいってんだとツラいけど。
>>157
template <typename T> class UINT {
T var;
public:
UINT(int i) : var(i) {}
friend UINT<T> operator+(const UINT<T>& lhs, const UINT<T>& rhs)
{
UINT<T> tmp(lhs);
return tmp;
}
};
u = (Uint64)2 + u;
u = u + (Uint64)3;
162151:03/09/10 01:02
>>160
ありがとうございます!!
感激、感動、完動です。
friend関数のインライン展開??
実際にはreturnの前に
tmp += rhs;
を書くだけでOKですから、使えますね。
template <typename T> class UINT {
T var;
public:
UINT(int i) : var(i) {}
friend UINT operator+(const UINT& lhs, const UINT& rhs)
{
return UINT(lhs) += rhs;
}
};
164151:03/09/10 01:34
>>163
おお、シェイプアップされてる!!
return文の一行とは素晴らしいです。ありがとうございます。
ちなみに提示した例ではOKですが、実際のプログラムでは、<T>の省略はダメでした。
実は
typedef unsigned intUINT32;
typedef UINT< UINT32 >UINT64;
typedef UINT< UINT64 >UINT128;
typedef UINT< UINT128 >UINT256;
なんてことして使うんですよ。もちろん学習&遊び用に作ったんですけどね。
165158:03/09/10 02:23
すいません、気になりますが限界で…寝ます
166デフォルトの名無しさん:03/09/10 06:33
http://pc2.2ch.net/test/read.cgi/tech/1062507109/187
問1. C++言語の正しい学習法はどれか。次の中から選べ。
1. C言語と異なるコーディング方式を異端視し、そういうものは受け付けない。
2. 今までのC言語の方式を捨て、C++プログラマーとして生まれ変わる。
3. 自分が二重人格になったつもりで、C++の方式にも適応できるようにだけしておく。
167●のテストカキコ中:03/09/10 07:29
http://ula2ch.muvc.net/ (このカキコは削除しても良いです)
168デフォルトの名無しさん:03/09/10 11:45
>>166
仕事で使うなら3だな。
169デフォルトの名無しさん:03/09/10 13:38
a = 0のとき、
c = d + e;
a = 1のとき、
c = 2 * d + e;
・・・
a = 255のとき
c = d * (d + e);

のように、aの値によって、cに入れたい式が非規則的に変わります。
if 文や switch 文でずらずら書くのを使用せずに、
早い速度でこれを行いたいのですが、うまい方法はないでしょうか?
テーブルみたいなのを使用したいのですが、
値に式を持たせるのがわかりません。
170デフォルトの名無しさん:03/09/10 13:55
>>169
関数へのポインタをテーブルで持つ。
>>170
遅くなるだろ。
172デフォルトの名無しさん:03/09/10 14:08
boost::fsmで実装する>>170
ネタだが。
>>169
速くてうまい方法などない。
単に字面が気に入らないだけなら
#define begin_eval() switch(a){
#define eval(n, exp) case n: c = exp; break;
#define end_eval() }
とでもやっておけ。激しくキモいが
174デフォルトの名無しさん:03/09/10 15:05
inline int get_value() { return value; }

のような、インライン指定した関数があったとして、
他の関数に 関数ポインタとして get_value を渡した場合、

1. get_value 関数が作成され、インライン展開されない
2. get_value 関数が作成されるものの、直接呼び出している
  部分ではインライン展開される。

一般的なコンパイラはどういう処理をするのですか?
175デフォルトの名無しさん:03/09/10 15:10
2
176デフォルトの名無しさん:03/09/10 15:21
>>170
templateではコンパイル時にaの値が確定している必要があるし。。。むむむ
>169
実行速度という観点ならswitchが一番まともなコードを吐くコンパイラが多いと思う。
どうしてもってならこんな感じだが、いずれにせよ列挙しなきゃならないのは変わりないし、
switchと等速かそれより遅くなると思う。

int case_0(int d, int e) { return d + e; }
int case_1(int d, int e) { return 2*d + e; }
 :
int case_255(int d, int e) { return d*(d + e); }

int (* funcTable[])(int, int) = { case_0, case_1, ..., case_255 };


c = funcTable[a](6, 4);

まあ式は非規則的だけど、aの取りうる値より式の種類が少ないならswitchより
多少みてくれはいいかもしらんがね。
関数オブジェクトをテーブルで持ってみた。
関数ポインタよりインライン展開される分ましなはず。
ただしコンパイラを選ぶし実行速度も測ってない。
とりあえずCygwin GCC 3.2で動いた。

#include <iostream>
#include <boost/function.hpp>

template<int n> struct fn {};
struct fn<0> { int operator() (int d, int e) { return d + e; } };
struct fn<1> { int operator() (int d, int e) { return 2 * d + e; } };
struct fn<2> { int operator() (int d, int e) { return d * (d + e); } };

boost::function<int(int, int)> table[] = { fn<0>(), fn<1>(), fn<2>() };

int main (int argc, char** argv) {
  for (int i = 0; i < 3; ++i) {
    std::cout << table[i](5, 7) << std::endl;
  }
}
>>169
普通にswitchで囲った方がいいんでない。

template<int N>
inline int DispachFunc(int d,int e);

class Nothing{};
int Selectfunc(int a,int d,int e)
{
    int temp;
    switch(a){
    case 0:
        temp = DispachFunc<0>(d,e); break;
    case 1:
        temp = DispachFunc<1>(d,e); break;
    case 2:
        temp = DispachFunc<2>(d,e); break;
    default:
        throw Nothing();
    }
    return temp;
}

180デフォルトの名無しさん:03/09/10 17:29
問題やってもらえませんか?

1.要素が3つある整数型の配列 A[3] をプログラムの中で初期化( {3,5,7} )し、その配列と文字列 "TEST" を、ダイナミックアロケーションによって確保されたメモリへ格納する。何かキーを押されたら、プログラムを終了する。

2.次に示すような文字列の配列データを順にスタックへ格納し、取り出すプログラム。コマンドは、 "i" で格納、 "o" で出力、 "e" で終了とし、スタックを操作する際扱った文字列を画面に出力する。上下限を超えたらメッセージを出力し、エラー処理を行なう。
char *w[7];
w[0] = "Monday";
w[1] = "Tuesday";
w[2] = "Wednesday";
w[3] = "Thursday";
w[4] = "Friday";
w[5] = "Saturday";
w[6] = "Sunday";
>>180
宿題スレに書いたあとで、ここにも書くのかよ、いい度胸だな。
182●のテストカキコ中:03/09/10 17:38
http://ula2ch.muvc.net/ (このカキコは削除しても良いです)
183デフォルトの名無しさん:03/09/10 17:39
181のような煽りはスルーします。
>>181
その度胸をたたえて答えてやれ。
185169:03/09/10 18:08
いろいろ案をありがとうございます。
もともとはswitchでやっていたところでしたが、
>>177の方法にしたら9割程度の速さになりました。

>>178は私には理解不能でした。
>>181
1番だけな
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(){
int A[3]={3,5,7};

int *pt_i;
char *pt_c;

pt_i = (int *)malloc(sizeof(int)*4);
pt_c = (char *)malloc(sizeof(char)*5);

pt_i=A;
strcpy(pt_c,"TEST");

free(pt_i);
free(pt_c);
}
sizeof(char)キターーーーーーーーーーーーーーーーーーーーーーーーーーーーーッ!!
188デフォルトの名無しさん:03/09/10 18:35
>>178の方法は関数オブジェクトのインライン展開を利用したもので、
コンパイル時に<>内のパラメータが確定していればcall命令は生成
されないはず。
但しfor文を展開するなどの面倒な仕事をコンパイラがしなくてはいけ
ないし、いつもfor文とは限らない。
>>186
180のレベルにお似合いの低脳なソース。めでてえな。
charのサイズは固定です。
ID無しっておもろいな
ここは「C++相談室」です。
<stdio.h>な方、 mallocな方、strcpy()な方はお帰りください。
>>188
> コンパイル時に<>内のパラメータが確定していればcall命令は生成
> されないはず。
確定してないとコンパイル通らないし。

> 但しfor文を展開するなどの面倒な仕事をコンパイラがしなくてはいけ
> ないし、いつもfor文とは限らない。
たまたま実行例をforで書いただけで、テクニック自体はforは無関係。

それよかboost::functionのオーバーヘッドが気になるところ。
191==186
>180のためにソース書いてて罠にはまったんだけど
前方宣言って同一ソース内じゃ役に立たないのね。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=143
196空き缶☆:03/09/10 20:11
今度コンパイラをvisual c++に変えようとおもうのですが
インストールの時に表示されるプロダクトIDには何と入力すればいいですか?
CDだかケースだかに書いてあるIDだよ。
198空き缶☆:03/09/10 20:16
探しましたが、書いてなかったんです。
199デフォルトの名無しさん:03/09/10 20:26
ケースにシールが貼ってあるはずなんですが...
>>193
> それよかboost::functionのオーバーヘッドが気になるところ。
渡してるのが stateless_function_obj なので仮想関数不要で、
 function::operator() ← inline展開を期待
   (*function.invoker)()
      fn<n>::operator() ← inline展開を期待
関数ポインタcall一発になるはず。うまく行けば。
ヨドバシ逝って製品版買って来い。大体すれ違い。
202空き缶☆:03/09/10 20:31
すいませんでした。
>>200
ども。関数ポインタテーブルとコスト的には変わらない様ですね。
fn<0> と fn<1> は別な型なのに無理矢理押し込めてる所為で、
boost::functionが何かやってるとおもったら、案の定。
>>202
ここにのってるぬょろー。
ttp://www2.strangeworld.org/uedakana/
>>204
今時こんな部落らで落ちるPCってあるのか?
>>205
「空き缶☆」は明らかに割れ厨だろ?
漏れは204はURLで透明アボーンになってて気づかなかったが。
>>186は、よくも堂々と大間違いを書き込めるな。
eejan
210174:03/09/11 08:46
>>175
なるほど。
コンパイラって結構賢いんですね。
ありがとう
コンパイラはなんていうかネ申
クラスのオーバーロードで定義した後置++が
そのクラスが参照される前に呼び出されてるみたいなのですが
これは仕様でしょうか?
Var a(10);
printf("%d\n", a++ + 1); ・・・ 12
213212:03/09/12 00:23
自己解決しました。忘れてください。
前スレでお世話になったものです。
で、今回ちと compiler の bugっぽいものを発見したんだけど、
もしかして仕様の versionによる違いかなあ、とか思ったので
教えてくれろ。

問題は:

class hoge {
 typedef enum {tako, ika} uni;
 struct huga {uni a; int b};
    :
};

となってるクラス定義がエラーになってしまうことです。
正確には hugaの行で "uniに accessするのはまかりならん" というような
errorがでます。
compilerの bugやんけ、といいたいんですがなんか理由があったりするの
かしらん?
ちなみに VC++や GNU C++では通してくれました。
>>214
そのコンパイラが正しい。

11.8 -1-
"The members of a nested class have no special access to members of an enclosing class,
nor to classes or functions that have granted friendship to an enclosing class;
the usual access rules shall be obeyed.
The members of an enclosing class have no special access to members of a nested class;
the usual access rules shall be obeyed."
216215:03/09/12 10:43
ごめん。
ttp://std.dkuug.dk/jtc1/sc22/wg21/docs/cwg_defects.html#45
ってことで、
11.8 -1- は以下のように変更されるそうだ。
"A nested class is a member and as such has the same access rights as any other member."

ということで、そのコンパイラが Defect Reports に追いついてないってことみたい。
「仕様の versionによる違い」と言える。
MSVC5.0なのですが、変数内の文字列置換はどうやってするのでしょうか?

教えて頂けると光栄です。
VC5.0ではできない。VC7.1ならできる。
219デフォルトの名無しさん:03/09/12 15:53
質問です。
下のHogeクラスの内部構造体
Dataの set関数をクラス定義の外に書くにはどうすればいいでしょうか?
set関数は、 引数_a を メンバー変数 a に代入する関数です。

class Hoge
{
public:
    struct Data
    {
       void set( int _a );
       int a;
    };
};
220デフォルトの名無しさん:03/09/12 16:02
>>219
void Hoge::Data::set(int _a)
221デフォルトの名無しさん:03/09/12 17:48
template<typename T>
class A{
long method(){
   if( T = long){
...
   }else if(T= float){
...
   }else{
...
   }
}

みたいな感じで
特定の型の時だけ、分岐したいのですが
どうすればいいのでしょうか?
222デフォルトの名無しさん:03/09/12 17:48
==でした
>>221
特別バージョンとか?
>>221
実行時に分岐したいならtypeidでできるかも
無駄としか思えないが
>>221
#include <iostream>

template <typename T> class A
{
public:
    long method();
};

template <typename T> long A<T>::method()
{
    return 0;
}

template <> long A<long>::method()
{
    return 1;
}

int main()
{
    std::cout << A<char>().method() << A<long>().method() << '\n';
}

これコンパイル通ったんだけど(VC7)、標準に準拠してる?<規格博士
>>221
特殊化するのが面倒ならば、

template< typename L, typename R >
struct comp_type{ enum{ value = false }; };

template< typename T >
struct comp_type< T, T >{ enum value = true }; };

を使ってみるとか。
>>221
boostをしらべて。
>>221
lokiをとしらべて
>>221
ずばり、Lokiですな。
230221:03/09/12 20:49
モダンC++デザインの本に載ってた
うらお2の本にもヒントのってた
なんとなくわかった。
ありがd
231二一四:03/09/13 00:32
>>215 バグともいいきれんのですね。むーん。
バグだとしてもすぐ直る訳はないので、
uniを外に出したりしてごまかすしかないのですが。

そんなことより、1よ、ちょっと聞いてくれよ。愚痴だけど。
今日は templateの instantiationではまってドキュメント
読むのに1日費やしちゃったよ。
結局 compile optionひとつつけて回避できたけど。
まあ、勉強にはなったけどな。そこらへん、実践的に
書いてある本でも読んでみるか。
232デフォルトの名無しさん:03/09/13 01:14
class ってさ
宣言すると勝手にメソッド作られるだろ
コピーコンストラクタとか
operator= とか
その他いろいろ。

それを全部知りたいのですが、
サンプルのソースか何か
掲載しているページでもいいです。
教えてください。
233デフォルトの名無しさん:03/09/13 01:18
・からすが異常な時間に鳴く
・雲が地震雲と一致
・ゴキブリの大移動
・雷が雲の上に突き抜けたらしい・・
・最近動物がうるさい
・FM波が大量発生
よって2辺とその間の角が等しいので
95%の確率で  だ  い  じ   し   ん   の予感・・
コピペしてチョ
・からすが異常な時間に鳴く
・雲が地震雲と一致
・ゴキブリの大移動
・雷が雲の上に突き抜けたらしい・・
・最近動物がうるさい
・FM波が大量発生
よって2辺とその間の角が等しいので
95%の確率で  だ  い  じ   し   ん   の予感・・
コピペしてチョ
>>232
規格書を読みましょう。
>>232
「ワンポイント・レッスン 最新Windowsプログラミングテクニック」の719ページを見れ。
237232:03/09/14 03:52
>>235,236
いや、
大体知ってるんだよ。
でも、書くのめんどくさいんだよ
コピペさせてくれよ
>>237




             し                    ね




>>237
知識はお金に換算できる。それを無料で教えてくれくれ君は基本的に
逝ってよし。
borlandC++のC++講座のHP無い?ほとんどがVC++の講座で困ってる。
すれちがい
borlandに拘っている理由による
単に無料だからって理由なら虫よすぎ
ちょっとC++をかじってみる程度だからフリーコンパイラ選んだんだが
やっぱり金払ってVCをやるべき?
C++の雰囲気を感じたい程度ならVCなんぞいらんだろ。
雰囲気って言ってもなぁ。
使う側からすればC++はマスターしてる度合いで全然違う言語と化すぞ。
>>240
ここは? 今見つけたんだけど参考にどうぞ。
ttp://homepage2.nifty.com/rohizuka/ka/pa_003_a.htm
ジサクジエーンの宣伝
>>246
いいね。そこで勉強するよ。
CustomVertex vertices[] =
{
{ -1.0f,-1.0f, 0.0f, 0xffff0000, },
{ 1.0f,-1.0f, 0.0f, 0xff00ffff, },
{ 0.0f, 1.0f, 0.0f, 0xffffffff, },

};
HRESULT hr = d3ddev_->CreateVertexBuffer( 3*sizeof(CustomVertex),0,
D3DFVF_XYZ | D3DFVF_DIFFUSE, D3DPOOL_DEFAULT, &d3dvb_, NULL);


3*sizeof(CustomVertex)がカッコ悪いので
sizeofだけで済ませたいのですが、どうすれば配列の要素数が分かりますか?
>>249
sizeof(vertices)/sizeof(CustomVertex)
>>249
template<class T,int N> int alen(T (&)[N]){return N;}

alen(vertices);
C++の本を買おうと思うんだけどお勧めの本とかあったら教えて欲しいです。
ちなみに、自分はほぼ完全な初心者です。
ネットで基本的な事は大体調べましたが、
意味がちゃんと理解出来てるか怪しいレベルです。
>>252
まず英語を読める環境(自分も含めて)を整えて、規格書とboostドキュメントへgo。
本など要らぬ。
>>252
スレ違い
いやいや「相談室」の名にふさわしい相談だ
>>255
やっばりスレ違い
おれはどうだっていいんだけど。
>>252
ここみた?
http://pc2.2ch.net/test/read.cgi/tech/1060693125/l50
仕切りたがる奴がいるな
>>257
だったら >>252 の手とり足とり 相談にのってやれよ
>>258
助長すんな
はぁ、ちょっと疲れたな・・・
>>252
>意味がちゃんと理解出来てるか怪しいレベルです。

ライバルを探せ。これ最強。
>>260
そんな時にはコレ。
http://www.yunker.org/
MSDNライブラリのオンラインヘルプを一括ダウソするソフトって需要ある?
Nothing
欲しい。クレ
>>265
作っていただけませんか?
できればフリーで。
ダウンロードしたものをクレ
>>263-267
作りたいと心から思っているおまいらにぴったりのプログラムがあります。
ttp://ido.nu/kuma/projects/_gu/
初心者から上級者まで、このソースをベースに頑張れば現実を物にすることができます。
269:03/09/18 19:35
C言語で文字列を解析する関数を作りたいんですけど、
char同士の代入のあたりでコアダンプしてしまいます。
どうすればいいか教えていただけませんか?

$ cat whyerror.c
#include <stdio.h>
#include <stdlib.h>
int test(char ** string_ptr, char * string) {
    int len = 0;
    *string_ptr = (char *)malloc(sizeof(char));
    while (*string) {
        printf("%d: %c\n", ++len, *string++);
        *string_ptr = (char *)realloc(*string_ptr, sizeof(char) * (len + 1));
        **string_ptr++ = *string++; /* ??? */
    }
    **string_ptr = '\0';
    return 0;
}
int main(void) {
    char * string;
    char * result;
    string = "this is test!";
    test(&result, string);
    printf("result: %s\n", result);
    return 0;
}

$ gcc whyerror.c -Wall; ./a.exe
1: t
2: i
Segmentation fault (core dumped)
>>269
スレタイ255回読み直してから出直してこい
271:03/09/18 19:42
>>270
ご、ごめんなさい。。。
ぜんぜん気付きませんでした。
逝ってきます。
>>270がいいこと逝った。
文字列の解析とかCではやりたくない罠。
std::string / boost::regex とか使えば早いかも。
273:03/09/18 19:49
>>272
でもそれ以前に、/* ??? */ の一行が間違っていそうな気が
するんですが、何がどう間違っているかが分からないんです。
ポインタの扱い方を勘違いしているのかな?
charにcharってそのまま代入してもいいんですよね?

#どこで聞けばいいのか分からない・・・。
#宿題じゃないけど宿題スレにでも行こうかな。。。
>>273
C言語なら俺様に聞け! Part 64
http://pc2.2ch.net/test/read.cgi/tech/1061779941/

ちなみになんで落ちるかっつーとreallocの第一引数がmalloc/reallocで確保された
メモリ領域を指していないから。原因はstring_ptr++;
>>263
作って!作って!どっとこむ!
276:03/09/18 20:19
皆さん、ありがとうございました。

C言語なら俺様に聞け! Part 64
http://pc2.2ch.net/test/read.cgi/tech/1061779941/663-
に再投稿しました。
277デフォルトの名無しさん:03/09/19 14:22
あるクラスが継承クラスをコンパイル時に選択できるようなtemplateクラスって作れます?。
template<class T:public CA>class TCA{/**/};←こんなの?
>>277
可能。
どういう効用があるかはModern C++ Design参照。
template <class T, class B>
class M : public B
とかじゃなくて?
280デフォルトの名無しさん:03/09/19 14:59
モダンですか・・・C++始めて3週間の私にはちょっと難しいですね。
class CA{};
class CB{};
template<class T>class TCA{
class T:public CB{};
};
main(){
TCA<CA> tca;/*じゃあ、こんなのは?*/
}
>>280
もうちょっと文法見直してホスイ
つーか、別に今すぐ覚えて使おうとせんでもいいと思うんだが。
283デフォルトの名無しさん:03/09/19 15:17
文法的にエラーなのは解るんですが、そうではなくてtemplate引数としてあたえられた型情報に、
コンパイル時に継承クラスを付加できるか?ということなんです。
わかりにくい例ですいませんでした。
>>283
意味わかんないよ。
どういうふうに使いたいのか、使用例を書いてみるのはどうか。
しかし、テンプレートに与えられた型のほうの存在自体を修正するってこと?
だとしたらかなり無理があるが。
285デフォルトの名無しさん:03/09/19 15:27
やっぱ無理そうですね。常識的に考えれば無理があるのは解ってるんですが、C++ぐらい自由度の高い
言語だと何かやりかたがありそうな気がしたんです。
静的な型付けされた型そのものを書き換えるわけにはいきませんよねぇ。
もしできたら、JAVAのObject型の無条件継承とかできるような気がしたんですが。
>>285
なんだか知らんが、勘違いをしているようだぞ。
ほんとうにやりたいことは、たいていできる。
しかし、やり方を間違えればできないものだ。
>>285
無条件継承? どういうことがいいたいのかまだよくわからないや。

template <T: CB> class TCA {
T t;
};
と書いたとき、クラスTCA<T>におけるメンバtの型Tは、
引数として与えられた型をCBの派生に修正して使う、ということ?

例えばここで class CC: public Object { ... }; というクラスがあったとき
TCA<CC> における t の型は
Objectの派生のCCであるだけでなく、さらにCBを派生元とするように
多重継承が追加された新たな型になっていることを期待しているってこと?

継承元にCBが含まれているクラスしかパラメータにすることを許さないとかならできるんだが。
template <typename T,typename Base>
class hoge{
    
    template <bool> class type;
    template <> class type<false>{
    public:
        class type:public T,public Base{};
    };
    template <> class type<true>{
        typedef T type;
    };
public:
    type<SUPERSUBCLASS(T,U)>::type t;
};

これでHoge<T,Base>::t はBaseから派生してなければBaseを追加で継承したものになるし、そうでなければTそのものになる(Baseから2回派生しない)
SUPERSUBCLASSはModern C++ Designかloki参照。
289288:03/09/19 16:29
>>type<SUPERSUBCLASS(T,U)>::type t;
type<SUPERSUBCLASS(Base,T)>::type t;
だ。
>>285
こんなのは
class base{};

template<class T>
class sub : public T
{};

template<
    template<class>class TSub,
    class T = base>
class Test
{
public :
    typedef TSub<T> InStruct;
};

int main()
{
    typedef Test<sub>::InStruct MakeStruct;
    return 0;
}
291290:03/09/19 17:31
うわぁ〜。恥ぅいね。
掲示板を作ろうと思うんだけどC++でも出来る?
perlとか言うのじゃないと無理?
>>292
できる。ていうか大抵の言語でできるよ。
294デフォルトの名無しさん:03/09/20 03:59
operator->* ってなんですか?
>>293
thx
頑張ってみるよ。

ちなみに難易度としてはどれくらい?
@2ヶ月くらいで作りたいんだけど。
ちなみにほとんど初心者です。

HSPならシューティング〜RPGまで作れたんだけど
これじゃプラス要素にならないよね・・・_no
>>295
c++<perl<PHP
>>295
多分2ヶ月じゃ無理だと思う。

出来たとしても使い物にならない予感。
>>294
メンバへのポインタ。
>>296
PHPちょっと調べてみたんだけど、
CGIより速くてサーバ負荷も小さいみたいな事が書かれてたんだけど
でもサーバの1機能として動作する、ってのが気になった。
フリーのHPスペースでPHP置ける所ってあるの?
そういう質問は板違い。
あ、スマソ。専用のスレ探してきます。
302294:03/09/20 04:57
正直、なんだこりゃです。

class A
{
public: int operator->* (int a) // 引数と戻り値はなに?
{
return 50 + a;
}
};

#include <iostream>

int main()
{
A a;

int n = a->*(10); // いや、なにこれ?

std::cout << n;

return 0;
}


何のために使うかというと、だいたいはスマートポインタ用なわけだよ。
struct A{ int i};として、
スマートポインタ      ふつうのポインタ
smart_ptr<A> pA(new A); A* pA=new A
int A::* pi = &A::i;      int A::* pi=&A::i;
pA->*pi=40;         pA->*pi=40;
  ~~~こいつが、operator->*
スマートポインタじゃなくて
まずメンバ関数へのポインタだろ。
302をうけて、(operator ->* を実装するようなクラスは)
だいたいスマートポインタ、という意味ですが。
306デフォルトの名無しさん:03/09/20 10:34
#ifdef __cplusplus
extern "C"
{

ってどういういみですか?
>>306
寝た早めて。
308306:03/09/20 10:57
>>307
ネタじゃありません。
ソースの他のプログラムとかはわかるのですが、
そういったところの意味を理解せずにきてました。
C++はCに非ず
条件付コンパイルって奴ですな。
確かに、コンパイルそのものについて書かれている本は少ない。
VC++のプリコンパイルヘッダを見たときは
「何だコイツ、何がしたいんだ?」
と思ってた。
プログラミングのほとんどは独学でできるけど、
やっぱりすぐ得られるリソースは仕事仲間だと思う今日この頃。
追加:
CはC++に非ず
>>306
要するにコンパイラがCかC++かを判断する為
Bjarne Stroustrup
って
何て読むんですか
はげ
ワラタ
ttp://www.research.att.com/~bs/Bjarne.jpg
このスレの住人は、これを壁紙にしなさい
とても嫌な
デスクトップになったので
やっぱり、やらなくていいです。
318312:03/09/21 00:40
カタカナで教えてください
教えてくれないと
壁紙設定します。
C#って胸キュン?

template使えるの?

D言語って胸キュン?

どんどん言語増やさないでください。
C++より劣ってたら怒ります
>>319
C# は俺的には萌え。
template (のようなもの)は来年に出るバージョン以降つかえるようになる。

D は俺的にはいまいち。
まあ、無理やり萌えれないこともない。
スレ違いにレスすんな
うるせー馬鹿
眠いので、もう寝ますね。
おやすみなさい。
>>315
って、ネタじゃなかったのね。
>>318
「ハゲ」だよ。
>>313の平仮名じゃ満足できなかったのか?
OOの偉い人はみんなみごとなハゲだぞ!
ハゲだけじゃ誰が誰だかわからないじゃないか!
偉くなるとハゲるのかー

プログラマー辞めます。
ちょっと前だけどよー

ザビエル頭の奴が電車にいて
ハゲは嫌だなーと思って、なんとなく頭見てたら、

睨まれた。

睨まれたので「何、見とんねん」と言ってやったら、
「外見とるねん」と返された。

返す言葉がなかった。

むかつくので、電車降り際に後ろから膝蹴り居れてやったら。
「おまえ、さっき蹴ったやろ?蹴ったやろ?」
と、ホームで大声で騒ぐの。
「訴えてやる」とか言い出したの。

恥かしいったらありゃしない。

これだから、ハゲは嫌いなんだ。
コンプレックスもちすぎなんだよ。
マイナス思考過ぎるんだよ。
いつも、くだらないこと考えてそうなんだよ。

ちくしょう。


うるさいので、とりあえず、謝りました。

私の負けですか?そうですか。
こんなとこで、つぶやいてるだけと言うことでお前の大負け。
330デフォルトの名無しさん:03/09/21 15:29
初歩的なことなんですが、
ファイル大きさを得る最適なコードを教えてください。
または、ファイルサイズを得なくても、許される限り、ファイルの終わりが来るまで
バッファを拡張していきながらファイルから入力するコードを教えてください。
宜しくおねがいします。
>>330
末尾にfseekしてftell
>>330
最適の基準による。重視したいのは移植性、それとも 2GB over のファイルへの対応、
あるいは性能か?
>>330
>または、ファイルサイズを得なくても、許される限り、ファイルの終わりが来るまで
>バッファを拡張していきながらファイルから入力するコードを教えてください。

いいのがあるがスレ違いなので回答できない。
UNIXやWindowsなど特定の処理系の板かスレで聞くといい。
ぢゃあ、このスレ的な回答は、
void f(std::istream &i, std::string &s)
{
while(i){std::getline(i, s); s += '\n'}
}
ということでよろしいか?
>>334
STLPortのstd::stringは意外に小さいサイズでポッキリ逝っちゃうから
std::ropeを使った方がいいと思う。
336デフォルトの名無しさん:03/09/21 20:21
プログラムを使わない会社っていっぱいあるよな?
ファイルサイズを得たいなら、末尾にfseek()してftell()、2GBを超えそうならfgetpos()でいいんでないの?
>>336
は?
>>337
fpos_t の内部表現は実装依存だから、fgetpos() しても、一般的な方法では
そこからファイルサイズを取得できないぞ。
>>337
C++ではタブー
341デフォルトの名無しさん:03/09/21 20:45
342デフォルトの名無しさん:03/09/21 21:15
変な質問ですけど
だいたいの人はテキストではなくborlandとかmicrosoftの開発支援ソフト
つかってるんですよね?
>>342
どういう比較?
>>343
windows付属のテキストエディタのみでプログラムを完成させるのが
一般的なのか、作成支援ソフトをつかって作ってるのが主流なのか聞きたいのです。
最低でも秀丸レベルは使ってるだろうなぁ>エディタ
edlin使ってます
ありがとう
>>344
うーん、言葉の定義がアレだが
MicrosoftやBorland, Metrowerksなどは統合開発環境を製品として売り、
コンパイラはその中のパーツでしかないので
それらを買った人は普通統合開発環境で使うが。

コンパイラだけが入手できるものならば(GCCやBCCなど)、
そのほかに自前で調達したエディタなどを使うのが普通。
>>344
開発ターゲットによる。

Windows アプリを C++ で書くなら VC++.net が大多数で、ついで Borland C++ Builder や
Intel C/C++ Compiler などが少数。エディタは統合開発環境のを使う人もいれば、
Vim, Emacs, 秀丸, MIFES とか使ってる人もいる。

Linux や *BSD だと、処理系は gcc が標準。数値計算をやる人は Intel C/C++ Compiler
使ってる人もいるみたい。標準的な統合開発環境がないので、だいたい好きなエディタを
使ってる。
便乗だけどcygwin+KDE+KDevelopとかの人居たりするのかな
ちょっと気になって。
C++ BuilderがwxWindowsサポートするみたいだけど…
352デフォルトの名無しさん:03/09/22 01:50
代入演算子って継承されないわりに、オーバロードする時にvirtualつけても
コンパイル通るのはなぜですか?
>>350
そもそも動くのか?
354350:03/09/22 02:44
>>353
さぁ、動かしてみないと(^^;
実験してみるか・・・
>>352
> 代入演算子って継承されない
意味不明。

struct B {
 void operator=(const B&) { cout << "B" << endl; }
};
struct D : B {};

int main() {
 D d1, d2;
 d2 = d1;
}

で B と出るはずだが。
356デフォルトの名無しさん:03/09/22 12:37
338 名前:デフォルトの名無しさん 投稿日:2003/09/21(日) 20:22
>>336
は?


は?・・・じゃねぇよカス
>>356
はぁ?
>>355
それは違うだろう。

> D d1, d2;
> d2 = d1;
で呼び出しているのはD::operator=(const D&)で
B::operator=(const B&)ではない。
D::operator=(const D&)はBから継承したのではない。

嘘だと思うなら、これをやってみろ。

int main() {
 B d1;
 D d2;
 d2 = d1;
}
359デフォルトの名無しさん:03/09/22 12:57
>>353
動くよ.てか使ってます.
360デフォルトの名無しさん:03/09/22 17:16
lpXXX->lCount

のようなデリファレンス(?)がfor内で繰り返し使用される場合、

LONG lCount2;

など変数に値をいれてそれをfor内で用いた方が
実行速度は速くなるのでしょうか?
>>360
誰も答えないね。
答えは、速くなる可能性はある。レジスタ変数に割り当てられたりとかでね。
ところで、デリファレンスって何よ? デリヘルの仲間?
362352:03/09/22 19:34
私が聞いてるのは、継承されるかされないかってことじゃなくて、なんでvirtualつけてもいいのかってことなんです。
virtualつけてもコンパイル通るから、代入演算子が継承されると思っちゃう人が出て来るわけで、
かくいう私もそうだったし、そんなリスクを追ってでも許可する理由があるのかなと想像するわけです。
363デフォルトの名無しさん:03/09/22 20:27
>>362
継承とは関係なく、オーバーライドの問題。
virtualありとなしでは違う動作するのはわかるよね?
使い道があるかどうかまでは知らん。
>>362
使い道はあるだろうけど、あんまり意味なさげ。
これに関しては出来ないほうがよかったのかもね。
>>362
virtual付ける事によって
「ああ、ここはオーバーライドするから代入の処理が違うんだー」
と、理解する事ができる。
366デフォルトの名無しさん:03/09/22 20:53
地図を表示するプログラムを教えてください。
#include <iostream.h>

int main( int argc, char** argv ){
cout << "地図" << endl;
return 1;
}
368デフォルトの名無しさん:03/09/22 21:03
>>367
おいおい、ちゃんと教えてやれよ。

#include <iostream>

using namespase std;

int main(){
cout << "地図\n";
}
>>367-368
お前ら何書いてるんだ!!

main(){printf("地図");}

に決まってるじゃねーか
ヘッダファイル?
コンパイラに任せろ
370デフォルトの名無しさん:03/09/22 21:09

                                    ┌─────┐
                                    │        │
                                    │ 北海道  │
                                    │        │
                                    ├────┬┘
    この地図を表示できるプログラムを教えてください。                                │青 森  └┐
                                    ├──┬──┤
                                    │秋田│岩手│
                        ┌──┐       ├──┼──┼┐
                        │石川│       │山形│宮城│└┐
      ┌──┬──┬──┬┐  ├──┼──┬──┼──┼──┤ └┐
       │山口│島根│鳥取│└┐│福井│富山│新潟│群馬│栃木│福島│
  ┌──┬──┼┐  ├──┼──┤  └┬──┼──┼──┼──┼──┼──┼──┤
  │佐賀│福岡│└┐│広島│岡山│兵庫│京都│滋賀│岐阜│長野│山梨│埼玉│茨城│
  ├──┼──┤  └┼──┼──┤  ┌┴─┬┴─┬┴─┬┴─┬┴──┼──┼──┤
  │長崎│熊本│大分│愛媛│香川├─┤大阪│奈良│愛知│静岡│神奈川│東京│千葉│
  └─┬┴──┼──┼┐  ├──┤  └┬─┴─┬┴─┬┴──┴───┴──┴──┘
     │鹿児島│宮崎│└─┤高知│徳島│和歌山│三重│
┌──┼───┴──┘   └──┴──┴───┴──┘
│沖縄│
└──┘
371デフォルトの名無しさん:03/09/22 21:10
>>369
C++スレなんで、ヘッダーまたはprintfのプロトタイプがないとエラーでコンパイルできないよ・・・
372デフォルトの名無しさん:03/09/22 21:15
ほかの地図でもいいんですが何かいいアイディアありませんか?
ビットマップなり何なりを読んで表示すれば?
ビットマップを読むライブラリはその辺に転がってるだろうし、
それを表示するのは簡単じゃん。
#include <iostream>
using namespace std;

int main(void){
 cout << "地図" << endl;
 return 0;
}
375デフォルトの名無しさん:03/09/22 21:21
すいません。それを表示するレベルにも達していないので
表示するプログラムを教えてください。お願いします。
>>375
・・・・・で、どうしてC++でなんですか?
ここでも逝ってこい
誘導されたと言うのを忘れないようにな

(つД`)C/C++の宿題は私にやらせてよ!Ver12
http://pc2.2ch.net/test/read.cgi/tech/1060706382/
378デフォルトの名無しさん:03/09/22 21:25
学校の宿題で出てるんです。C++以外ならできますか?
だから宿題スレに逝けと

Cの機能拡張版がC++
でC++の機能も気合いと根性があればCで代替できる
でもってCのソースをC++って言いながら提出してもたぶん大丈夫
(うわめちゃくちゃな説明・・・)
どんなのでもいいなら
地図を"map.txt"に保存して


#include <stdio.h>

main(){
 FILE* fin;
 char sTemp[ 4096 ];
 fin = fopen( "map.txt", "r" );
 while( feof( fin ) ){
  fgets( sTemp, 4096, fin );
  printf( "%s", sTemp );
 }
}

コレで画面に表示される
制約条件として1行が4095文字(半角)以下である必要があるが
>>378 ほらよ。

#include <fstream>
#include <iostream>
#include <string>

int main()
{
 std::fstream is("map.txt");
 std::string s;

 while (std::getline(is, s))
  std::cout << s;
}
>>381
スマソ std::fstream は std::ifstream にしてくれ。
(std::fstreamのままでも動くことは動くが・・・・)
飽くまでテキストにこだわるんだなw
まぁでも、地図って言っても実際には画像ファイルを読み込んで表示(出力)
することには変わらんだろうから、概念的には一緒か。
でもこんな質問する香具師にgraphicなんか使ったところで質問攻めに合うだけだと思う
>>381 やさしいな
なんかさぁ、宿題丸投げする奴って死んで欲しいよね。
できません、わかりませんて言えよ。そして退学しろよ。
他にも人生の選択肢はたくさんあるだろうに。
んー
俺が同じ学校にいるなら商売にするよ?
特に自分が先輩だったらかつてやったことだし楽勝にできるはず

コレは1回頼ると頼った奴がどんどん落ちこぼれ、
次も頼らざるを得なくなるという素晴らしい商売
お嫁サンバ
>>387 アスクスパイラル!!
390デフォルトの名無しさん:03/09/23 16:12
>>383
ラスタとベクタも知らない人は黙っててくださいね。
そんな人が 【概念的には】 なんて。



>>390
キチガイですか?
>>390
>>383の文面だけでなんで>>383がラスタとベクタも知らない人だと分かるのですか?
エスパーの方ですか?
>>392
> エスパーの方ですか?
見りゃわかるだろ
394デフォルトの名無しさん:03/09/23 17:00
>>392

>画像ファイル
↑これだけで十分かと。

ベクタだろうが何だろうが画像を保存してるなら画像ファイルじゃん
396デフォルトの名無しさん:03/09/23 17:18
だったら、>>383に聞いてみよう。
漏れはいちいちエロ画をラスタファイルとベクタファイルなんていい分けないぞ。
全部まとめてエロ画だろう?
ベクタなエロ画ってどんなのだ?
399397:03/09/23 17:35
言われりゃあまりないな。
とりあえずフォントでぬくか?
おまんこの線画
だったら、>>387に聞いてみよう。
アレだろ?
メタファイルってのがベクタ画像なんだろ?
誤爆
だったら、>>397に聞いてみよう。
404397:03/09/23 17:49
何を答えりゃいいんだ?

まぁ、あれだ少なくとも>>383がテキストと画像の違いが
分かってると言うことに1000ドット
ラスタとベクトルの違いが理解できていることに2000ピクセル

>>390が「ラスタとピクセルというとてもとても難しい事を理解しているのは
自分ぐらいな物だ」と思っている厨であることに10億twip
405397:03/09/23 17:52
>>404
ベクトルじゃなくてベクタだったな。
しかもラスタとピクセルっておなじじゃねぇか?

どうやら漏れは理解出来てない方に分類されるらしい。
>>404
先生!!
仲間はずれが一つあります
twip=vb厨
408デフォルトの名無しさん:03/09/23 20:04
#define do { 文・・・ } while(0)

こういった場合の、do{}while(0) はなぜ書必要があるんでしょうか?
>>408
#define x {文…}
if(some_cond()) x;
else x;
これがどう展開されるか考えてみよ。
>>408
意味がわかりません。文の所を省かないで、元のまま、
使っているところも提示して、
日本語の文章は抜けがないか確認してからもう一度聞いてください。
411デフォルトの名無しさん:03/09/23 20:18
>>408-409は、エスパーなんじゃないか?
二人でテレパシーで解決してほすい。
>>408
breakしたいとも考えられる
#define do - while (0)
は定期的に話題になるし(Cでは)有名なイディオムなんだが
それすら知らない奴ばかりなんて(>409除く)
さすが休日だな
>>410
たぶん
#define FOO do { ... } while (/* CONSTCOND */ 0)
だろう。

NetBSD のソースとか読んでると、良く出てくる。理由は >>409 が言ってるとおり
だけど。
クラスにメンバ関数ポインタの配列をstaticで持たせたいのですが、

ヘッダファイル
class Hoge{
public:
Hoge(){}

age(){}
sage(){}

typedef void (Hoge::*ActionPtr)();
static ActionPtr Act[2];
};

ソースファイル
ActionPtr Hoge::Act[2] = {age, sage};

ってな風にすると型が無いだの再定義などのエラーが出てしまいます。
どうすれば良いのでしょうか?
× age(){}
○ void age(){}
× sage(){}
○ void sage(){}
× ActionPtr Hoge::Act[2] = {age, sage};
○ Hoge::ActionPtr Hoge::Act[2] = {&Hoge::age, &Hoge::sage};
>>414
定期的に話題になる有名なイディオムも知らない者だが、結局理由はわからんかった。
本当言うと、そんなに興味はないんだが、どうせだから、もちょい詳しく教えてくんろ。
興味ないんなら関係ない。
他人のソース読むこともほとんどないだろうから。
バカにつける薬はないってことだよ
421デフォルトの名無しさん:03/09/23 23:32
アドレスのアドレスを関数からもらって関数に渡し、その中身の中身を使おうとしたら
エラーが出てしまいました
#include<iostream>
using namespace std;

void show(int **a){
int i,j,n=9;
cout<<endl;
for(i=0;i<n;i++){
for(j=0;j<n;j++)cout<<*(*(a+i)+j);
cout<<endl;}
}
int **m(){
int i,j,**pp,*p[9],a[9][9];
for(i=0;i<9;i++)p[i]=a[i];
pp=p;
for(i=0;i<9;i++)for(j=0;j<9;j++)*(*(pp+i)+j)=(i+j)%10;
for(i=0;i<9;i++){for(j=0;j<9;j++)cout<<*(*(pp+i)+j);cout<<endl;}
show(pp);
return pp;
}
int main(){
int **a;
a=m();
show(a);//この部分でエラー
return 0;
}
わかる方いたらお願いします
422421:03/09/23 23:33
コンパイル、実行は出来たのですが
実行後mainの
show(a);
の部分で止まってしまいました。
>>422
ローカル変数の寿命。
m()の中の戻り値だね>423
>>422
>>421も言っているけど、ppは関数m()を抜けた途端に消滅するので
そのアドレスを持ったaを使い回すのは刃物を振り回すのと同じ。
>>421
つーかppはmainに持っておいて、ポインタのリファレンスを使いなさい。
C++使いなら。
427415:03/09/23 23:46
>>416
できたよママン! ありがとう!
>>408==>>409==>>413
doが予約語だってしってた?
>>428
全然関係ない。
428が何を言いたいのかはわからんが、元の408の聞き方がおかしいのは事実だ。
408が知能の足りない奴だと思われても仕方がないだろう。
431デフォルトの名無しさん:03/09/24 00:20
>408
ループから抜ける条件が要るからじゃん?
>>429
関係なくないだろ。
普通は#define for if(1) for
みたいな使い方以外は予約語を define する馬鹿はいない。
だから、>>408が書き間違えてるんだってば。
もう忘れろよ。
434421:03/09/24 00:30
>>423
>ローカル変数の寿命。
ありがとうございます。
classのデストラクタが呼び出されちゃうみたいな感じですよね
関数の後にもそれが起こるのは知りませんでした。

>>426
>ポインタのリファレンス
というのははじめて聞きました。大体イメージがわくのですが、
void m(int &(**pp))
と書くと、エラーになってしまいます。
決まった書式か、書いてあるホームページを教えていただけるとありがたいです。
(自分でも検索したのですが見つけられませんでした)
#define XXX do {...} while(0)
のXXXが抜けてるって揚げ足か。アホらし。
例えば、if ( a ) AAA; else printf( "false\n" );
こんな感じのプログラムを書きたいとする。

1.#define AAA b = 1; printf( "true\n" );の場合
 if ( a ) b = 1; printf( "true\n" );; else printf( "false\n" );
コンパイル:通らない

2.#define AAA { b = 1; printf( "true\n" ) } の場合
 if ( a ) { b = 1; printf( "true\n" ); }; else printf( "false\n" );
コンパイル:通らない

3.#define AAA do { b = 1; printf( "true\n" ); } while( 0 ) の場合
 if ( a ) do { b = 1; printf( "true\n" ); } while( 0 ); else printf( "2\n" );
コンパイル:通る

このように、複数の文や式を1つのマクロで実行したい場合に、
do{ ... } while( 0 )ではさむようにする。
>>435
さっきから変なスレageてんじゃねーよ>>408
438デフォルトの名無しさん:03/09/24 00:54
頭悪そうなのが暴れてる変なスレage
439421:03/09/24 00:57
引数をint **&にしたりグローバルにしたりもしたのですが
解決しませんでした。
#include<iostream>
using namespace std;
int **pp;

void show(/*int **&pp*/){
int i,j,n=9;
cout<<endl;
for(i=0;i<n;i++){
for(j=0;j<n;j++)cout<<*(*(pp+i)+j);
cout<<endl;
}
}
int m(/*int **&pp*/){
int i,j,*p[9],a[9][9];
for(i=0;i<9;i++)p[i]=a[i];
pp=p;
for(i=0;i<9;i++)for(j=0;j<9;j++)*(*(pp+i)+j)=(i+j)%10;
for(i=0;i<9;i++){for(j=0;j<9;j++)cout<<*(*(pp+i)+j);cout<<endl;}
show();
return 0;
}
int main(){
//int **pp;
m();
show();//この部分でエラー
return 0;
}
全然わかってないな。
返してるのはppじゃなくてpのアドレスだろ。
int a[9][9];
の寿命が関数mを抜けた時に尽きてる。

っていうか、そのコーディングスタイルじゃあエラー発見できないと思うよ。
プログラム作法とか、コーディングスタイルに関する本とかWebのドキュメント嫁。
構造体のサイズを固定したいんですが。

typedef struct{
char head[4];
long version;
char reserve[248];
}HOGE_INFO;

この場合、reserveで 256バイトにあわせてるんですが
データを追加した場合
reserve再計算するのがまんどくさいのです
どうしたらいいでしょうか?
>>442
typedef union {
 struct {
  char head[4];
  long version;
 } a;
 char b[ 256 ];
} HOGE_INFO;
メンバの構造体を無名にしてしまえば
今までと同じように扱えるしな。
445442:03/09/24 03:13
>>443,444
なるほど

ありがとうございました。
446421:03/09/24 11:01
>> 44
>int a[9][9];
>の寿命が関数mを抜けた時に尽きてる。

>っていうか、そのコーディングスタイルじゃあエラー発見できないと思うよ。
>プログラム作法とか、コーディングスタイルに関する本とかWebのドキュメント嫁。

わかりました。どうもありがとうございます
m(_ _)m
447デフォルトの名無しさん:03/09/24 13:23
猫でも分かるVC++と10日で覚えるVisual C++を読んで
C++とVisual C++の使い方はマスタしました。
書籍に載っている課題レベルのものは、
答えをみずに、ほぼ楽勝で出来ます。

次なるレベルにいくには
何をすればよいですか?
なんか作ってみたら?
エロ恋愛シミュレーションとか。
449デフォルトの名無しさん:03/09/24 14:38
「猫でも分かるVC++」を買って、
うちのミケ(メス三歳)に
VC++を教え込もうとしているのですが、
どうも上手く行きません。

これは俺の教え方が悪いのか、
うちのミケが頭悪いのか、
この本が悪いのかどっちでしょうか?

ちなみに俺はプログラムはさっぱり分かりません。
宜しくお願いします m(_ _)m
ミケはkeyを上手に打つことは出来ますか?
マウスなら上手く扱えます
>>449
> ちなみに俺はプログラムはさっぱり分かりません。
明らかにこれが原因。
>>449
それミケちゃうねん
マイク(マッチョ三歳)やねん
>>451
ワラタ
455デフォルトの名無しさん:03/09/24 22:08
>447
何か自分の作りたいものを作ってみる。
数独などのパズルを解くプログラムとか結構むずいよ。
あと、憂鬱な〜って本でソースのきれいな書き方を学ぶ。

ってかレベルアップが目的なの?
自分の作りたいもの作ってみたいとかじゃなくて?

あと、「十日で覚える〜」とか「はじめての〜」系のは入門書だから、
ワンランク上の書籍もあるはず。
プログラミング関連の書評のページを見つければ、
お勧めの上級の本が書かれています。
はぁ、気持ちいい・・・
(*;´Д`*)ハァハァハァハァ
>>447
初心者用の本を2殺読んだだけでVC++をマスタ出来るとは、
さすが脳味噌の構造が違いますね。

漏れは3年ぐらいやってるが未だにMFCは言うこときかねぇし、
ATLは難しいし、COMは難解だし、
WindowsAPIどころか標準ライブラリの関数プロトタイプすらおぼつかねぇ。
アセンブラなんて追うことすら疑わしい。

漏れは向いてないんだろうか?
俺はいまだに、fseek(fp, pos, SEEK_SET) か、fseek(fp, SEEK_SET,pos)か迷うナ。
SEEK_SETも時々思い出せないときがある。
printfの書式指定 全部覚えられるか?
漏れには出来そうにない。
MSDN様々だぜ。
こういっちゃなんだが、自分を語りたいだけにみえる
447は確かに大言壮語だが
pro*c/c++の質問はここでいいのですか?

FETCHした値を入れる構造体にstringを使いたかったのですが、
stringは標準ライブラリ関数なので使えません。
stringの替りになるものはあるのでしょうか?
>>460
printfの書式指定は案外簡単。
464デフォルトの名無しさん:03/09/25 11:29
pgmの読み書きを扱うclassを探しています。
自分用のファイルで参考にしたいので,ググってみましたがダメでした。
ご存知の方がおられましたら,よろしくお願いします。
>>464
pgmって何? グレイスケール画像ファイルフォーマットの.pgm?
466464:03/09/25 19:30
>>pgmって何? グレイスケール画像ファイルフォーマットの.pgm?
はい、グレイスケールになります。
pbm(2値), pgm(グレースケール), ppm(カラー)の画像フォーマット
の一つで、3つの総称した名前をpnmと呼んでいます。

pgmの見本が簡単そうでいいのですが,その他ファイル形式でも,
見本になるclassがあれば良いのですが・・。
>>447
クラスを作ってみよう。テンプレートの。 (ListとかStackとか。
下手に初期化できないから、見ものだよ。
千里眼養えるかもしれないし。

#これを習得はじめから10日のレベルでできたら拍手だ。うん。
以前、別スレで答えてもらった方法でもうまくいかなかったんですが、
・仮想関数を持ったクラスAを継承して、クラスBを作ったとします。
・クラスBでは仮想関数を上書きしています。
・Bで上書きされたものを=演算子で、また別に確保したクラスAに上書きしたい。
というものです。
「オペレータ =」を使った方法か何かで、こういうことって可能ですか?(環境はVC6です。
...VFTableを無理やりゴニョゴニョってしなきゃだめなのかな・・・。

{
classA A;
classB B;//classAを継承していて、仮想関数の内容は上書きされている。
A=B;//仮想関数もコピーしたい。
}
>>468
むちゃくちゃだな・・
class A {
 virtual int f() { return 0; }
};
class B {
 int c;
 virtual int f() { return c; }
};

スライシングが起きて、結果がどうなるかわかるだろ。
メンバcの代わりに仮想関数でも作って呼んでりゃ、もっとひどいことになる。
コンパイラ徹の?
>>468
struct A{
virtual void foo(){ std::cout<<"A\n"; }
};

struct B : public A{
virtual void foo(){ std::cout<<"B\n"; }
};

A a;
B b;
std::memcpy(&a,&b,sizeof(A));

これで仮想関数テーブルへのポインタもコピーされるから仮想関数が上書きされる

この際
a.foo();
と呼び出しても駄目だ。
なぜならa.foo();は本来コンパイル時に解決できるから、仮想関数経由で呼び出されない。

したがって
A *p=&a;
p->foo();
このようにワザと動的になるようにしてやる必要がある。
(ただし、最適化によっては、これでも静的に結合される場合もある)


結論は、こんなことやめとけってことか
>>472

先生('А`)、便乗質問。

A a;
B b;
std::memcpy(&a,&b,sizeof(A));
a.foo();
A *p=&a;
p->foo();

最適化されて、単にAのfoo()が呼ばれるってことはないでつか?
ポインタ経由だと、必ず仮想関数テーブル参照するという仕様?
474473:03/09/25 21:15
あ。。。ちゃんと書いてるやん
逝ってきまーす。
継承した仮想関数をコピーして使いたいなんてのは、99%間違いなく実装継承だから
「やめとけ。設計がおかしい。」としか。
476468:03/09/25 21:36
>>469-472
レスThx!
勉強になります。

>>472
かなり怪しい方法ですな。助言のとおり、やめることにします。

>>470
そういう用途ではありませんが、
もし、メンバを呼ぶだけの関数なら、怪しい参照で死亡ってことですよね。

--
今回の目的は、スタック等での渡されたデータの保持を考えていたのです。
完全コピーして保持できればいいなーと。
(型はテンプレート<T>です。なので、クラス側に実装したかった。
でも、安全にやるのは無理っぽいので、参照&ポインタ保持に切り替えます。
皆さんThx!
477468:03/09/25 21:39
>>475
Yes! sure!!
とほほ。(汗
>>466
pgmってチラッと調べてみたら、すげぇ単純なフォーマットじゃん。
その程度のプログラムも組めないんじゃ、もっと簡単なものから練習しな。
>476
なんで、dup()メソッドを実装しない?
>>466
pnmって総称することを知っているくらいなら、libpnmのソースくらい探せるだろ?
classにはなってないが、構造体と関数の仕様を睨めっこすればclassライブラリにするのはすぐだ。
481476:03/09/26 02:23
>>479
クラスの仮想関数がコピーできないから。ってことになるのかな??
...と、思ったけど、そっか。
今いろいろ考えてたら、コードが沸いてきたよ!
ありがとう!!
以下は即興で書いてみた。こんな感じ?(テストはしてない。

template<class T>
T* Dup(T& Item){//何でもコピーできる予定。あ、でも文字列は無理だ。
T *D = new T;
*D = Item//オペレータ任せ
return D;
}
>>481
一旦デフォルトで初期化してコピーではなく
コピーコンストラクタを使うほうが効率的だよ。
T *D = new T(Item);

あとディープコピーは >>479でも言われているように
オブジェクト自身が上記の文を持つ複製メソッドを持つほうが確実ね。
(ただし派生ごとにいちいち再定義が必要)

templateだとそこをコンパイルする時点でみなされている型で処理するから、
実際の型が違うとき(親クラスの参照などで処理してるとき)は
ディープコピーにならない。
>>482
レスThx!
なるほど、少々面倒ですね。
うーん。今回のは継承先->基底の一方通行なので、まだ良いですが。

あと...。
実は、コピーコントラクタの意味を知らなかったです。
言葉だけ知っててかなり謎めいていました。(汗
いや、勉強になります。
オブジェクト指向でゲームを作るのはシンドイですか?
別にしんどくないよ。
change classしてみそ
487デフォルトの名無しさん:03/09/27 00:28
SomeClass hoge;
std::string test = hoge;

上のようにクラスを特定の型にキャストすることが出来たと思うのですが
どのように定義すればいいのでしょうか?
・SomeClass型の引数一つ(参照ならばconst付き)のコンストラクタを string側に用意
・operator string()を SomeClass側に用意

どちらも
意図しない型変換をしてしまったり
勝手に一時変数を作って期待通り動作しない
などの原因になるので、注意深く扱う
489487:03/09/27 01:10
>>488
ありがとうございました。
VC++の割れ使ってる方おられますか?
本体はあるのですが、ヘルプファイルは出回っていないようです・・・
ヘルプ無しでもプログラムできるでしょうか?
ヨロシクお願いします
アカの手先のおフェラ豚め!
ぶっ殺されたいか!?
492デフォルトの名無しさん:03/09/27 05:38
>>490
>ヘルプ無しでもプログラムできるでしょうか?

そういうことはヘルプに書いてある
>>490
氏ね
>>491
ジョンクリーズみたいな口調ですね

>アカの手先
アカってことは共産主義ですよね?
共産主義ならすべての人が平等であるべきなので
ファイルを共有することはその理念に当てはまると思うのですが・・・

>のおフェラ
私は女性が好きですのでフェラはしません。

>豚
一応これでも人間です

>>492
ってことは、ヘルプが手に入らないとプログラムできるかわからないんですね。
今でもVC++販売してるのでしょうか?
できれば、持っているヘルプファイル放流してもらえませんか?
495490:03/09/27 05:51
↑490
>>494
共有しているのか?貰うだけではないのか?
497490:03/09/27 06:10
>>496
答えになっていません
なぜ自分が出来るか出来ないかの判断を他人に仰ぐ
>>404
フェラはアナルセックスと同じく病み付きになるよ。やってみ♥
500デフォルトの名無しさん:03/09/27 07:22
500ゲット
>>490
氏ね
お前らまとめてスレ違い。
って、漏れもか。
学生で赤版買って使ってます。卒業してからも
しばらく使うつもりですが、伺か?
>>494
なんでてめぇにピーコしてやらなきゃならねぇんだよ。
>>494
割れ廚は氏ね。
取り敢えず板違いだと忠告しておく。ダウソ板に(・∀・)カエレ!
506490:03/09/27 15:56
プログラム板全体に言えることだけど
あからさまのネタに対する食いつきっぷりがいいね
オサーンばっかりなのか?wwwwwwwwww
>>506
いいから氏ねって。
お前なんか社会から必要とされてないだろ?
邪魔なだけなんだから、今すぐ回線切って首吊って氏ねよ。
>>506
プログラムをなりわいとする俺に取っては割れ廚はホントに氏んで
欲しいの一心。
>490
ハートマン軍曹も知らないようでは、ネタ師として3流だヨ
相手にしても何も生み出さないのでスルーしようよ
511 ◆TJ9qoWuqvA :03/09/27 18:35
この板、年齢層って何ぼよ
>490
MSDN Library?
513デフォルトの名無しさん:03/09/27 18:56
クリティカルなパフォーマンスが要求され、
高速にインスタンスを取得する必要がある場合、シングルトンよりもグローバル変数の方が高速ですか?
>>513
アセンブラで書け。
グローバル変数もシングルトンの一実装なんだが。
そうでなくてもインスタンス取得するメソッドをinlineにしとけば実質同じ。
516490:03/09/27 19:34
>>507
定番だね。つまらない

>>508
おまいの糞アプリなんて誰も金出して買わないよ

>>512
そう、それがほしい。今すぐ流して
>516
今下水に流してきました
>>515
inline hoge& getInstance()
{
 if(instance == NULL)
  instance = new hoge();
 retrun instance;
}


これの分遅くなるんじゃないの?
if(instance == NULL)
×inline hoge& getInstance()
○inline static hoge& getInstance()
>>518
関数内static変数にしておいても
コンパイラが同じようなコード吐くしな。
>>518
それと、グローバル変数だとリンク時にアドレスが確定するが、実行時に new
すると実行時までアドレスが確定しないので、間接参照一回分のペナルティが
発生する。

といっても、それが問題になることなど、現実にはまず無いと思うが。
つーか、どーしても速度が必要ならローカル変数に取っておくだろ
プログラムって難しいね
>>516
釣り必死だな( ´,_ゝ`)プッ
>>516
通報しますた。二週間後をお楽しみに。
526デフォルトの名無しさん:03/09/27 21:06
C/C++の考え方の伝統では何事も実行時決定よりもコンパイル時決定が良いっていうのが
Effective C++とかにも書いてあるけど、
最近のオブジェクト指向の考え方って実行時決定寄りだよね?デザインパターン本とか読むと。
そのへんみんなどう思ってるの。
C++にもRTTIあるだろ
テスト環境が問題なく確立できるなら実行時寄りになっても
痛くないってことじゃないですかね?

C/C++では、テストがうまく動かせない環境が多いから、
コンパイル時決定を重視するべきだと思ってます。
cppunitあるだろ
あれってクロス環境で使えるの?
コンパイル時決定だとパフォーマンスが良い
>>531
うそぉ〜・・・・
C++の実行時はヘタクソ
>>532
え?良くないの?
virtualやデリファレンス分だけ遅いって話だろ。
コンパイル時決定だと階乗計算とか速いよね。
>>530
オリジナルの CppUnit はやや辛いが、CppUnit-x だとホスト環境に対する要求が
軽めだから、ちょっといじってやれば大抵の環境で使えるよ。
> 最近のオブジェクト指向の考え方って実行時決定寄りだよね?デザインパターン本とか読むと。
すんごい誤読だと思う。
539デフォルトの名無しさん:03/09/27 22:47
そう?どの辺が?
そもそもデザインパターンは最近か?
541デフォルトの名無しさん:03/09/27 22:56
まあ最近かどうかは譲ってもいいよ
というか文法やライブラリであっさり実装できたらデザパタにならないだろ。
C++で直接記述しにくいものが(特に生成系)デザパタになったんだろ。
>>516
氏ね。
544デフォルトの名無しさん:03/09/28 02:53
型情報は未だに自前の変なマクロで実装してます・・・。
特定のクラスだけにRTTIつけられたらいいんですが。
コンパイラはVC2003のなんですけど。
そもそもC++の仕様じゃないんでしょうか?
545デフォルトの名無しさん:03/09/28 02:55
>>544
RTTIありで何の問題があるの?
546516:03/09/28 03:10
いいものは金を出す
悪い物は金出さない
代金と商品の質が釣りあってないのが悪いんだよ
特に>>508のようにSEの言われるがまま糞プログラム作ってる香具師の
ソフトには金払いたくない
どうせ、DQN会社向けの幼稚なプログラムしかしないんだろ?

ところで、MSDNまだぁ?
>>546
お前自分で言ってて矛盾に気づかないのか?
「いいものは金を出す、悪いものは金を出さない」
そしたら、VC++とかMSDNってお前にとっては悪い
ものなのか?
いっぺん警察に捕まって臭い飯食って頭冷やしてこい。
つーかMSDN Libraryって最新のが既にネットに流れてるし。
>>546
自分の仕事道具の一つも買えない超貧乏人の犯罪者のお前よりましさ。
>>549
その辺にしといてやれ。>>546は無職なんだからあまり追いつ
めると逆切れして新聞に載る事件でもやらかしかねん。
551516:03/09/28 03:47
何必死になってんだかww
おまいに迷惑かけた覚えはないがな

>>548
情報サンクス、それだけでプログラミングできるのか?
おれはVBすらしたことないんだが
ny用の自作ツール作りたいんだよ
>>551
> それだけでプログラミングできるのか?
道具が揃っても、使う人間の能力が不足してると、どうにもならんぞ。
553516:03/09/28 03:54
プログラムなんて誰でもできんだろ?
猿じゃあるまいし、道具さえそろえたらなんとかなるよ
で、MSDNあればできるのか?
一応「C++わか〜る」はもうすでに落としているのだが
>>545
基本的に実行時の型情報は要らない設計だから。
デバック用の例外クラスと一部のバリアントに仮想関数を持たせてるだけです。
全部に標準の型情報つけた方がいいと思いますか?
答えになってなかった。
何故RTTIに問題あるのか・・・。
オーバーヘッド。
だから個別につけることはできないのか聞いたんですけど。
今日、tchar.h をみていたら、

#ifdef _cplusplus
extern "C" {

というのがありましたが、これは具体的にどういったものなんでしょうか?
manglingされない/しないことの宣言、かな。
>>556
>>306 から読み直せ。
>>553
> で、MSDNあればできるのか?

この板見ててわからないんだったら、たぶん一生無理だな。(ケケッ
いい加減相手してるヤツがうざいな
>>555
オーバーヘッドたって、各クラス毎に仮想関数テーブルのエントリ1個と
type_infoオブジェクト1個分のメモリ消費が増えるだけなので、そんなに
問題になる?

仮想関数毎切って良いなら、コンパイラ拡張で
 http://www.microsoft.com/japan/developer/library/vccore/_langref_novtable.htm
クラス毎にON/OFFする機能はそれなりにあると思う。
>>561
うそぉ。これ見て初めて知ったんだけど、vtableってデフォルトで絶対作られるもんだったの?
仮想関数なしならテーブルもなしだとばっかり・・・。アホですた。
オーバーヘッドのことだけど、CPUのソフトエミュレーションしてて、サイズというより速度の問題かな。
コンストラクトの度にポインタ作るバイトコード実行してたら遅そうだから。
あと、文字列切り刻みまくりのリンクリストマニアだったりするので。
とりあえずありがとう。
>>562
> vtableってデフォルトで絶対作られるもんだったの?

どこにそんなこと書いてありますか?
564562:03/09/28 09:52
ん?純粋インターフェイスクラス?
またもの凄い勘違いをしてしまったかも。
565562:03/09/28 09:53
>>564
ごめん間違えた。なかったことにして。
ATLを使ったCOMオブジェクトクラスのように、
直接インスタンスを生成せず継承されることを前提としているクラスの、
vtableを作らないことでサイズをほんのちょっぴり節約するためのほとんど無意味なオプションだよ
567562:03/09/28 09:57
>>564じゃない>>563
で、結局、RTTIを個別につけるのは無理ということでしょうか。
だって、インターフェイスクラス限定なら、インターフェイスを定義するだけで
何もしないコードを組まない限り、RTTIはついてしまうよね?間違ってますか?
568562:03/09/28 09:59
>>566
ランタイムで人がいるのが嬉しいぃ。
銭ゲバメモリゲバの漏れなので、次から指定しますw
つーか4バイト単位とかで節約したいならC++使わないでCとかアセンブラ使っとけ。
時間的な話かとおもってた

>>568
> ランタイム
違和感
時間はRTTI ONだろうとOFFだろうとdynamic_castやtypeid使わなきゃ変わらないだろ。
RTTIとかけてみますた
>>571
何の時間?
そもそもdynamic_castもtypeidも使ってないよ。
>571
てゆーかOFFだと使えなくないか?
575556:03/09/28 12:41
>>558
みましたが、

#ifdef __cplusplus

っていうのは、もちろん、コンパイラがC++であれば、っていう意味なのは明かなので、
ここの部分だけ解説されていてもしかたないです。

extern "C" {
}

これの部分が理解できないので。こっちのほうの意味をおしえてください。
どういう場合に、なぜ、こう書かなきゃならないのか。
>>575
>>557は無視か?
>>575
google あたりで extern "C" で検索すると、すぐに出てくると思うんだが……。
一言でまとめると C++ 以外の言語から C++ の関数を呼び出したい場合に
つける。

C++ だと関数オーバーロード (同じ名前の関数で引数型だけ違う) を実現するために、
シンボル名に型情報が含められる。たとえば俺の手元のコンパイラで void func(void)
をコンパイルすると オブジェクトファイルでは __Z4funcv というシンボル名になり、
void func(int) をコンパイルすると __Z4funci となる。

これを name mangling というんだが、name mangling の方法はコンパイラによって
バラバラで標準がない。そこで C や VB などから C++ 関数を呼び出す場合には
extern "C" を使って「この関数は name mangling するな」と指定する。副作用と
して関数オーバーロードができなくなる。
>>576
無視っていうより、manglingを知らないから情報だと思わなかったと思われ
(知ってたらこんな質問自体しないはずだし(笑))
>>575
> これの部分が理解できないので。こっちのほうの意味をおしえてください。

だったらなぜはじめからそう書かないんだ ?

教えたのに、「そっちは明らかだ。」とか言われるとすごくむかつくんだが。
>>575
上で行われている与太話は実装の事だから無視していい

単にextern "C"はCリンケージの指定。
>>577
>副作用として関数オーバーロード出来なくなる
って、当たり前じゃん。
582577:03/09/28 13:56
>>580-581
何か癪に障ったのか?
583581:03/09/28 14:04
別に!
ただ当たり前の事言ったまで。
>>579
激しく同意
556は初心者道の茶帯
もっと傲慢に振る舞わないと黒帯は難しい
伝説の水野女史には遠く及ばないな。
>>587
状況的にはかなりかわいそう(SDKもまともに理解してないのにエクセルをオートメーションで操作しなければならない)
なんだが、そうとは思わせない傍若無人さがステキ。
589556:03/09/28 20:44
いろいろありがとうございました。
要するに、

extern "C" { }

の {} で囲まれた中は、コンパイラがC++でも、
Cの機能のみをもってしてコンパイルするように、という意味だったんですね。
ありがとうございます。
>>589
違います。
>>589
えーと、Cの機能のみっていうとかなり拡大解釈っぽいが。
変化するのはリンク時のシンボルの名前であって、中身はC++フルに書ける
>>589
「名前マングリング」で検索汁。
例えば
extern "C" { }
の内部だと関数の多重定義がうまくコンパイルできない事がある。
>>591
だよな。
extern "FORTRAN" とか書くこともできる処理系もあるし。
どの処理系でも書くことはできる
596516:03/09/28 22:35
彼女にちんこが臭いって言われたんですけどどうすればいいですか?
自分ではちゃんと洗ってる筈なんですけど
年中皮被ってる状態なのがいけないのかな?
>>596
氏ね!
オマエって満国際的な女だよなっていい返す
599516:03/09/28 23:10
>>598
そんなことを言ったら嫌われちゃいます。
彼女は60億人いる中で私を愛してくれた数少ない逸材なんです。
嫌われたくありません。でも珍国際のは嫌です
じゃあ、もう死ぬしかないね。
601516:03/09/28 23:24
ちんこ切り落とすことに決めました。
彼女も僕のちんこ目当てに付き合ってるわけないですし(それほどの物でもないし)
僕のフィンガーテクニックでなんとかフォローします。
明日病院行って来ます
いろいろ、相談に乗って頂いてありがとうございました。
>>596
通報しますた。
603516:03/09/28 23:31
>>602
すみません。糞食って死にます
http://upload.fam.cx/cgi-bin/img-box/v4230928164933.jpg
マイクラなんぞ喰らわんぞ。
マイクラ・・・マインドクラッシャーの略。日本語で言うと精神破壊。
実際の>>603は炉画像なのである意味マイクラといえないことも無いだろう。
606516:03/09/28 23:51
>>603
つーか、この画像かなり笑えるんだがw
矢口のぶッというんこをこんな風に頬張りたい
607デフォルトの名無しさん:03/09/29 00:54
class OK;
void OK();
template<typename T> class NG;
void NG();

g++(3.3.1 cygming)だと、
OKは両方いけるんだけど、NGは"redeclared as different kind of symbol"になります。
こういう言語仕様なんでしょうか?
>>607
その環境手元にないけど、
エラーメッセージの通りだろ。
NGはすでに宣言されてるだけ。
>>608
OKも宣言されているわけだが。
>>607
14.2
A template-declaration can appear only as a namespace scope or class scope declaration.
In a function template declaration, the declarator-id shall be a template-name
(i.e., not a template-id).

つまりテンプレートに使われるシンボル名は同じ名前空間もしくはクラス空間内では
唯一でなければならない。従ってエラー。
>>607
スマソこっちみたい。
14.5
A class template shall not have the same name as any other template, class,
function, object, enumeration, enumerator, namespace, or type in the same scope
(basic.scope), except as specified in (temp.class.spec).
Except that a function template can be overloaded either by (non-template)
functions with the same name or by other function templates with the same name
(temp.over), a template name declared in namespace scope or in class scope shall be
unique in that scope.
>>608
OKは、規格の3.3.7 Name Hidingによってクラスの方の名前が隠される。
しかし、14-5でテンプレートクラス名は、ほかの関数やオブジェクトなどの名前とは
一緒に出来ない。よってNGはNG。
先に出てた・・・(鬱
>>608-612
ありがとうございます。

ところでC++の規格にはRationaleは無いのでしょうか?
今回の件も、根拠がわからんないです。
615デフォルトの名無しさん:03/09/29 14:53
クラスのメンバ関数の定義で引数リストに何も指定しないというのは
暗黙のうちにintを1つ取る関数として定義されるのでしょうか?
それとも定義未定とされるのでしょうか?
もしくはvoidとみなされるのでしょうか?
class Foo {
public:
 void Func();
};
>>615
void。
ちょっと基本すぎるので、入門書ぐらい買って詠んだほうがよいかと。
617615:03/09/29 14:57
class Foo {
public:
 virtual void Func() = 0;
};
class Ber1 {
public:
 virtual void Func(void) {} // OK
};
class Ber2 {
public:
 virtual void Func(int i) {} //コンパイルエラー
};
と言う事でvoidな事がわかりました。板よごしてすまそ。
618615:03/09/29 14:59
>>615
Fooから派生するの忘れた。
逝ってきます。
どうでもいいことだが、foo ときたら普通 bar だぞ
じゃあhogeときたら?
hage
622デフォルトの名無しさん:03/09/30 01:54
_ト ̄|○・・・あぁ、どうしても出来ない!
>>614
> ところでC++の規格にはRationaleは無いのでしょうか?
そういえば無いなぁ。なんでだろう。
>>620
piyo
fuga
hogera
hidebu
628デフォルトの名無しさん:03/09/30 21:37
fstreamを用いてファイルの先頭に文字を挿入する方法はありますか?
後ろに挿入する場合は
ofstream fout(FilePath,ios::out|ios::app|ios::ate);
でできるんですけど、前はどうもうまくいきません・・・

何か良い知恵がありましたらよろしくお願いします。
無理
ママー、vector<bool>だとバッファへのポインター採れないね。
>>629
ええええええええええええぇぇぇぇぇぇ
632デフォルトの名無しさん:03/09/30 21:54
C++の実践的な技術を身につけたいんですが
どんな本を買えばいいですか?お勧めとかあったら教えてください。

幼稚な質問ですいません。
>>5
>630
boolのvectorは作ったらだめだったんじゃなかったっけ?
>>628
先に文字を追加したファイルを作り、そこへアペンドモードで元のファイル
を追加して元のファイルを削除してリネーム。
>>634
ダメってことはないが……

ただ specialization されてるので bool 以外の vector<T> で使えるメソッドでも
vector<bool> で使えないメソッドがいくつかあったりして、現実には非常に使い
づらい。bitset 使った方が良いよ。
>>635
やっぱりその方法しかないですか・・・
分かりました。ありがとうございました。

実はその方法でもう実装は済んでるんですけど、
もっとエレガントな方法はないかなぁ、と思っていたんで。
>>636
むしろ Boost::dynamic_bitset 使った方がいいかも。
>>628ではないんだが、
本当にファイルの前に追加する方法ってないのか?
>>639
もはやファイルシステム固有の問題かと
>>640
そうか。とすると、テキストエディタとか作るのは
実は結構たいへんだね。
>>641
うん、大変だよ。
作ったことないみたいだねw
>>642
普通はつくらんでしょう、そんなもの(w
>>643
エディタやコンパイラって学生のときに結構作るような。結構勉強になる
今までのファイルの内容を新しく追加するサイズ分移動して、
その後に先頭から追加分を書く。

エレガントには程遠いが、ファイルは1つで済む。
>>645
言うほど簡単じゃない罠。
ファイルの内容を移動するって、具体的にどこからどこへ移動するか分かって書いてる?

>>641
テキストエディタなら、行ごとにリスト作るのが一般的。
行単位の編集しかしないエディタが多いのはそれが理由。
メモリ上でファイル全体のイメージを作っておいて、書き出すときは一気に先頭から書く、と。
メモリ上で取り込みきれないようなファイルを取り扱うエディタを書くのは、
その辺りも全て考慮しないといけないからどうしても一時ファイルが必要で、
だからMS-DOSの時代のエディタはどれもそういう作りになっていた。
ファイル内での中身の移動なんて、たいして難しくもないと思うけど…

スピードは遅いし、確かにエレガントでは無いけど。
ファイルシステムレベルでいじれるなら、リンクリストの要領で先頭に挿入できる
気もするが。
649デフォルトの名無しさん:03/10/01 14:28
C++的にはconst,enum,inlineでできるところは
マクロを使わずに済ますべきですか?
それともマクロを使うことで得られるメリットの
ようなものがあるんでしょうか?

コンパイラはg++を想定しています。Cのソースとして
コンパイルするなどというセコイことは考えてません。
650デフォルトの名無しさん:03/10/01 14:30
マクロでできることはマクロでやる。
651デフォルトの名無しさん:03/10/01 14:34
・とあるクラスに、staticメンバが一つある
・そのクラスのインスタンスが一つでも存在しているならば、
 そのstaticメンバは初期化されていなければならない。
・そのstaticメンバを初期化するには、初期化関数を呼ばなければならない。

…のですが、これを綺麗に実装する方法はあるのでしょうか。
今はコンストラクタが呼ばれるたびに、初期化チェックをしていますが冗長な気がして…。
652デフォルトの名無しさん:03/10/01 14:47
>>650
inline関数がある処理系のみを考えているのに、
函数マクロでそれを記述することにどんな意味があるんでしょう?
ってこれはCスレで聞くべきないようか。
653デフォルトの名無しさん:03/10/01 14:53
>>651

コンストラクタでのチェックによるオーバーヘッドが無視できない程クリティカルな処理、
あるいは頻度の高い処理なら、ファクトリ関数をポインタで持っておいて1回目以降は
それを付け替えちゃえばいいんじゃない?

あとはクラスにそこまでのインテリジェンスを持たせずに、Open/Close 系のメソッドを
用意して使う側で適切に呼び出してもらうってのも悪くないと思う。Open されずにインス
タンスが生成されたときに適切なエラーを出せるなら。
>>653
1段目はええと…2回目からは空操作させるということですよね。
2段目はCoInitializeみたいなものでしょうか。

早速作り替えてみます、レスありがとうございました。
>>653
bool変数のチェックのコストが気になるような状況で
ポインタを介した関数呼び出しを薦めるのはいかがなものか。
656デフォルトの名無しさん:03/10/01 21:36
>>655
そういやそうだ。。寝ぼけてました。
657デフォルトの名無しさん:03/10/01 21:41
float foo(){
union{ float f; int i; };
i=10;
return f;
}

struct A{
float foo(){
union{ float f; int i; };
i=10;
return f;
}
};

上のfoo関数はコンパイルが通るのですが、下のfooメンバ関数のコンパイルが通りません。
そんな仕様があるのですか?

私の環境はVC7で、エラーメッセージは以下のとおりです。

error C2065: 'i' : 定義されていない識別子です。
error C2065: 'f' : 定義されていない識別子です。
>>657
VC7.1ではコンパイルできたっぽい
>>658
サンクス。


コンパイラのバグっぽいのかな・・・
とりあえず以下のでいけたのでこれでいくことにします。

struct A{
float foo(){
union{ float f; int i; } e;
e.i=10;
return e.f;
}
};
レスリング部に所属している集団が部活帰りに
「ボクシングってダセェよな、シッシッ言っちゃってよ。」などと
言っているのが聞こえたので走って近づき、リーダー格の奴に、
右ボディを食らわせて前屈みにし、ワンツー連打から左フックでKOした。
オレはその場を立ち去る時に残りの高校生たちを指差し、
「お前らも灰になれるものを見つけろよ」と言った。
離れていく時に後ろから、「ボクシングっていいよな。」と声が聞こえた。
>>659
クラスの外に定義を持ってくればOK
おい、お前。そう、お前だよ。
「このスレおもろいから見てみ」「2ちゃんの歴史に残る名スレだぜ」とか言われてホイホイと
このhtml化されたスレを見にきた、お前のことだ。
どうだ?このスレおもしれーだろ。
でもな、お前はこのスレを読むだけで、参加することはできねーんだよ。
可愛そうにな、プププ。
俺は今、ライブでこのスレに参加してる。
すっげー貴重な経験したよ。この先いつまでも自慢できる。
まあ、お前みたいな出遅れ君は、html化されたこのスレを指くわえて眺めてろってこった。
>>660
不変表明になぜか違反するって事?
関数に入った時と出て行く時で,オブジェクトが変化してしまう,と。
オブジェクトを乱暴にいじるからだ。
適切に const は使ってる? mutable でどっか罠に引っかかってない?
explicit を適切に使わなかったから,つーのも意外に多い。
なるべく最新版のコンパイラを使って,ウォーニングを念入りにチェックするべきだ。
>>661
そうすると、グローバル変数になっちゃうんですけど・・・?
こ〜ゆ〜事
struct A
{
    float foo();
};
float A::foo()
{
    union{ float f; int i; };
    i=10;
    return f;
}
>>665
なるほど。どうもサンクスです。
667デフォルトの名無しさん:03/10/01 23:57
(^Д^)ギャハ!↑みなさん、この人のレスどう思いますか♪
なんてありきたりなんでしょうね♪
誰もが皆、一瞬つけてみたくなる発想のレスです♪
しかし、賢明な人はその自らの短絡的思考を野放しにする事を嫌がり、
こういうレスは控えます♪
しかし、この人はしてしまったのです(^^;ワラ
「誰もが思い付くような事」を堂々と♪
この人にとってこのレスは何なのでしょうか♪
このレスをしている間にも時間は刻々と 過ぎ去っているのです♪
正にこの人のした事は「無意味」「無駄」でしかありません♪
ああ・・・何ていう事でしょう(^^;ワラ
図星で泣いちゃうかも(^^;ワラ
つぼにはまったw
誤爆なのか狙ったのかはわからんが。
もし狙ったのなら面白すぎ。
これだけは確実だ。
667==668
670デフォルトの名無しさん:03/10/02 15:46
669ってあたまわる〜いwww
どんぴしゃだった模様。
必死の煽りが泣かせます。

↓負け犬の遠吠え
672デフォルトの名無しさん:03/10/02 16:17
おまえらバカじゃないのか?ほんと自分は出来る風ですか?
ほんとにバカ、オメーラ、みんな、ネット荒らしとどこが違うんだ!?
ほんとな、おまえらはみんな、ここに来る資格ねーな!!
デフォルトの名無しさんだっけ!!おまえしね!!人が謝ってのに何が
あやしいっておまえみたいのがいるから日本がだめになるんだ!!
分かったバーカ!!もう荒らしでも何でもいいよ!!
オメーラみたいなバカどもにつき合ってもしかたないから!!
あんたらみたいのはもうこのよにもいらない !!
>>651
1) プログラムの最初で初期化
2) 最初のインスタンス化のときコンスタラクタが呼ばれる前に初期化
3) コンストラクタ内で初期化

綺麗にやるにはこれくらいしかなさそう。
しかも初期化をダイナミックに制御できるのは3だけだから、
結局今やってるやり方しかないかも。
ループ内で大量にインスタンスを作るような場合、
3だとオーバーヘッドが大きいなら、
2の方法でループの直前で初期化。
色んなとこでバラバラに生成する場合、
2だとコーディングがめんどくさすぎるので、1か3だと思う。
ケースバイケースということだね。
674デフォルトの名無しさん:03/10/02 17:33
class Hash
{
public:
string key;
int val;
int default_val;
Hash(int def){default_val = def;}
/*int& operator()(const string &arg){
cout << "Called as LHS" << endl;
key = arg;
return val;
}*/
int operator()(const string &arg) const{
cout << "Called as RHS" << endl;
if(key == arg){
return val;
}
else{
return default_val;
}
}
};

int main(){
Hash h(-1);
//h("a") = 1;
cout << h("b") << endl;
return 0;
}
675674:03/10/02 17:33
上記のソースで質問です。
まず、上記のソースはコンパイルすると当然
h("b")はint operator()(const string& arg) constの呼び出しになります。
ところが、コメントを外してコンパイルすると
h("a"),h("b")の双方がint& operator()(const string& arg)の呼び出しになってしまいます。
つまり、左辺値としての呼び出しと右辺値としての呼び出しを区別して
関数をオーバーロードしたいんですが、どうすれば実現できますか?
あと、疑問としてこの2つのoperator()は重複宣言になりそうに思いますが、
コメントを外してもコンパイラが通るのはなぜですか?
試した環境はVC++6.0とg++(2.xx)です。
>>675

const は「変更されない」ではなくて「変更できない」だから、
h は変更可能だから、たとえ変更されなくても常に LHS になる。

cout << const_cast< Hash const& >( h )("b") << endl;

で何とかなるかも。
>>675
HashNodeClass &Hash::operator()(....);
とやって
HashNodeClass::operator=(....);
HashNodeClass::operator<<(....);
を実装したら?
678デフォルトの名無しさん :03/10/02 21:03
コンテナで異なるオブジェクトを一括して管理したいのですが、

(オブジェクトA、オブジェクトB、オブジェクトC、オブジェクトA・・・・)

という具合に・・・

いい方法ありますか?
boost::any
680あい:03/10/02 21:16
かなりおすすめの無料着メロサイト♪
ゲームとか画像UP掲示板とかもあって面白そうだったよ〜♪
ほんとだまされたと思って行って下さい☆
絶対満足するから〜♪

http://yokozuna.tv/m.php?i=21
681デフォルトの名無しさん:03/10/02 21:37
質問です
ClassA、ClassBという2つのクラスがあると仮定します。
ClassA(子クラス)はClassB(親クラス)を継承しています。

この場合に以下のプログラムは正常にdelete(開放)されるのでしょうか?
ClassA *pClassA;
ClassB *pClassB;
pClassA = new ClassA();
pClassB = pClassA;
delete pClassB;

どうかよろしくおねがいします
>>681
ClassBのデストラクタがvirtualなら。
>682
ありがとございました、これで安心して製作を続けることができます。
684681:03/10/02 22:09
すいません、もう1つ質問させてください

ClassA、ClassB、ClassCという3つのクラスがあると仮定します。
ClassB(子クラス)はClassC(親クラス)を継承しています。
ClassA(子クラス)はClassB(親クラス)を継承しています。

この場合に以下のプログラムは正常にdelete(開放)されるのでしょうか?
ClassA *pClassA;
ClassC *pClassC;
pClassA = new ClassA();
pClassC = pClassA;
delete pClassC;

先ほどと同じ考えでClassBとClassCのデストラクタがVirtualならOKなのでしょうか?
また継承されるクラスが増えても継承されるクラスすべてのデストラクタに
Virtualをつければよいのでしょうか?
>>684
ClassCのデストラクタがvirtualなら、そこから継承したクラスの
デストラクタからはvirtualキーワードが省略できる。(省略できる
だけでvirtualは付いているものとコンパイラは判断する。)
>>685
ということは継承される大元(上記の場合はClassC)のデストラクタに
Virtualがついていれば何個継承してもよいということですね。
悩みが解決しました、ありがとうございました。
>>676
constの付加にconst_castはつかわないでほしいです。
ところで皆さん、一時バッファってどうしてます?
いきなりなんの話だ?
690674:03/10/03 02:16
>>676,677
なるほど。
いずれにせよ、簡単に右辺値か左辺値か見分けるのは難しそうですね。
ありがとう。
>>674
「More Effective C++」にそういうことを行うプロキシークラスがのってまつ。
692デフォルトの名無しさん:03/10/03 10:10
とあるオブジェクトAと、それを操作したい
互いに独立したクラス(コールバックで独自に動くような)があります。
独立したクラスとは、メインのWindowクラスと、Dialogクラス×2の、3つです。

こういう場合どんな風に関連づけたら良いのでしょうか?

自分なりに考えたのでは
1、とりあえすWindowクラスにAをメンバとして持たせ、
  GetA()系を用意して安易にそれを公開し、他のDialogクラスを賄う

2、メインウィンドウにAをメンバとして持たせ
  Window->func(){ A->func(); }みたいな物をいちいち用意する。
微妙にスレ違いな気もするけどお願いします。
スレッドセーフなDLL(非MFC)の作成は、
・staticは使わない
・グローバルはTLSを使用する
・マルチスレッドDLLとぢてリンクする
だけでOK?
>>693
めちゃくちゃスレ違いです
695693:03/10/03 14:00
>>694
該当スレ見つけた。失礼、取り下げ。
ここだね。
マルチスレッドプログラミング相談室 その2
http://pc2.2ch.net/test/read.cgi/tech/1037636153/

過去ログ読めばわかるかな・・・
>>692
ウィンドウクラスに A を持たせるのが、そもそも良くないような気がするけど。使い捨ての
小さなアプリならともかく、まじめに書くなら

 データを管理するクラス
 それを表示するクラス (ウィンドウ・ダイアログ)
 データを操作するクラス

と 3 つに分けて管理する方が良いよ。いわゆる MVC パターンてヤツ。

その上で、データの変更をウィンドウ・ダイアログに通知するために Observer パターンを
組み合わせて使うのが一般的だと思われ。
697692:03/10/04 11:14
>>696
こんなレスをお待ちしてました!
なーるほど、こんな良い方法が…、御陰様でObserverパターンにより
ViewとModel間は、素晴らしくスッキリした、依存の少ない形に出来そうです。

Cotroller(Windowsだと≒View?)とModelの間が、まだよくイメージ出来てないのですが、
要するにWM_LBUTTONDOWとかをイベントとして、Observerどもに通知するのかな…。

キーワード頂けたのでもう少し勉強してみます。
詳細なレスありがとうございました。
すいません。C++初心者ですが教えていただけないでしょうか?
(ID、値)というデータが次々に入力されてくるとしますが、IDごとにそれぞれ
入力された順番を考慮して保持したいと考えます。ID番号ごとにqueueを作って、
既存のIDが入力されたらqueueにpushし、新規のIDが来たらそのIDに対応するqueueを
新たに作ってpushするという方法を考えました。
しかしどうやって書いたらいいかわかりません。後でID番号を基にそれぞれの
queueの中身を参照できるようにするには、どのように書いたらいいのでしょう?
どなたか、教えていただけませんか?
>>698
std::map<ID_type, std::queue<value_type> >

を使うか、場合によってはもっと簡潔に、

std::multimap<ID_type, value_type>

を使えばよい。
map<int, queue<int> >
701698:03/10/04 19:00
>> 699,700

なるほど、mapを使ってキーと値(キュー)を保持するようにすればよいのですね。
すばやいお返事どうもありがとうございます。

ついでに、ふと疑問に思ったのですけど、mapとmultimapを使う場合に
値を検索する速度に違いはあるのでしょうか?
速度が問題となる場合には、どちらのほうがおすすめなのでしょうか?
もしよかったら、この質問にも答えて下さるとありがたいのですが。
自分で試してベンチ取ればええやん
つか、multimapで同一キーを持つ要素が挿入順に並ぶことを期待して大丈夫なのか?
mapを使うかmultimapを使うかは検索速度で決めるんじゃなくてデータ構造で決めるべし。
関数オブジェクトって実行時にコンストラクタが走りますよね?
って事は、結果を保持したいとか、コンストラクタで初期化する
必要がある場合を除いて、グローバル関数使ったほうが速い/良い
のでしょうか?

struct func{
func(){std::cout << "Constructor!" << std::endl;}
void operator()(){std::cout << "operator()!" << std::endl;}
};

int main()
{
func()();
}
>>704
何故必要ないコンストラクタをわざわざ書いてパフォーマンスが落ちるとかほざく?
関数オブジェクト使ったほうが速い/良い
>>706
関数オブジェクトの方が速くなるのって、
テンプレートが絡んでるときだけじゃない?
>>707
関数オブジェクトのメンバーが全てインライン関数ならテンプレートと同じだと。
ついでにインライン関数でも同じになると思う。
>>704
速いかどうかは人に聞く前に実測しる。
ストップウォッチ計測もアセンブラソースも投げ出したまま
いくらきれい事を並べても所詮は空想論、論じる価値がない。

それからtemplateとinlineは別物。
template化したからといってそれでinline化を要求したことにはならない。
Bjarneくらいしっかり読んでおくことも
実測値から考察をするにあたって必要なことだ。
710704:03/10/04 23:47
レス有難うございます。初心者なので傾向が知りたかったのです。

>>705 実際に走ってる事を確認するために書いただけです。
>>709 確かにそうですが、皆さんはどのように使い分けているのか教えていただけますか?
>>710
使い分けるも糞も必要なところで使って必要ないところで使わない、それだけだろ。
必要ないところで使うのはただの馬鹿だし、必要ないところで使わない選択肢はない。
>>710
もっとC++関係の書籍を読んで勉強しな。
そうすれば>>711の言ってることがわかるようになる日がくるかも。
来なければ、向いてなかったってことだ。
713711:03/10/04 23:58
いや、一生来ないだろ
×必要ないところで使わない選択肢はない。
○必要なところで使わない選択肢はない。
714704:03/10/05 00:41
両方でコーディング可能な場合はどうしたらいいんですか?
>>714
文盲?

> 必要ないところで使うのはただの馬鹿

両方で出来る=関数で出来る=わざわざファンクタにする必要なし
テンプレートクラスの使い方が難しいね。
Modern〜の使い方みたいなスマートな奴を
スパスパ思いつくぐらいになりたい。
より適当な方を選ぶ。
ボーランドのコンパイラだとファンクタとかインライン展開してくれなかったりしますか?
なんかqsortの方がstd::sortより3倍速いんだけど。

一応下記のコードなんですが。
わざわざc_strとstrcmp使ってるのはoperator==よりこっちの方が速かったからなんですが…

//qsort
inline int personsortbynameproc(const void *a, const void *b)
{
 return strcmp(((Person *)a)->GetName(0).c_str(),
  ((Person *)b)->GetName(0).c_str());
}

//std::sort
struct PersonNameComapare
{
 inline operator ()(const Person &a, const Person& b) const
  { return strcmp(a.GetName(0).c_str(), b.GetName(0).c_str()) < 0; }
};
719704:03/10/05 12:15
>>715 どうも。関数>ファンクタって事ですね。>>706さんと矛盾してますが。
さらに質問。
template<class T>
struct less : public binary_function<T, T, bool> {
bool operator()(const T& x, const T& y) const;
};
は何故ファンクタにしてるんですか?関数でいいじゃないですか。
単に、binary_functionを継承したかったからですか?
そうです
721704:03/10/05 12:21
>>720 ありがとうございます。すっきりしました。
アフォしかいないのかここは…
とりあえずEffectiveSTLの6,7章を穴が空くまで読んどけ。
723704:03/10/05 12:47
>>722 買ってきて読んでみます。でも相談室なんだから許してください。
724fool:03/10/06 09:08
そりゃ重要な局面で必要ないところで遊んだためにコケたらヴァカだろうけれど、
時間のある時にいろんな方法で遊んで手札を増やす事は、イカスとおもうズラ。

必要ないからってのは、解らん事から逃げる口実に使う言葉であって、
合理的に選択を絞る理由になってないんじゃない?(トカアオッテミルテスト
725デフォルトの名無しさん:03/10/06 10:09
テンプレート関数のexportの実装方法を解説してるドキュメントは
ないでしょうか?Cに慣れた頭には、これはどう実現してるのか
さっぱり分りません。
>>719
1: 代わりに template<class T> bool less( const T& x, const T& y ); だとすると、
 オーバーロードの関係で std::sort( v.begin(), v.end(), &less<T> ); と書けない。
 std::sort( v.begin(), v.end(), static_cast<bool (*)(const int&,const int&>(&less<T>) );
 …みたいに長ったらしくなる。

2: std::set や std::map などでは、比較基準としてファンクタを取れるように
 設計しとく必要がある。(関数じゃなくてファンクタを使いたい場合も当然あるので。)
 なので、デフォルトの比較基準である less<T> も関数でなくてファンクタとして
 用意しとくのが自然。

3: template<template<class> class F = std::less> class { ... };
 みたいに書いて、less<int> やら less<string> やら…の
 具体的な関数を全て渡さなくても std::less というテンプレートを
 比較ポリシーとして一気に渡す、みたいな手が使えるようになる。

etc.

> 何故ファンクタにしてるんですか?関数でいいじゃないですか。
もちろん、関数を使えば済むところをファンクタを使うのは無意味だ。
例えば、i < j で済むのを less<int>()(i, j) とか書いてたら変。
んだけど、特に大小比較のような他の演算のパラメータとして渡すことの
多い演算は、上に幾つか上げたようにファンクタにしとくと使い所が広がって嬉しい。
>>726
加えて、関数ポインタを使うとインライン展開できない処理系が大半だから。
ファンクタだったらどの処理系もインライン展開できるのか?
関数ポインタよりは可能性高そう
横からお邪魔して質問しますが、
実際にインライン化されてるかどうか知るには
呼び出しを大量にかけてベンチ取るしか方法はないですか?
>>730
アセのソースみたりしないの?
732730:03/10/06 21:33
>>731
あー、すんません。そういう技量はないんですよ。
>>730
私は大抵逆アセンブルコード見て…

って、よく考えたらmapファイルあたり吐かせたらそのあたり分からんかな?
734730:03/10/06 21:48
うむ、何を言われているのかさっぱり分からん。
ただ一つ、もっと勉強せないかんということだけは分かりました。
修行してきます。。。お邪魔しました。
今mapファイル見てきたが。
どうやらinlineで埋め込まれちまった関数はmapファイルに出力されないらしい。
まあ至極当然なのは確かだが、せめてinlineとかって表示してくれれば便利なんだが。

…inlineはコンパイラの仕事でmapはリンカの仕事か? とすると無理か…?
まあそのへんは詳しくないのでともかく。

というわけでmapファイル出力させて、
mapファイルを対象関数名で検索して出て来なかったら多分inline展開されてる。
でなきゃ、一回も呼び出してなかったせいで最適化の結果削除されたとかな。
が、もっともinline展開しても実体が作られる場合
(例えばその関数ポインタを使ってるとか)があるので、
mapファイルに出力されていてもinline展開されてるってことはあるかもしれず。

ちなみに確認したのはVC7.1。
どう考えたってアセンブラ出力を見るのが一番確実だろ
inline関数のアドレスを外部のモジュールに渡すときは
どうなるんでしょうか?inline関数が基本は型付きマクロで
ありながらポインタとしてやり取りできるとなると、どこまでが
インライン化され、またそうでないのかが明確になっていないと
だめですよね。
>>732
その時点で終わってる
インライン=アセンブラレベル

アセンブラをじっくり読んでみる気のない者は二度とインラインを口にするな
ハード屋とじっくり話してみる気のない者は二度と実行速度を口にするな

やる気のない者は業界を去れ
空想論ばっかりで汚れねえおこちゃまは公害だ
>>737
規格でどーなってるのかは知りませんが。
とある実装系では
「要所要所にinline展開しつつ、外部から呼ばれるための本体ももつ」
という実装がしてあったとかしてないとか。
聞いた話なんで鵜呑みにされても困りますけど…

もしこのようになってるとしたら、
関数ポインタ使ってるとmapファイルに載っちゃうんで、
mapからのinline判定はむりっぽそうですね。

とゆーのが735の
> inline展開しても実体が作られる場合
> (例えばその関数ポインタを使ってるとか)があるので、
の部分かな?
インライン展開されていても、それとは別に実体があることもある。
だから、関数のアドレスを外部に渡しているからといってインライン展開されない証拠にはならない。
使われない関数は実体がないこともある。
だから、マップファイルにシンボルがないからといってインライン展開される保証にはならない。
つーか全体としてのパフォーマンスに影響がなければinline展開されてようが
されていまいがしったこっちゃないと思うが。asm読めないならなおさら。
逆に言えば、inline関数が関数としてインスタンス化されるのは
どこなんでしょうか?関数のアドレスを取得した時点ではまだ実体は
必要ないんですよね。インスタンス化のためのなんらかの条件があるはずですが。。。
>>742
アドレス引いたらリンケージを確保するために実体化するんじゃないか?
>>743
なるほど。そう言われてみればそうですね。
inline指定されたからといって、inline展開されることが保証されるわけではない

この時点で、742のような議論はすべて処理系依存であり、無意味。
自分で出力を確かめろと何度も言われている。
もちろん、その処理系のそのバージョン限定でしか通用しない知識だが。
746デフォルトの名無しさん:03/10/07 10:02
コンテナのある一つの要素を、ずっと見張ったり操作する必要があるのですが、
iteratorをつかって、いつまでもその要素を参照しているというのは、ありなのでしょうか?
(もちろんコンテナの順番が変わったりするまでですが)

今まで見たソースには、iteratorをそういう用途に
使っている物が、ひとつも無かったので不安でして…。

いまはコンテナをポインタ型で持ち、参照もiteratorではなく、
ポインタでやっているのですが、これだと管理が厳しくて。
要素を追加したり削除したりしないなら大丈夫
>>747
おお、ではこういう使い方もありなのですね。
実装依存とか変なのなくて安心しました。レスありがとうございました。
とりあえずVC6での話だけど通常の関数にインライン関数のポインタ渡したら関数が作られていた。
インライン関数にインライン関数のポインタ渡したら展開されていた。
両方がインライン関数、もしくはテンプレートなら展開されると推測・・・大体の場合だけど。
>>749
普通に考えてインライン関数のポインタなんか取れないから、通常の
関数にしていると推測。関数テンプレートも同じ。
>>750
749はソースコード上の事だと思はれ。
インライン化された関数じゃなくて、
inline 指定した関数ってことだろ。
>>746
コンテナ毎にどの操作でiteratorが無効になるかちゃんと定義されてる。
>インライン関数のポインタなんか取れないから

何が普通だ どアフォ
templateなんか全然関係ねえんだよ
軽い気持ちでいっぺん氏んでこい
755704@お勉強中:03/10/07 23:08
>>726 丁寧に書き込んで頂いて有難うございます。
Effective-STL買ってきて読み始めました。
ついでにプログラミング言語C++も買いました。
分厚くて1部分しか読んでないですが、関数オブジェクトの方が速いと書いてありました・・・
非業界人がC++使いこなせるようになるのでしょうか不安です^^;
>>755
非業界人の方が自由に使いこなせる。

業界人で組み込み系の部署につかされたら悲惨。iostremは使わないわ
変数の命名はハンガリアン記法でなくて会社独特の物だし、ヘッダファイ
ルもカスタマイズされたものだけだし、C++でなくてCで十分だと思える。

そうでなくてアプリを作る部署ならC++も生きてくるが、規格書作るのが
大変。クラスの定義は一番初めに決めなければならないし、そこから
子クラスを導出するデザインも全部決めなければならない。(UML)
boostはもちろん使えない。STLでも使えるのはstd::vectorのみに限られて
いたり、よくてstd::mapやstd::multimap止まり。

ファンクタはアルゴリズムから呼び出すのだけど、これも規格書の段階
で決めておかないと使用禁止。本当にうぜーわ。数人〜数十人でcvs
使うからそれくらい厳格にしておかないとバグ探すのが大変なんだよ。

#教訓。C++を「学ぶ」のと「飯の種にする」のとでは行って帰ってくるほどの
#差がある。
あ、もう一つね。

export template に対応したC++処理系は今の所仕事では使っていない。
そのためtemplateは複数の人で開発するのにほとんど無意味。従って
重要なテンプレートはすべてヘッダファイル入り。C++にしてからヘッダ
ファイルを作るのにかかる時間がすごく延びた気がする。
>>755
大丈夫、業界人だって使いこなせてない香具師が多いから。
>>756
会社やプロジェクトによりけりだって。俺のトコロは STL も Boost も遠慮無く使う方針で
行ってる。

変数の寿命管理は原則としてスマートポインタ必須で生 delete 禁止。
スマートポインタとは古いな。時代はGCだろ。
C++にeclipseのようにgetterとsetterを自動で書いてくれるツールはありませんか?
お勧めの物を教えて下さい。
>>761
マクロプログラミング
>>761
全データメンバに洩れなくgetter/setterがついてるコードでも書く気か?
情報隠蔽の理念と根本的に対立する思想だな
>>763
eclipseの場合は変数ごとにgetter,setterのチェックボックスのツリーが出てきて
自由にgetterとsetterを追加削除できるんです。
getterだけ追加してreadonlyにする事も簡単に出来ます
C++ではset/getなんてしないよ。
コンストラクタ以外のメンバは全て全部privateにして、
通信する相手は友達だけにする。

のは冗談としても、普通に構造体で直にアクセスさせることも
多い。set/getなんてまどろっこしいことはあまりやらない。
C++でPascalのようなbegin/endが使えるようになるツールはありませんか?
C++でAPLのように行列の計算が入出力込みで1行で書けるツールはありませんか?
C++でCOBOLのようにPERFORM THRUが使えるツールはありませんか?
C++でJavaのようにGCが使えるツールはありませんか?

てめえで作れつーの
>>765
C++をbetter Cとして使うのならそれでいいのかもしれませんが、
私はOOPLとしてC++を使っているので。
setterとgetterの利点についてはこの辺読んでください。
http://www.muraoka.info.waseda.ac.jp/~fukumori/oo/why_use_getters_and_setters_j.html

>>766
あなたは勘違いしてると思うんですが、setter,getterはJava特有の物ではありません。
OOPLならばどんな言語でもsetterとgetterは書くはずです。C++も無論そうです。
関係ありませんが、C++でGCが使えるライブラリは既に存在しますし私も利用しています。
ちょっと面倒だがそれくらい自分で書いたほうがいいかも。
ツール使う方がかえって面倒になることがある(例:VC++のメンバの追加ダイアログ)
YAGNI,YAGNI、と云いつつ、広域置換を使う俺。
>>761
ない
どうも無さそうですね。仕方ないんで自作して使います。
>>767
知ってるOOPLの範囲狭すぎ
>>772
propertyの存在も知っています。
結局propertyにしてもgetとsetはありますよね。
>>767
getter/setterが必須だと思うのなら手間を惜しむな。
#本来全く考えなしにgetter/setterを書くべきではない。そうであるなら大した手間ではないだろう。

どうしても手間を惜しみたいならeclipseで書け。
まさかeclipseではJavaしか開発できないなんて思っているわけじゃないだろ?
>>774
CDTにプロパティ自動生成があればeclipse使うんですが、
JDTにしか無いんですよね。リファクタリング機能にしてもプロパティ自動生成にしても。
>>773
…。

では、setter/getterなんて本来必要なくて、直接そのオブジェクト自身にIOまで行わせるべきだという主張の存在は?
(クラス構造が静的だと辛いけど、後付け可能なら無茶な話じゃ無い)
>>776
そもそも動的型付け以前に、
C++のようなプリミティブ型が存在する言語にそのような理想論を持ち込まれても困るんですが。
Java厨にはかまうな。放置しろ。
>>778
なんでそこでJava厨が出てくるのか貴方の頭の構造が全く理解不能です。
「OOPLとしてC++を使っている」、と、
「Javaの言語機能という制限上で培われた流儀のOOPをC++でも行おうとしている」、の微妙な違いというか
OOPLならば(>>767)って言うくらいだから
Java/C++/C#/ObjectPascal etcの「なんちゃってOO言語」じゃなく
SmalltalkとかEifellとかの純粋なOOPLの事を言ってるんだろうね。
こういう生物をJava厨って呼ぶのか。
783704@お勉強中:03/10/09 03:17
えー、本を読んでいるとメンバ変数はprivateに入れろと書かれていますが、
やっぱり時と場合によってpublicにする場合もあると言う議論でしょうか?

このレベルだと翻訳して貰わないと良く理解できません。
話しそれて申し訳ないけど、外からは使えないのに
記述的に公開しているprivateって概念は、
糞だと思うが仕方ないんだよな…
>>767
> http://www.muraoka.info.waseda.ac.jp/~fukumori/oo/why_use_getters_and_setters_j.html
は、「データメンバをpublicにせずに、代わりにgetter/setterを
使うことの利点」 だろ?「privateメンバには対応するgetter/setterを
設ける」 という習慣はやめた方がいい。

Why getter and setter methods are evil
 http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html
でも読んでこい。
>「privateメンバには対応するgetter/setterを設ける」
って誰が言ってるんだ?>>763
>>785 代りにどうしたらいいの?
>>784
pimpl知らないの?
>>770
すてき
>>786
761。
ツール=機械と読んだ。
自動=機械的に=人情は関係なしと読んだ。
privateはお前が言い出した妄想。
791デフォルトの名無しさん:03/10/10 21:46
以降の流れについて説明する「まとまった処理についてのコメント」と、
「ちょっとした補足コメント」を区別したいのですが、これ!という方法があったらぜひ教えてください。

■気分的にはこんな感じです
//まとまった処理についてのコメント{
 //ちょっとした補足コメント
 //ちょっとした補足コメント


■↓だと「「ちょっとした補足コメント」の方が、スペースや位置的書きづらくて…

  //これから、まとまった処理が始まるよ

  int hoge = 7; //hogeについての、ちょっとした補足だよ

■↓だと、両者の区別がいまいちしづらくて…

  //これから、まとまった処理が始まるよ

  //hogeについての、ちょっとした補足だよ
  int hoge = 7;
/////////////////////////////////////////////////////////////
//まとまった処理についてのコメント
/////////////////////////////////////////////////////////////
hage::hage()
{

//hogeについての、ちょっとした補足だよ
int hoge = 7;






}
793791:03/10/10 21:58
>>792
にゃるほど!ちょっと大人しめにしてマクロ登録しますた
レス感謝!ありがとうございやした
794791:03/10/10 22:00
いやまてよ、「まとまった処理は関数にしろや」というアイロニーも
込められてるっぽいな。お気遣いありがとう。
/**
* まとまった処理についてのコメント
* @param
* @return
*/
796デフォルトの名無しさん:03/10/10 23:30
>>784
つかう場面がわからない君がクソだと思うぞ
>>796
誤爆?
>>797
正爆
799デフォルトの名無しさん:03/10/11 10:50
最近ようやく入門書を読み終えて関数やクラスの使い方が
わかってきた初心者ですが、質問させてください。

入門書やWeb上に文字列を扱うクラスなどはよく載ってるんですが、
それ以外に、自分のしたい事が実現できるクラスはみなさんどーやって
探してるんでしょうか?ネット上を徘徊したり本を読み漁って、
偶然そのクラスが使われているサンプルを見つけるんでしょうか・・・?
そうだとしても、最初に使った人はどーやって使い方を覚えたのか気になります。
C++のクラス一覧みたいなものがどこかにあったら教えてください。
>>799
意味分からんw

クラスライブラリのリンク集ならこのスレの始めに
あるぞ。使い方とか、最低限ドキュメントに目を通してから
言えよ。
>>799
無いクラスは作るものだ。
>>799
使い方というか、アルゴリズムの解説してる本なら沢山ある。
アルゴリズムの解説を読んで、クラスは自分で書く。

あと、有名なアルゴリズムなら大体誰かがコード化してる。
問題は大半が英語なのと、C言語(非OOP)で書かれてる事が多いこと。

C++ のクラス一覧は MSDN でも嫁。
>>802
>C言語(非OOP)
洩れの知る限りCで書かれたライブラリの多くは充分にOOPだが何か?
C++で書かれたMFCなんぞよりもずっとマシだったりする
>>803
ああ、まあ、ライブラリと呼べるようなまともな奴は確かに OOP してるし、
MFC の方がよっぽど糞だけど。

逆に俺は C で OOP してるソース見ると、
素直に C++ 使えよというやるせない気持ちになる。
805デフォルトの名無しさん:03/10/11 14:09
char *buf=new char[100];
などという感じで確保したメモリを解放するときは、
delete buf; と delete[] buf; のどちらを使えばいいのでしょうか。
とりあえずコンパイルはどちらも通るんですが。
入門書を穴が開くほど読め。
話はそれからだ。
>>805
これを試して見るべし。分からなければmyallocは気にしなくて良い。
#include <iostream>

struct myalloc_type{} myalloc;
void *operator new(size_t size, myalloc_type)
{
&nbap;&nbap;&nbap;&nbap;std::cout << "new\n";
&nbap;&nbap;&nbap;&nbap;return ::operator new(size);
}
void *operator new[](size_t size, myalloc_type)
{
&nbap;&nbap;&nbap;&nbap;std::cout << "new[]\n";
&nbap;&nbap;&nbap;&nbap;return ::operator new[](size);
}
int main()
{
&nbap;&nbap;&nbap;&nbap;char *buf = new(myalloc) char[100];
}
>>806
配列サイズが定数のときの挙動までは書いていない入門書もあると思われ。
808807:03/10/11 14:24
ミスった。もう一回
#include <iostream>

struct myalloc_type{} myalloc;
void *operator new(size_t size, myalloc_type)
{
    std::cout << "new\n";
    return ::operator new(size);
}
void *operator new[](size_t size, myalloc_type)
{
    std::cout << "new[]\n";
    return ::operator new[](size);
}
int main()
{
    char *buf = new(myalloc) char[100];
}
>>805
delete[]
>>807
定数かどうかがどう関係あるんだろうか。
811デフォルトの名無しさん:03/10/11 15:00
実行時にバンドルなんたらって出るエラーは、
どういうとき出るエラーか、誰か教えてくだされ。
newで配列を確保する場合、もしそれがクラスオブジェクトの配列ならば、
delete[]とdeleteのどちらでも、配列の要素すべてが解放される。
違いは、delete[]の場合全要素に対してデストラクタが呼ばれるのに対し、
deleteでは先頭要素のみデストラクタが呼ばれるということである。

と教科書に書いてあってびっくり。今まで知らなかった。
まさか、未定義だろ
各処理系でどうかは知ったことでないが
>>812
VC++だけ。
>>312
そんな教科書捨てろ
どこに嘘が書いてあるかわかったもんじゃない
C++の教科書は禿本かPrimerしかないと思ってるけど。
変に読者にこびったような本はダメぽ。
禿本って何?禿く分かるC++?(謎
818B.S:03/10/12 00:30
禿々言うな。
お前等だって将来禿るかも知れないんだぞ?
うるせー禿
既につるっつるに剃りあげてますが何か?
まだあるのに自ら剃るなんてなんて罰当たりな
いやらしい程のM禿で、見るにみかねて、、、スレ違いスマソ
>>816
確かにあの二冊は読者に優しくないよな。
分厚くて重くて大きくて・・・・
>>823
私は禿本を風呂の中に持ち込んで読みましたが何か?
本は湯船につかってゆっくり読む習慣なので。
>>824
ああなるほど。水に浮かべれば浮力で重さが気にならなくなると。
>>823
私はあの本を見ながらオナニ○しましたがナニか?
「ハァハァ・・・・・vector
 ハァハァ・・・・・string
 ハァハァ・・・・・いてれーたぁー。」
と、このように。
最近VC++触りだした、浦島太郎ですが。
VCでの最初のスタートは下記のようですが。
_tMain(....)
_tWinMain(....)

昔は  main()   WinMain()  だったはず。
どういった理由や意味で変わったのでしょう?
「_t」て、なに?
いろいろサーチしたけど、見つからなかったのでお願いします。
>>827
UNICODEに対応させるため
質問させて下さい。VC6.0です。

#include <iostream>
#include <iterator>
#include <sstream>
#include <conio.h>

void main()
{
std::wostringstream ss;
std::ostream_iterator<wchar_t, wchar_t> it(ss, L",");
*(it++) = L'A';
*(it++) = L'B';
*(it++) = L'C';
std::wcout << ss.str() << std::endl;
getch();
}

A,B,C, と表示されるのを期待してるんですけど、
wchar_tがshortとして扱われる為
65,66,67, と表示されてしまいます。
どうしたらいいんでしょう?
>828 さんありがとうございます。
確かに昔は内部コードはSJISだったかな、(うろ覚え
「_t」でソース内の日本語文字列がUNICODEになって
オブジェクトになると考えていいですか?
>>629
wchar_tを正しくサポートするコンパイラを使う。
>>831
いい加減、VC++6ってのはもうダメだろ。金ないなら
.NETSDKにcl.exeついてくるんだからそれでもつかえと。
cygwinでもいいけどさ。
833829:03/10/12 21:42
>>831-832
なるほど、VC6のせいでしたか。
boost::regex使ってて出た問題だったんですが、
これじゃ他の部分もまともに動いてるかどうか、わからないですね。
どうもありがとうございました。
>>830自己レス。
main
_tmain     (Win32
_tWinMain   (MFC
でやってみたけど、EXEをHEXダンプで見たら、3つともSJISで
文字列入ってた、謎だ。
多分どこかが、UNICODEなんだろう、きっと・・・・・
何処なんだろうと、聞いてみる?^^;
WinMain(HINSTANCE, HINSTANCE, char*, int);
wWinMain(HINSTANCE, HINSTANCE, wchar_t*, int);
>>834
828がUNICODEに対応させるとは書いたが、UNICODEになるとは誰も書いてない。
コンパイルオプション
>>833-837さんいろいろありがとう。
いろいろやって見て、一応の理解ができました。
ちなみに、>>829のソースはVC++.NET2003ではA,B,Cと出ます。
みなさんありがとーー
>>834
そんなのどうでもいいから早くUnicodeでコンパイルする方法を調べろ
>>829
std::locale::global(std::locale("japanese"));
IDEとしてのVC6にはなんの不満もないので、cl.exeだけ差し替えて、
(バッチ使って別にコンパイルとかではなく)、そのまま使えないかなぁ…。

などと>>832見ながら思った秋の夜長…。
>IDEとしてのVC6
class宣言がマクロ化されてるとアウトなのはちょっと勘弁してほしい
templateインスタンス型のメンバを保守できないとわかったときはズッコケた
ncbdj状態も頻度高杉
>>841
.NETSDKのcl.exeとPSDKとVC++6を組み合わせて使ってます。
特に問題ないです。
.NET SDK の cl.exe は最適化できないとか言ううわさを聞いた気がするんだけど
その辺りどうなの?
>>845
できないといわれてるけど、/G[3-7]オプションはとおるよ。
versionは13.10.3077
/G[3-7]は単体で意味あんの?
/O[1-2]と組み合わせないと意味無いんじゃないの?
>>847
Uni厨で済みませんでした。無知で恥かしいです。
$cl.exe /G6 /O2 test.c
Microsoft(R) 32-bit C/C++ Standard Compiler Version 13.10.3077 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.

cl : コマンド ライン warning D4029 : 標準の編集コンパイラでは最適化は使用できません。
test.c
Microsoft (R) Incremental Linker Version 7.10.3077
Copyright (C) Microsoft Corporation. All rights reserved.

/out:test.exe
つーかgccでも単体で-march=i686なんてやらないで-O2とか-O3と組み合わせて使うよね。
RDBで複数の項目にインデックスを貼って高速に検索できるのと同じように、
2種類以上の項目で対数時間で検索ができるようなコンテナはC++には無いですか?
分かりやすく言うと
class Board
{
 std::string name_;
 int id_;
 time_t time;   

 //メソッド省略
 //findByName(), findById(), findByTime() 
};

このようなクラスのインスタンスをたくさんコンテナに格納して、
findByName(), findById(), findByTime()のどれでも線形時間ではなく、
対数時間で結果のイテレータが帰ってくるようなコンテナが欲しいんですが。
>>850
標準だと無いと思うよ。
852デフォルトの名無しさん:03/10/13 15:10
後学のために伺いたいのですが、
「std::listの要素をサーチして、条件が一致したものをlistからeraseしていく」

…という作業を、普通に初期化した形のfor文で、
実現することは出来ないのでしょうか?
>>852
なぜforで? std::remove_ifじゃ駄目?

まあ、forで手書きするならこんな感じか:
typedef list<T> some_list_t;
some_list_t a_list;
for ( some_list_t::iterator p = a_list.begin(); p != a_list.end(); ) {
 if ( 条件 ) {
  p = a_list.erase(p);
 } else {
  ++p;
 }
}
下記のコードでなぜか最後の行が2回読み込まれてしまうようで、
最後の人が2人になってしまいます。
どう書き直せばいいのでしょうか?

ifstream ifs("address.txt");
vector<Person*> vec;
string name, address;

while(ifs)
{
 ifs >> name >> address;
 vec.push_back(new Person(name, address));
}
855852:03/10/13 15:44
>>853
レスサンクスです。いえ、なんの変哲もない順次サーチ=for文、
みたいな固定観念ができてしまっていて…。

for文の例、およびremove_ifの提示ありがとうございました。
remove_if使ったこと無かったです。これから調べてみます。便利ですね。
>>855
あ、listには専用にメンバ関数としてremove_ifがあるから
それ使うよろし
>>856
了解しました。追い銭重ね重ね感謝。
858854:03/10/13 15:56
自己解決しました。
こうやったらうまくいきました。

for(;;)
{
ifs >> id >> name;
 if(!ifs)
  break;
 boards_.push_back(BoardPtr(new Board(id, name)));
}
859854:03/10/13 15:57
間違えて元のコードを晒してしまいました…
>>850
std::set<boost::shared_ptr<Board> > index_by_name(pred(BY_NAME));
みたいなのをインデックスにしたい項目の数だけ作って全部に登録、とか?
861デフォルトの名無しさん:03/10/15 01:38
下記のコードですが、count_ifのところでsegfaultを起こしてしまいます。
どこがおかしいんでしょう?

#include <iostream>
#include <vector>
#include <algorithm>


static bool check_c(char input){
return input=='c';
}

int main(){
vector<char> sequence;
int c;
for(int i =0; i < 2; i++)
for(int j =0; j < 5; j++)
sequence.push_back( 'a' + j );
cout<<sequence.begin()<<endl;
cout<<endl;

c = count_if<vector<char>::iterator, bool(char)>(sequence.begin(), sequence.end(), check_c);
c = count<vector<char>::iterator, char>(sequence.begin(), sequence.end(), 'c');

cout<<c<<endl;
}
>>861
segfault以前にコンパイル通らないはずだから確かめてないけど。

> cout<<sequence.begin()<<endl;
ここだろうね。
不完全クラスに継承関係を明示する方法ってあります?

基底クラスのポインタに変換するのに、無理矢理reinterpret_castして、
とりあえず正常に動かすことは出来るのですが。
864861:03/10/15 01:56
>>862
その行をコメントアウトしても変化はありません。

実は、そこはただの手抜きで…
デバッガから見て、char* だったのでつけ足しただけのものなんです。
c = count_if<vector<char>::iterator, bool(char)>(sequence.begin(), sequence.end(), check_c);



c = count_if( sequence.begin(), sequence.end(), check_c);

にしてみる。
>>864
count_ifの中は追ってみたの?
なんにせよコンパイラもSTLの種類も示されないんじゃなんともね。
using namespace std;が抜けてるみたいだし。
>>861
count_if<vector<char>::iterator, bool(*)(char)>

bool(char)でコンパイル通るのが悪いと思うんだが。
>>867
bool(char)は正しい表記だったと思うよ
>>868
表記は正しいが、そのテンプレート引数だと関数型を値渡しすることになる。
関数型の値渡しができたっけ?
>>869
bool(char)はbool(*)(char)と同等だった気がする。
どこで見たのかは忘れたが。
871870:03/10/15 02:20
>>869
ゴメン、激しく俺の勘違い
>>867
それが正解でした。ありがとうございます。
コンパイラは、gcc-2.96-113 というRedhat Linuxのものです。

本来は通らないはずのコードだったのか…
gcc 3.3.1 (cygming) でテストしてみた。

↓は"redefinition of `int call(int (*)(int))'"
int call( int x(int) ){ return x(0); }
int call( int(*x)(int) ){ return x(0); }

↓はエラー無し
template< typename Function >
int call( Function x ){ return x(0); }
template int call<int(int)>( int(int) );
template int call<int(*)(int)>( int(*)(int) );

バグってるように見える。
>>861はgccかな?
VC++7.1

template< typename T > char const* typename_of( T r ){ return typeid( r ).name(); }
int main(){
std::cout << typename_of< bool(char) >( check_c ) << std::endl;
std::cout << typename_of< bool(*)(char) >( check_c ) << std::endl;
}

一つ目は関数が値渡しされてた。
式内ではどちらも関数ポインタとして扱われるもよう。
8.3.5 -3- より。
"After determining the type of each parameter, any parameter of type ``array of T'' or ``function returning T'' is adjusted to be ``pointer to T'' or ``pointer to function returning T,'' respectively."

というわけで、関数の引数においては>>870が正しいみたい。

14.8.2 -3- によると、
この変換がテンプレートのときにもいちおう関係はするようだが、
Noteとして書かれている
"f<int>(1) and f<const int>(1) call distinct functions even though both of the functions called have the same function type."
というのが怪しい。
変換後の仮引数がいっしょになるとしても、別々の関数としてコンパイルされるみたい。

で、gccで試したところでは、bool(*)(char)で実体化したほうは正しく動作するが、
bool(char)で実体化したほうのコードが死んでるっぽい。
仮引数リストは同じなので同じコードになるはずなのに、
bool(char)で実体化したときになんだかへんなコードが出る。クラッシュするコードかどうかは未確認。
876861:03/10/15 03:29
バグ持ち(bool(char))とバグ無し(bool(*)(char))のアセンブラ出力をdiffで並べてみました。
スタックに積んでルーチン呼ぶまでは一緒ですが、確かにルーチン内の処理が各々で異なっています。

--- bug.s Wed Oct 15 03:14:53 2003
+++ non-bug.s Wed Oct 15 03:13:55 2003
@@ -17,25 +17,21 @@
movl %eax, %eax
pushl %eax
.LCFI10:
- call count_if__H2ZPcZPFc_b_X01X01X11_Q2t15iterator_traits1ZX0115difference_type
+ call count_if__H2ZPcZFc_b_X01X01X11_Q2t15iterator_traits1ZX0115difference_type
------------------------------------------(略)----------------------------------------------------
- .section .gnu.linkonce.t.count_if__H2ZPcZFc_b_X01X01X11_Q2t15iterator_traits1ZX0115difference_type,"ax",@progbits
+ .section .gnu.linkonce.t.count_if__H2ZPcZPFc_b_X01X01X11_Q2t15iterator_traits1ZX0115difference_type,"ax",@progbits
.align 4
- .weak count_if__H2ZPcZFc_b_X01X01X11_Q2t15iterator_traits1ZX0115difference_type
- .type count_if__H2ZPcZFc_b_X01X01X11_Q2t15iterator_traits1ZX0115difference_type,@function
-count_if__H2ZPcZFc_b_X01X01X11_Q2t15iterator_traits1ZX0115difference_type:
+ .weak count_if__H2ZPcZPFc_b_X01X01X11_Q2t15iterator_traits1ZX0115difference_type
+ .type count_if__H2ZPcZPFc_b_X01X01X11_Q2t15iterator_traits1ZX0115difference_type,@function
+count_if__H2ZPcZPFc_b_X01X01X11_Q2t15iterator_traits1ZX0115difference_type:

877861:03/10/15 03:30
.LFB10:
pushl %ebp
.LCFI38:
movl %esp, %ebp
.LCFI39:
- subl $24, %esp
+ subl $8, %esp
.LCFI40:
- movl 16(%ebp), %eax
- movl 20(%ebp), %edx
- movl %eax, -8(%ebp)
- movl %edx, -4(%ebp)
- movl $0, -12(%ebp)
+ movl $0, -4(%ebp)
.p2align 2
.L54:
movl 8(%ebp), %eax
@@ -45,28 +41,28 @@
.p2align 2
.L57:
subl $12, %esp
- leal -8(%ebp), %edx
movl 8(%ebp), %eax
movsbl (%eax),%eax
pushl %eax
+ movl 16(%ebp), %eax
.LCFI41:
- call *%edx
+ call *%eax
x86のアーキテクチャ調べて来たよん。
結局、lealで関数ポインタを二重参照しているのが原因とわかりました。

count_if(8(%ebp),12(%ebp),16(%ebp)){
movl 16(%ebp), %eax
movl %eax, -8(%ebp)
leal -8(%ebp), %edx
call %edx
}
↓省略
count_if(8(%ebp),12(%ebp),16(%ebp)){
leal 16(%ebp), %edx
call *%edx
}
↓C++風に。
count_if(*a,*b, void (*func)()){
*(&func)();
}
879863:03/10/15 05:05
こっちも意見を聞かせてよ。
ソースがないから駄目なのか?

<B.H>
class B {};
<D.H>
#include "B.H"
class D : public B {};

<sub.cpp>
#include "D.H"
D dins;
D *d = &dins;

<main.cpp>
#include "B.H"
class D;
void func(B *b) {}
void main(void)
{
extern D *d;
func(d);
}

func(d)をfunc(reinterpret_cast<B *>(d))にすれば、
とりあえずちゃんと動くけど
そもそも不完全クラスの宣言に
class D : public B;
と言う意味を持たせて、reinterpret_castを使わずに済ます方法はないでしょうか?
>>879
D も B もわかって無いのに reinterpret_cast 以外のキャストをどうやって実行するの?
君の使ってるコンパイラが
static_cast< B* >( D* ) == reinterpret_cast< B* >( D* )
だとしても、他の環境でもそうとは限らない。

class D: public A, public B;
なら、多分君のコンパイラでも static_cast< B* >( D* ) するためには sizeof( A ) がわからないといけないはず。
>>879
D * dではなくて B * dでいいと思うけど。
そうすればmainからDについて知る必要ないし。
//base.h
class Base{public:
    virtual void print()=0;
    virtual ~Base(){}};
//Test.h
class Test:public Base{public:
    void print();}:
//func.h
Base * CreateTest();
//sub.cpp
#include "Base.h"
#include "Test.h"
#include "func.h"
#include <iostream>
Base * CreateTest(){
    return new Test;}
void Test::print(){
    std::cout << "Test::print()" << std::endl;
}
//main.cpp
#include "Base.h"
#include "func.h"
int main(){    Base * p=CreateTest();
    p->print();//Test::printが呼ばれる
    delete p;
    return 0;
}
まあ実際はboost::shared_ptrとかstd::auto_ptrとか使うだろうけど。
>881
ああそうか、自分の例で言うところの
extern D *d;
が、そもそもD *でなくてもB *で充分ですね。

何でこんな単純なことに気が付けなかったんだ?
とにかくこれで安心して眠れます。ありがとうございました。
つかぬ事をお伺いしますが、ローカルにおける文字列リテラルが
static constであることは言語規格上、保証されていますでしょうか?
>>883
ISO/IEC14882:1998(E)の規格票は買ったか?
ここは使ってみたか?

http://www.excite.co.jp/world/text/

まさか禿本持ってなかったりしないだろうな?
885B.S:03/10/17 01:23
禿々言うな。
お前等だって将来禿るかも知れないんだぞ?
C++のコードをJavaに書き直すことはできますか?
>>886
質問の意味がうまく絞れないんだが。
888886:03/10/17 13:39
1394カメラをJavaで動かしたいんですけど、
Javaでの動かし方がよくわかりません。
そのカメラには、付属のアプリケーションが付いており、
そのソースコードも付いてました。(VCとC++)
なので、そのコードをJavaに書き直してもらいたいのです。
889883:03/10/17 13:48
すまん、禿...もといStroustrup本に書いてあった。
「文字列リテラルの型はconst char[N]であり...
静的に割り当てられる。」
char*への代入が許されるから、定数として扱うかはベンダ依存かと思ってた。

ISO/IEC14882:1998(E)の規格票は持っていない。
つか欲しいんだけどどこで手に入る?
JavaってIEEE1394というデバイスを叩けたっけ?
>>890
叩けるよ!
892デフォルトの名無しさん:03/10/17 17:21
>>888
Linux とかならできるんじゃない?

Windows だと、そのへんは stream class mini driver をDirectShow の API が
ラッパするような形になってると思うんだけど、これは Java からは使えません。
>>889
> ISO/IEC14882:1998(E)の規格票は持っていない。
> つか欲しいんだけどどこで手に入る?
http://www.techstreet.com/cgi-bin/detail?product_id=49964 とかで買える。

もっと新しい ISO/IEC 14882:2003 もすでにpublishは
されてるはずなんだけど、どうやったら手に入るのかわからん。。。
894デフォルトの名無しさん:03/10/17 20:12
複数種類のクラスをしまっておけるバッファを作る時、

class A;
class B;

class Buf {
union {
A a;
B b;
};
}

コンストラクタのあるクラスだとunionは使えないんですが、何かいい手はないでしょうか?
マクロかboostか何かでmax(sizeof(A), sizeof(B))を取ってやるしかないんでしょうか。
>>894
cvsからboostの最新版を落としてきてboost::variant。これ。
896デフォルトの名無しさん:03/10/17 20:47
>>895
あれは使っているコンパイラでエラーが出ます。
898ファイル:03/10/17 21:18
読み込みたいテキストファイルの前半にに不必要な部分があるのですが、
その部分を除いてそのテキストファイルを読み込むことはできますか?
c言語初心者です、お願いします。
899デフォルトの名無しさん:03/10/17 21:28
【1:898】「C++」相談室 part23
むむ、オヌシ初心者だな。
>>889
C++に限らず
ここは知っておくべきでしょう

http://www.jsa.or.jp/
>>898
できます。
903ファイル:03/10/17 23:08
c言語の本をまだ一冊しか読んでないので、
よくわからないのですが、どうしたら不必要な部分を
除いて読み込むことができるのですか?教えてください。
>>903
ここはC言語のスレではありません
>>894
何でそんなことしたいのかが分からん。
自分で取ったバッファ内に A とか B のインスタンスを作りたいんだったら、
placement new 使え。
907894:03/10/18 01:03
>>895
なるほど、そんなもんがあるんですか…
しかしcvsから取ってくるのはちょっと恐いなぁ。せめてリリースされてるのに入ってればいいんだけど…

>>906
通信回りのバッファの扱いとか、パフォーマンスを気にする時のメモリ管理とか、
結構色々使います。
要するにunionが使いたいところです。
>>907
ならやっぱりplacement newでいいんでは?
909894:03/10/18 01:20
>>908
いや、placement newする前、どれくらいの大きさのバッファを確保するか、の方にからむ問題です。
>>909
template<int a, int b>
class Max
{
enum{Value = a > b ? a : b};
}

char buf[Max<sizeof(A), sizeof(B)>];
あっ、適当に書いたから間違いまくってるや・・・

template<int a, int b>
class Max
{
public:
enum{Value = a > b ? a : b};
}

char buf[Max<sizeof(A), sizeof(B)>::Value];
912894:03/10/18 02:03
>>910
そうですね、そんな感じでやるかなぁというのを894の最後に書いてみたんですが、
これだとちょっと嫌な点があって、アライメントで問題が起きる可能性があるんですよね。
まぁそれは、気にしながらclass Bufの中身の配置をするか、
複数クラスの入る場所の大きさにゆとりを持たせて先頭をちょっと調整するかだと思うんですが、
union的に扱えればずっと楽なのでそういうのないかなぁと。

あと、微妙に直観的じゃないのが嫌とか、実際には数10個のクラスを押し込むので
タイプリストを作って全体のMaxを取らなくちゃとか、微妙に腰が引ける感じが…
もちろんこちらは本質的な問題ではないんですけどね。
>>894
class A{};
class B{};

class Buf {
    char buf[sizeof(A)>sizeof(B)?sizeof(A):sizeof(B)];
public:
    A & GetA(){return *reinterpret_cast<A*>(buf);}
    A & GetB(){return *reinterpret_cast<B*>(buf);}
    template <typename T> T & Get{return *reinterpret_cast<T*>(buf);}
};

int main(){
    Buf o;
    new (&o.GetA()) A;
    o.GetA().~A();
    return 0;
}
//やや力押し気味、lokiのタイプリストとか使えば3つ以上のunionにも使えるだろうけど
classをバイナリコピーするの?
union で持たせるメリットが分からないなぁ。メモリ節約したいって話なら、
operator new を自前で書いて、使う側は void* ででも受けとけば良いん
じゃないの?
>union で持たせるメリット

だから、アライメントだろ?
917894:03/10/18 03:49
>>915
うーん、節約したいというわけではないけど。例えば…

class UserBase {
int user_defined_info;
};

class A : public UserBase {}; // class Bも同様

class Elm {
Elm *next;
union {
A a;
B b;
};
};

Elmは自分が使う側、ユーザはAだのBだのを使う感じで、
Elmのリストの中からuser_defined_infoを拾ってくる場合とか。
Elmの中にUserBase *を埋めておくだけという実装も可能だけど、それだと遅くなるとか、
Elmのサイズが揃ってるとメモリ管理が容易になるとか、
ライトバリアのかかったページにしかオブジェクトをおいちゃダメとか(これは今思いついただけだけど)、
まぁそれなりに状況は考えられますね。
そこまでかつかつに効率を求めるならクラス化する必要は無いと思うが。
919894:03/10/18 04:23
>>918
そいつはそうなんですけどね。

でもまぁ少しでも楽ができてかつバグの入りにくい形にしたいじゃないですか。
今のところ、単なるstructで逃げたり、char[MAX_SIZE]で逃げたり、
Base *で逃げたりしてるわけですけど、もう少し何とかならんかなぁと。

紹介してもらったboost::variantが早く標準にならないかなぁ。
variantはコンストラクタ・デストラクタはどういう扱いなのかな?
調べておくか…
class A{
std::vector<std::vector<double> > a;
public:
A(std::vector<std::vector<double> > b =
std::vector<std::vector<double> >()) : a(b) {}
};

という感じのクラスがあります。他にも関数がありますが、std::deque
でも出来る操作しか使っていません。このクラスのコンテナを
vectorとdequeから選んだり、コンテナの中の型をdouble以外の
ものにしたりするためにテンプレートを使いたいのですが、
やり方が分かりません。どうか教えてくださいませ。。
>>918
ゲームでも作るんですか?
何かそれっぽい気がしたんですけど。
template<class T, typname U>
class A{
T< T< U > > a;
とかか?
>>920
その程度ならtypedefしとくだけで1行書き換えれば変更できるようになる。
template<template<typename> class Container, typename T>
class A{
Container<Container<T> > a;
public:
A(Container<Container<T> > b =
Container<Container<T> >()) : a(b) {}
};

A<std::vector, double> hoge; // のように使う

でも>>923が正解な気がする。
>>922-924 有難うございます。
typedef std::vector Container;
typedef std::deque Container;
のどちらかを条件コンパイルするかコメントアウトするかして
クラス定義内でContainerを使うということですね。
ちなみに、Containerにstd::listを使いたいときは、>>924さんの
方法に部分特殊化を使えばいいのでしょうか?
>>917
> Elmの中にUserBase *を埋めておくだけという実装も可能だけど、それだと遅くなるとか、
本当に遅くなるか吟味した方が良いぞ。

特にキャッシュが少ない環境だと、大きなデータをリストでつなぐより、小さなインデクスを
配列にとってデータは void* の先においておく方がキャッシュミスが減ったりするし。
>>918
クラス化するなというか、コンストラクタ・デストラクタを自前で定義しなければ良いだけ
だよね。初期化用のメンバ関数を別に定義すれば良いだけ。

そういう形で使う以上、いずれにせよ A, B の確保・解放はユーザ側ではなく Elm 側で
行うんだろうし。
鈴木宗男氏が立候補を断念したそうだ。
>>928
誤爆orスレ違いだ。そう言う話題は↓でしろよ。
http://pc2.2ch.net/test/read.cgi/tech/1036811974/l50
930デフォルトの名無しさん:03/10/18 18:14
Visual C++ Runtime Library の メッセージボックスが開いて、
Runtime Error!
とメッセージを残して、強制終了(ノToT)ノ  なぜだ〜
931894:03/10/18 19:00
>>921
サーバとか、言語処理系とか、ゲームとか。

>>926
そうですね。まぁ>>917の例でAがでかくなったらUserBaseのみElmに入れて
A固有メンバはpimpleでしょうけど。
まプロファイル取らないとなんとも。

>>927
そうですね。その方法でいいと思いますが、
微妙に嫌なのは、デフォルトコンストラクタに相当するものが
void A::init() { UserBase::init(); ... }
と、必ずBaseクラスの初期化メソッドを明示的に呼ばなきゃいけない点かな。
932ちんげ:03/10/18 19:04
c++のソフトはwinnyで落とそう。
933デフォルトの名無しさん :03/10/18 21:28
クラスのメンバ関数で
引数に継承元のクラスのオブジェクトを入れたら
「シンタックスエラーerror C2061: 構文エラー : 識別子 'class1' がシンタックスエラーを起こしました。」
というエラーが出てしまいます。
何が原因なんでしょう?
後、シンタックスエラーって何ですか?
934デフォルトの名無しさん:03/10/18 21:38
>>933
文法違反。
シンタックス=文法論
セマンティクス=意味論
つーか、ぐぐれよそんくらい
【演習】次の例文に含まれる、シンタックスエラーとセマンティクスエラーをなるべく多く指摘せよ。
C++のソフトを
そんな悪いインターネットから落としたら
危険が危ないよ

>>931
なぜ placement new を嫌がるのかさっぱりわからん。

class C
{
public:
C( bool is_A ) : is_A( is_A ){ is_A ? (void)new(buf)A : (void)new(buf)B; }
~C(void){ isA() ? (void)asA().~A(): (void)asB().~B(); }
A& asA(){ return *reinterpret_cast< A* >( buf ); }
B& asB(){ return *reinterpret_cast< B* >( buf ); }
A const& asA() const{ return *reinterpret_cast< A const* >( buf ); }
B const& asB() const{ return *reinterpret_cast< B const* >( buf ); }
bool isA() const{ return is_A; }
private:
bool is_A;
char buf[sizeof( A )>sizeof( B ) ? sizeof( A ) : sizeof( B )];
};

asA() 等の呼び出しは最適化で消えてなくなり、直接アクセスしたのと同じことになる(VC7.1で確認)。
無理やり union 使ってキモイ思いするよりはるかに良い。
つか、unionって使ったことない。
そんなにメモリの節約がしたいのか?
http://www.cs.wisc.edu/~ghost/gsview/get45.htm
のコンパイルがうまくいきません。
readme.htmの指示どおりに調節したのですが、

"C:\Program Files\Microsoft Visual Studio\common\msdev98\bin\rc" -D_MSC_VER -D_Windows -D__WIN32__ -I"C:\Program Files\Microsoft Visual Studio\vc98\include" -i"C:\Program Files\Microsoft Visual Studio\vc98\include" -i".\src" -i".\srcwin" -i".\obj"
-i"en" -fo.\obj\gsvw32en.res .\srcwin\gvwin1.rc
指定されたパスが見つかりません。

というエラーが出ます。これはどうすればよいでしょうか?
>>939
指定したパスがあるかどうか確認したら?
941894:03/10/18 22:53
>>937-938
いやだからplacement newは当然使えるし、必要なら使うんですよ。unionであっても。
問題はそこじゃないんですよ。

937の例でいうなら、もしAとかBにアライメントが必要な要素が入ってたらダメでしょ?
別にメモリの節約のために使ってるんじゃないんですよ。
>>941
何が問題になるの?
>>937-938
union知らないなら黙ってた方が良いよ
>>942
アライメントの問題だと何回書かれたら分かるんだ?
>>944
それが、わからないから聞いてるんだ。
具体的にA、Bがどういう型のとき問題になるのか教えてちょ。
>>945
ちょっとアライメントを勉強したほうがいい

仮想関数もってるだけでダメになる場合もあるぞ
sizeof(A) って、アライメントとか仮想関数テーブルへのポインタ込みのサイズ返すんじゃないの?
>>947
そうだよ
>>948
じゃあ、何が問題なん?
普通に sizeof(A) 分のバッファ確保しとけば union なんて無くても placement new 出来るじゃん。
そのバッファのアライメントがAのアライメント要求を満たさなければならない。
>>950
それはコンパイラの制限でしょ?
952894:03/10/18 23:32
>>949
937の例でいうと、char buf[]の先頭がアライメントを意識して置かれていない可能性があるのが問題です。
>>952
static void* operator new(size_t) を適切に定義しておけ。
>>953
もうオマエは黙ってろよと、見当違いもいい加減にシロ

と894は思ってるよ、多分
>>951
意味がわかりません。
仮に、「それ」が「コンパイラの制限」だとしたら、
「普通に sizeof(A) 分のバッファ確保しとけば placement new 出来る」ことになるのですか?
956894:03/10/18 23:48
>>953
それで逃げる手が一つですね。ただしその場合は、Elm側からAにアクセスするたびに
必ずアライメント計算をしなくちゃならなくなります。

あ、もちろんbufのサイズは max(sizeof(A), sizeof(B))+アライメント分
にしておかないとダメです。

とりあえず
struct X {
char a;
char buf[8];
};
struct Y {
char a;
union {
char buf[8];
double d;
};
};
のsizeofでも見て、Y.dにアクセスしたい時の事を考えてみて下さい。
>>941
A とか B の placement new を、アライメント意識して書けば良いだけだと思うが……。
デフォルトだと「渡されたアドレスそのまま」返すことになってるけど、別にオフセット
調整しても良いんだし。

いちいちクラス毎に placement new 実装するのがダサイって話だと、そもそも
アライメント調整必須な段階で placement じゃない new も書き直す必要がある
(全部の処理系とはいわないが gcc 3.x とかはそう) から、手間は変わらないよ。
自動変数や static 変数だと、コンパイラ・リンカがよろしく取りはからってくれるけど、
new 使うとなると自前で工夫するのは大前提。
じゃあ、bufの前にintでもおいて、alignmentを意図すればいいじゃないか。
あるいは、charでなく、intでbufを確保する手もあるし。
え?なんでstatic void* operator new(size_t) を適切に定義することが回避方法になんの?

char buf[5454];
new(buf) A;

としてもその再定義したnewは呼ばれないぞ?
>>959
たぶん引数に void* を書き忘れてるんだと思うが。
>>958
世の中には8バイトアライメントや16バイトアライメントを必要とするものがあるのだよ
>>961
なら char を 7 つとか 15 とか挟んどけ。
963894:03/10/18 23:56
>>957
see 956
>>958, 962
see 912

>>959
その通りでした。文脈で明らかにplacement newの話だと思ったので
そう思い込んで返事しました。
>>962
アフォですか?
>union的に扱えればずっと楽なのでそういうのないかなぁと。

結局、「ない」ってのが答えだろ。
>>895-965 みたいなのを全て考えた上で boost::variant が
あるんだから、素直に使うかせめてソース読むかしようよ…
と思うんだがどうか。 1.31に入ることは確定してるから待つんでもいいが。 >>907
>>963
そもそも 894 の段階で、A, B が特定のアライメントを要求するなら、暗黙の Buf::new(size_t) を
使って new Buf できなくなってるワケだが……。
968894:03/10/19 00:23
>>966
おっしゃる通りです。私も別にboost::variantを使わないつもりはないのでそうします。
boostがどうやって回避してるか非常に興味深いし。

途中で「どうしてplacement newじゃダメなの?」とか言われたから
「まぁそういう疑問を持つ人も居るのかな?」とか思って返事したまでで。
特にゴネてるつもりはなかったんですが…

>>967
これ本当?unionなら大丈夫でしょ?そう信じて今まで書いてきたんだけど…
969937:03/10/19 00:30
お前らが騒いでる間に任意のアラインメントに対応できるコード書いた。
長いのでどっか貼り付けてくるからまってれ。
>>968
> これ本当?unionなら大丈夫でしょ?
処理系・ライブラリ依存だと思うが、俺の環境 (gcc 3.2 にベンダーがローカルな
パッチを当てたもの) だとダメだった。new Buf すると、単に

void *p = ::operator new(sizeof(Buf))

でヒープからメモリを持ってきて、この p をオフセット調整なしで使う。

だから 32byte aligned なメモリが欲しければ Buf クラスの operator new を自前で
定義して 32byte aligned なメモリを持ってくるように書き直す必要がある。

自動変数ならばコンパイラがスタックフレームポインタ調整を入れるし、static, global
変数はリンク時にリンカがメモリを適切に割り当てるから問題ないんだけど。
>>970
それは単に class A と class B にアラインメントが必要ないからではなかろうか。
>>971
そんなことはない。ちょうど先日はまった話なんだが

class Foo {
  u_char buf[1024] __attribute__((aligned(64))); // このメンバ変数は 64 バイトアライメント
};

といったクラスを用意して new Foo したら、buf か必ずしも 64 バイトアライメントされずに
困った。

アセンブラコードを出力させて調べたら >>970 みたいな状況だったので、Foo クラス内に

static void* operator new(size_t n) { return memalign(64, n); }
// memalign は指定したアライメントでヒープからメモリを切り出す関数

と追加して事なきを得た次第。
973937:03/10/19 00:55
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=999294620&res=107

仮想関数の無いクラスのアラインメントは最初のプリミティブのアラインメントと等しいという仮定を置いてます。
>>972
PS2でつか?

struct aligned_t{};
namespace{ aligned_t aligned; }
void *operator new(size_t size,aligned_t,size_t n) {
return memalign(n,size);
}

int main(){
int *p=new(aligned,64) int;
}

こういう解決方法はどう?
>>974
> int *p=new(aligned,64) int;
それも良いアイデアだと思うけど、うっかり new(aligned, 64) Buf すべきところを new Buf しても
コンパイル時に検出できないのが悲しい。

C++ だと、ランタイムエラーよりはコンパイルエラーの方が何かと幸せだから。
CISCの派生CPUしか使った事がない
人ばかり見たいですね。このスレは。
でもその派生CPUでも高速化のためには
必要なんですけどね。
アライメント調整。
普通に struct A, struct B と

const int MAX_SIZE = Max<sizeof(A), sizeof(B)>::Value;
struct Buffer
{
enum{BUFFER_SIZE = MAX_SIZE / sizeof(int) + 1};
int buf[BUFFER_SIZE];
}

とか定義しといたら、A も B も Buffer もその先頭が
アライメント境界にくるように自動的に調整されないの?

調整されるんだったら、Buffer 型の配列作っといて、
それのアドレスを placement new に渡せば問題ないんじゃないの?
>>975
mallocで確保したメモリがどんなアライメント要求も満たすのが前提だから、
dlmallocにアライメント設定してmalloc置き換えるようにリンクさせればいいんじゃない?
>>977
Buffer はアラインメント境界に来るけど、それが A や B にとっても正しいとは限らない。
>>977
それだと、ふつうはintのアライメントを満たしてるだけだろな。
981894:03/10/19 04:34
>>970-972
ぐは。そうなんですか。かなりショック。
mallocにはアライメントは無理だってのは知ってたけど、
C++はせっかくnewに型渡してるのに意味ないじゃん。

情報ありがとうございました。
とりあえず週明けにstroustrup本にでも仕様を聞いてみますかねぇ。家にはない…
>>981
禿本には gcc の独自拡張である __attribute__ が載っているのか?
>>978
> mallocで確保したメモリがどんなアライメント要求も満たすのが前提だから、

処理系が知っているオブジェクトに対してはね。
__attribute__((aligned(64))); なんて物まで考慮に入れられないだろ。きりがない。
つーか、入れられても困るし。
>>981
> C++はせっかくnewに型渡してるのに意味ないじゃん。
そもそもユーザが明示的にアライメントを指定するのは、ANSI C++ 規格の範疇から
外れてるから。

ANSI C++ だと new Foo で呼ばれる operator new の型が

void* operator new(size_t n);

と決まっているので、アライメント値を渡す余地がない。
>>975
private: static void* operator new(size_t);
でOK?
>>985
それなら

public: static void* operator new(size_t n) { return memalign(64, n); }

で良いような気が。
次スレだぁ〜
>>988ゲットだぜ〜
>>989到着〜
>>990ハァハァ到着ぅ〜
なに〜先越されたーーーーー
おれがスレ立てるからおまいらは、待っててください。
このまま頂上目指すのみ
まだ見ぬ次スレへのリンクが紫色なのなんでだろぉ
それはおとズレた事があるから
998v(^・^)v:03/10/19 15:55
では閉じますか
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。