C++相談室2
レス数が1000を超えています。これ以上書き込みはできません。
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 の可変長配列を(テンプレート)クラスにして、
ノード間のつながりは隣接点行列を作るなりして仮想化させると思うな。
目に見えるものすべてを「実体」として実装しようとするから、
話がややこしくなるのでは?
0102デフォルトの名無しさん
NGNGのようにするのは駄目なの?
010373
NGNG>>101
>漏れなら、単に _node の可変長配列を(テンプレート)クラスにして、
>ノード間のつながりは隣接点行列を作るなりして仮想化させると思うな。
当初は
// ノード
class _node{
list<_node*> link; // 隣接ノードへのリンク
};
のように実装していました。これが>>101で言わんとすることかな。
(というのを前提に話を進めると)
そうすると、例えばリンクを描画するときにn0→n1とn1→n0という
同じリンクを2重に描画することになっちゃうのがイヤンだったのです。
もちろん描画済みか否かの条件文を入れればいいんだけど、
要素の数が増えてくると計算速度に結構効いてくるので
リンクの別体(実体)を考えて重複をなくそうとしたのです。
答になってるかな…。
>>102
駄目な気がする。理由は…ぅぅ頭が割れそうだ…。
0104sage
NGNGpublic:
virtual draw();
};
class link : public objs {
node *pnode[2];
public
draw();
};
class node : public obj {
list<link*> linklist;
public
draw();
};
list<obj*> objects;
こういうこと?
0105101
NGNGあぁ、なるほど、リンクを描画したいわけね。それも効率よく。
計算するのが何なのかわからずに書いてしまうけど、
ノードを可変長配列として実現しておいて、
あらかじめ隣接点行列 bool isConnected[length][length] を
準備しておくと、
for (i=0;i<length-1;++i){
for (j=i+1;j<length;++j) {
if (isConnected[i][j]) {
(計算とか);
(描画とか);
}
}
}
で、できるような気がするんだけど。
010673
NGNGこの場合、ノードがリンク先をサーチしようとするときに、
『リンクの両端を見た上で自分じゃない方が相手』、
という余計な判断が入るから少しうれしくないです。
>>105
いま書いてるのは1000個以上のノードがバネ(=リンク:1000〜2000本)
で繋がれてグリングリン動くプログラムなんだけど、
隣接点行列でやると数十倍遅くなってしまうです…。
いまのところはノード数10000、リンク数10000(リング状)の
ばねアニメーションがFPS30ちょいで動いてます。
0107105
NGNG> 隣接点行列でやると数十倍遅くなってしまうです…。
ふぅ〜ん、そういうもんかなぁ..。
力になれなかったな。スマソ。
0108sage
NGNGいや、もうちょっとコード見てくれよ..
s/objs/obj/g
011073
NGNG特定のノードが持つリンクの相手をできるだけ高速にサーチしたいです。
この繋ぎ変えの処理に関しては>>101にあった方法が一番速いんだけど、
同時に高速に描画も行おうとするとまたトレードオフが出てくるです。
ちなみに今リンクの本数をL、ノード数Nとすると、
存在し得る最大リンク数N(N-1)/2に比べてLが圧倒的に小さい条件(L∝N)で
やってるです。隣接点行列で判断すると計算時間はL∝N^2になるので
おいらがやってる条件に限って言えばキツイということです。
0111デフォルトの名無しさん
01/08/28 22:42ID:upwimQHIdomain_errorって何なんでしょうか?
どんな関数が投げるものなんでしょうか?
0112デフォルトの名無しさん
01/08/29 20:34ID:QWMYzaCIよくわからんけど、参照カウンタ付きのProxyをCompositeパターンで
リンクすればいいのではないの?
俺が勘違いしているかも知れんけど、それはともかくとしても、
73の設計にはオブジェクト指向の香りがしないよ。
デザインパターンの本をよく読むことをおすすめする。
0113名無し
01/08/30 02:00ID:1nQFo/p2重複しない走査を実現するための特別な構造が
必要で、リストでは駄目ということなのでは。
自分で「サーチ」と言っているし。
0114デフォルトの名無しさん
01/08/30 02:09ID:1YbMhqvEこれってexceptionでlogic_errorなdomain_errorのこと?
0115デフォルトの名無しさん
01/08/30 13:24ID:msKDCwikそうです。
0116デフォルトの名無しさん
01/09/05 23:10ID:5S9xtZF20117デフォルトの名無しさん
01/09/05 23:16ID:pPFDzhN.0118デフォルトの名無しさん
NGNG0119デフォルトの名無しさん
NGNGlogic_error自体は、引数チェックみたいな「runtimeじゃない」
例外のための基底クラス。
ある関数を呼び出すとする。
runtimeじゃないっていうのは、プログラミングをしている
時点で例外が起こらないように、関数の呼び出し側で
コントロールできるってこと。
runtimeエラーの代表的なものにout_of_memoryがあるわけだが、
ある関数を呼び出すのに、out_of_memoryにならないように、
っていうのは「プログラミングの時点では」コントロールできない。
だからruntime。で、logic_errorはそうじゃないやつ。
domain_errorってのは、length_errorとかout_of_range_error
とか、invalid_argumentではない、ソフトウェアの「対象ドメイン
特有の事前条件」に違反した場合に投げるべき例外。
基底クラスとして用意されているだけで、標準ライブラリの
中を捜しても多分使ってるところはないのだと思う。
下手な説明でスマソがわかる?
0120デフォルトの名無しさん
NGNG0121111=115
NGNGええと、、実はexceptionなやつのほとんどが
いまいちよくわかっていないのですが…。
logic_errorはちゃんとやってれば防げるはずのエラー?
runtime_errorは、メモリ不足とか、ファイルが無かった、
などの時に投げるのでしょうか。。
domain_errorはlength_errorとかに当てはまらない
logic_errorのときに投げることになるのでしょうか?
あと、基底クラスとして用意されているだけということは、
domain_errorはそのまま投げないで、domain_errorを
継承したクラスを投げたほうが良いのでしょうか?
それから、range_errorとout_of_rangeの
違いがいまいち分かりませんです…。
logicかruntimeかの違いでしょうか…?
0122119
NGNG漏れの解釈では、out_of_rangeは添え字の範囲外エラーの類、
range_errorは、オーバフロー、アンダーフローの類だと思っていた。
(10まで入れていい数字で11というような値そのもののエラー)
考えて見れば根拠を示せない(鬱
> domain_errorはそのまま投げないで、domain_errorを
> 継承したクラスを投げたほうが良いのでしょうか?
標準例外自体、全てがexceptionから派生している、
というわけではないから、標準ライブラリのユーザーに
Javaのようなやり方を推奨しているわけではないと
考えている。
domain_error自体、インスタンスを作ることが認められていない
わけではないからそこをどうするかは、個々のプログラムでの
設計上の判断次第だと思う。
継承することによって、設計上の利点があるならば、、だ。
漏れはポリモーフィックに扱う必要がない場合は、極力継承は
使いたくないが。
0123デフォルトの名無しさん
NGNGC++を学習してるのですが、
コードを書いてみようとVC++を使ってやってみたのですが、
BOOLとかstringとかが使えません。
こういったものを使えるようにするには何をインクルードする
必要があるのでしょうか?iostream.hじゃだめなんですかね。
string.hをインクルードしても標準ライブラリのstringが使え
ないし・・。
0124デフォルトの名無しさん
NGNG#include<windows.h>
#include<iostream>
#include<string>
namespace using std;
0125123
NGNGレスどうもです。いまからやってみます。
ところでwindows.hは何のためですか?
0126123
NGNGiostreamやstringは確かに本とかでは.hついてないのですが、
つけないと開けないというエラーがでます。で、付けてコンパイル
すると
構文エラーusing
string 定義されてない識別子です
などが出ます。ちなみにこんな感じで書きました。
#include <iostream.h>
#include <string.h>
#include <windows.h>
namespace using std;
void main()
{
string a;
}
なんででしょう。
0127デフォルトの名無しさん
NGNG0128デフォルトの名無しさん
NGNGじゃないのか?
ちなみにBOOL型はWindows固有の型。
C++汎用のはbool。
0129デフォルトの名無しさん
NGNGC++なら標準はBOOLでなくてbool
0130129
NGNG0131デフォルトの名無しさん
NGNGあげるから、基本からやり直すこと!!>1
0132デフォルトの名無しさん
NGNG0133123
NGNGにしてみると、
'std':存在しないか名前空間ではありません。
と出ました。
なんでやねん・・・。
標準のC++やりたいだけなのに・・・。
boolすら使えません。
0134123
NGNGそれらはstdとか使わなくても使えるンですが・・・。
iostream.hを取りこむだけで。
0135デフォルトの名無しさん
NGNG#include <string>
using namespace std;
int main()
{
string a;
return0;
}
まずは一通り、「最近発売された」 C++ の参考書を読むことをおすすめする。
90 年代後半に大きく C++ の規格が変わってるから。
0136通行人
NGNG#include <iostream>
using namespace std;
int main(){
string s = "Hello, World!\n";
cout << s << endl;
return 0;
}
たったこれだけ貼り付けても動かんか?BCCではOK。VCは知らん
0137通行人
NGNG0138123
NGNG私が使ってるVC++がおもいっきり古いからでしょうかね・・・。
4.0です(藁。
実際、コードを書いてくださった方のをそのまま貼り付けても
だめでした。なにせ#include<string>の時点でダメなんです
から(藁。.hを付けないとダメなのでおかしいとは思っていま
したが。今のVC++の最新は7ぐらいっすかね。買ってこないと。
0139デフォルトの名無しさん
NGNGもうちょっとレベルアップしてからの方がありがたみがわかる
0140デフォルトの名無しさん
NGNGnestしたtemplateとか書けないけどな、gccはまだ。
0141デフォルトの名無しさん
NGNGそこには視点とか、カメラ位置とかそういうメンバがあって、
でカメラの変換行列とかをGetするメソッドがあってって感じなんだけど、
それで、あるスコープでインスタンス作って、位置とか設定してカメラの行列
ゲットして3次元計算して、ってやるのはいいんだけど、
その他のスコープにいったら、またインスタンス作って位置とか視点とか
設定しなおしになるよね。
こういうときはグローバルにインスタンス作ればいいの?
でもなんかそれきもちわるい。
というかそもそも設計がおかしいの?
誰か教えてください。
0142デフォルトの名無しさん
NGNGVCがいいならMSから.Net framework SDK落とすか
gccでも使うかBCCにするか好きなのにすれ、全部ただだ
0144デフォルトの名無しさん
NGNGカメラ位置って3次元ベクトルです。
視点(フォーカス)も同様に3次元ベクトルです。
それをクラスにするのでしょうか。
どういうことでしょう。
私がよくわかってないのかもしれません。
別クラスにしたとして、グローバルに持っとけばいいのですか?
というか、そこが一番ききたいところなのです。
他のスコープでも扱うものをどうしたら良いのかというところが。
0145デフォルトの名無しさん
NGNGイニシャライザに可変個引数を渡すのってどうやるんでしょうか?
B::B(char *format, ...) : A(format, ...) {}
こんな感じでやってみたんですがやっぱりだめでした・・・。
0146デフォルトの名無しさん
NGNG可変個引数を使ってどうしたいかの方に興味がアリマス。
0147注某厨房
NGNGCをある程度理解してからC++に入ったほうがやりやすいでしょうか。
それとも、余計なこと考えずにC++入ったほうがすんなりいくものでしょうか。
個人的見解で充分ですので、ご鞭撻を。
0148デフォルトの名無しさん
NGNG手段なんかどうでもいいから、
何か作れ
作りたいものがなにも無いってんなら、
やめろ
0149デフォルトの名無しさん
NGNGC を理解することはコンピュータの原理を理解することに限りなく近いです。
どちらかというと C++ はその原理を覆い隠すようなとても「便利」な
仕組みがいっぱいあります。しかしながら C++ は便利すぎて、
その「仕組み」を 100% 使うには膨大な勉強と経験が必要です。
したがってお勧めとしては、まず C でコンピュータの仕組みを理解し、
その後で Java で C++ の基礎となる概念を学び、
そして C++ もしくは C# を学習するのが良いと思います。
とは言え何よりも大事なことは、>>148 さんも言ってるように、
作りたいことは何か? ということです。
作りたいものがあり、それを作るのに適した言語を選べるくらいになれば、
とても幸せなプログラマ生活が待ってるでしょう。
「作りたいものは何か」、これを大事にしてくださいね。
0150デフォルトの名無しさん
NGNG0151デフォルトの名無しさん
NGNG決してC++やCなどに戻ることはできない。
C#は似てるから、強制力があれば可能かもしれない。
0152デフォルトの名無しさん
NGNG0153123
NGNGSDKって何の奴ですか?
0154デフォルトの名無しさん
NGNGコンパイラのエラーにヘルプがついてるのを知ってるか?
当然十分な情報がるわけではないが、チェックすべきだぞ。
アウトプットウィンドウのメッセージだけ見たところで止まってないか?
CXXXX:の番号のところを選択してF1キー押すか、ヘルプのキーワードに
番号いれてみ。
0155注某厨房
NGNG今のところ、最終的にはVC++で自分向きの
ファイラーを作りたいと思っています。
けど、どうせやるのなら基礎からの方がいいかなと思って。
過去にも何度かやろうかと思ったことはあったのですが、
今回は腹をくくってますのでやる気だけはあります。
# もっとも、できるかどうか自信はないですが(汗
出来ればエディタも作ってみたいと思っていますが、
既存のフリーソフトとかのレベルまで追いつけるかどうか(汗
# 学習の一つとしては作ってみるかもしれませんが。
>>149
なるほど。なんとなくCやってから方がいい気はしてました。
皆さんの言う通り、以前にJAVAに手を出そうとして
やりたいことが無いのに気付いて、結局何もしなかったのと、
過去ログ(このスレに限らず)を見て目標は大事だと思いました。
>>151
危なかったッス(w
ありがとうございます。
0156デフォルトの名無しさん
NGNG>C を理解することはコンピュータの原理を理解することに限りなく近いです。
それ言い過ぎと違う?
C学んだら、コンピュータの原理なんて理解できるかなあ。
せいぜいメモリ、CPUの割り込みとかぐらい?
それとも俺がバカ?
0157デフォルトの名無しさん
NGNGプロセスごとの境界はあるにしてもね。
VBとかスクリプトじゃ永遠にそういう考えには
いたらないな。
0158デフォルトの名無しさん
NGNGコンピュータじゃなくて。
0160デフォルトの名無しさん
NGNG私は、グローバルにインスタンス作ってやっています。
確かになんかいやですね。
私も初心者なのでよくわかっていませんが。
私も知りたいです。どなたか教えてください。
0161デフォルトの名無しさん
NGNG>>149は哀れな勘違いだろ。
ALU内部で乗算・除算処理がどう行われているかを理解するのと
Cとかの高級言語を理解するのは全く別だからな。
そもそも149はCMOSの仕組みについて分かっているのか?
オーバークロックとかのたまって、規定よりも高い電圧をCPUにかけている
ドキュソじゃないだろうな(w
0162デフォルトの名無しさん
NGNGグローバルで確保するにはどうしたら良いんですか?
#include"zisaku.h"
someclass *pt;
pt = new someclass;
グローバルで宣言するとエラーが出てしまいます。
他のクラスや関数内ではエラーがでません。
どうしてグローバルだとエラーが出てしまうのでしょうか?
0163デフォルトの名無しさん
NGNG今の設計でも、その[位置]とか[視点]とかの情報はローカルスコープ外に
持たせてるんでそ?それと同じところで[カメラ]も管理すればいいんでないの?
どんなゲームやらわからんのでなんとも言えないけど、キャラクタ毎に持つなり
シーン毎に持つなりレンダリング用のクラスが持つなり。
0164デフォルトの名無しさん
NGNGグローバルスコープには制御構文を書けない。
0165デフォルトの名無しさん
NGNGありがとうございます
pt = new someclassが駄目だったんですね
基本的な質問で申し訳ありませんでした
0166123
NGNGそういうやり方があったんですねぇ・・・なるほど。
でも、今回の原因は私のVC++が古いためであると思われます。
仕様がけっこう変わったんですね・・・。
新しいコンパイラ買わないと。
でも金かかるんでしょうね、はぁ。
0167154
NGNGVC++5.0でエラーでてるソースがVC++6.0で通ったり(vv
「それでいいのか、おい?」って。
0168デフォルトの名無しさん
NGNG#include <string.h>
#include <iostream.h>
int main(){
string s = "Hello, World!\n";
cout << s << endl;
return 0;
}
0169デフォルトの名無しさん
NGNGもしかして、カメラだけ特別扱い?
Worldを頂点とする、オブジェクトツリーの中の、
1つのオブジェクトとして定義するのが普通では?
逆行列さえ求められれば、どんなオブジェクトもカメラになりえるし。
0170141
NGNGアー、参考になります。
確かにレンダリング用のクラスでカメラクラスのインスタンス持っとけばいいな。
位置とか視点とかはカメラクラスのメンバです。
どんなゲームでどうこう、というよりも、
一般的な座標変換のことです。
>>169
あー、それも参考になるなあ。
カメラクラスって言うのが不自然なのかなあ。
0171デフォルトの名無しさん
NGNG----
#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>も知れ。
0172デフォルトの名無しさん
NGNG本題とずれるが operator=() 呼び出すより、コンストラクタに引数
渡したほうが良くないか?
string s = "Hello, World!";
string s("Hello, World!");
0173123
NGNG>>171
コンパイルしましたが、全滅です^^;。
上にも書きましたが
#include<iostream>
#include<string>
はだめで、.hを付けないとファイルをオープンできません。
それとstring.hをとりこんでもstring宣言すると、stringは定義
されてない識別子というエラーになります。
using namespace std;
とすると、stdは存在しないか名前空間ではないとエラーがでます。
これはコンパイラが古いせいで、解決法は無いと思われます。
0174デフォルトの名無しさん
NGNGVC4.0って、STL付いてるの?
iostreamだけじゃないの?
0175デフォルトの名無しさん
NGNG4.0に対応してるかはしらないけど、
ここで落すべし。
string.hは、cのヘッダだろ(藁
0176123
NGNG0177デフォルトの名無しさん
NGNGこの場合はoperator=呼ばれないんじゃないの?
代入じゃなくて初期化として扱われると思ってたけど。。
>>173 >>174 >>175
入ってないものは仕方ないな。VC++のヘッダディレクトリ見て、
存在してなかったらコンパイラがどうとかいう必要ないな。
stlportは、本家よりいいという噂もあるしな。
漏れは、Plaugerのソースが性に合ってるが。
0178デフォルトの名無しさん
NGNGchar a = 'a';
cout << int(a); //文字じゃなくて数値を表示
このint(?)は何ですか?マクロかなんかですか?
それとこの場合、(int)aのようにキャストしても大丈夫みたいですが、
int(a)と(int)aの違いは何ですか?
0179デフォルトの名無しさん
NGNGint(a)はC++固有のキャスト構文
(int)aでも問題ないけど。
詳しくは参考書読み返して
0180デフォルトの名無しさん
NGNGマクロっていうよりは演算子。
Cでは使えなかったかも、ってのとポインタへ型への変換
には使えない、ってのが違うはず。効果は同じだと思うが。
static_cast<int>(a)とかの方が好きだが。
0181180
NGNG0182デフォルトの名無しさん
NGNG177 が正解。
0184178
NGNG>>180
そうですか。ありがとうございます。
しかし、違いがポインタ型への型変換ができないということだけなら、
最初からキャストがあるわけなので、意味が無いように思える
のですがね。なんでC++でこんなの作ったんでしょうかね。
まあいいけど。
0185デフォルトの名無しさん
NGNGあれってコンストラクタの構文と同じだよね。
C++(の作者)的には、コンストラクタとキャストを同一視したかったのだと思う。
ある型の値を与えられて「それと同等だけど別の型の」ものを生成するってのは
コンストラクタ(の使われカタの一部)とキャストとは似てるので。
で、そうしたまではいいが、hogehoge*みたいなメタ型に構文的に適用不可能という辺りが、間抜けだ。
ポインタ型への変換に使えないんじゃなくて、「1単語で表現できない型」に使えないんじゃなかったっけ?
だからたとえば、ポインタだってtypedefしとけば、その別名でtype()なキャストがやれる。
すげーどうでもいいが、Pascal/Delphiはこの構文だ。
Pascalはhoge*みたいな1語で表現できない型を使うのを許してない
(ほぼ常にtypedef相当を書かないとならない:だから面倒(藁))
ので、これで問題ないわけね。
0186デフォルトの名無しさん
NGNGtypedefしてればポインタ型もOK。*が構文中に使えないだけ。
typedef int* pint;
pint pi = pint(&i);
0187デフォルトの名無しさん
NGNG例えば192MBのメモリがあったら192MB全部確保しちゃうの?
でもそれ、できなくない?
0188デフォルトの名無しさん
NGNG0189デフォルトの名無しさん
NGNG0190デフォルトの名無しさん
NGNGdynamic_cast<>
reinterpret_cast<>
const_cast<>
あとなんかあったっけ?
誰か、これらの違いをわかりやすく説明してよ。
それぞれどういう場面で使うのかも。
0191デフォルトの名無しさん
NGNG0192190
NGNGつまんないネタで悪かった。
0193デフォルトの名無しさん
NGNGこのうち使い分けが微妙なのは 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
0194デフォルトの名無しさん
NGNGJavaのキャストと同じ
・const_cast<>
const指定を除去する。型変換はできない。
・static_cast<>
dynamic_cast<>の逆をする。
・reinterpret_cast<>
Cのキャストと同じ。危険物。
あってる?
0195190
NGNGありがとう。そこ面白かった。
static_cast<T> では operator T() が呼ばれることがあるけど、
reinterpret_cast<T> では常にビットパターンそのまま
ていうのが決定的な違いなのかにゃ?
>>194
君も 193 のリンク先を呼んだ方がいいぞ(藁
0196180
NGNGついでだから漏れも質問。
struct HogeImpl; // class HogeImpl
struct Hoge{
HogeImpl* _pimpl;
};
ってやった場合、先行宣言でstruct/classにしてしまった場合、
HogeImplにテンプレートインスタンスな構造体/クラスを使えない
ようなのだが、これって回避可能?
コンパイラはVC++5.0/6.0あたりなんだけど。
やりたいことは、DLLの外側にテンプレートインスタンスな
クラス/構造体を出したくないから、何かかぶせよう、って
ことなのだけど、これはC++スレ本来からは外れる気がするので
とりあえず、最初の疑問のみ回答キボンヌ。
0197デフォルトの名無しさん
NGNG宣言の仕方が悪いだけのような気もするが...。
0198デフォルトの名無しさん
NGNGあれって何の意味があるんでしょうか。
例えば
enum e{ a=1, b=3, c=5, d=9};
の場合、上限は15で下限は0ですよね?
この上下限て何かに役に立つのですか?
それと、列挙値に負数が含まれる場合の下限値の計算方法を
教えてください。
0199デフォルトの名無しさん
NGNG列挙型ってintでしょ
0200デフォルトの名無しさん
NGNGHogeImpl には純粋仮想関数だけ持たせておいて、
template <typename T>
class Foo : public HogeImpl
{
};
で、良いんじゃない?
0201デフォルトの名無しさん
NGNGが何言ってるのか分からないのは俺だけか
0202196
NGNGサンクス。いや、実際今のところそんな感じにはなってるんだ。
結局typedefとかではダメで、サブクラス化が必要なのかぁ、、
素直に通らないのにはなんか理由があるのかなぁ、
というより漏れがやろうとしていることの方が素直じゃないんだね。。
structテンプレートの変数が全部解決されたら、それは
もうstructだろう、と漏れはいいたいのだが。
なんかできそうな気がするんだけど。
>>197 正しい宣言のしかたキボン。
0203デフォルトの名無しさん
NGNG設計上ビットサイズが意味をもつ場合には、なんか使い途
があるのかもね。でもenumの使い方としてはやや本筋を
外れるかもしれない。
少し長いがプログラミング言語C++ 第3版 日本語訳から、、
--
列挙子は、整数データ型の定数式により初期設定できる。
列挙の上限は、列挙に含まれるすえての列挙子の値よりも
大きい2の累乗値マイナス1の中で最も小さい場合である。
列挙の下限は、列挙子の最小値が負数でない場合には0、
列挙子の最小値が負数の場合には、それより小さい
2の累乗値プラス1の中で最も大きい値である。
これは、列挙の値を保持できる最小のビットフィールド
のサイズである。
0204198
NGNGビットサイズはenumの設定値によって違うということですかね・・・。
それと
>列挙子の最小値が負数の場合には、それより小さい
>2の累乗値プラス1の中で最も大きい値である。
の部分ですが、私はアホなのでよくわからんのですが、
例えば最小値が−10だったらどういう計算になるのでしょう?
最大値の方はわかるのですが・・・。
0205デフォルトの名無しさん
NGNGo[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;
}
0206デフォルトの名無しさん
NGNGo[i]が、A&なんじゃないの?
0207デフォルトの名無しさん
NGNGo->hoge();でいけるんですが。
配列だと参照になっちゃうんdすか?
0208デフォルトの名無しさん
NGNGoperator[]使った時点でderefされてるのが普通だと思えるよ。
たしかにoperator new[]はvoid*返すんだけど。
int* a; でa[i]ならポインタでなくてint値が返るだろ?
o->hogeの配列版は(o+i)->hoge()じゃない?
0209デフォルトの名無しさん
NGNGo は A の配列 (配列の名前)
o[i] は A 型のオブジェクト
だからメソッドを呼ぶときは o[i].hoge() でいい。
A * o = new A; だと
o は A 型のオブジェクトへのポインタ
だから o->hoge() でメソッドを呼ぶ
0210205
NGNG0211初心者です
NGNGCでmallocとかでメモリを確保した後、きちんとfreeしてあげないとだめなんですか?
すごくめんどくさくて別に問題ないのならやりたくないんだけど。
ちなみにOSはLinuxです。
教えてください。
0212デフォルトの名無しさん
NGNGC++ じゃなくて 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
0213デフォルトの名無しさん
NGNG>>212の手段の他に、処理系依存だけどallocaってのがある。
(処理系依存といってもほとんどの処理系に存在する)
これはスタック領域を使うんで、開放は必要無い。
でも呼び出せる場所に制限があるかも知れない。
システムに要求を出すわけではないから、
mallocより多少効率が良いかも知れない。
関数を抜けると開放されるので、永続的な用途には向かない。
0214デフォルトの名無しさん
NGNG>>210はネタのような気がするが
0215デフォルトの名無しさん
NGNG>>211-212
0216デフォルトの名無しさん
NGNGVB野郎なんじゃないの?
0217超初心者
NGNGC++のスレッドと知らず書き込んでしまいました。
すみません。
212,213さんありがとうございます。
free()の意味がわかりました。
さんきゅーです。
ちなみにこれはネタじゃないんです。
本当に超初心者なだけです。
0218小町算
NGNG#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を表示させないようにするにはどうしたらよいですか
おしえてください。お願いします。
0219デフォルトの名無しさん
NGNG整数を保存するリストに対し,
その順序を反転する関数を作成せよ。という問題なのですが、
これって各ノードを図であらわしたときの矢印の向きを変えろ,
と言っているようなものなのですか?
宜しくお願い致します、、、
0220デフォルトの名無しさん
NGNG双方向リストなら、書く量が少なくていいね
単方向でも、ルート不要なら、再帰で書くと
少ない努力でできるかな
なんでも定番は同じだね
0221デフォルトの名無しさん
NGNG0222デフォルトの名無しさん
NGNG0223デフォルトの名無しさん
NGNG自分で組むのは、STLで使えるようになってからでもいいじゃん。
問題出すほうがわかってないのかもよ。
0224デフォルトの名無しさん
NGNG派生クラスから基底クラスへのprotectedだったら見えると思ったんだけど、
下のコード、コンパイラ通らないです。
基底クラスへの参照は無理なの?
教えてください。
class A
{
protected:
int xxx;
};
class B : public A
{
void func(A* ptr);
};
void B::func(A* ptr)
{
cout << ptr->xxx;
}
0225デフォルトの名無しさん
NGNG{
protected:
int xxx;
};
class B : public A
{
public:
void func();
};
void B::func()
{
cout << xxx;
}
void main(void)
{
B b;
b.func();
}
こうじゃなくて?
0226_
NGNG何が悪いのでしょうか?
ファイルA
namespace a
class A{
friend class B;
int i
};
};
ファイルB
#include "ファイルA"
using namespace a;
class B : public A{
B(){
i = 1; // ←privateメンバにアクセス出来ないとエラー。
}
};
0227デフォルトの名無しさん
NGNGあ、クラスAを継承してるクラスが他にもあったりするので、
基底クラスであるクラスAに対して行いたいのです。
0228デフォルトの名無しさん
NGNGnamespace a {
class A{
friend class ::B;
int i ;
}; };
0229226
NGNGそれでうまくいきました。
でもnamespaceを使う前は、プロトタイプ宣言無しでもいけてました。
それに複数のファイル間で同じnamespace名を使うとエラーが出まくります。
疑問だらけなんで、もうちょっと勉強してみます。
ありごとうございました。
0230226
NGNGC++ってやっぱ難しい!
0231219
NGNG長いので2chに書くのを控えたのですが、
http://members.tripod.co.jp/giriam2001/c.html
のプログラムを参考にして解けというものなのです。
全く糸口さえわからないのですが、、、、、
0232デフォルトの名無しさん
NGNG0233デフォルトの名無しさん
NGNG0234デフォルトの名無しさん
NGNG氏ね
0235デフォルトの名無しさん
NGNG0236デフォルトの名無しさん
NGNGのコードはBの基本クラス要素ptrを見てるんじゃなくて、新しい別のクラスAのptrを見ているよ。だから、*ptrには何も入っていないからcoutにNULLが渡されて、エラーがでてるんじゃない?
0237デフォルトの名無しさん
NGNGその答えは思いっきり外してるぞ。
0238236
NGNGNULLが渡されたからエラーがでる。。
てことでOKだよね
0239デフォルトの名無しさん
NGNGいや、そもそもコンパイルエラーが出るって話だろ…?
呼び出し側のコード見ないとなんとも言えないが func( NULL ) なんて呼び方してるとも思えんし。
つーか、解決 >>230 してるんだよね。(^^;
0240236
NGNG0241デフォルトの名無しさん
NGNG前半は合ってるけど後半が違う。
>新しい別のクラスAのptrを見ている
から他人の保護メンバ xxx にアクセスできんということだ。
0242デフォルトの名無しさん
NGNGリンク先のソースに付け加えるとしたらこんな感じか。
//要素の順序を逆にして新たな先頭ノード(旧末尾ノード)へのポインタを返す
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;
}
0243236
NGNGその通りでした。一番肝心なこと忘れてたYO。
まだまだっす勉強します。
0244デフォルトの名無しさん
NGNG0245デフォルトの名無しさん
NGNGべつのオブジェクトのprotectedメンバにアクセスでき
るんだっけ?
protectedって単に継承したときに基底クラスのメンバ
をどのように扱えるかを決める物じゃないんすか?
0246デフォルトの名無しさん
NGNGハァ?
0247デフォルトの名無しさん
NGNG正解。
0248デフォルトの名無しさん
NGNG>protectedって単に継承したときに基底クラスのメンバ
>をどのように扱えるかを決める物じゃないんすか?
意味不明。
0249デフォルトの名無しさん
NGNGprotectedなど、アクセス制限は適用されるか?ってことか。
おいらもよくわからん。
誰か調べて。
0250デフォルトの名無しさん
NGNGclass pee{
protected:
int tinkasu;
public:
void peeing(pee p){tinkasu=p.tinkasu;}
};
int main(){
pee p1,p2;
p1.peeing(p2);
return 0;
}
こういうこと?
0252デフォルトの名無しさん
NGNGそうなんですか。勉強になりました。
Javaのprotectedとは意味が違うんですね。
C++では同じクラス同士のみで参照したいメンバは
作れないんですか?
0253デフォルトの名無しさん
NGNG派生がからむとややこしいけど…。
…自信なし。
0254デフォルトの名無しさん
NGNGいや、同一クラスならアクセスできます。派生クラスだとアウト。
class A
{
protected:
int xxx;
public:
void func(A* ptr)
{
std::cout << ptr->xxx << std::endl;
}
};
0255デフォルトの名無しさん
NGNGじゃあ、ダウンキャストしてからだとOKですか?
0256デフォルトの名無しさん
NGNG0257デフォルトの名無しさん
NGNG0258デフォルトの名無しさん
NGNG0259デフォルトの名無しさん
NGNGよくわからん。
0260デフォルトの名無しさん
NGNGたとえば、
クラスAのオブジェクトとしてobj1とobj2があるとすると、
obj1のprotectedメンバにobj2からアクセスできるの?
0261デフォルトの名無しさん
NGNGできるよ。
Privateでも。
0262デフォルトの名無しさん
NGNGそれはできる。
class Test
{
protected:
int xxx;
};
void Test::func(Test* t1)
{
this->xxx = t1->xxx;
}
0263デフォルトの名無しさん
NGNGアクセスできないの?
0264デフォルトの名無しさん
NGNG>>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;
}
0265デフォルトの名無しさん
NGNG<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で保存して、見なさい。
(多分あってると思う・・・間違ってたら指摘して)
0266デフォルトの名無しさん
NGNGAを抽象クラスとして、Aに対して処理することに意味がある場合は?
例えば、CompositパターンのCompositオブジェクトから
基底クラスのprotectedへアクセスしたい場合とか。
0267デフォルトの名無しさん
NGNGのリファレンスやポインタを受け取ることによって、相手のすべてのメンバ
(派生クラスのメンバ)にアクセスできるし、相手の基底クラス
のprotectedメンバ以下(protectedとpublic)のメンバにもアクセスでき
る。ただし、一方が派生クラスのインスタンスで、他方がその基底クラスの
インスタンスである場合、派生クラス側が基底クラス側のインスタンスの
リファレンスやポインタを受けとっても、その基底クラスのprotectedメンバ
以上(protectedとprivate)のメンバにはアクセスできない。
>>224 でエラーが出たのは、派生クラスが基底クラスのポインタを受けとって
いたから、protectedメンバにアクセスできなかったということで、
もし派生クラスのインスタンスを受け取るように設計してれ
ば、インスタンスが異なっていても基底クラスのprotectedメンバにアクセス
できるということ。
0268デフォルトの名無しさん
NGNGいっそパブリックにしたらぁ?
0269デフォルトの名無しさん
NGNG派生クラスを経由して基底クラスにアクセスすると何か不具合
でもあるの?
0270256
NGNGよーくわかりました。丁寧な解説ありがとうございました。
これで、サルから原人レベルになれました。
0271256
NGNG0272デフォルトの名無しさん
NGNG0273デフォルトの名無しさん
NGNGclass a{
int b;
int c;
}
vector < vector<a> > d;
とした場合、
d[10][8]という配列を新規に確保したい場合、どうすればよいのでしょう。
0274デフォルトの名無しさん
NGNG0275デフォルトの名無しさん
NGNGvector< vector<a> >型の[10][8]の配列が必要なら
vector< vector<a> > d[10][8];
で普通に確保できるぞ?
いまいち質問の意図が読めんが。
0276デフォルトの名無しさん
NGNG説明不足ですいません。動的に確保する必要があるのです。
void E(int x,int y){
//ここで動的にd[x][y]の配列を確保したい
}
このような場合です。
0277デフォルトの名無しさん
NGNGnew使って動的に配列確保すれ。
つか、vector4つ重ねたほうがいいと思うが。
0278
NGNGvector<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];
こんなもん?
0279デフォルトの名無しさん
NGNG0281デフォルトの名無しさん
NGNGそれとも、自分でassignしなければならないのでしょうか。また、その場合どうやってやればいいのですか。
0282sage
NGNG内側の個数がわかっているなら、外側のvectorのiteratorを順に回して、内側のvector<int>のresize/assignをしときなさい。
わかっていないなら、vector<int>を一個ずつ追加でもしながら、assignしていきなさい。
0283デフォルトの名無しさん
NGNGシングルトンなどで使用されるようなstaticなメンバの開放ってしなくていいんでしょうか?
クラスのデストラクタ(?)みたいなものってあるのかな?
0284デフォルトの名無しさん
NGNG下でどうでしょ?
#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信者みたいに)あんまり
解放を気にしすぎると健康に悪いと思う。
また、そいつが他の資源を握ってるんなら、
デストラクタにとは別のメソッドで明示的に解放すべきだと思う。
0285デフォルトの名無しさん
NGNGわけがわからん
0286誤爆人
NGNG・include後に
using namespace std;
を加える。
・string* Singleton<string>::create() { return new string("モナー"); }; を
template<> string* Singleton<string>::create() { return new string("モナー"); };
に変更。
で動いたよ。勉強になった。thx
0287デフォルトの名無しさん
NGNG0288デフォルトの名無しさん
NGNGclass A
{
const int i = 1;
const CString str = "abc";
};
等とすると、コンパイルエラーとなってしまいます。
関数定義の中だと問題ないのですが、
クラス内では、このような定義はできないのでしょうか?
0289デフォルトの名無しさん
NGNGenumを使うか初期化子使え。
0290デフォルトの名無しさん
NGNG初期化子、はじめて使いました。
まだまだ厨房、、、
0291デフォルトの名無しさん
NGNG組み込み型はstatic constな場合に限りclass宣言内で定義できる。
よって以下のように書くこともできるyo
// A.h
class A
{
static const int i = 1;
static const CString str;
};
// A.cpp
const CString A::str = "abc";
0292デフォルトの名無しさん
NGNG> 組み込み型は
"整数は"の誤りだな。以下のコードはコンパイルを通らない。
class A
{
static const float f = 1.0;
};
0293デフォルトの名無しさん
NGNGVisual C++ みたいにアホい(というか仕様が古い?)コンパイラでは、
整数でも宣言時初期化はエラーになるんです。
0294デフォルトの名無しさん
NGNGclass A {
static const int i = 0;
static const float f = 0.0;
static const double d = 0.0;
static const char* const s = "abc";
};
0295デフォルトの名無しさん
NGNG0296デフォルトの名無しさん
NGNG>> 組み込み型は
>"整数は"の誤りだな。以下のコードはコンパイルを通らない。
のあたりを試してみたんだけど?
0297デフォルトの名無しさん
NGNG確かにgcc(2.95.3)だと通った。これってgccの拡張仕様なのかな。
手元にあるプログラミング言語C++第3版には、整数でないとダメと書いてある。
それとも本が古いの? 誰か教えれ。
0298defalut
NGNGWindows9x,NT,2000 が終了する際に
cookie をすべて削除するプログラムを作りたいとおもうのですが、
どうやればいいでしょうか?
0299デフォルトの名無しさん
NGNG常駐してWM_ENDSESSIONが来たらcookieの保存されてるフォルダ内容をすべて消す。
0300defalut
NGNG1 常駐させる方法
2 フォルダの内容をすべて消す
方法教えてください。
0301デフォルトの名無しさん
NGNG0302デフォルトの名無しさん
NGNGVBAですと、イベントハンドラたとえば、ボタンを押したタイミング
で、プログラムが動作します。
VisualCの場合は メッセージを単位ににしてプログラムが動作
するようになるのでしょうか?
0303デフォルトの名無しさん
NGNG>VBAしか扱ったことがありません。
>VBAですと、イベントハンドラたとえば、ボタンを押したタイミング
>で、プログラムが動作します。
人のことなめてる?(いろんな意味で)
>VisualCの場合は メッセージを単位ににしてプログラムが動作
>するようになるのでしょうか?
あなたは Win版 HelloWorld からはじめてください。
0304293
NGNGちょっと気になったので調べてみました。
私の手元には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 があります。
0305デフォルトの名無しさん
NGNG「ボタンを押したタイミング」ってのは、「メッセージを単位」にしてるってこと、
もしかしてわかってない?
まずイベントドリブンって言葉から、勉強しましょう。
0306デフォルトの名無しさん
NGNGとりあえず、お前の求めている機能を実現するのにVCでプログラム書く必要はない。
autoexec.batに以下の1行を追加するだけだ。
del C:\Windows\Cookies\*.txt
プログラミング言語C++第3版という本の姉妹本みたいなの
ありますよね。同じアスキーで赤い背表紙の本で、OOPに関するものや
STLに関するものや、あとはC++第3版の問題の解答集みたいなのとか。
あのあたりの本はいいのでしょうか?それともC++第3版に便乗して
売ろうとしてるただの本なのでしょうか。言語仕様の本とはべつに
OOPやSTLあたりの本も読もうと思ってるのですが・・・。
0309デフォルトの名無しさん
NGNGEffective C++ と More Effective C++ は読んでおいた方が良いと思う。
0310デフォルトの名無しさん
NGNG同意。必須です。
0311デフォルトの名無しさん
NGNGよいと思うけど。あとは疑問視。
>>309 の次くらいにExceptional C++とか。
GotWの記事直接見てもよいが。
0312デフォルトの名無しさん
NGNGフォント名(MS ゴシック など)が解っていて、それに対応する
*.TTF あるいは *.TTC のファイル名を得るにはどうすればいいでしょうか。
またその逆に
*.TTF等のファイル名が分かっていて、それに対応するフォント名
を得るにはどうすればいいでしょうか。
MS VC++ 5
Windows 98
0313デフォルトの名無しさん
NGNGconst int data[2];
public:
A(int d1, d2);
};
A::A(int d1, int d2) : data[0](d1), data[1](d2) { }
constのメンバ配列を初期化したいのですが、出来ないのでしょうか?
0314デフォルトの名無しさん
NGNGCで制御系のプログラムを組んでたんだけど、今度C++で組むことbノ
なったbフです。
bナ、本買って勉給ュしたり、サンャvルとか見せてb烽轤チたんだけbヌ、データの
部分に関してはクラスを使うのは分かるんだけど、何でもかんでもクラス
にするものなの?
メインで無限ループで受信待ちの部分なんて、クラスにする必要あるの?
制御系のプログラムを組む時、どこまでクラスで設計するものなのか
良く分からないんですけど、いい本とか、いいサイトはありますか?
0315デフォルトの名無しさん
NGNGメインループは唯一のインスタンスを持つアプリケーション全体のクラス
として設計しる。
含まれるメソッドは初期化、メインループ、例外処理。
0316309
NGNG誰か読んだ人います?
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
0317デフォルトの名無しさん
NGNGレジストリを漁れば見つかるはず。でも、スレ違い
0318デフォルトの名無しさん
NGNGこんなやり方はどう?
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;
}
0319デフォルトの名無しさん
NGNGなるほど、C++では何でもクラスで作っておけということでしょうか。
それによるメリットは、後々使いまわしがきくということですか?
0320typename C++::books
NGNG> あと個人的には 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が原始帰納関数計算できるって知ってた?
0321Bear in mind
NGNGEffective STL読んでます。今item37。
あと一週間待って。
0322309
NGNGThanks. よし、買おう。
> // templateが原始帰納関数計算できるって知ってた?
Game Programming Gems で template 使って行列計算するサンプルを読んで、
初めて template の記述能力の高さに気づきました。あそこまでいくと、もはや、
コンパイル時に評価されるインタプリタ「言語」ですね。
>>321
レビュー、期待しております :)
0323デフォルトの名無しさん
NGNGちょっとサンプル見せて
0324309
NGNG行列だと長いから、フィボナッチ数列のサンプルで良い?
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 番目
の数値が得られます。
0326typename C++::books
NGNG> ちょっとサンプル見せて
http://cseng.aw.com/book/0,,0201704315,00.html
ここからloki.zipを取得せよ。ちょと強引なのもあるけどね。template萌え萌え
// 標準に追い付いてないg++でcompile出来ない…
0327デフォルトの名無しさん
NGNGうぁ、すごいね。
これを見ると、とてもC++を使いこなしているとは言えないなぁ
0328デフォルトの名無しさん
NGNG関数型言語みたいな感じやね
0329typename C++::books
NGNGcompile-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も書ける。
0330テンプレートマンセー
NGNG引けばいろいろ出ると思われ。
ttp://www.oonumerics.org/oon/
ttp://extreme.indiana.edu/~tveldhui/papers/techniques/
昔のCマガにも出てたことあり。
0331デフォルトの名無しさん
NGNGよくもわるくも馬鹿すぎ。
よいほうの理由は説明は略するとして、
悪いほうは「それって単なるCの引数つきマクロと同じレベルじゃん」。
その理屈でいえばマクロ的なことをなんでもやらせられるという安直な結論になるだけだ。
0332デフォルトの名無しさん
NGNG> 「それって単なるCの引数つきマクロと同じレベルじゃん」
マクロは C/C++ を理解しない単なる文字列置換しかできませんが、template
関数/クラスは C++ の文法を 100% 理解できますから、記述能力が全く違い
ますよ。
それと >>324 で挙げられているような単なる数値計算に限っても、実行時では
なくコンパイル時に値を確定できる利点があります。数値シミュレーションや 3D
ゲームのエンジンを記述する時には、十分に実用的なテクニック。
> その理屈
どの理屈?
0333デフォルトの名無しさん
NGNGテンプレートは構文解析レベルで置換候補を作っておいて、
リンク時に解決を行うプリ/ポストプロセッサって感じがする。
(実際は違うんだろうけど)
なんかC++の言語本体からは遊離しているような印象。
それが使いやすくもあり、使いにくくもある。
JavaのJSR-14とかだと、もうちょっと言語よりになっているような..
reflectできるし、interface指定できるし
0334デフォルトの名無しさん
NGNG0335デフォルトの名無しさん
NGNG知ったか厨房決定。
テンプレートをよく知らないと思われ。
0336デフォルトの名無しさん
NGNGいや、ただの厨房でしょ。
0337325
NGNGやはりあんな分厚い言語仕様本を通して読むのはバカげてますかね・・。
0338デフォルトの名無しさん
NGNGそんなことない。1回は読んどくべきと思う。
‥とかいいつつ、漏れもまだ20章あたりまでしか読んでないが(w
0339325
NGNGまだ5章です。
あの大きさは、電車とかで読むのにはちょっとキツイですな。
それがネックになっています。
0341教えて君。
NGNGなぜですか。
0342それはね
NGNGコンパイルしようとしているからです。
0343デフォルトの名無しさん
NGNG「C++標準ライブラリチュートリアル&リファレンス」の
どっちがおすすめですか?
0344デフォルトの名無しさん
NGNGA();
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では呼び出せたのですが、処理系依存なのか分からないので・・・
0346デフォルトの名無しさん
NGNG返答ありがとうございました。
初期化メソッドもvirtualで継承してきているので、
そうなるとまたもうひとつ初期化メソッド用意するということですね。
なんか、カッコ悪い(^^;
>struct?
public:を省略して記事量を抑えるためですが(^^;
0347デフォルトの名無しさん
NGNG戻り値がvoidのメソッドを作るのなら、
自分への参照を返す方が賢い気がするのですが、
実際どっちが良いんでしょう?
03481
NGNGEffective STL終わりました。
内容は、More Effective C++より平易だと思います。
しかしSTLの中身を少し覗いたことがないと分からないと思われる記述も多いです。
また所々に標準についてのほほうと思う文が散らばっています。
「vector<bool>は標準化委員会の失敗作だ」
では買いなのかといわれると、More Effective C++より役に立つ機会は多いと思います。
>>344
保証はあると思います。
0349-
NGNGhttp://www.sex-jp.net/dh/01/
http://www.sex-jp.net/dh/02/
http://www.sex-jp.net/dh/03/
http://www.sex-jp.net/dh/04/
0350デフォルトの名無しさん
NGNG>自分への参照を返す方が賢い気がするのですが、
この根拠は?どんな用途を想定しているの?
0351デフォルトの名無しさん
NGNG大嘘付かないよーに
各コンストラクタ中の仮想関数呼び出しは、自分自身の仮想関数
テーブルを用いて行われるので、どのクラスの仮想関数が呼ばれ
るかを特定できる
>>344
>1の呼び出しが無効なのは分かるのですが、
無効というのは、B::methodが呼ばれないという意味?
そういう意味では真だが、A::methodが呼ばれるのは保証される
0352デフォルトの名無しさん
NGNGオブジェクトとしては(コンパイラに)認知されていないから、
仮想関数は部分オブジェクトとして構築済みの
基底クラスのそれが呼ばれるのだ。
仮想じゃない関数を介してコンパイラをだますことは
できるけれど、あくまで自分は作りかけなので
それを承知の上での処理をしないといけない。
んだよね?
0353C--=A
NGNG一々状態チェックするの嫌なんだけど。。。
0354デフォルトの名無しさん
NGNGいろいろやってみるも実際は意図した結果になかなかならないなー
結局ループしてたりw
あとテンプレートの引数が複数あって、片方だけ専門化できるようにならんのかな
0355デフォルトの名無しさん
NGNG最初っから何でもかんでもクラスにするこた無いかも。
・とりあえず // と const と inline と namespace に萌えてみる
・関連の強い構造体と関数をクラスにまとめてってみる
・ユーザー定義型を作ってみる
・標準ライブラリを覚える
・全部オブジェクトにする(シングルトンとか使って)
・クラスライブラリを作ってみる
・テンプレートライブラリを効率を意識しながら作ってみる
みたいに段階を踏んだ方が、実行時効率を問われる世界から来た場合はやりやすい
んじゃなかろーかと。
例えば、関数オブジェクトを知らないでクラスライブラリ作ろうとしたりすると、
効率と柔軟性のトレードオフな物しか書けない訳で。
0356デフォルトの名無しさん
NGNG> コンストラクタ内では、自分はまだ作りかけで
> オブジェクトとしては(コンパイラに)認知されていないから、
> 仮想関数は部分オブジェクトとして構築済みの
> 基底クラスのそれが呼ばれるのだ。
そんな仕様聞いたことないよ。
A::f()とB::f()が宣言されてる時にBのスコープ内で単にf()としたら、
B::f()が呼ばれるのが自然じゃない?
リファレンスやポインタを介さない関数呼び出しはコンパイル時に静的に決定できる
ので、仮想関数の仕組みは必要ないと思うんだけど。
0357356
NGNGvoid hoge(void){
B b;
// 何か
}
とした時、Bの構築時は、まず基底クラスAのデフォルトコンストラクタA::A()が呼ばれ、
その中でA::method()が呼び出され、その後でB::B()が呼ばれ、B::method()が呼ばれる
という順番になると思うんだけど‥。少なくともうちのgccではそうなったよ。
これが保証されないんなら怖くて継承とか仮想関数とか使ってられないよ。
0358デフォルトの名無しさん
NGNG確かに実際にはその順番になるんだけど…。
B b;
ってしたときに、A::A() の中で B::method() ではなく A::method() が
呼ばれてしまう実装ってダサいと思わないか?
しょっちゅう間違えてハマるんだけど、俺。(w
03591
NGNG-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さんがしているという再帰。
0361345
NGNGあう〜、大嘘はひどいモナー(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
0363typename C++::books
NGNGコンパイラ古くない?
>>337
読んでるよ。仕様書も必要なところは。
仕様書のcode断片例はいいと思う。仕様は曖昧じゃないしさ。
0364デフォルトの名無しさん
NGNGyaneuraoあげると余計ややこしくなる
0365デフォルトの名無しさん
NGNGクラス 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; } };
???
0367デフォルトの名無しさん
NGNGこの結果のどこがダサイですか?
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
$
0368358じゃないよ
NGNG派生クラスによる追加部分が未構築な段階で、
基底クラスの構築子から派生クラスの仮想メソッドを呼べてしまうと、
その仮想メソッドが派生クラスの未構築なメンバをもしもアクセス
すると動作が異常になるので、言語仕様では安全サイドに振って
一律に派生クラス側のメソッドを呼べないようにしているわけだが、
コンパイラとリンカが神のごとく賢ければ、未構築なメンバを
アクセスする仮想メソッドの呼び出しに対してはエラーを、
さもなくば呼び出し可能としても良いわけで、>>358 はそれを
ダサいと言っているのであろう。
逆にプログラマ責任サイドに振って、派生クラスの仮想メソッド
を呼び出しOKにして、未構築なメンバをアクセスするような
仮想メソッドの場合は「未定義の動作」とする手もあったと思う。
C++の場合、この手の選択では「未定義の動作」とする場合が
多いのだが、そうしなかったのは仮想テーブルの設定を行う
実装が難しくなるからかな。
0369javaの場合は
NGNGちなみに、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# ではどうなるのかな。
0370351
NGNGええ。叩かせて頂きまふ(w
上のURLの方は、説明してる事は*ほぼ*正しいんですが、
>仮想関数はコンストラクタ内では正しく働かない。
という表現が間違ってますな。
下のURLの方は、>>358と同じ勘違いをしてるんでしょう。
何処を勘違いしてるかは、>>352と>>367が書いてるから省略。
仕様を調べたわけじゃないから不正確だけど、危ないのは
初期化構文で仮想関数を呼んだ場合。(B() : A(method()) { })
仮想関数テーブルが初期化作業は、初期化構文を抜けて、
コンストラクタの関数部分({})に入る直前に行われるから、
この場合は何が起こるかわからない。(bcc32.exeだと落ちた)
03721
NGNG残念ながら恐らく>>366さんはそんなことをダサいと言っているのではないです。
模範解答
C++のコンストラクタは、"コンストラクタ"だからである。
コンストラクタとメモリ管理を密接に結びつけることによって
コンパイラ実装者は、コンストラクタに、オブジェクトを作成するための
多種多様なメモリ管理の意味を与えることができる。
Javaにおいては、
メモリの割り当て及びメンバ変数の初期化を、コンストラクタと切り離すことによって
基底クラスコンストラクタが実行される前に、
派生クラスオブジェクトのメンバ変数が初期化済みであることを保証することができる。
0373358=366
NGNG> 逆にプログラマ責任サイドに振って、派生クラスの仮想メソッド
> を呼び出しOKにして、未構築なメンバをアクセスするような
> 仮想メソッドの場合は「未定義の動作」とする手もあったと思う。
こういう仕様の方が自然だったんじゃないか?ってこと。
仮想関数を呼んだときに実際に呼ばれる関数が
コンストラクタ配下で"だけ"他の場合と異なるってのは
違和感があるっつーか何というか。
> コンパイラ実装者は、コンストラクタに、オブジェクトを作成するための
> 多種多様なメモリ管理の意味を与えることができる。
ゴメン俺あんまり理解できてない模様。今の場合だと
C++のコンストラクタ ∈ メモリ管理
→ vtableの構築も"コンストラクタ"の仕事
→ 派生クラスコンストラクタより先に基底クラスコンストラクタが呼ばれるので
→ 基底クラスコンストラクタ中ではvtableは整って無くて当然
ってことでしょか?
0374358=366
NGNG「まだ派生クラスのものになっていなくて」 くらいに修正…。
0375デフォルトの名無しさん
NGNG実装とインターフェースを分離すれば?
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(); }
};
0377デフォルトの名無しさん
NGNG質問が大雑把過ぎて、何が言いたいのが良くわかりませんが。
純粋に実行コードのサイズの話なら、ワーキングセットがキャッシュメモリの
サイズを越えるかどうかが問題。実行ファイルが 100KB でも 1MB でも、あ
る時間内に頻繁に実行される部分が L1 キャッシュに収まるなら、実行速度
は変わらない。
あとスタティックライブラリのファイルサイズが大きくても、それが全て実行ファ
イルにリンクされるわけじゃない。必要な部分だけリンクされる。
ありがとうございます
数値計算で使うパッケージが全部で14Mくらいなんで
どうなんだろうかと思っていましたが
ちょっと安心しました
0379365
NGNGありがとうございます。勉強になります。
クラスAAは派生クラスBBを受けるので、引数の異なるSetProxy()を
定義することになっちゃいますよね。ポリモルフィックの見方からすると
それで良いのかなと思いまして。
共通のSetProxy()を宣言して、ダウンキャストできるか調べる方法も
ありますよね。それとどちらが良いのかなとも。
OOP は難しいです…。(^^;)
0380デフォルトの名無しさん
NGNG> 共通のSetProxy()を宣言して、ダウンキャストできるか調べる方法も
> ありますよね。それとどちらが良いのかなとも。
他のクラスがどのように A, AA と関わってくるかによって最適解は違ってきますが、
こちらの方法だとコンパイル時にエラーを検出できないのが悲しいですね。
> OOP は難しいです…。(^^;)
クラス階層の設計に関しては、必ずしも「正しい」解答がないですからね。
ただし、経験から生み出された定石があって「デザインパターン」と呼ばれています。
C++ では言語レベルでな継承・集約をサポートしていますが、これに加えてデザイン
パターンも習得すると、設計の柔軟性が格段に上がります。
参考文献
オブジェクト指向における再利用のためのデザインパターン 改訂版
ガンマ,エリック ヘルム,リチャード ジョンソン,ラルフ ブリシディース,ジョン
ソフトバンクパブリッシング (1999)ISBN:4797311126
デザインパターンの骸骨たち
http://www11.u-page.so-net.ne.jp/tk9/ys_oota/mdp/
03811
NGNGそのような実装も許されるということです。(ARM 10.9c)
未構築の派生クラスオブジェクトに対する仮想関数の呼び出し自体が定義できません。
>こういう仕様の方が自然だったんじゃないか?ってこと。
標準化委員会はそう思わなかったようです。
Javaは、基底クラスコンストラクタの呼び出しの前に、
派生クラスオブジェクトのメンバ変数は初期化されているので
実はこの判断と独立できます。
その説明が、>>372です。
0382379=365
NGNG素早いレスありがとうございます。とても早かったのでちょっとびっくりです。
>こちらの方法だとコンパイル時にエラーを検出できないのが悲しいですね。
そうですよね。見た目なんとなく、すっきりするのですが
コンパイルエラーでチェックできないので…
あまり良くないかもしれないです。
こういうときに使うもの、ではないのかも…。
>これに加えてデザインパターンも習得すると、
>設計の柔軟性が格段に上がります。
デザインパターンはまだ未開拓の土地です。(^^;)
C++をまだ十分理解できていないので難しいかな?と
思いまして。(^^;)
設計する上で先人の勉強は大切ですよね。この機会に
DPのほうも一緒に勉強してみます。
役立つリンクをご教示いただいて、ありがとうございます。(多謝)
0383デフォルトの名無しさん
NGNGあなた達には分からないでしょうが、Rubyは素晴らしい言語です。
オブジェクト指向スクリプト言語として他のスクリプト言語を圧倒する性能と美しい言語仕様を持っています。
例えば、SchemeやSmallTalkなどは比較的美しい言語だと言われていますが、後発である優位さでRubyは
さらなる美しさと実用性を備えています。
もちろんPerlやPythonなど問題外です。
日本語との親和性ではRubyしか選択肢がないでしょう。
LinuxのディストリビューションもRubyの採用例が増えてきています。
1年後には全てのディストリビューションがRubyを標準採用するでしょう。
Rubyは未来のスクリプト言語なのです。
長くなりましたが、コピペではありません。
賛同していただける方はRubyの事を分かっていただけない人に出会ったら、
この発言をコピペしていただければ幸いです。
C++なんて問題外ですが。
0384
NGNGRuby Ruby Ruby Ruby Ruby Ruby Ruby Ruby Ruby Ruby Ruby Ruby
とかやる荒らしが出る?
0385デフォルトの名無しさん
NGNG放置。
03861Rubyユーザ
NGNGC++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
0387デフォルトの名無しさん
NGNGけど、Rubyの話は別スレでやってくれよ。
Rubyは好きだけどRubyバカは勘弁してくらはい。
お前らにRubyを語られたらゆきひろがかわいそうだろ?
0388デフォルトの名無しさん
NGNGいじょ
0389デフォルトの名無しさん
NGNGLinuxは何言語で作られているか分かってるんだろうかわらぃ
0390かな
NGNGプログラムを教えていただきませんでしょうか??
0391デフォルトの名無しさん
NGNGそれ C++ の話なんですか? ともかく、宿題は麻衣ちゃんに教わって下さい。
お兄ちゃんの宿題、私が答えるよ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=982853418
0392かな
NGNGありがとうございます。
さっそく聞いてみます。
0393デフォルトの名無しさん
NGNGRubyはクソです。ゴミ箱逝きです。
いじょ
この発言をコピペしていただければ幸いです。
0394Ruby野郎は、
NGNGそんなに素晴らしいのなら、他言語と比較するアカデミックなスレでも立てて、他人を納得させてみなさい。まぁ、叩かれるのがオチだろうがな。
0395デフォルトの名無しさん
NGNG( ´∀`) ナイスお茶。
0396デフォルトの名無しさん
NGNGnew演算子で確保したメモリに対してエラーチェックってしたほうがいいんでしょうか?
if( ( int *pNum = new int ) == NULL ) {
/* エラー時の処理 */
}
っていう感じに
0397デフォルトの名無しさん
NGNG例外を送出して欲しくなければ new(nothrow) なんてするナリ
0398デフォルトの名無しさん
NGNG0399デフォルトの名無しさん
NGNG例外って意外と便利なんですね。
0400デフォルトの名無しさん
NGNGint main(void)
{
char c;
int i=0;
while(cin.get(c)) {
i++;
}
cout << i << endl;
return(0);
}
これで、入力した文字数をカウントして表示するプログラムを作成したつもりですが、
これでは、文字数が表示されません。どこが間違っているのか教えてください。
0401デフォルトの名無しさん
NGNG文字の入力が終わるのはいつだ?
0402デフォルトの名無しさん
NGNGC++以前の問題。
わからんかったらプログラム書くな。
0403デフォルトの名無しさん
NGNGset_new_handlerも調べておけ。
0404デフォルトの名無しさん
NGNGただし、落とし穴もあるので注意な。
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++ の三冊は必読。
0405デフォルトの名無しさん
NGNGおいらはこのうちの一冊も読んでないナリ。
読んだのは、プログラミング言語C++ と ARM だけです。
実用的なプログラムを書くのは無理ですか?(藁
0406デフォルトの名無しさん
NGNGその読んだって2冊の読み方によるけど、
仕事で使ったりするんだったら、
読んでないとロクでもないソフトが完成してしまうと思います。
っていうか、出来れば読みたくない訳?
C++でコード書きたかったらがむしゃらに読んどけ。
0407デフォルトの名無しさん
NGNG思うんだけど、プログラミングの初心者じゃない人で
その2冊読んでダメならなに読んでもダメなんじゃない?
0408デフォルトの名無しさん
NGNGスキルは上がらんよ。
0409デフォルトの名無しさん
NGNG>Effective C++, More Effective C++, Exceptional C++ の三冊は必読。
ちなみにこの3冊が良い本なのは確かだと思いまふ。
読んでないけど。
以上、暇だったのでからんでみました。
0410デフォルトの名無しさん
NGNG0411デフォルトの名無しさん
NGNGでも氏ね
0412デフォルトの名無しさん
NGNGλ
( ヽ / ̄ ̄ ̄ ̄ ̄
( ゚Д゚ )< Rubyはクソです。ゴミ箱逝きです。 いじょ
(____) \_____
ヽ(´ー`).ノ
( へ)
く
- = ≡三 λ
_ = ≡三 ( ヽ / ̄ ̄ ̄ ̄ ̄
(´ー`) = ≡三 ( ゚Д゚ )< この発言をコピペしていただければ幸いです。
( ヽ ヽ) - = ≡三 (____) \_____
/ > - = ≡三
0413デフォルトの名無しさん
NGNGVC6は投げないという話があったような。VC持ってないから間違ってたら失礼。
try { delete[] new char[-1]; } catch (const std::bad_alloc& e){ std::cerr << e.what(); }
こんなんで確認出来るだろうか?(one-liner失敬)
保護の弱い環境だとクラッシュするかも。
0414デフォルトの名無しさん
NGNGこれらの本はC++のどのような本なんですか?
OOPとかですか?
0415Ruby!
NGNG>C++
>いろいろと有名なオブジェクト指向言語であるC++と
>Rubyを比較すると:
>* C++なぞ問題外.^^;;;
http://www.ruby-lang.org/ja/compar.html
Rubyを知ってもらうためにもこの文をコピペしてください。
0416デフォルトの名無しさん
NGNGttp://www.ascii.co.jp/books/detail/4-7561/4-7561-1853-4.html
ttp://www.mmjp.or.jp/pearsoned/washo/prog/wa_pro34-j.html
0417デフォルトの名無しさん
NGNG0418デフォルトの名無しさん
NGNG「プログラミング言語C++」は、コンパイラ作成者向けに書かれた仕様書を、利用者
向けに咀嚼した書籍だけど、上の三冊は仕様書の狭間にある陥穽や、仕様書には直
接は書いていない言語仕様策定者の意図に踏み込んで解説している。
実践で得られた知見をまとめた Tips 集、というのが近いかな。
Exceptional C++ も似たようなものだけど、こっちは Gru of the Week の記事が元に
なっている。英語が苦手でなければ、Web で公開されている記事をどうぞ(というか
私は GoW しか読んでない)。
Gru of the Week
http://www.gotw.ca/gotw/
0419デフォルトの名無しさん
NGNG――――――――――――――――――――――
番組の途中ですが、臨時ニュースです。
「Rubyはクソです。ゴミ箱逝きです。 いじょ 」
この発言をコピペしていただければ幸いです。
___________ __________
‖ \|________
‖ | ON AIR.|
‖  ̄ ̄ ̄ ̄
./ ̄ ̄θ Λ_Λ
.../ //(´∀` )/|
./  ̄/⊂ ||_/
| ̄ ̄ ̄ ̄ ̄| ( ━┳┛
|_____| /ヽ」┘┻
0420デフォルトの名無しさん
NGNG‖  ̄ ̄ ̄ ̄
./ ̄ ̄θ Λ_Λ
.../ //(´∀` )/|
./  ̄/⊂ ||_/
| ̄ ̄ ̄ ̄ ̄| ( ━┳┛
|_____| /ヽ」┘┻
0421デフォルトの名無しさん
NGNG‖  ̄ ̄ ̄ ̄
./ ̄ ̄θ Λ_Λ
.../ //(´∀` )/|
./  ̄/⊂ ||_/
| ̄ ̄ ̄ ̄ ̄| ( ━┳┛
|_____| /ヽ」┘┻
0422デフォルトの名無しさん
NGNG‖  ̄ ̄ ̄ ̄
./ ̄ ̄θ ∧_∧
.../ //(´∀` )/|
./  ̄/⊂ ||_/
| ̄ ̄ ̄ ̄ ̄| ( ━┳┛
|_____| /ヽ」┘┻
AA調整実験中
0423デフォルトの名無しさん
NGNG何故か耳がズレる
___________ __________
‖ \|________
‖ | ON AIR.|
‖  ̄ ̄ ̄ ̄
./ ̄ ̄θ ∧_∧
.../ //(´∀` )/|
./  ̄/⊂ ||_/
| ̄ ̄ ̄ ̄ ̄| ( ━┳┛
|_____| /ヽ」┘┻
0424デフォルトの名無しさん
NGNG0425デフォルトの名無しさん
NGNGきれいにコーディングできますか?
以前Javaをやっていて、VC++もやってみようと思い
現在C++猛勉強中です
JavaからC++に移行する際に注意する点等もありましたら
教えてもらえるとうれしいです
多重継承と、virtualをつけないとオーバーロードできない点が
なんか違うなーと感じてます
0426デフォルトの名無しさん
NGNG0427デフォルトの名無しさん
NGNG& はいまいち好きじゃない。値渡しと見た目で区別できないから。
でもコピーコンストラクタやテンプレートで必須になるんだよね。
0428C++厨
NGNG左辺値を返すとき、たとえば
代入演算子のオーバーロードをするとき。
virtualがないものはクラス名で修飾された、
単なる関数で第一引数にthisが渡っていると
考えて良いそうな。
デストラクタの実行はスコープがあれば
その終わりに順ずる。
コンテナと例外をうまく使えばごみ集め
の手間はかからない。
0429C++厨
NGNGするんだけど、仕様的にはこれでいいんだっけ?
もうひとつ、allocaってC++で使っていいのかってこと。
例外とデストラクタが絡むから、ヤバイ気がする。
0430デフォルトの名無しさん
NGNGおいおい、シグナルハンドラからどこへ longjmp するんだ?
>例外とデストラクタが絡むから、ヤバイ気がする。
そこまでわかってるならやばくないように
使うこともできるのでわ?
まあ c++ ならあんま必要ないしね。
gcc 限定なら int a[n] (iは非定数)なんてことができて
これは alloca と等価。
0431デフォルトの名無しさん
NGNG○:(nは非定数)
0433デフォルトの名無しさん
NGNG激しくスレ違い。
0434デフォルトの名無しさん
NGNG一般保護法違反がでてPCが固まったんですけどなんででしょうか?
0435デフォルトの名無しさん
NGNGでもたぶん・・・・・
PCを固めるのはコールバック系の処理中に変な事するとか
まあ色々方法はあるけどね
0437デフォルトの名無しさん
NGNGISO/ANSIでは、C++における(POSIX) signalについて何も保障してない。
環境依存だから、compiler, libraryのmanualを読め。
ただ、longjumpはregister周りをいじって大域脱出を実装するので、
destructorが呼ばれるなんて事は金輪際ないと思うぞ。
signal→例外という機構がまだないんだなー。UNIXには。
Windows(SEH&__try)にはあるのになー。
0438
NGNGgnucも飛ぶ。
0439デフォルトの名無しさん
NGNGたぶん機能するんじゃないかと思います。
ただしスタック巻き戻すときにデストラクタなんかは動かないでしょう。
(なので覚悟の上じゃないとちょとアレ)
シグナルハンドラてのは、プログラム本体とは無関係に
非同期に動くものなので、シグナルハンドラの外へ longjmp するのは
あるスレッドで setjmp した場所へ、別のスレッドから
longjmp しようとするようなものです。
飛ぶでしょ?普通。
0440デフォルトの名無しさん
NGNGかわりにC++ではthrow/catchを使うべきだですよね。
0441デフォルトの名無しさん
NGNGシグナルハンドラから throw するのも、保証されてるかどうか怪しいな。
環境依存だからマニュアル読んでね、としか言えないけど。
0442デフォルトの名無しさん
NGNGそもそも本筋で throw してる最中にシグナルハンドラが
呼ばれて、そんなかで throw しようとしたらえらいことになるかも?
0443デフォルトの名無しさん
NGNGばーか。
そんなこと逝ってるようなやつが質問すんな。
0444デフォルトの名無しさん
NGNG恐怖恐怖恐怖!!
443引見陰険隠見隠顕淫ビ
443最低
いじめかこわるい
ださ
さいあく〜〜〜〜
ちょーーーーーーー
ぼーーーーーーーーーーーーーーーーーー
ぶーーーーーーーーーーー
ってか厨房
あほ
だぼ
さヴぉ
0445デフォルトの名無しさん
NGNG∧ ∧ ∧ ∧
/⌒~~~⌒\ ( ,,) (,,・Д・)
/ ( ゚?д?゚ )y─┛~~ 〜(___ノ 〜(___ノ ,γ_
(_ ノγ U ∩_∩) THANK YOU 2ch ┌───────┐ \
α___J _J and (| ● ● | ヽ
/ ̄ ̄ ̄ ̄\ GOOD-BYE 2ch WORLD! /.| .┌▽▽▽▽┐ .|____|__||_| ))
/ ● ●、 ( ┤ .| | .|□━□ )
|Y Y \ またどこかで会おうね \. .└△△△△┘ .| J |)
|.| | .▼ | | \あ\ | ∀ ノ
| \/ _人|∧∧∩゛冫、 .∧_∧ | \り.\ . | - ′
| _/)/)/( ゚Д゚)/ ` . (´∀` )..ヽ(´ー`)ノ \が\ . | )
\ / 〔/\〕 U / ∩∩ ( ) (___) \と.\ .|/
| | | c(*・_・) | |ヽ(´ー`)ノ_| | | | |〜 /\.\う\| (-_-)
(__)_) UUUU /∪∪ (___)(_(__) ◎ ̄ ̄◎─┘ .└──┘.(∩∩)
ママ〜 2chでスレたてたよ〜
\__ ______
∨ ∧_∧
" , 、 ミ / ̄ ̄ ̄ ̄ ̄
ゝ∀ く < いい子ね、後で見てみるわぁ
∧_∧ | \_____
三 ( とノ
三 / つ |
三 _ ( _ /| |
(_ソ(_ソ(_ )
0446デフォルトの名無しさん
NGNG俺は慌ててパソコンを立ち上げ、そして気付く。
「あぁ、2chは閉鎖したんだっけ……」
テレビからは現場の慌しい状況が伝わってくる。
もし2chがあったら、どういうスレが立っているのだろう。
重複スレが沢山できて、それで荒らしとかやってきて……
テレビでは相変わらず、レポーターが必死で現場の状況を伝えている。
可愛いレポーターだ。俺は、頭の中で「萌え〜」というレスを
つけている自分を想像した。
後ろの群集がテレビに向かって挑発的なポーズを取っている。
「なんだ、あのドキュソ」「厨房氏ね」……
俺はたまらなくなり、無いとは分かっていながら再び2chにアクセスした。
しかし、画面には一言「閉鎖したのです。。。」とだけしか表示されない。
何度リロードしても変わらない。あの日以来、2chは止まったのだ。
どうやら犯人が逮捕されたようだ。相変わらず可愛いレポーターが
その状況を伝えている。
「さよなら、にちゃんねる」
俺はお気に入りから2chを削除し、そして騒がしいニュースを冷めた目で
見るのであった。
0447デフォルトの名無しさん
NGNG./ ̄ ̄ ̄ ̄ ̄/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ヽ
/ ____/_________________ヽ
,/ ̄ ̄ ┏━, / ̄ ̄ ̄|| ||. ̄ ̄ ̄ ̄ |||  ̄ ̄ ̄ ̄ ̄ ̄ ̄...| |
,/ ∧ ∧. i┸i //. ∧ ∧ || / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
_.,/. (・Д・ ) | :::|// (゚Д゚ ) < >>443を迎えにきました。措置入院です!!
|/,,,,,へ⊂ ヽ .// ,/ ノ/ ||\______________
,/ ̄ ̄ ̄ ̄ ̄ ̄//|_/ ̄ ̄ ̄|  ̄ ̄ ̄ ̄ ̄ | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
|~ ゜ ̄゜ ̄ ̄ ̄~~| ̄ ̄ =。|┃ |━━━━━...............|
|______: |,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|,,,,゜,,,,,,,,,,,,,,,,,,,,,,,,,|,,,東京精神病院,,,,,[|
._|]0::∴:::0::[二二il:] ,-―-、 ,,| | . [|
|====== ;...........| /,  ̄ヽ |~~|. | /,  ̄ヽ | {|
ヽニ[_]ヾニニヽ''''''|―-|.(※)|':|''''|.'''''''''''''''''''''''''''''|''''''''|.(※)|:|'''''''''''''''''/
ゞゝ三ノ ̄ ̄ ̄ ゞゝ_ノ ̄ ̄ゞゝ三ノ ̄ ̄ ̄ ゞゝ_ノ
0448デフォルトの名無しさん
NGNGprintf("きしょ");
}
0449デフォルトの名無しさん
NGNG] ┃ / /
┃ / 2ch /
] ┃ /Λ_Λ /
┃ ゲキトツスルゾヌッ!! / (´∀` ) /
] ┃ / ∧∧ )/
┃ / (゚Д゚ ) ̄ ̄ /
] ┃ _______________________/ U U ̄ ̄/ _
┃ / ・・・・・|_|・・・・・ Λ_Λ ∩∩ /)_/) i⌒――⌒i  ̄ | __
] ┃ /> < 2ch Airlines (・∀・ ) (・x・)ノ (,’ー’) (´(Å__)` ) / ̄ ̄ ̄ ̄ ̄/
┃ / _ _ ( ) ノ|x| _( U__U) /ヽ / /_ノ ヽ  ̄ ̄ ̄ / ̄
] ┃ | ▼ |_|・・・・・・・・・・|_|・・・・・・ ・・ |_|・・・・_・・・・|_|・・・/_/ |_|((.l_ll))) /
┃ |_人_ (-_-)ヽ(´ー`)ノ/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄/ ̄ ̄ ̄ ̄ ̄ / (lロ-ロl) /
] ┃ \ (∩∩)(___)\== / ̄ ̄ ̄ /|| ̄| ̄|\/ ̄ ̄ ヽ ∀ノ/
┃  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄| ̄|\/ ̄|| | | |  ̄ ̄ ̄ ̄ ̄ ̄ ̄
] ┃ || | | | || |_|/
┃ || |_|/  ̄ ̄
] ┃
0450デフォルトの名無しさん
NGNGint &f(){return value;}
という関数があるとして、
f()=5;
という使い方できる事以外では
int f(){return value;}
と同じでしょうか?
0451デフォルトの名無しさん
NGNG∧||Λ
( / ⌒ヽ
| |>ALL|
∪ / ノ
| ||
∪∪
0452デフォルトの名無しさん
NGNG\\ 正直、スマンカッタ!! //
+ + \\ 正直、スマンカッタ!!/+
. ___ . ___ . ___ +
/. ――┤ /. ――┤ . /. ――┤+
./(. = ,= | ./(. = ,= | ./(. = ,= |
+ . |||\┏┓∩|||\ ┏┓∩|||\┏┓/ +
(( (つ ノ (つ 丿 (つ つ ))
ヽ ( ノ ( ヽ ノ ) ) )
(_)し し(_) (__)__)
0453?r?????l????????
NGNGint &f(){return value;}
という関数があるとして、
f()=5;
という使い方できる事以外では
int f(){return value;}
と同じでしょうか?
0454kago
NGNG最近linuxでC++を始めたんですが、関数一覧表、みたいなものはネット上にどこかないんですか? GNUのGCCを使っていますが。GNUのぺーじには、一覧表、みたいなものは見つけられませんでした。
perlとかphpとかだと、日本語のページでけっこう簡単に見つかって参考にしているんですが、C++はどうにも見つかりません・・・。
みなさんはある機能を使いたいと思った時、どのようにして調べるのでしょうか? 参考までに教えて下さい。
0455>454
NGNGhttp://www.microsoft.com/japan/developer/library/vclang/vclanghm.htm
0456デフォルトの名無しさん
NGNGいいえ違います、同じではありません
0457デフォルトの名無しさん
NGNGVC++やBCBのオンラインマニュアルを参照してます。
OSやライブラリの機能については、
それらのマニュアルを調べます。
あとはサンプルプログラムをgrepするとか。
0458デフォルトの名無しさん
NGNG戻り値に参照を返すのは鬼門。
EffectiveC++第2版の31項を参照。
0459デフォルトの名無しさん
NGNGvoid foo()
{
auto_ptr<int> p1(new int);
auto_ptr<int> p2(new int);
// do something
}
こうすれば例外が出てもリークしません。
p2の確保に失敗したときですら、p1だけがうまくデストラクトされます。
auto_ptrを使え、ということではなく、自動変数(スコープ)をうまく使えということです。
vectorやlistを使ってもいいし、何かのクラスのメンバになっていてもいい。
要はdeleteが無ければいい。deleteをまき散らしているやつはまだ厨房。
0460デフォルトの名無しさん
NGNG404 は、それを知ってて敢えて *ダメなサンプル* として、あのコードを出ただ
けだと思うが。More Effective C++ の項目9が、そのものスバリだし。
> deleteをまき散らしているやつはまだ厨房。
同意
0461厨房
NGNGvoid foo()
{
int* p1 = NULL;
int* p2 = NULL;
try {
p1 = new int;
p2 = new int;
// do domething
}
catch (...) {
delete p2;
delete p1;
throw;
}
}
0462厨房
NGNG0463厨房
NGNG0464デフォルトの名無しさん
NGNGまあ大体はそれでいいと思うが、アセンブラだと
; 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; }
なら即自滅だが。
0465デフォルトの名無しさん
NGNG自動変数じゃなかったとしても、EffectiveC++29項、30項に引っかかる。
C++とオブジェクト指向を両方とも深く知った人が理由あって使うならともかく、
普通は使用禁止と考えたほうがいい。
0466デフォルトの名無しさん
NGNGPublic Function Show(XXXX as Collection)
となっている場合、VC側での引数はどうすればよろしいのでしょうか?
LPDISPATCH aaa;
XXXDLL->Show( &aaa ) ;
だと、ビルドは通っても、実行時に
「ハンドルされていない例外はXXX.EXEにあります。0x0000005:Access Violation」
となってしまうのですが・・・。
BSTRのときのSysAllocStringみたいに、何かしてあげないといけないのでしょうか?
0467デフォルトの名無しさん
NGNGとりあえずコンストラクトは成功させて後でGetLastError()メソッドでエラーチェックさせるとか?
0468デフォルトの名無しさん
NGNG「一般には」例外を投げる。
どうしても例外を投げたくなければ、オブジェクトのコンストラクトと初期化用の
メソッドを分離して、後者の戻り値で判断させるのが手だと思うが。グローバル
なデータ領域を使って成/否を記録しておくのは、ネストできなくなるから、や
めたほうがいい。
CFoo foo;
if (!foo.Init(...)) {
// 初期化失敗
}
0469デフォルトの名無しさん
NGNGclass 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
0470これじゃ駄目かね?
NGNG#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;
}
0471デフォルトの名無しさん
NGNG0472デフォルトの名無しさん
NGNGtypedefの役割と意味を調べれば自明。
0473デフォルトの名無しさん
NGNG0474デフォルトの名無しさん
NGNGとりあえず林晴比古本でも見るよろし
0475デフォルトの名無しさん
NGNG0476469
NGNG駄目なんです。
コールバックを登録するCのライブラリの
ラッパーを作っていてその部分を隠蔽したいのです。
まあstaticメソッドを普通の関数としてクラスの外に
追い出してしまえばいいのですが、もし合法なら
staticでやりたいなということです。
0477ポコニャン
NGNGそーゆーことなら469のまんまでも問題ないっしょ。
つまり469でのbarが実際にCで叩かれるアドレスなのねぇ。
0478デフォルトの名無しさん
NGNG0479470
NGNG>>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);
}
};
0480デフォルトの名無しさん
NGNGclass 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);
}
};
やはり
func(0) = 1; //funcの戻り値は参照型
といった感じですか?
x = func(0);
という使い方なら別に参照型を返さなくてもいいのですよね?
でも
int& a = func(0);
とすればちょっとは意味あるのかな?
とまぁいろいろ悩んでいるのですが・・・。
0482>481
NGNG・・・
string m_Name;
const string& getName() {
return m_Name;
}
}
みたいにconst参照を返すのはよく使う、俺は。
というか、返値として使う場面はそれ以外にないな。
それって呼び出し側はどういった使い方になるんですか?
ただのconst string型を返すのではダメなんすか?
0484デフォルトの名無しさん
NGNGそれだと、インスタンスのコピーが発生するからコストがかさむ。
0485デフォルトの名無しさん
NGNG関数呼び出しを左辺にするのですか?
それとも戻り値を何かに代入するのですか?
結局参照を返すのはコスト削減のためだけなのですか?
0487デフォルトの名無しさん
NGNG従来の C 言語の経験があるなら、ポインタを返すタイミングで参照を返す(こともある)
で分かると思うが。理由は、主に次の二つ。
- 右辺値としてアクセスしたい場合に、オブジェクトをコピーするコストを削減する
- コピーではなく、実体にアクセスしたい場合に使う
もし分からないなら、少し実際のプログラム読んだほうが良いと思われ。
0488デフォルトの名無しさん
NGNG参照を返す関数といえば、これ
ostream& operator<<(ostream& os, 〜);
0489デフォルトの名無しさん
NGNGの関数の実行効率が異常に悪いのですが、心当たりあります?
0490デフォルトの名無しさん
NGNGそれ自体がそれほどパフォーマンスを落とすことはないと思われ。別な原因でわ?
0491デフォルトの名無しさん
NGNGとりあえず、お約束ということで。
プロファイルはとりましたか?
0492デフォルトの名無しさん
NGNG0493デフォルトの名無しさん
NGNGコピーに伴うコストが高くつく
0494デフォルトの名無しさん
NGNGそれだと、ほんとにボトルネックが「仮想関数 + テンプレート」にあるのかどうか
分からん気がするが。
0495おでん屋
NGNGオーバーライドするにはどうしたら良いでしょうか?
昨日から考えているのですがコンパイルエラーの連続で...
よければどうかお助け下さい
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(); } // これはダメみたいです
0496デフォルトの名無しさん
NGNGvoid C::Cmethod() {
// 必要ならなんか
B::method();
// さらに必要ならなんか
}
たぶんもっと基本的なことちゃんと勉強した方が良いと思われ。
0497デフォルトの名無しさん
NGNGクラス階層が明らかに変だけど。クラス C で B だけでなく A も直接継承している
のは何故?
あと「クラスBの仮想関数をオーバーライド」という意味が良く分からんのだけど、
もしかして
C* p;
static_cast<A*>(p)->method();
static_cast<B*>(p)->method();
それぞれで、別の処理を行うことを想定してます?
0498おでん屋
NGNGレスありがとうございます。
ほんと構造が変です。こんな変な構造になったのは...
基底クラスのデストラクタでファイルの後始末処理をしているのですが
基底のデストラクタでは派生クラスの仮想関数はすでに使えないので
(ファイルの操作はこれに頼っているので、困ってしまいます)
派生クラスで書かないといけないですよね?
でも、この派生クラスをさらに派生すると...?
延々と続く問題になってしまいまして、それを解決しようとしたのが
クラスAで、派生クラスの後始末側にAの仮想関数を呼び出すようにして
Aの仮想関数で後始末をできるようにしました。
CのAはCを面倒みて、BのAはBを面倒みるような形にすると
こんな問題がでてしまいました。
さらに、呼び出すにもCのAなのか、BのAなのか明確にしないと
いけないです。さらにまずいです。
まったくもって勉強不足を痛感しております。
このような問題はどう解決したらいいのでしょうか...。
0499デフォルトの名無しさん
NGNG> 基底クラスのデストラクタでファイルの後始末処理をしているのですが
> 基底のデストラクタでは派生クラスの仮想関数はすでに使えないので
> (ファイルの操作はこれに頼っているので、困ってしまいます)
この段階で設計が間違ってるなぁ。
これだけだと何とも言えんから、各クラスの処理の概要とファイルの後始末
に関して、少し詳しく書いたほうがいいと思う。
0500おでん屋
NGNG概要はこんな感じです。
重要でない細かい部分は端折らせていただきますね。
class AbstructFile {
public: Open() = 0, Close() = 0, Read() = 0, Write() = 0; // 純粋仮想メソッドです
public: ~AbstructFile() { Close(); }
// 閉じ忘れ防止にデストラクタでファイルを閉じる処理はしておきたいです
}
AbstructFile は多種に派生してその一種に AbstructFile2 があります。
これもデストラクタで閉じたいのですが基底のデストラクタの Close(); は
邪魔になります。それをどうにか解決しても、AbstructFile2 から派生した
AbstructFile3 でさらに AbstructFile2 のデストラクタ処理が邪魔になりました。
正しい設計にするにはどうしたら良いのでしょうか...。
0501おでん屋
NGNG~AbstructFile() で純粋仮想なはずの Close() を呼んでおりますが
そこは何やら仕掛けで派生の Close() が呼ばれるようになっています。
本質はそこではないので省略いたします...
0502おでん屋
NGNG一見、最も派生した AbstructFile のデストラクタでやればと思うのですが
さらに派生したとき、問題に...ということなので...
0503デフォルトの名無しさん
NGNG> class A
> class B : public A
> class C : public A, public B
こういう継承は出来ないんでは?
(1) 基底クラスのデストラクタでファイルの後始末処理をする
(2) 基底クラスのデストラクタから派生クラスの関数を呼びたい
ってことだろう。しかし (2) ってことは、実際にファイルの後始末を処理するのは、基本クラスでなくて派生クラスなのか?それなら単に派生クラスのデストラクタで後始末処理をすれば良いと思うが。どうでせう。
0504デフォルトの名無しさん
NGNGさらに派生したときに新しい処理が加わるなら、派生デストラクタで新しい処理だけやれば良いのでは?
0505デフォルトの名無しさん
NGNG私ならインターフェースの継承と実装の継承を分離するかなぁ。
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 にして、直接はコンストラクトできない
ように細工)
どちらか好きなほうを選択。どちらにしても、ドキュメントを書いておく。
0506デフォルトの名無しさん
NGNG> 閉じ忘れ防止にデストラクタでファイルを閉じる処理はしておきたいです
これを基本クラスでなく派生クラスのデストラクタでやれば済むんでは?
0507おでん屋
NGNG>>503,504,506氏
はい。それで解決です。(^^;
でも、これで解決しても、派生をさらに派生すると Close() はまた、
その派生先に入れる必要がありますよね・・・
こうなると延々といれる作業を繰り返すわけで・・・
このあたりスマートに処理したいのですが・・・。
>>505
ありがとうございます。
Javaでいうfinallyを決めてしまうのでしょうか。(間違っていたらすみません)
最終の派生クラスを定義できればいいのですが
できればさらに派生させたい場合もあるかもしれないので...
仮想関数のようなデストラクタもどきがあればいいのですが・・・
0508デフォルトの名無しさん
NGNGつまり、AbstructFileの閉じ方とAbstructFile2の閉じ方は違うんですか?
もし違うなら継承にする意味がないような?
あとどうでもいいけど、正しいつづりはabstr「a」ctな。
0509デフォルトの名無しさん
NGNG> できればさらに派生させたい場合もあるかもしれないので...
汎用的なクラスライブラリを作っているのなら別ですが、そうでなければクラス階層は
設計段階ですべて見えてると思います。そうでなければ、まだ設計の煮詰め方が甘い。
それと上のほうでも書きましたが、インターフェースの階層だけ決めておいて、実装継
承はとりあえず忘れる(コードを共有しようとしない)方が良いと思います。実装継承は
強力な手法ですが、強力さゆえに使い方を誤ると簡単に泥沼に入りますから。
0510おでん屋
NGNGやはり私の設計が全面的に間違っていますね。設計才能の無さを痛感しております。
勉強してもう少しまともな設計ができるようにしたいと思います。
皆さまありがとうございました。
>>508,509氏
>あとどうでもいいけど、正しいつづりはabstr「a」ctな。
>設計段階ですべて見えてると思います。そうでなければ、まだ設計の煮詰め方が甘い。
その通りです。(^^;
>それと上のほうでも書きましたが、インターフェースの階層だけ決めておいて、実装継
>承はとりあえず忘れる(コードを共有しようとしない)方が良いと思います。実装継承は
>強力な手法ですが、強力さゆえに使い方を誤ると簡単に泥沼に入りますから。
はい。はまってしまいました。
仰る事を心がけてがんばってみます。
0511デフォルトの名無しさん
NGNG0512デフォルトの名無しさん
NGNG0513デフォルトの名無しさん
NGNGC++の問題です、なにぶん初心者でして
参考になる本などあれば教えて頂きたいです・・・。
1.二つの数をインプットしそれをx,yの読み込んで
和差積商を計算するプログラム
2.1つの数をインプットし読み込んで
その数の二乗、三乗を計算するプログラム
0514デフォルトの名無しさん
NGNG宿題はこっちで聞け。
お兄ちゃんの宿題、私が答えるよ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=982853418
0515デフォルトの名無しさん
NGNGヌルポインターを「作る」とは何??
0516デフォルトの名無しさん
NGNG終了。
0517出馬鹿ー
NGNG0518デフォルトの名無しさん
NGNGA* a;
終了。
0519デフォルトの名無しさん
NGNGクラスへのポインタではありません
0520デフォルトの名無しさん
NGNGこういう感じのコードを書きたいのかな?
class A;
class_ptr X = A;
X* p = new X();
// 擬似コードなんで、コンパイル通りません。悪しからず。
C++ ではクラス自体を指す変数は定義できません。ただし template クラス/メソッドの
引数としてクラス名を渡すことは可能です。
0522出馬鹿ー
NGNG御礼にもう1題
templateメソッドって可能ですか?(template関数ではない)
0523デフォルトの名無しさん
NGNG無理。
コンストラクタを書けない。
継承ができない。
明示的な呼び出しができない。
その前にインスタンスを作れない。
0525デフォルトの名無しさん
NGNGこれが「クラスを指すポインタ」に一番近いかな
type_info* p = typeof(class A);
0526デフォルトの名無しさん
NGNGテンプレートメンバ関数って意味なら、可能です。
class A{
template<typename T> void f(T);
};
0527デフォルトの名無しさん
NGNG間違えた。鬱だ・・・
const type_info* p = typeid(class A);
0528デフォルトの名無しさん
NGNGさらに間違い。逝ってきま・・。
const type_info& p = typeid(class A);
0531デフォルトの名無しさん
NGNGこの場合NULLは
stdio.hのマクロ定義かなんかじゃないんですか?
void* p=(void*)0;
とか
int* p=(int*)0;
これでいいのでしょうか?
0532デフォルトの名無しさん
NGNGどこに書いたらいいのかよくわからん。
0533デフォルトの名無しさん
NGNGC++ の type_info は、そこからメソッド一覧を取得したりインスタンスを作ったり
できないので、あまり実用性は無いですけどね。
0534デフォルトの名無しさん
NGNG単に
void* p = 0;
とか
int* p = 0;
で善し
0535デフォルトの名無しさん
NGNG使う場所から見えるところ。一般的にヘッダに書く。
0536デフォルトの名無しさん
NGNG同意。何のためにあるのかさっぱりですな。
誰か有効な利用法プリーズ
0537デフォルトの名無しさん
NGNGダウンキャストする時に使ってたんじゃない?
その昔は。
0538デフォルトの名無しさん
NGNGC++はObjectを作る方法として、ポインタにnew使う奴と、変数埋めこみで直接作る奴とが有るが、
C++が痛いのは、その両方に対して使える機構しか、提示しない、ということだな。
メタクラスの方向性を否定してるんで、「つみかさねる」ようなプログラミングを
ちまちま手作業で書かないとならないんで、辛い。
0539デフォルトの名無しさん
NGNGすまん。日本語が難しすぎてよく分からんので、もうすこし C++ プログラマに
わかりそうな言葉でしゃべってもらえると、ありがたい。
0540デフォルトの名無しさん
NGNGヘッダにソース書くのやだなー。
って思う人はどうしてるの?
0541デフォルトの名無しさん
NGNGヘッダに宣言だけ書いて *.cpp ファイルに実装書くこともできますよ。
でもヘッダに書くのが主流。
0542デフォルトの名無しさん
NGNGそうなんだ。ありがとうございます。
思い切ってヘッダに書いてみます。
昔はよく、「ヘッダにコードを書くな」って怒られたものです。
(それはインクルードするだけで実体化するからですけど〜。)
0543デフォルトの名無しさん
NGNG昔、ミカカ子会社提供のミドルウェアの一部であるテンプレート
ライブラリ(ヘッダに実装かいてあった)に間抜けなバグがある
のを発見した事がある。
ソース完全公開状態だからな。恥さらしだと思った。
(問題は、そこがバグっているとそもそもそのライブラリが
役立たずなものになるという致命的なものだったのだが、誰が
どう試験していたんだろうか…)
0544デフォルトの名無しさん
NGNGヘッダに書いても、使わない template クラス/関数に対してはコードが生成
されませんから、気にしなくて大丈夫です。
0545デフォルトの名無しさん
NGNGtypeidバトラー
#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);
}
0546545
NGNGどうさ保証なし。実行例。
>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.
『ゴルァ 』
0547デフォルトの名無しさん
NGNGやべーワラタ。
0548デフォルトの名無しさん
NGNGenumってなんでしょう。
0549デフォルトの名無しさん
NGNGconst や #define に代わる、定数宣言の最適な手段です(整数に限る)
例:
enum N_{
N = 32
};
0550デフォルトの名無しさん
NGNG大抵の言語に備わっています。
たとえば
#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++ だと、明示的に型キャストしない限り、
コンパイラが「あれっ?」と思ってくれます。
0551デフォルトの名無しさん
NGNGenum は 0 からじゃ…。
0552デフォルトの名無しさん
NGNG0553うろ覚え
NGNGenum {...} x;
一般的
typedef enum {...} type;
type x;
0554
NGNG値入れても良いんだよ。
0556550
NGNGあっ、…。(鬱氏)
>>552
C なら
enum type {...};
enum type x;
C++ ならそれ以外に
enum type {...};
type x;
とも書ける。
(今度こそ!)
0558デフォルトの名無しさん
NGNGtypedef enum{
false=0;
true=1;
} bool;
0559デフォルトの名無しさん
NGNG0560デフォルトの名無しさん
NGNG自作したほうがいいですか?
それとも既にライブラリが存在し、それ使った方がいいですか?
0561デフォルトの名無しさん
NGNGのサイズをあとで変更するにはどうすればいいですか?
int *a = new int[100]; /* とりあえず100確保 */
...途中でサイズを50にしたい
delete a[ ];
0562デフォルトの名無しさん
NGNG0563デフォルトの名無しさん
NGNG>>561
realloc
0564デフォルトの名無しさん
NGNGnewしたやつにreallocするのは止めろ。
ビットコピーされたらどうするつもりだ?
0565デフォルトの名無しさん
NGNG素直にmalloc使えよ
0566デフォルトの名無しさん
NGNG0567デフォルトの名無しさん
NGNG#include <vector>
void foo(void)
{
vector<int> a(100);
a.resize(50);
//delete不要
}
0568561
NGNGrealloc 使うことにします。
0569デフォルトの名無しさん
NGNG小さくするだけなら、そのままにしとけ。
0570sage
NGNGSTLportとか、つかえねーのかな。
0571デフォルトの名無しさん
NGNGえーっと、APIでまずは自分用のテキストエディタを
作成しようと思っているところです。
今はメモ帳がエディタ代わりです。
検索をいちいちダイアログで出すのは面倒なので、
まずデフォルトで検索窓の付いたものを作ります。
当初CreateWindowまたはExで(検索入力用の)エディットボックスを作り、
貼り付けて・・・と構想していました。すると、多分カーソルの
位置とか反転、カーソルの移動・・とかいちいち構造体を調べて・・
と、なにかと面倒そうだ、と思っていましたところ、FindTextと
ReplaceTextっていうのを発見しました。多分構造体が設定されていて
その面倒くささをやってくれるんですよね?っていうか、題意がそれてるんです
けど、
FindTextたちを使わず敢えて自前で組むのと、利用するのでは、
計算効率は違うのでしょうか、僅かでも。
貧乏性な上に、メモリ不足でカリカリいうといつもびくびくしてしまう
性分なので、メモリを食わない路線で処理の最適化を徹底したいと思っとります。
おしえてクダサイ。
0572デフォルトの名無しさん
NGNGint *a=new int;
より
auto_ptr<int> a;
a=new int;
のほうがいいの?
0573デフォルトの名無しさん
NGNG2行目まで読んだ。
フリーのテキストエディタを探してきて使え。
そしてプログラム書くの止めるか、本買って勉強しなおせ。
0574デフォルトの名無しさん
NGNG別にいいってことはない。
auto_ptrを使った変数などを関数に渡すときに
どういう動作するか考えるとうかつに使うのは
止めた方がいい。
auto_ptrの使い方としては、例外処理が起こって
途中でリターンしなくてはいけなかったりするときに、
開放の処理をやるのが困難な場合など。
あと、一般的にはコレクション系かしら。
0575デフォルトの名無しさん
NGNG0576デフォルトの名無しさん
NGNGクソに書けばクソになる。
既存APIは中がどうなってるのか知らんから一概に比較はできんが、
いいアルゴリズムで書けるなら書いてもいいんじゃないの?
0578デフォルトの名無しさん
NGNGここはC++のスレだぞ。APIについては他所でやれよ。
ついでにいっとけばエディタを作るのにWindowsのEditBox使うのは止めろ。
0579デフォルトの名無しさん
NGNGコンポジションを使う場合にも、メンバ変数も auto_ptr で持つかな。
直接
struct Foo
{
X x;
};
と書いてしまうと、このヘッダをコンパイルするためだけにクラス X のヘッダを
include する必要が出てきてしまうので。
0580デフォルトの名無しさん
NGNGどのみちHWND型だから使うメモリはCreateWindowと
変わらないだろうけど、代入演算が余計に起こって
処理が最適ではなくなってしまうことを心配している者です。
0581デフォルトの名無しさん
NGNGなじぇ?
0582デフォルトの名無しさん
NGNGincludeしたくないだけにauto_ptr使うか?
そんなこと言ったら
struct Hoge {
auto_ptr<string*> m_str;
}
か?
0583デフォルトの名無しさん
NGNGEditBoxを使った時点でメモ帳以上の物ができないことが保証されるから。
0584デフォルトの名無しさん
NGNGFooの定義の前に
class X;
と書いとくだけで大丈夫だと思うが?
0585デフォルトの名無しさん
NGNGいや、それじゃだめでしょ。
0586デフォルトの名無しさん
NGNG0587デフォルトの名無しさん
NGNGでは何を使えば?
0588デフォルトの名無しさん
NGNGエディタソフトハウスから賄賂もらってるから?
0589デフォルトの名無しさん
NGNGchar[固定]だからです
0590デフォルトの名無しさん
NGNGMSDN読め。
0591デフォルトの名無しさん
NGNG仕様です
0592デフォルトの名無しさん
NGNGそれが真実ならマイクロソフトさんって思ったより知能低いですね
速答ありがとうございます
0593デフォルトの名無しさん
NGNG自分で作るか他のエディトコンポーネントを探すか
0594デフォルトの名無しさん
NGNGヘッダファイルの相互依存関係は、ちょっとソフトウェアの規模が大きくなると
辛いです。一つのヘッダを修正するだけで、ほとんどすべてのソースを再コン
パイルすることになりかねません。
標準ライブラリのヘッダは原則として修正しませんから、さすがにメンバ変数
とはいえ参照やポインタにはしません。
>>584
いや class X の「サイズ」が決まらないと class X をメンバとして持つクラスの
「サイズ」も決まらないので、ダメです。
0595デフォルトの名無しさん
NGNG自分で作るって、どういうことですか?CreateWindowの引数でどうにかできるのですか?
0596デフォルトの名無しさん
NGNG悪い事いわんから開発やめとけ。
0597デフォルトの名無しさん
NGNGネタとマジレスの区別も付かない、自分で一切調べないような奴には
一生かかっても無理だ。
0598デフォルトの名無しさん
NGNGっていうか、「メモ帳」だぞ。
そんなおっきいファイル開く方が間違ってるYO。
エディタじゃねーよ。メモって意味考えろ。
0599
NGNGCRichEditViewで挫折したらまた質問下さい。
0600デフォルトの名無しさん
NGNG0601デフォルトの名無しさん
NGNGはあ? じゃあ何使うっつうの?
0602
NGNGこれ常識。
0603デフォルトの名無しさん
NGNGリッチエディット→ワードパッド
になるぞ?
0604デフォルトの名無しさん
NGNGMFCのクラスなんか使わないでしょ。普通。
でも、元ねたが「メモ帳のかわり」とか言ってるから、
りっちえでぃっとでいいんじゃないかい?
0605デフォルトの名無しさん
NGNG組みこむ形で使いたいんなら>>602で合ってる。
0606デフォルトの名無しさん
NGNG俺もそう思う。胴衣
0607デフォルトの名無しさん
NGNG>MFCのクラスなんか使わないでしょ。普通。
さすがにそれは普通じゃないと思われ。
0608デフォルトの名無しさん
NGNGMFC使わないやつは
1 完全にオリジナルのUIを構築するやつ(移植性とかなんとか
2 アンチMFC
3 MFCが分からないやつ
で、比率で言えば、1:10:89こんなものかな
0609デフォルトの名無しさん
NGNG604は「エディタのビューとして」の話だと思う所存。
エディタのビューとしてCEditやCRitchEditを使う奴はDQNだと思うナリよ
0610デフォルトの名無しさん
NGNG.>>609 MVCの話なら歓迎〜。
0611デフォルトの名無しさん
NGNG0612デフォルトの名無しさん
NGNG0613デフォルトの名無しさん
NGNG俺の知る限りはAL-Mailぐらいだな。
0614デフォルトの名無しさん
NGNGメーラーなんかプレーンテキストで十分だ。
よってCEditで十分だと思うが、どうか?
>>608
禿同。
0615デフォルトの名無しさん
NGNGhttp://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
0616デフォルトの名無しさん
NGNGつーかエディタを作るってのはエディトコントロールを自分で作るって事じゃないの?
そこがエディタの命なんだからさ。
秀丸がリッチエディット使ってたら誰も買わないだろ。
0617デフォルトの名無しさん
NGNGstringのc_str()みたいに配列全体を得たいのですが、どのメソッドを使えばよいのでしょう。
0618デフォルトの名無しさん
NGNG0619デフォルトの名無しさん
NGNGありがとうございました。
0620デフォルトの名無しさん
NGNGエディタだけ組みこんだソフトなんか誰が作るかよ 阿呆。
0621デフォルトの名無しさん
NGNGこいつも阿呆だな。
0623デフォルトの名無しさん
NGNGいや、エディタの話をしてたんじゃないのか?
0624デフォルトの名無しさん
NGNGライブラリではCEditViewのサイズはshortで定義されてるから駄目。
WIN2000のメモ帖とか言ってるのはPC厨房。
0625デフォルトの名無しさん
NGNG帖って間違ってるYO
0626デフォルトの名無しさん
NGNGint a[100];
b=99;
cout<<a[b++];
ってやると、エラーになります?
0627デフォルトの名無しさん
NGNG試したら?
0628デフォルトの名無しさん
NGNG0629デフォルトの名無しさん
NGNG0630626
NGNG0631デフォルトの名無しさん
NGNGif(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{
}
}
0632デフォルトの名無しさん
NGNGRTTIがよくわかりません
これで実行しても、実行中にエラーになってしまいます
0633デフォルトの名無しさん
NGNGサンプルプログラムも実行時エラーがでます
0634デフォルトの名無しさん
NGNGMFCはそうだろうが、NT系のエディットコントロールにサイズ制限がないのは常識だろ?
0635デフォルトの名無しさん
NGNG>633
プロジェクト-->設定-->C/C++Tab-->カテゴリ:C++言語-->RTTIを有効にする
をチェック済みかい?
もしかしたらPro 以上じゃないと駄目かも。
0636デフォルトの名無しさん
NGNGできましたー(涙)
ありがとうございます
とりあえず、私はProを使ってますから
standardの方ではちょっとわかりませんが・・・
はまりますねコレは
ホントに助かりました
0637デフォルトの名無しさん
NGNG勝手にMFCと決めつけるなよ。
0638デフォルトの名無しさん
NGNG0639デフォルトの名無しさん
NGNGいぇす
0640デフォルトの名無しさん
NGNGありがとうございます
# gcc はデフォルトでオンだったような
0641デフォルトの名無しさん
NGNGは Deep comparison ですか?
それとも Shallow Comparison ですか?
分かる人教えて・・・
0642641
NGNGでも、分かる人いたら教えてください。悩んでるんです。
0643デフォルトの名無しさん
NGNGちょろっとコード書いて自分で試せば?
0644641
NGNGどうやって試すの?
0645デフォルトの名無しさん
NGNG頭は帽子を置く台じゃないんだから。
0646デフォルトの名無しさん
NGNG0647デフォルトの名無しさん
NGNGDeep comparisonみたいな単語だけは知ってる
Javaはホントはすごいんだけど、馬鹿が使うから馬鹿にされるんだって
0648デフォルトの名無しさん
NGNG0649デフォルトの名無しさん
NGNGC言語でエレガントに作れるものなんかあるのかよ。
エレガントだと思いこんでいる連中はいるようだが…。
0650641
NGNG相談スレだから、書いてみたんだけど・・・やっぱ
ダメだった??
= がShallowって言うのは分かるんだけど、
== がDeepなのかShallowなのか分からない・・
0651641
NGNG0652デフォルトの名無しさん
NGNG# foo->bar.bazとか
可能な限り参照を使ってみたいのですが
# foo.bar.bazみたいに
何か問題ありますか?
0653デフォルトの名無しさん
NGNG0654デフォルトの名無しさん
NGNGとりあえずリンクトリストでスタック作ってみそ
0655デフォルトの名無しさん
NGNG問題ないよ。
0656デフォルトの名無しさん
NGNGこいつ大丈夫か?と疑いはじめるだろう。
0657デフォルトの名無しさん
NGNG参照にしたところで、醜いもんは醜いんだよ。
設計がおかしいんじゃねぇの?
0658デフォルトの名無しさん
NGNGstack<CFoo> s;
s.push(CFoo(1));
s.push(CFoo(2));
s.top().bar.baz;
0659デフォルトの名無しさん
NGNG参照はポインタより制限がきつい。
無制限に使えるポインタでなければ組めないとき、
なぜその制限内に収まらないのか検討する余地がある。
参照すらいらないのにポインタを使う奴もいる。
制限の緩い機能を使うときは、強力であるが故に慎重さが欲しい。
とりあえずポインタより参照を優先するという方法は
それなりに有効だよ。
0660654
NGNGSTLのstackはデフォルトではリスト使ってないだろうと思い、
ソース読もうとして挫折。
オペレーターオーバーロードされると訳わからん
Javaに還ろ〜っと。
>>659
最初は参照で組む => 後にポインターに変更 => ->を.に置換しまくる。
つーことが良くあります。
0661デフォルトの名無しさん
NGNGそれはスキルが低すぎるからだもー。
0662デフォルトの名無しさん
NGNG構文的に曖昧になるケースなんてないんだから
全部"."にしちゃえば良かったのに。
まあドキュソ言語だからしゃあねえか>C/C++
0663デフォルトの名無しさん
NGNG何でそうなってるのか考えてみろよ
0664デフォルトの名無しさん
NGNGいや、"->"と"."は明らかに違うだろ。
ポインタと実体(もしくは参照)が同じように
見えるんだったらかなり重症だぞ。
0665デフォルトの名無しさん
NGNG参照/ポインタの使い途を定位置を参照することに限った場合、
>>662 のような意見をもつ人がいるようにも思われ。
そうじゃないだろ? とまぁ、いいたいのですが。
0666デフォルトの名無しさん
NGNG様にする事ってできますか?
(スタックならデストラクタだけ呼び出して、開放はしない)
ヒープに置いてあるやつと区別しないで扱いたいんで。
CObject a;
0667デフォルトの名無しさん
NGNGでも、どっちかというと使い方が間違ってると思う。
0668デフォルトの名無しさん
NGNGその話題、別のスレッドでも出てたな。
C だと . と -> はまとめられるけど、ハードウェアに近い階層のプログラムを組む
場合には、ポインタとスタック上の変数を文法上も区別しておいた方がいいと思う。
演算子をまとめて、バグを入れやすくなったら本末転倒だし(ただでさえバグを作
やすい言語なんだから)。
あと C++ に関しては operator->() がないとスマートポインタ実装できないから嫌
です。
0669デフォルトの名無しさん
NGNGとか使ってる人いる?マルチプラットフォームなコードで
統一しようかと思ってるんだけど。
SGI STLってなんかコンテナの種類とか増えてるね。
hash_mapとか。
0670sage
NGNG0671デフォルトの名無しさん
NGNG> ポインタとスタック上の変数を
という用語はどうかと思うが、
> 文法上も区別しておいた方がいいと思う。
は同意。char **argvとchar *argv[]を混乱する厨房を見るにつけ
0672デフォルトの名無しさん
NGNG0673デフォルトの名無しさん
NGNGバイナリがでかくなるのを除けばVC付属のよりいいんで。
ただ、コンパイラ付属のと切り替えたいときもあるんだけど、
何を#defineすれば良いのかわかんないけど。
だれかしらない?
0674デフォルトの名無しさん
NGNG同一プロジェクト内だと無理だろ。
別プロジェクトで、ということなら、単にインクルードディレクトリの優先度を変えればできるっしょ。
0675669
NGNGコンパイルが面倒とか特殊な書き方しないとだめとか
環境によって駄目とかある?
うちはWin, Mac, Linux全部やってるから出来れば
統一したいんだよね。
0676673
NGNGああ、同一プロジェクトでは統一しますが、
コードがでかいと困るときに標準を使いたいんですよ。
ただ、環境変数で一度に設定してるから優先度いじるの面倒なんで。
>>675
コンパイルが面倒も何も、VC/BCCではmake一発でとおります。
BCCは知らないけど、VCのものよりはパフォーマンスが良いです
VC使う上での注意は、必ずマルチスレッドライブラリをリンクする
必要があるということだけかな。
0677デフォルトの名無しさん
NGNG基底クラスのデストラクタを書いてなくて、
基底クラスでdeleteすると派生クラスの
デストラクタが呼ばれないって知ってた?
0678669
NGNGそっか、特に何にもしなくてもmakeでビルドできるのか。それはナイス。
VCでマルチスレッドライブラリリンクしてシングルCPUなマシンで
動かすと若干遅くない?必ずスレッドセーフなライブラリを使わないと
だめだとするとちょっと問題になりそうな気がするが。
Mac、Linuxで使ってる人が居たら状況キボン。
0679デフォルトの名無しさん
NGNG当たり前だろ。仮想デストラクタにならないんだから
0680デフォルトの名無しさん
NGNG当たり前だが、初心者がはまりやすい落とし穴ではあるな。
>>677
C++ はいろいろ過去を引きずっている影響で、いたるところに落とし穴がある仕
様になってる。痛い思いをしたくなければ Effective C++, More Effective C++
という書籍を買ってきて読んでおきましょう。
0682デフォルトの名無しさん
NGNG実際に計って速度に問題があればつかわんでいーだろ。
アプリケーション系で応答速度が要求されるような場合、
マルチスレッド化は当たり前のような気がする。
どうしても多重化出来ない場面でかつ、
スループットしか見ないのであれば、微妙な速度差にも
こだわってもいいけどね。
MTスレじゃないからsage
0683デフォルトの名無しさん
NGNG>>682
ごもっとも。なのでsage
0684思いつき
NGNGを
using foo->bar
baz = 0
と書けると嬉しくない?
0685デフォルトの名無しさん
NGNG全然嬉しくない。
入れ子にできないジャン!
0686デフォルトの名無しさん
NGNG別に常に使わなくてもいいわけだし。
C++Builderでは便利かもね。
0687デフォルトの名無しさん
NGNGwith( foo->bar ){
baz = 0;
}
の方が他の言語で慣れてるので嬉しいかも。
0688デフォルトの名無しさん
NGNGbar->baz=0;
このくらいで我慢し説け
0689デフォルトの名無しさん
NGNGtypeof_baz& baz=foo->bar->baz;
baz=0;
できるよ?なんか文句ある?
0690デフォルトの名無しさん
NGNG0692デフォルトの名無しさん
NGNGせっかくC++なんだしさ。
0693デフォルトの名無しさん
NGNG名前ってどう付けてる?
class Mona {
public:
int giko;
だとして、
・void SetGiko(int);とint GetGiko(void);
・int& Giko(void);
なんかが考えられるけど。
0694デフォルトの名無しさん
NGNGint Giko(void);
0695デフォルトの名無しさん
NGNGconst int& Giko() const;
だろ。Monaがconstになった途端アクセスできなくなるぞ。
それにその方法だと、結局もう一個
int& Giko();
を用意することになる。
0696デフォルトの名無しさん
NGNG>>695
うん、要するに聞きたいのはSet〜とGet〜っていう命名は良くないのかな
って事なのだ。個人的には悪くないと思うんだけど、オブジェクトとして
考えた時はちょっとおかしいかなと感じるんで。周りには良くないって言う
人も居る。
constに関してはその通りだね。スマソ。
0697694
NGNG隠蔽するプロパティという表現が文法に組み込まれていて
とても有用なのでおかしくは無いよ。
ただ、C++では確かに一般的ではないので
コーディング規約としてきっちり確立することが
出来ないのであればやめといたほうがいいかもよ。
規約
名詞=プロパティ Count()
動詞=メソッド Clear()
0698デフォルトの名無しさん
NGNGうん?ちょっと確認なんだけど、漏れが言いたいのは
Get/Setという命名は悪くないがオブジェクトとして見ると
オブジェクトのメソッドとしてGet/Setのような名前がついて
いるのは違和感がある
って事ね。せっかくカプセル化してるのにそのオブジェクトが
どんなメンバ変数を持っているのか外が知らないといけない
のは変だと思うわけ。
で、>>697が「おかしくは無いよ」と言っているのはどっちの表現
方法に対してのこと?それと、最後の規約の部分の文章は
・そのクラスのプロパティに関しては名詞の名前を付ける
例:Count()
・メソッドに関しては動詞の名前を付ける
例:Clear()
という読み方であってる?
0699697
NGNG>どんなメンバ変数を持っているのか外が知らないといけない
>のは変だと思うわけ。
それは命名の良し悪しとは別の問題だよ。
メソッド経由で公開するという意味ではGetGiko()もGiko()も変わらない。
理想は全部privateにして自前で処理することだけど、
そうするとクラスが肥大化したり、メソッドの引数がやたらと
多くなってくる。
# 試しにfriend/get/set一切使わないコードを書いてみるべし
なので変数(=アクセスメソッド)を公開することでコードが
簡潔(というと語弊があるが)になるならそれを避けるべきではないと思う。
おかしくないというのはCount() という表現の事。
他言語からの借用なので積極的に推すつもりは無いけど。
規約の方はその通り。
0700デフォルトの名無しさん
NGNGp = new int [x][y];
って間違ってます?
検索しても、出てきませんでした・・・
まじ質問です。
0701700
NGNGage
0702デフォルトの名無しさん
NGNGC++の質問じゃねーだろ。くだらねー質問スレへ逝け。
それにそのコード間違ってる。
0704デフォルトの名無しさん
NGNGふむ。結局、Get/Setという文字列がどうこうじゃなくて、
意味的におかしくないならGetやSetが付いた命名もあり
って事なのかな。
全部自前処理が絶対に良いとは言えないのは分かるよ。
設計が悪いと言われそうだけど、friend使わないとどうしても
見通しが悪くなることはあるよね。
規約のほうは参考にしてみる。これはこれで統一されてると
思うから、うまく命名すれば使えると思う。
0705デフォルトの名無しさん
NGNGnewの使い方の問題なのか?それ以前にポインタを復習すれ。
0706デフォルトの名無しさん
NGNGってことは、
int **p;
*p = new int* [x];
for( i = 0; i < x; i++ )
p[i] = new int [y];
ってことですか?
まとめて確保してくれると思ってました・・・
0708デフォルトの名無しさん
NGNGarray2<int> *p = new array2<int>(x,y);
みたいにしとけば?
stlで近いことが出来た気もする。
0709デフォルトの名無しさん
NGNG0710STLマンセー
NGNGAryary p;
p.resize(x);
for( Aryary::iterator it=p.begin(); it!=p.end(); ++it)
it->resize(y);
0712デフォルトの名無しさん
NGNG>>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
0713デフォルトの名無しさん
NGNGx,yは両方とも変数で無いと駄目?
0715デフォルトの名無しさん
NGNG0716デフォルトの名無しさん
NGNGどのような形で返すのが良いでしょうか?
0717デフォルトの名無しさん
NGNGなおかつそのオブジェクト同士の関連の仕方が全くの任意である場合、
その関連の仕方をデータに保存するにはどのような方法があるのでしょうか?
私が思いついたのは、全てのオブジェクトを適当に順序づけて一元に保存し、
その後、その順番を元に関連の有るオブジェクト同士の番号を別途保存する
方法なのですが、所詮素人考え、どうにも二度手間で、泥臭く感じてしまうんです。
よくありそうな処理の割に良い方法が、思いつきません。
なにかスマートな方法があったら教えて下さいませ。
0718デフォルトの名無しさん
NGNG0719デフォルトの名無しさん
NGNG説明読んだだけでは何がしたいのか良くわからんけど、
一度「デザインパターン」で検索して勉強してみることを強くお勧めする。
多分解決する。
0720717
NGNGトホホホホ、GoF本持ってる漏れは逝ってよしということですか?
___ ___ ___
| YES | ΛΛ. | YES | ΛΛ |GoFi | ΛΛ
〃 ̄ ̄∩ ゚Д゚) 〃 ̄ ̄∩ ゚Д゚) 〃 ̄ ̄∩ ゚Д゚) GoForIt!
ヾ. ) ヾ. ) ヾ. )
オブジェクトと書きましたが、実際はクラスと言うより、ほとんど構造体なので、
データの持たせ方がまずいっぽいです。むーん良いの思いつかねぇ。ムキョー
0721デフォルトの名無しさん
NGNGサンプル書いてみ?
0723sage
NGNGかっこわるいけど
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; }
};
をそいつらのメンバに加えときなさい。
0724716
NGNGどもです。やはり
const vector<type>&
とか
const type*
を返すのはダサいでしょうか?
0725デフォルトの名無しさん
NGNGいやべつにいいんでない?
0726デフォルトの名無しさん
NGNGDelphi使いな
0727デフォルトの名無しさん
NGNGよくわかっているじゃない。
0728デフォルトの名無しさん
NGNG「ダサいよ、Delphi使い。な?」
と読んだってわけか。
0729デフォルトの名無しさん
NGNGDel厨って全角英数好きなのか?
0730デフォルトの名無しさん
NGNG(map/setの内部にロック機構を持っていますかという意味です)
よろしくお願いします。
0731デフォルトの名無しさん
NGNGSTLportはスレッドセーフになってるらしいけど、
VC++とかGCCの純正(?)STLはどうなんだろうね?
0732デフォルトの名無しさん
NGNG実装によります。
0733デフォルトの名無しさん
NGNGSTL使っても速度は変わらないと思ふ
0734デフォルトの名無しさん
NGNGふつうに使う分にはかわらないね。
でも、マイクロセカンド単位で処理速度を追求する人もいるので
0735デフォルトの名無しさん
NGNGμ単位ならアセンブラ使えよ
ミリ単位ならまだ分かるが
0736717
NGNGなるほど、各オブジェクトにユニークな識別子をつける、と
ありがとうございます。こいつで色々試してみます。
>>721
というわけですいませんです。
レスありがとうございました。
0737デフォルトの名無しさん
NGNGTの最大ビット定数を得る方法ってありますか?
例: Class<unsigned char> → 0xFF
Class<unsigned long> → 0xFFFF
ビットシフトに使いたいんですけど。。。
0738デフォルトの名無しさん
NGNGT foo() { return T(-1); }
0739デフォルトの名無しさん
NGNGこれの動作、コンパイラ依存だったかな?
template<class T>
T MaxVal()
{
T t=0;
t--; //これで0xFFFFになる?(unsigned shortでWIN32の場合)
return t;
}
0740739
NGNG0741デフォルトの名無しさん
NGNG>>740
有難うございます。質問の書き込み間違えてしまいました。
最大ビット定数だと
0xFFじゃなくて0xFFFFで,
0xFFFFじゃなくて0xFFFFFFFFですね。
しかし,欲しいのは
unsigned charの時0xFFで,
unsigned longの時0xFFFFなのです。
半分だけ切り出すことって出来ますか?
0742デフォルトの名無しさん
NGNGこういうこと?
template <class T>
T foo() { return T(-1) >> (sizeof(T)*8/2); }
ただし 1 byte は 8 bits と仮定。
0743デフォルトの名無しさん
NGNG申し訳ありません。また質問を間違えてしまいました。
逝って良しですね。。。
しかし、望んでいたのはまさに>>742のお答えの通りです。
有難うございました。
0744デフォルトの名無しさん
NGNGfriendな初期化のためだけのクラス作って
staticなインスタンス一個置いとくのが定跡?
0745デフォルトの名無しさん
NGNGは?.cppでconst付きで初期化するのが普通だろ?
なんでsageてんのか知らないけどsageてるからsage。
0746sage
NGNGC++に洗脳されたプログラマとしては
JavaのStringクラスは許せないです。
なんでStringだけ+と+=演算子が特殊な言語実装になってるの?
0747デフォルトの名無しさん
NGNG0748デフォルトの名無しさん
NGNG計算機イプシロンを求めるプログラムです。
#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
0749744>745
NGNG書き忘れましたが
staticフィールドをAPIなどを使って初期化する場合です。
0751デフォルトの名無しさん
NGNGコンストラクタで(あるいは最初に使う時)
未初期化だったら初期化するようなことをするよ、おれ。
0752デフォルトの名無しさん
NGNGANSIだとmainの前に呼ばれるけど、VC++だとWinMainの前かな。
VC++で実装されているかどうか知らないけど。
g++は駄目。よって>>751してる。
0753デフォルトの名無しさん
NGNG0754デフォルトの名無しさん
NGNGそれとも
文字列データのこと?
0755sage
NGNGを作っておいて、gdbから呼べばいいんでないの??
0756デフォルトの名無しさん
NGNG0757デフォルトの名無しさん
NGNGDDD使え
0758753
NGNGでも emacs から使いたいなあ。
0759デフォルトの名無しさん
NGNGそういう訳じゃないが、リンクが簡単に辿れるのだ
http://www.gnu.org/software/ddd/all.jpg
ここのウインドウの上側をみると分かるかな?
0761デフォルトの名無しさん
NGNGGVDでもstring objectの中、見やすい。
emacsからは使えんがね。デバグにemacs使いたい心境がわか
らんなぁ。素のgdbよりは格段にマシなのはわかるけど。
0762デフォルトの名無しさん
NGNG754はC++知らない...とまでは言わないが的外れ。無視されても
しょうがないとおもうけど?
0763デフォルトの名無しさん
NGNG的は得るものではなくて、射るものですね。
ってのはともかく print 変数名だと std::string オブジェクトの内部構造もろもろが
表示されて邪魔、単純に文字列だけ取得したいって話じゃないの?
0764デフォルトの名無しさん
NGNG参照
http://www.biwa.ne.jp/~take-c/nihongo/thema%201/mata.html
0765デフォルトの名無しさん
NGNG0766デフォルトの名無しさん
NGNGじゃぁ p obj.c_str() か p obj.data() か p obj.dat
他実装によりけり。
GVDはemacs support (gvd.el) あるみたいだねスマソ。
どうサポートしてくれんのかはしらんけど…。
0767デフォルトの名無しさん
NGNG> じゃぁ p obj.c_str() か p obj.data() か p obj.dat
> 他実装によりけり。
ptype objでclassの定義見れる。
0768デフォルトの名無しさん
NGNG分かる気もするけれど、整然とは理解できません。
どなたかご教授ください。
0769デフォルトの名無しさん
NGNG0770デフォルトの名無しさん
NGNG0772デフォルトの名無しさん
NGNG> ごめん。std::stringっていたら文字列です。
俺は>>754じゃないから謝る必要ないけど、>>760でいいのかどうか、また書いてない…
>>763の想像にもお答えしてない。何もんなんだ、あんた。
0773デフォルトの名無しさん
NGNGGoF本の真似して、今までメンバ変数の頭を _dwMemberなどのように
_をつけて記述していました。しかし仕事でC++使ている友人に、それは
止めた方が良いと忠告されました。もちろん理由は教えてくれません(w
やはり何かまずいのでしょうか?
0774デフォルトの名無しさん
NGNGあたりがネタっぽいが・・・
C/C++ではアンダースコア(_)で始まる名前は予約語とされている。
だから使わないほうがいい
0775753
NGNG思ったんだけどそうではなかったみたいですね。
余計な詮索させてしまって申し訳ない。
問題は色々あるけどstringの内部表現がNUL終端文字列ではないのが
一番大きいです。print コマンドの結果から読み取るのは困難です。
c_str()を呼ぶのはいい方法ですね。気が付きませんでした。
でも状態を変えてしまうので常に使える方法とはいえません。
GVDはよさそうですね。試してみます。皆さんありがとう。
0776773
NGNGやぁ、ネタと紛らわしくてすいません。友人もよく分かってなかったんですよ。
なるほど予約語だったのですねぇ。ったくGoF本め、なんだってあんな…。
ハァ〜これから今まで書いた全部のコード置換します。レスありがとうございました。
0777セックスショパン
NGNG0778デフォルトの名無しさん
NGNG0779デフォルトの名無しさん
NGNG先頭のアンダースコアは現状では安全だと思う。
(問題出た人いる?)
アンダースコア2つで始めると危険だけど。
0780773
NGNGレスどもです。ありゃそうなんですか?今どんなマクロなら確実に変換できるか
悩んでたところだったり。いちいちコンパイルして確認するの辛いなぁとか。
間違いなく良いソースでは無いのでしょうけど、そういうことなら今までのは放置しようかな。
0781デフォルトの名無しさん
NGNGシステム予約シンボルはアンダースコア2つで始めるという仕様になりました。
...なわけないけどまあそんな感じかな。
俺はアンダースコアで始まるメンバ変数をいろんな環境でかなりの間
使ってるけど今まで問題にあったことはない。
Qt(GUIライブラリ)でもそういう命名規則やってるよ。
そもそもアンダースコア使わなきゃ絶対OKってわけでもないしね。
たとえばSolarisならsunが定義済みだったり。
ま、問題が出たシンボル名だけ変更すればいいんでない?
0782デフォルトの名無しさん
NGNGたとえば FreeBSD のスタートアップルーチンだと _progname に実行ファイルの
名前が入るようになってるから、自分のプログラムで _progname なんてシンボル
を定義するとリンク時にはまると思われ。
>>780
問題ないなら、とりあえず放っておけば? ただ _ で始まるシンボルを使うことに
はリスクがある(メリットはあまりない)から、今後は避けるということで。
0783デフォルトの名無しさん
NGNG「_で始まる語はCの予約語」
「__で始まる語はC++の予約語」
と教わったが・・・。
0784デフォルトの名無しさん
NGNGなんだぁ、ついこの前オイラがぶちあたった
問題じゃないか。俺はそれを乗り越えて進化できたYO
0785デフォルトの名無しさん
NGNG古く形骸化してるが、_で始まる名前はさけるのがよいでしょ。
>>783で言ってるのが本来のお約束。
0786sa
NGNG0787773
NGNGお勧めに従い、今までのは問題が出ない限り放っておき、大丈夫そうですが今後は
一応_を避けていきたいと思います。これからはm_か〜、慣れるまで時間かかりそう。
0788デフォルトの名無しさん
NGNGそれはない
0789デフォルトの名無しさん
NGNG__で始まるのはC++処理系で生成される予約語
って説をみたが。どうよ?
プログラミング言語C++第3版には_から始まるのは
予約語だぐらいしか書いてないが。
0790デフォルトの名無しさん
NGNG2週間の学習猶予をもらえたので
そのうちに出来るだけ身につけたいと思っています。
実際は『憂鬱な…』と『プログラミング言語C++第3版』
『CプログラマのためのC++入門』しか読んでいません。
Effective C++、More Effective C++は定評があるようなので
頑張って読めるだけ読もうと思います。
他に何かやっておいたほうが良いことはありますか?
どれをクラスにすれば良い、とかそう言う話は憂鬱な…だけで
身につけられるのでしょうか?
アドヴァイスください、助けてください。
0791デフォルトの名無しさん
NGNG0792デフォルトの名無しさん
NGNGexceptional C++ モナー。
っていうかさ、既存の(その仕事で使う)クラスライブラリの学習はしなくて平気なのか?
0793デフォルトの名無しさん
NGNG0794790
NGNGC言語馬鹿なのでとりあえず継承とかやってみようと思います。
どれをクラスにすれば良いかなんてのはどうやって学ぶのですか?
0795デフォルトの名無しさん
NGNGふつうはOO関係の本を見て学びます
コンパイラの付録で付いてくるライブラリをみて、
どのレベルでクラスを作ればよいか調べてもいいと思うが...
二週間じゃその時間もないな
0796792
NGNGいや俺が言ってるのはMFCとかQtとかXercesとかそういうモノの学習は?
ってことよ?
どれを〜 は憂鬱でいいんじゃないの?あとある程度書けたら(納期的に
あともどりできるうちに)、デザインパターン読むと、劇的にコード改良
できたりするよ。さいしょのうちは。
0797794
NGNGオブジェクト指向における再利用のためのデザインパターン 改訂版
ガンマ,エリック ヘルム,リチャード ジョンソン,ラルフ ブリシディース,ジョン
ソフトバンクパブリッシング (1999)ISBN:4797311126
0798デフォルトの名無しさん
NGNG0800794
NGNG権威のある(一般的な)コーディングスタイルは存在しないのですか?
ネットで調べたところ、
メンバ関数にはm_をつけてClass名の始めは大文字 というのが多いみたいですが。
0801792
NGNGおれはJava風に書く。m_ などつけない。
#MS系はともかく、UNIXでいろいろなライブラリ使ってるとスタイルの不統一
#の酷さでめまいがするよ。
0802デフォルトの名無しさん
NGNGクソな記法でも、信者を量産したもの勝ちだっていうのか?
おれはそんなの認めない。認めないんだ!
0803794
NGNGhttp://geosoft.no/style.html
ですね?
もし違うにしても、ここに書いてあるものが見やすいような気がする。
0805デフォルトの名無しさん
NGNGなんでCって変数名 短くするの?
C++風に読める形にしたほうがいいのに。
0806デフォルトの名無しさん
NGNGC++はないはず。
0807デフォルトの名無しさん
NGNGこれって変?
で、クラス名は大文字始まり、publicメソッドは大文字
始まり、protectedとprivateのメソッドは小文字始まり
の名前つけてます。
あと、STLとかもよっぽどで無い時以外はstd::つけてる。
0808デフォルトの名無しさん
NGNGそれはオブジェクト指向的日常あたりの影響かい?
0809デフォルトの名無しさん
NGNGスマソ、それ知らない。
題名から察すると雑誌の連載かなんか?
後ろアンダーバーはC++FAQの影響。他は特になし。
0810デフォルトの名無しさん
NGNGそのスタイルに従うのがいいんじゃ。
0811セックスショパン
NGNG変数は
int MyInt;
こんなかんじです。
そして
関数は
void MyFunc();
こんなかんじです。
そしてクラスは
class MyClass{
}
こんなかんじです。
そして定数は
const int MyConstInt=1;
こんなかんじです。
0812セックスショパン
NGNG0813デフォルトの名無しさん
NGNGプログラミング言語がなんのために存在しているのか
分かっていない。そういうのを好みで速攻置換するために存在する。
とPerlマンにうそぶかれて鬱。
0814デフォルトの名無しさん
NGNGやっぱプログラムの細かいところはあんまり詳しくないのかな。
リスト構造とかスタックとかも作る必要ないし。
0815デフォルトの名無しさん
NGNG収録されているソースコードがコンパイル出来ないのですが
何か他にソースが必要なのでしょうか。
最後の魔方陣の奴です。
環境はでびあん、コンパイラはG++つかいました。
0816デフォルトの名無しさん
NGNGg++ならたぶん答えられるからエラー貼ってみ?
0817815
NGNG/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
0819815
NGNGコード変換していないのがまずいのでしょうか。
CDに入っていたソースはウインドウズに合わせていて EUCにはなっていなかったのですが。
nkfで一気に変換する方法を知らないのでそのままコンパイルしたのですが。
0820816
NGNG> コード変換していないのがまずいのでしょうか。
コンパイルは通ってるからいまは問題ないです。
Nummgr.h と Hline.h で setnextline(),
getmax(), delnum() の実装が書かれていると
思うけど、 inline がついていないでしょ。
書けば通るよ。バグです。
0821815
NGNG有難うございます。
付属のCDにもバグと言うものはあるのですね。
これもまた、課題の一つだったのかも知れませんが。
0822SS
NGNG0823デフォルトの名無しさん
NGNG0824SS
NGNGなんで?スタンダードテンプレートライブラリが?
0825sage
NGNGこの本てどこがいいの?斜め読みした感じいまいちというか全然
わからんのだけど。
普通の今時の入門書籍がJavaでやる類のことをC++でやったというだけか?
0826デフォルトの名無しさん
NGNGOOよりもEffectiveC++のような落とし穴を解説した本の方が必須だしな。
0827デフォルトの名無しさん
NGNG最後に載ってるソースコードは読みにくかったです。特殊な書き方ですね。
あの本読んでも最後の演習がよくわからなかったのですが
これは私のおつむが弱いからですか?
あれが一番簡単なOO本なんですよね?
プログラミング言語C++にしてもEffectiveC++にしても
あぁいうスタンスではないだろうから他に頼るものが…。
0828816
NGNGEiffel書きだろうが読む意味あるとおもいますがねえ。
>>825
具体的な書名は?
0829あ
NGNG0830デフォルトの名無しさん
NGNG0831あ
NGNG0832デフォルトの名無しさん
NGNG> あの本読んでも最後の演習がよくわからなかったのですが
> これは私のおつむが弱いからですか?
自分の分析力を信じろ。君のクラス設計が世界で一番正しい。
0833825
NGNGC++ == OO
は無い。高レベルではgenericsやMSのCOM、低レベルでは組み込み
にOOを使う方法とか、C++のおいしい部分に関心無しにOOが欲しい
だけならC++で学習する意義は薄いと思うぞ。今はJavaやC#があるん
だからそっちで勉強した方がいいんじゃないの?
C++を中途半端に学習して消化不良になると時間の無駄だと思うが。
>>827
>プログラミング言語C++にしてもEffectiveC++にしても
>あぁいうスタンスではない
どのへんが? 後者はともかく前者は読んでないってこと?
0834デフォルトの名無しさん
NGNG君のHNあほの「あ」か
0835あ
NGNGjava ごとき でついていけないなんてことはあってはならない。
0836デフォルトの名無しさん
NGNGがんばってね
0837827
NGNGいや、一応読みましたが全て通して読んではいません。
前半部分の機能説明の部分を辞書を引くようにして読んだ程度です。
そう言えば最後のほうに設計関係のことが欠いてあったような…
申し訳ない。
0838あ
NGNGjava 程度 でついていけなくなるのは 絶対に おかしい。
0839デフォルトの名無しさん
NGNGマジな話し、自分の使いやすい言語作れ。
0840816
NGNG(激しく)同意。
が、Java入門書と銘打ったもので良いOO入門書あるなら教えてくれよ。
感銘を受けるほどのOO入門書って少ないと思うので。
>>837
プログラミング言語C++を設計入門として読むなら、先にピアソンの
「オブジェクト指向言語のはなし」を購入しておくことを勧めるw
0841827
NGNG→Effective→More Effective
→デザインパターン→…
ですか?
0842816
NGNGMoreは読まなくてもいいんじゃない?
0843デフォルトの名無しさん
NGNG0844あ
NGNG参考書は努力して読むものじゃない。参考にするものだ。
∴努力して読む奴=3流。
(証明終
0845デフォルトの名無しさん
NGNG手段は問わず。結果を出せれば良し。
参考書読まないのは構わんが、それでダサい設計をしたり余計なバグを
埋めたら銃殺。
0846あ
NGNG0847デフォルトの名無しさん
NGNG0848あ
NGNG0849デフォルトの名無しさん
NGNG0850あ
NGNG0851816
NGNGこのスレ印刷して病院で聞いてみたら? >>850
きみがだれにも負けない一流の何かをもっているならそれは
おめでたいことだが、たとえその点で勝っていても、こんな
ところで意図不明(意味不明とは言っていない)の発言を繰
り返すような人間が健全と言えるか?ジジイになったときに
楽しい人生だったと思えるようにするために、やっておくべ
きことがもっと他に沢山あるんじゃないのか?
0852816
NGNG0853あ
NGNGネタにマジレスさんくす!あー釣れた釣れたおもしろかった。今度牛丼おごるよ。
0854816
NGNGまぁコピペだから気にすんな。
0855デフォルトの名無しさん
NGNG0856827
NGNGなるほど。当たり前と言えば当たり前のような気が。
私はどうも参考書だのみになってしまうので
永久に三流です。
今度なんか簡単なのを設計してみようと思います。
0857あ
NGNGそんなことはありません。世の中に”絶対”は無いのですから。
0858デフォルトの名無しさん
NGNG0859デフォルトの名無しさん
NGNG自動変数の確保される領域を自前で管理する方法はないでしょうか?
色々調べているのですが方法が見つかりません。どうかご教示ください。
0860ぃ
NGNGなんでそんなことがしたいのかおしえて〜
0861体育会系PG
NGNG参考書なんか読むな!
いきなりソースをにらむのだ!
読書百篇意自ずから通ず!
0862859
NGNGnew, delete のオーバーロードだと
うっかり delete を書き忘れた時にリークしてしまうので
スコープの最後で必ずデストラクタが呼ばれる
自動変数の形でこれらが記述できると便利かと思ったんです。
方法、あるでしょうか?
0863ぃ
NGNGかならずデストラクタが呼ばれるのだから、リークしない
(しないように書ける)じゃん。
0864859
NGNGいえ、基本的には全部ヒープを自分で管理したいんです。
ただ、そのために new, delete のオーバーロードを使っていると
うっかり delete を書き忘れたときに困るので
見かけは自動変数で中身は自前ヒープ上に、という形にしたいんです。
なぜ自前でヒープ管理したいかと言えば
指定されたメモリ空間内だけで処理が行なわれるようにしたいからです。
ちょっと特殊なソフトを書いてまして・・・
仕事が絡んでるので申し訳ありませんが詳細は公開できません・・・
0865ぃ
NGNG俺なら自動変数としてオブジェクト作成(Aとする)して、そいつに
newしたオブジェクト(Bとする)の参照渡して、Aがスコープはずれる
タイミングでBをdeleteするが、それでは駄目??
そんなことは結構やるなぁ。
0866ぃ
NGNG>AがスコープはずれるタイミングでBをdeleteするが
自明だと思いますが、Aのデストラクタで、の意。
0867859
NGNGそれでもいいんですが
自動変数のデフォルトのメモリ制御を
オーバーロードあたり一発で済ませられれば
それが一番スマートかと思いまして。
placement new に似た自動変数の初期化構文があるだけでも
かなりすっきりとするんですが・・・。
0868デフォルトの名無しさん
NGNGグローバルにクラスをひとつ置いて、
コンストラクタとデストラクタで処理するのは?
0869デフォルトの名無しさん
NGNG0871デフォルトの名無しさん
NGNG0872859
NGNGvoid bar( void){
simple_gc gc ;
Foo* foo1 = new( gc) Foo ;
Foo* foo2 = new( gc) Foo ;
/* 処理 */
// ここで gc がデストラクトされて foo1, foo2 もクリアされる。
}
0873デフォルトの名無しさん
NGNGいまどきのC++だと、
#include <stdio.h> → #include <cstdio>
ですが、↓これはどういう名前に換えれば良いのでしょう?
#include <sys/socket.h> →?
0874デフォルトの名無しさん
NGNGなので、どうしてもいまどきのスタイルに死体なら自分で<sys/socket.h>を
インクルードする"csocket"という名前のファイルでも作って標準includeパス
にぶちこんどけ。
そうすれば#include <csocket>で行ける。激しく無意味だが。
0875デフォルトの名無しさん
NGNGそれって、自動変数に代入されるヒープ領域の管理であって、>>859の
自動変数の確保される領域を自前で管理する方法
なの?
本人納得なら別にどーでもいいことなんだけど。
0876デフォルトの名無しさん
NGNGイヤ過ぎる...
0877デフォルトの名無しさん
NGNGextern "C" {
#include <sys/socket.h>
}
ちゃいますの? Stroustrup本の9.2.4見てねん。
# せんで大丈夫なのは、たまたまそういうlinkageの実装の時だけ。linkage的には本質。
0878デフォルトの名無しさん
NGNGせんで大丈夫なのは、ヘッダファイル中に extern "C" が書かれている
からでしょう。ほとんどの場合。
0879デフォルトの名無しさん
NGNGCompilerは、Borland C++を検討しましたが
諸問題を抱えるのでcygwinを導入してcomlileしようと
思うのですがcygwin窓の$はプロンプトですか?
gccは単なるCコンパイラーですか?
0880デフォルトの名無しさん
NGNGそうです。
>gccは単なるCコンパイラーですか?
そうです。
0881デフォルトの名無しさん
NGNG>諸問題を抱えるので
それはあなたです。
0882デフォルトの名無しさん
NGNG> 諸問題を抱えるのでcygwinを導入してcomlileしようと
MinGWもいいよん。
http://www.ab.wakwak.com/~tino/windows/
0883デフォルトの名無しさん
NGNG0884デフォルトの名無しさん
NGNGどうすれば良いですか?
とりあえずプログラミング言語C++第3番のクラスのところからよみはじめましたが。
0885デフォルトの名無しさん
NGNG0886デフォルトの名無しさん
NGNG0887デフォルトの名無しさん
NGNGC++ だと、あるていどオブジェクト指向を分かってないと、既存のコードを読んでも (?_?)
となるかもしれず。
0888884
NGNGプログラミング言語c++は全部読んでる余裕がないので
クラスのところから読み始めたんですが。
最初の方はたんなる紹介のような感じがしたので。
0889デフォルトの名無しさん
NGNG今までにオブジェクト指向言語の経験があるなら、
必要なところをかいつまんで読めばいいけど、
経験無しなら、プログラミング言語C++だけじゃ
つらいかも。
0890884
NGNG読みましたけど足りませんか?
プログラミング言語C++、K&Rのようなものを期待していたのですが
わかりにくいです。来週からC++の仕事が始まるというのに
0891デフォルトの名無しさん
NGNG0892デフォルトの名無しさん
NGNGC++が部品化とか再利用が利点とありますが、意味が良くわかりません。
例えば、あるクラスを自前で書いて、それにclass.h class.cpp
という名前で持ってたとして、ある日、別の似たような仕事で
そのクラスから派生させたクラスを作ればうまくいきそうだと
したとき、差分を書いたnewclass.hでclass.hをincludeして、
class.cppとnewclass.cppをリンクすれば再利用、C++って
ウマーってことになるんでしょうか(ハァ...なんか自分で書いてて鬱)
下らない質問でごめんなさい
0894デフォルトの名無しさん
NGNG部品化についてはEssentialCOMという本(のはじめの方)が簡単で良いです。
0895デフォルトの名無しさん
NGNG0896デフォルトの名無しさん
NGNG気合いを入れる
0897895
NGNG0898デフォルトの名無しさん
NGNGコメントのしようがない。 Cの方法もそのまま使えるし
0899デフォルトの名無しさん
NGNG何も考えずにダブルクリックしてみろ!
一行と言わず何十行もまとめて読める。
0900デフォルトの名無しさん
NGNGstring line_buf;
ifstream file("text.txt");
getline(file, line_buf);
こんなクソコード書いていいのは初心者のうちだけだぞ!
0901デフォルトの名無しさん
NGNG何故ですか?
stringが定義されていないと出ます。
#include <string>
int main()
{
string str;
return 0;
}
0902デフォルトの名無しさん
NGNG0903あ
NGNGnamespace std{
#include<string>
int main()
{
string str;
return 0;
}
}
0904デフォルトの名無しさん
NGNGusing namespace std;
何のことかわからないなら「名前空間」を調べてみよう。
0905あ
NGNG安全にネームスペースを使うにはこうする。
プロの開発現場ではよく使われる手法。
#include<string>
namespace std{
string str;
}
int main() {
std::str="1";
return 0;
}
0906デフォルトの名無しさん
NGNG違いますか?
プログラミング言語C++にもそう書いてありますが。
0907あ
NGNG大嘘。なんていう本ですか。
0908901
NGNG0909あ
NGNG0910デフォルトの名無しさん
NGNG嘘だよ。
#include <iostream.h> とか #include <stdio.h>
と、
#include <iostream> とか #include <string>
などの違いを調べてみるのも吉かと。
0911あ
NGNG.hはC言語時代の名残です。
0912デフォルトの名無しさん
NGNG誰とは言わないが。
0913あ
NGNGワラタ
激しく同意
0914デフォルトの名無しさん
NGNG909にワラタ。おれも。
0915デフォルトの名無しさん
NGNG拡張子ないと開かないんだよね・・
0916デフォルトの名無しさん
NGNGint 型2つをセットするにはどのようにすれば良いのですか?
stringの使い方のページが見当たらなくて。
0917デフォルトの名無しさん
NGNG0918あ
NGNGstring a,b,c;
char buf[10];
int d,e;
itoa(d,buf,10);
b=buf.
itoa(e,buf,10);
c=buf.
a=b+","+c;
多分違うと思うけど
0919デフォルトの名無しさん
NGNGint a = 1;
int b = 2;
// これをStringにセット
cout<<string.c_str();
-out put-
1 2
0920デフォルトの名無しさん
NGNG0921デフォルトの名無しさん
NGNG環境依存。
0922デフォルトの名無しさん
NGNG0923920
NGNG標準じゃないのね。Javaだって標準なのに。
0924デフォルトの名無しさん
NGNGJava以外に標準でスレッドインタフェースを持ってるものを考えてみ。
0925デフォルトの名無しさん
NGNGCも標準じゃないよ。POSIX環境ならCもpthreadも両方定義しているけど。
ISOやJISになっているくらいメジャーな言語でマルチタスク/スレッドが標準なのって、
Adaくらいじゃないの?
> Javaだって標準なのに。
「だって」って、Javaはmulti-plathomeでの道具の豊富さは他の追従を許さないよ。
// performanceとか、他に問題はかかえているけど。
0926デフォルトの名無しさん
NGNGここで、
char buf[2][64];
などとしたはいいんですが、
関数の宣言部でこれを引数で使いたいとき、
int functionA(...... ,buf[2][64]);
とやっていいものでしょうか?こんなの見たことありません。
int functionA(...... ,buf[][]);
ですか?それとも、
int funcitonA(...... ,**buf);
でしょうか、わかりません。お助けください。
0927デフォルトの名無しさん
NGNGマルチスレッドをサポートしないJavaプラットフォームも実在しますが、何か?
0928デフォルトの名無しさん
NGNG0929sage
NGNGそうなのか。
以下はそれがホントだとして書いてみる。
javaはどうせ廃れると思って見てなかったけど、駄目さ加減を知るために
いっちょやってみるか。
CやC++でマルチスレッドがサポートが標準で言語仕様にないのは、
これらの言語がアセンブラの延長として考案、拡張されてきたからだろうね。
アセンブラのニモニックレベルでマルチスレッド(というか同期処理)を処理する
CPUが20年以上前に作られていたら、Cの言語仕様にも組み込まれて
いただろうに..
0930デフォルトの名無しさん
NGNG926の一番上のものでOK。
928ももちろん正解。
0931デフォルトの名無しさん
NGNG>Javaはmulti-plathomeでの道具の豊富さは他の追従を許さないよ。
あれは既得権益というのです。
0932デフォルトの名無しさん
NGNGコンパイラによっては一次元配列以外バグコード出すのもあり。
0933デフォルトの名無しさん
NGNG単なる文字列ということで知識を深めていますから、
**bufで行こうかとも思いますが、それでもバグコード
が出るのだったら厄介ですーーーナ
さんくす>>932
0934デフォルトの名無しさん
NGNG関数に渡す前にmallocやらをしないと怒られるかな・・・
0935デフォルトの名無しさん
NGNGchar **argvの場合
argvとargcはたいてい組みでつかいますか?
argc使わなくてもごり押しでいけますか?
7割くらいわかってるつもりなんですけど。。
0936デフォルトの名無しさん
NGNGでもその前に getopt を覚えろ。
そしてそれ以前にスレ違いであることを反省しろ。
0937デフォルトの名無しさん
NGNGありがとうございます。>>936
0938sage
NGNG・要素内容:可変長buffer(malloc したbufferみたいな)
・要素数:可変
の配列って、どうつくるのですか?
vec[i] = new buf(size);
みたいにやれば、vec の消滅とともに思いっきり
メモリリークしそうだし。
auto_ptr するのも面倒だし。
第一、vector の要素に auto_ptr の pointer 入れた場合って、
auto_ptr のデコンストラクタがちゃんと呼び出されることが
「保証」されてるのですか?
みたいなのって、
0939sage
NGNG0940sage
NGNGstd::vector<variable_length_buffer> hoge;
貴様にauto_ptrはまだ早い。
ついでにsageはコテハンじゃ。
0941デフォルトの名無しさん
NGNG2.それをvectorに格納。
可変長バッファの用途が文字列ならstd::string。
0942デフォルトの名無しさん
NGNGstd::vector< std::string > 可変長バッファの可変長配列
std::stringは文字列じゃなくても利用できるっす(\0が途中にあっても関係ない)。
>第一、vector の要素に auto_ptr の pointer 入れた場合って、
>auto_ptr のデコンストラクタがちゃんと呼び出されることが
>「保証」されてるのですか?
保障されるっす。デバッガで追いかけるとわかる。
でも以下のコードはメモリ漏れるので注意。
{
std::auto_ptr<char> p = new char[100];
}
auto_ptrのデストラクタはdelete[]ではなくdeleteなので。
0943デフォルトの名無しさん
NGNGstring 型でいいのか。すげぇ!これなら俺でもわかります。
> std::vector<variable_length_buffer> hoge;
hoge[0] = "variable_length_data";
・・・・・・
hoge[0] = "change_to_more_and_more_long_lenght_data";
みたいにできるのかな?
やってみよう・・・。
0944943
NGNG943 で聞きたかったのは、
940 さんみたいにやったばあい、そのやりかただと、
variable_length_buffer[] の要素が、charの配列みたいに、
メモリ上に連続で並んでいることが保証されてないとヤバくない?
ってことです。
もちろん、vector は普通は単なる配列として実装されてるので、
実際問題としては動くとは思いますが。
0945デフォルトの名無しさん
NGNGplatformと思っていたのですが、コンピュータ関係ではplathomeでOKですか?
いや、マジで聞いてます。
0946デフォルトの名無しさん
NGNG私も数年前までは何気に「ぷらっとほーむ」と発音してましたが
plathome という英単語は存在しない模様
「がいしゅつ」と同類かと
google で検索してみると,ヒットするのは殆ど日本語サイトでした・・・
ってのはぷらっとホーム株式会社(plathome.co.jp)がヒットしたからなんだけど,
そうでなくても間違って憶えている人は多いみたいっすね
ちなみに「ぷらっとホーム」は Plat'Home と表記して欲しいみたいです
0947946
NGNG・・じゃなくて,私も質問っす
BCB や VC++ では「プロパティ」てな概念が存在します
変数に代入したり変数を参照するような文を書くだけで
特定の関数を呼び出せるようなやし
具体的には BCB なら __property キーワード,VC++ なら
__declspec(property()) っすよね
他の C++ コンパイラではどうなんでしょうか?
テンプレートとクラスである程度似たようなことはできるけど,
さすがに限界もあるわけだし
あと,プロパティは C++ 的にどれくらい嫌われてますか(わらぃ
09483文字回答
NGNGCOM
0949946
NGNG3文字レスどうもです
そうっすね、BCB や VC++ なんかは COM のおかげで
「プロパティ」の概念の必要性が出てきたわけで
ということは、標準的にはどのコンパイラも __property みたいな
機能を備えている保証はないし、
特にこれから搭載される予定もなさそうだ〜、ということで
オッケーっすか
# ていうかずっと __property に甘えたコード書いてました(ゎらぇなぃ
0950948
NGNG「C#」
Delphiつーのは無しな。
0951デフォルトの名無しさん
NGNGstd::vectorは operator[] を持ってます。持ってないと[]での
アクセスはできないので。
まぁ、libstdc++では、仰る通り
reference operator[](size_type __n) { return *(begin() + __n); }
const_reference operator[](size_type __n) const { return *(begin() + __n); }
となってますけんど。
0952デフォルトの名無しさん
NGNGmemcpy( &vec[0], pBufSrc, vec[0].size() );
みたいなのは、
実際には動くだろうけど、
厳密にはSTLのインプリメントに依存すると
考えてOKですか?
0953デフォルトの名無しさん
NGNGvec[0].resize(pBufSrc.len);
memcpy( &vec[0], pBufSrc.dat, vec[0].size() );
みたいなの。
ようは、vec[0] に入っているはずの可変長バッファに
STLでも何でもない普通のバイナリデータを転送する、とか。
Cだと、malloc したバッファへのポインタを要素とする配列を用意して、、
とかやんなきゃいけない場合を、STLできれいに書きたいのです。
0954データ抽象マンセー
NGNG#include <algorithm>
string& buffer = vec[0].resize(pBufSrc.len);
std::copy((char*)(pBufSrc.dat), (char*)(pBufSrc.dat) + pBufSrc.len, buffer.begin());
こんなん? Cからの移行組は一旦実装はスカッと忘れなさい。でなきゃ悟れない
0955デフォルトの名無しさん
NGNGm += n; // 両方ともEnum型
この演算子に適切な方への変換定義を行いません
というエラーが出るのですが
0956デフォルトの名無しさん
NGNG0957デフォルトの名無しさん
NGNGそりゃ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); と同じこと(それが望んだ結果かどうかは別)。
0958デフォルトの名無しさん
NGNGSTLはコンテナばっかり使ってるわ。
真っ当にもう一度勉強して悟ろう。
0959デフォルトの名無しさん
NGNGそろそろ次スレを立てたいのですが、1に書くべき文面はいかがいたしましょう。
また2〜3あたりに貼り付ける、おすすめリンク等ございましたら、ご教示ください。
0960デフォルトの名無しさん
NGNGこんな感じでどうですか。
【スレタイトル】
C++相談室 Part3
【1の本文】
OS/環境に依存しないC++の話題。STLも可、むしろ歓迎。
前スレ http://piza2.2ch.net/test/read.cgi/tech/996640937/
C++参考リンクは>>2を参照のこと。
0961デフォルトの名無しさん
NGNGこんな感じでどうですか。
【スレタイトル】
C++相談室 Part3
【1の本文】
OS/環境に依存するC++の話題。STLも可、むしろ必須。
前スレ http://piza2.2ch.net/test/read.cgi/tech/996640937/
C++参考リンクは>>2を参照のこと。
0962デフォルトの名無しさん
NGNGSTL関係
SGI STL
http://www.sgi.com/tech/stl/
STLport
http://www.stlport.org/
STL日本語解説ページ
http://www.wakhok.ac.jp/~sumi/stl/
0963962
NGNG割と詳しい入門ページ
http://www.d1.dion.ne.jp/~ecb/cpp/cpp00.html
0964デフォルトの名無しさん
NGNG0965分かりません。
NGNG一体なにが戻ってきているのですか?
例えば
strtype& operator+(strtype& ob);
のような関数の場合、戻ってくるのは
一時オブジェクトではなく、何なのですか?
0966965
NGNG突然ですいませんが、どうやら根本的なところが分かってないみたいです。
#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;
}
0967デフォルトの名無しさん
NGNGstrtype(){*p='\0';len=0;}
0969デフォルトの名無しさん
NGNGC++ Final Draft International Standard
http://www.kuzbass.ru/docs/isocpp/
0970965
NGNG0972デフォルトの名無しさん
NGNG0973965
NGNGありがとうございます。
あの部分は変更したのですが、
まだうまくいかないみたいです。
ちなみに
strtype(){;}
↑こうしました。
あのプログラムは
return tempのところに問題があるみたいなんですが。
0974デフォルトの名無しさん
NGNGいまやってるのは、
ある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;
とかやってもダメっす。
(正確には、コンパイルは通るけど、使い方がわからん)
0975デフォルトの名無しさん
NGNGEffective C++の29校も読むと世濾紙
0976デフォルトの名無しさん
NGNG0977965
NGNG関数内で定義した変数は参照で戻せないみたいです。
コピーコンストラクタをつくって、一時オブジェクトで
もどしたらできました。
それからやはり最初のstrtype(){*p='\0';len=0;} がまずかった
みたいです。
ありがとうございます。
0978デフォルトの名無しさん
NGNG0979974
NGNG0980キリ番ゲッター
NGNG0981キリ番ゲッター
NGNG邪魔するなよ>ALL
0982キリ番ゲッター
NGNGウラビデオさしあげます
0983キリ番ゲッター
NGNG配布場所
http://www.megabbs.com/cgi-bin/readres.cgi?bo=douga&vi=991411619&rm=100
0984キリ番ゲッター
NGNGもらえなくなるんで
注意!!!!
0985キリ番ゲッター
NGNGお願い
くださいな
0986キリ番ゲッター
NGNGbaka
0987キリ番ゲッター
NGNGプログラマー=きちがい
0988キリ番ゲッター
NGNGhehehe
0989キリ番ゲッター
NGNGお前らも 手伝え
0990キリ番ゲッター
NGNGおまんちょ丸見えビデオをとるか よーーーーーく考えろ
0991キリ番ゲッター
NGNG0
0
0GET だよーん
0992キリ番ゲッター
NGNGしぶといなあああああ
0993デフォルトの名無しさん
NGNGサム
0994キリ番ゲッター
NGNGお前のような
邪魔者は
去れ
0995キリ番ゲッター
NGNGなんで
邪魔するんだーーーーーーーーーーーーー 氏ね>>993
0996キリ番ゲッター
NGNG邪魔するんじゃ
ねーーーーーーーーーぞ!!!
0997キリ番ゲッター
NGNG氏ね〜〜〜〜〜〜〜〜〜!!!!!!>ALL
0998キリ番ゲッター
NGNG0999デフォルトの名無しさん
NGNGオソ
1000キリ番ゲッター
NGNGははははっはははははh
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。