C++相談室 Part4

このエントリーをはてなブックマークに追加
938937:02/02/18 07:45
すいません、キー状態ってのはどのキーが押されているかではなく、
どれか一つでもキーが押されているかどうか知らせてくれる、ってことです。
マウスとキーを同時に扱えない(メッセージが1つ&瞬間なので)ので困ってます。
Windowsならdirectinput使うのはどうでしょう
>>933
nAlpha = nDigit = nSbc = nDbc = 0;
for( p=start; p<end; p=next(p) )
{
  if( isalpha(*p) ) nAlpha++;
  else if( isdigit(*p) )nDigit++;
  else if( isSingleByteChar(*p) ) nSbc++;
  else nDbc++;
}
こんな感じで数えりゃいいんでないの?
↑には流れしか書いてないから実装は自分で好きなようにどーぞ。
941937:02/02/18 08:14
>>939
ありがとうございます。ちょっとやってみます。
942デフォルトの名無しさん:02/02/18 17:45
>>940
さんくす! そんな関数あったんやね。
isSingleByteCharはC++にあるん? 半角カナも取得したいっすな。
さすがにもうちょい自分で調べまっす。
943940:02/02/18 18:33
>>940
そんな関数は無いから自分で作れゆーとるんじゃゴルァ (゚д゚ )
iskanji とか ismbcslead とか何かそんなのはあるかもしれんが。

ガンバッテーネ。
944940:02/02/18 18:34
ちなみにリンク先は>>942の間違いだ。
945デフォルトの名無しさん:02/02/18 23:17
突然すいません。
次のコードがエラーになるのですが、
なぜなのですか?コンパイラはgccです。
両方抽象クラスだから、実装はなくてもいいと思って
いるんですよね。

class A {
public:
virtual bool funcA() = 0;
};

class B
{
public:
virtual A funcB() = 0;
};
946デフォルトの名無しさん:02/02/18 23:19
抽象クラスは戻り値の型に使えないのですか?
純粋仮想関数じゃエラーでるんじゃないの?
>>946
使えるわけがなかろう。落ち着いて考えろ。
949デフォルトの名無しさん:02/02/18 23:26
class CA{
class inA{
};
};
これがOKなら、このメンバクラス(メンバ?)
のオーバロードをしたいのですが、出来るでしょうか?
class CA{
template<class C1>class inA{cout<<"A"<<endl;};
template<class C2,class C3>class inA{cout<<"B"<<endl;};
public:
CA{inA<int,int> ina;};
};
は、通るのですが、
CA(){inA<int> ina;};
とすると、エラーになってしまいます。これは出来ないということなのでしょうか?

950デフォルトの名無しさん:02/02/18 23:29
>>948
そういわれればそうだな。
ありがとうございます。あー、どうしましょう。
951デフォルトの名無しさん:02/02/18 23:30
char* name;
というのがあって、これがNULLならcin(標準入力)から、
NULLでないならこの名前のファイルを開いてifstreamから
入力したいんですが、どう書くのがC++的に一番いいでしょう?

istream* ifs;
if(name)
  ifs=new ifstream(name);
else
  ifs=&cin;
int i;
(*ifs)>>i;

とかだとどうもポインタが出てきて嫌なんですが…。
かといって参照だとスコープとかの関係で無理っぽいし…。
というわけでかっこいい書き方をおしえてください。
>>948
え?なんで?
>>952
ポインタじゃないからって事じゃない?
このスレ見てると
C++が使える人がそんなに多くないのと、
C++にあこがれる人がまだ沢山いるのとの
二つがよく分かって少し安心しました。
955デフォルトの名無しさん:02/02/19 01:19
>951
それでいいんじゃん,別に.見て何やってんのかスグ分かるし.
まぁあとは3項演算子使いたければ使えってぐらいで.

ただ ifs っつーと ifstream を連想するのは漏れだけ?
istream だったら・・・ is ・・・ かなぁ?
956名無しさん:02/02/19 01:34
957デフォルトの名無しさん:02/02/19 07:02
>>953
ポインタ返しにすればいいわけね。
ほんと、俺はバカだな。ありがとう。
>>951
ifstream(name)の生存期間が不明だからあまり具体的にはアドバイス
出来ないけど、ひとつの関数で作業をやりすぎてないか?
実際のコードではint iじゃなくて、もっといろいろ入力するんだろ?

1.入力すべきストリームを決定
2.ストリームからデータを入力

という二つの作業があるんだから、別の関数に分けた方が
いいと思うぞ。そうやって構造をスッキリさせれば、ポインタを
なくす方法も見えてくるはずだ。
959デフォルトの名無しさん:02/02/19 23:31
static関数のなかでクラスの変数にアクセスするにはどうしたら良いのでしょうか?
クラスにflag変数をもっておいて
そのflagの値によってstatic関数の中で処理を変化させたいのです。
クラス内でstatic BOOL flagを宣言するとコンパイラは通るのですが、
実行ができません。
>959
誰もが平均0.6回は通る道だな。
クラスの外側(ソースファイルのどれか)で static BOOL xxx::flag; と定義すれ。
961デフォルトの名無しさん:02/02/20 00:04
>960
でもそれだったらリンカエラー出るからそーゆー話じゃないんじゃない?
>959 は
> static (でprivate or protected) な関数の処理をメンバ変数の値によって
> 挙動を変えたい
という意味不明の事を言ってるように見えるのはヲレの日本語能力が足りない
からかな?

それだったら
> そんな関数staticにすんな
が答えなんだけど...

962959:02/02/20 01:00
>960,961
レスありがとうございます。
すみません。言葉足らずだったようなのでもう一度。

ええとボタンがクリックされたら
GetListCtrl().SortItems(CompareFunc,pNMListView->iSubItem);
この行から


static int CALLBACK CompareFunc(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSor

int CALLBACK MemListView::CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)

このように宣言された関数を呼んで
sortを行いたいのですが、
これがCompareFuncの中でflagがTRUEならば昇順に
flagがfalseならば降順にと切り分けたいのです。
このようなときflagは
どこに(クラス内かクラス外か)
どのように(staticかそうでないのか)持たすのが一番良いでしょうか?
当て嵌るかどうかは不明だが、このような要求のあるケースとして、
thisをもらえない関数であるウインドウプロシジャー/
コールバック関数からメンバー関数を使いたいということある。
マックならウインドウのプロパティにクラスへのポインタを
セットする。ウインドウのプロパティからそのウインドウを
作成したインスタンスを参照する。
WindowsならばGetWindowLongのユーザーデータを使用したい
ところだなと、マニュアルを見ながら思った。
>962
SortItemsの第2引数で工夫してflagの値も引き渡すようにするのが筋ではないかと。
たとえば、サブアイテムの個数がWORDの範囲を超えないのなら
MAKELONG(pNMListView->iSubItem, flag) としてみるとか。
>>959
そのstatic関数に、該当するインスタンスのポインタを渡してやればいいんじゃないの?
全体がどーゆーデザインになってるのか見当がつかんが。
966デフォルトの名無しさん:02/02/20 02:04
CListViewで項目の間のバーをドラッグしたときにウインドウに
送られるメッセージは何でしょうか?
Spy++を使ってみましたが量が多すぎてよくわかりませんでした。
967デフォルトの名無しさん :02/02/20 02:08
Visual C++ でSTLを使うようになってから
Debugビルドでは平気なのにReleaseビルド
すると計算結果がおかしくりました。私が
悪いのでしょうか?

printf("\n")って入れたらちゃんと動いた
りもします????


>>967
たぶんヒープを壊してる。次のコードを WinMain の直後に追加して、デバッグビルド
でヒープのチェックを有効にしてみ。

_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_LEAK_CHECK_DF);

あと STLport を使ってるなら #define _STLP_DEBUG とかも定義しておくと便利だ。
969デフォルトの名無しさん:02/02/20 10:05
今度からC++をメインで使うプロジェクトに参加することになりました。
よろしく
>966
VCスレ逝け
もしかして
  VC++ == C++
と思ってる奴って多くない?
>971
operator == の定義によると思われ。
g++まんせー
974デフォルトの名無しさん:02/02/20 18:57
boost や loki に tuple ってありますよね,アレって普通の構造体
を使うのに比べて何かメリットはあるのでしょうか?

struct.first_item
ってやるのと
get<0>(tuple)
っていう書式違い以上の違いが厨房な僕には分からないんで,
どなたか教えて下さい.
# まぁ構造体定義せずに済むという利点があるというのは分かりますが.

「利点が分からねーなら使うなゴルァ」と言われそうですが,利点がある
なら知りたいのです.どうぞよろしく.
975デフォルトの名無しさん:02/02/20 21:29
Auto<TCA<int>> temp;

何故にエラーになる・・・???
>> の間に空白入れてっか?
> >

ここにスペースがないと >>演算子とカンチガイしてしまう
978デフォルトの名無しさん:02/02/20 21:42
>>976,977

をを、そうだったのですか。
動きました♪有難うございます♪
979デフォルトの名無しさん:02/02/20 22:26
C言語の基礎を工業高校時代に習ったのですがC++とはC言語の基礎が役にたちますか?
それとも普通のC言語とはまったくの別物ですか?
いまから趣味でプログラムやるならCとC++のどっちのほうがいいですか?
>>979
Cと一緒に勉強するのがいいよ。
このスレではこう答えるけど、
他じゃCやっとけっていいたいところだったり。
981デフォルトの名無しさん:02/02/20 22:44
class CB{
public:
template<typename T>void func(T a);
};
template<typename T>inline void CB::func(T a){};

これがエラーになるのは何故なのでしょうか?
>981
CB<T>::func
にしる!!
何故だかスレッド立てすぎですって怒られた…。

誰か新スレ立てない?
984982:02/02/20 23:40
スマソ思いっ切りウソ付いた
>>981
g++ 3.0.2 だと通るけど。たんに使ってるコンパイラが
メンバテンプレートに対応していないだけなんじゃない?
VSは通らないのですか・・・
残念。