C++相談室2

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
2デフォルトの名無しさん:2001/08/01(水) 14:02
あは
3デフォルトの名無しさん:2001/08/04(土) 00:39
下のようなのを書いたんですが、ちゃんと動きました。
これはC++的にはアリなんでしょうか?

class foo
{
public:
  int bar;
};

int main( int, char **)
{
  foo a;
  a = 0xDEADBEEF;
  printf( "%08X\n", a);
  return 0;
}
4デフォルトの名無しさん:2001/08/04(土) 01:36
>>3
メンバ関数の無いクラスは構造体のようなもの。
メモリにべたコピーされてるだけで今のところ
うまくいってるだけ。
5デフォルトの名無しさん:2001/08/04(土) 01:49
>>3
良く動いたね。
正しくは、
a.bar = 0x0deadbeef;
ってやった方が良いよ
どう動いてるのか 俺にはさっぱりだ。
ウツダシノウ
6デフォルトの名無しさん:2001/08/04(土) 11:53
試してないけど、上のコードはコンパイル通るのか?
=演算子や型変換の演算子も定義してないぞ。。。。
7デフォルトの名無しさん:2001/08/04(土) 13:33
[C++ エラー] Unit1.cpp(19): E2034 'unsigned long' 型は 'foo' 型に変換できない

動きませんな。
8デフォルトの名無しさん:2001/08/07(火) 03:32
>>4
メンバ関数のあるなしでC++の構造体はメモリ上の配置の仕方がことなるのでしょうか?
Cと同じように構造体が実装されているようには思えないのですが。。

また独習C++を読むと、
classとstructはデフォルトのアクセス指定子が異なるだけ、なんて
書いてあるんですが、これはホントですか?

アセンブラが分からないヘタレですみません。
9デフォルトの名無しさん:2001/08/07(火) 03:39
$g++ samp.cc
samp.cc: In function `int main(int, char **)':
samp.cc:11: no match for `foo & = unsigned int'
samp.cc:6: candidates are: class foo & foo::operator =(const foo &)

gccでもダメでした。ところでコンパイルが通るってどんなコンパイラ
使ってるんですか?>>3

やっぱりネタですよね?w
10デフォルトの名無しさん:2001/08/07(火) 09:49
>>8
そうです。デフォルトでpublicかprivateかの差だけです。

メモリ上の配置が変るのは、処理系によっても違うかも
しれませんが、仮想関数を持った時に仮想関数テーブル
へのポインタが自動的に追加されます。
11デフォルトの名無しさん:2001/08/07(火) 21:17
C++のコードをCに変換してみよう!

"C++"

class CClass
{
private:
 int n;
public:
 void func1(int a);
 virtual void func2(int a);
};

CClass c;
c.func1(0);
c.func2(1);

"C"

void *CClassVTable[] = {
 CClass_func2;
};

typedef struct CClass
{
public:
 void **v_tbl = CClassVTable;
private:
 int n;
};

void CClass_func1(CClass *this, int a);
void CClass_func2(CClass *this, int a);

CClass c;
CClass_func1(&c, 0);
c.v_tbl->CClass_func2(&c, 1);
12デフォルトの名無しさん:2001/08/08(水) 11:01
Cのコードが分からない。。。鬱だ
13デフォルトの名無しさん:2001/08/10(金) 03:33
>>11
続きは?
14STL厨房:2001/08/12(日) 00:37
あいまいなシンボルって何じゃー?どうせいっつんじゃー
さっきまで動いとったのに、2,3行目加えただけで
コンパイル不能になっとるし。

1 #include <fstream.h>
2 #include <string>
3 using namespace std;
4 int main()
5 {
6 ofstream obj("test.txt");
7 return 0;
8 }

>test0.cpp(6) : error C2872: 'ofstream' : あいまいなシンボルです。
15デフォルトの名無しさん:2001/08/12(日) 01:15
「C++相談室2」というタイトルと

↓この顔文字

v(^・^)v

の組み合せはまさに芸術だと思う。
16デフォルトの名無しさん:2001/08/12(日) 02:18
>>14
1行目が悪いんじゃないか?
17デフォルトの名無しさん:2001/08/12(日) 03:29
>>14 STL厨房
1c1
< #include <fstream.h>
---
> #include <fstream>
もしくは、
3c3
< using namespace std;
---
> //using namespace std;

SEE ALSO
http://www.microsoft.com/japan/developer/library/vccore/c2872.htm
18STL厨房:2001/08/12(日) 08:04
>>16 >>17
レスどもっす。
.h の方を使うと内部で暗黙に namespace が有功になってて
外部で再び宣言すると、名前がかぶって ofstream がどっちに
属すのか特定できんって事なんかな。。。
19STL侍:2001/08/16(木) 08:13
STLのリストに関して質問がござる。

いまリストの特定の要素を削除したいのじゃが、
そやつの『アドレスを知っている』場合の処理について
悩んでいるのでござる。それがしはこれまで
イテレータで頭から順繰りに伝って、

struct _hoge xxx; // 消したい要素の化身
list<struct _hoge>::iterator i;
for(i=hoge.begin(); i!=hoge.end(); ++i)
if(&(*i)==&(*xxx)) hoge.erase(i), break;

などとやってきたわけでござるが、
最近これはとても非効率な気がしてきたのでござる。
なんとなれば要素のアドレスを知っている限りにおいては
直接にその要素を削除して、リストの前後関係を
修復するような機能があってもよさそうではござらぬか。
つまりhoge.erase(pos)[posはイテレータ]の
アドレス版hoge.erase2(&xxx)みたいなものでござる。
しかし『C++標準ライブラリ チュートリアル&リファレンス』
なる書物を紐解いてみるに見つける能わなんだ。

当方、イテレータなるものについての理解が浅い故、
頓珍漢なことを申してるやも知れぬが、
右の点に関してなにとぞお知恵を拝借致したく候。
20デフォルトの名無しさん:2001/08/16(木) 10:03
「アドレスを知ってる場合」云々はおいといて
list::remove()を使わないで イテレータで自分で回して比較しているのには
何か理由があるのか?

まじめに質問しているのならふざけた口調はやめたほうがいいぞ
21STL侍:2001/08/16(木) 11:32
かたじけない >>20
エセ侍風はお気に召されなかったようで、口調を戻します。

removeを使えばよいという指摘、その通りでした。半分解決です。
自分でイテレータを回して比較していることに意味はありませんでした。

で私の中で未解決の点というのは、removeは値が該当するもの全てを
削除するようなので、結局内部的には全検索しているのですね。
疑問に思ったのは、消したい要素のアドレスが判ってるならば、
その要素をピンポイントで消せる方法があってもいいのに、ということです。
この考え方は変でしょうか。
22デフォルトの名無しさん:2001/08/16(木) 11:55
listのメンバとしてstruct本体じゃなくてstructのポインタを持つ
ようにすればいいのでは?
2320:2001/08/16(木) 12:06
>>21
消したい要素のアドレスがわかってたとして そのアドレスがlistのどこに
あるかは探さなければわからないのは当然じゃない?
要素自体を消したいんじゃなくて 要素を「listから」消したいんでしょ?
24STL侍:2001/08/16(木) 12:30
>>23
> そのアドレスがlistのどこにあるかは探さなければ
> わからないのは当然じゃない?

リストって各要素が前後の要素とポインタで繋がれているだけの
単純な構造だと思っていたんですが、これが私のそもそもの誤解かな?

上のように考えていたので、要素を適切に削除するには、
要素のアドレスを知っている場合(該当要素に直接アクセスできる場合)は、
前後の要素についてポインタの繋ぎ変えをした後で、
該当要素のメモリを解放すればそれでおしまい、
つまり要素の前後関係だけが重要だから要素がリストのどこにあるかは
関係ないと思っていたんですが、そんなに単純ではないということでしょうか。

むむむ。
2520:2001/08/16(木) 12:48
リストを構成しているそれぞれのノードはポインタでチェーンされているが
そのノード自身のアドレスと ノードが参照している中身のアドレスは別物。
26RIP_MAPIRO:2001/08/16(木) 13:51
STL内で
template <class Temp>
class Atom
{
Temp m_Youso;
Atom* p_next;
Atom* p_before;
};
のようにラップされているのだろうけど、それはSTLを作っている
ところ次第だし、ヒープの確保&解放の最適化を行うためにもう
一つラップクラスを用意しているだろう。このあたりはvectorの内部
ポインタ、_First,_Last,_Endの機能と同様のものだと思う。
 強引に
temlate <class Temp>
MyList : public list<Temp>
{
public:
void
erase2(Temp*);
};
のようなことも可能だがprotectedなメンバを書きかえるよな
操作はしたくないのが本音。複数のバージョンのSTLを考
えるとやりたくない。
27STL侍:2001/08/16(木) 14:36
>>25
至極なっとくでござる。
お付き合いどうもありがとう。
28STL侍:2001/08/16(木) 14:39
>>26
おぉ、これもレスですね。どうもありがとう。
今すぐには理解できないけど少し反芻してみます。
一度はヘッダの中身を覗いてみないとダメですね。
29デフォルトの名無しさん:2001/08/16(木) 16:37
>>28
STL じゃないが、格納されるデータ自体にポインタを持たせたコレク
ションの実装として 4.4BSD の <sys/queue.h> がある。もともと C
言語用のマクロだが、これに C++ 風のインターフェースをかぶせたも
のが、

http://diary.imou.to/~AoiMoe/2001.03/middle.html#2001.03.15_s04
http://www.issei.org/diary/d200104c.html#22-1

にあるぞ。
30デフォルトの名無しさん:2001/08/16(木) 16:57
葵萌えさんの日記は直林禁止だったはずだが。
31デフォルトの名無しさん:2001/08/16(木) 17:15
直リン禁止なんて言ってる奴も守ってる奴もDQNだ。
検索エンジンに引っかかったらロボットに向かって文句言うのか?
32デフォルトの名無しさん:2001/08/16(木) 21:17
>>30
最新版の日記を見ると、上のほうに「逆リンクを許容できる場合に限り、リンク
はご自由に」と書いてあるよ。
33デフォルトの名無しさん:2001/08/16(木) 21:18
virtualの使いどころがわからないっす。
だから使ったことないデス…。
34デフォルトの名無しさん:2001/08/16(木) 21:48
>>33
ネタ?

本気なら「憂鬱なプログラマのためのオブジェクト指向開発講座」を
買ってきて読みましょう。C++ は言語仕様から勉強するとワケ分から
なくなるが、先にオブジェクト指向の分析・設計手法を勉強して、そ
れを実装に落とすための道具として見ると、簡単に理解できる。
35デフォルトの名無しさん:2001/08/17(金) 00:42
ネタでしょ。
本気で分からんやつは、一度Javaを使ってみるといいかもしれんね。
36オプションの名無し:2001/08/17(金) 04:30
いや、Effective C++の第6章35項を8回、読み直せ。
37デフォルトの名無しさん:2001/08/17(金) 09:12
>>32
あれ、最近のには書いてないね。
昔は、MLとか掲示板とか不特定多数からアクセスが殺到するような場所に
URLを貼らないで欲しいというようなことが書かれてあったような。

サイト引っ越して環境が変わったからよくなったのかな。ま、もう書いてないからいいや。
38デフォルトの名無しさん:2001/08/17(金) 10:38
>>35 Javaはすべてのメソッドにvirtualついているようなものだから
かえって意識しにくいと思われ、、、
39RIP_MAPIRO:2001/08/17(金) 13:32
Javaは純粋仮想関数、抽象クラス、匿名クラスでどうこう
って感じだからかえって混乱するかも。
33は継承パターンを自分で作って動作を追跡すれば理解が
進むと思う。特にディストラクタの virtual 宣言は多態性を
表現する上で重要。
40デフォルトの名無しさん:2001/08/18(土) 03:24
C++と直接関係無いんだけど質問。

みなさん日本語処理(や文字列処理)ってどうしてますか?
やっぱりAnsiString?

実は日本語コードの変換機能付きのストリングクラスを作ったのですが
一文字ずつ文字を追加する処理が遅くて困ってます。
string += 'A'; <- こんなの。

みなさんの文字列処理のやり方を教えてくださいませ。
41デフォルトの名無しさん:2001/08/18(土) 03:53
>>40
どこが遅くなるのか分かりませんが、変換は必要なときだけ
やればイイですよね。
4240:2001/08/18(土) 04:18
>>41
はい、変換は必要な時だけしかやってません。

遅くなるのは・・・
1、約5000行(380KB)のテキストファイルを読み込んでコードを調べて変換
2、一行ずつに分離して文字列リスト(これも自作のクラス)を作成
3、全部の行から特定のキーワード(約10文字)を検索
って処理をした時に2番目の処理で3秒ぐらいかかってしまいます。

コード変換無しなら一瞬で終わるような処理なんですけどね・・・。
43デフォルトの名無しさん:2001/08/18(土) 07:41
>>42 一行ずつに分離して文字列リスト(これも自作のクラス)を作成
の部分で
>>40 一文字ずつ文字を追加する処理が遅くて困ってます。
という問題があるという話なら
コード変換は全く関係ないと思うんだけど
4440:2001/08/18(土) 08:06
>>43
まったくおっしゃるとおりです。
実はもう改良済みです。

で、ホントに聞きたいのは「日本語処理ってどうしてます?」ってことです。
もしかして普通は特定の日本語コード決め打ちなのかなぁ?
45デフォルトの名無しさん:2001/08/18(土) 08:45
>>44
俺のWindowsプログラムの場合、
内部コードは ShiftJIS か Unicode で持っておいて
ファイル入出力の時に[必要なら]変換…だなぁ。

エディタを作るんでもなけりゃ、あんまり多文字コード対応にしても意味ない気がする。
46すみません:2001/08/19(日) 23:44
すみません。誰か教えてください。
引数宣言リストというのは何なのでしょうか?
お願いします
47デフォルトの名無しさん:2001/08/20(月) 00:44
>>46
どういう文脈で「引数宣言リスト」という単語が出てきたのかを書いた
方がいいと思うぞ。
48デフォルトの名無しさん:2001/08/20(月) 01:56
>>45
日本語EUCとSJISだけでも対応しておくと
フィルタ系のツールなんかで便利だと思うよ。
ソースのフィルタとかさ。

…コード処理出来る人って少なそうだけど。
49デフォルトの名無しさん:2001/08/20(月) 02:17
便乗なんですが
UTF-8 8 ビット Unicode 変換形式
ってなんですか?
5048:2001/08/20(月) 02:44
俺もあんまり詳しく無いんだけど。

UCS4を1〜6byteに変換する形式だよ。
51デフォルトの名無しさん:2001/08/20(月) 05:25
>>49
googleで検索してみそ
utf8はビット数固定じゃないから嫌いなり
日本語テキストなら UCS2 で十分なんだよね
ごくごく一部の限られた人を除いてだけど
52デフォルトの名無しさん:2001/08/20(月) 07:13
ネットワーク関連でフリーのクラスライブラリとかってあるんでしょうか?
もし何かあれば教えて下さい。
53デフォルトの名無しさん:2001/08/20(月) 07:16
書き忘れました。
環境はLinuxもしくは*BSD*で使えるものを探しています。
54デフォルトの名無しさん:2001/08/20(月) 07:40
>>52
SourceForge を見てみたら?
55デフォルトの名無しさん:2001/08/20(月) 07:49
ちなみにここのエキスパートの人はネットワークの機能を実装するときは、
そういったライブラリ使わないんでしょうか?
Windows以外の場合の話ですが。。
56デフォルトの名無しさん:2001/08/20(月) 08:00
networkでなにをするか、によるのでは。
簡単なことならsocket直で叩くだろうし。
……v6対応があるから、そうでもないかな?
57デフォルトの名無しさん:2001/08/20(月) 08:04
socket直ですか、、、分かりました。
正直、ネットワーク関連のプログラムは初めてなので、
コネクションのプーリング機能なんかを実装したクラスとかが
あればいいなって思ってました。
勉強がてら自分で実装するのがよさそうですね。
58デフォルトの名無しさん:2001/08/20(月) 22:44
コネクションのプーリング機能なんかを実装したクラス
TCPは無理だよね?
59デフォルトの名無しさん:2001/08/20(月) 23:31
プーリングって何?pooling?
具体的に何の為に必要なの?
60デフォルトの名無しさん:2001/08/20(月) 23:33
オブジェクトを何回も生成しないようにじゃない
Cだったら何度もmallocしないようにって事かな?
61デフォルトの名無しさん:2001/08/20(月) 23:36
コネクションをプールするってのは・・・
クライアント側の発想かな
サーバーに対してサービスを要求するのに
わざわざコネクションをはりなおさないって感じかな?
実用的じゃないね
6259:2001/08/20(月) 23:46
connectしたソケットをcloseしないでずーっと持っておくの?
だけどTCPって放置したら勝手に切断するんじゃなかったっけ?
63デフォルトの名無しさん:2001/08/21(火) 00:03
>だけどTCPって放置したら勝手に切断するんじゃなかったっけ?
そりゃないっしょ
そうだったら不便だな・・・
64デフォルトの名無しさん:2001/08/21(火) 00:05
>>62
プロトコルによるんじゃない?
65デフォルトの名無しさん:2001/08/21(火) 00:19
近くにあるネットワークスレに聞いた方がいいかな?わらい
66デフォルトの名無しさん:2001/08/21(火) 00:23
>>64
そうだね。
俺の知ってる範囲だと、大抵は自動的に切断する。
つーか、切断される。
67デフォルトの名無しさん:2001/08/21(火) 00:33
>>63
するよー。
RFC読むのはきついから、setsockoptのkeepalive辺りを読んでちょ。
UNIXの仕様じゃなくて、TCPの仕様だよん。

Solaris辺りはndd(1M)で変更可能。
*BSDやLinuxはシリアスな用途に使ってないから知らん。
68デフォルトの名無しさん:2001/08/21(火) 00:43
>>61
HTTP1.1
69デフォルトの名無しさん:2001/08/21(火) 01:17
プロトコルじゃなくて
サーバーによる、だと思う
けど、サーバーによって切ったり切られなかったりって
当たり前すぎる話に帰結してしまう
70デフォルトの名無しさん:2001/08/21(火) 01:21
>>69
> プロトコルじゃなくて

ってなんだ?TCPやHTTP 1.1の仕様読んだ事あるか?
71デフォルトの名無しさん:2001/08/21(火) 01:23
ないです
HTTP1.1では、
応答が何秒以上なければ、
コネクションを切る事
なんて書いてあるんでしょうか?

TCPの仕様なら納得できますが、
書いてあるならどこに書いてあるのか教えていただけませんか?
72デフォルトの名無しさん:2001/08/21(火) 03:19
>>71
8.1 Persistent Connections
19.7.1 Compatibility with HTTP/1.0 Persistent Connections
詳しい内容はRFC2068を読んでね。翻訳もあると思うし。

>>58
ACEのACE_Cached_Connect_Strategyでも参考にして自分で作ったら?
http://www.cs.wustl.edu/~schmidt/ACE.html
ちょと仕様過剰かも知れないので
73デフォルトの名無しさん:2001/08/21(火) 05:12
プリプロセッサの文字列置換に関して質問があります。

#define LIST_TEMP(type)           \
 ##type *insert_back(){            \
  ##type *elm = new (##type) [1];    \ (注*1)
  …                       \
 }                         \
 void *copy(const ##type &src){      \ (注*2)
  if(this!=&src){                \
   …                      \
  }                        \
 }                         \
↑のようなマクロ(リストのテンプレート)を作って、

class _my_list{
 LIST_TEMP(int);
 …
};
みたいに使おうと思っています。
ここで困ってるのが(注*2)のところです。
例えば(注*1)のところのnewの後の##typeは
new (int) [1] と置換されるので問題ありません。
しかし(注*2)のところはconstintと置換されてしまいます。
もちろんconst (##type) &srcとしてもエラーになるので
困っています。何か良い方法はないでしょうか。
74デフォルトの名無しさん:2001/08/21(火) 07:24
ど,どこでそんな書き方を憶えたのさ?(´Д`)
## を全部削ってみてちょ。
75デフォルトの名無しさん:2001/08/21(火) 07:52
const##type
これは?(自信なし
76デフォルトの名無しさん:2001/08/21(火) 07:53
すいません馬鹿でした↑
7773:2001/08/21(火) 08:06
はうっ。
100回死にます…。
7873:2001/08/21(火) 08:22
struct _xxx{
 int *elm0, *elm1;
} xxx;

#define elm(a,b) (*(a->elm##b))

hoge = elm(xxx,0);

ずっと↑みたいな使い方をしていたので前後不覚になりました。
7973:2001/08/21(火) 08:25
78に書いたのは間違ってるけど雰囲気だけ…。
お礼を忘れてました。74さんありがとう。
8074:2001/08/21(火) 08:38
私が関心したのは \ が縦にきちんと揃ってるトコロ。
練習したですか?
81デフォルトの名無しさん:2001/08/21(火) 11:13
>>73
何故templateを使わん?
8273:2001/08/21(火) 11:34
>>74
はい。メモ帳で練習しました。(カット&ペースト)

>>81
とても大切な理由があった気がするのですが
思い出せません…。
83デフォルトの名無しさん:2001/08/21(火) 12:14
>>82
では、さっそくtemplateに書き換えるのだ。
84デフォルトの名無しさん:2001/08/21(火) 12:18
function objectってなんですか?
85デフォルトの名無しさん:2001/08/21(火) 12:18
動名詞のことですか?
86デフォルトの名無しさん:2001/08/21(火) 12:48
>>84
C++だとI/O manipulatorみたいなやつのことだろ?
どんな文脈で出てきたの?
87デフォルトの名無しさん:2001/08/21(火) 12:49
あ、I/O manipulatorは、streamを引数にとってstreamを返す関数なのね。
extern ostream& endl(ostream& outs);
88デフォルトの名無しさん:2001/08/21(火) 12:54
>>86
そうじゃなくて <functional> にあるような、operator() を定義し
てあるクラスのことだと思うが。<algorithm> で定義してある汎用ア
ルゴリズムと組み合わせて使ったりする。

関数的オブジェクトに関する詳しい話は「プログラミング言語C++」
に載ってるよ。
89デフォルトの名無しさん:2001/08/21(火) 16:53
>8.1 Persistent Connections
>19.7.1 Compatibility with HTTP/1.0 Persistent Connections
これは関係ないじゃん(笑)
TCPコネクションはったまま
何もしなかったらって話じゃないの?
90デフォルトの名無しさん:2001/08/21(火) 17:01
>>89
とりあえず、8.1.4 Practical Considerations読んでくれ。
いきなりは切らんがserver/clientどちら側からも切断する可能性があり、

Clients and servers SHOULD both constantly watch for the other side of
the transport close, and respond to it as appropriate.

とある。他にもいろいろ書いてある。

そもそも規約になくても、相手がいきなり切断して、
それが分からないようなclass libraryなんて使いたいのか?
91デフォルトの名無しさん:2001/08/21(火) 17:27
int main()
{
return 0;
}

これはアリですか?
92デフォルトの名無しさん:2001/08/21(火) 17:55
>>91
質問の意図がよくわからんぞぃ。
93デフォルトの名無しさん:2001/08/21(火) 17:59
蟻です。
9473:2001/08/23(木) 05:42
>>83
いまtemplateに書き直して思い出した。
例えば↓みたいなテンプレートにすると

*************************************
template<class type>
class _list{
 _list<type> *next, *prev;
 …
 type elm;
};

class _elm{
 int var;
}

_list<_elm> xxx;
*************************************

リストxxxの要素にアクセスするときにxxx.elm.varってしないといけない。
マクロで書いておくとxxx.varってできるから楽(だと当初思った)。
OpenGLの描画プログラムを書いてるんだけど、
いま両方のフレームレートを測ってみたら0.2%ほどマクロの方が速かった…。
おとなしくテンプレートの方にしておきます。
95デフォルトの名無しさん:2001/08/24(金) 00:55
>>94
なんでSTLのlistを使わない?
下手な車輪を再発明するなよ。
96デフォルトの名無しさん:2001/08/24(金) 01:07
>>95
勉強中なら別にいいんでないの?

仕事で同じことをやるのは痛いけどね
9773:2001/08/24(金) 08:54
一番最初にSTLのリストを使って書いたんです。
でイテレータの使い勝手が(慣れてなかったので)悪いなぁと思いながら
じゃあ自分で作ってみようとすったもんだしているうちに、
やっぱりSTLのリストはよくできてるなぁと思うようになった昨今。
もう一度書き直すことになりそうです。
98デフォルトの名無しさん:2001/08/24(金) 14:54
超初心者なのですが、ルート計算を行う関数はどのように定義したらいいのでしょうか。
9998:2001/08/24(金) 15:00
>>98
あっ、わかりました。スマソ
10073:2001/08/25(土) 08:40
std::listを使ってまた書き直した挙句、なぜ自前で実装しようとしたのか
本当の理由をようやく思い出した。(すごい回り道だ…)
長くなるけど、時間があったら何か指摘してもらえればうれしいっす。

例えば

−□−□−□−□−□−□−□−□−
↑      ↑
リンク    ノード
(エッジ)

という構造を作りたいとき(ノードが持つリンクは2つとは限らない)、

// ノード
class _node{
 list<_link> link; // 隣接ノードへのリンク
}
list<_node> node;

// ノードが持つリンク(要素は相手ノードへのポインタ)
class _link{
 _node *node; // 相手ノードへのポインタ
 _edge *edge; // リンクの別体へのポインタ(*ここが重要)
}

// リンクの別体
class _edge{
 _node *node0; // 端点0のノードへのポインタ
 _node *node1; // 端点1のノードへのポインタ
}
list<_edge> edge;

このとき、ノードn0とn1の間にリンクがあるかないかは

list<_link>::itr edge_detect(list<_node>::itr n0, list<_node>::itr n1)

みたいな関数で判断するんだけど
(つまり戻り値がn0からn1へのリンクのlistのイテレータになっている)
こうすることで

(*n0).link.erase(edge_detect(n0, n1));

みたいに消去できる。ここまではよし。

しかし今同時にリンクの別体list<_edge>も更新したい。
リンクの別体というのは全リンクのlistで、
これがないといちいち各ノードに対してリンクをサーチしないといけないから
2重にカウントされて遅い&不便。すると当然、

edge.erase((*edge_detect(n0, n1)).edge);

としたくなるけどこれは不可。なぜなら上の引数はlist<_edge>の
要素本体へのアドレスであり、list<_edge>のイテレータではないから。
つまり消したいedgeの要素本体のアドレスは知っているのに、
それをイテレータに直さないといけない点がとても非効率的だと思ったんです。
自前で実装すれば要素の操作はイテレータではなくてリストの上部構造(?)も
含めたアドレスで行えるから、ここで望むような操作が可能だなと。
いじょ。
101PeFileWrapper:2001/08/25(土) 10:42
>>100
途中から読み出したのでアレだけど、
そもそも、ノードの論理的な構造をそのままデータ構造にしようと
しているところに、 list<_edge> edge の必要性を生み出している
原因があるような気がするんだが...。

要は、 list<_edge> edge をどうするか…でしょ?
漏れなら、単に _node の可変長配列を(テンプレート)クラスにして、
ノード間のつながりは隣接点行列を作るなりして仮想化させると思うな。


目に見えるものすべてを「実体」として実装しようとするから、
話がややこしくなるのでは?
102デフォルトの名無しさん:2001/08/25(土) 12:46
list< list<OneType> > hoge;
のようにするのは駄目なの?
10373:2001/08/25(土) 14:54
うぅ。ありがとう(泣)。

>>101
>漏れなら、単に _node の可変長配列を(テンプレート)クラスにして、
>ノード間のつながりは隣接点行列を作るなりして仮想化させると思うな。

当初は

// ノード
class _node{
 list<_node*> link; // 隣接ノードへのリンク
};

のように実装していました。これが>>101で言わんとすることかな。
(というのを前提に話を進めると)
そうすると、例えばリンクを描画するときにn0→n1とn1→n0という
同じリンクを2重に描画することになっちゃうのがイヤンだったのです。
もちろん描画済みか否かの条件文を入れればいいんだけど、
要素の数が増えてくると計算速度に結構効いてくるので
リンクの別体(実体)を考えて重複をなくそうとしたのです。
答になってるかな…。

>>102
駄目な気がする。理由は…ぅぅ頭が割れそうだ…。
104sage:2001/08/25(土) 16:00
class obj {
public:
virtual draw();
};

class link : public objs {
node *pnode[2];
public
draw();
};

class node : public obj {
list<link*> linklist;
public
draw();
};

list<obj*> objects;

こういうこと?
105101:2001/08/25(土) 17:39
>>103
あぁ、なるほど、リンクを描画したいわけね。それも効率よく。

計算するのが何なのかわからずに書いてしまうけど、
ノードを可変長配列として実現しておいて、
あらかじめ隣接点行列 bool isConnected[length][length] を
準備しておくと、

for (i=0;i<length-1;++i){
 for (j=i+1;j<length;++j) {
  if (isConnected[i][j]) {
   (計算とか);
   (描画とか);
  }
 }
}

で、できるような気がするんだけど。
10673:2001/08/25(土) 20:05
>>104
この場合、ノードがリンク先をサーチしようとするときに、
『リンクの両端を見た上で自分じゃない方が相手』、
という余計な判断が入るから少しうれしくないです。

>>105
いま書いてるのは1000個以上のノードがバネ(=リンク:1000〜2000本)
で繋がれてグリングリン動くプログラムなんだけど、
隣接点行列でやると数十倍遅くなってしまうです…。
いまのところはノード数10000、リンク数10000(リング状)の
ばねアニメーションがFPS30ちょいで動いてます。
107105:2001/08/25(土) 21:24
>>106
> 隣接点行列でやると数十倍遅くなってしまうです…。
ふぅ〜ん、そういうもんかなぁ..。

力になれなかったな。スマソ。
108sage:2001/08/25(土) 21:48
>106
いや、もうちょっとコード見てくれよ..
s/objs/obj/g
10973:2001/08/26 08:42
>>108
あ、objsとobjがある…。
ごめん。まだよく理解できないから少し考えてみる。
11073:01/08/26 09:10
それと補足だけど、各ノードはどんどん繋ぎ変えてリンクの状態が変わるから、
特定のノードが持つリンクの相手をできるだけ高速にサーチしたいです。
この繋ぎ変えの処理に関しては>>101にあった方法が一番速いんだけど、
同時に高速に描画も行おうとするとまたトレードオフが出てくるです。

ちなみに今リンクの本数をL、ノード数Nとすると、
存在し得る最大リンク数N(N-1)/2に比べてLが圧倒的に小さい条件(L∝N)で
やってるです。隣接点行列で判断すると計算時間はL∝N^2になるので
おいらがやってる条件に限って言えばキツイということです。
111デフォルトの名無しさん:01/08/28 22:42 ID:upwimQHI
初めてなのですが、質問させてください。

domain_errorって何なんでしょうか?
どんな関数が投げるものなんでしょうか?
112デフォルトの名無しさん:01/08/29 20:34 ID:QWMYzaCI
>>73
よくわからんけど、参照カウンタ付きのProxyをCompositeパターンで
リンクすればいいのではないの?
俺が勘違いしているかも知れんけど、それはともかくとしても、
73の設計にはオブジェクト指向の香りがしないよ。
デザインパターンの本をよく読むことをおすすめする。
113名無し:01/08/30 02:00 ID:1nQFo/p2
>>73
重複しない走査を実現するための特別な構造が
必要で、リストでは駄目ということなのでは。
自分で「サーチ」と言っているし。
114デフォルトの名無しさん:01/08/30 02:09 ID:1YbMhqvE
>>111
これってexceptionでlogic_errorなdomain_errorのこと?
115デフォルトの名無しさん:01/08/30 13:24 ID:msKDCwik
>>114
そうです。
116デフォルトの名無しさん:01/09/05 23:10 ID:5S9xtZF2
C++の反復子ってなんですか?
117デフォルトの名無しさん:01/09/05 23:16 ID:pPFDzhN.
走査子
118デフォルトの名無しさん:01/09/08 00:05
ほぇ
119デフォルトの名無しさん:01/09/08 00:57
>>115
logic_error自体は、引数チェックみたいな「runtimeじゃない」
例外のための基底クラス。

ある関数を呼び出すとする。
runtimeじゃないっていうのは、プログラミングをしている
時点で例外が起こらないように、関数の呼び出し側で
コントロールできるってこと。

runtimeエラーの代表的なものにout_of_memoryがあるわけだが、
ある関数を呼び出すのに、out_of_memoryにならないように、
っていうのは「プログラミングの時点では」コントロールできない。
だからruntime。で、logic_errorはそうじゃないやつ。

domain_errorってのは、length_errorとかout_of_range_error
とか、invalid_argumentではない、ソフトウェアの「対象ドメイン
特有の事前条件」に違反した場合に投げるべき例外。

基底クラスとして用意されているだけで、標準ライブラリの
中を捜しても多分使ってるところはないのだと思う。

下手な説明でスマソがわかる?
繰返子
121111=115:01/09/08 03:22
>>119レスどうもです。

ええと、、実はexceptionなやつのほとんどが
いまいちよくわかっていないのですが…。
logic_errorはちゃんとやってれば防げるはずのエラー?
runtime_errorは、メモリ不足とか、ファイルが無かった、
などの時に投げるのでしょうか。。

domain_errorはlength_errorとかに当てはまらない
logic_errorのときに投げることになるのでしょうか?
あと、基底クラスとして用意されているだけということは、
domain_errorはそのまま投げないで、domain_errorを
継承したクラスを投げたほうが良いのでしょうか?

それから、range_errorとout_of_rangeの
違いがいまいち分かりませんです…。
logicかruntimeかの違いでしょうか…?
122119:01/09/08 04:27
回答がテキトーだったことを謝罪する。スマソ(鬱。

漏れの解釈では、out_of_rangeは添え字の範囲外エラーの類、
range_errorは、オーバフロー、アンダーフローの類だと思っていた。
(10まで入れていい数字で11というような値そのもののエラー)

考えて見れば根拠を示せない(鬱

> domain_errorはそのまま投げないで、domain_errorを
> 継承したクラスを投げたほうが良いのでしょうか?

標準例外自体、全てがexceptionから派生している、
というわけではないから、標準ライブラリのユーザーに
Javaのようなやり方を推奨しているわけではないと
考えている。

domain_error自体、インスタンスを作ることが認められていない
わけではないからそこをどうするかは、個々のプログラムでの
設計上の判断次第だと思う。
継承することによって、設計上の利点があるならば、、だ。

漏れはポリモーフィックに扱う必要がない場合は、極力継承は
使いたくないが。
123デフォルトの名無しさん:01/09/08 10:51
ド初心者ですが、教えてください。
C++を学習してるのですが、
コードを書いてみようとVC++を使ってやってみたのですが、
BOOLとかstringとかが使えません。
こういったものを使えるようにするには何をインクルードする
必要があるのでしょうか?iostream.hじゃだめなんですかね。
string.hをインクルードしても標準ライブラリのstringが使え
ないし・・。
>>123
#include<windows.h>
#include<iostream>
#include<string>
namespace using std;
125123:01/09/08 11:29
>>124
レスどうもです。いまからやってみます。
ところでwindows.hは何のためですか?
126123:01/09/08 11:38
だめでした^^;。
iostreamやstringは確かに本とかでは.hついてないのですが、
つけないと開けないというエラーがでます。で、付けてコンパイル
すると

構文エラーusing
string 定義されてない識別子です

などが出ます。ちなみにこんな感じで書きました。

#include <iostream.h>
#include <string.h>
#include <windows.h>
namespace using std;

void main()
{
string a;
}

なんででしょう。
std::string a;
using namespace std;
じゃないのか?

ちなみにBOOL型はWindows固有の型。
C++汎用のはbool。
BOOLのためだけにwindows.h入れるのかい
C++なら標準はBOOLでなくてbool
130129:01/09/08 11:50
だぶった遅かった(´д`;)
おれのマソコマークがいっぱい書き込まれた「独習C++」を
あげるから、基本からやり直すこと!!>1
1じゃなくて123だった。。。鬱だ
133123:01/09/08 13:21
using namespace std;
にしてみると、
'std':存在しないか名前空間ではありません。
と出ました。
なんでやねん・・・。
標準のC++やりたいだけなのに・・・。
boolすら使えません。
134123:01/09/08 13:22
そういえばcoutとかsinもstdですよね。
それらはstdとか使わなくても使えるンですが・・・。
iostream.hを取りこむだけで。
135デフォルトの名無しさん:01/09/08 13:32
#include <iostream>
#include <string>

using namespace std;

int main()
{
string a;
return0;
}

まずは一通り、「最近発売された」 C++ の参考書を読むことをおすすめする。
90 年代後半に大きく C++ の規格が変わってるから。
136通行人:01/09/08 13:35
#include <string>
#include <iostream>
using namespace std;
int main(){
  string s = "Hello, World!\n";
  cout << s << endl;
  return 0;
}
たったこれだけ貼り付けても動かんか?BCCではOK。VCは知らん
137通行人:01/09/08 13:37
カブッタ...鬱氏
138123:01/09/08 13:48
あ、もしかして・・・。
私が使ってるVC++がおもいっきり古いからでしょうかね・・・。
4.0です(藁。
実際、コードを書いてくださった方のをそのまま貼り付けても
だめでした。なにせ#include<string>の時点でダメなんです
から(藁。.hを付けないとダメなのでおかしいとは思っていま
したが。今のVC++の最新は7ぐらいっすかね。買ってこないと。
SDKでいいよ。そのレベルなら。
もうちょっとレベルアップしてからの方がありがたみがわかる
140デフォルトの名無しさん:01/09/08 14:03
cygwinで十分だろ。
nestしたtemplateとか書けないけどな、gccはまだ。
141デフォルトの名無しさん:01/09/08 14:21
C++で初めてゲームつくってて、カメラのクラス作ってんだけど、
そこには視点とか、カメラ位置とかそういうメンバがあって、
でカメラの変換行列とかをGetするメソッドがあってって感じなんだけど、

それで、あるスコープでインスタンス作って、位置とか設定してカメラの行列
ゲットして3次元計算して、ってやるのはいいんだけど、
その他のスコープにいったら、またインスタンス作って位置とか視点とか
設定しなおしになるよね。

こういうときはグローバルにインスタンス作ればいいの?
でもなんかそれきもちわるい。

というかそもそも設計がおかしいの?

誰か教えてください。
boolのサポートはVC5あたりからだと思う(´д`;)
VCがいいならMSから.Net framework SDK落とすか
gccでも使うかBCCにするか好きなのにすれ、全部ただだ
143sage:01/09/08 14:29
>>141
そういう用途なら位置と視点は別クラスじゃないの?
144デフォルトの名無しさん:01/09/08 14:37
>>143

カメラ位置って3次元ベクトルです。
視点(フォーカス)も同様に3次元ベクトルです。
それをクラスにするのでしょうか。
どういうことでしょう。
私がよくわかってないのかもしれません。

別クラスにしたとして、グローバルに持っとけばいいのですか?
というか、そこが一番ききたいところなのです。

他のスコープでも扱うものをどうしたら良いのかというところが。
145デフォルトの名無しさん:01/09/08 14:47
初歩的な質問なんですが、
イニシャライザに可変個引数を渡すのってどうやるんでしょうか?
B::B(char *format, ...) : A(format, ...) {}
こんな感じでやってみたんですがやっぱりだめでした・・・。
146デフォルトの名無しさん:01/09/08 14:52
>>145
可変個引数を使ってどうしたいかの方に興味がアリマス。
147注某厨房:01/09/08 15:02
VC++を始めようと思うのですが、C/C++共に初心者です。
Cをある程度理解してからC++に入ったほうがやりやすいでしょうか。
それとも、余計なこと考えずにC++入ったほうがすんなりいくものでしょうか。

個人的見解で充分ですので、ご鞭撻を。
>147
手段なんかどうでもいいから、
何か作れ
作りたいものがなにも無いってんなら、
やめろ
149デフォルトの名無しさん:01/09/08 15:48
>>147
C を理解することはコンピュータの原理を理解することに限りなく近いです。
どちらかというと C++ はその原理を覆い隠すようなとても「便利」な
仕組みがいっぱいあります。しかしながら C++ は便利すぎて、
その「仕組み」を 100% 使うには膨大な勉強と経験が必要です。

したがってお勧めとしては、まず C でコンピュータの仕組みを理解し、
その後で Java で C++ の基礎となる概念を学び、
そして C++ もしくは C# を学習するのが良いと思います。

とは言え何よりも大事なことは、>>148 さんも言ってるように、
作りたいことは何か? ということです。
作りたいものがあり、それを作るのに適した言語を選べるくらいになれば、
とても幸せなプログラマ生活が待ってるでしょう。
「作りたいものは何か」、これを大事にしてくださいね。
Cの勉強つったって、たいがいはいきなりそこで挫折する(w
151デフォルトの名無しさん:01/09/08 17:24
最初にJavaを学ぶと、Java厨になってしまい、
決してC++やCなどに戻ることはできない。
C#は似てるから、強制力があれば可能かもしれない。
152デフォルトの名無しさん:01/09/08 18:19
CとC++でいいじゃない。
153123:01/09/08 18:40
>>139
SDKって何の奴ですか?
154デフォルトの名無しさん:01/09/08 20:22
>>123
コンパイラのエラーにヘルプがついてるのを知ってるか?
当然十分な情報がるわけではないが、チェックすべきだぞ。
アウトプットウィンドウのメッセージだけ見たところで止まってないか?
CXXXX:の番号のところを選択してF1キー押すか、ヘルプのキーワードに
番号いれてみ。
155注某厨房:01/09/08 20:30
>作りたいもの
今のところ、最終的にはVC++で自分向きの
ファイラーを作りたいと思っています。
けど、どうせやるのなら基礎からの方がいいかなと思って。
過去にも何度かやろうかと思ったことはあったのですが、
今回は腹をくくってますのでやる気だけはあります。
# もっとも、できるかどうか自信はないですが(汗

出来ればエディタも作ってみたいと思っていますが、
既存のフリーソフトとかのレベルまで追いつけるかどうか(汗
# 学習の一つとしては作ってみるかもしれませんが。

>>149
なるほど。なんとなくCやってから方がいい気はしてました。

皆さんの言う通り、以前にJAVAに手を出そうとして
やりたいことが無いのに気付いて、結局何もしなかったのと、
過去ログ(このスレに限らず)を見て目標は大事だと思いました。

>>151
危なかったッス(w

ありがとうございます。
156デフォルトの名無しさん:01/09/08 22:07
>>149
>C を理解することはコンピュータの原理を理解することに限りなく近いです。

それ言い過ぎと違う?
C学んだら、コンピュータの原理なんて理解できるかなあ。
せいぜいメモリ、CPUの割り込みとかぐらい?
それとも俺がバカ?
一直線のメモリがイメージできるって意味だろ。
プロセスごとの境界はあるにしてもね。
VBとかスクリプトじゃ永遠にそういう考えには
いたらないな。
158デフォルトの名無しさん:01/09/08 22:22
じゃあメモリの原理(?)がわかるってことじゃん。
コンピュータじゃなくて。
159121:01/09/08 22:23
>>119ありがとうございました。。
160デフォルトの名無しさん:01/09/08 22:25
>>141

私は、グローバルにインスタンス作ってやっています。
確かになんかいやですね。
私も初心者なのでよくわかっていませんが。

私も知りたいです。どなたか教えてください。
161デフォルトの名無しさん:01/09/08 22:54
>>156
>>149は哀れな勘違いだろ。
ALU内部で乗算・除算処理がどう行われているかを理解するのと
Cとかの高級言語を理解するのは全く別だからな。
そもそも149はCMOSの仕組みについて分かっているのか?
オーバークロックとかのたまって、規定よりも高い電圧をCPUにかけている
ドキュソじゃないだろうな(w
162デフォルトの名無しさん:01/09/08 23:03
自作のヘッダーファイルで作ったクラスを
グローバルで確保するにはどうしたら良いんですか?

#include"zisaku.h"

someclass *pt;
pt = new someclass;

グローバルで宣言するとエラーが出てしまいます。
他のクラスや関数内ではエラーがでません。
どうしてグローバルだとエラーが出てしまうのでしょうか?
>>141, >>160
今の設計でも、その[位置]とか[視点]とかの情報はローカルスコープ外に
持たせてるんでそ?それと同じところで[カメラ]も管理すればいいんでないの?
どんなゲームやらわからんのでなんとも言えないけど、キャラクタ毎に持つなり
シーン毎に持つなりレンダリング用のクラスが持つなり。
>>162
グローバルスコープには制御構文を書けない。
165デフォルトの名無しさん:01/09/08 23:11
>>164
ありがとうございます
pt = new someclassが駄目だったんですね
基本的な質問で申し訳ありませんでした
166123:01/09/08 23:35
>>154
そういうやり方があったんですねぇ・・・なるほど。
でも、今回の原因は私のVC++が古いためであると思われます。
仕様がけっこう変わったんですね・・・。
新しいコンパイラ買わないと。
でも金かかるんでしょうね、はぁ。
167154:01/09/09 00:37
>>166
VC++5.0でエラーでてるソースがVC++6.0で通ったり(vv
「それでいいのか、おい?」って。
168デフォルトの名無しさん:01/09/09 00:47
>166

#include <string.h>
#include <iostream.h>

int main(){
 string s = "Hello, World!\n";
 cout << s << endl;
 return 0;
}
>>163
もしかして、カメラだけ特別扱い?
Worldを頂点とする、オブジェクトツリーの中の、
1つのオブジェクトとして定義するのが普通では?

逆行列さえ求められれば、どんなオブジェクトもカメラになりえるし。
170141:01/09/09 01:02
>>163
アー、参考になります。
確かにレンダリング用のクラスでカメラクラスのインスタンス持っとけばいいな。

位置とか視点とかはカメラクラスのメンバです。

どんなゲームでどうこう、というよりも、
一般的な座標変換のことです。


>>169


あー、それも参考になるなあ。
カメラクラスって言うのが不自然なのかなあ。
171デフォルトの名無しさん:01/09/09 01:05
>>168 +これも。
----
#include <string>
#include <iostream>

int main(){
 using namespace std;
 string s = "Hello, World!";
 cout << s << endl;
 return 0;
}
----
#include <string>
#include <iostream>

int main(){
 std::string s = "Hello, World!";
 std::cout << s << std::endl;
 return 0;
}

余談だが、<iosfwd>も知れ。
>>171
本題とずれるが operator=() 呼び出すより、コンストラクタに引数
渡したほうが良くないか?

string s = "Hello, World!";
string s("Hello, World!");
173123:01/09/09 01:19
>>168
>>171
コンパイルしましたが、全滅です^^;。
上にも書きましたが
#include<iostream>
#include<string>
はだめで、.hを付けないとファイルをオープンできません。

それとstring.hをとりこんでもstring宣言すると、stringは定義
されてない識別子というエラーになります。
using namespace std;
とすると、stdは存在しないか名前空間ではないとエラーがでます。
これはコンパイラが古いせいで、解決法は無いと思われます。
174デフォルトの名無しさん:01/09/09 01:23
しつもぉ〜ん
VC4.0って、STL付いてるの?
iostreamだけじゃないの?
http://www.stlport.com/
4.0に対応してるかはしらないけど、
ここで落すべし。

string.hは、cのヘッダだろ(藁
176123:01/09/09 01:29
ということはC++のstringは無いってこってすか??
177デフォルトの名無しさん:01/09/09 01:48
>>172
この場合はoperator=呼ばれないんじゃないの?
代入じゃなくて初期化として扱われると思ってたけど。。

>>173 >>174 >>175
入ってないものは仕方ないな。VC++のヘッダディレクトリ見て、
存在してなかったらコンパイラがどうとかいう必要ないな。
stlportは、本家よりいいという噂もあるしな。
漏れは、Plaugerのソースが性に合ってるが。
178デフォルトの名無しさん:01/09/09 02:29
質問なんですけど、

char a = 'a';
cout << int(a); //文字じゃなくて数値を表示

このint(?)は何ですか?マクロかなんかですか?
それとこの場合、(int)aのようにキャストしても大丈夫みたいですが、
int(a)と(int)aの違いは何ですか?
>>178
int(a)はC++固有のキャスト構文
(int)aでも問題ないけど。
詳しくは参考書読み返して
180デフォルトの名無しさん:01/09/09 02:46
typename(expression)は、プリミティブな型に使う明示的型変換構文。
マクロっていうよりは演算子。

Cでは使えなかったかも、ってのとポインタへ型への変換
には使えない、ってのが違うはず。効果は同じだと思うが。
static_cast<int>(a)とかの方が好きだが。
181180:01/09/09 02:47
かぶった(鬱
>>172
177 が正解。
183172:01/09/09 04:12
>>177 >>182
そうなのか。勉強になったよ。
184178:01/09/09 07:33
>>179
>>180
そうですか。ありがとうございます。
しかし、違いがポインタ型への型変換ができないということだけなら、
最初からキャストがあるわけなので、意味が無いように思える
のですがね。なんでC++でこんなの作ったんでしょうかね。
まあいいけど。
>>184
あれってコンストラクタの構文と同じだよね。
C++(の作者)的には、コンストラクタとキャストを同一視したかったのだと思う。
ある型の値を与えられて「それと同等だけど別の型の」ものを生成するってのは
コンストラクタ(の使われカタの一部)とキャストとは似てるので。

で、そうしたまではいいが、hogehoge*みたいなメタ型に構文的に適用不可能という辺りが、間抜けだ。
ポインタ型への変換に使えないんじゃなくて、「1単語で表現できない型」に使えないんじゃなかったっけ?
だからたとえば、ポインタだってtypedefしとけば、その別名でtype()なキャストがやれる。

すげーどうでもいいが、Pascal/Delphiはこの構文だ。
Pascalはhoge*みたいな1語で表現できない型を使うのを許してない
(ほぼ常にtypedef相当を書かないとならない:だから面倒(藁))
ので、これで問題ないわけね。
186デフォルトの名無しさん:01/09/09 09:12
>>180
typedefしてればポインタ型もOK。*が構文中に使えないだけ。
typedef int* pint;
pint pi = pint(&i);
187デフォルトの名無しさん:01/09/09 09:43
メモリ最適化ツールって、どうやってるの。
例えば192MBのメモリがあったら192MB全部確保しちゃうの?
でもそれ、できなくない?
またDel厨が・・・
189デフォルトの名無しさん:01/09/09 10:17
そんなにいわないでよ
190デフォルトの名無しさん:01/09/09 10:36
static_cast<>
dynamic_cast<>
reinterpret_cast<>
const_cast<>
あとなんかあったっけ?

誰か、これらの違いをわかりやすく説明してよ。
それぞれどういう場面で使うのかも。
サーチエンジンで検索すればいいのに・・・
192190:01/09/09 10:51
あ、そ。
つまんないネタで悪かった。
>>190
このうち使い分けが微妙なのは static_cast<> と reinterpret_cast<>
だと思うけど、MSDN のコラムが詳しく説明してる。

http://www.microsoft.com/japan/developer/library/dsmsdn/deep05182000.htm
http://www.microsoft.com/japan/developer/library/dsmsdn/deep06012000.htm
194デフォルトの名無しさん:01/09/09 11:49
・dynamic_cast<>
Javaのキャストと同じ

・const_cast<>
const指定を除去する。型変換はできない。

・static_cast<>
dynamic_cast<>の逆をする。

・reinterpret_cast<>
Cのキャストと同じ。危険物。

あってる?
195190:01/09/09 11:55
>>193
ありがとう。そこ面白かった。
static_cast<T> では operator T() が呼ばれることがあるけど、
reinterpret_cast<T> では常にビットパターンそのまま
ていうのが決定的な違いなのかにゃ?

>>194
君も 193 のリンク先を呼んだ方がいいぞ(藁
196180:01/09/09 16:17
サンクスコ オモシロカターヨ > 各位
ついでだから漏れも質問。

struct HogeImpl; // class HogeImpl
struct Hoge{
 HogeImpl* _pimpl;
};

ってやった場合、先行宣言でstruct/classにしてしまった場合、
HogeImplにテンプレートインスタンスな構造体/クラスを使えない
ようなのだが、これって回避可能?
コンパイラはVC++5.0/6.0あたりなんだけど。

やりたいことは、DLLの外側にテンプレートインスタンスな
クラス/構造体を出したくないから、何かかぶせよう、って
ことなのだけど、これはC++スレ本来からは外れる気がするので
とりあえず、最初の疑問のみ回答キボンヌ。
197デフォルトの名無しさん:01/09/09 17:01
>>196
宣言の仕方が悪いだけのような気もするが...。
198デフォルトの名無しさん:01/09/09 21:29
列挙型の値の範囲ってありますよね?
あれって何の意味があるんでしょうか。
例えば

enum e{ a=1, b=3, c=5, d=9};

の場合、上限は15で下限は0ですよね?
この上下限て何かに役に立つのですか?

それと、列挙値に負数が含まれる場合の下限値の計算方法を
教えてください。
199デフォルトの名無しさん:01/09/09 21:34
なんで?
列挙型ってintでしょ
>>196
HogeImpl には純粋仮想関数だけ持たせておいて、

template <typename T>
class Foo : public HogeImpl
{
};

で、良いんじゃない?
>198-199
が何言ってるのか分からないのは俺だけか
202196:01/09/09 22:53
>>200
サンクス。いや、実際今のところそんな感じにはなってるんだ。
結局typedefとかではダメで、サブクラス化が必要なのかぁ、、
素直に通らないのにはなんか理由があるのかなぁ、
というより漏れがやろうとしていることの方が素直じゃないんだね。。

structテンプレートの変数が全部解決されたら、それは
もうstructだろう、と漏れはいいたいのだが。
なんかできそうな気がするんだけど。

>>197 正しい宣言のしかたキボン。
203デフォルトの名無しさん:01/09/09 23:03
>>198
設計上ビットサイズが意味をもつ場合には、なんか使い途
があるのかもね。でもenumの使い方としてはやや本筋を
外れるかもしれない。

少し長いがプログラミング言語C++ 第3版 日本語訳から、、
--
列挙子は、整数データ型の定数式により初期設定できる。

列挙の上限は、列挙に含まれるすえての列挙子の値よりも
大きい2の累乗値マイナス1の中で最も小さい場合である。

列挙の下限は、列挙子の最小値が負数でない場合には0、
列挙子の最小値が負数の場合には、それより小さい
2の累乗値プラス1の中で最も大きい値である。

これは、列挙の値を保持できる最小のビットフィールド
のサイズである。
204198:01/09/09 23:19
>>203
ビットサイズはenumの設定値によって違うということですかね・・・。

それと
>列挙子の最小値が負数の場合には、それより小さい
>2の累乗値プラス1の中で最も大きい値である。
の部分ですが、私はアホなのでよくわからんのですが、
例えば最小値が−10だったらどういう計算になるのでしょう?
最大値の方はわかるのですが・・・。
205デフォルトの名無しさん :01/09/09 23:26
このプログラムがなぜエラーになるのかわからないです。
o[i].hoge()だとコンパイル通るんですが。

#include <iostream>
using namespace std;

class A
{
public:
    void hoge(){ cout << "hello\n"; }
};

int main()
{
    A* o;

    o = new A [3];

    for( int i = 0;i < 3; i++ ) o[i]->hoge();

    delete [] o;

    return 0;
}
206デフォルトの名無しさん:01/09/09 23:31
>>205
o[i]が、A&なんじゃないの?
207デフォルトの名無しさん:01/09/09 23:36
o = new A;だと
o->hoge();でいけるんですが。

配列だと参照になっちゃうんdすか?
208デフォルトの名無しさん:01/09/09 23:47
>>207
operator[]使った時点でderefされてるのが普通だと思えるよ。
たしかにoperator new[]はvoid*返すんだけど。

int* a; でa[i]ならポインタでなくてint値が返るだろ?
o->hogeの配列版は(o+i)->hoge()じゃない?
>>205
o は A の配列 (配列の名前)
o[i] は A 型のオブジェクト
だからメソッドを呼ぶときは o[i].hoge() でいい。


A * o = new A; だと
o は A 型のオブジェクトへのポインタ
だから o->hoge() でメソッドを呼ぶ
210205:01/09/10 00:45
なるほど。どうもです。なんかややこしいな。
211初心者です:01/09/10 02:33
超初心者の質問です。
Cでmallocとかでメモリを確保した後、きちんとfreeしてあげないとだめなんですか?
すごくめんどくさくて別に問題ないのならやりたくないんだけど。
ちなみにOSはLinuxです。
教えてください。
>>211
C++ じゃなくて C の話題のような気がするが…ともかく。

free() すると、free() したメモリが malloc(), realloc() で再利用可能になる。
もし何度も malloc() を行うプログラムなら free() しておくと使用メモリ量を
抑えられる。

サーバプロセスのように 24 時間実行されたり、エディタのようにいつまで実行
すればいいのか分からんアプリケーションで何度も malloc() する場合には
free() 必須。さもないとメモリを食いつぶしてしまう。

短期間だけ実行してすぐに終了してしまうプロセスや、malloc() で確保する
メモリ量が限られている場合には free() せずに終了して構わない。free()
していないメモリ領域も含めて、プロセスが使っていたメモリは OS がまとめ
て回収するから。

関連スレッド
始まった!malloc and free - fj.comp.lang.c
http://mentai.2ch.net/test/read.cgi?bbs=prog&key=981051921

あと free() するのが面倒だと感じるなら、ガベージコレクタを使っても良いよ。
プログラム中から参照されていないメモリ領域を勝手に free() してくれる。

BoehmGC
http://reality.sgi.com/boehm/gc.html
>>211
>>212の手段の他に、処理系依存だけどallocaってのがある。
(処理系依存といってもほとんどの処理系に存在する)
これはスタック領域を使うんで、開放は必要無い。
でも呼び出せる場所に制限があるかも知れない。
システムに要求を出すわけではないから、
mallocより多少効率が良いかも知れない。
関数を抜けると開放されるので、永続的な用途には向かない。
>211
>>210はネタのような気がするが
ずれた
>>211-212
> >>210はネタのような気がするが

VB野郎なんじゃないの?
217超初心者:01/09/10 12:43
211です。
C++のスレッドと知らず書き込んでしまいました。
すみません。

212,213さんありがとうございます。
free()の意味がわかりました。
さんきゅーです。

ちなみにこれはネタじゃないんです。
本当に超初心者なだけです。
218小町算:01/09/10 15:46
#include <stdio.h>
#include <stdlib.h>

int main()
{
int i, s, sign[10];
long n, x;

for (i = 1; i <= 9; i++) sign[i] = -1;
do {
x = n = 0; s = 1;
for (i = 1; i <= 9; i++)
if (sign[i] == 0) n = 10 * n + i;
else {
x += s * n; s = sign[i]; n = i;
}
x += s * n;
if (x == 100) {
for (i = 1; i <= 9; i++) {
if (sign[i] == 1) printf(" + ");
else if (sign[i] == -1) printf(" - ");
printf("%d", i);
}
printf(" = 100\n");
}
i = 9; s = sign[i] + 1;
while (s > 1) {
sign[i] = -1; i--; s = sign[i] + 1;
}
sign[i] = s;
} while (sign[1] < 1);
return EXIT_SUCCESS;
}
-1+2-3+4+5+6+78+9=100を表示させないようにするにはどうしたらよいですか
おしえてください。お願いします。
219デフォルトの名無しさん:01/09/10 18:11
初心者ですが質問させて下さい。
整数を保存するリストに対し,
その順序を反転する関数を作成せよ。という問題なのですが、
これって各ノードを図であらわしたときの矢印の向きを変えろ,
と言っているようなものなのですか?
宜しくお願い致します、、、
220デフォルトの名無しさん:01/09/10 18:18
それ以外の可能性ってあるの?
双方向リストなら、書く量が少なくていいね
単方向でも、ルート不要なら、再帰で書くと
少ない努力でできるかな

なんでも定番は同じだね
STLのlistだったりして…
STLのlistだと問題にならないじゃん。
>>222
自分で組むのは、STLで使えるようになってからでもいいじゃん。
問題出すほうがわかってないのかもよ。
protectedについて質問。
派生クラスから基底クラスへのprotectedだったら見えると思ったんだけど、
下のコード、コンパイラ通らないです。
基底クラスへの参照は無理なの?
教えてください。

class A
{
protected:
  int xxx;
};

class B : public A
{
  void func(A* ptr);
};

void B::func(A* ptr)
{
  cout << ptr->xxx;
}
225デフォルトの名無しさん:01/09/11 00:05
class A
{
protected:
int xxx;
};

class B : public A
{
public:
void func();
};

void B::func()
{
cout << xxx;
}

void main(void)
{
B b;

b.func();
}

こうじゃなくて?
226_:01/09/11 00:21
namespace使用時、friend class宣言が無視されます。
何が悪いのでしょうか?

ファイルA
namespace a

class A{
friend class B;

int i

};

};

ファイルB
#include "ファイルA"

using namespace a;

class B : public A{

B(){
i = 1; // ←privateメンバにアクセス出来ないとエラー。
}

};
>>225
あ、クラスAを継承してるクラスが他にもあったりするので、
基底クラスであるクラスAに対して行いたいのです。
class B;
namespace a {
class A{
friend class ::B;
int i ;
}; };
229226:01/09/11 01:37
>>228
それでうまくいきました。
でもnamespaceを使う前は、プロトタイプ宣言無しでもいけてました。
それに複数のファイル間で同じnamespace名を使うとエラーが出まくります。
疑問だらけなんで、もうちょっと勉強してみます。
ありごとうございました。
230226:01/09/11 02:56
理解できました。
C++ってやっぱ難しい!
231219:01/09/11 06:33
219の質問をしたものです。
長いので2chに書くのを控えたのですが、
http://members.tripod.co.jp/giriam2001/c.html
のプログラムを参考にして解けというものなのです。
全く糸口さえわからないのですが、、、、、
>>219
氏ね
236デフォルトの名無しさん:01/09/11 10:31
>>224
のコードはBの基本クラス要素ptrを見てるんじゃなくて、新しい別のクラスAのptrを見ているよ。だから、*ptrには何も入っていないからcoutにNULLが渡されて、エラーがでてるんじゃない?
>>236
その答えは思いっきり外してるぞ。
238236:01/09/11 10:55
あ、しまった。coutには参照が渡されなければ行けないのに、
NULLが渡されたからエラーがでる。。
てことでOKだよね
>>238
いや、そもそもコンパイルエラーが出るって話だろ…?
呼び出し側のコード見ないとなんとも言えないが func( NULL ) なんて呼び方してるとも思えんし。

つーか、解決 >>230 してるんだよね。(^^;
240236:01/09/11 11:28
そうだったんだ。すまん。でも見ため224と226は同一人物ではないような気がして。。。
>>236
前半は合ってるけど後半が違う。
>新しい別のクラスAのptrを見ている
から他人の保護メンバ xxx にアクセスできんということだ。
>>231
リンク先のソースに付け加えるとしたらこんな感じか。
//要素の順序を逆にして新たな先頭ノード(旧末尾ノード)へのポインタを返す
Node *reverse(Node *n)
{
 Node *prev_node;
 Node *old_next;
 for (prev_node = NULL; n != NULL; prev_node = n, n = old_next) {
  old_next = n->next;
  n->next = prev_node;
 }
 return prev_node;
}
243236:01/09/11 13:09
>>241
その通りでした。一番肝心なこと忘れてたYO。
まだまだっす勉強します。
244デフォルトの名無しさん:01/09/11 19:19
.NetのVisual開発ツールってframeworkSDKのbinの何ていうアプリケーション?
245デフォルトの名無しさん:01/09/11 19:45
あれ?protectedのメンバって例え派生クラスとはいえ
べつのオブジェクトのprotectedメンバにアクセスでき
るんだっけ?
protectedって単に継承したときに基底クラスのメンバ
をどのように扱えるかを決める物じゃないんすか?
246デフォルトの名無しさん:01/09/11 19:46
>245
ハァ?
>>245
正解。
>>245
>protectedって単に継承したときに基底クラスのメンバ
>をどのように扱えるかを決める物じゃないんすか?
意味不明。
249デフォルトの名無しさん:01/09/11 20:03
つまり、生成された同一クラスのインスタンス間で
protectedなど、アクセス制限は適用されるか?ってことか。
おいらもよくわからん。
誰か調べて。
250デフォルトの名無しさん:01/09/11 20:29
#include<stdio.h>

class pee{
protected:
int tinkasu;
public:
void peeing(pee p){tinkasu=p.tinkasu;}
};

int main(){
pee p1,p2;
p1.peeing(p2);
return 0;
}

こういうこと?
251デフォルトの名無しさん:01/09/11 20:41
>>245が正解なので、>>224がコンパイル通らないのです。
252デフォルトの名無しさん:01/09/11 21:01
>>245
そうなんですか。勉強になりました。
Javaのprotectedとは意味が違うんですね。
C++では同じクラス同士のみで参照したいメンバは
作れないんですか?
253デフォルトの名無しさん:01/09/11 21:13
同じクラス同士、ならprivateでもprotectedでもいい、と、思、う。
派生がからむとややこしいけど…。

…自信なし。
>>252
いや、同一クラスならアクセスできます。派生クラスだとアウト。

class A
{
protected:
  int xxx;
public:
  void func(A* ptr)
  {
    std::cout << ptr->xxx << std::endl;
  }
};
>>255
じゃあ、ダウンキャストしてからだとOKですか?
256デフォルトの名無しさん:01/09/11 21:59
あれ??そうなると、224がコンパイルできないのは、Aのprotectedメンバを指しているからではないんですね。ではやっぱり236が正しいということ??
257デフォルトの名無しさん:01/09/11 22:00
すいません、コメントに「。」をつけますか?
258デフォルトの名無しさん:01/09/11 22:02
つまり、同一クラスのオブジェクトは一種の派生クラスと考えられるってことでいいですね??
>>258
よくわからん。
260デフォルトの名無しさん:01/09/11 22:29
ん?
たとえば、
クラスAのオブジェクトとしてobj1とobj2があるとすると、
obj1のprotectedメンバにobj2からアクセスできるの?
>>260
できるよ。
Privateでも。
>>260
それはできる。

class Test
{
protected:
 int xxx;
};

void Test::func(Test* t1)
{
 this->xxx = t1->xxx;
}
じゃあ、基底クラス型オブジェクトのprotectedに派生クラスから
アクセスできないの?
>>256
>>224 の B は 「Aの派生クラス」 であって、A ではないよね。
だから A のインスタンスの protected メンバにはアクセスできない。
でも B の別のインスタンスの
(A から継承した) protected メンバにはアクセスできるから、
下のようにすればコンパイルは通る。

class A {
protected:
 int xxx;
};

class B : public A {
public:
 void func(B* ptr); // B へのポインタを受け取るようにする。
};

void B::func(B* ptr) {
 cout << ptr->xxx;
}
-----------------------------------------------------
<html><head><title>クラスのアクセス</title></head><body>
<table><tr><td>派生の仕方\基本</td><td>Public</td><td>
Protected</td><td>Private</td></tr><tr><td>Public</td><td>
Public</td><td>Protected</td><td>参照不可</td></tr><tr>
<td>Protected</td><td>Protected</td><td>Protected</td><td>
参照不可</td></tr><tr><td>Private</td><td>Private</td><td>
Private</td><td>参照不可</td></tr></table><p>表の中にある
のは、派生した後の派生クラスから見たメンバの状態 </p>
</body></html>
-----------------------------------------------------
HTMLで保存して、見なさい。

(多分あってると思う・・・間違ってたら指摘して)
>>264
Aを抽象クラスとして、Aに対して処理することに意味がある場合は?
例えば、CompositパターンのCompositオブジェクトから
基底クラスのprotectedへアクセスしたい場合とか。
267デフォルトの名無しさん:01/09/11 23:15
同じ派生クラス型の異なるインスタンス間においては、相手のインスタンス
のリファレンスやポインタを受け取ることによって、相手のすべてのメンバ
(派生クラスのメンバ)にアクセスできるし、相手の基底クラス
のprotectedメンバ以下(protectedとpublic)のメンバにもアクセスでき
る。ただし、一方が派生クラスのインスタンスで、他方がその基底クラスの
インスタンスである場合、派生クラス側が基底クラス側のインスタンスの
リファレンスやポインタを受けとっても、その基底クラスのprotectedメンバ
以上(protectedとprivate)のメンバにはアクセスできない。

>>224 でエラーが出たのは、派生クラスが基底クラスのポインタを受けとって
いたから、protectedメンバにアクセスできなかったということで、
もし派生クラスのインスタンスを受け取るように設計してれ
ば、インスタンスが異なっていても基底クラスのprotectedメンバにアクセス
できるということ。
268デフォルトの名無しさん:01/09/11 23:17
>>266
いっそパブリックにしたらぁ?
269デフォルトの名無しさん:01/09/11 23:22
>>266
派生クラスを経由して基底クラスにアクセスすると何か不具合
でもあるの?
270256:01/09/12 00:02
>>264-267
よーくわかりました。丁寧な解説ありがとうございました。
これで、サルから原人レベルになれました。
271256:01/09/12 00:12
しかし>>265さんの、htmlのソースを載せる書き方は初めて見ました。おもしろいっす斬新っす
272デフォルトの名無しさん:01/09/12 01:46
C++でもデバイスドライバ書けますか?
273デフォルトの名無しさん:01/09/12 02:14
STLで質問ですが、
class a{
int b;
int c;
}
vector < vector<a> > d;
とした場合、
d[10][8]という配列を新規に確保したい場合、どうすればよいのでしょう。
書ける>272
>>273
vector< vector<a> >型の[10][8]の配列が必要なら
vector< vector<a> > d[10][8];
で普通に確保できるぞ?
いまいち質問の意図が読めんが。
276デフォルトの名無しさん:01/09/12 02:42
>275
説明不足ですいません。動的に確保する必要があるのです。

void E(int x,int y){
//ここで動的にd[x][y]の配列を確保したい
}

このような場合です。
>>276
new使って動的に配列確保すれ。
つか、vector4つ重ねたほうがいいと思うが。
278 :01/09/12 03:32
”d[x][y]の配列”ってのが意味不明だが、
vector<vector<vector<vector<a> > > > d(x);
for(int i=0;i<x;++i) d[i].resize(y);
もしくは、
vector<vector<a> > **d = new vector<vector<a> > *[x];
for(int i=0;i<x;++i) d[i] = new vector<vector<a> >[y];
こんなもん?
resizeってなかったっけ?
280エロ画像:01/09/12 03:47
281デフォルトの名無しさん:01/09/12 17:05
vector< vector <int> >をクラスのメンバにしてファイルに書き出した場合、読み込みも自動的にvectorメンバの範囲を読み取ってクラスのインスタンスのメンバに格納されるのでしょうか。
それとも、自分でassignしなければならないのでしょうか。また、その場合どうやってやればいいのですか。
282sage:01/09/12 18:55
>>281
内側の個数がわかっているなら、外側のvectorのiteratorを順に回して、内側のvector<int>のresize/assignをしときなさい。
わかっていないなら、vector<int>を一個ずつ追加でもしながら、assignしていきなさい。
質問です。
シングルトンなどで使用されるようなstaticなメンバの開放ってしなくていいんでしょうか?
クラスのデストラクタ(?)みたいなものってあるのかな?
284デフォルトの名無しさん:01/09/13 02:22
>>283
下でどうでしょ?

#include <iostream>
#include <string>
template <class T>
class Singleton {
 static T *instance;
 static int count;
protected:
 T* create();
public:
 Singleton() {
  if (count == 0) {
   instance = create();
  }
  count++;
 }
 ~Singleton() {
  count--;
  if (count > 0) {
   cout << "逝ってよし" << endl;
  } else {
   cout << "オマエモナー" << endl;
   delete instance;
  }
 }
 T& operator *() { return *instance; };
};
template <class T> int Singleton<T>::count = 0;
template <class T> T* Singleton<T>::instance = 0;
string* Singleton<string>::create() { return new string("モナー"); };
int main() {
 Singleton<string> s1;
 Singleton<string> s2;
 cout << "s1:" << *s1 << ", s2:" << *s2 << endl;
 return 0;
}
けど、スタティックなメンバー位なら、(free信者みたいに)あんまり
解放を気にしすぎると健康に悪いと思う。
また、そいつが他の資源を握ってるんなら、
デストラクタにとは別のメソッドで明示的に解放すべきだと思う。
285デフォルトの名無しさん:01/09/13 07:28

わけがわからん
286誤爆人:01/09/13 09:00
BCC5.5で試してみた。
・include後に
using namespace std;
を加える。
・string* Singleton<string>::create() { return new string("モナー"); }; を
template<> string* Singleton<string>::create() { return new string("モナー"); };
に変更。
で動いたよ。勉強になった。thx
ほんとかよ!
288デフォルトの名無しさん:01/09/13 15:30
単にクラスのメンバーに定数を定義したいのですが
class A
{
 const int i = 1;
 const CString str = "abc";
};
等とすると、コンパイルエラーとなってしまいます。
関数定義の中だと問題ないのですが、
クラス内では、このような定義はできないのでしょうか?
>>288
enumを使うか初期化子使え。
>>289
初期化子、はじめて使いました。
まだまだ厨房、、、
291デフォルトの名無しさん:01/09/13 20:57
>>288
組み込み型はstatic constな場合に限りclass宣言内で定義できる。
よって以下のように書くこともできるyo

// A.h
class A
{
 static const int i = 1;
 static const CString str;
};

// A.cpp
const CString A::str = "abc";
292デフォルトの名無しさん:01/09/14 20:31
>>291
> 組み込み型は
"整数は"の誤りだな。以下のコードはコンパイルを通らない。

class A
{
 static const float f = 1.0;
};
>>291 >>292
Visual C++ みたいにアホい(というか仕様が古い?)コンパイラでは、
整数でも宣言時初期化はエラーになるんです。
294デフォルトの名無しさん:01/09/14 21:46
gcc では以下はコンパイルできたよ。

class A {
static const int i = 0;
static const float f = 0.0;
static const double d = 0.0;
static const char* const s = "abc";
};
CStringとchar *は全然違うだろ
>>295

>> 組み込み型は
>"整数は"の誤りだな。以下のコードはコンパイルを通らない。

のあたりを試してみたんだけど?
297デフォルトの名無しさん:01/09/15 14:05
>>294
確かにgcc(2.95.3)だと通った。これってgccの拡張仕様なのかな。
手元にあるプログラミング言語C++第3版には、整数でないとダメと書いてある。
それとも本が古いの? 誰か教えれ。
298defalut:01/09/15 15:00
MS VisualC++Ver6で
Windows9x,NT,2000 が終了する際に
cookie をすべて削除するプログラムを作りたいとおもうのですが、
どうやればいいでしょうか?
>>298
常駐してWM_ENDSESSIONが来たらcookieの保存されてるフォルダ内容をすべて消す。
300defalut:01/09/15 15:35
まだ、Visualcでソフトを作ったことがありません
1 常駐させる方法
2 フォルダの内容をすべて消す
方法教えてください。
300の作ろうとしているソフトは怖いです
302デフォルトの名無しさん :01/09/15 16:02
VBAしか扱ったことがありません。
VBAですと、イベントハンドラたとえば、ボタンを押したタイミング
で、プログラムが動作します。

VisualCの場合は メッセージを単位ににしてプログラムが動作
するようになるのでしょうか?
>>302
>VBAしか扱ったことがありません。
>VBAですと、イベントハンドラたとえば、ボタンを押したタイミング
>で、プログラムが動作します。
人のことなめてる?(いろんな意味で)

>VisualCの場合は メッセージを単位ににしてプログラムが動作
>するようになるのでしょうか?
あなたは Win版 HelloWorld からはじめてください。
304293:01/09/15 16:17
>>297
ちょっと気になったので調べてみました。
私の手元には1996年のドラフト2のPDFしかないんですが、
(ちょっと古いですかね...)それによると、

> If a static data member is of const integral or
> const enumeration type, its declaration in the class
> definition can specify a constant-initializer which
> shall be an integral constant expression (5.19).

とあります。「整数または enum の場合はできる」と
書かれていますが、それ以外の型の場合については
「できる」とも「できない」とも書かれていませんね。

ちなみに、整数だけ通して、他の型ではエラーになる
コンパイラとしては、CodeWarriar があります。
305デフォルトの名無しさん:01/09/15 16:22
>>302
「ボタンを押したタイミング」ってのは、「メッセージを単位」にしてるってこと、
もしかしてわかってない?

まずイベントドリブンって言葉から、勉強しましょう。
>>298
とりあえず、お前の求めている機能を実現するのにVCでプログラム書く必要はない。
autoexec.batに以下の1行を追加するだけだ。

del C:\Windows\Cookies\*.txt
307 :01/09/15 17:11
ソダネ.
308 :01/09/17 19:00
本についてですが、
プログラミング言語C++第3版という本の姉妹本みたいなの
ありますよね。同じアスキーで赤い背表紙の本で、OOPに関するものや
STLに関するものや、あとはC++第3版の問題の解答集みたいなのとか。
あのあたりの本はいいのでしょうか?それともC++第3版に便乗して
売ろうとしてるただの本なのでしょうか。言語仕様の本とはべつに
OOPやSTLあたりの本も読もうと思ってるのですが・・・。
>>308
Effective C++ と More Effective C++ は読んでおいた方が良いと思う。
310デフォルトの名無しさん:01/09/18 00:53
>>309
同意。必須です。
311デフォルトの名無しさん:01/09/18 01:35
分厚いやつでは最近出たSTLのリファレンス的なやつに目を通せば
よいと思うけど。あとは疑問視。

>>309 の次くらいにExceptional C++とか。
GotWの記事直接見てもよいが。
312デフォルトの名無しさん:01/09/18 04:45
フォントファイルに関しての質問です

フォント名(MS ゴシック など)が解っていて、それに対応する
*.TTF あるいは *.TTC のファイル名を得るにはどうすればいいでしょうか。
またその逆に
*.TTF等のファイル名が分かっていて、それに対応するフォント名
を得るにはどうすればいいでしょうか。

MS VC++ 5
Windows 98
313デフォルトの名無しさん:01/09/18 05:55
class A {
 const int data[2];
public:
 A(int d1, d2);
};

A::A(int d1, int d2) : data[0](d1), data[1](d2) { }

constのメンバ配列を初期化したいのですが、出来ないのでしょうか?
314デフォルトの名無しさん:01/09/18 11:39
ちょっと質問があるんですが。
Cで制御系のプログラムを組んでたんだけど、今度C++で組むことに
なったのです。
で、本買って勉強したり、サンプルとか見せてもらったんだけど、データの
部分に関してはクラスを使うのは分かるんだけど、何でもかんでもクラス
にするものなの?
メインで無限ループで受信待ちの部分なんて、クラスにする必要あるの?
制御系のプログラムを組む時、どこまでクラスで設計するものなのか
良く分からないんですけど、いい本とか、いいサイトはありますか?
>>314
メインループは唯一のインスタンスを持つアプリケーション全体のクラス
として設計しる。
含まれるメソッドは初期化、メインループ、例外処理。
316309:01/09/18 12:41
そういえば Effective C++ の著者が Effective STL というタイトルの書籍を出したけど、
誰か読んだ人います?

http://www.amazon.co.jp/exec/obidos/ASIN/0201749629

あと個人的には Modern C++ Design: Generic Programming and Design Patterns Applied
も気になってる。

http://www.amazon.co.jp/exec/obidos/ASIN/0201704315
>>312
レジストリを漁れば見つかるはず。でも、スレ違い
>>313
こんなやり方はどう?
class A {
 const int* data;
public:
 A(int d1, int d2);
 ~A(void) { delete[] data; }
};

A::A(int d1, int d2) {
 int* temp = new int[2];
 temp[0] = d1, temp[1] = d2;
 data = temp;
}
>315 レスありがとうございます。
なるほど、C++では何でもクラスで作っておけということでしょうか。
それによるメリットは、後々使いまわしがきくということですか?
320typename C++::books:01/09/18 15:36
>>316
> あと個人的には Modern C++ Design: Generic Programming and Design Patterns Applied
> も気になってる。
>
> http://www.amazon.co.jp/exec/obidos/ASIN/0201704315

これめちゃ面白いよ。template炸裂。
Effective C++, More Effective C++, Exceptional C++の次に必読。

// templateが原始帰納関数計算できるって知ってた?
321Bear in mind:01/09/18 16:56
>>316
Effective STL読んでます。今item37。
あと一週間待って。
322309:01/09/18 21:10
>>320
Thanks. よし、買おう。

> // templateが原始帰納関数計算できるって知ってた?
Game Programming Gems で template 使って行列計算するサンプルを読んで、
初めて template の記述能力の高さに気づきました。あそこまでいくと、もはや、
コンパイル時に評価されるインタプリタ「言語」ですね。

>>321
レビュー、期待しております :)
>>322

ちょっとサンプル見せて
324309:01/09/18 22:28
>>323
行列だと長いから、フィボナッチ数列のサンプルで良い?

template<unsigned N> struct Fib
{
  enum
  {
    Val = Fib<N - 1>::Val + Fib<N - 2>::Val
  };
};

template<> struct Fib<0> { enum { Val = 0 }; };
template<> struct Fib<1> { enum { Val = 1 }; };

これで、ソース中に Fib<8>::Val と書くと、フィボナッチ数列の 8 番目
の数値が得られます。
325 :01/09/18 23:21
やはりみなさんは「プログラミング言語C++」を通して
お読みになられたのでしょうか?
326typename C++::books:01/09/19 00:05
>>323
> ちょっとサンプル見せて

http://cseng.aw.com/book/0,,0201704315,00.html
ここからloki.zipを取得せよ。ちょと強引なのもあるけどね。template萌え萌え

// 標準に追い付いてないg++でcompile出来ない…
>>324
うぁ、すごいね。
これを見ると、とてもC++を使いこなしているとは言えないなぁ
>>324
関数型言語みたいな感じやね
329typename C++::books:01/09/19 00:37
Lisp、ML、Haskelで培った型やマクロに関する知見を、
compile-timeという制約を課して開花させていると思われ

最近良く使うのは、

template <class T> struct UnConst { typedef T UnConstT; }
template <class T> struct UnConst<const T> { typedef T UnConstT; }
…UnConstT<var>…

というようなpattern matchを使ったconst, &, *外し。

「引数がポインタ型だった時だけ」というようなtemplateも書ける。
330テンプレートマンセー:01/09/19 01:28
最近のお話のものは、テンプレートメタプログラミングで
引けばいろいろ出ると思われ。

ttp://www.oonumerics.org/oon/
ttp://extreme.indiana.edu/~tveldhui/papers/techniques/

昔のCマガにも出てたことあり。
331デフォルトの名無しさん:01/09/19 02:11
>>324
よくもわるくも馬鹿すぎ。
よいほうの理由は説明は略するとして、
悪いほうは「それって単なるCの引数つきマクロと同じレベルじゃん」。
その理屈でいえばマクロ的なことをなんでもやらせられるという安直な結論になるだけだ。
>>331
> 「それって単なるCの引数つきマクロと同じレベルじゃん」
マクロは C/C++ を理解しない単なる文字列置換しかできませんが、template
関数/クラスは C++ の文法を 100% 理解できますから、記述能力が全く違い
ますよ。

それと >>324 で挙げられているような単なる数値計算に限っても、実行時では
なくコンパイル時に値を確定できる利点があります。数値シミュレーションや 3D
ゲームのエンジンを記述する時には、十分に実用的なテクニック。

> その理屈
どの理屈?
333デフォルトの名無しさん:01/09/19 03:10
マクロは字句解析レベルで置換を行うプリプロセッサ
テンプレートは構文解析レベルで置換候補を作っておいて、
リンク時に解決を行うプリ/ポストプロセッサって感じがする。
(実際は違うんだろうけど)
なんかC++の言語本体からは遊離しているような印象。
それが使いやすくもあり、使いにくくもある。

JavaのJSR-14とかだと、もうちょっと言語よりになっているような..
reflectできるし、interface指定できるし
lispのマクロみたいね。
335デフォルトの名無しさん:01/09/19 07:19
>>331
知ったか厨房決定。
テンプレートをよく知らないと思われ。
>355
いや、ただの厨房でしょ。
337325:01/09/19 18:45
みなさん無反応なんですが・・・(汗

やはりあんな分厚い言語仕様本を通して読むのはバカげてますかね・・。
338デフォルトの名無しさん:01/09/19 20:09
>>337
そんなことない。1回は読んどくべきと思う。
‥とかいいつつ、漏れもまだ20章あたりまでしか読んでないが(w
339325:01/09/19 20:37
そうですか。読む勇気が沸いてきました(w。
まだ5章です。
あの大きさは、電車とかで読むのにはちょっとキツイですな。
それがネックになっています。
340馬鹿:01/09/19 20:49
>>337
読んだよ。
341教えて君。:01/09/19 21:16
g++-3.0.1ではg++-2.95.3で通ったC++のコードをコンパイルしてくれません。
なぜですか。
342それはね:01/09/19 23:05
2.95.3 では通るけど、3.0.1 では通らないコードを
コンパイルしようとしているからです。
343デフォルトの名無しさん:01/09/20 01:07
「Standard Template Libraryプログラミング」επιστημη と
「C++標準ライブラリチュートリアル&リファレンス」の
どっちがおすすめですか?
struct A {
 A();
 virtual void method();
};

struct B : public A {
 B();
 virtual void method() { puts("called"); }
};

上記のようなクラス定義で、
1 A::A() { method(); }
2 B::B() { method(); }

1の呼び出しが無効なのは分かるのですが、
2の呼び出しが正常に行われる保証はあるのでしょうか?
Bのコンストラクタが開始した時点で仮想関数は確実に呼び出せる状態にあるのでしょうか?

BCCでは呼び出せたのですが、処理系依存なのか分からないので・・・
345struct?:01/09/20 01:52
>>344
コンストラクタ内での関数呼び出しは不定なので
初期化用メソッドを別に用意するのが普通です。
コンストラクタでの処理は、メンバの初期化などで留めましょう。
>>345

返答ありがとうございました。
初期化メソッドもvirtualで継承してきているので、
そうなるとまたもうひとつ初期化メソッド用意するということですね。
なんか、カッコ悪い(^^;

>struct?
public:を省略して記事量を抑えるためですが(^^;
クラス設計で質問です。

戻り値がvoidのメソッドを作るのなら、
自分への参照を返す方が賢い気がするのですが、
実際どっちが良いんでしょう?
348:01/09/20 07:22
>>322
Effective STL終わりました。

内容は、More Effective C++より平易だと思います。
しかしSTLの中身を少し覗いたことがないと分からないと思われる記述も多いです。
また所々に標準についてのほほうと思う文が散らばっています。
「vector<bool>は標準化委員会の失敗作だ」
では買いなのかといわれると、More Effective C++より役に立つ機会は多いと思います。

>>344
保証はあると思います。
349-:01/09/20 07:36
350デフォルトの名無しさん:01/09/20 10:04
>>347
>自分への参照を返す方が賢い気がするのですが、
この根拠は?どんな用途を想定しているの?
351デフォルトの名無しさん:01/09/20 10:26
>>345
大嘘付かないよーに

各コンストラクタ中の仮想関数呼び出しは、自分自身の仮想関数
テーブルを用いて行われるので、どのクラスの仮想関数が呼ばれ
るかを特定できる

>>344
>1の呼び出しが無効なのは分かるのですが、

無効というのは、B::methodが呼ばれないという意味?
そういう意味では真だが、A::methodが呼ばれるのは保証される
352デフォルトの名無しさん:01/09/20 12:05
コンストラクタ内では、自分はまだ作りかけで
オブジェクトとしては(コンパイラに)認知されていないから、
仮想関数は部分オブジェクトとして構築済みの
基底クラスのそれが呼ばれるのだ。

仮想じゃない関数を介してコンパイラをだますことは
できるけれど、あくまで自分は作りかけなので
それを承知の上での処理をしないといけない。

んだよね?
353C--=A:01/09/20 14:34
ファイルをios::inでopenしたりした時にそんなファイルが無かったりした場合などのようにI/O関係でのエラーで例外を投げてくれないのは?
一々状態チェックするの嫌なんだけど。。。
354デフォルトの名無しさん:01/09/20 15:57
>>324あたりのテンプレート
いろいろやってみるも実際は意図した結果になかなかならないなー
結局ループしてたりw

あとテンプレートの引数が複数あって、片方だけ専門化できるようにならんのかな
355デフォルトの名無しさん:01/09/20 20:17
>>314

最初っから何でもかんでもクラスにするこた無いかも。

・とりあえず // と const と inline と namespace に萌えてみる
・関連の強い構造体と関数をクラスにまとめてってみる
・ユーザー定義型を作ってみる
・標準ライブラリを覚える
・全部オブジェクトにする(シングルトンとか使って)
・クラスライブラリを作ってみる
・テンプレートライブラリを効率を意識しながら作ってみる

みたいに段階を踏んだ方が、実行時効率を問われる世界から来た場合はやりやすい
んじゃなかろーかと。
例えば、関数オブジェクトを知らないでクラスライブラリ作ろうとしたりすると、
効率と柔軟性のトレードオフな物しか書けない訳で。
356デフォルトの名無しさん:01/09/20 22:39
>>352
> コンストラクタ内では、自分はまだ作りかけで
> オブジェクトとしては(コンパイラに)認知されていないから、
> 仮想関数は部分オブジェクトとして構築済みの
> 基底クラスのそれが呼ばれるのだ。

そんな仕様聞いたことないよ。
A::f()とB::f()が宣言されてる時にBのスコープ内で単にf()としたら、
B::f()が呼ばれるのが自然じゃない?

リファレンスやポインタを介さない関数呼び出しはコンパイル時に静的に決定できる
ので、仮想関数の仕組みは必要ないと思うんだけど。
357356:01/09/20 22:51
で、結局 >>344 の例だと、
void hoge(void){
 B b;
 // 何か
}
とした時、Bの構築時は、まず基底クラスAのデフォルトコンストラクタA::A()が呼ばれ、
その中でA::method()が呼び出され、その後でB::B()が呼ばれ、B::method()が呼ばれる
という順番になると思うんだけど‥。少なくともうちのgccではそうなったよ。
これが保証されないんなら怖くて継承とか仮想関数とか使ってられないよ。
358デフォルトの名無しさん:01/09/20 23:32
>>357
確かに実際にはその順番になるんだけど…。

B b;
ってしたときに、A::A() の中で B::method() ではなく A::method() が
呼ばれてしまう実装ってダサいと思わないか?
しょっちゅう間違えてハマるんだけど、俺。(w
359:01/09/21 00:28
12.7

-3- Member functions, including virtual functions (class.virtual),
can be called during construction or destruction (class.base.init).
When a virtual function is called directly or indirectly from a constructor
(including from the mem-initializer for a data member) or from a destructor,
and the object to which the call applies is the object under construction or destruction,
the function called is the one defined in the constructor or destructor's own class or
in one of its bases, but not a function overriding it in a class derived from the constructor or destructor's class,
or overriding it in one of the other base classes of the most derived object (intro.object).
If the virtual function call uses an explicit class member access (expr.ref) and the object-expression refers to the object
under construction or destruction but its type is neither the constructor or destructor's own class or one of its bases,
the result of the call is undefined. [Example:

352さんはどうやら分かっているが誤解をまねく記述をしている模様。
んで358さんへの答えは352さんがしているという再帰。
360sage:01/09/21 00:30
>>358
もっと勉強してから偉そうなこと書いてくれ
361345:01/09/21 00:34
>>351
あう〜、大嘘はひどいモナー(AA略)、というわけでザッと探してきた
http://www1.kcn.ne.jp/~robe/cpphtml/html02/cpp02017.html
http://www.sun-inet.or.jp/~yaneurao/rsp/rspA1toA8.html
(逆に叩かれたりして(w

うーん、VCだけなのかなぁ。でも…昔のBCCも仮想関数呼び出し前に
派生クラスのコンストラクタ呼んでくれなかったような…。

あとコンストラクタ内で重い処理するとマズイみたいな話無かったっけ?
それにグローバルでやるとなんたらとか……全部記憶が曖昧だ(^-^;

全部ひっくるめて適当に答えたのは謝ります。ごめんね〜 >>344
362345:01/09/21 00:36
>>359
おっと書いてる間に…よく読んどこ
363typename C++::books:01/09/21 01:39
>>354
コンパイラ古くない?

>>337
読んでるよ。仕様書も必要なところは。
仕様書のcode断片例はいいと思う。仕様は曖昧じゃないしさ。
>>361
yaneuraoあげると余計ややこしくなる
365デフォルトの名無しさん:01/09/21 03:11
質問です
クラス A がクラス B へのポインタを持ち、クラス B の機能を
利用するのですが、クラス A の派生クラス AA はクラス B の
機能では満足できないのでクラス B の派生クラス BB を利用します.

クラス A ではクラス B へのポインタを設定する関数
SetProxy( B * pB ) を宣言しているのですが、
クラス AA はクラス BB の機能を利用するため SetProxy のポインタを
クラス BB 以下の派生クラスに限定したいのですが
クラス A の SetProxy インタフェースを維持しつつ、
クラス AA の SetProxy ではクラス BB 以下の派生クラスへのポインタを
限定して受け取るように設計するにはどうしたら良いのでしょうか?
あと、初心者なのでこういう設計になれていないので
良い設計がありましたら、教えてほしいのですが…。

class B {
public: void doHogeHoge();
};

class BB : public B {
public: void doFooBar();
};

class A {
protected: B * PointerB;
public: void SetProxy( B * pB) { PointerB = pB; } };

class AA : public A {
protected: BB * PointerBB;
public: void SetProxy( BB * pBB) { PointerBB = pBB; } };
???
366358:01/09/21 07:44
>>359
いや、だからC++ってその辺ダサくない?って言ってるんだが。
「そういうもんなのです」って答えっスか?
367デフォルトの名無しさん:01/09/21 09:34
>>366
この結果のどこがダサイですか?
Bの部分であるAをconstructする時に、Aに任せるのは当たり前では?
何か勘違いしてませんか?

$ cat virtual.c
#include <iostream>

using namespace std;

struct A {
A() { method(); }
virtual void method() { cout << "A's method() called" << endl; }
};

struct B : public A {
B() { method(); }
virtual void method() { cout << "B's method() called" << endl; }
};

int main(void) {
A a; B b;
return 0;
}
$ g++ test.c
$ ./a.out
A's method() called
A's method() called
B's method() called
$
368358じゃないよ:01/09/21 10:42
>>367
派生クラスによる追加部分が未構築な段階で、
基底クラスの構築子から派生クラスの仮想メソッドを呼べてしまうと、
その仮想メソッドが派生クラスの未構築なメンバをもしもアクセス
すると動作が異常になるので、言語仕様では安全サイドに振って
一律に派生クラス側のメソッドを呼べないようにしているわけだが、
コンパイラとリンカが神のごとく賢ければ、未構築なメンバを
アクセスする仮想メソッドの呼び出しに対してはエラーを、
さもなくば呼び出し可能としても良いわけで、>>358 はそれを
ダサいと言っているのであろう。
逆にプログラマ責任サイドに振って、派生クラスの仮想メソッド
を呼び出しOKにして、未構築なメンバをアクセスするような
仮想メソッドの場合は「未定義の動作」とする手もあったと思う。
C++の場合、この手の選択では「未定義の動作」とする場合が
多いのだが、そうしなかったのは仮想テーブルの設定を行う
実装が難しくなるからかな。
369javaの場合は:01/09/21 11:20
>>368 の続き
ちなみに、Java は基底クラスの構築子の中から、
派生クラスの仮想メソッドが呼べてしまう。

その時点では派生クラスで追加したフィールドは派生クラス
の構築子による設定前なので、デフォルトの0(null)が埋まっている。
C++のように「デフォルトは不定」ではないので、深刻な問題は起きない。
もちろん、0(null)がプログラマが意図した結果であるかどうかは別問題。

------------(インデントはスマン)
class A {
A() { v(); }
public void v() { System.out.println("A#v"); }
}
class B extends A {
String s;
B() { s="hello"; v(); }
public void v() { System.out.println("B#v s="+s); }
}

public class test {
public static void main(String[] argv) {
// A a = new A();
B b = new B();
}
}

$java test
B#v s=null
B#v s=hello
------------

C# ではどうなるのかな。
370351:01/09/21 11:20
>>361
ええ。叩かせて頂きまふ(w

上のURLの方は、説明してる事は*ほぼ*正しいんですが、
>仮想関数はコンストラクタ内では正しく働かない。
という表現が間違ってますな。

下のURLの方は、>>358と同じ勘違いをしてるんでしょう。
何処を勘違いしてるかは、>>352>>367が書いてるから省略。

仕様を調べたわけじゃないから不正確だけど、危ないのは
初期化構文で仮想関数を呼んだ場合。(B() : A(method()) { })

仮想関数テーブルが初期化作業は、初期化構文を抜けて、
コンストラクタの関数部分({})に入る直前に行われるから、
この場合は何が起こるかわからない。(bcc32.exeだと落ちた)
371デフォルトの名無しさん:01/09/21 12:07
>>370 何が起こるかわらない…って違うだろ。>>359 を良く読め
372:01/09/21 12:46
>>367-369
残念ながら恐らく>>366さんはそんなことをダサいと言っているのではないです。

模範解答

C++のコンストラクタは、"コンストラクタ"だからである。
コンストラクタとメモリ管理を密接に結びつけることによって
コンパイラ実装者は、コンストラクタに、オブジェクトを作成するための
多種多様なメモリ管理の意味を与えることができる。

Javaにおいては、
メモリの割り当て及びメンバ変数の初期化を、コンストラクタと切り離すことによって
基底クラスコンストラクタが実行される前に、
派生クラスオブジェクトのメンバ変数が初期化済みであることを保証することができる。
373358=366:01/09/21 13:32
いや残念ながら俺が言いたかったのは、>>368氏が例としてあげた
> 逆にプログラマ責任サイドに振って、派生クラスの仮想メソッド
> を呼び出しOKにして、未構築なメンバをアクセスするような
> 仮想メソッドの場合は「未定義の動作」とする手もあったと思う。

こういう仕様の方が自然だったんじゃないか?ってこと。
仮想関数を呼んだときに実際に呼ばれる関数が
コンストラクタ配下で"だけ"他の場合と異なるってのは
違和感があるっつーか何というか。


> コンパイラ実装者は、コンストラクタに、オブジェクトを作成するための
> 多種多様なメモリ管理の意味を与えることができる。

ゴメン俺あんまり理解できてない模様。今の場合だと

  C++のコンストラクタ ∈ メモリ管理
→ vtableの構築も"コンストラクタ"の仕事
→ 派生クラスコンストラクタより先に基底クラスコンストラクタが呼ばれるので
→ 基底クラスコンストラクタ中ではvtableは整って無くて当然

ってことでしょか?
374358=366:01/09/21 13:36
「整ってなくて」って言い方はマズいかな。
「まだ派生クラスのものになっていなくて」 くらいに修正…。
375デフォルトの名無しさん:01/09/21 13:44
>>365
実装とインターフェースを分離すれば?

struct A
{
  virtual ~A() {}
  virtual void doSomethingWithB() = 0;
};

struct AA : public A
{
  virtual ~AA() {}
  virtual void doSomethingWithBB() = 0;
};

class AImp : public A
{
  B* m_imp;
public:
  AImp() : m_imp(NULL) {}
  void SetProxy(B* imp) { m_imp = imp; }
  void doSomethingWithB() { m_imp->doHogeHoge(); }
};

class AAImp : public AA
{
  BB* m_imp;
public:
   AAImp() : m_imp(NULL) {}
  void SetProxy(BB* imp) { m_imp = imp; }
  void doSomethingWithB() { m_imp->doHogeHoge(); }
  void doSomethingWithBB() { m_imp->FooBar(); }
};
376 :01/09/21 14:46
スタティックライブラリのファイルサイズって
実行速度に影響するんですか?
>>376
質問が大雑把過ぎて、何が言いたいのが良くわかりませんが。

純粋に実行コードのサイズの話なら、ワーキングセットがキャッシュメモリの
サイズを越えるかどうかが問題。実行ファイルが 100KB でも 1MB でも、あ
る時間内に頻繁に実行される部分が L1 キャッシュに収まるなら、実行速度
は変わらない。

あとスタティックライブラリのファイルサイズが大きくても、それが全て実行ファ
イルにリンクされるわけじゃない。必要な部分だけリンクされる。
378 :01/09/21 16:05
>>377
ありがとうございます
数値計算で使うパッケージが全部で14Mくらいなんで
どうなんだろうかと思っていましたが
ちょっと安心しました
379365:01/09/22 05:06
>>375
ありがとうございます。勉強になります。
クラスAAは派生クラスBBを受けるので、引数の異なるSetProxy()を
定義することになっちゃいますよね。ポリモルフィックの見方からすると
それで良いのかなと思いまして。
共通のSetProxy()を宣言して、ダウンキャストできるか調べる方法も
ありますよね。それとどちらが良いのかなとも。
OOP は難しいです…。(^^;)
380デフォルトの名無しさん:01/09/22 05:32
>>379
> 共通のSetProxy()を宣言して、ダウンキャストできるか調べる方法も
> ありますよね。それとどちらが良いのかなとも。
他のクラスがどのように A, AA と関わってくるかによって最適解は違ってきますが、
こちらの方法だとコンパイル時にエラーを検出できないのが悲しいですね。

> OOP は難しいです…。(^^;)
クラス階層の設計に関しては、必ずしも「正しい」解答がないですからね。

ただし、経験から生み出された定石があって「デザインパターン」と呼ばれています。
C++ では言語レベルでな継承・集約をサポートしていますが、これに加えてデザイン
パターンも習得すると、設計の柔軟性が格段に上がります。

参考文献
 オブジェクト指向における再利用のためのデザインパターン 改訂版
 ガンマ,エリック ヘルム,リチャード ジョンソン,ラルフ ブリシディース,ジョン
 ソフトバンクパブリッシング (1999)ISBN:4797311126

デザインパターンの骸骨たち
http://www11.u-page.so-net.ne.jp/tk9/ys_oota/mdp/
381:01/09/22 06:14
>>373
そのような実装も許されるということです。(ARM 10.9c)
未構築の派生クラスオブジェクトに対する仮想関数の呼び出し自体が定義できません。

>こういう仕様の方が自然だったんじゃないか?ってこと。
標準化委員会はそう思わなかったようです。
Javaは、基底クラスコンストラクタの呼び出しの前に、
派生クラスオブジェクトのメンバ変数は初期化されているので
実はこの判断と独立できます。
その説明が、>>372です。
382379=365:01/09/22 06:43
>>380
素早いレスありがとうございます。とても早かったのでちょっとびっくりです。

>こちらの方法だとコンパイル時にエラーを検出できないのが悲しいですね。
そうですよね。見た目なんとなく、すっきりするのですが
コンパイルエラーでチェックできないので…
あまり良くないかもしれないです。
こういうときに使うもの、ではないのかも…。

>これに加えてデザインパターンも習得すると、
>設計の柔軟性が格段に上がります。
デザインパターンはまだ未開拓の土地です。(^^;)
C++をまだ十分理解できていないので難しいかな?と
思いまして。(^^;)
設計する上で先人の勉強は大切ですよね。この機会に
DPのほうも一緒に勉強してみます。
役立つリンクをご教示いただいて、ありがとうございます。(多謝)
383デフォルトの名無しさん:01/09/22 13:44
-********/////////////////////--------------------------------------------------------------------------
あなた達には分からないでしょうが、Rubyは素晴らしい言語です。
オブジェクト指向スクリプト言語として他のスクリプト言語を圧倒する性能と美しい言語仕様を持っています。
例えば、SchemeやSmallTalkなどは比較的美しい言語だと言われていますが、後発である優位さでRubyは
さらなる美しさと実用性を備えています。
もちろんPerlやPythonなど問題外です。
日本語との親和性ではRubyしか選択肢がないでしょう。

LinuxのディストリビューションもRubyの採用例が増えてきています。
1年後には全てのディストリビューションがRubyを標準採用するでしょう。
Rubyは未来のスクリプト言語なのです。

長くなりましたが、コピペではありません。
賛同していただける方はRubyの事を分かっていただけない人に出会ったら、
この発言をコピペしていただければ幸いです。
C++なんて問題外ですが。
384 :01/09/22 14:03
じゃあなんで
Ruby Ruby Ruby Ruby Ruby Ruby Ruby Ruby Ruby Ruby Ruby Ruby
とかやる荒らしが出る?
>383はDelphiスレとかにも似た奴貼り付けてる。
放置。
3861Rubyユーザ:01/09/22 14:14
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
387デフォルトの名無しさん:01/09/22 14:41
俺はどっちも好きだ。どっちもいい言語だよ。
けど、Rubyの話は別スレでやってくれよ。

Rubyは好きだけどRubyバカは勘弁してくらはい。
お前らにRubyを語られたらゆきひろがかわいそうだろ?
388デフォルトの名無しさん:01/09/22 16:52
Rubyはクソです。ゴミ箱逝きです。

いじょ
389デフォルトの名無しさん:01/09/22 18:07
>>383
Linuxは何言語で作られているか分かってるんだろうかわらぃ
390かな:01/09/22 18:16
どなたかマージソートで重複を削除する
プログラムを教えていただきませんでしょうか??
>>390
それ C++ の話なんですか? ともかく、宿題は麻衣ちゃんに教わって下さい。

お兄ちゃんの宿題、私が答えるよ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=982853418
392かな:01/09/22 18:37
C言語です。
ありがとうございます。
さっそく聞いてみます。



Rubyはクソです。ゴミ箱逝きです。

いじょ
この発言をコピペしていただければ幸いです。
394Ruby野郎は、:01/09/22 19:46
Javaスレにも出没していたな。
そんなに素晴らしいのなら、他言語と比較するアカデミックなスレでも立てて、他人を納得させてみなさい。まぁ、叩かれるのがオチだろうがな。
395デフォルトの名無しさん:01/09/22 23:59
>>388
( ´∀`) ナイスお茶。
マジレス希望なんですけど
new演算子で確保したメモリに対してエラーチェックってしたほうがいいんでしょうか?

if( ( int *pNum = new int ) == NULL ) {
/* エラー時の処理 */
}

っていう感じに
new は失敗すると std::bad_alloc という例外を送出するナリ
例外を送出して欲しくなければ new(nothrow) なんてするナリ
new(std::nothrow) かな?
>>397さん早いレスありがとうございます、
例外って意外と便利なんですね。
400デフォルトの名無しさん :01/09/23 06:38
#include <iostream.h>

int main(void)
{
char c;
int i=0;

while(cin.get(c)) {
i++;
}

cout << i << endl;

return(0);
}
これで、入力した文字数をカウントして表示するプログラムを作成したつもりですが、
これでは、文字数が表示されません。どこが間違っているのか教えてください。
>>400
文字の入力が終わるのはいつだ?
402デフォルトの名無しさん:01/09/23 10:31
>>400
C++以前の問題。
わからんかったらプログラム書くな。
403デフォルトの名無しさん:01/09/23 10:34
>>396
set_new_handlerも調べておけ。
>>399
ただし、落とし穴もあるので注意な。

void foo()
{
  int *p1, *p2;

  p1 = new int;
  p2 = new int;
  // do something
  delete p2;
  delete p1;
}

このプログラムで p2 = new int に失敗すると、そこで例外が投げられて関数
を抜けてしまうため p1 = new int で確保したメモリを開放する機会が失われ
る。

C++ の例外に絡んだ落とし穴は色々あるので、実用的なプログラムを書くなら
Effective C++, More Effective C++, Exceptional C++ の三冊は必読。
>Effective C++, More Effective C++, Exceptional C++ の三冊は必読。
おいらはこのうちの一冊も読んでないナリ。
読んだのは、プログラミング言語C++ と ARM だけです。
実用的なプログラムを書くのは無理ですか?(藁
406デフォルトの名無しさん:01/09/23 13:48
>>405
その読んだって2冊の読み方によるけど、
仕事で使ったりするんだったら、
読んでないとロクでもないソフトが完成してしまうと思います。

っていうか、出来れば読みたくない訳?
C++でコード書きたかったらがむしゃらに読んどけ。
>その読んだって2冊の読み方によるけど、
思うんだけど、プログラミングの初心者じゃない人で
その2冊読んでダメならなに読んでもダメなんじゃない?
あと、C++ の解説書ばっかしいくら読んでも
スキルは上がらんよ。
何度もゴメソ

>Effective C++, More Effective C++, Exceptional C++ の三冊は必読。
ちなみにこの3冊が良い本なのは確かだと思いまふ。
読んでないけど。

以上、暇だったのでからんでみました。
410デフォルトの名無しさん:01/09/23 14:11
そうそう。Rubyができないと一人前とは言えないね。
>>410 ワラタ
でも氏ね
>>410
   λ
   ( ヽ  / ̄ ̄ ̄ ̄ ̄
  ( ゚Д゚ )< Rubyはクソです。ゴミ箱逝きです。 いじょ
 (____) \_____
   ヽ(´ー`).ノ
     (  へ)
      く



                      - = ≡三  λ
                  _ = ≡三     ( ヽ  / ̄ ̄ ̄ ̄ ̄
       (´ー`)          = ≡三    ( ゚Д゚ )< この発言をコピペしていただければ幸いです。
      ( ヽ ヽ)         - = ≡三   (____) \_____
      /  >             - = ≡三
413デフォルトの名無しさん:01/09/23 15:04
>>397
VC6は投げないという話があったような。VC持ってないから間違ってたら失礼。

try { delete[] new char[-1]; } catch (const std::bad_alloc& e){ std::cerr << e.what(); }
こんなんで確認出来るだろうか?(one-liner失敬)
保護の弱い環境だとクラッシュするかも。
414デフォルトの名無しさん:01/09/23 15:12
Effective C++, More Effective C++, Exceptional C++
これらの本はC++のどのような本なんですか?
OOPとかですか?
415Ruby!:01/09/23 15:19
OOPならRubyだね。

>C++
>いろいろと有名なオブジェクト指向言語であるC++と
>Rubyを比較すると:

>* C++なぞ問題外.^^;;;

http://www.ruby-lang.org/ja/compar.html

Rubyを知ってもらうためにもこの文をコピペしてください。
416デフォルトの名無しさん:01/09/23 15:20
>>415 いまさらですが、ひとつに偏るのは良くないです。
>>414
「プログラミング言語C++」は、コンパイラ作成者向けに書かれた仕様書を、利用者
向けに咀嚼した書籍だけど、上の三冊は仕様書の狭間にある陥穽や、仕様書には直
接は書いていない言語仕様策定者の意図に踏み込んで解説している。

実践で得られた知見をまとめた Tips 集、というのが近いかな。

Exceptional C++ も似たようなものだけど、こっちは Gru of the Week の記事が元に
なっている。英語が苦手でなければ、Web で公開されている記事をどうぞ(というか
私は GoW しか読んでない)。

Gru of the Week
http://www.gotw.ca/gotw/
                       

――――――――――――――――――――――
番組の途中ですが、臨時ニュースです。
「Rubyはクソです。ゴミ箱逝きです。 いじょ 」
この発言をコピペしていただければ幸いです。
___________   __________
             ‖ \|________   
             ‖ | ON AIR.|
             ‖  ̄ ̄ ̄ ̄
        ./ ̄ ̄θ Λ_Λ
      .../   //(´∀` )/|
     ./      ̄/⊂    ||_/
     | ̄ ̄ ̄ ̄ ̄|  (  ━┳┛
     |_____| /ヽ」┘┻
420デフォルトの名無しさん:01/09/23 18:03
             ‖ | ON AIR.|
             ‖  ̄ ̄ ̄ ̄
        ./ ̄ ̄θ Λ_Λ
      .../   //(´∀` )/|
     ./      ̄/⊂    ||_/
     | ̄ ̄ ̄ ̄ ̄|  (  ━┳┛
     |_____| /ヽ」┘┻
421デフォルトの名無しさん:01/09/23 18:04
             ‖ | ON AIR.|
             ‖  ̄ ̄ ̄ ̄
        ./ ̄ ̄θ   Λ_Λ
      .../   //(´∀` )/|
     ./      ̄/⊂    ||_/
     | ̄ ̄ ̄ ̄ ̄|  (  ━┳┛
     |_____| /ヽ」┘┻
422デフォルトの名無しさん:01/09/23 18:08
             ‖ | ON AIR.|
             ‖  ̄ ̄ ̄ ̄
        ./ ̄ ̄θ  ∧_∧
      .../   //(´∀` )/|
     ./      ̄/⊂    ||_/
     | ̄ ̄ ̄ ̄ ̄|  (  ━┳┛
     |_____| /ヽ」┘┻

AA調整実験中
423デフォルトの名無しさん:01/09/23 18:09
――――――――――――――――――――――
何故か耳がズレる
___________   __________
             ‖ \|________  
             ‖ | ON AIR.|
             ‖  ̄ ̄ ̄ ̄
        ./ ̄ ̄θ ∧_∧
      .../   //(´∀` )/|
     ./      ̄/⊂    ||_/
     | ̄ ̄ ̄ ̄ ̄|  (  ━┳┛
     |_____| /ヽ」┘┻
424デフォルトの名無しさん:01/09/24 00:56
この間から騒いでるRuby厨房は、当然Rubyも理解できてないと思われ。
425デフォルトの名無しさん:01/09/24 02:16
参照はどう使うと
きれいにコーディングできますか?
以前Javaをやっていて、VC++もやってみようと思い
現在C++猛勉強中です
JavaからC++に移行する際に注意する点等もありましたら
教えてもらえるとうれしいです
多重継承と、virtualをつけないとオーバーロードできない点が
なんか違うなーと感じてます
426デフォルトの名無しさん:01/09/24 02:16
オーバーライドですね
427デフォルトの名無しさん:01/09/24 02:51
参照は & と * があるよ
& はいまいち好きじゃない。値渡しと見た目で区別できないから。
でもコピーコンストラクタやテンプレートで必須になるんだよね。
428C++厨:01/09/24 02:56
>>425
左辺値を返すとき、たとえば
代入演算子のオーバーロードをするとき。
virtualがないものはクラス名で修飾された、
単なる関数で第一引数にthisが渡っていると
考えて良いそうな。
デストラクタの実行はスコープがあれば
その終わりに順ずる。
コンテナと例外をうまく使えばごみ集め
の手間はかからない。
429C++厨:01/09/24 11:37
C++(gcc)でシグナルハンドラからlongjmpするとコアダンプ
するんだけど、仕様的にはこれでいいんだっけ?
もうひとつ、allocaってC++で使っていいのかってこと。
例外とデストラクタが絡むから、ヤバイ気がする。
430デフォルトの名無しさん:01/09/24 12:01
>>429
おいおい、シグナルハンドラからどこへ longjmp するんだ?

>例外とデストラクタが絡むから、ヤバイ気がする。

そこまでわかってるならやばくないように
使うこともできるのでわ?
まあ c++ ならあんま必要ないしね。

gcc 限定なら int a[n] (iは非定数)なんてことができて
これは alloca と等価。
×:(iは非定数)
○:(nは非定数)
432 :01/09/24 14:02
Visual C++7.0っていつでますか?
>>432
激しくスレ違い。
434デフォルトの名無しさん:01/09/24 14:48
visualC++で
一般保護法違反がでてPCが固まったんですけどなんででしょうか?
>434 ははは・・・キミの上司ならもしかして理由の想像は判るかもしれないね。
    でもたぶん・・・・・

 PCを固めるのはコールバック系の処理中に変な事するとか
 まあ色々方法はあるけどね
436 :01/09/24 15:12

コールバック系?
リアルジュークボックスを起動しながらやっていたせいかなぁ?
437デフォルトの名無しさん:01/09/24 16:26
>>429
ISO/ANSIでは、C++における(POSIX) signalについて何も保障してない。
環境依存だから、compiler, libraryのmanualを読め。

ただ、longjumpはregister周りをいじって大域脱出を実装するので、
destructorが呼ばれるなんて事は金輪際ないと思うぞ。

signal→例外という機構がまだないんだなー。UNIXには。
Windows(SEH&__try)にはあるのになー。
438 :01/09/24 16:27
関数内ででかい配列を宣言すると飛ぶよ。
gnucも飛ぶ。
439デフォルトの名無しさん:01/09/24 16:39
シグナルハンドラ内で閉じている longjmp は、
たぶん機能するんじゃないかと思います。
ただしスタック巻き戻すときにデストラクタなんかは動かないでしょう。
(なので覚悟の上じゃないとちょとアレ)

シグナルハンドラてのは、プログラム本体とは無関係に
非同期に動くものなので、シグナルハンドラの外へ longjmp するのは
あるスレッドで setjmp した場所へ、別のスレッドから
longjmp しようとするようなものです。

飛ぶでしょ?普通。
>(なので覚悟の上じゃないとちょとアレ)
かわりにC++ではthrow/catchを使うべきだですよね。
>>440
シグナルハンドラから throw するのも、保証されてるかどうか怪しいな。
環境依存だからマニュアル読んでね、としか言えないけど。
ソダネ
そもそも本筋で throw してる最中にシグナルハンドラが
呼ばれて、そんなかで throw しようとしたらえらいことになるかも?
443デフォルトの名無しさん:01/09/24 22:41
>>436
ばーか。
そんなこと逝ってるようなやつが質問すんな。
444デフォルトの名無しさん:01/09/24 22:52
>>443
恐怖恐怖恐怖!!
443引見陰険隠見隠顕淫ビ
443最低
いじめかこわるい
ださ
さいあく〜〜〜〜
ちょーーーーーーー
ぼーーーーーーーーーーーーーーーーーー
ぶーーーーーーーーーーー
ってか厨房
あほ
だぼ
さヴぉ
445デフォルトの名無しさん:01/09/24 22:53
しったかぶり
        ∧ ∧   ∧ ∧
   /⌒~~~⌒\                       (   ,,)   (,,・Д・)
 / ( ゚?д?゚ )y─┛~~                〜(___ノ  〜(___ノ ,γ_
(_ ノγ U  ∩_∩)   THANK YOU 2ch     ┌───────┐   \
  α___J _J         and          (| ●        ● |      ヽ
  / ̄ ̄ ̄ ̄\  GOOD-BYE 2ch WORLD! /.| .┌▽▽▽▽┐ .|____|__||_| ))
 /     ●  ●、                   ( ┤ .|        | .|□━□ )
 |Y  Y       \ またどこかで会おうね  \.  .└△△△△┘ .|  J  |)
 |.|   |       .▼ |                 | \あ\      | ∀ ノ
 | \/        _人|∧∧∩゛冫、 .∧_∧      |    \り.\     . |  - ′
 |       _/)/)/( ゚Д゚)/ `  . (´∀` )..ヽ(´ー`)ノ  \が\ .   |  )
 \    / 〔/\〕 U  / ∩∩ (    ) (___)    \と.\ .|/
  | | | c(*・_・)  |  |ヽ(´ー`)ノ_|  |  | |   |〜 /\.\う\| (-_-)
  (__)_) UUUU /∪∪ (___)(_(__) ◎ ̄ ̄◎─┘ .└──┘.(∩∩)


 ママ〜 2chでスレたてたよ〜
 \__  ______
      ∨    ∧_∧
           " ,  、 ミ   / ̄ ̄ ̄ ̄ ̄
            ゝ∀ く  < いい子ね、後で見てみるわぁ
           ∧_∧  |   \_____
        三  (    とノ
      三   /   つ |
     三  _ ( _  /|  |
        (_ソ(_ソ(_ )
446デフォルトの名無しさん:01/09/24 22:53
テレビにニュース速報が入る。
俺は慌ててパソコンを立ち上げ、そして気付く。
「あぁ、2chは閉鎖したんだっけ……」
テレビからは現場の慌しい状況が伝わってくる。
もし2chがあったら、どういうスレが立っているのだろう。
重複スレが沢山できて、それで荒らしとかやってきて……
テレビでは相変わらず、レポーターが必死で現場の状況を伝えている。
可愛いレポーターだ。俺は、頭の中で「萌え〜」というレスを
つけている自分を想像した。
後ろの群集がテレビに向かって挑発的なポーズを取っている。
「なんだ、あのドキュソ」「厨房氏ね」……
俺はたまらなくなり、無いとは分かっていながら再び2chにアクセスした。
しかし、画面には一言「閉鎖したのです。。。」とだけしか表示されない。
何度リロードしても変わらない。あの日以来、2chは止まったのだ。
どうやら犯人が逮捕されたようだ。相変わらず可愛いレポーターが
その状況を伝えている。
「さよなら、にちゃんねる」
俺はお気に入りから2chを削除し、そして騒がしいニュースを冷めた目で
見るのであった。
         
447デフォルトの名無しさん:01/09/24 22:54
            ⊆ニ(二(ニニ⊇   ⊆ニ(二(ニニ⊇
        ./ ̄ ̄ ̄ ̄ ̄/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ヽ
       / ____/_________________ヽ
      ,/ ̄ ̄ ┏━, / ̄ ̄ ̄|| ||. ̄ ̄ ̄ ̄ |||  ̄ ̄ ̄ ̄ ̄ ̄ ̄...| |
     ,/ ∧ ∧. i┸i //. ∧ ∧ || / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    _.,/. (・Д・ ) | :::|// (゚Д゚ ) < >>443を迎えにきました。措置入院です!!
   |/,,,,,へ⊂ ヽ  .//  ,/  ノ/ ||\______________
  ,/ ̄ ̄ ̄ ̄ ̄ ̄//|_/ ̄ ̄ ̄|  ̄ ̄ ̄ ̄ ̄ | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
  |~ ゜ ̄゜ ̄ ̄ ̄~~| ̄ ̄   =。|┃       |━━━━━...............|
  |______: |,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|,,,,゜,,,,,,,,,,,,,,,,,,,,,,,,,|,,,東京精神病院,,,,,[|
 ._|]0::∴:::0::[二二il:]    ,-―-、 ,,|         |       .     [|
 |====== ;...........|  /,  ̄ヽ |~~|.        |  /,  ̄ヽ |     {|
 ヽニ[_]ヾニニヽ''''''|―-|.(※)|':|''''|.'''''''''''''''''''''''''''''|''''''''|.(※)|:|'''''''''''''''''/
     ゞゝ三ノ ̄ ̄ ̄ ゞゝ_ノ ̄ ̄ゞゝ三ノ ̄ ̄ ̄ ゞゝ_ノ
448デフォルトの名無しさん:01/09/24 22:55
while(){
printf("きしょ");
}
449デフォルトの名無しさん:01/09/24 22:57
━┓                                                  ____
] ┃                                                /    /
  ┃                                               / 2ch  /
] ┃                                             /Λ_Λ  /
  ┃    ゲキトツスルゾヌッ!!                               / (´∀` ) /
] ┃                                          / ∧∧    )/
  ┃                                         /  (゚Д゚ ) ̄ ̄ /
] ┃      _______________________/    U U ̄ ̄/ _
  ┃    /         ・・・・・|_|・・・・・ Λ_Λ ∩∩  /)_/) i⌒――⌒i       ̄ | __
] ┃   />   <  2ch Airlines (・∀・ ) (・x・)ノ (,’ー’) (´(Å__)` ) / ̄ ̄ ̄ ̄ ̄/
  ┃  /         _          _  (     ) ノ|x| _( U__U) /ヽ / /_ノ ヽ  ̄ ̄ ̄ / ̄
] ┃ | ▼      |_|・・・・・・・・・・|_|・・・・・・ ・・ |_|・・・・_・・・・|_|・・・/_/ |_|((.l_ll)))  /
  ┃ |_人_  (-_-)ヽ(´ー`)ノ/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄/ ̄ ̄ ̄ ̄ ̄ / (lロ-ロl) /
] ┃  \   (∩∩)(___)\==  / ̄ ̄ ̄ /|| ̄| ̄|\/ ̄ ̄   ヽ ∀ノ/
  ┃    ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄| ̄|\/ ̄||  |  |  |  ̄ ̄ ̄ ̄ ̄ ̄ ̄
] ┃                     ||  |  | |   ||  |_|/
  ┃                     ||  |_|/    ̄ ̄
] ┃                       
450デフォルトの名無しさん:01/09/24 22:57
参照を使った戻り値について質問なんですが
int &f(){return value;}
という関数があるとして、
f()=5;
という使い方できる事以外では
int f(){return value;}
と同じでしょうか?
451デフォルトの名無しさん:01/09/24 22:57
   ||
 ∧||Λ
( / ⌒ヽ
 | |>ALL|
 ∪ / ノ
  | ||
  ∪∪
452デフォルトの名無しさん:01/09/24 22:58
          正直、スマンカッタ!!
     \\  正直、スマンカッタ!! //
 +   + \\ 正直、スマンカッタ!!/+
     .   ___ .  ___  . ___   +
        /. ――┤  /. ――┤ . /. ――┤+
      ./(.  = ,= | ./(.  = ,= | ./(.  = ,= |
 +  .  |||\┏┓∩|||\ ┏┓∩|||\┏┓/  +
   ((  (つ   ノ  (つ   丿 (つ   つ ))
       ヽ  ( ノ   ( ヽ ノ   )  )  )
       (_)し    し(_)   (__)__)
453?r?????l????????:01/09/24 23:05
参照を使った戻り値について質問なんですが
int &f(){return value;}
という関数があるとして、
f()=5;
という使い方できる事以外では
int f(){return value;}
と同じでしょうか?
454kago:01/09/25 00:04
(先ほどの人、コメントありがとうございます。それではここで。)
最近linuxでC++を始めたんですが、関数一覧表、みたいなものはネット上にどこかないんですか? GNUのGCCを使っていますが。GNUのぺーじには、一覧表、みたいなものは見つけられませんでした。
perlとかphpとかだと、日本語のページでけっこう簡単に見つかって参考にしているんですが、C++はどうにも見つかりません・・・。
みなさんはある機能を使いたいと思った時、どのようにして調べるのでしょうか? 参考までに教えて下さい。
455>454:01/09/25 00:10
システムコールは載ってないけどね
http://www.microsoft.com/japan/developer/library/vclang/vclanghm.htm
>>453
いいえ違います、同じではありません
言語機能やSTLについて調べたいときは、
VC++やBCBのオンラインマニュアルを参照してます。
OSやライブラリの機能については、
それらのマニュアルを調べます。
あとはサンプルプログラムをgrepするとか。
>>453
戻り値に参照を返すのは鬼門。
EffectiveC++第2版の31項を参照。
459デフォルトの名無しさん:01/09/25 19:03
>>404

void foo()
{
  auto_ptr<int> p1(new int);
  auto_ptr<int> p2(new int);

  // do something
}

こうすれば例外が出てもリークしません。
p2の確保に失敗したときですら、p1だけがうまくデストラクトされます。
auto_ptrを使え、ということではなく、自動変数(スコープ)をうまく使えということです。
vectorやlistを使ってもいいし、何かのクラスのメンバになっていてもいい。
要はdeleteが無ければいい。deleteをまき散らしているやつはまだ厨房。
>>459
404 は、それを知ってて敢えて *ダメなサンプル* として、あのコードを出ただ
けだと思うが。More Effective C++ の項目9が、そのものスバリだし。

> deleteをまき散らしているやつはまだ厨房。
同意
461厨房:01/09/25 19:49
正直、すまんかった。

void foo()
{
  int* p1 = NULL;
  int* p2 = NULL;

  try {
    p1 = new int;
    p2 = new int;

    // do domething
  }
  catch (...) {
   delete p2;
   delete p1;
   throw;
  }
}
462厨房:01/09/25 19:53
それじゃ、うまくいった場合にメモリリークだ。(笑)
463厨房:01/09/25 19:56
以上、はまるパターンのサンプルでした。(てへっ)
464デフォルトの名無しさん:01/09/25 20:41
>>450
まあ大体はそれでいいと思うが、アセンブラだと

; int& f();
mov eax,offset value
ret

; int f();
mov eax,[value]
ret

という感じだと思われるから、その後のアクセスなど考えると前者が軽いかもしれん。
要は、戻り値がintでなくint&だから、一般的実装ではポインタ的に動きそうだと。
でもインライン化されるなら話は全く変わる。

どっちにしても、個人的にint& f();みたいな関数を書きたい局面は滅多に無いと思う。
でもMyClass& f();みたいにクラスを返すなら話は全く変わるし、頻繁に使ってる。

つーか組込型への参照を返す場面ってほとんど無いんじゃ。
クラスメンバアクセサとかなら、半端な隠蔽せんで読みと書きに個別の関数作るしな。

>>458
いや、どう見ても自動変数じゃないから鬼門ではなかろ。
int& f() { int value; return value; }
なら即自滅だが。
465デフォルトの名無しさん:01/09/26 10:45
>>464
自動変数じゃなかったとしても、EffectiveC++29項、30項に引っかかる。
C++とオブジェクト指向を両方とも深く知った人が理由あって使うならともかく、
普通は使用禁止と考えたほうがいい。
466デフォルトの名無しさん:01/09/26 14:01
VBで作ったDLLをVCで呼び出す必要が出てきたのですが、VB側で

Public Function Show(XXXX as Collection)

となっている場合、VC側での引数はどうすればよろしいのでしょうか?

LPDISPATCH aaa;
XXXDLL->Show( &aaa ) ;

だと、ビルドは通っても、実行時に
「ハンドルされていない例外はXXX.EXEにあります。0x0000005:Access Violation」
となってしまうのですが・・・。
BSTRのときのSysAllocStringみたいに、何かしてあげないといけないのでしょうか?
467デフォルトの名無しさん:01/09/26 15:25
C++でコンストラクタ中のエラーを例外投げずに通知するには一般にどうやってるの?
とりあえずコンストラクトは成功させて後でGetLastError()メソッドでエラーチェックさせるとか?
>>467
「一般には」例外を投げる。

どうしても例外を投げたくなければ、オブジェクトのコンストラクトと初期化用の
メソッドを分離して、後者の戻り値で判断させるのが手だと思うが。グローバル
なデータ領域を使って成/否を記録しておくのは、ネストできなくなるから、や
めたほうがいい。

CFoo foo;
if (!foo.Init(...)) {
  // 初期化失敗
}
469デフォルトの名無しさん:01/09/26 16:39
これって合法?
class Foo{
public:
 static void foo(char *message)
 {
  puts(message);
 }
};

void (*bar)(char *message);

int main(int argc, char* argv[])
{
 Foo::foo("xxx");
 bar = Foo::foo;

 bar("yyy");
 return 0;
}

実行結果
xxx
yyy
470これじゃ駄目かね?:01/09/26 18:39
#include <string>
#include <stdio>
#include <stdlib>
using namespace std;
class IBar
{
 public:
  virtual void Write(const string &message) = 0;
};

class Foo : public IBar {
public:
 virtual void Write(const string &message)
 {
  puts(message.c_str());
 }
};

int main(int argc, char* argv[])
{
 Foo foo;
 foo.Write("xxx");

 IBar *bar = &foo;
 bar->Write("yyy");
 return EXIT_SUCCESS;
}
471デフォルトの名無しさん:01/09/26 20:53
typedefって使う意味あるんですか?
>>471
typedefの役割と意味を調べれば自明。
473デフォルトの名無しさん:01/09/26 20:59
実際にそういう使い方して役に立った?
>>471
とりあえず林晴比古本でも見るよろし
475デフォルトの名無しさん:01/09/26 21:27
インスタンスが無いと、メンバ関数って呼べない・・・
476469:01/09/27 00:19
>470
駄目なんです。
コールバックを登録するCのライブラリの
ラッパーを作っていてその部分を隠蔽したいのです。

まあstaticメソッドを普通の関数としてクラスの外に
追い出してしまえばいいのですが、もし合法なら
staticでやりたいなということです。
477ポコニャン:01/09/27 03:12
>>476

そーゆーことなら469のまんまでも問題ないっしょ。

つまり469でのbarが実際にCで叩かれるアドレスなのねぇ。
関数ポインタとstaticメソッドの代入互換ってどこで説明されてる?
479470:01/09/27 09:59
うむ、C言語のライブラリの都合なら仕方があるまい。

>>478
いろいろなところで言われていると思うが……。
こういうケースでstaticメソッドを使うのは常套手段でしょう。
ポインタを1つ渡せる場合は、thisを渡すとかいうのも。

class Foo{
private:
 static void foo(void *p) {
  Foo *t = reinterpret_cast<Foo *>(p);
  t->Write();
 }
 int hdl;
public:
 virtual void Write() { puts(msg); }
 Foo() {
  hdl = set_callback(foo, this);
 }
 ~Foo() {
  remove_callback(hdl);
 }
};
480デフォルトの名無しさん:01/09/27 10:44
static void* hInstance

class Foo
{
public:
Foo(){
hInstance = this;
}
static void foo(char* message){
typedef void (Foo::*CallbackProc)(char*);
Foo* pObj = (Foo*)hInstance;
CallbackProc pProc = &Foo::Write;

(pObj->*pProc)(message);
}
protected:
virtual void Write(char* message){
puts(message);
}
};
481 :01/09/27 22:36
参照型を返す関数ってどんな使い方があるのですか?
やはり
func(0) = 1;  //funcの戻り値は参照型
といった感じですか?

x = func(0);
という使い方なら別に参照型を返さなくてもいいのですよね?
でも
int& a = func(0);
とすればちょっとは意味あるのかな?

とまぁいろいろ悩んでいるのですが・・・。
482>481:01/09/27 22:56
class A {
  ・・・
  string m_Name;
  const string& getName() {
   return m_Name;
  }
}

みたいにconst参照を返すのはよく使う、俺は。
というか、返値として使う場面はそれ以外にないな。
483 :01/09/27 23:11
>>482
それって呼び出し側はどういった使い方になるんですか?
ただのconst string型を返すのではダメなんすか?
>>483
それだと、インスタンスのコピーが発生するからコストがかさむ。
return this の時はたいてい参照で返すYO!
486 :01/09/27 23:49
で・・・、そのconst string&型を返す関数をどうやって使うのですか?
関数呼び出しを左辺にするのですか?
それとも戻り値を何かに代入するのですか?
結局参照を返すのはコスト削減のためだけなのですか?
>>486
従来の C 言語の経験があるなら、ポインタを返すタイミングで参照を返す(こともある)
で分かると思うが。理由は、主に次の二つ。

- 右辺値としてアクセスしたい場合に、オブジェクトをコピーするコストを削減する
- コピーではなく、実体にアクセスしたい場合に使う

もし分からないなら、少し実際のプログラム読んだほうが良いと思われ。
488デフォルトの名無しさん:01/09/28 00:57
>>481
参照を返す関数といえば、これ

ostream& operator<<(ostream& os, 〜);
489デフォルトの名無しさん:01/09/28 01:19
仮想関数+テンプレート
の関数の実行効率が異常に悪いのですが、心当たりあります?
490デフォルトの名無しさん:01/09/28 01:27
>>489
それ自体がそれほどパフォーマンスを落とすことはないと思われ。別な原因でわ?
>>489
とりあえず、お約束ということで。
プロファイルはとりましたか?
492デフォルトの名無しさん:01/09/28 01:54
>>491 いやとっていません。みても何がなんだかさっぱりで。
>>483
コピーに伴うコストが高くつく
>>492
それだと、ほんとにボトルネックが「仮想関数 + テンプレート」にあるのかどうか
分からん気がするが。
495おでん屋:01/09/28 05:12
すみません。以下のようなプログラムで継承元のクラスBの仮想関数を
オーバーライドするにはどうしたら良いでしょうか?
昨日から考えているのですがコンパイルエラーの連続で...
よければどうかお助け下さい

class A { public: virtual void method(void); }
class B : public A { ... };
class C : public A, public B {
 virtual void Cmethod(void);
 // ここで B の仮想関数 method をオーバーライドして
 // Cmethod()を使いたいのですが、書き方が分からないです。
};

void C::B::method(void) { Cmethod(); } // これはダメみたいです
なにしたいんだかわかんないけど

void C::Cmethod() {
// 必要ならなんか
B::method();
// さらに必要ならなんか
}

たぶんもっと基本的なことちゃんと勉強した方が良いと思われ。
>>495
クラス階層が明らかに変だけど。クラス C で B だけでなく A も直接継承している
のは何故?

あと「クラスBの仮想関数をオーバーライド」という意味が良く分からんのだけど、
もしかして

C* p;
static_cast<A*>(p)->method();
static_cast<B*>(p)->method();

それぞれで、別の処理を行うことを想定してます?
498おでん屋:01/09/28 06:00
>>496,497氏
レスありがとうございます。

ほんと構造が変です。こんな変な構造になったのは...
基底クラスのデストラクタでファイルの後始末処理をしているのですが
基底のデストラクタでは派生クラスの仮想関数はすでに使えないので
(ファイルの操作はこれに頼っているので、困ってしまいます)
派生クラスで書かないといけないですよね?
でも、この派生クラスをさらに派生すると...?

延々と続く問題になってしまいまして、それを解決しようとしたのが
クラスAで、派生クラスの後始末側にAの仮想関数を呼び出すようにして
Aの仮想関数で後始末をできるようにしました。

CのAはCを面倒みて、BのAはBを面倒みるような形にすると
こんな問題がでてしまいました。
さらに、呼び出すにもCのAなのか、BのAなのか明確にしないと
いけないです。さらにまずいです。

まったくもって勉強不足を痛感しております。
このような問題はどう解決したらいいのでしょうか...。
>>498
> 基底クラスのデストラクタでファイルの後始末処理をしているのですが
> 基底のデストラクタでは派生クラスの仮想関数はすでに使えないので
> (ファイルの操作はこれに頼っているので、困ってしまいます)
この段階で設計が間違ってるなぁ。

これだけだと何とも言えんから、各クラスの処理の概要とファイルの後始末
に関して、少し詳しく書いたほうがいいと思う。
500おでん屋:01/09/28 06:43
お世話になっております。説明が少し下手ですが宜しくお願いします。(ぺこり)

概要はこんな感じです。
重要でない細かい部分は端折らせていただきますね。

class AbstructFile {
public: Open() = 0, Close() = 0, Read() = 0, Write() = 0; // 純粋仮想メソッドです
public: ~AbstructFile() { Close(); }
 // 閉じ忘れ防止にデストラクタでファイルを閉じる処理はしておきたいです
}

AbstructFile は多種に派生してその一種に AbstructFile2 があります。
これもデストラクタで閉じたいのですが基底のデストラクタの Close(); は
邪魔になります。それをどうにか解決しても、AbstructFile2 から派生した
AbstructFile3 でさらに AbstructFile2 のデストラクタ処理が邪魔になりました。

正しい設計にするにはどうしたら良いのでしょうか...。
501おでん屋:01/09/28 06:46
>>500
~AbstructFile() で純粋仮想なはずの Close() を呼んでおりますが
そこは何やら仕掛けで派生の Close() が呼ばれるようになっています。
本質はそこではないので省略いたします...
502おでん屋:01/09/28 06:49
蛇足です。(^^;
一見、最も派生した AbstructFile のデストラクタでやればと思うのですが
さらに派生したとき、問題に...ということなので...
503デフォルトの名無しさん:01/09/28 06:57
>>498
> class A
> class B : public A
> class C : public A, public B

こういう継承は出来ないんでは?

(1) 基底クラスのデストラクタでファイルの後始末処理をする
(2) 基底クラスのデストラクタから派生クラスの関数を呼びたい

ってことだろう。しかし (2) ってことは、実際にファイルの後始末を処理するのは、基本クラスでなくて派生クラスなのか?それなら単に派生クラスのデストラクタで後始末処理をすれば良いと思うが。どうでせう。
504デフォルトの名無しさん:01/09/28 07:00
>>502
さらに派生したときに新しい処理が加わるなら、派生デストラクタで新しい処理だけやれば良いのでは?
505デフォルトの名無しさん:01/09/28 07:09
>>500
私ならインターフェースの継承と実装の継承を分離するかなぁ。

struct FileBase
{
  virtual Open() = 0;
  virtual Close() = 0;
  virtual Read() = 0;
  virtual Write() = 0;
  virtual ~FileBase() {}
};

struct FileA : public FileBase
{
  virtual Seek() = 0;
};

struct FileB : public FileBase
{
  virutal Undo() = 0;
};

たとえば、こんな感じでまずインターフェースの階層を作っておく。実装はコンストラクタと
仮想デストラクタ以外は一切無しね。次に、これを継承して実装を作る。

struct FileAImp : public FileA
{
  Open();
  Close();
  ...
  ~FileAImp() { Close(); }
};

struct FileBImp : public FileB
{
  Open();
  Close();
  ..
  ~FileBImp() { Close(); }
};

実装を継承したい場合には、どこかで Close() を書くわけだよね。もし末端のクラスではなく、
途中のクラスで Close() を書いたのなら

- Close() をその先のクラスでオーバーライドしないことに「決め」て、途中のクラスのデストラ
 クタで Close() する
- 途中に挟んだクラスのデストラクタでは Close() せずに必ず末端のクラスでのみ Close() する
 (ついでに途中に挟んだクラスのデストラクタを protected にして、直接はコンストラクトできない
 ように細工)

どちらか好きなほうを選択。どちらにしても、ドキュメントを書いておく。
506デフォルトの名無しさん:01/09/28 07:14
>500
> 閉じ忘れ防止にデストラクタでファイルを閉じる処理はしておきたいです

これを基本クラスでなく派生クラスのデストラクタでやれば済むんでは?
507おでん屋:01/09/28 09:17
皆さんありがとうございます。500です。

>>503,504,506氏
はい。それで解決です。(^^;
でも、これで解決しても、派生をさらに派生すると Close() はまた、
その派生先に入れる必要がありますよね・・・
こうなると延々といれる作業を繰り返すわけで・・・
このあたりスマートに処理したいのですが・・・。

>>505
ありがとうございます。
Javaでいうfinallyを決めてしまうのでしょうか。(間違っていたらすみません)
最終の派生クラスを定義できればいいのですが
できればさらに派生させたい場合もあるかもしれないので...

仮想関数のようなデストラクタもどきがあればいいのですが・・・
508デフォルトの名無しさん:01/09/28 09:24
各クラスごとでクローズの仕方が違うんですか?
つまり、AbstructFileの閉じ方とAbstructFile2の閉じ方は違うんですか?
もし違うなら継承にする意味がないような?

あとどうでもいいけど、正しいつづりはabstr「a」ctな。
>>507
> できればさらに派生させたい場合もあるかもしれないので...
汎用的なクラスライブラリを作っているのなら別ですが、そうでなければクラス階層は
設計段階ですべて見えてると思います。そうでなければ、まだ設計の煮詰め方が甘い。

それと上のほうでも書きましたが、インターフェースの階層だけ決めておいて、実装継
承はとりあえず忘れる(コードを共有しようとしない)方が良いと思います。実装継承は
強力な手法ですが、強力さゆえに使い方を誤ると簡単に泥沼に入りますから。
510おでん屋:01/09/28 14:51
皆さんのご意見と設計を熟読いたしました。
やはり私の設計が全面的に間違っていますね。設計才能の無さを痛感しております。
勉強してもう少しまともな設計ができるようにしたいと思います。
皆さまありがとうございました。

>>508,509氏
>あとどうでもいいけど、正しいつづりはabstr「a」ctな。

>設計段階ですべて見えてると思います。そうでなければ、まだ設計の煮詰め方が甘い。

その通りです。(^^;

>それと上のほうでも書きましたが、インターフェースの階層だけ決めておいて、実装継
>承はとりあえず忘れる(コードを共有しようとしない)方が良いと思います。実装継承は
>強力な手法ですが、強力さゆえに使い方を誤ると簡単に泥沼に入りますから。

はい。はまってしまいました。
仰る事を心がけてがんばってみます。
511デフォルトの名無しさん:01/09/28 17:09
512デフォルトの名無しさん:01/09/28 21:15
ヌルポインターって作れないんでしょうか?
513デフォルトの名無しさん:01/09/28 21:19
すみません、この板来るの初めてで、違うスレに書いてしまいました

C++の問題です、なにぶん初心者でして
参考になる本などあれば教えて頂きたいです・・・。

1.二つの数をインプットしそれをx,yの読み込んで
和差積商を計算するプログラム

2.1つの数をインプットし読み込んで
その数の二乗、三乗を計算するプログラム
>>513
宿題はこっちで聞け。

お兄ちゃんの宿題、私が答えるよ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=982853418
515デフォルトの名無しさん:01/09/28 21:58
>>512
ヌルポインターを「作る」とは何??
516デフォルトの名無しさん:01/09/28 22:16
void* p=(void*)NULL;
終了。
517出馬鹿ー:01/09/28 22:21
classへのポインタってありますか?
518デフォルトの名無しさん:01/09/28 22:22
class A{};
A* a;
終了。
519デフォルトの名無しさん:01/09/28 22:23
>>518 それはオブジェクトへのポインタ
クラスへのポインタではありません
>>517
こういう感じのコードを書きたいのかな?

class A;
class_ptr X = A;
X* p = new X();
// 擬似コードなんで、コンパイル通りません。悪しからず。

C++ ではクラス自体を指す変数は定義できません。ただし template クラス/メソッドの
引数としてクラス名を渡すことは可能です。
521出馬鹿ー:01/09/28 22:49
>>520そういうことっす。ネタでした。
522出馬鹿ー:01/09/28 22:57
ネタとはいえ先ほどは非常に簡潔でいいレスをいただきありがとうございました。
御礼にもう1題
templateメソッドって可能ですか?(template関数ではない)
>>522
無理。

コンストラクタを書けない。
継承ができない。
明示的な呼び出しができない。

その前にインスタンスを作れない。
524出馬鹿ー:01/09/28 23:09
>>523 ありがとうございました。疑問は晴れました成仏します。
逝ってきまーす
525デフォルトの名無しさん:01/09/28 23:24
>>517

これが「クラスを指すポインタ」に一番近いかな
type_info* p = typeof(class A);
526デフォルトの名無しさん:01/09/28 23:25
>>522
テンプレートメンバ関数って意味なら、可能です。

class A{
  template<typename T> void f(T);
};
527デフォルトの名無しさん:01/09/28 23:27
>>525
間違えた。鬱だ・・・

const type_info* p = typeid(class A);
528デフォルトの名無しさん:01/09/28 23:28
>>527

さらに間違い。逝ってきま・・。

const type_info& p = typeid(class A);
529出馬鹿ー:01/09/28 23:28
>>525 うを〜そんな手が〜あったか〜。早速やってみよ〜。
でっきるかなでっきるかな〜さてさてほほ〜。
530出馬鹿ー:01/09/28 23:45
>>526 >>528 できました〜。ありがとうございました〜迷わず成仏できます。
531デフォルトの名無しさん:01/09/29 00:47
>>void* p=(void*)NULL;
この場合NULLは
stdio.hのマクロ定義かなんかじゃないんですか?
void* p=(void*)0;
とか
int* p=(int*)0;
これでいいのでしょうか?
532デフォルトの名無しさん:01/09/29 00:49
テンプレートってヘッダファイルに書くの?
どこに書いたらいいのかよくわからん。
>>530
C++ の type_info は、そこからメソッド一覧を取得したりインスタンスを作ったり
できないので、あまり実用性は無いですけどね。
534デフォルトの名無しさん:01/09/29 00:58
>>531
単に
void* p = 0;
とか
int* p = 0;
で善し
535デフォルトの名無しさん:01/09/29 00:59
>>532
使う場所から見えるところ。一般的にヘッダに書く。
536デフォルトの名無しさん:01/09/29 01:11
>>533
同意。何のためにあるのかさっぱりですな。
誰か有効な利用法プリーズ
537デフォルトの名無しさん:01/09/29 01:25
>>536
ダウンキャストする時に使ってたんじゃない?
その昔は。
>>533
C++はObjectを作る方法として、ポインタにnew使う奴と、変数埋めこみで直接作る奴とが有るが、
C++が痛いのは、その両方に対して使える機構しか、提示しない、ということだな。

メタクラスの方向性を否定してるんで、「つみかさねる」ようなプログラミングを
ちまちま手作業で書かないとならないんで、辛い。
>>538
すまん。日本語が難しすぎてよく分からんので、もうすこし C++ プログラマに
わかりそうな言葉でしゃべってもらえると、ありがたい。
540デフォルトの名無しさん:01/09/29 02:35
>>535
ヘッダにソース書くのやだなー。
って思う人はどうしてるの?
>>540
ヘッダに宣言だけ書いて *.cpp ファイルに実装書くこともできますよ。
でもヘッダに書くのが主流。
542デフォルトの名無しさん:01/09/29 02:51
>>541
そうなんだ。ありがとうございます。
思い切ってヘッダに書いてみます。

昔はよく、「ヘッダにコードを書くな」って怒られたものです。
(それはインクルードするだけで実体化するからですけど〜。)
543デフォルトの名無しさん:01/09/29 02:53
>>540
昔、ミカカ子会社提供のミドルウェアの一部であるテンプレート
ライブラリ(ヘッダに実装かいてあった)に間抜けなバグがある
のを発見した事がある。

ソース完全公開状態だからな。恥さらしだと思った。
(問題は、そこがバグっているとそもそもそのライブラリが
役立たずなものになるという致命的なものだったのだが、誰が
どう試験していたんだろうか…)
>>542
ヘッダに書いても、使わない template クラス/関数に対してはコードが生成
されませんから、気にしなくて大丈夫です。
545デフォルトの名無しさん:01/09/29 03:44
>>536
typeidバトラー

#include <iostream>
#include <typeinfo>
#include <stdlib.h>
struct Player {
 int getPower() { srand((int)&typeid(*this)); return rand(); };
 const char *getName() { return typeid(*this).name(); };
 virtual char* say() = 0;
 static Player& battle(Player& a, Player& b) {
  int ap = a.getPower();
  int bp = b.getPower();
  cout << a.getName() << " power : " << ap << endl;
  cout << b.getName() << " power : " << bp << endl;
  Player& winner = (ap > bp) ? a : b;
  cout << "..." << winner.getName() << " win." << endl;
  cout << "『" << winner.say() << " 』" << endl;
  return a;
 };
};
struct Monar : Player {
 char* say() { return "モナー"; };
};
struct Giko : Player {
 char* say() { return "ゴルァ"; };
};
int main() {
 Monar m;
 Giko g;
 Player::battle(m, g);
}
546545:01/09/29 03:46
>>545
どうさ保証なし。実行例。

>gcc -v
Reading specs from /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/specs
gcc version 2.95.3-5 (cygwin special)
>a.exe
5Monar power : 621329674
4Giko power : 707264478
...4Giko win.
『ゴルァ 』
>>545
やべーワラタ。
548デフォルトの名無しさん:01/09/29 10:55
すいません、C++の、ポインタとかクラスとかSTL」とかはぜんぶやったんですが、enumだけ覚えずにここまできてしまいました。
enumってなんでしょう。
549デフォルトの名無しさん:01/09/29 11:19
>>548
const や #define に代わる、定数宣言の最適な手段です(整数に限る)

例:
enum N_{
 N = 32
};
enum(enumerate: イニューメレイト)ってのは、文字どおり「列挙型」です。
大抵の言語に備わっています。

たとえば
#define ONE 1
#define TWO 2
#define THREE 3
#define NINE 9
#define TEN 10

enum 《ここで列挙型の名前を定義できる》{
ONE,
TWO,
THREE,
NINE = 9,
TEN
};
と書けます。

違いは、ONE/TWO/…などが #define だとプリプロセッサで展開される(コンパイラには見えない)のに対して、
enum だとそれらを識別子としてコンパイラが認識する…ってことかな。

これはコンパイラが型チェックできることを意味しています。
型チェックの結果は C と C++ で違います。
たとえば、どちらの場合も変数の型は int 類になるけど、
#define だとそこに定義されていない値を入れても、
コンパイラは「あれっ?」とも思いません。

でも enum だとコンパイラがそれを型として認識できるので、
これが C++ だと、明示的に型キャストしない限り、
コンパイラが「あれっ?」と思ってくれます。
>>550
enum は 0 からじゃ…。
552デフォルトの名無しさん:01/09/29 12:56
enum型変数ってどうやって書くの?
553うろ覚え:01/09/29 12:59
基本
enum {...} x;

一般的
typedef enum {...} type;
type x;
554 :01/09/29 13:24
>>551
値入れても良いんだよ。
555デフォルトの名無しさん:01/09/29 13:29
>>554
いや、>>551は、それじゃあONEが0になってるってつっこんでるんだよ。
556550:01/09/29 13:49
>>551
あっ、…。(鬱氏)
>>552
C なら
enum type {...};
enum type x;

C++ ならそれ以外に
enum type {...};
type x;
とも書ける。

(今度こそ!)
557553:01/09/29 14:11
>>556
そういや、構造体と同じで普通に名前付けられるのだったね…。
boolが仕様に入るまではこうしてた
typedef enum{
false=0;
true=1;
} bool;
セミコロンじゃなくてカンマだっけ
560デフォルトの名無しさん:01/09/29 16:27
汎用性のある参照カウンタ付きのクラスを継承して使いたいのですが、
自作したほうがいいですか?
それとも既にライブラリが存在し、それ使った方がいいですか?
561デフォルトの名無しさん:01/09/29 18:28
C++で動的配列を作りたいのですが、new [ ] で作成した配列
のサイズをあとで変更するにはどうすればいいですか?

int *a = new int[100]; /* とりあえず100確保 */

...途中でサイズを50にしたい

delete a[ ];
STLのVector使え。
        
>>561
realloc
>>563
newしたやつにreallocするのは止めろ。
ビットコピーされたらどうするつもりだ?
>>563 バカ?
素直にmalloc使えよ
>>561
#include <vector>

void foo(void)
{
 vector<int> a(100);
 a.resize(50);
 //delete不要
}
568561:01/09/29 20:49
eMbedded Visual C++ なので、STL 使えないのです…
realloc 使うことにします。
>>561
小さくするだけなら、そのままにしとけ。
570sage:01/09/29 22:15
VCスレに行った方がいいかもね。
STLportとか、つかえねーのかな。
571デフォルトの名無しさん:01/09/29 22:57
おはようございますよろしくお願いします。

えーっと、APIでまずは自分用のテキストエディタを
作成しようと思っているところです。

今はメモ帳がエディタ代わりです。
検索をいちいちダイアログで出すのは面倒なので、
まずデフォルトで検索窓の付いたものを作ります。

当初CreateWindowまたはExで(検索入力用の)エディットボックスを作り、
貼り付けて・・・と構想していました。すると、多分カーソルの
位置とか反転、カーソルの移動・・とかいちいち構造体を調べて・・
と、なにかと面倒そうだ、と思っていましたところ、FindTextと
ReplaceTextっていうのを発見しました。多分構造体が設定されていて
その面倒くささをやってくれるんですよね?っていうか、題意がそれてるんです
けど、
FindTextたちを使わず敢えて自前で組むのと、利用するのでは、
計算効率は違うのでしょうか、僅かでも。

貧乏性な上に、メモリ不足でカリカリいうといつもびくびくしてしまう
性分なので、メモリを食わない路線で処理の最適化を徹底したいと思っとります。
おしえてクダサイ。
572デフォルトの名無しさん:01/09/29 23:01
ねえ、new使うときって
int *a=new int;
より
auto_ptr<int> a;
a=new int;
のほうがいいの?
>>571
2行目まで読んだ。
フリーのテキストエディタを探してきて使え。
そしてプログラム書くの止めるか、本買って勉強しなおせ。
574デフォルトの名無しさん:01/09/29 23:09
>>572
別にいいってことはない。
auto_ptrを使った変数などを関数に渡すときに
どういう動作するか考えるとうかつに使うのは
止めた方がいい。

auto_ptrの使い方としては、例外処理が起こって
途中でリターンしなくてはいけなかったりするときに、
開放の処理をやるのが困難な場合など。
あと、一般的にはコレクション系かしら。
575デフォルトの名無しさん:01/09/29 23:10
ダメ雄に言われたくない>>573
576デフォルトの名無しさん:01/09/29 23:10
自分で書くんだったら、良く書けば効率は良くなるし、
クソに書けばクソになる。
既存APIは中がどうなってるのか知らんから一概に比較はできんが、
いいアルゴリズムで書けるなら書いてもいいんじゃないの?
577デフォルトの名無しさん:01/09/29 23:11
>>576>>571へのレスね。
>>571
ここはC++のスレだぞ。APIについては他所でやれよ。
ついでにいっとけばエディタを作るのにWindowsのEditBox使うのは止めろ。
>>574
コンポジションを使う場合にも、メンバ変数も auto_ptr で持つかな。
直接

struct Foo
{
  X x;
};

と書いてしまうと、このヘッダをコンパイルするためだけにクラス X のヘッダを
include する必要が出てきてしまうので。
580デフォルトの名無しさん:01/09/29 23:14
コモンダイアログを使うと、
どのみちHWND型だから使うメモリはCreateWindowと
変わらないだろうけど、代入演算が余計に起こって
処理が最適ではなくなってしまうことを心配している者です。
581デフォルトの名無しさん:01/09/29 23:14
>578
なじぇ?
582デフォルトの名無しさん:01/09/29 23:15
>>579
includeしたくないだけにauto_ptr使うか?
そんなこと言ったら
struct Hoge {
auto_ptr<string*> m_str;
}
か?
>>581
EditBoxを使った時点でメモ帳以上の物ができないことが保証されるから。
584デフォルトの名無しさん:01/09/29 23:23
>>579
Fooの定義の前に
class X;
と書いとくだけで大丈夫だと思うが?
585デフォルトの名無しさん:01/09/29 23:35
>>584
いや、それじゃだめでしょ。
586デフォルトの名無しさん:01/09/29 23:37
全然知りません
587デフォルトの名無しさん:01/09/29 23:45
>583
では何を使えば?
588デフォルトの名無しさん:01/09/29 23:51
Win98のメモ帳はなぜ大きいファイルを開けないのですか?
エディタソフトハウスから賄賂もらってるから?
589デフォルトの名無しさん:01/09/29 23:54
>588
char[固定]だからです
>>588
MSDN読め。
591デフォルトの名無しさん:01/09/29 23:58
>>588
仕様です
592デフォルトの名無しさん:01/09/29 23:59
>>589
それが真実ならマイクロソフトさんって思ったより知能低いですね
速答ありがとうございます
>>587
自分で作るか他のエディトコンポーネントを探すか
>>582
ヘッダファイルの相互依存関係は、ちょっとソフトウェアの規模が大きくなると
辛いです。一つのヘッダを修正するだけで、ほとんどすべてのソースを再コン
パイルすることになりかねません。

標準ライブラリのヘッダは原則として修正しませんから、さすがにメンバ変数
とはいえ参照やポインタにはしません。

>>584
いや class X の「サイズ」が決まらないと class X をメンバとして持つクラスの
「サイズ」も決まらないので、ダメです。
595デフォルトの名無しさん:01/09/30 00:01
>593
自分で作るって、どういうことですか?CreateWindowの引数でどうにかできるのですか?
596デフォルトの名無しさん:01/09/30 00:04
>595
悪い事いわんから開発やめとけ。
>>595
ネタとマジレスの区別も付かない、自分で一切調べないような奴には
一生かかっても無理だ。
598デフォルトの名無しさん:01/09/30 00:34
>>592
っていうか、「メモ帳」だぞ。
そんなおっきいファイル開く方が間違ってるYO。
エディタじゃねーよ。メモって意味考えろ。
599 :01/09/30 00:49
CEditView(ファイルサイズ64Kまで)かCRichEditViewつかいませう。
CRichEditViewで挫折したらまた質問下さい。
リッチエディットをエディタに使うバカはいません。
601デフォルトの名無しさん:01/09/30 02:06
>>600
はあ? じゃあ何使うっつうの?
602 :01/09/30 02:08
64K以下ならCEditView,64K以上ならCRichEditView。
これ常識。
603デフォルトの名無しさん:01/09/30 02:19
普通のEDIT→メモ帳
リッチエディット→ワードパッド

になるぞ?
604デフォルトの名無しさん:01/09/30 02:22
っていうか本気で作るんだったら、
MFCのクラスなんか使わないでしょ。普通。

でも、元ねたが「メモ帳のかわり」とか言ってるから、
りっちえでぃっとでいいんじゃないかい?
605デフォルトの名無しさん:01/09/30 02:22
良く判らんが、単独で使いたいんじゃなくて、プログラムに
組みこむ形で使いたいんなら>>602で合ってる。
606デフォルトの名無しさん:01/09/30 02:36
>>605
俺もそう思う。胴衣
607デフォルトの名無しさん:01/09/30 02:38
>っていうか本気で作るんだったら
>MFCのクラスなんか使わないでしょ。普通。

さすがにそれは普通じゃないと思われ。
>>604
MFC使わないやつは
1 完全にオリジナルのUIを構築するやつ(移植性とかなんとか
2 アンチMFC
3 MFCが分からないやつ

で、比率で言えば、1:10:89こんなものかな
>>608
604は「エディタのビューとして」の話だと思う所存。
エディタのビューとしてCEditやCRitchEditを使う奴はDQNだと思うナリよ
MFC相談室になっているゆえ、Qt使えとか言ってみる。

.>>609 MVCの話なら歓迎〜。
メーラーとかの編集窓でRicheditは多いと思うが
Win2000ならメモ帳のサイズ制限はないよ。
613デフォルトの名無しさん:01/09/30 08:17
>>611
俺の知る限りはAL-Mailぐらいだな。
>>611
メーラーなんかプレーンテキストで十分だ。
よってCEditで十分だと思うが、どうか?

>>608
禿同。
615デフォルトの名無しさん:01/09/30 09:30
RichEditなんて遅くて重いの使ってられるかよ。
つーかエディタを作るってのはエディトコントロールを自分で作るって事じゃないの?
そこがエディタの命なんだからさ。
秀丸がリッチエディット使ってたら誰も買わないだろ。
617デフォルトの名無しさん:01/09/30 10:55
すいません、vector< vector<int> > a;で、
stringのc_str()みたいに配列全体を得たいのですが、どのメソッドを使えばよいのでしょう。
vector<>::begin
619デフォルトの名無しさん:01/09/30 11:57
>618
ありがとうございました。
620デフォルトの名無しさん:01/09/30 13:08
>>616
エディタだけ組みこんだソフトなんか誰が作るかよ 阿呆。
621デフォルトの名無しさん:01/09/30 13:16
>>612
こいつも阿呆だな。
622デフォルトの名無しさん:01/09/30 13:30
>>621 氏ね。
>>612 は正しい。
>>620
いや、エディタの話をしてたんじゃないのか?
624デフォルトの名無しさん:01/09/30 14:16
>>622 ソフトウエア版行けや。
ライブラリではCEditViewのサイズはshortで定義されてるから駄目。
WIN2000のメモ帖とか言ってるのはPC厨房。
625デフォルトの名無しさん:01/09/30 14:19
>>624
帖って間違ってるYO
626デフォルトの名無しさん:01/09/30 23:57
VC++で
int a[100];
b=99;
cout<<a[b++];
ってやると、エラーになります?
627デフォルトの名無しさん:01/10/01 00:03
>>626
試したら?
いいね
629デフォルトの名無しさん:01/10/01 00:14
何でエラーになるんだ??
630626:01/10/01 00:27
勘違いでした
631デフォルトの名無しさん:01/10/01 01:06
/*
if(typeid(*temp)==typeid(A)){
((A*)temp)->methodA();
}else if(typeid(*temp)==typeid(B)){
((B*)temp)->methodB();
}
*/
pa = dynamic_cast<A *> (temp);
if(pa){
pa ->methodA();}
else{

pb= dynamic_cast<B *> (temp);
if(pb){
pb->methodB();
}else{
}
}
632デフォルトの名無しさん:01/10/01 01:07
すいませんが
RTTIがよくわかりません
これで実行しても、実行中にエラーになってしまいます
633デフォルトの名無しさん:01/10/01 01:29
VC++ってRTTI使えなみたいです
サンプルプログラムも実行時エラーがでます
>>624

MFCはそうだろうが、NT系のエディットコントロールにサイズ制限がないのは常識だろ?
635デフォルトの名無しさん:01/10/01 02:02
>632
>633
プロジェクト-->設定-->C/C++Tab-->カテゴリ:C++言語-->RTTIを有効にする
をチェック済みかい?

もしかしたらPro 以上じゃないと駄目かも。
636デフォルトの名無しさん:01/10/01 02:11
>>635
できましたー(涙)
ありがとうございます
とりあえず、私はProを使ってますから
standardの方ではちょっとわかりませんが・・・
はまりますねコレは
ホントに助かりました
637デフォルトの名無しさん:01/10/01 06:53
>>624
勝手にMFCと決めつけるなよ。
638デフォルトの名無しさん:01/10/01 06:58
dynamic cast も RTTI 必要ですか? >VC
639デフォルトの名無しさん:01/10/01 07:07
>>638
いぇす
640デフォルトの名無しさん:01/10/01 07:22
>>639
ありがとうございます
# gcc はデフォルトでオンだったような
641デフォルトの名無しさん:01/10/01 13:48
aString == bString (in Java)

は Deep comparison ですか?
それとも Shallow Comparison ですか?

分かる人教えて・・・
642641:01/10/01 13:50
あ、C++のスレだった。間違えました、鬱だ。
でも、分かる人いたら教えてください。悩んでるんです。
>>641-642 悩んでる時間があるなら、
ちょろっとコード書いて自分で試せば?
644641:01/10/01 20:27
>>643
どうやって試すの?
たった2時間しか考えないで他人に聞くなよ。
頭は帽子を置く台じゃないんだから。
頭はかつらをかぶせる台じゃないんだから。
647デフォルトの名無しさん:01/10/02 00:48
つーか、ポインタもわからないのに
Deep comparisonみたいな単語だけは知ってる
Javaはホントはすごいんだけど、馬鹿が使うから馬鹿にされるんだって
648デフォルトの名無しさん:01/10/02 00:49
C言語よりエレガントにバイナリーエディターを作れますか?
>>648
C言語でエレガントに作れるものなんかあるのかよ。
エレガントだと思いこんでいる連中はいるようだが…。
650641:01/10/02 10:19
>>647
相談スレだから、書いてみたんだけど・・・やっぱ
ダメだった??

= がShallowって言うのは分かるんだけど、
== がDeepなのかShallowなのか分からない・・
651641:01/10/02 10:26
JAVAスレがありました。ごめんなさい。
652デフォルトの名無しさん:01/10/02 21:21
C++のポインタを使った表記が醜いので
# foo->bar.bazとか
可能な限り参照を使ってみたいのですが
# foo.bar.bazみたいに
何か問題ありますか?
使えば?
>>652
とりあえずリンクトリストでスタック作ってみそ
>>652
問題ないよ。
ただ . 演算子が4つくらい並んでいたら、
こいつ大丈夫か?と疑いはじめるだろう。
>>652
参照にしたところで、醜いもんは醜いんだよ。
設計がおかしいんじゃねぇの?
>>654
stack<CFoo> s;
s.push(CFoo(1));
s.push(CFoo(2));
s.top().bar.baz;
659デフォルトの名無しさん:01/10/03 14:50
>>657
参照はポインタより制限がきつい。
無制限に使えるポインタでなければ組めないとき、
なぜその制限内に収まらないのか検討する余地がある。
参照すらいらないのにポインタを使う奴もいる。
制限の緩い機能を使うときは、強力であるが故に慎重さが欲しい。

とりあえずポインタより参照を優先するという方法は
それなりに有効だよ。
660654:01/10/04 00:16
>>658
STLのstackはデフォルトではリスト使ってないだろうと思い、
ソース読もうとして挫折。
オペレーターオーバーロードされると訳わからん

Javaに還ろ〜っと。

>>659
最初は参照で組む => 後にポインターに変更 => ->を.に置換しまくる。
つーことが良くあります。
661デフォルトの名無しさん:01/10/04 00:26
>>660
それはスキルが低すぎるからだもー。
662デフォルトの名無しさん:01/10/04 00:30
->を無条件に"."に置き換えても
構文的に曖昧になるケースなんてないんだから
全部"."にしちゃえば良かったのに。
まあドキュソ言語だからしゃあねえか>C/C++
>>662
何でそうなってるのか考えてみろよ
664デフォルトの名無しさん:01/10/04 01:09
>>662
いや、"->"と"."は明らかに違うだろ。
ポインタと実体(もしくは参照)が同じように
見えるんだったらかなり重症だぞ。
665デフォルトの名無しさん:01/10/04 01:46
たしかにそもそも用途が違いますよね。

参照/ポインタの使い途を定位置を参照することに限った場合、
>>662 のような意見をもつ人がいるようにも思われ。

そうじゃないだろ? とまぁ、いいたいのですが。
スタック上にあるオブジェクトをdeleteしても大丈夫な
様にする事ってできますか?
(スタックならデストラクタだけ呼び出して、開放はしない)
ヒープに置いてあるやつと区別しないで扱いたいんで。
CObject a;
スタック上の(未初期化の)メモリに対して placement new を使う。

でも、どっちかというと使い方が間違ってると思う。
>>662
その話題、別のスレッドでも出てたな。

C だと . と -> はまとめられるけど、ハードウェアに近い階層のプログラムを組む
場合には、ポインタとスタック上の変数を文法上も区別しておいた方がいいと思う。
演算子をまとめて、バグを入れやすくなったら本末転倒だし(ただでさえバグを作
やすい言語なんだから)。

あと C++ に関しては operator->() がないとスマートポインタ実装できないから嫌
です。
コンパイラ標準のSTLじゃなくて、SGI STLとかSTLport
とか使ってる人いる?マルチプラットフォームなコードで
統一しようかと思ってるんだけど。

SGI STLってなんかコンテナの種類とか増えてるね。
hash_mapとか。
670sage:01/10/05 07:25
STLportばりばり使ってるよ
671デフォルトの名無しさん:01/10/05 11:58
>>668
> ポインタとスタック上の変数を

という用語はどうかと思うが、

> 文法上も区別しておいた方がいいと思う。

は同意。char **argvとchar *argv[]を混乱する厨房を見るにつけ
あ、[]のdouble meaningのことね。
STLPort使ってるよ。
バイナリがでかくなるのを除けばVC付属のよりいいんで。

ただ、コンパイラ付属のと切り替えたいときもあるんだけど、
何を#defineすれば良いのかわかんないけど。
だれかしらない?
>>673

同一プロジェクト内だと無理だろ。

別プロジェクトで、ということなら、単にインクルードディレクトリの優先度を変えればできるっしょ。
675669:01/10/05 17:24
STLport使ってる人、実際どう?
コンパイルが面倒とか特殊な書き方しないとだめとか
環境によって駄目とかある?

うちはWin, Mac, Linux全部やってるから出来れば
統一したいんだよね。
676673:01/10/05 17:46
>>674
ああ、同一プロジェクトでは統一しますが、
コードがでかいと困るときに標準を使いたいんですよ。
ただ、環境変数で一度に設定してるから優先度いじるの面倒なんで。

>>675
コンパイルが面倒も何も、VC/BCCではmake一発でとおります。
BCCは知らないけど、VCのものよりはパフォーマンスが良いです
VC使う上での注意は、必ずマルチスレッドライブラリをリンクする
必要があるということだけかな。
677デフォルトの名無しさん:01/10/06 01:34
ねぇねぇ、
基底クラスのデストラクタを書いてなくて、
基底クラスでdeleteすると派生クラスの
デストラクタが呼ばれないって知ってた?
678669:01/10/06 01:37
>>676
そっか、特に何にもしなくてもmakeでビルドできるのか。それはナイス。

VCでマルチスレッドライブラリリンクしてシングルCPUなマシンで
動かすと若干遅くない?必ずスレッドセーフなライブラリを使わないと
だめだとするとちょっと問題になりそうな気がするが。

Mac、Linuxで使ってる人が居たら状況キボン。
>>677
当たり前だろ。仮想デストラクタにならないんだから
>>679
当たり前だが、初心者がはまりやすい落とし穴ではあるな。

>>677
C++ はいろいろ過去を引きずっている影響で、いたるところに落とし穴がある仕
様になってる。痛い思いをしたくなければ Effective C++, More Effective C++
という書籍を買ってきて読んでおきましょう。
681sage:01/10/06 10:15
>>678
実際に自分の書いてるコードで置き換えてみて
評価すればよいよ。
>>678
実際に計って速度に問題があればつかわんでいーだろ。

アプリケーション系で応答速度が要求されるような場合、
マルチスレッド化は当たり前のような気がする。

どうしても多重化出来ない場面でかつ、
スループットしか見ないのであれば、微妙な速度差にも
こだわってもいいけどね。

MTスレじゃないからsage
>>681
>>682
ごもっとも。なのでsage
684思いつき:01/10/07 01:51
foo->bar->baz = 0

using foo->bar
baz = 0
と書けると嬉しくない?
>>684
全然嬉しくない。
入れ子にできないジャン!
>>685
別に常に使わなくてもいいわけだし。
C++Builderでは便利かもね。
>>684
with( foo->bar ){
baz = 0;
}
の方が他の言語で慣れてるので嬉しいかも。
688デフォルトの名無しさん:01/10/07 20:22
typeof_foo_bar &bar = foo->bar;
bar->baz=0;

このくらいで我慢し説け
689デフォルトの名無しさん:01/10/07 21:02
>>684
typeof_baz& baz=foo->bar->baz;
baz=0;
できるよ?なんか文句ある?
それだとbaz以外のメンバがいじれなくていやな感じ
691689:01/10/07 21:14
>>690
↓で我慢しとけ。この程度の小石につまづいているようではX
>>688
メンバ関数用意すれば?
せっかくC++なんだしさ。
メンバ変数にアクセスするインターフェイスをつくるとき、
名前ってどう付けてる?

class Mona {
public:
int giko;

だとして、

・void SetGiko(int);とint GetGiko(void);
・int& Giko(void);

なんかが考えられるけど。
void Giko(int value);
int Giko(void);
後者は
const int& Giko() const;
だろ。Monaがconstになった途端アクセスできなくなるぞ。
それにその方法だと、結局もう一個
int& Giko();
を用意することになる。
>>694
>>695
うん、要するに聞きたいのはSet〜とGet〜っていう命名は良くないのかな
って事なのだ。個人的には悪くないと思うんだけど、オブジェクトとして
考えた時はちょっとおかしいかなと感じるんで。周りには良くないって言う
人も居る。

constに関してはその通りだね。スマソ。
697694:01/10/08 20:12
C#なんかの最近の言語ではset/getメソッドを
隠蔽するプロパティという表現が文法に組み込まれていて
とても有用なのでおかしくは無いよ。

ただ、C++では確かに一般的ではないので
コーディング規約としてきっちり確立することが
出来ないのであればやめといたほうがいいかもよ。

規約
名詞=プロパティ Count()
動詞=メソッド Clear()
>>697
うん?ちょっと確認なんだけど、漏れが言いたいのは

Get/Setという命名は悪くないがオブジェクトとして見ると
オブジェクトのメソッドとしてGet/Setのような名前がついて
いるのは違和感がある

って事ね。せっかくカプセル化してるのにそのオブジェクトが
どんなメンバ変数を持っているのか外が知らないといけない
のは変だと思うわけ。

で、>>697が「おかしくは無いよ」と言っているのはどっちの表現
方法に対してのこと?それと、最後の規約の部分の文章は

・そのクラスのプロパティに関しては名詞の名前を付ける
 例:Count()
・メソッドに関しては動詞の名前を付ける
 例:Clear()

という読み方であってる?
699697:01/10/08 20:56
>せっかくカプセル化してるのにそのオブジェクトが
>どんなメンバ変数を持っているのか外が知らないといけない
>のは変だと思うわけ。
それは命名の良し悪しとは別の問題だよ。
メソッド経由で公開するという意味ではGetGiko()もGiko()も変わらない。

理想は全部privateにして自前で処理することだけど、
そうするとクラスが肥大化したり、メソッドの引数がやたらと
多くなってくる。
# 試しにfriend/get/set一切使わないコードを書いてみるべし
なので変数(=アクセスメソッド)を公開することでコードが
簡潔(というと語弊があるが)になるならそれを避けるべきではないと思う。

おかしくないというのはCount() という表現の事。
他言語からの借用なので積極的に推すつもりは無いけど。

規約の方はその通り。
int **p;

p = new int [x][y];

って間違ってます?

検索しても、出てきませんでした・・・

まじ質問です。
701700:01/10/08 21:02
sageてしまった・・・
age
>>700
C++の質問じゃねーだろ。くだらねー質問スレへ逝け。
それにそのコード間違ってる。
703700:01/10/08 21:08
>>702
newの使い方なのでC++だと思ったんですが・・・
逝ってきます・・・
704デフォルトの名無しさん:01/10/08 21:11
>>699
ふむ。結局、Get/Setという文字列がどうこうじゃなくて、
意味的におかしくないならGetやSetが付いた命名もあり
って事なのかな。

全部自前処理が絶対に良いとは言えないのは分かるよ。
設計が悪いと言われそうだけど、friend使わないとどうしても
見通しが悪くなることはあるよね。

規約のほうは参考にしてみる。これはこれで統一されてると
思うから、うまく命名すれば使えると思う。
>>703
newの使い方の問題なのか?それ以前にポインタを復習すれ。
>>705
ってことは、

int **p;

*p = new int* [x];

for( i = 0; i < x; i++ )
    p[i] = new int [y];

ってことですか?

まとめて確保してくれると思ってました・・・
707700:01/10/08 21:22
>>706

まちがいっす・・・

>*p = new int* [x];
p = new int* [x];
多次元配列を扱うコンテナをもってきて
array2<int> *p = new array2<int>(x,y);

みたいにしとけば?

stlで近いことが出来た気もする。
709デフォルトの名無しさん:01/10/08 21:25
710STLマンセー:01/10/08 21:27
typedef std::vector< std::vector< int > > Aryary;
Aryary p;
p.resize(x);
for( Aryary::iterator it=p.begin(); it!=p.end(); ++it)
 it->resize(y);
711700:01/10/08 21:29
>>708
>>710

おお・・なるほど・・・
参考にさせていただきます

ご教授ありがとうございますm(_ _)m
>>709スマソ。操作ミス。

>>706
それでもいいが、newをループさせるよりはこの方がいいだろ。

int **p;

p = new int* [y];
int *x = p[0] = new int* [y*x];
for(int i=1; i<y; i++)
 p[i] = &x[i*x];

これだと配列のもち方が[y][x]になるところに注意。
っていうかこれこそC++に関係ないからsage
つーか本当に任意にサイズの二次元配列確保しなきゃならないのか?
x,yは両方とも変数で無いと駄目?
714712:01/10/08 21:35
STLをつかう方法もいいが、速度が要求されるか、
配列が大きいなら>>712の方法にしとけ。
>>712を自分用コンテナにして使い回すのがよさげ
716デフォルトの名無しさん:01/10/09 18:23
単なるコレクションを返したいのですが、
どのような形で返すのが良いでしょうか?
717デフォルトの名無しさん:01/10/09 19:09
互いに関連(相手へのポインタ)をもつオブジェクトで
なおかつそのオブジェクト同士の関連の仕方が全くの任意である場合、
その関連の仕方をデータに保存するにはどのような方法があるのでしょうか?

私が思いついたのは、全てのオブジェクトを適当に順序づけて一元に保存し、
その後、その順番を元に関連の有るオブジェクト同士の番号を別途保存する
方法なのですが、所詮素人考え、どうにも二度手間で、泥臭く感じてしまうんです。

よくありそうな処理の割に良い方法が、思いつきません。
なにかスマートな方法があったら教えて下さいませ。
718デフォルトの名無しさん:01/10/09 19:34
外部シンボル’〜’が未解決っていうエラーがでたらどう解決したらいいんですか?
>>717
説明読んだだけでは何がしたいのか良くわからんけど、
一度「デザインパターン」で検索して勉強してみることを強くお勧めする。
多分解決する。
720717:01/10/09 20:49
>>719
トホホホホ、GoF本持ってる漏れは逝ってよしということですか?
  ___       ___         ___
  | YES | ΛΛ.   | YES | ΛΛ    |GoFi | ΛΛ
 〃 ̄ ̄∩ ゚Д゚) 〃 ̄ ̄∩ ゚Д゚)  〃 ̄ ̄∩ ゚Д゚) GoForIt!
     ヾ.   )     ヾ.   )        ヾ.   )

オブジェクトと書きましたが、実際はクラスと言うより、ほとんど構造体なので、
データの持たせ方がまずいっぽいです。むーん良いの思いつかねぇ。ムキョー
>>720
サンプル書いてみ?
722sage:01/10/09 22:32
>>716
イテレータ
723sage:01/10/09 22:48
>>717
かっこわるいけど

class Serializer {
static size_t seed = 0;
size_t serial;
public:
Serializer() { serial=seed++; } // 場合によってはmutexで保護ね
size_t Serial() const { return serial; }
void ResetSerial(size_t n); { seed = n; }
};

をそいつらのメンバに加えときなさい。
724716:01/10/10 00:45
>>722
どもです。やはり
const vector<type>&
とか
const type*
を返すのはダサいでしょうか?
>>724
いやべつにいいんでない?
726デフォルトの名無しさん:01/10/10 00:56
ダサイよ
Delphi使いな
>726
よくわかっているじゃない。
つまり、>>727は、
「ダサいよ、Delphi使い。な?」
と読んだってわけか。
「ダサイよ」Delphiのルビかと思った。

Del厨って全角英数好きなのか?
STLのmapやsetは、マルチスレッド環境下でも排他制御なしに使えますか?
(map/setの内部にロック機構を持っていますかという意味です)
よろしくお願いします。
>>730
STLportはスレッドセーフになってるらしいけど、
VC++とかGCCの純正(?)STLはどうなんだろうね?
>>730
実装によります。
733デフォルトの名無しさん:01/10/10 14:22
>>714
STL使っても速度は変わらないと思ふ
734デフォルトの名無しさん:01/10/10 14:33
>>733
ふつうに使う分にはかわらないね。

でも、マイクロセカンド単位で処理速度を追求する人もいるので
>>734
μ単位ならアセンブラ使えよ
ミリ単位ならまだ分かるが
736717:01/10/10 17:27
>>723
なるほど、各オブジェクトにユニークな識別子をつける、と
ありがとうございます。こいつで色々試してみます。
>>721
というわけですいませんです。

レスありがとうございました。
画像処理ルーチンなんですが、template<class T>とした時、
Tの最大ビット定数を得る方法ってありますか?

例: Class<unsigned char> → 0xFF
   Class<unsigned long> → 0xFFFF

ビットシフトに使いたいんですけど。。。
template <class T>
T foo() { return T(-1); }
>>737
これの動作、コンパイラ依存だったかな?

template<class T>
T MaxVal()
{
T t=0;
t--; //これで0xFFFFになる?(unsigned shortでWIN32の場合)
return t;
}
740739:01/10/12 18:07
う…
>>739
>>740
有難うございます。質問の書き込み間違えてしまいました。
最大ビット定数だと
0xFFじゃなくて0xFFFFで,
0xFFFFじゃなくて0xFFFFFFFFですね。

しかし,欲しいのは
unsigned charの時0xFFで,
unsigned longの時0xFFFFなのです。
半分だけ切り出すことって出来ますか?
742デフォルトの名無しさん:01/10/12 18:52
>>741 なんか言ってること変じゃない?

こういうこと?

template <class T>
T foo() { return T(-1) >> (sizeof(T)*8/2); }

ただし 1 byte は 8 bits と仮定。
743デフォルトの名無しさん:01/10/12 19:14
>>742
申し訳ありません。また質問を間違えてしまいました。
逝って良しですね。。。

しかし、望んでいたのはまさに>>742のお答えの通りです。
有難うございました。
private: staticフィールド初期化するのって
friendな初期化のためだけのクラス作って
staticなインスタンス一個置いとくのが定跡?
>>744
は?.cppでconst付きで初期化するのが普通だろ?

なんでsageてんのか知らないけどsageてるからsage。
746sage:01/10/13 08:39
スレ違いならごめんなさい。

C++に洗脳されたプログラマとしては
JavaのStringクラスは許せないです。

なんでStringだけ+と+=演算子が特殊な言語実装になってるの?
その頃のJava設計者の心の中は、VBに犯されていたので。>746
748デフォルトの名無しさん:01/10/13 15:55
c++ってほとんど知らないので、添削してください。
計算機イプシロンを求めるプログラムです。

#include <stdio.h>

template<class type>
type eps( type dummy )
{
 type eps, eps1;

 eps = 1.0;
 eps1 = 1.1;

 while( eps1 > 1.0 )
 {
  eps = eps * 0.5;
  eps1 = eps + 1.0;
 }

 return eps;
}

int main(void)
{
 float f;
 double d;

 printf( "machine float epsilon %.30f\n", eps(f) );
 printf( "machine double epsilon %.30f\n", eps(d) );

 return 0;
}

http://www.kuzuoka-lab.esys.tsukuba.ac.jp/simulation/kadai98.html
http://lanmaster.sh.inf.shizuoka.ac.jp/~lecture/csprog99/exam2/epsilon/sld002.htm
749744>745:01/10/13 16:03
>は?.cppでconst付きで初期化するのが普通だろ?
書き忘れましたが
staticフィールドをAPIなどを使って初期化する場合です。
750745:01/10/13 16:40
>>749
あーなるほど
staticフィールドを初期化するinit関数を作りたいわけね。
うーん、これだとやっぱりfriendつくるしかないんじゃないの?
>>749
コンストラクタで(あるいは最初に使う時)
未初期化だったら初期化するようなことをするよ、おれ。
最近の仕様だと、static objectのコンストラクタ呼出しを使えばいいのではないかな。
ANSIだとmainの前に呼ばれるけど、VC++だとWinMainの前かな。
VC++で実装されているかどうか知らないけど。

g++は駄目。よって>>751してる。
753デフォルトの名無しさん:01/10/14 14:07
gdbでstd::stringの内容を確認するイイ方法ない?
754デフォルトの名無しさん:01/10/14 14:52
string()って関数があるってこと?
それとも
文字列データのこと?
755sage:01/10/14 14:54
void print_string(std::string &s)

を作っておいて、gdbから呼べばいいんでないの??
関数呼び出すとgdb落ちてしまうこと多くないですか?
>>753
DDD使え
758753:01/10/14 20:08
え!DDDだとstringサポートあるんですか。
でも emacs から使いたいなあ。
>>758
そういう訳じゃないが、リンクが簡単に辿れるのだ
http://www.gnu.org/software/ddd/all.jpg
ここのウインドウの上側をみると分かるかな?
760デフォルトの名無しさん:01/10/15 01:12
>>753はどうして>>754には無言なの? 何をやりたいか書かないと、

(gdb) print 変数名

で的を得た答なのかどうか分からない…
761デフォルトの名無しさん:01/10/15 01:18
>>758
GVDでもstring objectの中、見やすい。
emacsからは使えんがね。デバグにemacs使いたい心境がわか
らんなぁ。素のgdbよりは格段にマシなのはわかるけど。
>>760
754はC++知らない...とまでは言わないが的外れ。無視されても
しょうがないとおもうけど?
>>760
的は得るものではなくて、射るものですね。

ってのはともかく print 変数名だと std::string オブジェクトの内部構造もろもろが
表示されて邪魔、単純に文字列だけ取得したいって話じゃないの?
764デフォルトの名無しさん:01/10/15 01:38
HDDフォーマットしてWindows入れてVisualC++でデバッグ
766デフォルトの名無しさん:01/10/15 01:50
>>763
じゃぁ p obj.c_str() か p obj.data() か p obj.dat
他実装によりけり。

GVDはemacs support (gvd.el) あるみたいだねスマソ。
どうサポートしてくれんのかはしらんけど…。
767デフォルトの名無しさん:01/10/15 03:29
>>766
> じゃぁ p obj.c_str() か p obj.data() か p obj.dat
> 他実装によりけり。

ptype objでclassの定義見れる。
なぜ代入系演算子は継承されない言語仕様なのでしょうか。
分かる気もするけれど、整然とは理解できません。

どなたかご教授ください。
継承されてもあまり嬉しくないから。
スライシングになっちゃうでしょ。
771753:01/10/15 10:15
>>760
ごめん。std::stringっていたら文字列です。
>>771
> ごめん。std::stringっていたら文字列です。

俺は>>754じゃないから謝る必要ないけど、>>760でいいのかどうか、また書いてない…
>>763の想像にもお答えしてない。何もんなんだ、あんた。
773デフォルトの名無しさん:01/10/15 18:30
趣味プログラマです。ちょっと質問させてください。
GoF本の真似して、今までメンバ変数の頭を _dwMemberなどのように
_をつけて記述していました。しかし仕事でC++使ている友人に、それは
止めた方が良いと忠告されました。もちろん理由は教えてくれません(w

やはり何かまずいのでしょうか?
>>教えてくれません(w
あたりがネタっぽいが・・・

C/C++ではアンダースコア(_)で始まる名前は予約語とされている。
だから使わないほうがいい
775753:01/10/15 18:52
gdbでstringを表示させた事がある人なら何が問題か説明しなくてもわかると
思ったんだけどそうではなかったみたいですね。
余計な詮索させてしまって申し訳ない。
問題は色々あるけどstringの内部表現がNUL終端文字列ではないのが
一番大きいです。print コマンドの結果から読み取るのは困難です。
c_str()を呼ぶのはいい方法ですね。気が付きませんでした。
でも状態を変えてしまうので常に使える方法とはいえません。
GVDはよさそうですね。試してみます。皆さんありがとう。
776773:01/10/15 19:05
>>774
やぁ、ネタと紛らわしくてすいません。友人もよく分かってなかったんですよ。
なるほど予約語だったのですねぇ。ったくGoF本め、なんだってあんな…。
ハァ〜これから今まで書いた全部のコード置換します。レスありがとうございました。
777セックスショパン:01/10/15 19:55
くーれないーにそーまあたーーーーーーーーーこーのおーーれーをーーーーーーーーーー
まともな人が去っていくよ>777
置換する必要はないと思うけどな。
先頭のアンダースコアは現状では安全だと思う。
(問題出た人いる?)
アンダースコア2つで始めると危険だけど。
780773:01/10/15 20:59
>>779
レスどもです。ありゃそうなんですか?今どんなマクロなら確実に変換できるか
悩んでたところだったり。いちいちコンパイルして確認するの辛いなぁとか。
間違いなく良いソースでは無いのでしょうけど、そういうことなら今までのは放置しようかな。
先頭がアンダースコアの名前を使うプログラマがあまりに多いので
システム予約シンボルはアンダースコア2つで始めるという仕様になりました。
...なわけないけどまあそんな感じかな。
俺はアンダースコアで始まるメンバ変数をいろんな環境でかなりの間
使ってるけど今まで問題にあったことはない。
Qt(GUIライブラリ)でもそういう命名規則やってるよ。
そもそもアンダースコア使わなきゃ絶対OKってわけでもないしね。
たとえばSolarisならsunが定義済みだったり。
ま、問題が出たシンボル名だけ変更すればいいんでない?
>>779
たとえば FreeBSD のスタートアップルーチンだと _progname に実行ファイルの
名前が入るようになってるから、自分のプログラムで _progname なんてシンボル
を定義するとリンク時にはまると思われ。

>>780
問題ないなら、とりあえず放っておけば? ただ _ で始まるシンボルを使うことに
はリスクがある(メリットはあまりない)から、今後は避けるということで。
俺は
「_で始まる語はCの予約語」
「__で始まる語はC++の予約語」
と教わったが・・・。
>>775
なんだぁ、ついこの前オイラがぶちあたった
問題じゃないか。俺はそれを乗り越えて進化できたYO
MS的には識別子にはGUIDを織り交ぜる、か?

古く形骸化してるが、_で始まる名前はさけるのがよいでしょ。
>>783で言ってるのが本来のお約束。
786sa:01/10/15 22:23
てす、てす。
787773:01/10/15 22:33
みなさんありがとうございます。勉強になりました。知人に自慢しよっと。
お勧めに従い、今までのは問題が出ない限り放っておき、大丈夫そうですが今後は
一応_を避けていきたいと思います。これからはm_か〜、慣れるまで時間かかりそう。
788デフォルトの名無しさん:01/10/16 20:08
>>783
それはない
_で始まるのは処理系実装で使用される予約語、
__で始まるのはC++処理系で生成される予約語
って説をみたが。どうよ?
プログラミング言語C++第3版には_から始まるのは
予約語だぐらいしか書いてないが。
790デフォルトの名無しさん:01/10/16 21:15
C++極めていますとうそぶいてしまってC++の仕事がやってきました。
2週間の学習猶予をもらえたので
そのうちに出来るだけ身につけたいと思っています。
実際は『憂鬱な…』と『プログラミング言語C++第3版』
『CプログラマのためのC++入門』しか読んでいません。
Effective C++、More Effective C++は定評があるようなので
頑張って読めるだけ読もうと思います。
他に何かやっておいたほうが良いことはありますか?
どれをクラスにすれば良い、とかそう言う話は憂鬱な…だけで
身につけられるのでしょうか?

アドヴァイスください、助けてください。
とりあえずコード書け。
792デフォルトの名無しさん:01/10/16 21:19
>>790
exceptional C++ モナー。

っていうかさ、既存の(その仕事で使う)クラスライブラリの学習はしなくて平気なのか?
なんか一個作れ
794790 :01/10/16 21:23
既存のものではなく新規の作成です。
C言語馬鹿なのでとりあえず継承とかやってみようと思います。

どれをクラスにすれば良いかなんてのはどうやって学ぶのですか?
>>794
ふつうはOO関係の本を見て学びます

コンパイラの付録で付いてくるライブラリをみて、
どのレベルでクラスを作ればよいか調べてもいいと思うが...
二週間じゃその時間もないな
796792:01/10/16 21:28
>>794
いや俺が言ってるのはMFCとかQtとかXercesとかそういうモノの学習は?
ってことよ?

どれを〜 は憂鬱でいいんじゃないの?あとある程度書けたら(納期的に
あともどりできるうちに)、デザインパターン読むと、劇的にコード改良
できたりするよ。さいしょのうちは。
797794:01/10/16 21:31
デザインパターンってこれですか?

オブジェクト指向における再利用のためのデザインパターン 改訂版
ガンマ,エリック ヘルム,リチャード ジョンソン,ラルフ ブリシディース,ジョン
ソフトバンクパブリッシング (1999)ISBN:4797311126
デザパタは、慣れてからの方がいいかもね。
799792:01/10/16 21:34
>>797
それ。
800794:01/10/16 21:39
C++はCでいうK&Rスタイルのように
権威のある(一般的な)コーディングスタイルは存在しないのですか?
ネットで調べたところ、
メンバ関数にはm_をつけてClass名の始めは大文字 というのが多いみたいですが。
801792:01/10/16 21:45
ない。
おれはJava風に書く。m_ などつけない。

#MS系はともかく、UNIXでいろいろなライブラリ使ってるとスタイルの不統一
#の酷さでめまいがするよ。
>>801
クソな記法でも、信者を量産したもの勝ちだっていうのか?
おれはそんなの認めない。認めないんだ!
803794:01/10/16 22:03
Java style っていうのは
http://geosoft.no/style.html
ですね?

もし違うにしても、ここに書いてあるものが見やすいような気がする。
804792:01/10/16 22:05
>>802
どゆこと?
まさかハンガリアンマンセーとかいうんじゃないだろうな?
コーディングスタイルといえば、
なんでCって変数名 短くするの?
C++風に読める形にしたほうがいいのに。
806デフォルトの名無しさん:01/10/16 22:13
C言語は変数、関数名に文字数制限ある(きっと)からじゃない?
C++はないはず。
おれ、メンバ変数はint value_;とか後ろに_つけてるけど
これって変?
で、クラス名は大文字始まり、publicメソッドは大文字
始まり、protectedとprivateのメソッドは小文字始まり
の名前つけてます。
あと、STLとかもよっぽどで無い時以外はstd::つけてる。
>>807
それはオブジェクト指向的日常あたりの影響かい?
>>808
スマソ、それ知らない。
題名から察すると雑誌の連載かなんか?
後ろアンダーバーはC++FAQの影響。他は特になし。
810デフォルトの名無しさん:01/10/16 23:32
プログラミング作法ってC++載ってたよね。
そのスタイルに従うのがいいんじゃ。
811セックスショパン:01/10/17 00:29
僕は
変数は
int MyInt;
こんなかんじです。
そして
関数は
void MyFunc();
こんなかんじです。
そしてクラスは
class MyClass{
}
こんなかんじです。
そして定数は
const int MyConstInt=1;
こんなかんじです。
812セックスショパン:01/10/17 02:53
名スレの予感
813デフォルトの名無しさん:01/10/17 03:09
コーディングスタイルうんぬん言うのは本末転倒。
プログラミング言語がなんのために存在しているのか
分かっていない。そういうのを好みで速攻置換するために存在する。
とPerlマンにうそぶかれて鬱。
814デフォルトの名無しさん:01/10/17 15:57
はじめからC++やったひとは
やっぱプログラムの細かいところはあんまり詳しくないのかな。  
リスト構造とかスタックとかも作る必要ないし。
815デフォルトの名無しさん:01/10/17 19:16
憂鬱なプログラマのためのオブジェクト指向...についているCDに
収録されているソースコードがコンパイル出来ないのですが
何か他にソースが必要なのでしょうか。
最後の魔方陣の奴です。
環境はでびあん、コンパイラはG++つかいました。
>>815
g++ならたぶん答えられるからエラー貼ってみ?
817815:01/10/17 19:55
g++ *.cpp
/tmp/ccEH60BU.o: In function `Nummgr::delnum(int)':
/tmp/ccEH60BU.o(.text+0x0): multiple definition of `Nummgr::delnum(int)'
/tmp/ccLVnn4N.o(.text+0x18): first defined here
/tmp/ccEH60BU.o: In function `Nummgr::getmax(void)':
/tmp/ccEH60BU.o(.text+0x34): multiple definition of `Nummgr::getmax(void)'
/tmp/ccLVnn4N.o(.text+0x4c): first defined here
/tmp/ccKhIvO0.o: In function `Hline::setnextline(Hline *)':
/tmp/ccKhIvO0.o(.text+0x0): multiple definition of `Hline::setnextline(Hline *)'
/tmp/ccLVnn4N.o(.text+0x0): first defined here
/tmp/ccKhIvO0.o: In function `Nummgr::delnum(int)':
/tmp/ccKhIvO0.o(.text+0x18): multiple definition of `Nummgr::delnum(int)'
/tmp/ccLVnn4N.o(.text+0x18): first defined here
/tmp/ccKhIvO0.o: In function `Nummgr::getmax(void)':
/tmp/ccKhIvO0.o(.text+0x4c): multiple definition of `Nummgr::getmax(void)'
/tmp/ccLVnn4N.o(.text+0x4c): first defined here
/tmp/ccPqUxZt.o: In function `Nummgr::delnum(int)':
/tmp/ccPqUxZt.o(.text+0x0): multiple definition of `Nummgr::delnum(int)'
/tmp/ccLVnn4N.o(.text+0x18): first defined here
/tmp/ccPqUxZt.o: In function `Nummgr::getmax(void)':
/tmp/ccPqUxZt.o(.text+0x34): multiple definition of `Nummgr::getmax(void)'
/tmp/ccLVnn4N.o(.text+0x4c): first defined here
/tmp/ccXW5oU3.o: In function `Hline::setnextline(Hline *)':
/tmp/ccXW5oU3.o(.text+0x0): multiple definition of `Hline::setnextline(Hline *)'
/tmp/ccLVnn4N.o(.text+0x0): first defined here
/tmp/ccXW5oU3.o: In function `Nummgr::delnum(int)':
/tmp/ccXW5oU3.o(.text+0x18): multiple definition of `Nummgr::delnum(int)'
/tmp/ccLVnn4N.o(.text+0x18): first defined here
/tmp/ccXW5oU3.o: In function `Nummgr::getmax(void)':
/tmp/ccXW5oU3.o(.text+0x4c): multiple definition of `Nummgr::getmax(void)'
/tmp/ccLVnn4N.o(.text+0x4c): first defined here
/tmp/ccleMZxq.o: In function `Hline::setnextline(Hline *)':
/tmp/ccleMZxq.o(.text+0x0): multiple definition of `Hline::setnextline(Hline *)'
/tmp/ccLVnn4N.o(.text+0x0): first defined here
/tmp/ccleMZxq.o: In function `Nummgr::delnum(int)':
/tmp/ccleMZxq.o(.text+0x18): multiple definition of `Nummgr::delnum(int)'
/tmp/ccLVnn4N.o(.text+0x18): first defined here
/tmp/ccleMZxq.o: In function `Nummgr::getmax(void)':
/tmp/ccleMZxq.o(.text+0x4c): multiple definition of `Nummgr::getmax(void)'
/tmp/ccLVnn4N.o(.text+0x4c): first defined here
/tmp/ccIA7dYg.o: In function `Nummgr::delnum(int)':
/tmp/ccIA7dYg.o(.text+0x0): multiple definition of `Nummgr::delnum(int)'
/tmp/ccLVnn4N.o(.text+0x18): first defined here
/tmp/ccIA7dYg.o: In function `Nummgr::getmax(void)':
/tmp/ccIA7dYg.o(.text+0x34): multiple definition of `Nummgr::getmax(void)'
/tmp/ccLVnn4N.o(.text+0x4c): first defined here
collect2: ld returned 1 exit status
818816:01/10/17 20:09
憂鬱 はもっていないのでソースはみられないのだが、

>>817
.cpp から .cpp を #include してないかい?
819815:01/10/17 20:23
cppはインクルードされていません。
コード変換していないのがまずいのでしょうか。
CDに入っていたソースはウインドウズに合わせていて EUCにはなっていなかったのですが。
nkfで一気に変換する方法を知らないのでそのままコンパイルしたのですが。
820816:01/10/17 20:52
どこぞからソース貰ってきた。

> コード変換していないのがまずいのでしょうか。
コンパイルは通ってるからいまは問題ないです。

Nummgr.h と Hline.h で setnextline(),
getmax(), delnum() の実装が書かれていると
思うけど、 inline がついていないでしょ。
書けば通るよ。バグです。
821815:01/10/17 21:04
820様、
有難うございます。
付属のCDにもバグと言うものはあるのですね。
これもまた、課題の一つだったのかも知れませんが。
822SS:01/10/17 21:58
inline はC++版マクロと判断していいですか?
既に、C++版マクロはSTLと認定されておる。
824SS:01/10/17 22:20
>823
なんで?スタンダードテンプレートライブラリが?
825sage:01/10/17 22:27
>憂鬱な〜
この本てどこがいいの?斜め読みした感じいまいちというか全然
わからんのだけど。
普通の今時の入門書籍がJavaでやる類のことをC++でやったというだけか?
それだけまともなC++のOO本がないってこと。
OOよりもEffectiveC++のような落とし穴を解説した本の方が必須だしな。
827デフォルトの名無しさん:01/10/17 22:35
 「憂鬱な」は読んでいて新しい感覚を受けましたけど
最後に載ってるソースコードは読みにくかったです。特殊な書き方ですね。

あの本読んでも最後の演習がよくわからなかったのですが
これは私のおつむが弱いからですか?
あれが一番簡単なOO本なんですよね?
プログラミング言語C++にしてもEffectiveC++にしても
あぁいうスタンスではないだろうから他に頼るものが…。
828816:01/10/17 22:39
借りて読んだことがありますが、あの本は別にJava書きだろうが
Eiffel書きだろうが読む意味あるとおもいますがねえ。

>>825
具体的な書名は?
829:01/10/17 22:40
JAVA信者のいうことなんか気にするなよ
Javaが叩かれているのはど〜してなんでしょうね?ついていけない人?
831:01/10/17 22:44
javaでついていけないなんてことは有り得ない。
832デフォルトの名無しさん:01/10/17 22:46
>>827
> あの本読んでも最後の演習がよくわからなかったのですが
> これは私のおつむが弱いからですか?
自分の分析力を信じろ。君のクラス設計が世界で一番正しい。
833825:01/10/17 22:48
いまどき
C++ == OO
は無い。高レベルではgenericsやMSのCOM、低レベルでは組み込み
にOOを使う方法とか、C++のおいしい部分に関心無しにOOが欲しい
だけならC++で学習する意義は薄いと思うぞ。今はJavaやC#があるん
だからそっちで勉強した方がいいんじゃないの?
C++を中途半端に学習して消化不良になると時間の無駄だと思うが。

>>827
>プログラミング言語C++にしてもEffectiveC++にしても
>あぁいうスタンスではない

どのへんが? 後者はともかく前者は読んでないってこと?
>>831
君のHNあほの「あ」か
835:01/10/17 22:50
追加
java ごとき でついていけないなんてことはあってはならない。
>>835
がんばってね
837827:01/10/17 22:51
>> 833
いや、一応読みましたが全て通して読んではいません。
前半部分の機能説明の部分を辞書を引くようにして読んだ程度です。
そう言えば最後のほうに設計関係のことが欠いてあったような…
申し訳ない。
838:01/10/17 22:53
追追加
java 程度 でついていけなくなるのは 絶対に おかしい。
>>838
マジな話し、自分の使いやすい言語作れ。
840816:01/10/17 22:57
>>833
(激しく)同意。

が、Java入門書と銘打ったもので良いOO入門書あるなら教えてくれよ。
感銘を受けるほどのOO入門書って少ないと思うので。
>>837
プログラミング言語C++を設計入門として読むなら、先にピアソンの
「オブジェクト指向言語のはなし」を購入しておくことを勧めるw
841827:01/10/17 23:02
憂鬱→プログラミング言語C++
→Effective→More Effective
→デザインパターン→…

ですか?
842816:01/10/17 23:05
>>841
Moreは読まなくてもいいんじゃない?
843デフォルトの名無しさん:01/10/17 23:08
参考書よむ奴は努力を認めるが、3流
844:01/10/17 23:13
証明)
参考書は努力して読むものじゃない。参考にするものだ。
∴努力して読む奴=3流。
(証明終
>>843
手段は問わず。結果を出せれば良し。

参考書読まないのは構わんが、それでダサい設計をしたり余計なバグを
埋めたら銃殺。
846:01/10/17 23:22
ダサい設計というのは実に主観的であり、一概には決められないので845は却下。
847デフォルトの名無しさん:01/10/17 23:25
お前が一番ダサイということで終了な。
848:01/10/17 23:26
主観的なので847は銃殺のうえ却下。
そろそろ「あ」は放置プレイで行きましょう。
850:01/10/17 23:39
その前に根拠のある理由を述べてください。
851816:01/10/17 23:54
さぁ…
このスレ印刷して病院で聞いてみたら? >>850

きみがだれにも負けない一流の何かをもっているならそれは
おめでたいことだが、たとえその点で勝っていても、こんな
ところで意図不明(意味不明とは言っていない)の発言を繰
り返すような人間が健全と言えるか?ジジイになったときに
楽しい人生だったと思えるようにするために、やっておくべ
きことがもっと他に沢山あるんじゃないのか?
852816:01/10/17 23:54
なんちゃって。
853:01/10/17 23:58
>851
ネタにマジレスさんくす!あー釣れた釣れたおもしろかった。今度牛丼おごるよ。
854816:01/10/18 00:01
そうか、傷つけたお詫びに俺がおごるよ。特盛な。
まぁコピペだから気にすんな。
あほーん
856827:01/10/18 00:04
となると一流の人は実践で学ぶと言うことですね。
なるほど。当たり前と言えば当たり前のような気が。
私はどうも参考書だのみになってしまうので
永久に三流です。
今度なんか簡単なのを設計してみようと思います。
857:01/10/18 00:09
>856
そんなことはありません。世の中に”絶対”は無いのですから。
あが一流だということは絶対にありえない。
859デフォルトの名無しさん:01/10/18 02:54
new, delete のオーバーロードと同様にして
自動変数の確保される領域を自前で管理する方法はないでしょうか?
色々調べているのですが方法が見つかりません。どうかご教示ください。
860:01/10/18 02:56
>>859
なんでそんなことがしたいのかおしえて〜
861体育会系PG:01/10/18 02:58
>>856
参考書なんか読むな!
いきなりソースをにらむのだ!
読書百篇意自ずから通ず!
862859:01/10/18 03:03
>>860
new, delete のオーバーロードだと
うっかり delete を書き忘れた時にリークしてしまうので
スコープの最後で必ずデストラクタが呼ばれる
自動変数の形でこれらが記述できると便利かと思ったんです。
方法、あるでしょうか?
863:01/10/18 03:06
え、意味がわかんない。
かならずデストラクタが呼ばれるのだから、リークしない
(しないように書ける)じゃん。
864859:01/10/18 03:12
>>863
いえ、基本的には全部ヒープを自分で管理したいんです。
ただ、そのために new, delete のオーバーロードを使っていると
うっかり delete を書き忘れたときに困るので
見かけは自動変数で中身は自前ヒープ上に、という形にしたいんです。
なぜ自前でヒープ管理したいかと言えば
指定されたメモリ空間内だけで処理が行なわれるようにしたいからです。
ちょっと特殊なソフトを書いてまして・・・
仕事が絡んでるので申し訳ありませんが詳細は公開できません・・・
865:01/10/18 03:18
なるほど。
俺なら自動変数としてオブジェクト作成(Aとする)して、そいつに
newしたオブジェクト(Bとする)の参照渡して、Aがスコープはずれる
タイミングでBをdeleteするが、それでは駄目??

そんなことは結構やるなぁ。
866:01/10/18 03:20
>>865
>AがスコープはずれるタイミングでBをdeleteするが
自明だと思いますが、Aのデストラクタで、の意。
867859:01/10/18 03:22
>>865
それでもいいんですが
自動変数のデフォルトのメモリ制御を
オーバーロードあたり一発で済ませられれば
それが一番スマートかと思いまして。
placement new に似た自動変数の初期化構文があるだけでも
かなりすっきりとするんですが・・・。
>>867
グローバルにクラスをひとつ置いて、
コンストラクタとデストラクタで処理するのは?
std::auto_ptr ‥‥
870859:01/10/18 03:29
>>868
すいません。意味がよく分かりません・・・。

>>869
それ以外にないんでしょうか?
871デフォルトの名無しさん:01/10/18 03:33
Boehm GC..
872859:01/10/18 04:02
結局次のような処理で妥協することにしました。

void bar( void){
  simple_gc gc ;
  Foo* foo1 = new( gc) Foo ;
  Foo* foo2 = new( gc) Foo ;
  /* 処理 */
  // ここで gc がデストラクトされて foo1, foo2 もクリアされる。
}
873デフォルトの名無しさん:01/10/18 09:53
本質的じゃない質問で恐縮です。

いまどきのC++だと、
#include <stdio.h> → #include <cstdio>
ですが、↓これはどういう名前に換えれば良いのでしょう?

#include <sys/socket.h> →?
これはUNIX CのヘッダであってC++標準とは無関係>#include <sys/socket.h>
なので、どうしてもいまどきのスタイルに死体なら自分で<sys/socket.h>を
インクルードする"csocket"という名前のファイルでも作って標準includeパス
にぶちこんどけ。
そうすれば#include <csocket>で行ける。激しく無意味だが。
>>872
それって、自動変数に代入されるヒープ領域の管理であって、>>859
 自動変数の確保される領域を自前で管理する方法
なの?
本人納得なら別にどーでもいいことなんだけど。
>>874
イヤ過ぎる...
877デフォルトの名無しさん:01/10/18 12:38
>>873
extern "C" {
#include <sys/socket.h>
}
ちゃいますの? Stroustrup本の9.2.4見てねん。

# せんで大丈夫なのは、たまたまそういうlinkageの実装の時だけ。linkage的には本質。
878デフォルトの名無しさん:01/10/18 13:21
>>877
せんで大丈夫なのは、ヘッダファイル中に extern "C" が書かれている
からでしょう。ほとんどの場合。
879デフォルトの名無しさん:01/10/18 14:32
Franz Lisp-386をWindowsに、移植中です。
Compilerは、Borland C++を検討しましたが
諸問題を抱えるのでcygwinを導入してcomlileしようと
思うのですがcygwin窓の$はプロンプトですか?
gccは単なるCコンパイラーですか?
>思うのですがcygwin窓の$はプロンプトですか?
そうです。

>gccは単なるCコンパイラーですか?
そうです。
>>879
>諸問題を抱えるので
それはあなたです。
882デフォルトの名無しさん:01/10/18 15:13
>>879
> 諸問題を抱えるのでcygwinを導入してcomlileしようと

MinGWもいいよん。
http://www.ab.wakwak.com/~tino/windows/
痛い >>877
884デフォルトの名無しさん:01/10/18 20:11
C++を最短距離でみにつけたいのですが
どうすれば良いですか?
とりあえずプログラミング言語C++第3番のクラスのところからよみはじめましたが。
頭から読め
身に付けたいなら ひたすらコードを読んで変更して、その後書く事だな。
>>886
C++ だと、あるていどオブジェクト指向を分かってないと、既存のコードを読んでも (?_?)
となるかもしれず。
888884:01/10/19 11:36
コード読んで書くことですね。
プログラミング言語c++は全部読んでる余裕がないので
クラスのところから読み始めたんですが。
最初の方はたんなる紹介のような感じがしたので。
>>888
今までにオブジェクト指向言語の経験があるなら、
必要なところをかいつまんで読めばいいけど、
経験無しなら、プログラミング言語C++だけじゃ
つらいかも。
890884:01/10/19 11:58
憂鬱なプログラマのための・・・っていうのが
読みましたけど足りませんか?
プログラミング言語C++、K&Rのようなものを期待していたのですが
わかりにくいです。来週からC++の仕事が始まるというのに
891デフォルトの名無しさん:01/10/19 15:41
プログラミング言語C++の設計のところは抽象的過ぎるきらいがある
892デフォルトの名無しさん:01/10/19 16:08
本読みながらC++勉強中の厨房です。
C++が部品化とか再利用が利点とありますが、意味が良くわかりません。

例えば、あるクラスを自前で書いて、それにclass.h class.cpp
という名前で持ってたとして、ある日、別の似たような仕事で
そのクラスから派生させたクラスを作ればうまくいきそうだと
したとき、差分を書いたnewclass.hでclass.hをincludeして、
class.cppとnewclass.cppをリンクすれば再利用、C++って
ウマーってことになるんでしょうか(ハァ...なんか自分で書いてて鬱)

下らない質問でごめんなさい
893:01/10/19 16:28
>892
そのとおりです!

オブジェクト指向∋>>1の文

です!
>>892
部品化についてはEssentialCOMという本(のはじめの方)が簡単で良いです。
895デフォルトの名無しさん:01/10/20 12:27
text.txtから1行読むにはどうすればいいですかー!ウッウッ
>>895
気合いを入れる
897895:01/10/20 12:38
やっぱり改行コードを調べるのですか?あうち!
>>897 いや、まあ、1行読む方法は幾らでもあるんで
  コメントのしようがない。  Cの方法もそのまま使えるし
>>895
何も考えずにダブルクリックしてみろ!
一行と言わず何十行もまとめて読める。
900デフォルトの名無しさん:01/10/20 13:41
いまどきの初心者ならSTL使ってみろ!
string line_buf;
ifstream file("text.txt");
getline(file, line_buf);

こんなクソコード書いていいのは初心者のうちだけだぞ!
901デフォルトの名無しさん:01/10/21 00:17
VCで次のコードがとおらないのですが
何故ですか?
stringが定義されていないと出ます。


#include <string>

int main()
{
string str;

return 0;
}
std::string str;
903:01/10/21 00:21
>901
namespace std{
#include<string>
int main()
{
string str;

return 0;
}
}
または、
using namespace std;

何のことかわからないなら「名前空間」を調べてみよう。
905:01/10/21 00:28
>1
安全にネームスペースを使うにはこうする。
プロの開発現場ではよく使われる手法。

#include<string>
namespace std{
string str;
}
int main() {
std::str="1";
return 0;


}
906デフォルトの名無しさん:01/10/21 00:30
stdって標準でusing namespaceされてるんじゃありませんでしたっけ?
違いますか?
プログラミング言語C++にもそう書いてありますが。
907:01/10/21 00:31
>906
大嘘。なんていう本ですか。
908901:01/10/21 00:33
printfは名前区間を指定しなくても動くのは何故ですか?
909:01/10/21 00:36
printfはC++の予約語だからです。
910デフォルトの名無しさん:01/10/21 00:40
>>909
嘘だよ。

#include <iostream.h> とか #include <stdio.h>

と、

#include <iostream> とか #include <string>

などの違いを調べてみるのも吉かと。
911:01/10/21 00:45
C++の標準ではヘッダ名に後ろにhがつきません。
.hはC言語時代の名残です。
なんか、散々偉そうだったけど、底が見えちゃった感じだねえ。
誰とは言わないが。
913:01/10/21 00:49
>912
ワラタ
激しく同意
>>913
909にワラタ。おれも。
915デフォルトの名無しさん:01/10/21 01:10
Danaのgrep最強なんたげと
拡張子ないと開かないんだよね・・
916デフォルトの名無しさん:01/10/21 01:12
string型に
int 型2つをセットするにはどのようにすれば良いのですか?
stringの使い方のページが見当たらなくて。
ワケワカラン
918:01/10/21 01:17
>916
string a,b,c;
char buf[10];
int d,e;

itoa(d,buf,10);
b=buf.
itoa(e,buf,10);
c=buf.

a=b+","+c;

多分違うと思うけど
919デフォルトの名無しさん:01/10/21 01:18
string str;
int a = 1;
int b = 2;
// これをStringにセット

cout<<string.c_str();

-out put-
1 2
920デフォルトの名無しさん:01/10/21 08:32
C++でマルチスレッドってどうやりますか?
>>920
環境依存。
pthreadライブラリを探せ
923920:01/10/21 15:21
C++のマルチスレッドが環境依存とは正直驚いた。
標準じゃないのね。Javaだって標準なのに。
>>923
Java以外に標準でスレッドインタフェースを持ってるものを考えてみ。
925デフォルトの名無しさん:01/10/21 15:29
>>923
Cも標準じゃないよ。POSIX環境ならCもpthreadも両方定義しているけど。
ISOやJISになっているくらいメジャーな言語でマルチタスク/スレッドが標準なのって、
Adaくらいじゃないの?

> Javaだって標準なのに。

「だって」って、Javaはmulti-plathomeでの道具の豊富さは他の追従を許さないよ。
// performanceとか、他に問題はかかえているけど。
926デフォルトの名無しさん:01/10/21 15:43
2次配列を使わなくてはいけないレベルに達しました。

ここで、
char buf[2][64];
などとしたはいいんですが、
関数の宣言部でこれを引数で使いたいとき、
int functionA(...... ,buf[2][64]);
とやっていいものでしょうか?こんなの見たことありません。
int functionA(...... ,buf[][]);
ですか?それとも、
int funcitonA(...... ,**buf);
でしょうか、わかりません。お助けください。
>>923
マルチスレッドをサポートしないJavaプラットフォームも実在しますが、何か?
int functionA(..., buf[][64])
929sage:01/10/21 15:55
>>927
そうなのか。
以下はそれがホントだとして書いてみる。

javaはどうせ廃れると思って見てなかったけど、駄目さ加減を知るために
いっちょやってみるか。

CやC++でマルチスレッドがサポートが標準で言語仕様にないのは、
これらの言語がアセンブラの延長として考案、拡張されてきたからだろうね。

アセンブラのニモニックレベルでマルチスレッド(というか同期処理)を処理する
CPUが20年以上前に作られていたら、Cの言語仕様にも組み込まれて
いただろうに..
930デフォルトの名無しさん:01/10/21 16:05
>>926
926の一番上のものでOK。
928ももちろん正解。
931デフォルトの名無しさん:01/10/21 16:07
>>925
>Javaはmulti-plathomeでの道具の豊富さは他の追従を許さないよ。

あれは既得権益というのです。
932デフォルトの名無しさん:01/10/21 16:09
>>926
コンパイラによっては一次元配列以外バグコード出すのもあり。
うーん、基本的に2次元でもなんでも配列は
単なる文字列ということで知識を深めていますから、
**bufで行こうかとも思いますが、それでもバグコード
が出るのだったら厄介ですーーーナ

さんくす>>932
やっぱ、宣言をchar **bufにした場合、
関数に渡す前にmallocやらをしないと怒られるかな・・・
935デフォルトの名無しさん:01/10/21 17:17
いろいろ見て回ったんですが、
char **argvの場合
argvとargcはたいてい組みでつかいますか?
argc使わなくてもごり押しでいけますか?
7割くらいわかってるつもりなんですけど。。
使わなくてもいいし、ごり押しでもいいよ。

でもその前に getopt を覚えろ。
そしてそれ以前にスレ違いであることを反省しろ。
937デフォルトの名無しさん:01/10/21 17:23
わかりました。これからは多分スレは選ぼうと思います。
ありがとうございます。>>936
938sage:01/10/21 23:56
stl の vector (じゃなくてもいいけど)をつかった動的な配列で質問。

・要素内容:可変長buffer(malloc したbufferみたいな)
・要素数:可変
の配列って、どうつくるのですか?

vec[i] = new buf(size);
みたいにやれば、vec の消滅とともに思いっきり
メモリリークしそうだし。
auto_ptr するのも面倒だし。
第一、vector の要素に auto_ptr の pointer 入れた場合って、
auto_ptr のデコンストラクタがちゃんと呼び出されることが
「保証」されてるのですか?


みたいなのって、
939sage:01/10/21 23:57
最後の一行、ゴミです。無視してください。スマソ。
940sage:01/10/21 23:59
typedef vector<sage> variable_length_buffer;
std::vector<variable_length_buffer> hoge;

貴様にauto_ptrはまだ早い。
ついでにsageはコテハンじゃ。
1.可変長バッファを管理するclassを作る。
2.それをvectorに格納。

可変長バッファの用途が文字列ならstd::string。
>>938
std::vector< std::string > 可変長バッファの可変長配列
std::stringは文字列じゃなくても利用できるっす(\0が途中にあっても関係ない)。

>第一、vector の要素に auto_ptr の pointer 入れた場合って、
>auto_ptr のデコンストラクタがちゃんと呼び出されることが
>「保証」されてるのですか?
保障されるっす。デバッガで追いかけるとわかる。
でも以下のコードはメモリ漏れるので注意。
{
 std::auto_ptr<char> p = new char[100];
}
auto_ptrのデストラクタはdelete[]ではなくdeleteなので。
なんと!
string 型でいいのか。すげぇ!これなら俺でもわかります。

> std::vector<variable_length_buffer> hoge;

hoge[0] = "variable_length_data";
・・・・・・
hoge[0] = "change_to_more_and_more_long_lenght_data";

みたいにできるのかな?
やってみよう・・・。
944943:01/10/22 01:20
あ、オオボケなレスしちゃった。
943 で聞きたかったのは、
940 さんみたいにやったばあい、そのやりかただと、
variable_length_buffer[] の要素が、charの配列みたいに、
メモリ上に連続で並んでいることが保証されてないとヤバくない?
ってことです。
もちろん、vector は普通は単なる配列として実装されてるので、
実際問題としては動くとは思いますが。
945デフォルトの名無しさん:01/10/22 09:40
plathomeっていう単語は造語ですか?
platformと思っていたのですが、コンピュータ関係ではplathomeでOKですか?
いや、マジで聞いてます。
946デフォルトの名無しさん:01/10/22 10:08
>>945
私も数年前までは何気に「ぷらっとほーむ」と発音してましたが
plathome という英単語は存在しない模様
「がいしゅつ」と同類かと

google で検索してみると,ヒットするのは殆ど日本語サイトでした・・・
ってのはぷらっとホーム株式会社(plathome.co.jp)がヒットしたからなんだけど,
そうでなくても間違って憶えている人は多いみたいっすね

ちなみに「ぷらっとホーム」は Plat'Home と表記して欲しいみたいです
947946:01/10/22 10:16
・・じゃなくて,945 はわりとスレ違いな気がしてきたけどいいや

・・じゃなくて,私も質問っす
BCB や VC++ では「プロパティ」てな概念が存在します
変数に代入したり変数を参照するような文を書くだけで
特定の関数を呼び出せるようなやし
具体的には BCB なら __property キーワード,VC++ なら
__declspec(property()) っすよね

他の C++ コンパイラではどうなんでしょうか?
テンプレートとクラスである程度似たようなことはできるけど,
さすがに限界もあるわけだし

あと,プロパティは C++ 的にどれくらい嫌われてますか(わらぃ
9483文字回答:01/10/22 12:39
>>946
COM
949946:01/10/22 14:17
>>948
3文字レスどうもです
そうっすね、BCB や VC++ なんかは COM のおかげで
「プロパティ」の概念の必要性が出てきたわけで

ということは、標準的にはどのコンパイラも __property みたいな
機能を備えている保証はないし、
特にこれから搭載される予定もなさそうだ〜、ということで
オッケーっすか

# ていうかずっと __property に甘えたコード書いてました(ゎらぇなぃ
950948:01/10/22 14:53
じゃあ2文字回答で。
「C#」
Delphiつーのは無しな。
>>943
std::vectorは operator[] を持ってます。持ってないと[]での
アクセスはできないので。

まぁ、libstdc++では、仰る通り
reference operator[](size_type __n) { return *(begin() + __n); }
const_reference operator[](size_type __n) const { return *(begin() + __n); }
となってますけんど。
つうと、やっぱ、
memcpy( &vec[0], pBufSrc, vec[0].size() );
みたいなのは、
実際には動くだろうけど、
厳密にはSTLのインプリメントに依存すると
考えてOKですか?
あ、訂正。
vec[0].resize(pBufSrc.len);
memcpy( &vec[0], pBufSrc.dat, vec[0].size() );
みたいなの。
ようは、vec[0] に入っているはずの可変長バッファに
STLでも何でもない普通のバイナリデータを転送する、とか。
Cだと、malloc したバッファへのポインタを要素とする配列を用意して、、
とかやんなきゃいけない場合を、STLできれいに書きたいのです。
954データ抽象マンセー:01/10/22 21:04
>>953
#include <algorithm>
string& buffer = vec[0].resize(pBufSrc.len);
std::copy((char*)(pBufSrc.dat), (char*)(pBufSrc.dat) + pBufSrc.len, buffer.begin());
こんなん? Cからの移行組は一旦実装はスカッと忘れなさい。でなきゃ悟れない
955デフォルトの名無しさん:01/10/22 23:56
enum型って 普通の演算子使えないのでしょうか。

m += n; // 両方ともEnum型

この演算子に適切な方への変換定義を行いません
というエラーが出るのですが
enumって初期化時以外左辺値にはできないような。
957デフォルトの名無しさん:01/10/23 01:23
>>956
そりゃenumのメンバ自身のことやん。

>>955がエラーになる理由は、
「enumはintに自動変換されるが、intからenumには暗黙に変換されない」ということでしょう。

たとえば enum foo {A,B,C} m, n; という変数m,nがあるとして、
m = m + n; はコンパイル通らない。右辺が最終的にint型だから。しかし
m = (foo)(m + n); なら通る。これは実際には
m = (foo)((int)m + (int)n); と同じこと(それが望んだ結果かどうかは別)。
>>954
STLはコンテナばっかり使ってるわ。
真っ当にもう一度勉強して悟ろう。
このスレに集う皆様へ。
そろそろ次スレを立てたいのですが、1に書くべき文面はいかがいたしましょう。
また2〜3あたりに貼り付ける、おすすめリンク等ございましたら、ご教示ください。
>>959
こんな感じでどうですか。

【スレタイトル】
C++相談室 Part3

【1の本文】
OS/環境に依存しないC++の話題。STLも可、むしろ歓迎。
前スレ http://piza2.2ch.net/test/read.cgi/tech/996640937/
C++参考リンクは>>2を参照のこと。
>>959
こんな感じでどうですか。

【スレタイトル】
C++相談室 Part3

【1の本文】
OS/環境に依存するC++の話題。STLも可、むしろ必須。
前スレ http://piza2.2ch.net/test/read.cgi/tech/996640937/
C++参考リンクは>>2を参照のこと。
963962:01/10/23 14:34
ついでに

割と詳しい入門ページ
http://www.d1.dion.ne.jp/~ecb/cpp/cpp00.html
FILEとfstream。あなたならどっち?
965分かりません。:01/10/23 19:02
参照を戻り値にする場合は
一体なにが戻ってきているのですか?
例えば
strtype& operator+(strtype& ob);
のような関数の場合、戻ってくるのは
一時オブジェクトではなく、何なのですか?
966965:01/10/23 19:08
このプログラムはなぜかメモリがおかしくなるみたいです。
突然ですいませんが、どうやら根本的なところが分かってないみたいです。

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

class strtype{
char* p;
int len;
public:
strtype(){*p='\0';len=0;}
strtype(char* s){
len=strlen(s)+1;
p=new char[len];
if(!p){
cout<<"メモリが確保できません"<<endl;
exit(1);
}
strcpy(p,s);
}
~strtype(){
cout<<"メモリ解放:"<<(unsigned)p<<endl;
delete [] p;
}
char* get(){return p;}
// strtype(const strtype &ob);
strtype& operator+(strtype& ob);
}:
strtype& strtype::operator+(strtype& ob)
{
int l;
l=len+ob.len+1;
strtype temp;
temp.len=l;
temp.p=new char [l];
strcpy(temp.p,p);
cout<<temp.p<<endl;
strcat(temp.p,ob.p);
cout<<temp.p<<endl;
cout<<(unsigned)temp.p<<endl;

return temp;
}
int main()
{
strtype ob1("Hello!"),ob2("Good-bye");
cout<<"ob1:"<<ob1.get()<<' '<<"ob2:"<<ob2.get()<<endl;
cout<<"ob1とob2を連結すると--->"<<(ob1+ob2).get()<<endl;
     return 0;
}
まず
strtype(){*p='\0';len=0;}
968965:01/10/23 19:16
>>967
ありがとうございます。
どの変がおかしいのでしょうか?
>>959
C++ Final Draft International Standard
http://www.kuzbass.ru/docs/isocpp/
970965:01/10/23 19:27
参照を返すというのはどういうことなのかな?
>968 領域を確保してない。
973965:01/10/23 19:38
>>972
ありがとうございます。
あの部分は変更したのですが、
まだうまくいかないみたいです。
ちなみに
strtype(){;}
↑こうしました。

あのプログラムは
return tempのところに問題があるみたいなんですが。
>954 さん

いまやってるのは、
あるAPIの戻り値である不定長の要素をふんだんに持つ構造体、
ってのがあって、

struct out_t {
unsigned int type;
unsigned int len1;
unsigned char dat1[len1]; // ほんとはこんな書き方はNG
unsigndd int len2;
unsigned char dat2[len2:
};
result_t call_api(key1_t key1, key2_t key2, out_t& out);
for_each(key1, key2) { // ほんとはこんな書き方はない。
result = call_api(key1, key2, out[next++]);
}

それをkey1, key2 の組み合わせ毎にメモリに格納する。
key1 は、ファイルから読み込む。
key2 は、あるルールで範囲を決定してループで作ればよし。
・・っていうやつなんですけど、
もうすでにCで完成してます。すごく汚いコードですけど。(笑い)。
しかし。突然の仕様変更で、
key1 の方は、あるルールでソートしてメモリに格納する。
さらに、out_t もふくめ、全体を、シリアライズしてセーブ。
(二回目以降の読み込みの高速化のため。emacs の dump と同じ)
・・・とかになったもので、
いっきにC++とSTLで書き直したれ!とかなったんですが。

std::map< key1_t, std::vector< std::vector<out_t> > > gOutlist;

とかやってもダメっす。
(正確には、コンパイルは通るけど、使い方がわからん)
ろーかるなオブジェクトを返してmp、抜けた時点ではじゃ胃されるや炉。
Effective C++の29校も読むと世濾紙
新スレに移行せよ。諸君
977965:01/10/23 20:24
一応解決しました。
関数内で定義した変数は参照で戻せないみたいです。
コピーコンストラクタをつくって、一時オブジェクトで
もどしたらできました。
それからやはり最初のstrtype(){*p='\0';len=0;} がまずかった
みたいです。
ありがとうございます。
これで心置きなく新スレに以降
979974:01/10/24 00:13
新スレのまえに、オイラにお助けを。
980キリ番ゲッター:01/10/26 18:54
1000間近スレッド発見
981キリ番ゲッター:01/10/26 18:55
1000狙うからな
邪魔するなよ>ALL
982キリ番ゲッター:01/10/26 18:55
俺様が1000とったら
ウラビデオさしあげます
983キリ番ゲッター:01/10/26 18:56
984キリ番ゲッター:01/10/26 18:56
邪魔したら
もらえなくなるんで

注意!!!!
985キリ番ゲッター:01/10/26 18:57
1000ほしい
お願い

くださいな
986キリ番ゲッター:01/10/26 18:57
邪魔するんじゃ ねーーーーーーーーーーーーぞ


baka
987キリ番ゲッター:01/10/26 18:58
つーか

プログラマー=きちがい
988キリ番ゲッター:01/10/26 18:59
大リーグって いつからやるん??????


hehehe
989キリ番ゲッター:01/10/26 18:59
くそ−−−−−−1000の道が 遠すぎる

お前らも 手伝え
990キリ番ゲッター:01/10/26 19:00
邪魔をとるか

おまんちょ丸見えビデオをとるか   よーーーーーく考えろ
991キリ番ゲッター:01/10/26 19:00



0GET  だよーん
992キリ番ゲッター:01/10/26 19:01
タリバンなかなか つぶれない


しぶといなあああああ
>>キリ番ゲッター

サム
994キリ番ゲッター:01/10/26 19:01
おおおお
お前のような

邪魔者は

去れ
995キリ番ゲッター:01/10/26 19:02
くそ!!!!!!!!!
なんで
邪魔するんだーーーーーーーーーーーーー 氏ね>>993
996キリ番ゲッター:01/10/26 19:03
いいか、1000GETの
邪魔するんじゃ

ねーーーーーーーーーぞ!!!
997キリ番ゲッター:01/10/26 19:03
FUCK YOU!!!!!!!!


氏ね〜〜〜〜〜〜〜〜〜!!!!!!>ALL
998キリ番ゲッター:01/10/26 19:03
もうすぐだ!!!!!  ぜったい1000取るよ
>>キリ番ゲッター

オソ
1000キリ番ゲッター:01/10/26 19:04
1000 is very good


ははははっはははははh
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。