[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 04/25 21:15 / Filesize : 282 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

スレを勃てるまでもないC/C++の質問はここで 2



1 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 11:02:46 ]
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

スレを勃てるまでもないC/C++の質問はここで
pc11.2ch.net/test/read.cgi/tech/1167476845/


552 名前:デフォルトの名無しさん mailto:sage [2007/07/14(土) 04:07:09 ]
POSIXな環境に移行すりゃいいんじゃないかね。

553 名前:デフォルトの名無しさん mailto:sage [2007/07/14(土) 08:43:07 ]
>>551
#include <unistd.h>

554 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 03:03:07 ]
>>552
ありがとうございます
でも出てきたサイトが英語だぁ・・・頑張ってみます

>>553
検索してくうちにそのヘッダを使ってるコードも見つけたんですが
borlandにはそのヘッダは無いみたいです

555 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 03:05:49 ]
unistd = UNIX standard

556 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 11:00:46 ]
ぶっちゃけ、>>551には自分がUNIX向けのプログラムを書いているという自覚がないのだろう。
一番簡単な選択肢は、Linuxを使うこと。

Windows上でPOSIX環境を提供する代物もあるが、
そういうのを使いこなす余裕はなさそうだからな。


557 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 11:20:27 ]
>>551
Windowsではシステムコールにシグナルで割り込んで
中断させるという手法は使えない。
ANSI Cをサポートするコンパイラならsignal()関数は使えるはずだが、
仕様は非常に限定的だし、Unixのシグナルと同じものだとは思わないほうがよい。

Windowsで時間がかかる可能性のあるI/Oを中断したい場合は、
非同期I/O、スレッド、イベント、といったものを使う。

558 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 22:41:08 ]
ずっと独学で勉強してたせいかdouble型をずっとドウブル型って読んでた
先週初めてダブル型だって知ったよ(|||´・ω・`)

559 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 22:46:37 ]
>>558
俺はドウブレって読んでた。

560 名前:デフォルトの名無しさん mailto:sage [2007/07/15(日) 22:51:07 ]
charはキャラと読む人も居るが、
ttp://www.research.att.com/~bs/bs_faq2.html#char
によると、チャーが正しいようだね



561 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 00:11:15 ]
この例だとネストは少ないけど、実際は5段6段のネストがあると考えてもらって

テンプレート使ったプログラミングで
typename Foo< typename Hoge<Hage>::type >::type foo;
とかやるのが面倒なんで
#define DECLARE(T,name) \
typename Foo< typename Hoge<T>::type >::type name
みたいなマクロ使うのってあり?


562 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 00:35:18 ]
勝手にしてください

563 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 00:50:59 ]
typedefすら面倒なのかよ

564 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 00:56:32 ]
関数オブジェクトならメンバ宣言内でのtypedefが使えるんだけど
普通の汎用関数ならTがテンプレートパラメータの時typedef使えないんで
そういうときの為に考えたんですけど
そういう場合でもtypedefを使って簡潔にする方法あるんですかね?

565 名前:デフォルトの名無しさん mailto:sage [2007/07/16(月) 02:04:58 ]
ないならそれ用のメタ関数を作ればいい。
これを使いたい関数の直前にでも書いておけばよし。
template<typename T>
struct Shortcut
{
typedef typename Foo<typename Hoge<T>::type>::type foo;
};
こうすればShortcut<Hage>::typeと言う具合に1段に減る。

ついでに言うと俺様ライブラリ内だったら、
Boostみたいに名前空間detailにでも放り込めばいいかもしれない。
(ほかにろくな使い道がないなら)

566 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 10:39:33 ]
クラスの中にクラスを定義できるけど、
関数の中に関数を定義するにはどうすればいいの。

その関数の中でしか使わない関数なので、
クラスの中のスコープに入れてしまいたい。

567 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 10:40:23 ]
もとい

×クラスの中のスコープに入れてしまいたい。
○関数の中のスコープに入れてしまいたい。

568 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 10:42:20 ]
>>567
関数内関数はできないので、精精同じソース内に入れるくらいが関の山。
呼ばれる関数をstaticにしておけば、事実上外部からは見えなくなるからね。

569 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 11:06:24 ]
>>568
ありがとう。

呼ばれる関数を、呼ぶ関数の名前のnamaspaceに入れることにしました。


570 名前:デフォルトの名無しさん mailto:sage [2007/07/17(火) 22:04:32 ]
生スペースか



571 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 02:33:18 ]
関数の中に構造体を定義してその中に関数を定義する。

572 名前:566 mailto:sage [2007/07/18(水) 03:15:23 ]
>>571
目から鱗です。

まさにそれを、STLまわりで無自覚のうちにやってました。反省します。

573 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 22:54:54 ]
>>524
結局ごまかしてる

574 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 19:56:30 ]
newされた量が別の所で管理されていると言うことは、
void *p = (void*)new Hoge_t[hugahuga];
delete[]p;
でもちゃんとsizet(Hoge_t) * hugahugaバイトの領域が開放されるんですか?

575 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 20:06:59 ]
うん

576 名前:デフォルトの名無しさん mailto:sage [2007/07/22(日) 20:10:20 ]
>>574
解放はされるけど、そのコードでは、Hoge_tがデストラクタを持っていた場合、
デストラクタが呼ばれないのがまずいという別問題も忘れないでね。

577 名前:デフォルトの名無しさん [2007/07/24(火) 17:28:14 ]
今までVC6をつかっていたのですが環境をVS2005 C++に変えました。
メモリアクセス違反を不正なポインタにアクセスして出した場合、いままでは

catch(...)

で例外を捕捉できていたのですが2005にしたらできなくなってしまいました
原因もしくは解決方法をご存じの方がいましたらお願いいたします。

処理としては不正なポインタからローカルの変数に代入しているだけです。
よろしくおねがいします

578 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 17:38:12 ]
ディスプレイの任意のピクセルの色情報を取得したいんですけど
どんなことをすれば出来るんでしょうか
普通に入ってるwindows.hとかでも出来ますか?

画面丸々ビットマップに変換して〜
とかなら自分でも出来そうなんですけど、全然スマートじゃない気がするので

579 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 17:52:04 ]
>>578
ディスプレイ=デスクトップとして、
デスクトップのDCを得る。 HDC hdc = GetDC(NULL);
HDCの任意の場所のピクセル情報を得る COLORREF rgb = GetPixel(hdc, x, y);

こんなんでどうか

580 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 17:59:54 ]
>>579
おお、そんな便利な命令があったんですか
2,3時間ネットで調べて見てもダメだったんですが綺麗に解決しました。
ありがとうございます



581 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 19:23:04 ]
>>577
コンパイラオプション/EHa使え

582 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 19:28:20 ]
最近C初めたんですが
#include <string.h>
を入れるとコンパイルしても結果が得られないのですがなぜですか???
超初心な質問だと思いますが・・・
どなたか助言をお願いします

583 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 19:30:53 ]
嗚呼、ぬるぽ

584 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 19:41:53 ]
私も最近C初めたんですが
#include <string.h>
を入れるとコンパイルしても結果が得られますのですがなぜですか???
>>582は超初心な質問だと思いますが・・・
どなたか助言をお願いします

585 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 19:43:57 ]
私も最近C初めたんですが
#include <string.h>
を入れるとコンパイルしても結果が得られないのですがなぜですか???
>>584も超初心な質問だと思いますが・・・
どなたか助言をお願いします

586 名前:デフォルトの名無しさん [2007/07/24(火) 19:46:46 ]
>>584
>>582が低脳だから


587 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 19:52:00 ]
>>582
その「結果が得られない」というソースを張りたまえ。

588 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 19:56:25 ]
ソースってなんでしょう???ウスターソースならウチにありますが・・・

589 名前:582 mailto:sage [2007/07/24(火) 19:58:19 ]
なんだかよくわかりませんがもう一度コンパイルしたら
でてきました
どうもすいません

590 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 20:03:37 ]
                           ____     
                         /_ノ  ヽ、_\    
   プギャアアアアアアアアアアアアアア     o゚((●)) ((●))゚o    
                      /::::::⌒(__人__)⌒::::: \ 
               (⌒)     |     |r┬-|     |  
           ,┌、-、!.~〈     |     | |  |     |   
            | | | |  __ヽ、   |     | |  |     |  
           レレ'、ノ‐´   ̄〉. \      `ー'     /   
            `ー---‐一' ̄                  



591 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 20:49:48 ]
>>581

ありがとうございます。無事動作いたしました。
SEHというものを初めて知りましたが、便利ですね

592 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 08:19:12 ]
連想配列を実現する関数のサンプルってどこかにありませんか?

593 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 08:22:35 ]
>>592
std::map?

594 名前:592 mailto:sage [2007/07/27(金) 08:33:40 ]
サンプルを自力で発見しました。
どうもお騒がせしました


595 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 08:34:27 ]
>>593
C言語で連想配列を実現したかったんです。
舌足らずですみません。
で、こんなHPを見つけて事故解決しました。
ew-and-f.hp.infoseek.co.jp/MyStudy/C-Language/associated-array.html

596 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 09:34:22 ]
Cだとハッシュという言葉のが一般的だからなあ。

597 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 18:54:56 ]
template <class T>
class foo
{
public:
T _data;
foo(const T& v){ _data = v; }
};
というクラスがあったとして

foo<int> foo1(4);
foo<double> foo2(2.5);

foo2 = foo1;
foo<double>foo3 = foo<int>(2);

という代入を実現したいのですがこれは可能でしょうか
テンプレートコンストラクタを作ろうとしたら当然無理でした

598 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 19:09:34 ]
>>595
STLにあるのに、自分で作るの?

・・・たぶん学校の宿題なんだろうな・・・

599 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 19:14:03 ]
事故解決したら危ない

600 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 19:36:30 ]
>>598
C++じゃなくてCだそうだよ。



601 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 19:43:10 ]
>>597
テンプレートのコンストラクタと代入演算子を用意するだけでは?
template<typename U>
foo(const foo<U>&);
template<typename U>
foo& operator =(const foo<U>&);

これとは関係ないが、コンストラクタでは代入ではなく初期化リスト使え。

602 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 20:09:03 ]
>>597
あなたが実際にやろうとしていることは、

foo<double> foo_d = foo<int>(2) ;
ではなく、
double d = foo<int>(2) ;
だと思う。

とりあえず
operator T&() { return _data }
を用意すれば、コンパイラが持っているintからdoubleの変換が使われる。

603 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 20:11:17 ]
ちなみに、
> テンプレートコンストラクタを作ろうとしたら当然無理でした
というのは、
template<class U>
foo(const foo<U>& u) { _data = u }
だったりしないか?

そりゃダメだ。
やはり、
double d = foo<int>(2)
をやろうとしている。

template<class U>
foo(const foo<U>& u) { _data = u._data }
でなければ。

604 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:50:15 ]
>>601-603
回答ありがとうございます
解決できました

template <class U>
foo(const foo<U>& u)


605 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:54:31 ]
途中送信してしまいました・・・

template <class U>
foo(const foo<U>& u)
{ _data = u._data; }

この形式でいけました
ちなみにクラステンプレートだとfoo<T>とfoo<U>とは
別のクラスになるようなので
_dataのゲッタを使って解決できました

ありがとうございました

606 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 02:44:33 ]
>>605

>>597の通りなら、_dataはpublicだからgetterはいらないよ。
publicではない場合は・・・面倒くさいからgetterを使うか。

同じテンプレートのクラスどうしならいいけど、違っていたらダメだから、
副作用もあるけど、operator T&を用意したほうが便利だと思う。

607 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 07:50:35 ]
ゲッタを用意するのとoperator T&を用意するのとでは、本質的には何も変わらないだろ。

608 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 07:55:49 ]
getterを誰が呼ぶのか、getterを呼ぶコードを誰が書くのか、という点で違うと思う。


609 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 08:16:00 ]
もうfriendにすればいいよ。
template<typename U>
friend class foo<U>;
auto_ptrとかshared_ptrもこんなことやってのかと思ったら、
getterあるから不要だった。

610 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 08:30:31 ]
>>609
friendにしたところで、肝心のメンバ変数の名前が一致していないとダメだ。

ちなみにVC7.1では、そういうfriend宣言はできない・・・orz



611 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 14:11:55 ]
Cで、ボタンを押すとファイルから1行ずつ読み取って描写するプログラムを作っています。
テキストの描写にはDrawTextを使っているのですが、うまくいかないので質問したいと思います。

例えば、長い文字列を描写した後、同じ場所に短い文字列を描写すると前の文字列の後ろの方が残ってしまうのです。
1回最小化してまた開くと、うまく表示されるのですが何が悪いのかよく分かりません。

こんな説明ですが、分かる方が居ましたらお願いします。



612 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 14:14:14 ]
知らないけど、リフレッシュ

613 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 14:14:58 ]
文字を書く前に、一旦後ろを真っ新に塗りつぶせばいい。

614 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 14:37:44 ]
文字列に空白でもたくさんつけとけ。

615 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 14:39:42 ]
あるいは自動で最小化→最大化とか

616 名前:611 mailto:sage [2007/07/28(土) 15:05:28 ]
私の技術力の低さのせいで614さんと615さんの方法しか試せませんでしたが、なんとか解決できました。
提案して下さったみなさん、本当にありがとうございました!

617 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 18:18:44 ]
えー
ちゃんと描画ハンドラを適切に実装しる

618 名前:611 mailto:sage [2007/07/28(土) 18:53:04 ]
今までにコンソールアプリケーションを作る事はあったのですが、
windowsアプリケーションは初めてで、色々苦戦してます。

メッセージ等初歩的な事は理解できたのですが、分からないことが多いです。
描画ハンドラの適切な実装?を私は
InvalidateRectを呼び出して再描画させる事だと考えたのですが、うまくいかないようです。
見当違いなことを言っていたらすみません。


619 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 19:16:06 ]
>>618
WindowsのGUIの基礎を勉強したほうがいいと思う。

断片的にやり方を調べてやっていると、
根本的なところを間違ったりするよ。

自前でチマチマやるくらいなら、
VCLとか使ったほうがいいかも。

620 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 19:20:28 ]
>>618
見当違いなことを言い過ぎで恥ずかしいです。



621 名前:611 mailto:sage [2007/07/28(土) 19:30:50 ]
今回質問をして、明らかに知識も技術も不足していることが分かりました。
もう一度基礎から勉強し直そうと思います。

指摘や指導して下さったみなさん、ありがとう。
次にこのスレに来るときは、もう少しレベルアップしてきます。
では。

622 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 21:19:59 ]
>>621
し直す

というあたりが不安だ。
一度も勉強していないものを、どうやって し直す のかと。


623 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 21:50:39 ]
お前さ、どんだけ上から目線なんだよ

624 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 22:07:01 ]
お前さ、どんだけ下から目線なんだよ

625 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 22:13:23 ]
#お前さ、どんだけ下から目線なんだよ

626 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 08:54:31 ]
     ∧_∧
     ( ・ω・ ) <消しゴムが落ちたので拾ってください
      (====)
   ______( ⌒) )
 /\   ̄`J ̄ ̄ ̄\
  ̄ ̄ ̄ ̄| | ̄ ̄ ̄ ̄
         | |
       / \       □

627 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 09:47:56 ]
##お前さ、どんだけ下から目線なんだよ

628 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 11:03:13 ]
#ここに初心者に対するコメントをどうぞ

629 名前:デフォルトの名無しさん [2007/07/31(火) 18:51:32 ]
#include<stdio.h>
#include<window.h>
main(){
int i;
while(1){
printf("入力して下さい: ");
scanf("%d",&i);
Sleep(5000);//長い処理の代わり
printf("値:%d",i);
}
}
このようなプログラムの場合、sleepしてる間(長い処理)に
キーボードから標準入力を入れると次にscanfに回ってきたとき
sleepしてる間に打った数字が勝手に入ってしまうのですが、
scanfの後、キーボードからの標準入力をいったん停止することはできませんか?




630 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 18:55:36 ]
読み捨てるしかありません。



631 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 19:36:16 ]
すいません、読み捨てるって意味がよくわからないです。

632 名前:デフォルトの名無しさん [2007/07/31(火) 19:41:46 ]
すいません、これって超基本という感じもするのですが、、、
以下のソースをg++でコンパイルすると
最初の行とその次の行の結果が異なるのですが、
これは何故なのですか?

#include <iostream>
using namespace std;
int main()
{
cout << 1 + 0.05 * (0.25) / 90 << endl;
cout << 1 + 0.05 * (90/360) / 90 << endl;
return 0;
}





633 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 19:47:00 ]
90 / 360 = 0 だから。
90.0 / 360 とかすれば同じになる。

634 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 19:53:59 ]
int 型同士の演算はその結果も int 型
90/360 は 0.25 という結果が int 型に切り詰められてゼロになる

635 名前:デフォルトの名無しさん [2007/07/31(火) 19:55:36 ]
>>633
そうか!
ありがとうございます。
結構大きなソースを追いかけていたのですが、最後にようやく
上記の行が原因とわかりまして、でもなぜうまく動かないのか
わからなかったのですが、そうですよね、90も360もintになりますよね。
ありがとうございました。



636 名前:デフォルトの名無しさん [2007/07/31(火) 19:56:20 ]
>>634
ありがとうございました。

637 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 20:49:08 ]
>>631
「scanf() 呼ぶ直前に、残った文字を全部読んでしまえ」ってことだろうが
それは無理。
 ttp://www.kouno.jp/home/c_faq/c12.html#26

ついでに
 ttp://www.kouno.jp/home/c_faq/c12.html#20

638 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 20:52:14 ]
>>637
fflush使わずともscanf("%*[^\n]%*c");みたいにscanfだけでも何とかなる。

639 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 21:04:46 ]
いや、
>読まれていな い文字は、O/Sレベルのバッファにもため込まれている可能性がある。
だから「それは無理。」なのだろう。
しかしこれはちょっと・・・元の>629はそんなシビアな話ではないと思う。

640 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 21:08:38 ]
裏で字を食い続けるだけのスレッド動かせばいいんじゃね?

すげー無駄だけど



641 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 21:48:35 ]
Aというファイルfopenで開き、fgetcでCString型の箱に格納。
Replaceで一部を置き換え、Bというファイルに書き出すというのは可能でしょうか。

642 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 21:57:17 ]
>>641
そりゃぁできるでしょ。

643 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 22:00:23 ]
CStringはTCHAR用なので、_gettc()ではなく(f)getc()を使うのなら
CStringAを使え

644 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 01:58:23 ]
class Counter;
{
/* 略 */
int data[];
int total;
};
int main()
{
Counter counter(N); /* counter[i] = 0 */

クラスCounterは内部に配列を持っていて0で初期化されているとします
counter[i]の値をインクリメントしたとき自動的に
totalもインクリメントされるようにしたいのですが

Counter::inc(index)
{ data[index]++;total++; }
ではなく
Counter::operator ++ (int)で実現する方法はないでしょうか

class val



645 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 02:01:13 ]
途中送信してしまいました・・・

class value
{
static int total;
int val;
/* 略 */
int operator ++();
};

というクラスを作れば実現できますが
これだとCounter c1,c2;としたときtotalが共有されてしまいます

646 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 02:02:48 ]
最終的に
counter[i]++;
としたとき
counter.totalも++されるようにしたいのです

なにかいい方法があればご教授ください

647 名前:デフォルトの名無しさん [2007/08/01(水) 03:22:28 ]
テンプレートクラスをtypedefする方法ってありますか?

648 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 05:12:34 ]
>>644-646
ちょっとサンプル作ってみたよ、参考にしてみてくだしあ><
ttp://2ch-library.com/uploader/src/2ch7515.cpp.html

方針としてはDataの配列(サンプルではvectorだけど^^;)
を持つCounterから直接インクリメント演算子を呼び出すんでなくて、
間に別のクラスをかませるってやり方
サンプルではそのクラスが合計インクリメント数も保持しちゃうんだけど、
チョッと弄ればCounterクラスが合計を保持するようにも出来る
この場合はfriend指定使ってるけどboost::functionみたいなデリゲート使えば
必要な関数だけ渡してfriend指定なしにもできる

>>647
ちょっとエスパー回答だけど、例えば
foo< bar< hoge< hage<piyo> > > > …(*)
ってのをtypedefみたいにショートカットするなら
template <type T> struct foo2 {
  typedef typename foo< bar< hoge< hage<T> > > > type;
};
とでもして、foo2<piyo>::typeってすれば(*)と同じような意味になりtypedefみたいな使い方ができる
こういうのをメタ関数と呼ぶらしい

649 名前:646 mailto:sage [2007/08/01(水) 11:39:12 ]
>>648

非常に参考になりました
Binderを内部クラスにする方向で進めてみます

どうもありがとうございました

650 名前:デフォルトの名無しさん [2007/08/01(水) 11:39:21 ]
すいません。質問です。
DXライブラリ(DirectXライブラリ)とVC++を使ってゲーム製作の学習中です。
スクリプトエンジンを作るため、テキストファイルを開いてstring型の配列に格納してファイルをクローズする、
という処理が上手く行きません。
ファイルを行と行ごとの内容でアクセス出来るようにしたいので、string型の二次元配列で最初は書いていたのですが、
上手く行きませんでした。
一昨日にvectorの存在を知って、早速試しているのですが、やはり上手く行きません。

vector<string> Scenario;
Scenario.resize(500);
char* ScenarioFile = "Log.txt";
char Buf[256];
int FileHandle = FileRead_open( ScenarioFile );
int i=0;
while(FileRead_eof(FileHandle) == 0){
FileRead_gets(Buf,256,FileHandle);
Scenario.push_back(Buf);
}
FileRead_close(FileHandle);

このように記述しているのですが、Scenario[0]から全て ・ としか表示されず、
どうやら漢字コードの半分だけを表示しているようだと予測しました。
完全に失敗です。
whileの中にブレークポイントいれてみると、Bufの内容はちゃんと1行まるまる入っています。
格納が上手くいっていないようです。

どうすればテキストファイル丸々をstring型配列に落とすことが出来るのでしょうか?
どんどん足していって、改行コード毎に1行と判別させるメソッドを組むしかないのでしょうか?

アホですいません。宜しくお願いします。




651 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 11:43:54 ]
ファイルのエンコードの問題かな?
プログラムとファイルの双方のエンコードを確認してみては?

652 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 11:59:53 ]
>>650
>Scenario.resize(500);
もしかして: Scenario.reserve(500);






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<282KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef