1 名前:デフォルトの名無しさん [2010/03/05(金) 16:51:13 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.71【環境依存OK】 pc12.2ch.net/test/read.cgi/tech/1264774545/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm codepad.org/ (コンパイルもできるし出力結果も得られるのでお勧め) ◆ソースのインデントについて 半角空白やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのも手ですが直接貼る場合は、 全角空白か に置換すると見栄えだけはよくなります。
944 名前:デフォルトの名無しさん mailto:sage [2010/05/17(月) 15:07:03 ] >>917 その上で、>>902 なんだとおもっていた
945 名前:902 mailto:sage [2010/05/17(月) 17:33:16 ] >>944 GnuPG(mingw32) は、主に鍵の処理中の話だけど (Win32API)ReadConsole を呼び出して、直接キーボード叩いた入力しか受け付けない: パイプによるリダイレクトはエラー そういう仕様の部分があったので、かなり例外の部類ではないかとは思う。 ※ 昔の話(v1.0.4 ぐらい)で、今はどーなってるか追っていない
946 名前:デフォルトの名無しさん mailto:sage [2010/05/17(月) 21:08:41 ] >>902 でパイプというキーワードが出てるのに、もったいないなってことか
947 名前:898 mailto:sage [2010/05/17(月) 22:49:17 ] レスできてませんでしたが、パイプもキーワードとして拾って、試行錯誤の末 (実は実行させるのにリターン\r\nがいることに気づかず丸一日かかりましたw)完成させた後、例のページを見つけました \nじゃダメなのねというより、これこそ質問すればよかった >>945 今後、勉強を進めていくうえで、つまりそうな所を教えていただきありがとうございます
948 名前:デフォルトの名無しさん mailto:sage [2010/05/17(月) 23:23:56 ] よくがんばっているね。えらいとおもう。
949 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 00:12:54 ] おれもそうおもう
950 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 00:22:38 ] >>927 >>930 アトミックに扱いたければ、atomic_loadやatomic_compare_exchangeなどの関数が 別途用意されるのでそれを使うことになる。
951 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 16:32:33 ] 宣言と同時に定義するfriend関数 class X { friend void Y(X) { } }; って決まった名称あります? それとこれの使いどころが謎なんですが、これが最善解になるようなパターンはありますか?
952 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 16:41:33 ] >>951 Barton-Nackman trick フレンド関数YはADLによってしか呼び出せない(オーバーロードが前提) クラスXがクラステンプレートの場合、Xのテンプレート引数に依存する 非テンプレート関数(通常のオーバーロード規則に従う)を定義できる クラステンプレートの演算子定義等に使われる 実例はboostのoperatorsライブラリ等
953 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 16:44:52 ] 訂正、オーバーロードは必須じゃないな
954 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 20:10:10 ] どうもです operatorsみたいな特殊なケースぐらいしかないって感じですかね
955 名前:デフォルトの名無しさん mailto:sage [2010/05/18(火) 21:31:18 ] 演算子をオーバーロードする時に使うくらいか。 別にパターンじゃないが。
956 名前:デフォルトの名無しさん [2010/05/20(木) 09:32:17 ] 一秒間に60呼ばれるような処理で毎回変数を作り直すのとグローバルに1つ作ってそれを呼び出すとでは処理の速度って変わらないんですか?
957 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 09:35:34 ] POTな変数ならゴミだろうけど、 コンストラクタ中で恐ろしく手間かかってるようなクラスのオブジェクト生成なら 影響を与えるかもしれん レッツ実測
958 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 09:36:37 ] POT?
959 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 09:41:31 ] どうtypoしたら POTになるんだorz PODね
960 名前:デフォルトの名無しさん [2010/05/20(木) 09:48:09 ] ありがとうございました 場合によるがグローバルにしとけば確実に速いということですね?
961 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 09:53:21 ] >>960 誰もそんなこと言ってねーし。 「場合による」と「確実に」が矛盾してるし。 おまえアホだろ。
962 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 09:53:53 ] グローバルって限定してるところが怖いんだが・・・ せめてstaticとかさぁ・・・・
963 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 10:00:33 ] A.h 、A.cpp 、にクラスcAがあって 今 B.cppでA.hをインクルードして、cA ほげB;と言う感じで宣言していろいろ使ってるのですが(B.cpp中でnewはしてない) C.cppでもほげB.○に入ってる値を使いたくなったのですがどうすれば良いのでしょうか?
964 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 10:02:31 ] >>963 B.h でも作ればいいじゃない。
965 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 10:11:26 ] >>964 ありがとうございます。初心者すぎてそこからがわかりません C.cppでB.hはインクルードしてあるのですが C.hでextern cA ほげB;としたり単にcA ほげB;としたりclass cA ほげB;等としましたがエラーがでました。どうすれば良いのでしょうか。
966 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 10:15:12 ] >>965 エラーメッセージを読んで問題を解決すると良いよ。
967 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 10:16:10 ] >>965 B.hででextern cA ほげB;としたり単にcA ほげB;〜の間違いです。すみません。
968 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 10:16:24 ] もうちょっと整理して話してくれ 何をどうしたいのかをまず明確に汁
969 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 10:16:59 ] ソースとエラーメッセージを貼ればいいのに。
970 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 10:17:51 ] >>966 せめてB.hの宣言はどれが正解なのか教えてください。
971 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 10:22:16 ] A.h class cA { }; ---- B.cpp cA hogeB; ..... hogeB を使いまわしている ---- C.cpp ..... hogeB が使いたい こういうことなら B.h #include "A.h" extern cA hogeB; ---- C.cpp #include "B.h"
972 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 10:35:08 ] >>971 ありがとうございます。そういうことです。ちなみにメインはBです B.hでextern cA hogeB;したのですが B.hで#include "A.h"をしたらエラーが200個ほど出ました B.cppで#include "A.h"をすると3つでした。これは認識できない型cAがB.cppで使われている。ほげBが未定義のクラスcAでB.cppで使われているというような物でした。 ヘッダはB.hでなければならいのでしょうか?
973 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 10:41:22 ] B.cppで#include "A.h" C.cppで#include "A.h"と#include "B.h"をしたらエラーが消えました。ありがとうございました extern class 〜という方法は知りませんでした。
974 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 11:07:56 ] >>973 とりあえず基本を理解しろ。 www.google.co.jp/search?q=%E5%88%86%E5%89%B2%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB
975 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 11:11:10 ] >>973 なんでエラーになってたのか理解できてるのか?
976 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 13:36:03 ] >>956 質問内容からすると、グローバルを使わない方は関数に値を渡すことになるだろうから、その分遅くなるよ ただし、1秒間に60回程度の処理を想定しているなら、(数字に表れないぐらいの)誤差だろうね 毎回変数を作り直すってのがわからんけど、標準C/C++でのローカル変数の扱いはスタックに 2byteなり4byteなりの領域を確保するか、しないかの問題だから速度低下にはならないと思うよ
977 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 13:39:37 ] >>976 グローバルを関数引数にして遅くなるとも限らない。 結局は、実測しないと何も言えない。
978 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 14:33:04 ] >>977 もしかして喧嘩売ってる?
979 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 15:28:38 ] 具体的なコードを出さないと答えようがないだろう。 staticやグローバル変数を使うと最適化が甘くなるリスクはあるな。
980 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 15:43:08 ] んなもん作ってから考えたらいいんじゃね ってのはダメですか
981 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 16:20:56 ] 只今C++の勉強中で クラスの継承と一緒にメンバ関数のオーバーライドが出来るとあるのですが、 これを使う意味ってあるのでしょうか? class ctest{ int m; char *p; public: virtual int put(char *); //pに文字列を入れる関数 } class stestSub : public ctest{ public: int put(char *); //pに文字列を入れる関数(全て小文字に変換) } ctest s1; s1.put("ABced"); stestSub s2; s2.put("zxcVB"); 以上のように定義してしまうと、s2からメインクラスのputを使う事が出来なくなるし、 別名でサブクラスに新たにput2()などで定義したほうがいいのではないでようか? 同じ名前で別の機能を持たせる意味が分からないのですが、どのような時に使用 するものなのでしょうか? 継承したプログラマがこの関数名はこの機能を持たせたいとか、そういったレベル で同じ名前にしているのか?と思っているのですが。
982 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 16:22:35 ] s2.ctest::put()
983 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 17:06:37 ] >>981 ポリモーフィズムでググれ
984 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 17:56:48 ] クラス名をctestとしている内はこの問題は理解しにくいよね クラス名で目的が決まってるからこそ、関数名が同じであることに意味がでてくる
985 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 19:58:30 ] いい言葉が出てこなかったのですが、その「クラスで目的が決まっている」って 部分が引っ掛かってた所でした。 このクラス名(目的)でこの関数はこの機能を持たせたいって意味で、名前は 同じだけど機能が違う物を定義してるってことでしょうか。 あとメインクラスの関数も呼ぶことができたのですね。 ありがとうございました。
986 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 20:21:30 ] クラス 基底クラス 仮想関数 結果 犬 鳴くことができる動物 鳴く わん 猫 鳴くことができる動物 鳴く にゃー 人 鳴くことができる動物 鳴く あんあん たとえばこれらのクラスに対して三回鳴けという関数を作るとして 犬猫人それぞれにまったく同じコードを3回も書くのってだるいじゃん? ところがC++はいい子だから鳴くことができる動物に対して三回鳴けって関数を作れば犬猫人どれでもそのコードが使えちゃうわけ やったね!三倍コードが短くなったよ!
987 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 20:24:13 ] もっと実用的でありながらよく分かる例を出すべき
988 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 20:24:44 ] class Human : Cat
989 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 20:26:18 ] RPGのキャラとかいい例じゃないか
990 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 20:29:09 ] >>985 例えばクラス・GameLogicなんてのがあったとして、こいつはゲームの処理で主にプレイヤー以外の なんらかの物体を移動など処理するクラスとした時、例えばステージや自分からみて敵となるプレイヤーキャラの 情報はどのタイプの敵でも必要な物だから同じように取得するが、それぞれの動きの内容は、それぞれ個別に定義したい。 しかし個別ではあるが、いずれも「攻撃しろ」と言えば攻撃して欲しい。 そんなかんじ
991 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 20:31:07 ] 実際ジョブごとにクラス作ってんだろうか
992 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 20:56:53 ] class ToDO { virtual void doit() { printf("やったつもり"); }; class Ore1 : public ToDO { virtual void doit() { printf("明日になればやる"); }; class Ore2 : public ToDO { virtual void doit() { printf("やってるつもりだが何か?"); }; class Ore3 : public ToDO { virtual void doit() { printf("/(^o^)\"); }; Ore1 hoge; Ore2 huga; Ore3 hage; ToDO* job_list[] = { &hoge, &hoge, &hoge, &hoge, &hage }; .... list[i]->doit();
993 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 21:15:10 ] >>985 機能が違うなら別の名前にするかな 一度日常にあるものでカテゴリー分けしてみるといいかもしれないね 親になるクラスを設計するときは、子になるクラスにおいて共通する機能を洗い出して実装するのだけど >>986 の例を借りれば 親:生物クラス ←生物とは鳴くものだ//関数の雛型だけ用意でもよい 子:犬クラス 一般的に「ワンワン」と鳴く 孫1:ヨークシャテリアクラス「バウバウ」と鳴く 孫2:柴犬クラス「アオーン」と鳴く 今回の例でいえば、子と孫の関係になるが ヨークシャテリア(クラス)は鳴く(関数)→「バウバウ」 ヨークシャテリア(クラス)は(子:犬として)鳴く関数)→「ワンワン」 疑問に思っているように実装すると ヨークシャテリア(クラス)は鳴く(関数)→「ワンワン」 ヨークシャテリア(クラス)はヨークシャテリアは鳴く(関数)→「バウバウ」
994 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 22:16:42 ] 抽象化された命令をだして、実際の動作は各オブジェクトに任せる つまり上司と下っ端の関係みたいなもんだよ 上司は何も知らなくてもやりたいことだけを言って 下っ端が必死こいて作業をこなしていく
995 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 22:55:25 ] 例えばウィンドウを描くプログラムがあったとして、そのウィンドウに いろいろな部品を簡単に追加できると便利だろう。 そこで、こんなクラスを作り、 class Item { public: Item(); virtual ~Item(); virtual void Draw(); ... }; class ListBox : public Window { public: virtual void Draw(){ リストボックスを描く } }; class Button : public Window { public: virtual void Draw(){ ボタンを描く } }; class Picture : public Window { public: virtual void Draw(){ 画像を描く } }; class Window { public: void AddItem(Item* pItem){ items.push_back(pItem); } void Draw() { for(int i = 0; i < items.size(); ++i){ items[i]->Draw(); } } private: std::vector<Item*> items; };
996 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 22:56:31 ] このように使う。 ListBox listBox; Button yesButton, noButton; Picture background; Window window; window.AddItem(&listBox); window.AddItem(&yesButton); window.AddItem(&noButton); window.AddItem(&background); window.Draw();
997 名前:デフォルトの名無しさん mailto:sage [2010/05/20(木) 23:09:58 ] >>991 昔ならいざしらず、今は作ってるでしょう
998 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 07:16:08 ] ++
999 名前:// [2010/05/21(金) 07:41:40 ] スレの住人喜べ 【初心者歓迎】C/C++室 Ver.73【環境依存OK】 pc12.2ch.net/test/read.cgi/tech/1274395127/l1
1000 名前:デフォルトの名無しさん mailto:sage [2010/05/21(金) 07:43:51 ] 1000なら>>999 乙
1001 名前:1001 [Over 1000 Thread] このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。