1 名前:デフォルトの名無しさん [2009/09/17(木) 22:22:59 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.67【環境依存OK】 pc12.2ch.net/test/read.cgi/tech/1247937958/l50 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm ◆ソースのインデントについて 半角やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのが最も良いですが、 直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
567 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 01:01:18 ] デフォルトコンストラクタをprivateにして必ず565みたいにさせるとか。
568 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 01:31:28 ] >>565 Hoge* c; if (略) c = new Hoge(0); else c = new Hoge(1); scoped_ptr<Hoge> cptr(c); Honya(cptr.get()); こんな感じにするかなあ。
569 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 02:24:28 ] 変数宣言と初期化を別にする限り防げないように思う つまり >>567 のいうとおりデフォルトコンストラクタをprivateにして >>566 のいうような宣言と同時に初期化を必須にするしかないと思う ただ>>566 はコンパイラが馬鹿だとコピーコンストラクタが使用されそうだし 俺なら Hoge C(式 ? 0 : 1); って書きそう
570 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 02:29:22 ] >>568 Vectorみたいな使い方と考えると 比較的プリミティブに近くて多く使われそうだし 毎回ヒープにアクセスさせるのは大仰な上に遅くなりそうじゃね? マルチスレッドだったりしたら毎回排他制御が…
571 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 09:30:22 ] 汎用的に配列の要素数を返却するtemplate をこのように書いてみたのですが 期待している動作になりません、間違いを指摘してもらえませんか。 #include <iostream> using namespace std; template<class X> int ArraySize(X* object) { return (sizeof(object) / sizeof(X)); } int main() { int array[] = {1, 2, 9, 3, 4, 5 }; cout << ArraySize(array) << endl; //配列array の要素数を取得したいのですが・・・ }
572 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 09:36:35 ] >>566-570 真剣な検討ありがとうございます。 ポインタにするのは、ちょっと速度的にきつそうかなと思います。 570さんのおっしゃるとおり、プリミティブに近いものを想定していますので。 デフォルトコンストラクタをprivateにすると、 Hoge c; とはできませんね。 (その方法で初期化を強要しつつ)初期化で条件式を使うのは確かによさそうですが、条件分岐が3つ以上の場合に無理がありそうですね。 書けなくはないですが・・・。 else Hoge(1); のところで、「生成したクラスが使われていないようですが?」という警告があれば一番良いのですけどね…。 それを避けるためには、使ってないローカル変数への警告を抑える (void)a; と同じように、 (void)Hoge(1); と書く。とか…。
573 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 09:38:34 ] >>571 int ArraySize(X* object) ここで、単なるポインタにしてしまった以上 sizeof(object)では大きさがとれませんよ。 sizeof(配列)で大きさが正しくとれるのは、それが配列宣言されており、コンパイラがサイズを知っているからです。 ポインタと配列は似て非なるもの
574 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 09:43:32 ] template <class T, size_t N> size_t GetArraySize(T (&)[N]) { return N; } int array[] = {・・・}; cout << GetArraySize(array);
575 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 10:06:36 ] >>571 です >>573 >>574 ありがとうございます。 >ポインタと配列は似て非なるもの そうですね、短絡的でした。 >>574 の T (&)[N] この書き方ですが、配列の宣言が、foo[N]このような書き方がしてある配列を参照しているという、ことなのでしょうか? それから、 return N; どうしてこれで要素数が取得できてしまうのでしょうか、不思議です?
576 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 10:09:41 ] >>575 です 質問がまわりくどいですね T (&)[N] と T &[N] この違いを教えて頂けないでしょうか。
577 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 10:10:13 ] foo[N]のNこそ、要素数でしょ?w
578 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 10:13:42 ] >>577 あ、そうか! わかりましたw T (&)[N] と T &[N] しかし、この違いがまだ理解できません・・・・orz
579 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 10:49:02 ] 構文解析のルールの詳しいことはよく理解してないけど T [N] => Tの配列 T &[N] => Tへの参照の配列 T (&)[N] => T[N]への参照 となってる模様。ちなみに参照の配列はコンパイルできない このへんは仮引数名の省略とか括弧の意味とかいろいろあって直感的には理解しにくいわ
580 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 11:35:26 ] 配列へのポインタと一緒だけど、演算子の優先順位が & より [ ] の方が高いから T &a[N] は先に [ ] と結びついて a[N] つまり a は要素 N 個の配列 その個々の要素の型が T& T (&a)[N] の場合は括弧で明示してあるために先に & と結びついて &a つまり a は参照 その参照先が要素 N 個の配列 関数の引数名は省略できるので、その場合 T a[N] は T [N] に、T (&a)[N] は T (&)[N] になる というように俺は理解してる
581 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 11:41:45 ] >>579 >>580 ありがとうございます、大変よく分かりました。
582 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 20:42:52 ] stringstreamってどんな感じで実装されてるんでしょうかね? stringみたいに内部で独自のメモリ管理方法を取ってるのか、vectorのようにベタな連続メモリなのか、それともまったく違うのか・・・
583 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 21:21:55 ] 宜しくお願いします。このコードをコンパイルしますと error C2664: 'Point<T>::set' : 1 番目の引数を 'int' から 'int &' に変換できません。 参照を外すと、静的でないメンバ関数の呼び出しが正しくありません。となります。 どのように対処したらいいのでしょうか? #include <iostream> using namespace std; template<class T> class Point { template<class> friend class Point; private: T x_; // x座標 T y_; // y座標 public: Point(); template <class U> Point(const Point<U>& r) : x_(r.x_), y_(r.y_){} Point(T x = T(), T y =T()) : x_(x), y_(y) {} void set(T& x, T& y); }; template<class T> void set(T& x, T& y) { x_ = x; y_ = y; } int main() { Point<int> ip(12, 34); Point<long> lp(ip); Point<int>::set(12, 34); // ここで当該エラー return 0; }
584 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 21:26:49 ] >>583 です 補足というか、行数の関係で書けませんでした、環境はVS2005 です。
585 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 21:31:47 ] ごめんなさい、スレを汚してしまいました 解決しましたというか・・・・tohoho情けない × Point<int>::set(12, 34); ○ Point<int> set(12, 34);
586 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 22:04:28 ] いいんだよ^^
587 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 22:14:26 ] >583 void set(const T& x, const T& y) にする。
588 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 06:51:57 ] >>585 set という変数を用意したいのか? メンバ関数のsetを呼び出したいのかはっきりしろ。
589 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 13:34:28 ] >>583 もしsetという名前のメンバ関数を呼び出したくて、しかもインスタンス 無しで呼び出したいのなら、そのメンバ関数はstaticでなければならない
590 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 13:37:55 ] でもインスタンスがないと当然 this が無いから、x_とy_に代入しようと するとエラーになるな 質問者はその当たりをはっきり質問するように
591 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 19:02:19 ] >>583 です 皆さん、フォローありがとうございます。今回のset は変数としての振る舞いを期待していました。
592 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 01:01:09 ] strstrのように、あるメモリ領域から特定のバイト列を検索する標準関数は あるでしょうか。VC++2008独自関数でもかまいません。 strchrに対するmemchrのようにmemmem?なんてのがあればいいんですけど。
593 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 02:26:50 ] 標準関数は無いと思うけど もし何度もその探索を実行するなら (\0終端の文字列と違い、長さがわかっているのだから) BM法かなんかでの探索を自前で実装するのが良いんじゃないかね。 まあ1度しか使わないのなら、そんなことせずに 先頭文字を探してそこから比較する、いわゆる力任せ法でも充分だろうけどね。
594 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 02:34:09 ] std::search() とか?
595 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 10:05:53 ] traitsって何者なんですか?
596 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 10:11:55 ] 曲者
597 名前:デフォルトの名無しさん [2009/10/12(月) 11:42:45 ] #include <iostream> #include <string> using namespace std; int main(void) { string s("表示"); int i = s.find('\\'); cout << i << endl; return 0; } これを実行すると、「1」と表示されますが、-1にするには どうすればよいでしょうか?
598 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 11:56:51 ] shift_jisを使わない
599 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 11:58:24 ] >>597 string s("ひょうじ");
600 名前:597 [2009/10/12(月) 11:59:06 ] 自己解決しました。できないようです。 ml.tietew.jp/cppll/cppll_novice/thread_articles/78
601 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 12:45:42 ] ソースをSJIS以外にしてコンパイル
602 名前:デフォルトの名無しさん [2009/10/12(月) 13:30:11 ] すみません。 趣味で、VC++のMFCで、いろいろ作っているんですが、もう5年くらいやっていて だいぶというかかなり本格的なものも作れるようになりました。 自分は文系なんでよく知らないのですが、プログラマに就職しようと思えばできるんでしょうか? 今の職場は単調作業なので、ちょっと刺激がほしいです。よかったら、転職しようとおもうんですが・・・どうでしょうか?
603 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 13:35:23 ] プログラマ板で聞いてください
604 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 14:32:08 ] >>602 貴方の人生こんな初心者スレで聞いて棒に振ってもいいんですか??
605 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 16:44:51 ] 関数ポインタの配列を使った関数呼び出しはc++ではどうやって実現させたらいいですか
606 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 16:47:56 ] >>605 Cと何かちがったっけ??
607 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 16:48:10 ] 普通の関数はCと同じ。 クラスのメンバ関数の関数ポインタは手を出さないほうが身のため。
608 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 17:14:10 ] 初心者なので詳しく答えられる方だけ回答お願いします
609 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 17:15:19 ] 初心者なのできちんと説明できない人は口を出さないでください イライラします
610 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 17:19:24 ] 初心者ならどんな回答も学ぶべきことがあるはずなのでありがたく思うべきです
611 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 17:20:50 ] 初心者なのぐぐれません。
612 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 17:21:32 ] 初心者なのでよみとれません。
613 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 17:23:43 ] 初心者なので日本語わかりません。
614 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 17:53:40 ] それではboost.functionの説明を始めようか
615 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 19:10:08 ] がんばってコード書いたのによくよく調べるとSTLとかBoostに同じしかも完全に上位のコードとかがあると泣けるんだがしかし
616 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 19:17:11 ] 頑張る前に調べような。そういうのが使える環境ならなおさらだ。
617 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 19:45:28 ] そりゃ一回は調べるんだけど見逃してたりするんでさ
618 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 19:49:27 ] コードを書いたことが明日への礎になる。
619 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 19:57:45 ] 中で何やってるのか全く理解できないようなコードを使ってトラブルと どうにもならなくなるしな。
620 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 20:13:41 ] >>615 それはいい勉強をしたと思え。 ただライブラリを使ってるだけよりいい経験を積んだんだ。
621 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 20:27:56 ] ・boostを眺める ・欲しい機能を見つける ・使ってみる ・boostを参照せずに同じ様な機能の縮小版を作ってみる ・挫折する ・boostはどうやってるんだろうと思いながらソースや解説をみて学ぶ 俺は大体こんなかんじで勉強になった functionとか
622 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 22:23:13 ] 連結リストを実装するのはCでよくある勉強だし、ポインタ完全制覇とか読むと実装したくなるしな。 それをSTLで既にあるじゃんとか言って馬鹿にする奴はいないだろ。
623 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 22:25:27 ] そりゃまぁ勉強目的でやるんならね
624 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 22:32:21 ] 時には馬鹿にならないとやる気にならないこともある。 Boostにあるからいいかではなかなか重い腰が上がらない。
625 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 23:37:36 ] namespaceでもprivateとかpublic使えればいいのに
626 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 23:50:49 ] anonymous namespaceが近いんじゃない?
627 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 23:57:13 ] >>625 staticメンバ関数で、それ専用のクラスを作るのはどうだろう。 気分的にちょっとアレだけど
628 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 00:05:07 ] 無名名前空間とはちょっとちがうかなぁ namespace hoge { private: template <int n> struct is_even { static const bool value = n % 2 == 0; }; // インクルードしても外から使えないようにしたい public: template <int n> class fuga { static const int value = is_even<n>::value ? n : 0; 〜〜; }; } みたいな感じで使いたい 仕方ないからnamespaceをclassかstructで置き換えてそれっぽいことはできてるんだけど 今度はusing namespaceが使えない・・・
629 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 00:30:43 ] ・規約でBoostを禁止しているプロジェクトにげんなりする。
630 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 01:46:06 ] >>628 namespaceだと名前空間を汚す気があれば突破されてしまうが。
631 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 04:51:45 ] 静的関数のテンプレート関数版みたいなもんか。 クラステンプレートfugaの静的メンバ関数にはしたくなさそうだな。