C++相談室2
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNGhttp://www.kuzbass.ru/docs/isocpp/
0002デフォルトの名無しさん
NGNG0003デフォルトの名無しさん
NGNGこれはC++的にはアリなんでしょうか?
class foo
{
public:
int bar;
};
int main( int, char **)
{
foo a;
a = 0xDEADBEEF;
printf( "%08X\n", a);
return 0;
}
0004デフォルトの名無しさん
NGNGメンバ関数の無いクラスは構造体のようなもの。
メモリにべたコピーされてるだけで今のところ
うまくいってるだけ。
0005デフォルトの名無しさん
NGNG良く動いたね。
正しくは、
a.bar = 0x0deadbeef;
ってやった方が良いよ
どう動いてるのか 俺にはさっぱりだ。
ウツダシノウ
0006デフォルトの名無しさん
NGNG=演算子や型変換の演算子も定義してないぞ。。。。
0007デフォルトの名無しさん
NGNG動きませんな。
0008デフォルトの名無しさん
NGNGメンバ関数のあるなしでC++の構造体はメモリ上の配置の仕方がことなるのでしょうか?
Cと同じように構造体が実装されているようには思えないのですが。。
また独習C++を読むと、
classとstructはデフォルトのアクセス指定子が異なるだけ、なんて
書いてあるんですが、これはホントですか?
アセンブラが分からないヘタレですみません。
0009デフォルトの名無しさん
NGNGsamp.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そうです。デフォルトでpublicかprivateかの差だけです。
メモリ上の配置が変るのは、処理系によっても違うかも
しれませんが、仮想関数を持った時に仮想関数テーブル
へのポインタが自動的に追加されます。
0011デフォルトの名無しさん
NGNG"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デフォルトの名無しさん
NGNG0013デフォルトの名無しさん
NGNG続きは?
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↓この顔文字
v(^・^)v
の組み合せはまさに芸術だと思う。
0016デフォルトの名無しさん
NGNG1行目が悪いんじゃないか?
0017デフォルトの名無しさん
NGNG1c1
< #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レスどもっす。
.h の方を使うと内部で暗黙に namespace が有功になってて
外部で再び宣言すると、名前がかぶって ofstream がどっちに
属すのか特定できんって事なんかな。。。
0019STL侍
NGNGいまリストの特定の要素を削除したいのじゃが、
そやつの『アドレスを知っている』場合の処理について
悩んでいるのでござる。それがしはこれまで
イテレータで頭から順繰りに伝って、
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デフォルトの名無しさん
NGNGlist::remove()を使わないで イテレータで自分で回して比較しているのには
何か理由があるのか?
まじめに質問しているのならふざけた口調はやめたほうがいいぞ
0021STL侍
NGNGエセ侍風はお気に召されなかったようで、口調を戻します。
removeを使えばよいという指摘、その通りでした。半分解決です。
自分でイテレータを回して比較していることに意味はありませんでした。
で私の中で未解決の点というのは、removeは値が該当するもの全てを
削除するようなので、結局内部的には全検索しているのですね。
疑問に思ったのは、消したい要素のアドレスが判ってるならば、
その要素をピンポイントで消せる方法があってもいいのに、ということです。
この考え方は変でしょうか。
0022デフォルトの名無しさん
NGNGようにすればいいのでは?
002320
NGNG消したい要素のアドレスがわかってたとして そのアドレスがlistのどこに
あるかは探さなければわからないのは当然じゃない?
要素自体を消したいんじゃなくて 要素を「listから」消したいんでしょ?
0024STL侍
NGNG> そのアドレスがlistのどこにあるかは探さなければ
> わからないのは当然じゃない?
リストって各要素が前後の要素とポインタで繋がれているだけの
単純な構造だと思っていたんですが、これが私のそもそもの誤解かな?
上のように考えていたので、要素を適切に削除するには、
要素のアドレスを知っている場合(該当要素に直接アクセスできる場合)は、
前後の要素についてポインタの繋ぎ変えをした後で、
該当要素のメモリを解放すればそれでおしまい、
つまり要素の前後関係だけが重要だから要素がリストのどこにあるかは
関係ないと思っていたんですが、そんなに単純ではないということでしょうか。
むむむ。
002520
NGNGそのノード自身のアドレスと ノードが参照している中身のアドレスは別物。
0026RIP_MAPIRO
NGNGtemplate <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を考
えるとやりたくない。
0029デフォルトの名無しさん
NGNGSTL じゃないが、格納されるデータ自体にポインタを持たせたコレク
ションの実装として 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デフォルトの名無しさん
NGNG0031デフォルトの名無しさん
NGNG検索エンジンに引っかかったらロボットに向かって文句言うのか?
0032デフォルトの名無しさん
NGNG最新版の日記を見ると、上のほうに「逆リンクを許容できる場合に限り、リンク
はご自由に」と書いてあるよ。
0033デフォルトの名無しさん
NGNGだから使ったことないデス…。
0034デフォルトの名無しさん
NGNGネタ?
本気なら「憂鬱なプログラマのためのオブジェクト指向開発講座」を
買ってきて読みましょう。C++ は言語仕様から勉強するとワケ分から
なくなるが、先にオブジェクト指向の分析・設計手法を勉強して、そ
れを実装に落とすための道具として見ると、簡単に理解できる。
0035デフォルトの名無しさん
NGNG本気で分からんやつは、一度Javaを使ってみるといいかもしれんね。
0036オプションの名無し
NGNG0037デフォルトの名無しさん
NGNGあれ、最近のには書いてないね。
昔は、MLとか掲示板とか不特定多数からアクセスが殺到するような場所に
URLを貼らないで欲しいというようなことが書かれてあったような。
サイト引っ越して環境が変わったからよくなったのかな。ま、もう書いてないからいいや。
0038デフォルトの名無しさん
NGNGかえって意識しにくいと思われ、、、
0039RIP_MAPIRO
NGNGって感じだからかえって混乱するかも。
33は継承パターンを自分で作って動作を追跡すれば理解が
進むと思う。特にディストラクタの virtual 宣言は多態性を
表現する上で重要。
0040デフォルトの名無しさん
NGNGみなさん日本語処理(や文字列処理)ってどうしてますか?
やっぱりAnsiString?
実は日本語コードの変換機能付きのストリングクラスを作ったのですが
一文字ずつ文字を追加する処理が遅くて困ってます。
string += 'A'; <- こんなの。
みなさんの文字列処理のやり方を教えてくださいませ。
0041デフォルトの名無しさん
NGNGどこが遅くなるのか分かりませんが、変換は必要なときだけ
やればイイですよね。
004240
NGNGはい、変換は必要な時だけしかやってません。
遅くなるのは・・・
1、約5000行(380KB)のテキストファイルを読み込んでコードを調べて変換
2、一行ずつに分離して文字列リスト(これも自作のクラス)を作成
3、全部の行から特定のキーワード(約10文字)を検索
って処理をした時に2番目の処理で3秒ぐらいかかってしまいます。
コード変換無しなら一瞬で終わるような処理なんですけどね・・・。
0043デフォルトの名無しさん
NGNGの部分で
>>40 一文字ずつ文字を追加する処理が遅くて困ってます。
という問題があるという話なら
コード変換は全く関係ないと思うんだけど
004440
NGNGまったくおっしゃるとおりです。
実はもう改良済みです。
で、ホントに聞きたいのは「日本語処理ってどうしてます?」ってことです。
もしかして普通は特定の日本語コード決め打ちなのかなぁ?
0045デフォルトの名無しさん
NGNG俺のWindowsプログラムの場合、
内部コードは ShiftJIS か Unicode で持っておいて
ファイル入出力の時に[必要なら]変換…だなぁ。
エディタを作るんでもなけりゃ、あんまり多文字コード対応にしても意味ない気がする。
0046すみません
NGNG引数宣言リストというのは何なのでしょうか?
お願いします
0047デフォルトの名無しさん
NGNGどういう文脈で「引数宣言リスト」という単語が出てきたのかを書いた
方がいいと思うぞ。
0048デフォルトの名無しさん
NGNG日本語EUCとSJISだけでも対応しておくと
フィルタ系のツールなんかで便利だと思うよ。
ソースのフィルタとかさ。
…コード処理出来る人って少なそうだけど。
0049デフォルトの名無しさん
NGNGUTF-8 8 ビット Unicode 変換形式
ってなんですか?
005048
NGNGUCS4を1〜6byteに変換する形式だよ。
0051デフォルトの名無しさん
NGNGgoogleで検索してみそ
utf8はビット数固定じゃないから嫌いなり
日本語テキストなら UCS2 で十分なんだよね
ごくごく一部の限られた人を除いてだけど
0052デフォルトの名無しさん
NGNGもし何かあれば教えて下さい。
0053デフォルトの名無しさん
NGNG環境はLinuxもしくは*BSD*で使えるものを探しています。
0054デフォルトの名無しさん
NGNGSourceForge を見てみたら?
0055デフォルトの名無しさん
NGNGそういったライブラリ使わないんでしょうか?
Windows以外の場合の話ですが。。
0056デフォルトの名無しさん
NGNG簡単なことならsocket直で叩くだろうし。
……v6対応があるから、そうでもないかな?
0057デフォルトの名無しさん
NGNG正直、ネットワーク関連のプログラムは初めてなので、
コネクションのプーリング機能なんかを実装したクラスとかが
あればいいなって思ってました。
勉強がてら自分で実装するのがよさそうですね。
0058デフォルトの名無しさん
NGNGTCPは無理だよね?
0059デフォルトの名無しさん
NGNG具体的に何の為に必要なの?
0060デフォルトの名無しさん
NGNGCだったら何度もmallocしないようにって事かな?
0061デフォルトの名無しさん
NGNGクライアント側の発想かな
サーバーに対してサービスを要求するのに
わざわざコネクションをはりなおさないって感じかな?
実用的じゃないね
006259
NGNGだけどTCPって放置したら勝手に切断するんじゃなかったっけ?
0063デフォルトの名無しさん
NGNGそりゃないっしょ
そうだったら不便だな・・・
0064デフォルトの名無しさん
NGNGプロトコルによるんじゃない?
0065デフォルトの名無しさん
NGNG0066デフォルトの名無しさん
NGNGそうだね。
俺の知ってる範囲だと、大抵は自動的に切断する。
つーか、切断される。
0067デフォルトの名無しさん
NGNGするよー。
RFC読むのはきついから、setsockoptのkeepalive辺りを読んでちょ。
UNIXの仕様じゃなくて、TCPの仕様だよん。
Solaris辺りはndd(1M)で変更可能。
*BSDやLinuxはシリアスな用途に使ってないから知らん。
0068デフォルトの名無しさん
NGNGHTTP1.1
0069デフォルトの名無しさん
NGNGサーバーによる、だと思う
けど、サーバーによって切ったり切られなかったりって
当たり前すぎる話に帰結してしまう
0070デフォルトの名無しさん
NGNG> プロトコルじゃなくて
ってなんだ?TCPやHTTP 1.1の仕様読んだ事あるか?
0071デフォルトの名無しさん
NGNGHTTP1.1では、
応答が何秒以上なければ、
コネクションを切る事
なんて書いてあるんでしょうか?
TCPの仕様なら納得できますが、
書いてあるならどこに書いてあるのか教えていただけませんか?
0072デフォルトの名無しさん
NGNG8.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これは?(自信なし
0076デフォルトの名無しさん
NGNG007773
NGNG100回死にます…。
007873
NGNGint *elm0, *elm1;
} xxx;
#define elm(a,b) (*(a->elm##b))
hoge = elm(xxx,0);
ずっと↑みたいな使い方をしていたので前後不覚になりました。
007973
NGNGお礼を忘れてました。74さんありがとう。
008074
NGNG練習したですか?
0081デフォルトの名無しさん
NGNG何故templateを使わん?
0083デフォルトの名無しさん
NGNGでは、さっそくtemplateに書き換えるのだ。
0084デフォルトの名無しさん
NGNG0085デフォルトの名無しさん
NGNG0086デフォルトの名無しさん
NGNGC++だとI/O manipulatorみたいなやつのことだろ?
どんな文脈で出てきたの?
0087デフォルトの名無しさん
NGNGextern ostream& endl(ostream& outs);
0088デフォルトの名無しさん
NGNGそうじゃなくて <functional> にあるような、operator() を定義し
てあるクラスのことだと思うが。<algorithm> で定義してある汎用ア
ルゴリズムと組み合わせて使ったりする。
関数的オブジェクトに関する詳しい話は「プログラミング言語C++」
に載ってるよ。
0089デフォルトの名無しさん
NGNG>19.7.1 Compatibility with HTTP/1.0 Persistent Connections
これは関係ないじゃん(笑)
TCPコネクションはったまま
何もしなかったらって話じゃないの?
0090デフォルトの名無しさん
NGNGとりあえず、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{
return 0;
}
これはアリですか?
0092デフォルトの名無しさん
NGNG質問の意図がよくわからんぞぃ。
0093デフォルトの名無しさん
NGNG009473
NGNGいま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なんでSTLのlistを使わない?
下手な車輪を再発明するなよ。
0096デフォルトの名無しさん
NGNG勉強中なら別にいいんでないの?
仕事で同じことをやるのは痛いけどね
009773
NGNGでイテレータの使い勝手が(慣れてなかったので)悪いなぁと思いながら
じゃあ自分で作ってみようとすったもんだしているうちに、
やっぱりSTLのリストはよくできてるなぁと思うようになった昨今。
もう一度書き直すことになりそうです。
0098デフォルトの名無しさん
NGNG010073
NGNG本当の理由をようやく思い出した。(すごい回り道だ…)
長くなるけど、時間があったら何か指摘してもらえればうれしいっす。
例えば
−□−□−□−□−□−□−□−□−
↑ ↑
リンク ノード
(エッジ)
という構造を作りたいとき(ノードが持つリンクは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の要素本体のアドレスは知っているのに、
それをイテレータに直さないといけない点がとても非効率的だと思ったんです。
自前で実装すれば要素の操作はイテレータではなくてリストの上部構造(?)も
含めたアドレスで行えるから、ここで望むような操作が可能だなと。
いじょ。
0101PeFileWrapper
NGNG途中から読み出したのでアレだけど、
そもそも、ノードの論理的な構造をそのままデータ構造にしようと
しているところに、 list<_edge> edge の必要性を生み出している
原因があるような気がするんだが...。
要は、 list<_edge> edge をどうするか…でしょ?
漏れなら、単に _node の可変長配列を(テンプレート)クラスにして、
ノード間のつながりは隣接点行列を作るなりして仮想化させると思うな。
目に見えるものすべてを「実体」として実装しようとするから、
話がややこしくなるのでは?
■ このスレッドは過去ログ倉庫に格納されています