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


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

C++相談室 part46
751 名前:746 :2006/02/09(木) 01:55:41
ありがとうございます>>748-750
メンバ変数の方の頭や後ろに _ をつけたり m_ をつけて
this をはずせば馬鹿じゃないんでしょうか >>750

752 名前:デフォルトの名無しさん :2006/02/09(木) 02:09:26
>>751
名前が被ること自体が問題。
あえてリスクを負うようなコーディングスタイルは避けるのが
普通以上のレベルのプログラマの常識。

ただ、例外として問題が少々あろうが後腐れの無いプログラムで
そーゆー類のことをするのは全然構わんと思う。・・・逆にそーゆー
融通が利かすことができないのは一流気取りの三流プログラマ。

753 名前:デフォルトの名無しさん :2006/02/09(木) 02:34:30
>>752
名前が本質的に同じであるのが自然である場合、
あなたは、どういう醜い名前の付け方をするんですか?

class date{
    int year;
    ........
public:
    ........
    void set_year(int year){
        this->year = year;
    }
};

754 名前:デフォルトの名無しさん :2006/02/09(木) 02:38:54
>>752
setterでは普通に使ってるけど、やめた方がいいんだろうか…
void setHoge(type hoge) {this->hoge = hoge;}

755 名前:デフォルトの名無しさん :2006/02/09(木) 02:41:06
>>753
g_ だの m_ だのといったプレフィックスを見たこともない人ですか?

自分のスタイルを押し付けるような気は毛頭ないがなんらかの方法で
名前が完全に被るようなことは極力避けるのが普通だぞ。

756 名前:デフォルトの名無しさん :2006/02/09(木) 02:43:28
>>754
俺はそのケースでも引数にプリフィックスを付けて
名前の重複を避けるようにしてるけど
このケースは許容範囲なんじゃない?

757 名前:デフォルトの名無しさん :2006/02/09(木) 02:58:01
てか、よくよく考えたらプレフィックス付けるほうが this-> を
使わなくても済むから結果的に表記もすっきりするね。

void setHoge(type hoge) {this->hoge = hoge;}

void setHoge(type a_hoge) {hoge = a_hoge;}

758 名前:753 :2006/02/09(木) 03:07:56
>>755
えーと、変数に無駄な接頭語付ける文化ってまだ存在してたんですね。
自分の場合ハンガリアンが駄目絶対と言われてたのを、
目にしてたので死滅したものかと思っていました。

個人的には、グローバル変数はg_hoge,メンバ変数はm_hogeとかするくらいなら
::hoge,this->hogeと書けば、
言語レベルでそのスコープにアクセスしていると保障が得られるので
素直に言語の機能を使ってました。

なのでスコープを明示的に指定できるC++で、
変数名にスコープ情報を入れたり無駄な接頭語を付けるのは、
気持ち悪いし美しくないなぁ、と思っています。

759 名前:デフォルトの名無しさん :2006/02/09(木) 03:32:42
必要に応じて this-> 付ける場合、
this-> 忘れるバグを埋め込む可能性を恐れるよりは、
m_ つけた方がよっぽどいい。
明らかに異なる名前なら、間違える可能性がグンと減る。
毎回 this-> つけるなら別だが、長ったらしい。

760 名前:デフォルトの名無しさん :2006/02/09(木) 03:48:41
>>758
「プリフィックス」と「ハンガリアン」を混同してる人ってまだ存在してたんですね。
MSもハンガリアンを推奨しなくなったんで死滅したものかと思っていました。

個人的には、所謂 getter に名詞を使うので、メンバ変数に m_ つけないと
被ってどうしようもなくなります。この衝突は this-> とかじゃ逃げれませんし。

761 名前:754 :2006/02/09(木) 04:00:12
>>757
引数にプリフィクスを付ける手もあるのか、なるほど。
自分はメンバ変数をhoge_としています。

>>759
個人的には
void setHoge(type hoge) {this->hoge = hoge;}
は見やすくて好きなんだが、
バグのとこを考えると避けた方がいいように思えてきた。

762 名前:753 :2006/02/09(木) 04:03:31
>>760
変な接頭語付ける文化は興味が無くて、
その手の文化はハンガリアンしか聞いたことが無いので勘違いしておりました。

確かにメソッドと変数名の衝突は頭が痛くなる問題ですね。
自分の場合getterにはget_hogeのような2単語で構成するのが殆どなので、
変数とメソッドの衝突は未経験ですが、
それを考慮すると奇妙な名前を付けるのも仕方がないのでしょうね。

今まで奇妙な接頭語を付ける人の気持ちを理解できなかったのですが、
理解はできました。

ありがとうございます。

763 名前:デフォルトの名無しさん :2006/02/09(木) 04:13:56
Ruby の @ を付ければメンバ変数という仕様が
C++ でも欲しくなってくるなぁ。

764 名前:デフォルトの名無しさん :2006/02/09(木) 04:31:07
#define @ this->
無理か

765 名前:デフォルトの名無しさん :2006/02/09(木) 04:41:36
せめてthisが参照になればなあ
operator[]とかポインタじゃ呼び出しにくい

766 名前:デフォルトの名無しさん :2006/02/09(木) 04:45:58
this[0]["hoge"]

767 名前:デフォルトの名無しさん :2006/02/09(木) 05:28:06
>>763
個人的に、そういう仕様はあまり好きになれない。


768 名前:デフォルトの名無しさん :2006/02/09(木) 06:22:22
>>745
コンパイラが新しければね

769 名前: ◆Uy3UpqU1oc :2006/02/09(木) 07:11:41
初めて書き込みますが相談があります。m(__)m
書き込みや読み込み先のファイルの、場所の指定はできないんですかね?

770 名前:デフォルトの名無しさん :2006/02/09(木) 07:32:37
朝から釣りかよ

771 名前:デフォルトの名無しさん :2006/02/09(木) 07:40:47
>>765
C++にthisが入ったのが、参照が入ったのより前だからごめん、
って禿がゆってた。

772 名前: ◆Uy3UpqU1oc :2006/02/09(木) 07:50:18
釣りではないんですが…orz

773 名前:デフォルトの名無しさん :2006/02/09(木) 08:22:28
キリンさんの首輪はどこに付けたらいいの?

774 名前:デフォルトの名無しさん :2006/02/09(木) 09:20:31
標準ストリームで、整数を 1234567 という形式ではなく
1,234,567 という形式で出力させる事はできますか?

775 名前:デフォルトの名無しさん :2006/02/09(木) 09:45:48
適切なlocaleを与えれば可能。例としてVC++7.1で。

locale loc("jpn");
cout.imbue(loc);
cout << 1234567 << endl;


776 名前: ◆Uy3UpqU1oc :2006/02/09(木) 10:23:30
すみませんでしたm(__;)m
自分であっちこっち移動させました…

777 名前:デフォルトの名無しさん :2006/02/09(木) 12:52:30
Cの時の癖でそのまんまハンガリアンしてる俺って
就職したら迫害されるんだろうか

778 名前:デフォルトの名無しさん :2006/02/09(木) 16:25:15
>>777
コーディング既約で一応変数名についてはそれなりの基準を示すから
現場では適宜それにしたがってくれればいいよ.

779 名前:デフォルトの名無しさん :2006/02/09(木) 16:30:19
>>769
Windowsユーザと邪推すると、ディレクトリ記号「\」はエスケープシーケンスで使われるので

ifstream fin("C:\\Documents and Settings\\Gates\\testament.txt");

というように「\\」と重ねなければならない。

もしこれで正答なら漏れエスパー。

780 名前:デフォルトの名無しさん :2006/02/09(木) 16:44:19
識別子 : 英字はすべて小文字、単語の区切りは下線
メンバ変数 : 下線を最初につける
引数 : 下線を最後につける、主となる引数を下線だけにする
getter : 素の名前
setter : set_を最初につける

↓こんな感じ
class X {
 int _width;

public:
 X(const int& width_) : _width(width_) {}
 int width() const { return _width; }
 int set_width(const int& _) { return _width = _; }
};


781 名前:デフォルトの名無しさん :2006/02/09(木) 16:51:27
>>780
先頭の文字がアンダーバーなのは、
C++の処理系に大域名として予約されているから余り好きじゃないなぁ。
大域名にマクロ使われるかもしれんし。

782 名前:デフォルトの名無しさん :2006/02/09(木) 16:52:19
>>774
template <typename T>
inline std::string number_format(const T& target_, std::size_t w_=3, const std::string& s_=",") {
 std::string n = xtos(target_);
 std::size_t p = n.find('.');
 if (p == std::string::npos) p = n.size();
 while ((p -= w_) > 0) n.insert(p, s_);
 return n;
}

xtos()は次の通りだけれど、Boostのlexical_castを使った方がいいと思う。

template <typename T>
inline std::string xtos(const T& _) {
 std::string s;
 std::stringstream ss;
 ss << _; ss >> s;
 return s;
}


783 名前:デフォルトの名無しさん :2006/02/09(木) 17:20:04
>>780
ルールを覚えるのが面倒だから面罵も下駄も雪駄も同じ名前でいいよ。
class X {
 int width;

public:
 X(const int& width) : width(width) {}
 int width() const { return width; }
 void width(const int& _) {width = _;}
};


784 名前:デフォルトの名無しさん :2006/02/09(木) 17:39:58
俺はm_派。アンダーバー一つだと普通に間違えそうで怖い
あとgetterが素の名前()ってのはSTLでも使われてるけど
パブリック変数なのかゲッター関数なのか紛らわしくないか?
STLとか自分で書いたライブラリならまず間違えないし
間違えたとしてもコンパイルエラーで済むって言われたらそれまでだが

785 名前:デフォルトの名無しさん :2006/02/09(木) 18:01:28
>>784
パブリック変数を使わず、必ずgetterを書くようにすることで統一を。
コンパイラが最適化のチャンスを見逃したら悲惨なことになるけどw

型名を接頭子にするのはどうしても慣れないなあ。
std::map<std::string, std::vector<std::pair<std::string, std::string> > >** p;
とかってハンガリアン記法で書くとどう書くの?


786 名前:デフォルトの名無しさん :2006/02/09(木) 18:36:26
omanko

787 名前:デフォルトの名無しさん :2006/02/09(木) 18:43:09
可能な限り、標準に近い形でライブラリは記述
クラスメンバには、Prefix、Suffix などはつけない方向で。
メンバ変数が埋もれそうな状況になったら、
ヘルパクラスや関数にする。

それ以外は、C++ Coding Standards を参考にする。

template< typename TypeName >
class class_name
{
public:

 typedef TypeName type;

 enum enum_name { item_name };
 
 // 下駄。標準 stream などに見られる形式
 type value() const { return val; }

 // 雪駄。標準 stream などに見られる形式
 type value( type const & newval ) { val = newval; }

private:

 // 略名. prefix, suffix なし
type val;
 
};

788 名前:デフォルトの名無しさん :2006/02/09(木) 18:49:32
M$製のSDKのサンプルみたいなm_pNextFrame
みたいな長くて堅苦しいのが好きだから
STLのコードが読みにくくてしょうがない

789 名前:デフォルトの名無しさん :2006/02/09(木) 18:50:16
みたいなが連続した俺文盲

790 名前:デフォルトの名無しさん :2006/02/09(木) 21:48:38
C++0xには@文字列付かんの?
@"c:\Documents and Settings\Gates\testament.txt");

みたいなC#モドキにしてくれぇ。


791 名前:デフォルトの名無しさん :2006/02/09(木) 22:03:15
>>790
Windowsは意外と大抵/を受け付けてくれるよ。
たまに\しか受け付けないものもあるけど。

792 名前:デフォルトの名無しさん :2006/02/09(木) 22:19:30
>>791
dクス。UNIXがセパレータに'/'を使っていたので、ビル・ゲイツがひねくれて
わざとバック・スラッシュ文字を使ったような事は聞いた事があるけど、'/'も
使える場合があるのか。試してみる。

793 名前:デフォルトの名無しさん :2006/02/09(木) 22:33:46
>>792
いや、単にCP/Mが/をコマンドラインスイッチに使用してたんで互換性の都合上/が使えなかっただけらしいが。

794 名前:デフォルトの名無しさん :2006/02/10(金) 14:22:51
>793
そうだね
MS-DOS = (CP/M + UNIX) / 3
だから

795 名前:デフォルトの名無しさん :2006/02/10(金) 20:25:17
/3 テラワロス

796 名前:デフォルトの名無しさん :2006/02/10(金) 20:41:16
俺の感覚だと
MS-DOS = CP/M + UNIX / 10
くらいだな


797 名前:デフォルトの名無しさん :2006/02/10(金) 21:33:52
DLLを修正してビルドすると.libも再作成されますが、
インタフェースを変更していない場合、参照している
呼び出し元プログラムはリビルドする必要があるので
しょうか?
皆さんはリビルドしていますか?

798 名前:デフォルトの名無しさん :2006/02/10(金) 22:03:14
リビルドが必要なら、それはインターフェイスではない

799 名前:デフォルトの名無しさん :2006/02/10(金) 23:06:50
>>797
処理系によるかと
昔のHPだと、たま〜〜に再リンクが必要だった

800 名前:デフォルトの名無しさん :2006/02/10(金) 23:10:13
自分も、m_・・は好きになれない
美しくない・汚い・見るに耐えない
(慣れの問題だとは思うが・・)

抽象化が進むと、変数名命・メソッド名命
に、なって来るから余計そう思う

801 名前:デフォルトの名無しさん :2006/02/10(金) 23:23:35
>>800
引数に対する a_ もダメか?
argument の頭文字で a なわけだけど
そのまま前置詞の a と見なすことできるから
全然汚くないと思うんだが。

あと、お前が後半で言ってることの意味が不明。

802 名前:デフォルトの名無しさん :2006/02/10(金) 23:35:39
>>800
while(true) {
何でそんなに気にするのかよくわからん

private メンバは関数で言うなら auto 変数のようなもので
外から名指しされることのない、いわば自己責任の範疇だし

ちょっと込み入った処理をする場合はいちいち this-> ではアクセスせず
auto にキャッシュして最後に代入するだけだ
}

803 名前:デフォルトの名無しさん :2006/02/10(金) 23:42:17
>>801
引数・ローカル変数に「a」を付けるのは綺麗&今、マイブーム
(勝手な感覚だけど)
val=aVal;
何となく良い
引数とローカル変数の区別を、どう付けるべきか思案中
(区別するまでも無いとの説アリ)

後半はoo限定の話でした

804 名前:デフォルトの名無しさん :2006/02/11(土) 00:24:26
>>802
>何でそんなに気にするのかよくわからん
単なる(?)感覚的な問題

>private メンバは関数で言うなら auto 変数のようなもので
これは、全然違う希ガス

805 名前:デフォルトの名無しさん :2006/02/11(土) 00:43:47
メンバ変数は関数で言うならグローバル変数のようなもの。
クラスのどこからでもアクセスできて、
メンバ関数を抜けても値が保存される。

806 名前:デフォルトの名無しさん :2006/02/11(土) 00:50:34
>>805
>>802はprivateメンバ「関数」の話をしてるんだと思う。

807 名前:デフォルトの名無しさん :2006/02/11(土) 00:55:00
m_が汚く見えるのは多分_Tyとかかなり短く略した命名してる人だろうな。

808 名前:デフォルトの名無しさん :2006/02/11(土) 01:22:23
>>806
privateとpublicは、今の話には関係無い

>>807
長い変数名に、m_付ける方が汚く見える気がする
それ自体で意味成しているのに
それに余分な、m_付けるのはかなり気になる

809 名前:デフォルトの名無しさん :2006/02/11(土) 01:52:50
最近のマイブームは
int member();
void member( int value );
int member_;
しかしスレ違いな気が……

810 名前:デフォルトの名無しさん :2006/02/11(土) 02:06:33
>>808
>privateとpublicは、今の話には関係無い
privateメンバ変数の名前はインターフェースに含まれないから、
適当に名前を割り当てても良い、というのが>>802の意見だろ。

811 名前:デフォルトの名無しさん :2006/02/11(土) 02:31:35
>>809
メンバ変数の最後に「_」付けるのは、目立たなくて控えめで個人的には好き

>>810
なるほど・・・そう言う意味ならば、>>802は、余計拙いと思う
メンバ変数は、>>805も言っている通り、グローバル変数的意味合いが強くなりやすい
(「1クラス=1責務」の原則を知らない人が多い現状では尚更)
ので・・・
ってか、public変数使う機会って、ほとんど無い・・と思う
少なくとも自分は1年以上使ったこと無い


812 名前:デフォルトの名無しさん :2006/02/11(土) 02:43:40
命名規約の話は
どうせ最終的にはどちらも譲らなくて宗教戦争になるだけなんだから
出来れば他のスレでやって欲しいんだけどな。

http://pc8.2ch.net/test/read.cgi/tech/1068752664/
とか。

813 名前:デフォルトの名無しさん :2006/02/11(土) 02:56:28
単に勝手に好きな事言い合ってるだけだから良いんでないかい?
変数名・関数名の選定って、一番重要って説もあるくらいだし。

814 名前:デフォルトの名無しさん :2006/02/11(土) 03:08:41
と、当事者は申しております

815 名前:デフォルトの名無しさん :2006/02/11(土) 06:35:14
>メンバ変数は、>>805も言っている通り、グローバル変数的意味合いが強くなりやすい

おいおい、1クラス=1責務とか言ってる尻から何を血迷ったことを?

メンバ変数にするか関数内ローカル変数にするかは、
それぞれ合理的な理由でスコープを選択するわけで
グローバル変数にさえそれは当てはまるだろうがよ

昔の BASIC や COBOL のグローバル変数と一緒にしとるんちゃうか?

816 名前:デフォルトの名無しさん :2006/02/11(土) 08:57:48
クラスのメソッドを関数ポインタみたいに出来ないでしょうか
具体的には、コンストラクタでメソッドの飛び先を変更して、
クラスの実行先ではそれを意識しないですむというものです

class hoge {
public:
void print();
 void print_a();
void print_b();

 hoge(int num) {
  // ここでprintメソッドの実行先をprint_aまたはprint_bに変更
}

};

hoge h(1), hh(2);
h.print(); // print_aが実行される
hh.print(); // print_bが実行される

817 名前:デフォルトの名無しさん :2006/02/11(土) 09:00:23
1. 継承でなんとかする設計にする
2. メンバ関数ポインタ(void (hoge::*)())を使う

どっちにするかは状況次第。

818 名前:デフォルトの名無しさん :2006/02/11(土) 09:25:53
templateってのもあるな。

819 名前:デフォルトの名無しさん :2006/02/11(土) 10:16:17
それで解決できる状況なら、
普通にオーバーロードで解決できるんじゃ・・・。

820 名前:デフォルトの名無しさん :2006/02/11(土) 11:11:57
>>816
hとhhが同じ型でなくてよいならtemplateで解決(MC++D参照)
同じ型ならば>>817の案をセレクト。

821 名前:デフォルトの名無しさん :2006/02/11(土) 11:19:05
switch-caseで分岐する方法が……

822 名前:デフォルトの名無しさん :2006/02/11(土) 11:27:23

  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  | switch-caseで分岐って聞こえたような気がする!!
  \_______  ____________
              ∨
    |
    |
   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  /          ____   
/            | 19:00 |  
              ̄ ̄ ̄
               _______
              /    _   /  ,__  
            ∧∧ガバッ!  () /    iii■
           ( ;゚Д゚)ミ    ̄/      
         /\∪ ∪ ̄\/ ∫∫
        / ※⌒⌒⌒⌒/  ∫∫    
      / ※※※※ /  ⊂⊃
     / ※※※※ /   ┗━┛ 
    (______,,ノ        

823 名前:デフォルトの名無しさん :2006/02/11(土) 11:32:37
何!switch - case だと!!

824 名前:デフォルトの名無しさん :2006/02/11(土) 11:38:19
こうしちゃおれん

825 名前:デフォルトの名無しさん :2006/02/11(土) 12:13:24
別に本当にswitch-caseでも問題ない気が

826 名前:デフォルトの名無しさん :2006/02/11(土) 13:16:29
>>825
何らかの理由で出来ないのでしょう。
hogeのコンストラクタで関数をチョイスしていることから推測

827 名前:デフォルトの名無しさん :2006/02/11(土) 14:40:23
class A
{
private:

public:

};

と書いています。しかし先輩から、お前のは見にくいから止めろと言われました。

class A
{
public:

private:

}

どっちが普通なんですか?

828 名前:デフォルトの名無しさん :2006/02/11(土) 14:49:30
>>827
プログラムに限らずテキストを書くときには
人に見てもらいたいところを先に書いたほうがいい、
というのはわかる?

「これは基本的にあなたは知らなくてもいいんですが
 ・・・
 ・・・
 おっとここまで書いたところは気にしないで下さいね。
 いつ内容が変更されるかわかりませんよ。
 さて、結局のところは
 ・・・
 ・・・。」
こんな文章読まされたら嫌だと思わない?

829 名前:デフォルトの名無しさん :2006/02/11(土) 14:49:35
どっちでも良い。
単なる糞くだらない宗教問題だから気にするな。

ただ、もしコーディング規約とかで、
定められているのならそちらを使えばいい。

規約が無いのなら自分で良いと思うほうを使えばいい

830 名前:デフォルトの名無しさん :2006/02/11(土) 14:53:17
>>828
ok。すべて書き直すぜ☆

831 名前:デフォルトの名無しさん :2006/02/11(土) 15:24:07
立場によってprivateとpublicどっちをよく見るかは変わるだろ
まぁそれでもpublicが先のコードが多いけどな

832 名前:デフォルトの名無しさん :2006/02/11(土) 15:25:34
>>828
本当にメンバ変数を隠蔽したいならPimplを使うべき。
classには「何も指定されてないものはprivateである」という
明確な仕様があるから、それに従って

class A
{
ここにprivateなものを定義

public:
ここのpublicなものを定義
};

こう書いてるよ。

一番悪いのは、メンバ関数の定義とメンバ変数の定義が
ごっちゃになってたり、staticなメンバとそうでないのが
混ぜこぜになってたりすること。


833 名前:デフォルトの名無しさん :2006/02/11(土) 16:00:27
>>827
先輩がなんで見にくいのか俺にはわからん。
メンバ変数の宣言が上下どちらかに統一されて
メンバ変数の初期化の順序が守られていればどっちだっていいよ。

それよりもクラスに対しての適切なコメントがないのが嫌。


834 名前:デフォルトの名無しさん :2006/02/11(土) 16:26:34
>>832
pimpl にはオーバーヘッドとコードの増加が伴うので、
それが許容できる場面でなければ使えない。

class の暗黙の private を省略するのは、
演算子の優先順位に依存してカッコを省略するのと
同じぐらいウザイと思う。
明確な仕様というが、デフォルトで private になっている理由は
そんなに明らかではないだろう?

835 名前:デフォルトの名無しさん :2006/02/11(土) 16:27:23
このレベルの話だったら、一貫性やコメントのほうがずっと大切だと思う。

836 名前:デフォルトの名無しさん :2006/02/11(土) 16:32:32
>>834
「デフォルトではprivateである」という事実は十分一般的なんだから問題ないと思うが…

837 名前:816 :2006/02/11(土) 16:33:16
ありがとうございます
メンバ関数ポインタを使用します

838 名前:デフォルトの名無しさん :2006/02/11(土) 16:33:16
>>834
>pimpl にはオーバーヘッドとコードの増加が伴うので、
>それが許容できる場面でなければ使えない。
許容できる場面の方が多いのでオイラはディフォルトはpimplにしてるな
最適化する段階でプロファイルしてクリティカルなものをメンバ変数にするようにしてる


839 名前:デフォルトの名無しさん :2006/02/11(土) 16:38:57
>>836
public:が先頭に来るスタイルも多いんだから
見間違える可能性は小さくないだろ

840 名前:デフォルトの名無しさん :2006/02/11(土) 16:39:36
>>836
演算子の優先順位に依存してカッコを省略する人ですか?

841 名前:デフォルトの名無しさん :2006/02/11(土) 16:44:16
コーディングスタイルとして規定されて統一されてればどっちでもいい

842 名前:デフォルトの名無しさん :2006/02/11(土) 16:44:24
>>840
依存せずに括弧を書く人ですか?
((((A+B)+C)+D)+E)


843 名前:デフォルトの名無しさん :2006/02/11(土) 16:45:17
全く、括弧を省略するとは信じられないな。
1つたりとも無駄な括弧などないのに。

(- (+ 1 (* 2 (+ 4 6)) (/ 4 2)) 2)
21

844 名前:デフォルトの名無しさん :2006/02/11(土) 16:46:01
MLで括弧を省略するとカッコいいな

845 名前:デフォルトの名無しさん :2006/02/11(土) 16:46:16
lisperは黙れw
# いや俺はlisp大好きよ

846 名前:デフォルトの名無しさん :2006/02/11(土) 16:49:53
みっともない

847 名前:デフォルトの名無しさん :2006/02/11(土) 16:50:17
>>842
その式は演算子の優先順位に依存していないから、
省略しても問題ないと言えるんじゃね?

848 名前:デフォルトの名無しさん :2006/02/11(土) 16:53:32
classの暗黙のprivateに期待するのが悪いのなら、
当然ながらstructの暗黙のpulicにも期待しないんだろうな?

struct Point
{
public:
  int x, y;
};

当然、わざわざpublicを書いてると。

限りなくウザス
まさか「structの暗黙のpublicだけは信じる」とか言わんよな?


849 名前:デフォルトの名無しさん :2006/02/11(土) 16:54:16
見間違えるかどうかは微妙だなぁ。
private:を省略するスタイルも一般的ではあるから見れば分かるし、
直後に連続して「public:」が続いていたら、不自然に感じるから問題はない気がする。
そもそも、メンバ変数をpublicにする状況というのも頻繁にあるわけじゃないしね。

850 名前:デフォルトの名無しさん :2006/02/11(土) 16:56:15
structは暗黙でpublic、classは暗黙でprivateって
明確に仕様で決まってるから、structとclassの違いに意味がある。

いちいち冗長なpublicやprivateを書く方がムダ。


851 名前:デフォルトの名無しさん :2006/02/11(土) 17:04:24
>デフォルトで private になっている理由は
>そんなに明らかではないだろう?

ARMにははっきり書いてあるし、仕様書は見てないが書いてあるだろう。
D&Eにも、C with Classesの最初期から「デフォルトはprivate」と
はっきり意識していたと書いてある。

Javaみたいな言語と違って、C++の場合は「sizeof(class)」が重要な
意味を持つから、クラスのサイズを規定するものは一番最初に
書いた方がいい。その方が絶対にバグを減らせる。


852 名前:デフォルトの名無しさん :2006/02/11(土) 17:06:38
ここまで話進んでるとは思わなかったよ、、、
今やっと半分ぐらい書き直したところ。

853 名前:デフォルトの名無しさん :2006/02/11(土) 17:13:16
宗教論争をしてる奴ってそれが意味のある議論だと信じて疑わないんだなホント

854 名前:デフォルトの名無しさん :2006/02/11(土) 17:16:18
>>828
pimplを使わない限り、classのprivate部分の変化は
そのclassを使っている全てのコードのリコンパイルを要求する。

Javaじゃないんだから「private部分はクラスのユーザーには無関係」
と言い切ることはできないのさ。

本当にprivateを意識させたくなければpimplを使うのが筋。

実装がFixしていてprivate部分に変化が無くなったら、
publicインターフェイスドキュメントを充実させればいい。
その方がよっぽど役に立つ。


855 名前:デフォルトの名無しさん :2006/02/11(土) 17:19:48
struct の暗黙の public は直感的。
この仕様によって C と互換性を保っていることが簡単に推測できる。
全部 private だったら friend つけない限り意味無いし。

class の暗黙の private は、この仕様に決めた理由を知らないし、
推測することができない。

俺が無知なだけ?

856 名前:828 :2006/02/11(土) 17:22:13
>>854
そんなのは知ってるよ。
でも public を先に書いたほうが良いのに変わりは無いよ。

857 名前:デフォルトの名無しさん :2006/02/11(土) 17:22:40
>>855
お前が無知なだけ

classというキーワードを作ったそもそもの目的は、
「外部からのフィールドのアクセスが禁止されたstruct」
を作りたかったから。


858 名前:デフォルトの名無しさん :2006/02/11(土) 17:24:51
考古学乙


859 名前:デフォルトの名無しさん :2006/02/11(土) 17:25:26
>>856
俺はこんな感じにしてるけど。

class Foo
{
// プライベートなメンバ変数の定義

public:
// コンストラクタに始まるパブリックインターフェイス

protected:
// 派生クラスへのインターフェイス

private:
// プライベートなメンバ関数
};


860 名前:855 :2006/02/11(土) 17:29:09
>>857
そんなのは知ってるよ。
でもこの仕様に決めた理由がわからないのに変わりは無いよ。

861 名前:デフォルトの名無しさん :2006/02/11(土) 17:30:39
>>860
そんなのは知ってるよ。 
でも お前が無知なのに変わりは無いよ。 

862 名前:デフォルトの名無しさん :2006/02/11(土) 17:38:14
>>861 なら理由を教えてやれよw

863 名前:デフォルトの名無しさん :2006/02/11(土) 17:39:09
C++で、クラスのprivateメンバ変数の数とかサイズとかが
真っ先に気にならない奴って、C++におけるコピーとか代入とか
STLコレクションの挙動とかを全く理解してないんだろうと推測できる。

privateメンバ変数が超巨大で、その下に書いてあるpublic部分が
画面外に追いやられるような状況なら、分割かpimplを真剣に検討すべき。


864 名前:デフォルトの名無しさん :2006/02/11(土) 17:40:41
>>862
>>857で十分だと思うが


865 名前:デフォルトの名無しさん :2006/02/11(土) 17:43:23
今北産業だがD&Eも読まずに話している連中が多いのはわかった。

866 名前:デフォルトの名無しさん :2006/02/11(土) 18:30:15
>863
あんたはSTLコンテナのイテレータが保持しているメンバ変数の数とかサイズとかを気にしているの?

867 名前:デフォルトの名無しさん :2006/02/11(土) 18:50:03
現場でルールとして決められたらそれに従う、これが守れりゃいいんだろ?

868 名前:デフォルトの名無しさん :2006/02/11(土) 18:56:20
sizeofが信用できないので自分で計算します。

869 名前:デフォルトの名無しさん :2006/02/11(土) 18:58:02
>>866
コピーのコストは気にするよ。


870 名前:デフォルトの名無しさん :2006/02/11(土) 18:58:38
ルールを決められる立場ならそれでいいが、
ルールを決める立場には問題が残る。

871 名前:デフォルトの名無しさん :2006/02/11(土) 19:00:58
>>869
だからって真っ先には気にならない。
クラス定義に現れる順番は public インターフェースの後ろでいい。

872 名前:デフォルトの名無しさん :2006/02/11(土) 19:09:36
内部の細かい仕様を覗き見させないで
知っとかないと問題のある事は仕様として公開するべきじゃないのか?

>>869の例なら内部に巨大なデータを保持していてコピーに時間がかかる事を
書いておくな俺だったら

873 名前:デフォルトの名無しさん :2006/02/11(土) 19:09:46
>>871
コンストラクタをprivateにしてSingletonや継承禁止にしたり、
コピーコンストラクタや代入演算子をprivateにしたりする事があるよな。

「明示的にprivateにしている」事もpublicインターフェイスを
構成している(コピーできない、構築できない、継承できない等)
場合があるが、お前はそれはどこに書くの?


874 名前:デフォルトの名無しさん :2006/02/11(土) 19:16:04
>>872
>内部の細かい仕様を覗き見させないで

それは要するにpimplで解決。

>知っとかないと問題のある事は仕様として公開するべきじゃないのか

C++の場合、例えprivateでも、メンバ変数のサイズは
「知っとかないと問題のある事」の1つだろ。

private関数は、ユーザーが知る必要は全くないけど。


875 名前:デフォルトの名無しさん :2006/02/11(土) 19:20:09
いや そのりくつは おかしい。
>>873はクラスを見たとき必ずprivateを真っ先に見るのか?
privateの中身が問題になる事があるって言っても
publicよりprivateのほうを良く見るって事にはならないだろ

>>874
ヘッダにクラス設計として実装されてることを公開って言ってるわけじゃない。

876 名前:871 :2006/02/11(土) 19:25:07
>>873
コピー不可については自明なことも多いので
boost::noncopyable が使えればそれで。
使えなければ単純な private ブロックの直前に別で書く。

// noncopyable
private:
 例の奴ら

private:
 ...

その他、構築できない、継承できないなどは
クラスについてのコメントとしてクラス定義の直前に理由を添えて書く。

877 名前:デフォルトの名無しさん :2006/02/11(土) 19:31:14
>>874
private なメンバ変数のサイズをクラス定義を見て知ったとしても、
それに依存したコードを書くのはダメだろ。

問題が起こってから解決のためにサイズに依存した
回避コードを書くことはあるかもしれないが。

878 名前:デフォルトの名無しさん :2006/02/11(土) 19:40:19
ARMとかD&Eとかでは、classかstructかに関係なく、
メンバ変数は先頭にアクセス指定無しで書かれてる。

structならpublic、classならprivateとなる。
Bjarneとしては、classとstructの違いを活かして
メンバ変数は先頭にまとめて書け、って方針みたいだ。


879 名前:デフォルトの名無しさん :2006/02/11(土) 19:44:32
>>877
sizeof(class)に依存したコードなんて書く池沼がどこにいるの?


880 名前:デフォルトの名無しさん :2006/02/11(土) 19:48:24
>>878
ふむ、ってことは、
先頭にメンバ変数を書かないのは基本的にはマイナーな俺ルールなのか。
自分の書き方は先頭派で禿と同じで少し安心。

881 名前:デフォルトの名無しさん :2006/02/11(土) 19:50:59
>>879 さぁ? >874 あたりにいるんじゃないか?

882 名前:デフォルトの名無しさん :2006/02/11(土) 20:39:48
確か禿はユーザーが気になるのはpublicインターフェースだから
先にpublicを書けと言っていたはずだが

>>878
>>880
すごい自演を見た

883 名前:デフォルトの名無しさん :2006/02/11(土) 20:50:15
>>882
それはメンバ関数の話じゃないの?

禿げの本では、どれもメンバ変数は先頭に書いてるよ。


884 名前:デフォルトの名無しさん :2006/02/11(土) 20:53:37
>>883
public->privateの順で書くよりも
private->publicの順で書く方がprivateが短く書けるから
本ではそう書くようにしているとも言っている

885 名前:デフォルトの名無しさん :2006/02/11(土) 20:54:26
- privateが短く書けるから
+ privateをを省略出来て短く書けるから

886 名前:デフォルトの名無しさん :2006/02/11(土) 20:58:08
>>884
ソースキボンヌ


887 名前:デフォルトの名無しさん :2006/02/11(土) 20:59:11
>>886
確か禿本の最初の方だったと思う

888 名前:デフォルトの名無しさん :2006/02/11(土) 21:04:56
>>816
遅レスだが・・
print()をインターフェースで分離する・・に1票

889 名前:デフォルトの名無しさん :2006/02/11(土) 21:16:02
>privateをを省略出来て短く書けるから

いやちょっとその意見にはさすがに納得できない

890 名前:デフォルトの名無しさん :2006/02/11(土) 21:18:46
>>888
結局のところ、>>816をリファクタリングするのか、
>>816をそのまま実現するかで話は違ってくる。

>>816をそのまま実現するなら、print()の中でswitch〜caseするのが
一番素直な方法だと思うが。

typedef void (hoge::*hoge_print_t)();
static hoge_print_t hoge_print_table[] ={
  &hoge::print_a, &hoge::print_b
};

void hoge::print(){
  this->*(hoge_print_table[ m_num - 1 ])();
}

こんな方法もあるにはあるけど。


891 名前:デフォルトの名無しさん :2006/02/11(土) 21:27:25
>>889
書籍にコードを載せる際には、そういうのが結構あるんじゃないかと思う。
public:
とかだけで普通、一行食うし。

892 名前:デフォルトの名無しさん :2006/02/11(土) 21:30:40
>>890
>>816をそのまま実現すると巨大な一枚岩クラスの温床になりかねないので
そこから「改造」したいなあぁ・・って感じです

使い捨てAPLならば、switch〜caseに1票

893 名前:デフォルトの名無しさん :2006/02/11(土) 21:37:44
>>884
ヒント: 紙面の都合上

894 名前:デフォルトの名無しさん :2006/02/11(土) 21:46:05
「本ではこう書いてるけど実際のコードはどっちがいいのか知らん」
って意味か

895 名前:デフォルトの名無しさん :2006/02/11(土) 22:00:43
プロポーショナルフォントでソースコード印刷する人だからなぁ。

896 名前:デフォルトの名無しさん :2006/02/11(土) 22:28:19
public:やprivate;を書くか書かないでよくここまで盛り上がることが出来るな。
一秒のtypingをケチるような奴は関数名や変数名もろくでも無いものにしているのだろうな。

897 名前:デフォルトの名無しさん :2006/02/11(土) 22:28:34
delete this;

ってありですか?

898 名前:デフォルトの名無しさん :2006/02/11(土) 22:35:26
>>894
>>882

899 名前:デフォルトの名無しさん :2006/02/11(土) 22:38:57
>>897
できる。
もちろんそれ以降メンバ変数・関数を扱わないこと。
また、大抵の場合はnewで確保されたものでないとだめだろうから、それにも気を付けること。

900 名前:デフォルトの名無しさん :2006/02/11(土) 22:42:38
>>899
ありがとうございます。

できるんですね。
自己消滅できれば便利なのになーとか考えてたんですが、
delete thisについて書かれてるようなものが見つからなかったので,,,


901 名前:デフォルトの名無しさん :2006/02/11(土) 23:03:31
>>900
やめとけ、メンドクサイ。だいたい、ほんとで探したのか?すでに FAQ の一つだぞ。
ttp://www.tietew.jp/cppll/archive/11457
ttp://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.15

902 名前:デフォルトの名無しさん :2006/02/11(土) 23:13:45
>>901
ありがとうございます。
その二つは見つけてませんでした。すいません。

ただ、それほど面倒なことにはならないなぁってのが第一感想です
#もちろんきーつけて使えばの話ですが。

903 名前:デフォルトの名無しさん :2006/02/11(土) 23:13:51
delete this、の有用性は時と場合によるかと
すれどのラッパークラスとかの場合は便利

>>901
> CWnd::GetSafeHwnd()
目から鱗が2枚落ちました

904 名前:デフォルトの名無しさん :2006/02/12(日) 00:11:30
>>903
間違っても仮想関数で真似するなよ。

905 名前:デフォルトの名無しさん :2006/02/12(日) 00:52:09
>>903-904
ヌルポインタに対するメンバ関数呼び出しの時点で未定義動作だ。
仮想関数関係無しに真似しちゃイカン。

906 名前:デフォルトの名無しさん :2006/02/12(日) 00:55:24
>>905
やべ、そうだったのか。
ってことは

struct tree{
    int value;
    tree*left,*right;
    int size(){
        return this?left->size()+right->size()+1:0;
    }
};

こういうソースは駄目なのか......
んー面倒だなー

907 名前:デフォルトの名無しさん :2006/02/12(日) 01:37:01
>>906

そんなソース、貧乏人しか書かない時代なんだが。


908 名前:906 :2006/02/12(日) 01:44:25
いや、まぁこれ位ならsetなりmultisetなりを使うけどさ、
これ以外にも自己再帰的なデータ構造を扱うときに
this==NULLを終端条件とした再帰を書きたくならない?

俺は結構なるけどなー。まぁ未定義らしいしやめとくか

909 名前:デフォルトの名無しさん :2006/02/12(日) 02:25:34
>>880 http://www.google.co.jp/search?q=%22Defining+a+default+access+specifier+was+probably+a+mistake%22

910 名前:デフォルトの名無しさん :2006/02/12(日) 11:37:35
>>905
あらま・・ヌルオブジェクトパターンを簡易に書けるかと思ったら
VC限定仕様だったみたいですね

>>906もそれは同じ・・かな

911 名前:デフォルトの名無しさん :2006/02/13(月) 01:39:14
限定とは言わんが、鼻から悪魔だな。

912 名前:デフォルトの名無しさん :2006/02/14(火) 04:42:44
operator<<と>>を間違えていたのに気づかず、こんな時間だ。
なぜこんなにもSTLのエラーメッセージはわかりづらいのだろう?

913 名前:デフォルトの名無しさん :2006/02/14(火) 05:14:32
>>912
それはあなたが馬鹿だからです。

914 名前:デフォルトの名無しさん :2006/02/14(火) 08:06:20
馬鹿を切り捨てるわかりづらさは問題だよなやっぱ。

915 名前:デフォルトの名無しさん :2006/02/14(火) 08:40:35
そういうひとはVBを使ってください

916 名前:デフォルトの名無しさん :2006/02/14(火) 09:43:15
いやー、ロジックの方にばかり目がいってしまった。
std::istream& operator<<(std::istream& is, myclass& o);
('A`)…

917 名前:デフォルトの名無しさん :2006/02/14(火) 09:49:52
ところで、引数付きコンストラクタで
配列を初期化しながら確保できるようにはならんかね?
デフォルトコンストラクタ無いとだめか。

しかし、初期化漏れを防ぐために敢えて
デフォルトコンストラクタを作ってなかったのだが・・・

918 名前:デフォルトの名無しさん :2006/02/14(火) 09:51:17
>>912
g++ だろ?
エラーメッセージ翻訳フィルタでも作ればウケるかも

919 名前:デフォルトの名無しさん :2006/02/14(火) 09:59:17
>>917
std::vector じゃダメか?コピーコンストラクタ要るけど。

920 名前:デフォルトの名無しさん :2006/02/14(火) 10:34:45
>>917
struct Point
{
  int x, y;
  Point( int a, int b ) : x(a), y(b){}
};

Point points[] ={
  Point( 0, 0 ), Point( 0, 1 ), Point( 1, 0 ), Point( 1, 1 )
};

普通にできるが…


921 名前:デフォルトの名無しさん :2006/02/14(火) 10:46:16
>>919 なるほど、そういや何も考えずに std::vector<OreClass> してたな。
あれが通ってたのはコピーコンストラクタがあったからか。
しかし内部の実装みてないけどコピーコンストラクタがあったとしても
なんでそれで通るんだろう。ていうか、初期化されてるんだろうか。

>>920 そういう形式の初期化はできますね。
配列の要素一つごとにざくっとコンストラクタ
呼んでくれればべんりだなぁ、と。

922 名前:デフォルトの名無しさん :2006/02/14(火) 10:51:07
>>918 g++だ。他のコンパイラはもっと明確なエラーが出るのかな。

>>917
配列の要素一つごとに、異なる初期値を与えたいの?

923 名前:デフォルトの名無しさん :2006/02/14(火) 10:56:22
>>922 いや、たとえば

class ValuePair {
double v1;
double v2;
public:
ValuePair(double initial_v1, double initial_v2)
: v1(initial_v1), v2(initial_v2){}
};

というクラスを作っておいて、

ValuePair value_pairs[100](0.5, 0.6);

のようにして全部同じコンストラクタ連続的に呼んでくれたらな、って。

924 名前:デフォルトの名無しさん :2006/02/14(火) 11:02:29
struct OreGenerator
{
  OreClass value;
  OreGenerator() : value( 10, 0 ){} // 適当な初期値
  operator OreClass() const{ return value; }
};

std::vector<OreGenerator> v( 100 );
OreClass ore = v[0];


925 名前:デフォルトの名無しさん :2006/02/14(火) 11:09:35
>>923
テンプレート関数の実装は、必要になるまでコンパイルされない。
よって、std::vectorも、要素のデフォルトコンストラクタは
実際に必要になるまで呼ばれない。

その用途なら、以下のコードで十分。

ValuePair value( 0.5, 0.6 );
std::vector<ValuePair> value_pairs( 100, value );


926 名前:デフォルトの名無しさん :2006/02/14(火) 11:09:58
うむぅ、ファクトリか。

927 名前:デフォルトの名無しさん :2006/02/14(火) 11:12:43
>>925 ども。
それが一番すっきりしそうですね。
幸い operator= は定義済みですし。

コンテナクラスライブラリってオーバーヘッドやだな、
なんて思ってたんですが、std::vector<T> って中身は
まんま配列っぽい。

928 名前:デフォルトの名無しさん :2006/02/14(火) 11:20:26
OreはねーよOreは

929 名前:デフォルトの名無しさん :2006/02/14(火) 11:35:00
それにしてもテンプレート使うと、エラーが出たときに
テンプレートクラスを定義しているヘッダファイルの
行番号が表示されるから、いったいどこの実体化で
エラーになったのか分かりづらいっすね。


930 名前:デフォルトの名無しさん :2006/02/14(火) 12:13:57
struct X {
template <class T> f(int i, int j) {}
template <class T> operator()(int i, int j) {}
};

X x;

関数テンプレートで、引数からテンプレートパラメータが決まらない場合は
x.f<double>(1, 2);
のように明示することができます。
operator()の場合にはどのように呼び出せばよいですか。
x<double>(1, 2); // NG, undefined operator()
x.operator()<double>(1, 2); // OK, でもなんか見た目が変


931 名前:デフォルトの名無しさん :2006/02/14(火) 12:17:58
>>922
Borland なんかもうちっとマシなメッセージ吐くぞ
ときどき日本語おかしかったりするけど

932 名前:デフォルトの名無しさん :2006/02/14(火) 12:22:38
>>930
見た目変ですけれど,それが正しい構文ですしそれ以外にないと思います.
呼び出し側でキャストをかけるとか,
type2type な形で型の情報を引数として引き渡せるようにするとか,
いくつか改善策はあるとは思いますけれど,決定的なものはないかと.

933 名前:デフォルトの名無しさん :2006/02/14(火) 14:02:46
>>930
templateメソッドは引数の型で
一意に定まった方が使いやすい

934 名前:デフォルトの名無しさん :2006/02/14(火) 14:27:09
int *ip;
void *vp;
〜略〜
*ip++ = 10;
*(int*)vp++ = 10;
とすると、「error C2036: 'void *' : サイズが不明です。」というエラーがでます

結局のところ、
*(int*)vp = 10; vp = (int*)vp + 1;
をやりたい訳なんですが、

*ip++ = 10;
みたいな書き方、voidポインタでは出来ませんか?

935 名前:デフォルトの名無しさん :2006/02/14(火) 14:31:58
演算子の優先順位:
* より 前置++/後置++ の方が後回し

936 名前:デフォルトの名無しさん :2006/02/14(火) 14:34:55
>>935
と思ったけど何か違うみたい
スルー推奨

937 名前:デフォルトの名無しさん :2006/02/14(火) 14:49:17
>>934
*((int*)vp)++
だとうまくいくみたい。
キャストと++は同順位で右左だから、という説明でいいのかな。

938 名前:デフォルトの名無しさん :2006/02/14(火) 14:52:58
>>934
無名の共用体を使っては?

939 名前:デフォルトの名無しさん :2006/02/14(火) 14:53:51
>>937
非標準

940 名前:デフォルトの名無しさん :2006/02/14(火) 15:36:40
>>937
それVC++2003toolkitだとC2105だった。

941 名前:937 :2006/02/14(火) 16:41:41
ほんとだ。g++でも怒られた。bccと俺が甘いってことか。
すまんかった>934

942 名前:デフォルトの名無しさん :2006/02/14(火) 17:27:47
>キャストと++は同順位で右左だから、という説明でいいのかな。

よくない

規格票でも K&R でもいいが、
単項と後置の優先順位を確認してみては?

943 名前:934 :2006/02/14(火) 17:36:22
いろいろありがとうございました。
そういう事は出来ない感じと、受け止めましたので

*(int*)vp = 10; vp = (int*)vp + 1;
で行きますです。m(_ _)m


944 名前:デフォルトの名無しさん :2006/02/14(火) 17:42:02
>>943
union {
int* ip;
void* vp;
};
cout << vp;
ip++;
cout << vp;
は試したか?


945 名前:デフォルトの名無しさん :2006/02/14(火) 18:06:11
>>934
組み込み型のインクリメント演算子などのオペランドには左辺値が必要。
だからこうして参照を使えばとりあえずできる。
typedef int* pint;
*reinterpret_cast<pint&>(vp)++ = 10;

ちなみにtypedefを使わないでやるとするとreinterpret_cast<int&*>(vp)になる。

946 名前:934 :2006/02/14(火) 18:10:29
>>944
無名共用体を使う場合、どうやるのかイメージが湧きませんでした。
なるほど、そういう意味だったのですね!
vpが引数で与えられてるので、共用体でやるとしたら、無名じゃない共用体で、という事でしょうか。
それでも、共用体の方が可読性いいかもしれませんね。
ありがとうございました。


947 名前:934 :2006/02/14(火) 18:13:34
>>945
reinterpret_cast<int&*>(vp)
すみません・・・これ、なんという手法ですか?
勉強不足でお恥ずかしいのですが、よく知らないのです。
ググってきますので、ヒント下さいますでしょうか?

948 名前:デフォルトの名無しさん :2006/02/14(火) 18:15:32
C++さんです

949 名前:デフォルトの名無しさん :2006/02/14(火) 18:18:28
>>948
ワラタ

950 名前:デフォルトの名無しさん :2006/02/14(火) 18:28:27
>>945
int&* って何だ? ( int*& なら知ってるが)

951 名前:945 :2006/02/14(火) 19:03:00
>>950
しまった_| ̄|○

952 名前:デフォルトの名無しさん :2006/02/14(火) 22:39:54
>>944,945
実装依存なのはわかって言ってるんだろうな?

953 名前:デフォルトの名無しさん :2006/02/14(火) 23:10:53
>>952
void* が必要な場面で実装非依存とは、例えば?

954 名前:デフォルトの名無しさん :2006/02/14(火) 23:15:34
>>953
>>952じゃないけど、たとえば

void somefunc(void (*fp)(void *, int), void *dat)
{
  fp(dat, 4);
}

void f(void *pi, int n)
{
  std::cout << n + static_cast<int *>(pi)[3];
}

void g()
{
  int a[10];
  somefunc(f, a);
}

955 名前:デフォルトの名無しさん :2006/02/14(火) 23:26:15
>>953 pthread_create() とか。

956 名前:デフォルトの名無しさん :2006/02/14(火) 23:26:45
>>954
意図が見えない
もともと int* だったのが明らかでキャストし直していると言うならそもそも void* にする必要性はないし
例えばと言ったのはコード片じゃなく応用分野だ

int* pi = 0;
void* pv = pi;

こんなのをわざわざ尋ねたりはしない

957 名前:デフォルトの名無しさん :2006/02/14(火) 23:35:55
バイトストリームを生成する関数とか

958 名前:デフォルトの名無しさん :2006/02/14(火) 23:40:02
>>956
somefuncはライブラリ関数で、コールバックと、それに渡す補助データとしてvoid *の値を取る、と考えてくれ。
somefuncのユーザは、コールバックにint *を渡したいが、型を合わせるためにいったんvoid *にキャストして渡し、
それをコールバックで受けてint *に戻して使う。

959 名前:958 :2006/02/14(火) 23:40:54
こんな例出さなくてもqsortで十分だった…

960 名前:デフォルトの名無しさん :2006/02/14(火) 23:41:04
>>957
エンディアンはどーすんべ?

961 名前:デフォルトの名無しさん :2006/02/14(火) 23:42:01
次スレはどーすんべ?

962 名前:デフォルトの名無しさん :2006/02/14(火) 23:43:22
>>959
qsort がしていることと >>944-945 は何が違う?

963 名前:デフォルトの名無しさん :2006/02/14(火) 23:43:43
>>960
関係無い話を持ち出すな。

964 名前:デフォルトの名無しさん :2006/02/14(火) 23:45:00
>>959
<algorithm> ではなく extern "C" 関数を使う場面とその理由は?

965 名前:デフォルトの名無しさん :2006/02/14(火) 23:45:08
ほんとに初歩的な質問。
初歩的過ぎてなんて調べたら良いのか分からないのでここで。

a[1][1],a1][2],a[2][1]a[2][2] = 1;
ってやるとエラー吐くんですけど、括弧とかどこに付けたら良いですかね(´・ω・`)

966 名前:958 :2006/02/14(火) 23:45:11
>>962
何を言ってるのかよく分からん。
俺は>>953にレスしただけで、直接>>944-945にコメントしたわけじゃない。

967 名前:デフォルトの名無しさん :2006/02/14(火) 23:45:18
>>963
実装依存かどうかが論点のはず

968 名前:デフォルトの名無しさん :2006/02/14(火) 23:46:07
>>962
944,945 は void* と int* の表現形式に互換性があることに依存している。
例えば void* が 64bit で int* が 32bit だったら不味いことになる。

969 名前:958 :2006/02/14(火) 23:46:45
>>964
説明のためだから。

>>965
何がしたい?四箇所に一を代入したいなら、
a[1][1] = a[1][2] = a[2][1] = a[2][2] = 1;

970 名前:965 :2006/02/14(火) 23:47:56
>>969
どうもです。今までわざわざ四回書いてたので同時に代入する方法知りたいと思ったわけです
ありがとうございました

971 名前:デフォルトの名無しさん :2006/02/14(火) 23:56:24
>>967 「何が」実装依存であるのか考えろ。

972 名前:デフォルトの名無しさん :2006/02/14(火) 23:57:15
>>968
そんなら qsort も実装依存ですな

>>969
じゃ、>>956 へのレスとして何の説明がしたかったんだ??

973 名前:デフォルトの名無しさん :2006/02/15(水) 00:00:40
>>971
「何が」の違いは今あなたが持ち出したことだ

974 名前:958 :2006/02/15(水) 00:03:31
>>972
>そんなら qsort も実装依存ですな
int *とvoid *の表現形式が違ったとしても、
int *からvoid *に変換し、それをさらにint *に戻したとき、
これが最初の値と変わらないことは規格で保障されている。
だから、qsortは実装依存ではない。

>じゃ、>>956 へのレスとして何の説明がしたかったんだ??
実装に依存せずにvoid *を使うことができる、ということ。

975 名前:デフォルトの名無しさん :2006/02/15(水) 00:07:25
int compare(int* a, int* b) { ... }

を渡すして動作するかどうかは処理系依存。


int compare(void* va, void* vb) {
 int* a = (int*)va;
 int* b = (int*)vb;
 ...
}

なら良い!

976 名前:デフォルトの名無しさん :2006/02/15(水) 00:07:45
お前らの話はよーーーく分かった

だから、次スレよろ

977 名前:デフォルトの名無しさん :2006/02/15(水) 00:10:12
自分が間違ってるかもしれないという可能性を認められないガキが紛れ込んだな。
さっさと次スレに移るか。

978 名前:デフォルトの名無しさん :2006/02/15(水) 00:16:31
>>968
任意のデータ型のポインタをvoid*に代入し
再度元のデータ型に戻すと、元のポインタが確実に復元できることは規格で保証されている。
・・・Cでは。

C++でも、Cスタイル/static/reinterpretなキャストなら
(つーか、void*にdynamic_castとか出来ないし)
保証されていそうな気がするが。

979 名前:v(^・^)v :2006/02/15(水) 00:17:12
今テンプレ整理してるからもうちょっと待ってて。

980 名前:デフォルトの名無しさん :2006/02/15(水) 00:17:34
>>974
>>962

981 名前:デフォルトの名無しさん :2006/02/15(水) 00:18:35
正直正規表現わかりにクス
while($s =~ /^(.).*/g)
とか

$a =~ s/^(.)//;
とか
意味わからなす・・
perl
これをC++でよろしく。

982 名前:デフォルトの名無しさん :2006/02/15(水) 00:20:31
>>980
>>968

983 名前:デフォルトの名無しさん :2006/02/15(水) 00:22:14
>>981
状態遷移表くらい書けるようになっとけよ


984 名前:デフォルトの名無しさん :2006/02/15(水) 00:22:20
>>982
>>962

985 名前:デフォルトの名無しさん :2006/02/15(水) 00:23:19
>>978
>>968はそんなこと分かってると思うんだが。
>>968が問題にしてるのは、正規の変換を経ずに
unionや参照のキャストを使ってvoid *をint *として扱った場合の話だろ。

986 名前:デフォルトの名無しさん :2006/02/15(水) 00:23:54
>>981
上は$sという変数に、^(.).*でパターンマッチした結果を条件式にしてる
このパターンマッチだと、行がある限りだな

2個目は行先頭の1文字を消してる

多分これであってると思うが、違ってたらシラネ

987 名前:デフォルトの名無しさん :2006/02/15(水) 00:24:27
>>983
特に
$s =~ /^(.).*/g
とか

$a =~ s/^(.)//;
とか

いったい~から始まる奴が何して代入してるんだって感じだどもさ
ってか相談してもいいだろさー

988 名前:デフォルトの名無しさん :2006/02/15(水) 00:24:48
>>985
reinterpret_cast を何だと思っているわけ?

989 名前:デフォルトの名無しさん :2006/02/15(水) 00:25:29
>>986
そのちょっと最初は興味あったけど
やっぱ興味ないわーーー
ってところに女はほれたんだな・・そうなんだろ?

990 名前:デフォルトの名無しさん :2006/02/15(水) 00:27:01
988の続き

>>985
あなたが何を主張しているのかはわかった

991 名前:デフォルトの名無しさん :2006/02/15(水) 00:27:09
>>988
わけわからん。もうちょっとくわしく。

992 名前:デフォルトの名無しさん :2006/02/15(水) 00:29:06
reinterpret_castって一番好き勝手出来る奴だろ?
あれってC形式のキャストと変わらなくね

993 名前:デフォルトの名無しさん :2006/02/15(水) 00:29:28
>>991
static_cast ではなく reinterpret_cast を使う場合の理由と
無名の共用体を使う場合の理由はどう違うんだ?

994 名前:デフォルトの名無しさん :2006/02/15(水) 00:32:02
もうねstl作れ
さもなきゃdefineしろ
それもだめなら考えうる全ての型を実装しろ

ってこと?
次スレまだー?

995 名前:デフォルトの名無しさん :2006/02/15(水) 00:33:27
>>986
参考のサイトを参照しながら
$a =~ s/^(.)//;
はわかった。
Cでの書き方もおそらくわかると思うけど
$s =~ /^(.).*/g
もっと詳しく教えてくれ。
~ /^(.).これで一文字目と二文字目なのかな??

よくわからんからこれをCでどう書くのか

暇だったら世路。

996 名前:デフォルトの名無しさん :2006/02/15(水) 00:34:09
>>993
union {int *upi; void *upv} u;

int *pi;
void *pv;

pi = static_cast<int *>(pv); /* ok */
pi = reinterpret_cast<int *>(pv); /* ok; 上と同じ */
pi = reinterpret_cast<int *&>(pv); /* ng */
u.upv = pv;
pi = u.upi /* ng; 上と同じ */

997 名前:996 :2006/02/15(水) 00:35:38
ごめん。
>pi = reinterpret_cast<int *>(pv); /* ok; 上と同じ */
これは無しで。

998 名前:デフォルトの名無しさん :2006/02/15(水) 00:37:04
>>995
解釈は間違ってはないけど微妙に違う
^(.)これが1文字目なのはいいけど、次のは
.じゃなく.*で二文字目以降(無くても可能)って意味

それと正規表現Cで書くってどういうことだ?
まさか自動羊肉実装するのか?
面倒だから鬼車使っとけ

999 名前:デフォルトの名無しさん :2006/02/15(水) 00:39:34
>>998
ふむなるほど。
いやなんかperlの奴を移植しようかと考えてるんだが
あわよくば
書いてくれるかなって思ったわけ。そこだけ





次スレナインか?

1000 名前:デフォルトの名無しさん :2006/02/15(水) 00:40:45
ここでVIPPERが華麗に1000げと


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