トップページ⇒tech
1001コメント363KB

C++相談室2

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
v(^・^)v

http://www.kuzbass.ru/docs/isocpp/
0002デフォルトの名無しさんNGNG
あは
0003デフォルトの名無しさんNGNG
下のようなのを書いたんですが、ちゃんと動きました。
これはC++的にはアリなんでしょうか?

class foo
{
public:
  int bar;
};

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

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

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

アセンブラが分からないヘタレですみません。
0009デフォルトの名無しさんNGNG
$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
0010デフォルトの名無しさんNGNG
>>8
そうです。デフォルトでpublicかprivateかの差だけです。

メモリ上の配置が変るのは、処理系によっても違うかも
しれませんが、仮想関数を持った時に仮想関数テーブル
へのポインタが自動的に追加されます。
0011デフォルトの名無しさんNGNG
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);
0012デフォルトの名無しさんNGNG
Cのコードが分からない。。。鬱だ
0013デフォルトの名無しさんNGNG
>>11
続きは?
0014STL厨房NGNG
あいまいなシンボルって何じゃー?どうせいっつんじゃー
さっきまで動いとったのに、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' : あいまいなシンボルです。
0015デフォルトの名無しさんNGNG
「C++相談室2」というタイトルと

↓この顔文字

v(^・^)v

の組み合せはまさに芸術だと思う。
0016デフォルトの名無しさんNGNG
>>14
1行目が悪いんじゃないか?
0017デフォルトの名無しさんNGNG
>>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
0018STL厨房NGNG
>>16 >>17
レスどもっす。
.h の方を使うと内部で暗黙に namespace が有功になってて
外部で再び宣言すると、名前がかぶって ofstream がどっちに
属すのか特定できんって事なんかな。。。
0019STL侍NGNG
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++標準ライブラリ チュートリアル&リファレンス』
なる書物を紐解いてみるに見つける能わなんだ。

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

まじめに質問しているのならふざけた口調はやめたほうがいいぞ
0021STL侍NGNG
かたじけない >>20
エセ侍風はお気に召されなかったようで、口調を戻します。

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

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

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

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

むむむ。
002520NGNG
リストを構成しているそれぞれのノードはポインタでチェーンされているが
そのノード自身のアドレスと ノードが参照している中身のアドレスは別物。
0026RIP_MAPIRONGNG
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を考
えるとやりたくない。
0027STL侍NGNG
>>25
至極なっとくでござる。
お付き合いどうもありがとう。
0028STL侍NGNG
>>26
おぉ、これもレスですね。どうもありがとう。
今すぐには理解できないけど少し反芻してみます。
一度はヘッダの中身を覗いてみないとダメですね。
0029デフォルトの名無しさんNGNG
>>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

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

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

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

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

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

みなさんの文字列処理のやり方を教えてくださいませ。
0041デフォルトの名無しさんNGNG
>>40
どこが遅くなるのか分かりませんが、変換は必要なときだけ
やればイイですよね。
004240NGNG
>>41
はい、変換は必要な時だけしかやってません。

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

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

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

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

…コード処理出来る人って少なそうだけど。
0049デフォルトの名無しさんNGNG
便乗なんですが
UTF-8 8 ビット Unicode 変換形式
ってなんですか?
005048NGNG
俺もあんまり詳しく無いんだけど。

UCS4を1〜6byteに変換する形式だよ。
0051デフォルトの名無しさんNGNG
>>49
googleで検索してみそ
utf8はビット数固定じゃないから嫌いなり
日本語テキストなら UCS2 で十分なんだよね
ごくごく一部の限られた人を除いてだけど
0052デフォルトの名無しさんNGNG
ネットワーク関連でフリーのクラスライブラリとかってあるんでしょうか?
もし何かあれば教えて下さい。
0053デフォルトの名無しさんNGNG
書き忘れました。
環境はLinuxもしくは*BSD*で使えるものを探しています。
0054デフォルトの名無しさんNGNG
>>52
SourceForge を見てみたら?
0055デフォルトの名無しさんNGNG
ちなみにここのエキスパートの人はネットワークの機能を実装するときは、
そういったライブラリ使わないんでしょうか?
Windows以外の場合の話ですが。。
0056デフォルトの名無しさんNGNG
networkでなにをするか、によるのでは。
簡単なことならsocket直で叩くだろうし。
……v6対応があるから、そうでもないかな?
0057デフォルトの名無しさんNGNG
socket直ですか、、、分かりました。
正直、ネットワーク関連のプログラムは初めてなので、
コネクションのプーリング機能なんかを実装したクラスとかが
あればいいなって思ってました。
勉強がてら自分で実装するのがよさそうですね。
0058デフォルトの名無しさんNGNG
コネクションのプーリング機能なんかを実装したクラス
TCPは無理だよね?
0059デフォルトの名無しさんNGNG
プーリングって何?pooling?
具体的に何の為に必要なの?
0060デフォルトの名無しさんNGNG
オブジェクトを何回も生成しないようにじゃない
Cだったら何度もmallocしないようにって事かな?
0061デフォルトの名無しさんNGNG
コネクションをプールするってのは・・・
クライアント側の発想かな
サーバーに対してサービスを要求するのに
わざわざコネクションをはりなおさないって感じかな?
実用的じゃないね
006259NGNG
connectしたソケットをcloseしないでずーっと持っておくの?
だけどTCPって放置したら勝手に切断するんじゃなかったっけ?
0063デフォルトの名無しさんNGNG
>だけどTCPって放置したら勝手に切断するんじゃなかったっけ?
そりゃないっしょ
そうだったら不便だな・・・
0064デフォルトの名無しさんNGNG
>>62
プロトコルによるんじゃない?
0065デフォルトの名無しさんNGNG
近くにあるネットワークスレに聞いた方がいいかな?わらい
0066デフォルトの名無しさんNGNG
>>64
そうだね。
俺の知ってる範囲だと、大抵は自動的に切断する。
つーか、切断される。
0067デフォルトの名無しさんNGNG
>>63
するよー。
RFC読むのはきついから、setsockoptのkeepalive辺りを読んでちょ。
UNIXの仕様じゃなくて、TCPの仕様だよん。

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

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

TCPの仕様なら納得できますが、
書いてあるならどこに書いてあるのか教えていただけませんか?
0072デフォルトの名無しさんNGNG
>>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
ちょと仕様過剰かも知れないので
0073デフォルトの名無しさんNGNG
プリプロセッサの文字列置換に関して質問があります。

#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としてもエラーになるので
困っています。何か良い方法はないでしょうか。
0074デフォルトの名無しさんNGNG
ど,どこでそんな書き方を憶えたのさ?(´Д`)
## を全部削ってみてちょ。
0075デフォルトの名無しさんNGNG
const##type
これは?(自信なし
0076デフォルトの名無しさんNGNG
すいません馬鹿でした↑
007773NGNG
はうっ。
100回死にます…。
007873NGNG
struct _xxx{
 int *elm0, *elm1;
} xxx;

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

hoge = elm(xxx,0);

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

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

関数的オブジェクトに関する詳しい話は「プログラミング言語C++」
に載ってるよ。
0089デフォルトの名無しさんNGNG
>8.1 Persistent Connections
>19.7.1 Compatibility with HTTP/1.0 Persistent Connections
これは関係ないじゃん(笑)
TCPコネクションはったまま
何もしなかったらって話じゃないの?
0090デフォルトの名無しさんNGNG
>>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なんて使いたいのか?
0091デフォルトの名無しさんNGNG
int main()
{
return 0;
}

これはアリですか?
0092デフォルトの名無しさんNGNG
>>91
質問の意図がよくわからんぞぃ。
0093デフォルトの名無しさんNGNG
蟻です。
009473NGNG
>>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%ほどマクロの方が速かった…。
おとなしくテンプレートの方にしておきます。
0095デフォルトの名無しさんNGNG
>>94
なんでSTLのlistを使わない?
下手な車輪を再発明するなよ。
0096デフォルトの名無しさんNGNG
>>95
勉強中なら別にいいんでないの?

仕事で同じことをやるのは痛いけどね
009773NGNG
一番最初にSTLのリストを使って書いたんです。
でイテレータの使い勝手が(慣れてなかったので)悪いなぁと思いながら
じゃあ自分で作ってみようとすったもんだしているうちに、
やっぱりSTLのリストはよくできてるなぁと思うようになった昨今。
もう一度書き直すことになりそうです。
0098デフォルトの名無しさんNGNG
超初心者なのですが、ルート計算を行う関数はどのように定義したらいいのでしょうか。
009998NGNG
>>98
あっ、わかりました。スマソ
010073NGNG
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の要素本体のアドレスは知っているのに、
それをイテレータに直さないといけない点がとても非効率的だと思ったんです。
自前で実装すれば要素の操作はイテレータではなくてリストの上部構造(?)も
含めたアドレスで行えるから、ここで望むような操作が可能だなと。
いじょ。
0101PeFileWrapperNGNG
>>100
途中から読み出したのでアレだけど、
そもそも、ノードの論理的な構造をそのままデータ構造にしようと
しているところに、 list<_edge> edge の必要性を生み出している
原因があるような気がするんだが...。

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


目に見えるものすべてを「実体」として実装しようとするから、
話がややこしくなるのでは?
■ このスレッドは過去ログ倉庫に格納されています