■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part27
751 名前:デフォルトの名無しさん :04/02/22 10:52
>>750
確か2003版では補遺として保証されるようになってる

752 名前:デフォルトの名無しさん :04/02/22 10:53
>>744
std::vector<int>::iterator == int* なのが独自ルール
何のためにわざわざ iterator なのか考えたこともないからこそ後置++に何も感じないわけだな

753 名前:デフォルトの名無しさん :04/02/22 10:54
>>750
>連続領域であることを規格で保障すべきだという意見が出てるんだっけ?

詳細きぼん

754 名前:デフォルトの名無しさん :04/02/22 10:56
>>749
そういや、sub の実装でポインタ使う必要性ないね。
参照で十分だ。
やるね。

755 名前:744 :04/02/22 10:57
>>752
あーsub側だけについて問題なしって意味で書いてたよ。
呼ぶ側がiteratorをいきなり渡すのはsubとは関係ない問題だが
そっちが主問題だったね。

ただ書き換え目的だから、subは参照で受けてiteratorは参照はずしして
渡すようにするべきかな。

756 名前:デフォルトの名無しさん :04/02/22 10:57
>>751
ほー。最新情報ありがd。

757 名前:744 :04/02/22 10:58
って749で出てたか・・

758 名前:デフォルトの名無しさん :04/02/22 11:02
>>750
ISO14882-2003::23.2.4/1
> The elements of a vector are stored contiguously, meaning that if
> v is a vector<T, Allocator> where T is some type other than bool,
> then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size().

どうでもいいが meaning 以下はそこだけ見ると、例え連続領域じゃなくても
& 演算子をオーバーロードしちゃえばそういうProxy作れてしまう気がしなくもない。
そういう意味でないのはわかるんだけど。

759 名前:758 :04/02/22 11:03
あー、でも operator[] に条件があるからProxyは返せないか。失敬失敬。

760 名前:デフォルトの名無しさん :04/02/22 11:44
>>758
vector<bool> が除外されてるのは何でだろう?

761 名前:デフォルトの名無しさん :04/02/22 11:48
>760
vector<bool>は色んな意味でママコだからね。


762 名前:738 :04/02/22 11:50
>std::vector<int>::iterator と int* は本来は違うものなので、
>std::vector<int>::iterator を受け取るつもりで int* を使うのは間違い。
>int* を受け取るつもりで std::vector<int>::iterator を使うのも間違い。
>たまたまVC6だと両者が同じ型なんでうまくいっているだけ。

>std::vector<int>::iterator == int* なのが独自ルール
>何のためにわざわざ iterator なのか考えたこともないからこそ後置++に何も感じないわけだな

なるほど、小さな親切 よけいななんとやらですね。
(頼っていた私が悪いのですが)
iterator は、コンテナの中身を指す為のポインタのような感覚で使ってました。
現在のソースの書きなおしから入ります。

>std::for_eachを使うけど勉強中ならまだfor_eachは気にせんでいい。
一通りSTLの本は 読んだので存在は知っていたのですが、いかんせん名前が
思い出せなかったもので、
巡回、イテレータ、アルゴリズムなど 検索したのですが、なかなかヒットせず
一人でもがいていました。
もう質問はないです。ありがとうございました。

763 名前:デフォルトの名無しさん :04/02/22 11:55
イテレータを受け取る関数をつくるならば
テンプレートにして受け取ればよい。

764 名前:738 :04/02/22 12:02
テンプレートは まだ狙って使えるレベルではないです。
テンプレートを極めていくと ジェネリックプログラミングに通じていくのかな?

とりあえず、精進します。

765 名前:デフォルトの名無しさん :04/02/22 12:12
>>762
sub(&*p); と呼べば一応引数がポインタの関数にも渡せるよ。

766 名前:デフォルトの名無しさん :04/02/22 14:50
vector<int> a;

vector<int>::iterator p;
for(p = a.begin(); p < a.end(); p++) {
if(// 条件) { a.erase(p); }
}
このコードは正常に動きますか?(特にp < a.end();の部分)

767 名前:デフォルトの名無しさん :04/02/22 14:54
>>766
// 条件

/* 条件 */
に変えれば動くと思われる。
vector<>::iteratorはRandomAccessIteratorだから、<で比較できることが保障されている筈。

768 名前:デフォルトの名無しさん :04/02/22 14:59
>>766
vector::iterator は RandomAccessIterator なので、OK。

769 名前:768 :04/02/22 15:00
ゴメンナサイ

770 名前:デフォルトの名無しさん :04/02/22 15:00
>>767
どちらにしろ条件式がないじゃんかw
そんなところはどうでもいい。

>>766
正常に動かない。
p を a から消去した場合、p を進めてはいけない。

771 名前:デフォルトの名無しさん :04/02/22 15:03
>>766
eraseの戻り値を使わないとまずいんじゃない?

772 名前:デフォルトの名無しさん :04/02/22 15:11
!=でない理由もよくわからない。

773 名前:デフォルトの名無しさん :04/02/22 15:14
>>766
てか、remove_ifしてeraseだろう

774 名前:デフォルトの名無しさん :04/02/22 16:46
STL portにはイテレーターをあえてポインタじゃないように実装して
チェックできるようにるすマクロなかったっけ?

775 名前:766 :04/02/22 16:49
>>767-768
ふむふむ。

>>770-771
なるほど、言われてみれば、理屈としておかしかったです。

>>772
eraseによって、endが1つ減って、pがインクリメントされて、
!=だと無限ループになるんじゃないか思っていたんですが、
770で指摘があったとおり、そもそも考えが間違ってました。

>>773
remove_ifを知らなかったので、検索してみたんですが、
いまいち使い方が分かりません。
単にeraseの戻り値を使うだけでは、駄目ですか?




776 名前:デフォルトの名無しさん :04/02/22 17:09
>>775
>>773の事を含め、おまいさんはEffective STL読んだ方が良い。
今読めば収穫も多いハズ。

777 名前:766 :04/02/22 17:31
>>776
3,200円は高いので、googleの検索で頑張ろうと思います。


皆様、教えていただきありがとうございました。

778 名前:773 :04/02/22 17:31
>>775
Effective STLの第32項を読め。絶対に買え。
a.erase(
remove_if(a.begin(),a.end(),/*条件*/),
a.end()
);
とするのが慣用的。慣用的方法を覚えないと周りの人間は読みにくい。
…携帯でコードは書きにくいなぁ…
(´Д⊂

779 名前:766 :04/02/22 17:49
>>778
絶対に買った方がいいですか・・・

前にlistでfindを使っているコードを見たことがあるんですが、
その感じだと、remove_ifはfindに近い物と見ていいですか?
766に書いたコードは、最初から削除したい対象があるわけではなく、
vectorに詰め込んだデータを、1つずづチェックして、場合によっては削除するって感じなので、
emove_ifがfindのような物だとすると、remove_ifは、不適切だと思うのですが、どうでしょう?

いずれにしても、vector関係の事をもっと勉強してきます・・・。

780 名前:デフォルトの名無しさん :04/02/22 17:53
>>779
グダグダ言う前に remove_if の定義を調べろよ。

781 名前:デフォルトの名無しさん :04/02/22 17:54
>>779
>vectorに詰め込んだデータを、1つずづチェックして、場合によっては削除するって感じなので、
remove_ifはまさにそのために在る。

>いずれにしても、vector関係の事をもっと勉強してきます・・・。
勉強すべきはvectorではなくて<algorithm>についてだな。

782 名前:デフォルトの名無しさん :04/02/22 17:59
STL のページ
http://www.wakhok.ac.jp/~sumi/stl/

783 名前:766 :04/02/22 20:56
>>782
おお、良いサイトですね。
なんとなく分かってきました。

>>780-782
vector<RECT> a;
vector<RECT>::iterator p1;
vector<RECT>::iterator p2;
for(p1=a.begin();p1!=a.end()-1;p1++){
for(p2=p1+1;p2!=a.end();p2++){
if((*p1).top==(*p2).top&&(*p1).bottom==(*p2).bottom&&(*p1).right+1==(*p2).left){
(*p1).right++;
ZeroMemory(p2,sizeof(RECT));
}
}
}
RECT rect={0,0,0,0};
a.erase(remove(a.begin(),a.end(),rect),a.end());

なんか766で考えてた方法と変わっちゃいますけど、
実際にやりたい事はこんな感じです。
removeとかの使い方、あってますよね?

784 名前:デフォルトの名無しさん :04/02/22 21:43
>>738>>766も、STLをちゃんと使うんなら、
Effective STLは*本当に*読んでおいた方がいいよ。
無駄な努力というか、やらなくていい試行錯誤とか、
勘違いによる「大量のたまたま通ってますコード」を
書かなくてすむし。

Effective 3冊は(Moreは確かに訳に難ありだけど)
C++を使うんなら絶対に手元において頭に入れておくべき。
2chの質問系スレでも、「読めば載ってる」ネタがとても多い。



785 名前:773==Addicted to C++ ◆cpp/Sz/v02 :04/02/22 21:58
>>783
remove&eraseのところはそれでいいが…

iteratorをZeroMemoryとかに渡したらダメ(-_-#)
iteratorはポインタではない実装もあるから、渡したければ&(*p2)を渡す。
iteratorはポインタだとか抜かす奴とは縁を切った方がいいぞ。
大体ZeroMemory(p2,sizeof(RECT));のところはは先にRECT rect={0,0,0,0};を
しておいて*p2 = rect;とすればいいだろうに。

それからfor文書くなら
for(vector<RECT>::iterator p = a.begin(); p != a.end(); ++p)とせい。
できるだけ前置インクリメントを使うこと。効率が悪くなる場合がある。

つい携帯で見てられなくなった。試験前なのに…(鬱

786 名前:デフォルトの名無しさん :04/02/22 22:06
>>783
他の人と俺の意見は違うみたいだけど、最初は無理してSTLの
アルゴリズム使わずに、自分でiteratorとforでループを回してみた方が
いいんじゃないかと。ループにも色々パターンがあることがすぐ
見えてくると思うから、そしたら for_each とか find_if 辺りから使い始めりゃいい。

# いきなり remove + erase から入るのは無謀だと思う…

// RandomAccessIterator依存
struct adj_of {
 RECT a;
 adj_of( const RECT& a ) : a(a) {}
 bool operator()( const RECT& b ) const {
  return a.top==b.top && a.bottom==b.bottom && a.right+1==b.left;
 }
};

vector<RECT>::iterator s=a.begin(), e=a.end();
while( s != e ) {
 e = remove_if( s+1.e,adj_of(*s) );
 if( s != e ) ++s;
}
a.erase( e, a.end() );

787 名前:デフォルトの名無しさん :04/02/22 22:07
>>786
俺もそう思う

788 名前:デフォルトの名無しさん :04/02/22 22:53
だから、まずSTLそのものを勉強しろよ
ほれ、
http://www005.upp.so-net.ne.jp/episteme/html/stlprog/
取り敢えずこれを通読しろ
WEBをあっちこっち漁るより遥かに効率がいいぞ


789 名前:784 :04/02/23 02:25
>>785

効率を云々するのなら、

>>for(vector<RECT>::iterator p = a.begin(); p != a.end(); ++p)

のコードも詰めが甘い。

コンテナの内容が変わらないのなら、終了条件のa.end()は
事前に別のiteratorのインスタンスに格納してそちらと
比較すべき(>>786みたいに)。

あなたの例ではループのたびにa.end()の一時オブジェクトの
生成と削除を繰り返すことになる。


790 名前:デフォルトの名無しさん :04/02/23 02:57
おっちゃん、ループごとの比較から追い出したいなら
const_iterator使わないとダメなんじゃないですか!?

791 名前:785 :04/02/23 03:01
>>789
確かに。うっかりしてた。何かに載ってたがどこだったか…スマソ

792 名前:766 :04/02/23 08:16
>>784
やはりEffective STLは読むべきですか。

>>785>>786
なるほど。

>>788
じっくり勉強してきます。


Effective STL買うなり、>>782>>788のサイト読むなりして、STLを勉強してきます。
皆様、どうもありがとうございました。

793 名前:デフォルトの名無しさん :04/02/24 00:28
クラスがオブジェクトを生成して返すにはどうしたら良いのでしょうか?

例えば

class CNumber {
 public:
  CNumber(int n = 1);
 ...
}

class CCalc {
 public:
  add(CNumber a, CNumber b) {
   return new CNumber(a.num * b.num);
  }
}

とかいう感じで、CCalcクラスのaddメンバー関数の中で
作成したオブジェクトを外で利用したいんですが
Effective C++とか読んでると、そんなの無理
とかいう気がしてくるのですが・・・


794 名前:デフォルトの名無しさん :04/02/24 00:36
普通にインスタンスを返せばいいじゃん

795 名前:デフォルトの名無しさん :04/02/24 00:43
>>793
なぜ無理と思うのだろう?

796 名前:デフォルトの名無しさん :04/02/24 00:48
>>793
コピーを返しちゃだめなの?
const CNumber add(CNumber a, CNumber b)
{
return CNumber(a.num * b.num);
}
でいいと思うんだけど?それにこの形式のreturnだったら
まともなコンパイラでは「戻り値最適化」(調べてみて)が
行われてコピーのオーバーヘッドは殆どなくなるから。
生のポインタは、戻り値の受け手がdeleteする必要がでてきたり
してバグ(メモリリーク)の温床だから避けた方がいいよ。
それから、Effective C++持ってるなら恐らくあなたが読んだと
思われる項目の最後のページに正しいコードと解説が書いて
あるよ。本はもっときちんと読みましょう。というかこれが
主題の項目じゃん!
javaの経験者かな?

797 名前:デフォルトの名無しさん :04/02/24 00:56
>795
たぶん、C++の入門書をちゃんと読んでないから
Effective C++が理解できない。

798 名前:デフォルトの名無しさん :04/02/24 01:09
というかoperator+でいいんでは

799 名前:デフォルトの名無しさん :04/02/24 01:13
>>798
>クラスがオブジェクトを生成して返すにはどうしたら良いのでしょうか?
ってのが質問の趣旨だし、operator+では不味かろう

800 名前:デフォルトの名無しさん :04/02/24 02:22
どのコンパイラがテンプレートにどの程度対応してるか書いてあるページありませんか?
exa) 明示的な特殊化、分割コンパイルモデル

適切にコンパイルできない具体的なソースもあると更に幸せ。

801 名前:デフォルトの名無しさん :04/02/24 02:25
>分割コンパイルモデル

ほぼ全滅

802 名前:デフォルトの名無しさん :04/02/24 02:26
>>800 ttp://www.boost.org/regression-logs/

803 名前:デフォルトの名無しさん :04/02/24 02:45
>>802
Intel C++ 800, VC++ 7.1, GCC 3.2 以降 が成績いいね。
特に前2つ。

804 名前:デフォルトの名無しさん :04/02/24 02:48
VC7.0から7.1でかなり強化されてるからなぁ

805 名前:デフォルトの名無しさん :04/02/24 02:49
>>804
リリース間隔は異常に短かったのにね。
しかもアカデミックはアップグレード対象外ときたもんだ...。

806 名前:デフォルトの名無しさん :04/02/24 02:54
>>805
ありゃ単にVC7で間に合わなかっただけだと思うが。
当初の予定ではVC7で標準C++への対応強化する予定だったらしい。

807 名前:デフォルトの名無しさん :04/02/24 03:01
VC5 買ってすぐ VC6 が出たのでスルーしたら
物凄く長いことまたされて、
やっと出たと思って VS.net 買ったら
すぐ VS 2003 が出やがったんだよな...。
アカデミックでも無料アップグレードさせて欲しかった。
貧乏学生をあんまりいじめんといてくれ、M$ よ。

808 名前:800 :04/02/24 03:47
>>801
そうなんだ・・・。
本にででーんと載ってるからそれなりに使えると思ってますた。

>>802
これってコンパイラのテンプレートとboostへの対応度を知るには便利ですけど
テンプレートのどの部分でコンパイルがひっかかったかはどうやって調べるのでしょう。
Failのあるテストを試して、boostを見るっていうステップかな?
結構大変な作業になると思うんですけど、
皆さんどうやってテンプレートの動く動かないのノウハウを蓄えてるんですか?
自分が間違ってるのか、コンパイラが対応できてないのかの指針が欲しいです。

809 名前:デフォルトの名無しさん :04/02/24 04:01
指針は、規格を参照すれば OK 。
動く動かないは、やってみれば分かる。

810 名前:デフォルトの名無しさん :04/02/24 04:18
とりあえずVC++7.1とC++BuilderXでテストコード走らせて通るかどうかぐらいだな。
BuilderXはPersonalですらデフォルトで2種類のコンパイラ積んでるからこういうとき
だけは楽。

811 名前:デフォルトの名無しさん :04/02/24 08:04
>>808
Failになっているものは、テスト時に出力されたエラーメッセージが参照できます。
コンパイルエラーなら普通にファイル名と行番号がでてるから、
boostのアーカイブと照らし合わせればいいです。
照らし合わせるには、バージョン(1_31_0 or CVS HEAD)に注意したほうがいいでしょう。
(巨大なHTMLへのリンクになってるから、これもちょっと気をつけたほうが良いかもしれません。)

812 名前:デフォルトの名無しさん :04/02/24 08:35
>>808
> 自分が間違ってるのか、コンパイラが対応できてないのかの指針が欲しいです。
とりあえず経験的にだいたい標準準拠してる(と言われている)
VC++7.1とgcc3.3、あとComeauのオンラインテスト
 http://www.comeaucomputing.com/tryitout/
あたりで試してみて、ダメだったら自分のコードを疑って規格と
にらめっこする感じ。

exportみたいな明らかに対応してない機能だと、コンパイラが
エラーメッセージで「exportは使えません」くらいは出すので
それも指針にはなる。

813 名前:デフォルトの名無しさん :04/02/24 11:52
かなりビギナーなので初歩質問になのかもしれませんが、
newしたものは、必ずdeleteしなければいけないのでしょうか???
deleteしないとバグになってしまうのでしょうか、
それとも問題なしなのでしょうか???


814 名前:デフォルトの名無しさん :04/02/24 11:57
>>813
しないとメモリリークするからしなきゃだめ。

815 名前:デフォルトの名無しさん :04/02/24 11:58
>>813
deleteする癖を付けといたほうがいい。
newしたときにはメモリ確保以外にもコンストラクタでなんらかの初期化が行われている可能性があり
その場合、後始末がdelete経由のデストラクタで行われるはずだから。

816 名前:デフォルトの名無しさん :04/02/24 13:04
813です。
>>814さん
>>815さん
早速の回答ありがとうございました!
基本的にnewとdeleteはセットなんですね、分かりました。
ドモ

817 名前:デフォルトの名無しさん :04/02/24 15:37
あら?
いつもならここらへんで「スマートポインタ使えごるあ!」って
人が必ず一人は居るんだけど,今日はお留守なのかな?

818 名前:ヽ(´ー`)ノ :04/02/24 15:41
俺も思ったけど、
> newしたものは、必ずdeleteしなければいけないのでしょうか???
…が質問の肝だから、そういうレスを付けるのはどうかな、と思ってやめた。

819 名前:デフォルトの名無しさん :04/02/24 15:58
>>818
それが正しい態度

820 名前:Addicted to C++ ◆cpp/Sz/v02 :04/02/24 16:01
このトリップつけたら禿げそう?→◆nrBjarne.g

821 名前:デフォルトの名無しさん :04/02/24 17:23
                     ↓>>1-820

       (  ::::::::::::::::::::::::^:::::::::: :::::: :(
     丿::::::::::::::::::::::::::::::::::::::::::::::::::::: :::: (
     /::::::::::/ノ::::::::ノ::::::::ヽ:人::::::::::ヽ::::::::::)
     (::::::::::/  ):::ノ::::ノ ) ソ ヾ::::::::::::丶ヽ
    (:::::::::/ 彡  ノ   ノ  :: 彡:/)) :::::::)
   (::::::::::/彡彡彡彡彡   ミミミミミミミ ::::::::)
   ( :::::::// ̄ ̄ ̄ ̄ヽ===/ ̄ ̄ ̄ ̄ヽ |::::::)
    | =ロ    З  ‖ ‖  З  ロ = |
    |:/ ‖    / /ノ  ヽ \     ‖ ヽ|ヽ
    /|/  ヽ`======/  ⌒ ` ========ノ   | |
   (||         .(● ●)          |ノ
    |         : :: :::l l: ::: :::          |
    |      _:: :二 M二__::::::.. .        |
    |     : ::: : ::: ::  ===  ::: :: :: ::::     )
    \ :::   :::::::::::  ::::::::::  ::::::::::::::   /|
    /|ヽ  ヽ:::: _- ::::: ⌒:: :::::::: -_   ノ
   / || 丶\_::_:::::_:::: :::::_/:::: /
      | | \ \ ::::::::::: :::::::::: ::: :: _/
   / ̄\ 丶  ̄ ̄ ̄ ̄ ̄ ̄ ̄   


822 名前:デフォルトの名無しさん :04/02/24 18:23
荒らしについて
掲示板上で、意味不明な言葉やアスキーアートの連続書きこみなど荒らし
行為に遭遇した場合は、その場で諌めたり挑発したりなど、むやみに対抗し
ないようにお願いします。
荒らし行為を行う人物は、利用者の反応を楽しむ愉快犯が大半ですので、
逆効果になる可能性が高いからです。
削除依頼掲示板などでご報告いただければ、削除人が削除にあたります。
冷静なる判断をお願いいたします。

削除ガイドライン
http://info.2ch.net/guide/adv.html

823 名前:Addicted to C++ ◆nrBjarne.g :04/02/24 19:39
トリップチェンジsage

824 名前:デフォルトの名無しさん :04/02/24 21:00
std::ostringstream hoge
int fuga = 100, piyo = 200;

hoge << "fuga " << fuga;
cout << fuga.str() << endl;

hoge << "piyo " << piyo;
cout << piyo.str() << endl;

とすると、

fuga 100
fuga 100piyo 200

となってしまいます。

これを新しいostringstreamを宣言することなく

fuga 100
piyo 200

とするにはどうすればいいですか?

825 名前:824 :04/02/24 21:02
失礼

fuga.str() と piyo.str() は hoge.str()の間違いです。


826 名前:Addicted to C++ ◆nrBjarne.g :04/02/24 21:24
hoge.str("");

827 名前:デフォルトの名無しさん :04/02/25 02:49
純粋仮想関数( =0 とするやつ)って、何のためにあるんでしょうか?
仮想関数だけで十分な気がするんですが。

828 名前:デフォルトの名無しさん :04/02/25 02:57
>>827
基底クラスではインターフェースのみ定義し実装は派生クラスで行う。
この場合、「この関数は派生クラスで実装が必要である」ことをはっきりさせるため。
実装を忘れたらコンパイルエラーになる。

829 名前:デフォルトの名無しさん :04/02/25 03:37
ひとりで開発してるわけじゃないーのさ

830 名前:デフォルトの名無しさん :04/02/25 07:39
>827
抽象クラスってわかってる???
抽象データ型ってわかってる???

831 名前:デフォルトの名無しさん :04/02/25 08:47
>>827
デザインパターンについて勉強すると、
そのあたりの有用性が分かってくるんじゃないかな。

832 名前:デフォルトの名無しさん :04/02/25 10:34
>>827>>828
>実装を忘れたらコンパイルエラーになる。

漏れの場合、むしろ、それがウザくて
純粋仮想関数を仮想関数に修正した経験さえある。
試しつつ実装を加えていく場合には、邪魔このうえないのだが。

833 名前:デフォルトの名無しさん :04/02/25 10:52
>>832
PURE というマクロを定義し、
これを場合によって = 0 か { } かを切りかえれば良い。

834 名前:デフォルトの名無しさん :04/02/25 11:01
似たようなものに、INLINE を切り換えるやつもあるね。
inline 関数をまとめたファイルを作り、
ある場合は inline にしてヘッダファイルでインクルードし、
ある場合は消して .cpp ファイルでインクルードする。

835 名前:デフォルトの名無しさん :04/02/25 11:57
>>832
>>829

836 名前:デフォルトの名無しさん :04/02/25 14:51
基本的には純粋仮想は設計者の自己満足用だ

837 名前:デフォルトの名無しさん :04/02/25 15:05
>>836
実装のないスーパークラスを作るためだろ
そのために Java にはインタフェースがある

スーパークラスとサブクラスは同時に開発することが多いので
(多態性が目的のため)
設計者の自己満足というわけではない

838 名前:デフォルトの名無しさん :04/02/25 15:25
純粋仮想がなかったとしても
それができないわけではないからな
やはり自己満足だな

839 名前:デフォルトの名無しさん :04/02/25 15:37
「できないわけではない」は反論になってないな。
マシン語以外の言語が存在する理由と同じく、「より良くやる」ために
存在してるわけだからな。

840 名前:56 :04/02/25 15:52
>>838
ちみが自己満足だと思っているのならそれでよいと思うよ。

実際、ぁぁぁなんでぃ、純粋仮想にしやがってよう、まったく自己満足だっちゅーの
といいつつ、そこを実装するわけで、そのお陰でバグが減ったり、メンテナンス性が
上がったり…することを期待してるんだが。

コンパイル通らないからといって深く考えずにヘッダー直すのはドキュと…。

841 名前:デフォルトの名無しさん :04/02/25 15:56
>>837
>スーパークラスとサブクラスは同時に開発することが多いので

そういう時こそ、より一層ウザイのだが・・・。

スーバークラスAのサブクラスが複数あった場合を考えてみる。
とりあえず関数を追加して、ある1つのサブクラスBだけを
優先的に試行錯誤しつつ組み上げていきたかったとする。
・・・にも関わらずだ。
後回ししたいサブクラスC、サブクラスDも
ちゃんと同時進行で記述してやらないとコンパイラがごねる。

同時に3つのクラスの実装を想定して作業できるのだろうか?
多態化が目的なのであれば、仮想関数lだけでも十分と思うが。

842 名前:デフォルトの名無しさん :04/02/25 15:59
純粋仮想関数はC++に中途半端に慌ててゴタゴタ付けた多態への
支援機能の一つで、使わなくてよい。
今の段階では「よりよい」というほどの事もない。

843 名前:デフォルトの名無しさん :04/02/25 16:06
個人的には、まさにJavaのInterfaceのように、
基底の仮想関数は全て純粋であるべきだと思っているんだが。

844 名前:デフォルトの名無しさん :04/02/25 16:12
>841
クラスごとにソースファイルが分かれていれば、何ら問題がないと思うのだが。

845 名前:デフォルトの名無しさん :04/02/25 16:35
>>844
・・・まあ、確かに。
1つの出力ファイルに複数のサブクラスが必要なければね。

846 名前:56 :04/02/25 16:48
>>842
>使わなくてよい。
とは何様ですか?そういう事はあなたの部下にだけ言ってくださいプ


いらんと思っているのなら使わなければヨイ。
よいと思えば使えばヨイ。


漏れはC++のそんないい加減で中途半端なところが好き。







847 名前:デフォルトの名無しさん :04/02/25 17:01
>>846
激しく同意










848 名前:デフォルトの名無しさん :04/02/25 17:01
>>使わなくてよい。
>とは何様ですか?そういう事はあなたの部下にだけ言ってくださいプ


>いらんと思っているのなら使わなければヨイ。
>よいと思えば使えばヨイ。

とは何様ですか?そういう事はあなたの部下にだけ言ってくださいプ

849 名前:デフォルトの名無しさん :04/02/25 17:18
たぶん >> 842 は、「使わなくてもよい」って言いたかったんだけど、
日本語が苦手だから「使わなくてよい」って書いちゃったんだよ。
間違っただけなんだよ。あんまり責めなくてもよい。

850 名前:デフォルトの名無しさん :04/02/25 17:21
しかし=0は不細工だよな。
purevirtualキーワードでもつくればよかったのに。

851 名前:デフォルトの名無しさん :04/02/25 17:41
>>850
オレもそう思う

852 名前:デフォルトの名無しさん :04/02/25 18:51
>>849
そんな人心の機微が判ることがこれからの(rya

853 名前:デフォルトの名無しさん :04/02/25 18:55
>>850
同意

854 名前:デフォルトの名無しさん :04/02/25 18:58
>>846
そんなに改行しなくてよい。

855 名前:デフォルトの名無しさん :04/02/25 19:02
>>850
同意
何もさしてない関数ポインタを
void (*pFunc)(void) = 0;
とするから、なんかそんな感じになったんだろうと勝手に推測。

856 名前:デフォルトの名無しさん :04/02/25 19:07
>>854
同意

857 名前:デフォルトの名無しさん :04/02/25 19:14
基本的に無能なんだよ、禿は。

858 名前:デフォルトの名無しさん :04/02/25 19:25
無理に同意しなくてよい。


859 名前:デフォルトの名無しさん :04/02/25 19:30
>無理に同意しなくてよい。

とは何様ですか?そういう事はあなたの部下にだけ言ってくださいプ


860 名前:デフォルトの名無しさん :04/02/25 19:32
56は荒らしなんだから放置放置

861 名前:デフォルトの名無しさん :04/02/25 21:15
gccでコンパイルしたオブジェクトファイルとc++のソースをg++でコンパイルすることは
できないのでしょうか。オブジェクトファルをg++でコンパイルし直せば大丈夫なんですけども。

862 名前:デフォルトの名無しさん :04/02/25 21:22
>>861
コンパイルという用語の使い方が微妙…
ってそれはおいといて、extern "C" で本か何か調べれ。

863 名前:861 :04/02/25 21:36
>>862
サンクス。コンパイルできました。
コンパイルの使い方微妙ですか。
うう、よく分かんないです。

864 名前:デフォルトの名無しさん :04/02/25 21:37
>>862
すげぇな・・・。
俺には861がなに言ってんのかさっぱりわからんかったぞ・・・。

865 名前:デフォルトの名無しさん :04/02/25 21:50
>>862
すげーな・・・
Cの関数をC++から呼び出すには・・・と聞けば誰でも分かっただろうが。

866 名前:865 :04/02/25 21:51
おっと、逆だ。


867 名前:デフォルトの名無しさん :04/02/25 22:04
>>841
>>833
あと、適当な戻り値も指定できるといい。

#ifdef DEBUG_ABSTRACT
#define ABSTRACT { }
#define ABSTRACT(ret) { return ret; }
#else
#define ABSTRACT = 0
#define ABSTRACT(ret) = 0
#endif

開発中は DEBUG_ABSTRACT を定義して、
ちゃんとしたテストを行いたい時やリリース時には
DEBUG_ABSTRACT を定義しなければ良い。
PURE は M$ が定義してることもあるので避けた方がいいかもしれない。

868 名前:デフォルトの名無しさん :04/02/25 22:10
>>863
コンパイル+リンク=ビルド と呼んでいるケースが多いようだが、
用語の使い方がどうのと言う論点ではこれも五十歩百歩だ、そんな煽りは気にするな。
プリプロセッサやらリンカやら各翻訳段階を何と言おうが同じことだ。

869 名前:Not 862 :04/02/25 22:20
あれを煽りと受け取るとは・・・・はぁ・・・・

870 名前:デフォルトの名無しさん :04/02/25 22:21
>>862はIQ180
>>868はIQ76

871 名前:デフォルトの名無しさん :04/02/25 22:24
IQなんか持ち出すあたりに低い知性を感じるね。

872 名前:デフォルトの名無しさん :04/02/25 22:32
>>871==868
必死だな。

873 名前:デフォルトの名無しさん :04/02/25 22:51
>>870-872
(・∀・)ジサクジエーン

874 名前:デフォルトの名無しさん :04/02/25 22:54
==なんか持ち出すあたりに低い知性を感じるね。

875 名前:デフォルトの名無しさん :04/02/25 22:54
ということで、純粋仮想関数使う奴は馬鹿
使わない奴は変態ということでいいでつか?

レスを暮れなくても良い

876 名前:デフォルトの名無しさん :04/02/25 23:00
純粋仮想関数は純粋な心を持った人間しか使ってはいけません。

日本では俺の他に何人使えるかなぁ。

877 名前:デフォルトの名無しさん :04/02/25 23:04
インターフェースとその実装クラスの関係って
やっぱり template methodパターンに含まれる
のでしょうか?



878 名前:デフォルトの名無しさん :04/02/25 23:07
インタフェースを利用してるデザインパターンは
腐る程あるけどね。

879 名前:デフォルトの名無しさん :04/02/25 23:18
>>877
それを言ったらメソッドのオーバーライドを含む継承は皆それになってしまうのでは。
テンプレートメソッドパターンの場合、構造よりもその使われ方に着目してるんだと思う。

880 名前:デフォルトの名無しさん :04/02/26 00:21
>>876
純粋仮想関数は純粋じゃないから君にも使える。

881 名前:デフォルトの名無しさん :04/02/26 00:27
不純だ・・・

882 名前:デフォルトの名無しさん :04/02/26 00:52
不純異性交友関数 f(sex)

883 名前:デフォルトの名無しさん :04/02/26 01:04
純粋妄想関数 f(;´Д`)

884 名前:デフォルトの名無しさん :04/02/26 01:10
class Otaku: public Mania
{
private:
famiry Oyaji;
family Mama;
family Aniki;
void Kyabakura_Girl(Yen Money);
protected:
MANIAC Anime[ ];
MANIAC Comic[ ];
friend:
MANIAC &Doushi(MANIAC collections);
public:
virtual love Maid(String Command)=0;
virtual love Imouto(void)=0;
};

このクラスを継承し、実装して僕をインスタンス化してください。







885 名前:デフォルトの名無しさん :04/02/26 01:11


不純異性交遊 (* 女)(男) ;



886 名前:デフォルトの名無しさん :04/02/26 01:15
死ねや 変態ども!

887 名前:デフォルトの名無しさん :04/02/26 01:22
class C884 : public Otaku
{
public:
love Maid(String Command){ return NULL; }
love Imouto(){ return NULL; }

RESULT Work(){ return FAILED; } // 仕事
RESULT Life(){ return FAILED; } // 人生
};






delete new C884; // いらない


888 名前:デフォルトの名無しさん :04/02/26 01:29
いずれもヘタクソ極まりないクラス設計だな

889 名前:デフォルトの名無しさん :04/02/26 02:19
このスレはマ板の腐海の中に埋葬されました

890 名前:デフォルトの名無しさん :04/02/26 02:36
俺は =0 という表記自体は美しいと思う。

使う目的は・・・
assert() みたいなもんかな。

891 名前:デフォルトの名無しさん :04/02/26 09:13
DLLを作るとき純粋仮想関数使っとかないと、
コンパイラ間でアボーンするとか、俺の呼んだPDFには書いてあった。

おとなしくCOM使えって?
ごもっとも。

892 名前:デフォルトの名無しさん :04/02/26 11:15
placement newでインスタンスを作るときに初期化するにはどうしたらいいんでしょうか?

Hoge* p = new Hoge("hoge", 1);

を、placement newでやりたい。

893 名前:デフォルトの名無しさん :04/02/26 11:27
Hoge* p = (Hoge*)malloc(sizeof (Hoge));
new(p) Hoge("hoge", 1);

...

p->~Hoge();
free(p);

894 名前:デフォルトの名無しさん :04/02/26 14:45
new と malloc 混ぜて使うのはあまり好きじゃないな。

895 名前:デフォルトの名無しさん :04/02/26 14:48
placement newって与えられたロケーションそのまま返せばいいだけじゃない?

896 名前:デフォルトの名無しさん :04/02/26 15:02
>>894
単なる例なんで。
別に malloc だろうが char 配列だろうが
GlobalAlloc だろうが何でもいいんだけどね。

897 名前:デフォルトの名無しさん :04/02/26 17:08
質問です。
ストリームで、場合によってファイルと標準出力を切り替えることって
できますでしょうか。
以下(stdio)のストリーム版ですが...
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv) {
FILE* fp;
char* filename = argv[1];

if(strcmp(filename, "-") == 0) { //"-" なら結果をstdoutへ
fp = stdout;
} else {
fp = fopen(filename, "w");
}
fprintf(fp, "Hello\n");
}

よろしくお願いします。

898 名前:デフォルトの名無しさん :04/02/26 17:11
a

899 名前:デフォルトの名無しさん :04/02/26 17:21
ストリームの切り替えってiostream / fstream / stringstreamあたりの話か?
そりゃ基底クラスへのポインタか参照で管理してれば切り替えられるが。

900 名前:892 :04/02/26 17:46
class Hoge {
public:
 Hoge() {}
 Hoge(const char* str, int i) : m_str(str), m_i(i) {}
 static void* operator new(size_t size);
private:
 const char* m_str;
 int m_i;
};

void* Hoge::operator new(size_t size)
{
 return ::operator new(size);
}

int main()
{
 Hoge* p = new Hoge;
 new(p) Hoge("hoge", 1);

 return 0;
}

コンパイルできないのですが何が足りないのでしょうか?

901 名前:デフォルトの名無しさん :04/02/26 17:48
修行

902 名前:デフォルトの名無しさん :04/02/26 17:48
どういうエラーかぐらい書けよ


903 名前:892 :04/02/26 17:54
>>902
不適切でした。すいません。
new(p) Hoge("hoge", 1); の部分で

error C2660: 'Hoge::operator new' : 関数に2個の引数を指定できません。

と出ます。

>>901
_| ̄|○

904 名前:デフォルトの名無しさん :04/02/26 18:24
>>900

class Hoge {
public:
  Hoge() {}
  Hoge(const char* str, int i) : m_str(str), m_i(i) {}
  static void* operator new(size_t size, void* p);
private:
  const char* m_str;
  int m_i;
};
void* Hoge::operator new(size_t size, void* p){
  return p;
}
int main() {
  Hoge* p = new Hoge;  // ← ?
  new(p) Hoge("hoge",1);
  return 0;
}


905 名前:デフォルトの名無しさん :04/02/26 18:45
>>897

#include <iostream>
#include <fstream>

int main(int argc, char** argv) {
std::ostream* osp;
std::ofstream ofs;
char* filename = argv[1];

if(strcmp(filename, "-") == 0) { //"-" なら結果をstdoutへ
osp = &std::cout;
} else {
ofs.open(filename);
osp = &ofs;
}
(*osp) << "Hello" << std::endl;
}


906 名前:デフォルトの名無しさん :04/02/26 19:36
>>900
そのエラーはplacement newを使うためのヘッダファイルがincludeされてないんだろうが
そもそもすでに初期化済みの領域をplacement newで再初期化するのは狂ってる

907 名前:デフォルトの名無しさん :04/02/26 19:39
ていうかoperator newの中でメモリ確保するならplacement new使う意味ないじゃん

908 名前:892 :04/02/26 20:15
>>906
つまり、placement newをオーバーロードするときは
allocatorをnewの中に用意するのが根本的な設計ミスってことでしょうか?

>>907
長々とアロケータ部分を書いてもしょうがないかなと思って省きました。
// ここで実際はアロケートする!
とかでも書いたら良かったですね。
スマソ。

909 名前:デフォルトの名無しさん :04/02/26 20:24
>906
>900じゃないけど、そういうことかー!
#include <new>

910 名前:897 :04/02/26 22:36
>>905
バッチリです。
ありがとうございます。

911 名前:デフォルトの名無しさん :04/02/26 23:00
>>908
Hoge* p = new Hoge("hoge", 1);

じゃだめなのか?

途中で再初期化したいのなら、
一度デストラクタ呼ばないとだめだぞ。

Hoge* p = new Hoge;
p->~Hoge();
new(p) Hoge("hoge", 1);

再設定するためのメンバ関数を作った方がいいとは思うけど。

912 名前:デフォルトの名無しさん :04/02/26 23:01
あとは一度 delete する、だな。

Hoge* p = new Hoge;
delete p;
p = new Hoge("hoge", 1);

ま、このコストを嫌がってるんだろうけど。

913 名前:デフォルトの名無しさん :04/02/26 23:08
Bjarneの本読みながら勉強してたけど、ふと彼のHP見てみたら足を机に乗せて禿げてて偉そうだった
ちょっとやる気がなくなった。

914 名前:デフォルトの名無しさん :04/02/26 23:20
すごい人間観だね

915 名前:デフォルトの名無しさん :04/02/26 23:29
>>913
偉そうというよりはむしろお茶目な感じが。

916 名前:デフォルトの名無しさん :04/02/26 23:56
>>913
お前!
ハゲをバカにすんな!
あの高橋名人だってツルッパゲだぞ!

917 名前:デフォルトの名無しさん :04/02/27 00:22
>>913
バカヤロー!オマエだってじきに禿るんだぞーっ!!

918 名前:デフォルトの名無しさん :04/02/27 00:26
テンプレートを使うと禿げるってホントですか?

919 名前:デフォルトの名無しさん :04/02/27 00:48
>>918
あまり関係ないようです。
ttp://www.boost.org/people/people.htm

920 名前:デフォルトの名無しさん :04/02/27 02:16
>>919
・・・そうか?

921 名前:デフォルトの名無しさん :04/02/27 02:25
一般的な禿げの率がわからんことには
なんとも結論の出しようが

922 名前:  :04/02/27 02:54
データベースを管理するクラスを用意します。そのデータを参照する人(書き込みもする)
がいたとします。排他制御はデータベースクラスでやるとします。このデータベース
クラスに、データ参照用のインターフェースを作ると、そのインターフェース経由でアクセス
する人がたくさん板場合、それらの人はみな new interface して、インスタンスを持たないと
いけないのでしょうか?もっとスマートなやりかたありますか?


923 名前:デフォルトの名無しさん :04/02/27 02:57
学校でオブジェクト指向についてしっかり教える学校が日本にあるのだろうか?最近の新人をみているとそんな感じがする。かく言う私も職場で構造体やらオブジェクト指向を覚えた口だが。

どうよ?とくに現在学生さん。大学、専門を問わずに

924 名前:デフォルトの名無しさん :04/02/27 04:34
ま、そんな質問はスレ違いってこった。

925 名前:デフォルトの名無しさん :04/02/27 05:22
>>922
"interface とは" というところからまずは調べてみてはいかがでしょうか。
COM とか Java とかが参考になるのかな。
なんらかのインスタンス(DBへの接続等)があって、それを元に interface を得るのが普通です。
new interface というように instance を作成するこという使い方はありません。


926 名前:デフォルトの名無しさん :04/02/27 05:24
そういう意味で interface って言葉を
使ってるんじゃないんじゃないかな?
分からんけど。

927 名前:デフォルトの名無しさん :04/02/27 05:39
いや、"インターフェイス経由で" とか new interface とポインタを意識したりしているあたり、
そういう意味なんじゃないかと思うんだけど・・・


928 名前:デフォルトの名無しさん :04/02/27 10:14
なんか被ってる香具師はみんな禿
でないと俺の気が治まらん。

929 名前:デフォルトの名無しさん :04/02/27 10:36
>>923
現在学生で大学でそれなりにやった
オブジェクト指向の概念はわりと当たり前になった

930 名前:ヽ(´ー`)ノ :04/02/27 10:52
>>923
それなりに。でも学生の何割が理解してるんだろう(笑)。
Java のクラスは使えても C の構造体やら C++ やらは使えない、
って奴が多いんじゃないかな。
要するに、考え方やメリットは理解できてない、タダ Java が使えるだけ(それも怪しいが)、と。

>>918
髪と引き換えに便利になるなら安いもんだろ。


931 名前:デフォルトの名無しさん :04/02/27 11:02
自分でひとつクラスライブラリなりテンプレートライブラリなりを
書いてみないことには分らない気がす

932 名前:デフォルトの名無しさん :04/02/27 16:16
>>923
大学に関して言うと、最近だいぶましになってきたけど、まだまだ不十分。

学校だと使えない奴切れないからな。
最低ラインの学生のレベルに合わせて教えないといけないし、面倒。
それに国公立だと授業へたくそな教官の首も切れないし。


933 名前:デフォルトの名無しさん :04/02/27 16:44
そういう話題はマ板でやってくれよ〜

934 名前:デフォルトの名無しさん :04/02/27 17:01
もまいらお仕事ご苦労さまです!
質問おながいします。
C、C++のコンパイラメーカ各社(MS、Borland等)は
STLとかの標準ライブラリの実装を自前でやっているのですか?
それともC++の標準化協会みたいな所でソースを共有
していたりするのですか?


935 名前:デフォルトの名無しさん :04/02/27 17:04
>>934
コンパイラベンダで実装は違うよ。
バージョンによってもちょこちょこ変わったりしてる。

936 名前:デフォルトの名無しさん :04/02/27 17:07
ってゆーかおまえ釣りだろ!同じような奴を過去スレで見たぞ!

937 名前:デフォルトの名無しさん :04/02/27 17:21
前略)10倍に!?

938 名前:デフォルトの名無しさん :04/02/27 17:36
まぁ、STLに関してはSGI系(STLport,gcc)、Dinkumware(VC++)、Rougewave(Sun,bcc 5.5以前)
つー感じでコンパイラベンダが作ってるわけでもなかったりするが。

いちおうどれも標準化委員会に提案されたHPの実装を基にはしてるな、大抵。

939 名前:デフォルトの名無しさん :04/02/27 17:37
>>937
前略)使っても使わない時と比べ10Kほどしか増えない。

940 名前:デフォルトの名無しさん :04/02/27 18:17
>>939
(前略)ンクし(中略)が増え(後略)


941 名前:スメルジャコフ :04/02/27 19:58
質問です。
staticはクラスメンバ関数って何の役に立つのでしょうか?
具体例を書いている書籍を持ち合わせていないのですが。

942 名前:デフォルトの名無しさん :04/02/27 20:05
>>941
クラスをインスタンス化していなくても呼び出せる

943 名前:デフォルトの名無しさん :04/02/27 20:06
>>941
ここは、文法を教えるとこじゃないんだよ。とっとと帰りやがれ。
本をケチる奴には教えたくないよ。

944 名前:デフォルトの名無しさん :04/02/27 20:06
C言語のstatic関数ってなんの役にたつの?

945 名前:デフォルトの名無しさん :04/02/27 20:09
http://www.amazon.co.jp/exec/obidos/ASIN/4756131212/ref%3Dnosim/bookshelves-22/250-8705789-7085026

買え

946 名前:デフォルトの名無しさん :04/02/27 20:10
生まれは葛飾柴又の〜

947 名前:デフォルトの名無しさん :04/02/27 20:12
Cのstatic関数はスコープだけかな

948 名前:スメルジャコフ :04/02/27 20:14
>>943
へ、へ、へ。
まさに文法についても議論する場だと思いますがね。

949 名前:デフォルトの名無しさん :04/02/27 20:14
リンケージ

950 名前:デフォルトの名無しさん :04/02/27 20:43
>>941
メンバ関数でpthread_createしたい時とか

951 名前:デフォルトの名無しさん :04/02/27 21:13
>>948
>>941はさすがに初心者スレ該当だと思うが

952 名前:デフォルトの名無しさん :04/02/27 21:14
>>948
無粋かもしれんが「へ!へ!へ!」はスヴィドリガイロフではなかったか。

953 名前:スメルジャコフ :04/02/27 21:22
>>951
おっしゃるとおりでさ。へ、へ、へ。

>>952
それもおっしゃるとおりで。えぇ、そのとおりですとも。

954 名前:デフォルトの名無しさん :04/02/27 21:24
ま、たいした意味は無いよ

955 名前:デフォルトの名無しさん :04/02/28 00:07
>>941
そういう本を探すほうが困難だと思われ。
もしかして持ってる本はCOBOL?

956 名前:デフォルトの名無しさん :04/02/28 00:12
>>955
多分、開発環境の入門書しか見てないんじゃないかな。
言語そのものの参考書は持ってないと。

957 名前:デフォルトの名無しさん :04/02/28 02:29
いまメンバ変数のポインタを返すメンバ関数を実装するとします。
ここで返すポインタの指すメンバ変数の内容は見れても良いが、いじれないようにする場合
const obj * cmyclass::get_obj()
{
   return &m_obj;
}
とやればよいのですか?

あと
obj * cmyclass::get_obj() const
とか
obj * const cmyclass::get_obj()
とかいうのも見かけます(勘違いかも)
それぞれどういう意味、使い方なのでしょうか?
教えてくださいませ。


958 名前:デフォルトの名無しさん :04/02/28 02:36
>>957
メンバーでなく自身を基底クラスへキャストできるようにする
というのなら判るんだが。
あるいは生成して新たなインスタンスを値で返すとか。
メンバーへのポインタ返してしまったら自身のデストラクタの実行後も
参照されてる危険があるじゃんか。

959 名前:デフォルトの名無しさん :04/02/28 02:41
>>957
その場合は参照のほうが適切な気はするがそれは置いておいて。
メンバ関数の後につくconstはそれがメンバ変数を変更しない
(+メンバ変数の非constなメンバ関数を呼ばない)ことを保証する。
非constなメンバ関数はconstな参照/ポインタからは呼び出せない。

*の後ろにつくconstは普通の変数のconstと同じだが、返り値につけても意味はないな。

960 名前:デフォルトの名無しさん :04/02/28 02:42
MSのVSを使っています。
クラスにメンバ関数&メンバ変数を沢山詰め込むと
補完候補が多くなって使いずらいと思いました。
そこで必要なメソッドのみを純粋仮想関数のみで
記述したクラスから派生させて実装しているんですが
これって普通ですか?

961 名前:r :04/02/28 02:43
>>957
class C {
void f1() const {} // f1は、thisでさされたオブジェクトを変更しない
const int *f2() {} // f2の返すポインタでさされたオブジェクトは、変更できない
int const * f3() {} // f2とおなじ
int* const f4() {} // 返り値として使われた一時オブジェクトのポインタ値を変更できない(?) / 正直、あんまり意味のない書き方なんでやったことない
};

962 名前:r :04/02/28 02:45
>>960
動機が尋常じゃない。

まあ、実際にやってるのは「インタフェースと実装の分離」だ。
それ自体は普通。

でも、繰り返すが、動機が普通じゃない。

963 名前:デフォルトの名無しさん :04/02/28 02:50
>>962
まあ、いいんじゃない。
これで少しは分割することを覚えればw

964 名前:デフォルトの名無しさん :04/02/28 02:51
>>958-961さん。どうもありがとう。
なるほど〜。

つまりメンバを見せたいだけなら
const obj & cmyclass::get_obj()
という書き方をするということですね。

>メンバ関数の後につくconstはそれがメンバ変数を変更しない
obj * cmyclass::get_obj() const
{
  m_obj = 1;
  return &m_obj;
}
とやったらコンパイルエラーがでるという意味ですね。

無視してたけどすんごい意味があったんだな。





965 名前:デフォルトの名無しさん :04/02/28 14:20
書籍について質問してもよろしいでしょうか。

(0)C++についてそう初心者でもないと思うのですが、
「Essetial C++」は買って得をしますか?

(1)コンパイラ作成者ではありませんが、
「Inside the C++ Object Model」は必要となることが
ありますか?

(2)今からARMとD&Rを買って読む価値はありますか?

(3)「C++ Templates」は読むと衝撃を受けますか?

アマゾンの書評を読んでもパッとしませんでした。
以上、いずれか1つでも、お暇があれば主観的な
意見でもお願いします。

966 名前:デフォルトの名無しさん :04/02/28 14:43
>>965
あえてこちらに書いたのかもしれんが、
書籍専門スレがある。
http://pc2.2ch.net/test/read.cgi/tech/1076851442/


967 名前:デフォルトの名無しさん :04/02/28 14:44
>>965
(0) 1行目に情報量がないので判断できん
 自称・中級者というのはほとんど当てにならん
 何か客観的な内容を示せ

(2)(3) あんたを知らんから判断できん
 知らないで無責任な発言をすればいいのなら,「人によりけり」

968 名前:デフォルトの名無しさん :04/02/28 15:18
スレ汚し申し訳ありませんでした。
書籍専門スレに逝って参ります。

969 名前:デフォルトの名無しさん :04/02/28 15:35
続いてはこちらのトリビアです。

「ANSIで売られているISO/IEC 14882:1998(C++国際規格)の
規格書のPDFの2ページ目の下の空白には

『(C)ISO/IEC 1998
All rights reserved. Unless otherwise specified, no part of
this publication may be reproduced or utilized in any form or
by any means, electronic or mechanical, including
photocopying and microfilm, without permission in writing
from the publisher.
ISO/IEC Copyright Office Case postale 56 CH-1211 Geneve 20 Switzerland
Printed in Switzerland』
の文字列が隠れている。」

これ何へぇ〜?

970 名前:デフォルトの名無しさん :04/02/28 16:25
>>965
(3)だけど、一応英語版について書いておく。
結論から言うとそんなに衝撃的な内容ではない。C++の文法から
逸脱しているわけではもちろなないし、Lokiのような高度な内容でも
ない。

ただ、「templateでもっといろんな事がしたい」という中級者の悩み
をかなり解決してくれるものではある。デザインパターンへの応用
編もある。スマートポインタ自作編もある。

むしろtemplateの初心者に読んでもらいたい内容。どの解説書を
読んでも関数templateやクラスtemplateの簡単な例題に触れて
終わり、というパターンで前進のない人には格好の本だ。

971 名前:デフォルトの名無しさん :04/02/28 16:32
マルチうぜ〜

972 名前:デフォルトの名無しさん :04/02/28 16:43
C++は駄本と良本がはっきり分れているので迷う要素などなにひとつない。
本を買うか迷うようなやつは所詮その程度。

>>980
スレ立てよろしこ

973 名前:デフォルトの名無しさん :04/02/28 16:45
しかし、「Inside the C++ Object Model」みたいな薄い本を
読んで何を知りたいのか、俺はそちらの方が興味ある。

974 名前:デフォルトの名無しさん :04/02/28 17:26
面倒臭がり屋さんがしばしば、
「すぐにわかる○○」、「○日でマスターする○○」などの、
端折った本を買う訳だが、C・C++に関する限り、
分厚い本を買うべきだな。端折りようがないだろ?<C・C++

975 名前:デフォルトの名無しさん :04/02/28 17:27
あの本読むぐらいならコンパイラのアセンブリ言語出力を
解読する方がよっぽどためになるような。

976 名前:デフォルトの名無しさん :04/02/28 17:45
書店に行ってもそういうしょぼい本ばっかで、専門書が全然売ってないのはどういうこと?
K&Rさえも売ってない。

977 名前:デフォルトの名無しさん :04/02/28 17:48
>>976
定番なら手にとって確認する必要もないので通販でいいんでない?

978 名前:デフォルトの名無しさん :04/02/28 17:49
>>976
田舎なんだろ?諦めろ( ´,_ゝ`)プッ



_| ̄|○ オレモナー

979 名前:デフォルトの名無しさん :04/02/28 19:05
>>970,973
レスありがとうございました。参考に
させていただきたいと思います。

980 名前:デフォルトの名無しさん :04/02/28 22:09
>>969
本当だ!!!

981 名前:デフォルトの名無しさん :04/02/28 22:13
>>973>>979
「Inside the C++ Object Model」はそんなに薄くないぞ。英語版
で304ページもある。内容は、クラス、仮想関数付きのクラス、
多重継承をしたクラスなどのvptrやメンバのメモリ内での配列
の仕方が詳しく説明されている。

それからCtor、Dtorの意味論や詳細な使い方の章もあるな。
全体的にこの本にはCtor、Dtorに関する章が多いな。だから
そちら方面の知識がまだ曖昧模糊としている人にお勧め。

(1)のEssential C++はC++に初めて触れる人がC++ 3rdや
C++ Primer 3rdの分厚さにびびってしまった時の定番本。いず
れはそれらの本も読まなければいけないが、手っ取り早くC++
を使えるようになりたい人へお勧めの本だ。ベストセラーの
「独習C++ 3rd」に近い内容。

982 名前:デフォルトの名無しさん :04/02/28 23:55
禿ストラップの本の6.4のサンプルプログラムがコンパイル通らん。
あの禿野郎・・・

983 名前:デフォルトの名無しさん :04/02/29 00:29
>>982
アレは禿げてる人にしかコンパイル出来ないらしいよ。

984 名前:デフォルトの名無しさん :04/02/29 01:14
>>982
「6.4コメントとインデント」?どこにサンプルが?

次スレおねだりage

985 名前:某スレ :04/02/29 01:15
ネタスレ立てるくらいならこのスレの次スレを立てるべきだったか・・・

986 名前:某スレ :04/02/29 01:16
某スレの1と書くつもりが

987 名前:某スレの1 :04/02/29 01:26
http://pc2.2ch.net/test/read.cgi/tech/1077985164/
新スレ立てた

988 名前:デフォルトの名無しさん :04/02/29 09:06
埋めてみる。

989 名前:デフォルトの名無しさん :04/02/29 12:46
埋め立てage

990 名前:デフォルトの名無しさん :04/02/29 12:50
>>1


991 名前:990 :04/02/29 12:51
_| ̄|○

992 名前:デフォルトの名無しさん :04/02/29 12:51
>>991
素で間違えたのか

993 名前:デフォルトの名無しさん :04/02/29 13:00
>>992
このスレ用に出した書き込みウィンドウ消し忘れてた ̄|_|○

994 名前:デフォルトの名無しさん :04/02/29 13:10
記念カキコ v(^-^*)

995 名前:デフォルトの名無しさん :04/02/29 13:32
埋め

996 名前:デフォルトの名無しさん :04/02/29 13:35
埋め

997 名前:デフォルトの名無しさん :04/02/29 13:37
埋めとこう


998 名前:デフォルトの名無しさん :04/02/29 13:38
ダ

999 名前:デフォルトの名無しさん :04/02/29 13:45


1000 名前:デフォルトの名無しさん :04/02/29 13:46
1000


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.