C++相談室 Part4

このエントリーをはてなブックマークに追加
質問させてください。
下のプログラムで(*2)のようにインスタンスを生成しようとすると
VC++6ではコンパイル時にエラーが出ます。(*1)がなければ大丈夫です。
この例自体にはあんまり意味はないんですが少し気になったので・・・。
どなたか理由判りませんか?

class Foo {
public:
 template<typename T> class HogeBase; // (*1)これがあると駄目らしい
 template<typename T> class HogeBase {}
 typedef HogeBase<int> Hoge;
};

int main()
{
Foo::Hoge hoge; // (*2)
return 0;
}

--
http://pc.2ch.net/test/read.cgi/tech/1010673275/412-
>>580
そりゃ、VC++の template の実装があまいから。
メンバテンプレートの使えないし。
582511:02/01/20 13:16
>>511

MSVCP60.DLLを自分のアプリと一緒に配布してもOK?
インストーラは使わないで、ZIPで配布です。
>>582
redist.txt
584デフォルトの名無しさん:02/01/20 13:35
テンプレートの明示的特別化と
部分特別化の違いがよくわかんないです。
どこがどのように違うのでしょうか?
585デフォルトの名無しさん:02/01/20 20:26
squidのログのように、各エントリが可変長で、なおかつ全体をメモリにロードできない
ぐらい巨大なものをソートするには、どんなアルゴリズムを使えばいいのでしょうか。
データにランダムアクセスできないのでほとんどのソートアルゴリズムは使えませんよね。

586デフォルトの名無しさん:02/01/20 20:37
>>585
なんだかアルゴリズムの教科書に出てきそうな問いだな。

マージソートでいいんじゃないの?
>>585
マージソート

たしか 4.4BSD 系の sort って、必要に応じてテンポラリファイルを作ってマージソート
してたような気がする。
588580:02/01/21 12:35
>>581
どうもありがとう。
VisualC++が悪いということで納得しました。
ちょっとWindows依存な質問なんですが、
勉強がてらに API だけでお手製クラスライブラリを作ろうと思っています。

で、しょっぱなでいきなりつまづいています。
「Windowsクラス」というのを作って、メッセージの処理をこちらで
やろうと思ったのですが、ウィンドウプロシージャで、どの「Windowクラス」に
メッセージがきた事を伝えればいいのかわかりません。
メッセージループの処理をしているクラスに hWnd の管理テーブルを作って
それで判断するしかないでしょうか?
>>589
それを自分で考えるのが勉強ではないの。ATLのソースでも読めば?
591589:02/01/21 15:48
SetWindowLong の GWL_USERDATA に this 入れておけばよかったんですね。
とりあえず自己解決です。ありがとうございました。
592590:02/01/21 15:48
ATL->WTL
593591:02/01/21 15:49
と思ったら直前にヒント貰ってたみたいですね。
ありがとうございました>>590
>>592
いや、そこは ATL で良い。興味があるなら CWindowImpl あたりから読み進めましょう。
>>584
なんらかの形でテンプレート引数が残っているのが
partial specialization ってだけじゃないの?
テンプレート引数が空になったのが完全な (明示的な?)
specialization

596デフォルトの名無しさん:02/01/22 01:51
void printfunc(vector<class elemtype> vec, string str)
{
vector<elemtype>::iterator it = vec.begin(), end_it = vec.end();
cout << str;
for (; it != end_it; ++ it) cout << *it << ' ' << endl;
}
このようにvectorクラスをパラメータに渡す関数を作りたいのですが、
vectorの中身がどのような型か分かっていないとパラメータとしては
渡せないのでしょうか?
今の状態だとエラーが沢山でて何のことか分かりません。
template< class T >
void printfunc(T &vec, string str)
{
T::iterator it = vec.begin(), end_it = vec.end();
cout << str;
for (; it != end_it; ++ it) cout << *it << ' ' << endl;
}
598デフォルトの名無しさん:02/01/22 01:57
>>596

#include <iostream>
#include <vector>
#include <string>
using namespace std;

template<typename T>
void printfunc(const vector<T> &vec, const string &str)
{
vector<T>::const_iterator it = vec.begin(), end_it = vec.end();
cout << str;
for (; it != end_it; ++ it) cout << *it << ' ' << endl;
}

main()
{
vector<int> A;
A.push_back(17);
A.push_back(18);
printfunc(A, "test:\n");
}
>>597-598
めちゃんこありがとうございます。
関数、またはクラスをテンプレートにするんですね。
なんか使い方が少し分かってきました。
見習ってよく勉強したいとおもいます。
ありがとうございました。
600デフォルトの名無しさん:02/01/22 02:38
g++ 2.95.3だと
T::iterator it = vec.begin(), end_it = vec.end();

typename T::iterator it = vec.begin(), end_it = vec.end();
って書かないとだめなんだけど、誰か解説プリーズ
601巨額詐欺:02/01/22 02:48


巨額詐欺の疑いのある、グローバリーについて

掲示板を拝見されてるの皆様、新年あけましておめでとうございます。
掲示板の趣旨とは直接関係ない話で申し訳ないのですが、この世の中では許せない事があります。

http://www.max.hi-ho.ne.jp/sakimono/index.htm

この会社はありもしない儲け話をでっち上げ、巧みに客の財産を聞き出し、全財産を巻き上げます。

2002年になりましたが、一向に改善する気配すらなく、悪質化は進む一方です。
この会社の営業は世間の皆様の迷惑になっています。

それだけではなく、人を騙して破産に追い込み、騙された人が仕方なくグローバリー社員を
殺人する事件も実際に発生し、新聞ザタになっています。

http://www.mainichi.co.jp/news/selection/archive/200001/24/0124e038-400.html

みなさんもこちらの掲示板に投稿し、悪徳会社に騙される不幸な人が増えないようご協力お願いしま
す。


http://messages.yahoo.co.jp/bbs?action=q&board=8745

また、この書き込みを見て賛同頂ける方はこの内容をコピーしていろんな掲示板に書き込みをお願いします。


>>600
そりゃ、例えば、↓みたいに iterator が型でない可能性があるから。
型であるということを明示しないと駄目。

class Type
{
public
int iterator; // iterator が型じゃない
}

template< class T >
void printfunc(T &vec, string str)
{
T::iterator it = vec.begin(), end_it = vec.end();
cout << str;
for (; it != end_it; ++ it) cout << *it << ' ' << endl;
}

int main()
{
Type t;
printfunc(t, "");
return 0;
}
603596:02/01/22 03:27
ちなみにg++-2.95.4を使っているんですが、
typename T::iterator it,end_it;
it = vec.begin();
end_it = vec.end();
このように2行に分けて書かないとエラーが出るのは仕様なんでしょうか?
604596:02/01/22 04:00
あとそれから、
関数テンプレートというのは皆さんあまり使わないのでしょうか?
クラスをテンプレート化するほうがスマートだと言う感じですか?
上のものは標準入出力を使った関数を少しだけ(デバッグ用に)
テンプレート化しただけですが、これにしてもスーパークラスに
おいて持ってしまえば、関数においてテンプレートにしておく
必要もないですよね?

C++が手続き指向のプログラミングも出来るというメリットの
ためにあるんですよね?
605596:02/01/22 04:04
質問バッカですんません。Java房なんてテンプレートに
感動してる最中なもんで(^^;(早くJavaにもテンプレートを!)
606デフォルトの名無しさん:02/01/22 04:31
>>604
<algorithm>
>596
きみのやりたいことは、関数化しなくても、
std::cout << str;
std::copy( vec.begin(), vec.end(), std::ostream_iterator( std::cout, " \n") );
でやれたはず。
608596:02/01/22 04:56
>>606-607
どうもです。
今C++Primerのサンプルコードのみで勉強していますw。
本を持っていないので推測だけで勉強してるのですが、
なかなか思うようには理解が進みません(あたりまえか!?)
今度C++Primerの訳書を買ってちゃんと勉強し直します。

>>606
container type
algorithm type
iterator type
この三つの組み合わせがどうもイメージ出来ないんですよね。難しいです。

>>607
これがSTLですか。
これはC++におけるCの標準関数みたいなものになるのでしょうか?

はやいとこC++覚えてServlet作りまくりの毎日から脱出したいです・・・
609606:02/01/22 05:10
>>608
>これがSTLですか。
それは標準アルゴリズムでSTLじゃないよ
ていうか596のJava風引数渡しが、597の回答でさりげなく参照渡し
へ変更されているのにウケタ
610596:02/01/22 05:27
>>609他、みなさん。
今日はこんな夜中にいろいろとありがとうございました。
これ以上はチョット恥かしいのでもう書きませんw。
スレ汚して済みませんでした。
>>609
<algorithm> は、STL の一部だと思うが
612596:02/01/22 08:01
603の書き込みは嘘でした。
typename T::iterator it=vec.begin(),it_end=vec.end();
としたところ、g++の2.95.4、3.03ともにOK。
何か別のエラーと勘違いしていたようです。
ごめんなさい>g++
613609:02/01/22 10:21
>>611
スマソその通り。
>これはC++におけるCの標準関数みたいなものになるのでしょうか?
に対してC++におけるCの標準関数はCスタイルアルゴリズムなんだ! とボケた方がよかった(w
>>612にならって、>>609書き込み前半は嘘でした。
ごめんなさい>596
614596:02/01/23 01:59
C++Primer原書を4000円でげっとー、あげ
615デフォルトの名無しさん:02/01/23 02:13
あるデータを格納するのに
DWORD *num = new DWORD[100];
として使ってるんですけどデータが1桁だったら勿体ないし
100を越える可能性もあるから問題がありますし、、
こういった場合スマートな方法は何ですか?
>>615
std::vector
617デフォルトの名無しさん:02/01/23 02:46
>>616
ありがとうございます。
これは便利だからといって使いすぎると速度が
低下してしまうかな?
>617
サイズ変更しまくらない限り心配無用だと思われ
# egcs とか古いコンパイラだと遅かったりもするけど
>>617
大量のデータを突っ込むことが事前にわかってるなら reserve() しとくと良いよ。
>>617 色んな型で定義しなければそれほど気にしなくてもいい


しかし >>615 の話なら 単に

入力処理では可能性のある最大桁を取っておいて、
 入力処理の帰り値では そのサイズだけの領域を確保 それにコピー

という手法が適切だろう。 


まあ、最近ならそういうのはデータベースアクセスに置き換えてしまうとか
621デフォルトの名無しさん:02/01/23 11:14
すみません厨な質問だと思いますが
new 演算子でクラスの配列を割り当てるときは
コンストラクタに引数を渡す事はできないんですか?
622デフォルトの名無しさん:02/01/23 11:39
new Cls[10](30);
とかじゃダメ?
>622
それだとコンパイルとおらんよ
624デフォルトの名無しさん:02/01/23 11:56
>>623
g++だとこれでもOKみたいなんです。

勉強始めたバッカなので、
個別にコンストラクタへの
パラメータの設定する方法、
自分も知りたいです。
すまん
VC6だと
とおらんかった
ポインタの配列つくって
いっこずつnewは
627621:02/01/23 12:02
>>621 です
今は VC++6.0 でやってます。MSDNや入門書など
見てるのですがどうにもわからないです。
イメージとしてはまさしく >>622さんの書かれたような事を
したいんです。
基本は >>626 だと思うけどね。
どうしても delete Cls[] したいのであれば、初期化用の関数作るとか?
でもかえって手間になるので氏労徒にはお勧めできない。
629621:02/01/23 12:45
>>628 さん
はい、今までは 初期化用の関数作って間に合わせていました。
しかし、もしもインスタンス作成後に初期化関数を呼びだすのを忘れると
値の割り当てられていない変数への不正なアクセスを許してしまうのは
OOPL的にいかがなものか、と氏労徒なりに思ってしまって。
自分で使う分にはいいんですが。ドキュメントしっかり書いておけばいいと
いうことででしょうか。
でも >>626 さんのやり方が基本なんですね。やってみます。
ありがとうでした。
630デフォルトの名無しさん:02/01/23 13:09
誰かこの本を読んだ方はいらっしゃいますか?
【C++ Network Programming Volume 1】
http://www.amazon.co.jp/exec/obidos/ASIN/0201604647/
631デフォルトの名無しさん:02/01/25 04:46
>>630
読んでないけど目次見る限りACEの解説書だね。ACE使ってクロス
プラットフォーム開発って魅力的な気もするけど実際どの程度
使われてるんだろう。ちなみに俺は乗り気じゃありません。
632デフォルトの名無しさん:02/01/25 05:04
>>631
それかなりでかいライブラリだから気合入れて
調べないとわからなそう。おれも前から
試してみたいとは思ってたけど。。
http://www.cs.wustl.edu/~schmidt/ACE-overview.html

これだけの機能が必要になるケースじゃ
Javaでもつかった方がよさそうな感じかもね。
633HWND:02/01/25 05:37
ハンドルは16進数みたいだけど、ハンドルを文字列として
取得することは可能ですか?
>>633
16進数と10進数の違いは?
635デフォルトの名無しさん:02/01/25 05:57
>>633
forとかで、if(Handoru==総当り)とかするしかないんじゃない?
>>633
文字列って、どういう表現を期待してるんだ? ハンドルの値を取得したいなら
DWORD あたりにキャストして sprintf() で拾えるだろうし、その HWND に関連
付けられたウィンドウのタイトルなら GetWindowText() だろう。

っつか HWND の話なら、ここではなく VC++ スレに行きましょう。
637デフォルトの名無しさん:02/01/25 06:57
>>636
DWORD あたりにキャストして sprintf() では拾えない。
ハンドルを文字列で得るには総当りでしか無理だったはずです。
638HWND:02/01/25 07:19
>>635
総当たりじゃ使いものになりません。要するに無理なんですね。
ありがとうございました。
ハンドルを文字列として取得するという意味がわからん
640デフォルトの名無しさん:02/01/25 08:07
ハァ?
ウィンドウハンドルを指す文字列ったらHWNDをsprintfした奴だよな普通。
ていうかそれ以外ってなに?
>>633=638はネタ|アフォとして、
おれは>>637の考えを聞きたい。
(゚д゚) ハァ?
次逝ってみよう次
>>642
同意。総当たりって何を総当たり? 謎だ。
646教えて君:02/01/26 01:59
カンマで区切られたデータ「TN-620,192,168,1,100」(初期値で与えられる)から文字列を切り出して表示する
項目1:TN-620
項目2:192
項目3:168
項目4:1
項目5:100

言ってる事から何をすんのかもサパーリです。教えてください
ってな質問はここでいいのだろうか
わたしもサパーリです。
648デフォルトの名無しさん:02/01/26 11:12
>>646
で、私たちは何をすればいいんでしょうか。
サパーリです。#宿題なら宿題スレに行ってね。
ミギャアアアアアア!
C++!
C++!
ミギャアアアアアアアアアア!!
教えて欲しいのですが、
二つのクラスがお互いを使っているとき、コンパイルできないのです。

-------- ファイル ClassA.h --------
#ifndef CLASSA_WAS_INCLUDED
#define CLASSA_WAS_INCLUDED
#include "ClassB.h"
class ClassA{
 public:
  ClassB* getClassB();
};
#endif

-------- ファイル ClassB.h --------
#ifndef CLASSB_WAS_INCLUDED
#define CLASSB_WAS_INCLUDED
#include "ClassA.h"
class ClassB{
 public:
  ClassA* getClassA();
};

#endif

こんな場合です。お互い相手の名前が出てきた所でコンパイルエラーです。
こういう時はどうしたらいいのでしょうか?
ちなみに使っているコンパイラは Borland C++ 5.5 です。
(が、できれば汎用的なお返事をいただけるとうれしいです。)
よろしくお願いいたします。
651:02/01/26 17:13
>650
ClassCでも作れよ(w
>>>650
前方宣言
653650:02/01/26 17:44
>>652
クラスにも前方参照って必要なんですね。
C を弄っていた頃はちゃんと(関数の宣言を)書いていたんですが、
最近すっかり Java に慣れてしまったもので忘れていました。
ありがとうございました。

参照
http://black.sakura.ne.jp/~third/cpp23.html
654デフォルトの名無しさん:02/01/27 07:34
std::stringstream のEOFの場所を手前にずらしたいときはどうすればいいですか?
つまり、
std::string s("0123456789");
s.erase(1);
をstringstreamでやりたいのです。
ss.str(ss.str().erase(1));
はどうですか?効率は?
やっとvirtualの使い方がわかった気がした…
C++が楽しくなった瞬間だった(w
657デフォルトの名無しさん:02/01/28 08:53
template<class T> class c
{
private:
static T s;
};

template<class T> T c<T>::s;

の最後の行ってなにをしてるのですか?
vc6の標準ライブラリの iosfwd の class fpos のところにあったのですが。
staticメンバの定義
掘って掘って
ようやく一番下まで掘り進んだとおもったら
さらにその下に巨大な地下帝国があった。
>>658
static T s;
だけではダメナンデスカ?
テンプレートをつかっておろうが
template<class T> class c
{
//private:
public:
static T s;
};

//template<class T> T c<T>::s;

main() {
int i = c<int>::s;
char ch = c<char>::s
}

でコンパイルもリンクもできたのですが、なにかまずい状況が
あるのですか?

663661:02/01/28 09:53
すいませんごめんなさいリンクできてませんでしたテンプレートはあくまで
テンプレートで実体を持っていないので宣言がいるということでしょうかでは逝きます
664662=663:02/01/28 09:54
すいませんごめんなさい名前をまちがえました
sに代入できたか?
sの値を表示できたか?
おそかった
すまぬ
Effective STL 訳本発売 age
くそっ
669 :02/01/28 17:36
>668
ん?洋書買ったばっかとかそーゆーコト?
またよまなきゃいけない本がふえちった。
金ねーっつーの
すいません、ちょっと質問。
メンバー関数として、「関数ポインタ」を返す関数ってどうやって定義したら
いいのでしょうか?
>>671
別の型にキャストしてから渡しちゃう
とか、
構造体に入れて渡しちゃう
とか。
class A{
 (void(*)()) f();
};
こんな感じ?ちなみに「メンバー関数ポインタ」を返す関数のことなら
(void(A::*)()) f();
って感じ。
デストラクタでは例外を投げないよう気を付けませう。
ある一定の期間内だけ有効になる変数の扱いってどうしてますか?
class Class{
int a;
int b;
void A( int _a, int _b ){ a = _a; b = _b; B(); C()}
void B(){ if (a==b) ...; }
void C(){ ...; }
};

↑のa,bみたいな場合。
この例のようにメンバ変数にすると、その変数が有効じゃないときにアクセスしてしまう可能性がありますよね。
BやCの引数に渡してやればOKですけど、数が多くなると問題ですよね。
a,bを格納するインナークラスを作ってそれを引数にして渡してやれば数が多くても大丈夫ですが、
ある一定期間だけのためにクラスを新設するのはなんだかもったいない(謎)気がします。

インナークラスを作るのが一番スマートな気がしますが・・・皆さんはどうでしょう?
age忘れた
>>675
>その変数が有効じゃないときにアクセス

どういう意味? コンストラクタで初期化してないとか? それにしては
インナークラス云々がわかんないんだけど。
678デフォルトの名無しさん:02/01/31 09:25
>変数が有効じゃないときにアクセスしてしまう可能性がありますよね。
あるのか(w

まああんまり使わないなら比較的長い名前にしておけば?
679 :02/01/31 12:58
>675
漏れもそれ意味分かんない
680675:02/01/31 14:24
>>677

> どういう意味? コンストラクタで初期化してないとか?

コンストラクトされた時点では値が不明なときです。
MFCのCDCなどのm_hDCのような物です(ただしもっと一時的です。Perlで言うlocalな変数です)。
m_hDCはどこから参照するかわかりませんからメンバ変数にしてありますが、それを使用するところでは必ずその値をチェックしなければいけません。

で、実際にはそういう変数がまとめて5個くらいあって、
それを使用する関数、というか使用してもよい関数が10個くらいです。
それらの関数すべてにその引数を渡すのは効率的じゃないです。

一つのクラス(構造体といったほうが伝わりやすい?)にまとめて、そのオブジェクトのアドレスを渡すようにするべきかな?

結局トレードオフの問題で、私が決めるべきことですが、皆さんはこういうときどうしているのでしょうか?
あるいはもっとスマートな方法があるのでしょうか。

> >変数が有効じゃないときにアクセスしてしまう可能性がありますよね。
> あるのか(w

一人で使う分にはないです。
>>680
>それを使用するところでは必ずその値をチェックしなければいけません。

ならその変数をメンバ変数に持つかその変数から継承したクラスを作って
そのクラスのオブジェクトにアクセスするときはそのクラスが公開してる
インターフェイスでアクセスするようにすれば。で、そのインターフェイ
スは内部で値のチェックをやってると。要するにラッパ。
つーか例をもっと詳しくしてくれ。
>MFCのCDCなどのm_hDCのような物です(ただしもっと一時的です。Perlで言うlocalな変数です)。
も意味不明だ。
682675:02/01/31 17:51
>>681

特定の関数内からしかアクセスできない変数を考えています。
(↑=特定の関数どうしで変数を共有したい、とも言い換えられます。)
コンパイル時に、できればそれ以外の関数内でその変数を参照していたらはじきたいので、メンバ変数というのはちょっと使いたくありません。

> >MFCのCDCなどのm_hDCのような物です(ただしもっと一時的です。Perlで言うlocalな変数です)。
> も意味不明だ。

Perlのlocal変数はわれながらいいたとえだと思ったのに。(;´Д`)

ま、いいや、やっぱりインナークラス作ることにします。
もし私の説明が解読できてしかももっといい方法を知ってる人がいたらよろしくお願いします。
>>682
> Perlのlocal変数はわれながらいいたとえだと思ったのに。(;´Д`)
もしかして動的変数スコープを使いたいって話? それは C++ では無理だ。

知らない人のために補足しておくと、Perl5 はデフォルトで変数は全てグローバル、my
で宣言するとブロック内有効な静的スコープを持ち、local 宣言すると動的スコープを
持つようになります。(local 宣言したときに値を保存しておいて、スコープを抜けるときに
値を復元する)
> 特定の関数内からしかアクセスできない変数を考えています。
> (↑=特定の関数どうしで変数を共有したい、とも言い換えられます。)

>ま、いいや、やっぱりインナークラス作ることにします。
の関係がよくわからんが、その変数を何かのクラスでくるんで、
関数を friend にしてやれば?

>>683
次のコードで、my と local の違いが分かるね。

$x = 1;
foo();
print $x,"\n";

sub foo() {
# my($x)
local($x);
$x = 2;
print $x,",";
bar();
}
sub bar() {
print $x,",";
}

結果は、local のときが 2,2,1 で、my のときが 2,1,1, になります。

686681:02/02/01 05:23
>>682
>特定の関数内からしかアクセスできない変数を考えています。
>(↑=特定の関数どうしで変数を共有したい、とも言い換えられます。)

それを文字通りに「特定の関数内からしかアクセスできないメモリ =
クラスオブジェクトのprivate宣言されたメンバデータ」
って回答しかない。コンパイル時に弾くにはこれしかないね。
で、それをクラス間にまたがって行うには>>684の言うように
friendしかないと。

>Perlのlocal変数はわれながらいいたとえだと思ったのに。(;´Д`)

Perlのlocalがグローバルシンボルテーブルを一時的に上書きするのと
C++で「特定の関数で値を共有する」というのとでは意味も前提もまる
っきり違う。グローバルな特殊変数に基づいた振る舞いをするサブルー
チンの振る舞いを変更したいときにlocal宣言で特殊変数を一時上書きして
やったりするが、そういうシンボルベースの動的な振る舞いとMFCがラップ
したm_hDCのようなvolatile(システムによって非同期に変更される)な変数
の扱いとは全く別で、だから意味不明と書いた。
C++で同じシンボルで振る舞いを変更するには、参照の参照先を付け替える
かメソッドをオーバーライドするかしかない。
687デフォルトの名無しさん:02/02/01 05:42
More Exceptinal C++読み終わりましたが
絶対買いだとは言えないかも。
例外についてはMoreなしの方で言い終わっていた的な。
文字列クラスの実装の話の方が多いし。
688デフォルトの名無しさん:02/02/01 06:28
継承していないクラスのコンストラクタにおいて
class XXX{
public:
  XXX():yyy(),zzz(){
    return;
}
このような表記があるのですが、
これって何をしているのでしょうか?
自分の理解では親クラスのコンストラクタに
パラメータを渡していると思っていたのですが、
どうも違うみたいです。よく分かりません。
教えてください。
>>688
メンバ変数の初期化デス。
>>689
こういった書き方も出来るんですね。
初めて知りました。どうもです。
691デフォルトの名無しさん:02/02/01 08:12
>>689
一つ思ったんですが、
どうしてこんな書き方が必要なんですか?
クラスのコンストラクタにおいて、
渡されたメンバ変数を使って初期化すれば
いいだけの話に思えるのですが。
もし問題となるケースがあるとするならば
コンストラクタの実行順序ですが、
これだけが上のような表記が必要な理由ですか?
692デフォルトの名無しさん:02/02/01 08:13
×:渡されたメンバ変数を使って初期化
○:渡されたパラメータを使ってメンバ変数を初期化
メンバがconstだったりリファレンスだったり
する場合の初期化
>>693
今見ているソースではconstでもリファレンスでも
ないのに先のような表記になってます。
これは勘違いということになるんでしょうかね?
private:
 ZZZ zzz;
 YYY yyy;
こんなかんじです。意味無しですか?
>>691
> コンストラクタの実行順序
これは初期化リストの書き方によらず、常にメンバ変数の定義順になる。
殺気から色々と教えてくれてありがとうございます。
>>695
メンバの初期化の順序は処理系依存ではなく言語仕様なんですね。
よーく頭に叩き込んでおきます。
>>694

コンストラクタをポインタなどを介さずに直接呼び出すにはその記法が唯一な気がするのだが

たとえば

class hoge {
std::vector<int> vi;
public:
hoge(int n): vi(n) {}
//...
};

とか.

そうしないと

hoge(int n) { vi.resize(n); }

とかにするしかないような.
うぉー、ありがとうございます!!
もう>>697さん大好き!惚れました!!(´ε`)チュッ

確かにそうですね。上のような感じだと、
パラメータを渡してメンバ変数を初期化するには
そのような書き方しかないですね。
resizeに相当するようなメソッドがないクラスは
その方法しかありません。勘違いしてました。
>>697
そもそも、デフォルトコンストラクタを持たないクラスの場合には、書かないと
コンパイル通らないしね。
>>698

もっとも,この場合には

hoge(int n) { vi = std::vector<int>(n); }

とできるけどね.

結局,初期化と代入とを区別するための記法だね.
701デフォルトの名無しさん:02/02/01 14:40
それだとコンストラクタが2回と代入演算子が使われるのでは?
でも例えばコンストラクタ用の例外構文をコンパイラがサポートしてない場合とかは
このように書くしかないと思う
703675:02/02/01 15:29
>>684

使用する関数が継承等で増える可能性もあるのでfriend指定は出来ません。
関数をオーバーライドするときにクラスも新しく派生させればいいですけれど。

>>686

m_hDCとlocalが同じとは書いていません。

m_hDCの値はオブジェクトが作成されて破壊または分離されるまでの間でのみ有効ですよね。
(オブジェクトが生成される前に、生成に成功したかどうかをm_hDCの値から判断する処理をしても無意味です。)
有効範囲という意味で、m_hDCのような値が常に有効とは限らない変数。

しかしm_hDCほど寿命は長くなく、もっと一時的に、ある関数が呼ばれている間のみ、意味を持つ変数はみなさんどうするかなぁと。
Perlのlocal変数と同じようなことはメンバ変数を使った最初のやり方で出来ています。
しかしPerlのlocal変数同様特定の関数からのみ呼ばれることを期待して書いたとき、ほかの場所から呼ばれた場合に問題がでます。

で、それへの対応策が必要な変数をすべて引数へ渡すこと、さらにそれをクラスにまとめることです。
こうすればどこから呼ばれても、引数さえちゃんと渡されていれば問題なく動きます。
メンバ変数の無駄遣いもなくなりますが、クラスが1つ増えます。
704683:02/02/01 15:44
>>703
> m_hDCとlocalが同じとは書いていません。
書き方が悪すぎ、に一票。
705にゃお:02/02/01 16:24
Windows 9x において現在接続されている HDD / CD-ROM / IDE コントローラ
などのハードウェア名情報はどのように取得すればよいのでしょうか?
レジストリエディタで検索してみると当然みつかりますが、環境によって場所が違うようです。
706 :02/02/01 16:41
>705
そーゆープラットフォーム依存の話は他当たった方が良いと思われ
707にゃお:02/02/01 16:46
>706
ごっ、ごめんなさい。どーもスレチガイだったようで・・・
Windowsプログラムの話題をやってるところに投稿するべきですね。
708デフォルトの名無しさん:02/02/01 21:45
g++2.95用のリンカでコンパイルした
ライブラリはg++3.03でリンクすることは
できないのでしょうか?
VD++6.0でClistBoxを使っているのですが、
リストを選択した状態でエンターを押した時に
エディットボックスに、選択状態のリストの文字列を送ってやりたいのですが、
リストの項目番号を取得することもエンターを検出することも出来ません。

どうやったらいいのでしょうか?


>>708-709
処理系のスレへどうぞ
>>703
……ようやくあなたの言っている意味が分かった。しかし、
「書き方が悪すぎ」に、もう一票だな。
で、あらためて >>675 に戻るが、コンパイル時にチェックしたいなら、
引数で渡すしかない。実行時の assert によるチェックでよいなら、
変数をポインタにするという手はある。ふだんは NULL のままだけど、
関数 A() の中で有効なポインタを設定する。
それよりも設計を見直して、変数a, b と関数 B(), C() だけをまとめた
クラスを考えたほうがよいと思う。
712デフォルトの名無しさん :02/02/02 17:27
ハンドルされていない例外があります。
stack overflowとか出るんですけど、どうしたらいいですか?
節約しなさい、スタック。
C++って、全ての基底クラス?っていうのかな
MFCでいうところのCObjectクラスってのがないよね。
あれって何でなの?
そういうものだって言われて終わりかな…。
715デフォルトの名無しさん:02/02/02 17:36
スタックって何ですか?どうしたら節約できるんですか?
そういうものだ。
>>715
> どうしたら節約できるんですか?

でかいauto変数を使わないようにする。
少しは自分で調べろよ。
718デフォルトの名無しさん:02/02/02 18:32
>>715
「おいオメー さっきから うるせえぞ
『知りません』『知りません』ってよォーーーー
『知りません』・・・そんな言葉は使う必要がねーんだ
なぜなら オレやオレたちの仲間は その言葉を頭に浮かべた時には!
既にGoogleや書籍で調べがついちまって もうすでに『知っている』からだッ!
だから 使った事がねェーーーッ
『知っている』なら 使ってもいいッ!」
719ithink:02/02/02 20:07
>714
基底クラスがあるとすると例えば多重継承をどう処理する?などなど
>>714
そんなもん要らんから。
>>714
MFCがこまるから。
>>715
再帰で無限ループとかになってないか?
'a'ってint型じゃないのですか?
プログラミング言語C++に
void print(int);
void print(char);
があった場合、print('a');とするとprint(char)が
呼ばれるって書いてあるんですけど。
>>723
C だと int, C++ だと char
こういうときはポインタでわたす
こういうときはリファレンスでわたす
とか決めてる?
>>725
場合によって相手を変える場合にはポインタ
初期設定したら二度と相手を変えない場合には参照

NULL がくる可能性があるならポインタ
NULL がきたらまずい場合は参照

もちろん

 foo(int& n);

 int *p = NULL;
 foo(*p);

とか書けばコンパイラのエラーチェックに引っかからないが、そりゃ NULL ポインタ
をデリファレンスしたヤツが悪い。
ポインタの場合は、メンバ変数とかグローバル変数とかに保持されて、その関数を抜けた後も使われる場合があるけど、
参照で渡す場合はそれをしないという自分ルール。

参照にNULL渡す奴なんぞ知らんってことついては >>726 に同意。
privateとpublic書く順番。

class A{
private:
 int a;
public:
 void f();
};

class A{
public:
 void f();
private:
 int a;
};

今までずっとprivateを先に書いてたけど、STLのソースなんかは逆なのね・・・どっちが普通??
729 :02/02/03 22:59
>728
漏れはヘッダ見た時にインターフェースが見やすいように
public が先
>>728漏れは
public:クラス名・タイプ宣言
public:コンストラクタ
public:メソッド
public:フィールド
public:クラス
protected:クラス名・タイプ宣言
 :
 :
private:クラス名・タイプ宣言
 :
 :
>>729
おれは private 書かずに、いきなりメンバ変数書くので private が先。

たいてい、メンバ変数は pImpl だけだったり。
732デフォルトの名無しさん:02/02/04 09:19
C++で追加された演算子(?)に
  const_cast dynamic_cast reinterpret_cast static_cast
がありますよね?
これがいまいちわからんのです。
普通のキャストと何が違うんでしょうか?
C++を勉強した本には載ってなかったし、BCBのヘルプを見ても使用例がなくてどうも。。
有用な使用例サンプルを出していただけると泣けるほど嬉しいです。
>>732
>C++を勉強した本

どんな本で勉強してるんだよ...
735デフォルトの名無しさん:02/02/04 11:04
>>733
すばらしい。そこみたら即効で理解できてしまいました。
いいとこ教えてもらった〜。ありがとー。

>>734
「CプログラマのためのC++入門」です。
ネームスペースやテンプレートもなかったです。
まだ定まってないようでした。
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄」
―――――――――――――‐┬┘
                        | 
       ____.____    | 
     |        |        |   | 
     |        | ∧_∧ |   | 
     |        |( ´∀`)つ ミ | 古くさい本は投げ捨てろ
     |        |/ ⊃  ノ |   |  □
        ̄ ̄ ̄ ̄' ̄ ̄ ̄ ̄    |
燃やして暖をとろう
738デフォルトの名無しさん:02/02/04 14:43
質問です。
A[0]=1,A[1]=2,A[2]=3
B[0]=4,B[1]=5,B[2]=6,B[3]=7
上記のデータを
vector<vector<int> > IntAry;
で用意して以下の様に格納したいのですが
IntAry[0][0]=1
IntAry[0][1]=2
IntAry[0][2]=3

IntAry[1][0]=4
IntAry[1][1]=5
IntAry[1][2]=6
IntAry[1][3]=7

一発で*Aから*IntAry[0]にコピーする方法がどうも出来ません。
なにか良い方法ありましたらご教授お願いします。
>>735
>「CプログラマのためのC++入門」

Cプログラマ向けの本らしいのにCと違うキャストの種類すら載って
ないとは恐ろしい度胸だね。
classとstructの違いくらいしか載ってないのかね。
入門向けC++本といえば、ろくにSTLと標準ライブラリについて書いてない
のが沢山ありそうだ。Cの本でprintfについて書いてないというのもあまり
ないだろうに。そういうものがSTLの周知を妨げているのかもしれん。
740739:02/02/04 14:51
std::copy(A, A + 2, IntAry[0].begin());
std::copy(B, B + 3, IntAry[1].begin());
一発ってコレの繰り返しじゃ駄目なの?
741740:02/02/04 14:51
>>738ね。
>>739
まぁ、参考文献が『The Programming Language C++ second edition』だったりするからな。
つか、謝辞の日付1992年4月だぞ。古すぎてやめといたほうがいい部類の本かもな。
743デフォルトの名無しさん:02/02/04 15:51
>>740
ありがとうございます。今検証中なのですが
std::copy(IntAry[0], IntAry[0].begin() + 2, C[0]);
逆に書き戻す場合上記ではないのでしょうか。
といいつつエラーが出るのでまずはgoogleしてきます。
744 :02/02/04 15:58
>743
vector の vector の中身は直列な一つのメモリにはならんぞ
745744:02/02/04 15:59
スマソ,勘違いしたっぽい

std::copy(IntAry[0].begin(), IntAry[0].end(), C[0]);

で良いっつー話かな?
746744:02/02/04 16:01
さらにスマソ
std::copy(IntAry[0].begin(), IntAry[0].end(), &C[0]);
だな.
これなら C が配列でも vector でもOK
747ワェス・パラヤ:02/02/04 17:49
「みんな嫌いだぁ!メモリリーク起きちゃえ〜」

#include <iostream.h>
int main()
{
for(int i=0;i < 1000;i++)
int *p=new int;
return 0;
}
748デフォルトの名無しさん:02/02/04 17:58
>>746
出来ました。ありがとうございます。
今度は自分がBYTE配列、相手(C)がLPVOIDの場合に上手く行く様に
頑張ってます。これは同じ様にやれば特に問題なしかな??
749(l)←マムコ:02/02/04 18:01
>>747
while(1){

}

↑じゃないの?
>>747
E-mail欄のコメント書き忘れんなよ
>>747
プログラム終了と同時にメモリは解放されます。
752デフォルトの名無しさん:02/02/07 00:28
boostはここでいいんでしょうか?

boost::threadはPOSIX環境ではPthreadのラッパーとして
機能するみたいですけどLinuxとかSolarisの上ならこれで
SMPで動いてしまうんでしょうか?

これが使えそうならPthreadインターフェイスは捨てたいのですが・・・

# Boostって日本語の解説は少ないですね
>>752
libs/src/thread.cpp 見ると pthread_create() してるから、使ってる POSIX Thread
ライブラリが SMP 対応なら、問題なく SMP で動くと思われ。
754デフォルトの名無しさん:02/02/07 01:52
ショボイ質問。
deleteって配列消すとき、[ ]付けても付けなくてもどっちでもいいんだっけ?
それは何次でもかわらん?
>>754 よくない。
756またりろ:02/02/07 01:59
wsprintf(str, "%d", strlen(ccc));
MessageBox(hWnd, str, "", MB_OK);//////42

wsprintf(str, "%d", strlen(str));
MessageBox(hWnd, str, "", MB_OK);//////48

if(strcmp(ccc,str))MessageBox(hWnd, "同じ", "", MB_OK);

同じっていうメッセージボックスは表示されるから
cccとstrは等しい。でも、strlenの結果が違う。
どうしてなんだろう?
757754:02/02/07 02:00
>>755
素早いレス、どうも。
ついでに
(*a)[5][5] 消す場合、
delete[] a;
で良い?
758またりろ:02/02/07 02:01
あ、分かった。スマソ。
759またりろ:02/02/07 02:06
やっぱり分からん。

wsprintf(buf, "%d", strlen(ccc));
MessageBox(hWnd, buf, "", MB_OK);////// buf=42

wsprintf(buf, "%d", strlen(ptr));
MessageBox(hWnd, buf, "", MB_OK);////// buf=48

if(strcmp(ccc,ptr))MessageBox(hWnd, "同じ", "", MB_OK);

同じっていうメッセージボックスは表示されるから
cccとptrは等しい。でも、strlenの結果が違う。
どうしてなんだろう?
760デフォルトの名無しさん:02/02/07 02:08
>759
strcmp()は比較した文字列が等しいとき0を返す。
だから表示されたということはif()で0以外が評価されてる。
(*a)[5][5] 消す場合、
delete[] a;
aは配列へのポインタだろ? 配列じゃなくて…
762またりろ:02/02/07 02:12
うはっ。ありがとう。そうそう、異なってれば0以外でしたね。
763ドンキホーテかな、おれって?:02/02/07 21:57
試食版で、ms-DOSベースのアンチウイルスソフトって作れますか?
JAVAじゃないと無理ですか?
小一時間の説教覚悟してますんで、出来るか出来ないかをまず回答ください。
764デフォルトの名無しさん:02/02/07 22:19
こんばんは。初めまして。
C++Builderのexeをスタートアップに登録して
起動時にある処理を行いたいのですがその時フォームを非表示
にして処理を行いたいのです。
で,下記の様に記述するとフォームを非表示にできる事は
解ったのですが最初の処理をどこに記述したら良いかよく
解らないのです。
VBの場合だとSub Main()ルーチンに記述するのですが・・・
Formのshowイベントとかはまずいし・・・・・・
参考になる物があったら教えて下さい(T__T)
Application->ShowMainForm = false;
>764
だからそれぞれのプラットフォームのスレ逝けっつーの
>>765
これだな。

新C++Builder相談室
http://pc.2ch.net/test/read.cgi/tech/997074601/
767デフォルトの名無しさん:02/02/08 08:26
C++では、「Cでchar*型をつかっていたような場所では
string型にすべておきかえられる。また、そのほうが効率がいい」
って、どっかの本にかいてあったんだけど、
すべておきかえられるもの?
char*型がいらないってことではないよね?
>>767
corbaのstringってcharにマッピングされてなかったっけ?
というかもし今でもそうなら仕様を変えた方がいいような、、、
すべてなわけはないけど、文字列を扱ってる箇所なら置き換えて良いのでわ。
効率に関してはノーコメント。
>>769
そして可変長バッファは vector で置き換え。

効率は、それまで const char * で渡してきた部分を const string& にすれば、
いずれにせよポインタひとつ分で受け渡せるから問題ない。strdup() の代わり
にコピーコンストラクタってのも悪いトレードオフじゃないし。

気をつけないといけないのは + 演算子なんかを多用して、ソースコードには
直接見えない一時オブジェクトをたくさん作ってしまうことかな。C++ だと、何
気ない 1 ステートメントが、大量のオブジェクト生成/破棄を行うことがある
ので。
771デフォルトの名無しさん:02/02/09 04:52
ねぇ、こういう使いかたってできないの?

class Command{
};
class CommandA:public Command{};
class CommandB:public Command{};
struct TestData{
TCHAR *com;
Command *c;
};
TestData test[]={
{"func1",new CommandA}
};

関数ポインタを使う代わりにコマンドオブジェクトをテーブルにもたせろ
って言われたんだけど、こういうことじゃないのかなぁ?
こんぱいるとおらない。

>>771
俺はそのソースそのままコピペで通るんだけど。
773771:02/02/09 05:19
>>772
おおぉ、
new CommandA()
にしたら、とおった。
そのままじゃむりっぽい。
ちなみに、うちのコンパイラはVC++6です。
ご協力サンクス
774デフォルトの名無しさん:02/02/09 14:59
クラスの中でメンバ関数
void abc::hoge(void) {}
を定義して、クラスの外で
void hoge(void) {}
を定義した場合、

クラスの中でhoge()を読んだ場合、メンバ関数が優先して呼ばれるのでしょうか?
そうならば、クラス内でグローバルな関数を呼びたい場合はどうするのでしょうか?
::hoge()
>>775
できました。ありがとうございます。
777デフォルトの名無しさん:02/02/09 15:52
さまざまなファイルに頻繁にアクセスするプログラムを作っているんですが、
ファイルアクセスに関するエラー処理ってほんとにいるんですかねぇ?

openに失敗した場合の処理はともかくとして、
一旦openに成功した後ではファイルに書き込んでるときのエラー処理とかって
現実におき得ないような気がするんですが・・・

一行書き込む毎に、いちいちエラー処理って入れなきゃならないものなんでしょうか?
メディアが満杯とか
じゃあ かかなきゃえーやんかー
とりあえず空き不足
可能性はある。
ディスクフルとか、
ネットワークファイルシステムでサーバだのルータが落ちたとか、
実はpipeで相手のプロセスが終了してEPIPEとか。
鬱氏
783777:02/02/09 16:03
ふむ。ディスクフル、ネットワークドライブ・・・
ありそうですねぇ。

でもそしたら、たとえば、

ofsFile << "hogehoge" << endl;
if(!ofsFile.fail())
{
 return false;
}
ofsFile << "FunyaFunya" << endl;
if(!ofsFile.fail())
{
 return false;
}

てな感じで毎行毎行入れてかなきゃならないでしょうか?
とても現実的な話ではないような気がするんですが。
>>783
思いっきりシステム依存。他行け
いちいち調べたくないときはラッパー作って例外投げればいいんじゃない?
786777:02/02/09 16:13
>>785
こんなかんじ?

CMyFile::Write(std::ofstream& ofsFile, string strLine)
{
 ofsFile << "hogehoge" << endl;
 if(!ofsFile.fail())
 {
  throw "File Write Error";
 }
}

でもひょっとしてこれの同じものを、ofstreamそのものの例外でもってたりします?
>>777
C++ なんだから、例外で拾うようにすれば、と答えとく。
>>786
ios_base あたりに、書き込み失敗したら例外投げるようにフラグを立てるメソッドが
あったと思うが
>> 783
> とても現実的な話ではないような気がするんですが。

あたりまえなんじゃないの?
フロッピーに書き込みにいって途中で抜いてみるとか、
手元のアプリでためしてみれば?
790777:02/02/09 18:12
>>788
できましたですぅ。ありがとうございますです。

以下サンプル(Zはネットワークドライブ):

openとoutの間でネットワークケーブルを引っこ抜くと、
bbb.txtは何事もなかったかのように終了し、
aaa.txtは例外を発生します。(failbitも立てるとopen時に例外となります。)

try {
std::ofstream ofsbFile("z:\\bbb.txt");
Sleep(10000);
ofsbFile << "bbb" << std::endl;

std::ofstream ofsFile("z:\\aaa.txt");
// ofsFile.exceptions(ios_base::badbit | ios_base::failbit);
ofsFile.exceptions(ios_base::badbit);
Sleep(10000);
ofsFile << "aaa" << std::endl;
}
catch(ios_base::failure& exc)
{
cerr << exc.what() << endl;
}
791デフォルトの名無しさん:02/02/09 22:20
ベクトルクラスを作りたいのですが
クラスに複数のfloatがあるとします
class Vector4
{
public:
....
public:
float x, y, z, w;
};

この時にoperator[]を次のように記述する事はメモリレイアウト上
問題はないのでしょうか?処理系依存でしょうか?
float& Vector::operator [](int i)
{
float *f = &x;
return f[i];
}
上記Vector4::operator []・・・の間違いです
i=0以外は、未定義のはず。なぜ、
switch(i){
case 0:return x;
case 1:return y;
case 2:return z;
case 3:return w;
}
throw RangeException;
と素直にかかないのでしょうか?
794デフォルトの名無しさん:02/02/09 22:52
>>793
やっぱりそうなんですか?
最終的にこれをメンバにした4x4の行列クラスを作りたいのですが
逆行列を求める時などにi, jでアクセスできるとforが使えるから
書きやすいと思うのです

これをやるには一時的に配列に入れるしかないかな?
>これをやるには一時的に配列に入れるしかないかな?

つか、793で書いたのは、まさしくfloat& operator [](int i)の
コードなんだが‥‥
796デフォルトの名無しさん:02/02/09 23:27
>>795
あそうか
すいませんアホデシタ・・・

自分で割り振ってやれば良いんですね
これで逝ってみます有難うございました
>794
union {
 struct { float x, y, z, w; };;
 float f[4];
};
とでもしとくとか。
>797
それってstructのパディングの関係で上手く逝かない事無い?
799798:02/02/09 23:51
悪い,float だったらならないか・・・本当?
実はその辺の知識漏れ怪しいわ.スマソ
たとえfloatが32ビットでアラインメントが64ビットだとしても、float2個で、64ビット境界またがないから、
アラインメントの問題は無いでしょ。
パディングは通常、アラインメントをまたがないと、発生しないのよ。
>>791
class Vector4
{
private:
float f[4];
public:
float& x() {return f[0];}
float x() const {return f[0];}
float& y() {return f[1];}
float y() const {return f[1];}
...
};
としそうなもんだな。()が邪魔っけだが。
float &x = f[0], &y = f[1], &z = f[2], &w = f[3];
で逝けるかもよ。
803791:02/02/10 00:38
みなさん色々有難うございます
>>801も考えたんですが仰るように()がちと邪魔なのと
i, jアクセスはあまり頻繁には使わないのとで
>>793の方法で逝っていますがどれが一番一般的でしょうか?
別にどれがというのは無いかな?
俺は>>797の方法取ってる。
>>804
だが、そもそも union のメモリ配置自体も実装依存じゃない? まぁ、大抵の環境で
は問題は発生しないだろうから、そこまで規格にこだわらなくても良いけど。

いちおう assert(&x == &f[0] && &w == &f[3]); ぐらい入れておくのが吉か。
806デフォルトの名無しさん:02/02/10 01:01
>>797でええんちゃう?
安全性をとるなら>>793だと思うけど。
807デフォルトの名無しさん:02/02/10 21:25
>>791
こんなのはどう

class Vector4
{
float f[4];
public:
float &x,&y,&z,&w;
Vector4() : x(f[0]), y(f[1]), z(f[2]), w(f[3]) {}
float& operator[](int i){return f[i];}
const operator[](int i)const{return f[i];}
};
808807:02/02/10 21:28
ちょい間違い
const float& operator[](int i)const{return f[i];}
>>807
それだと Vector4 のサイズが大きくなるから、ちょっと嫌かと。
810デフォルトの名無しさん:02/02/10 22:35
皆さん set/multiset ってどーゆー時に使います?
シーケンスコンテナとか map/multimap, hash とかは
使い道はだいたい思い浮かぶんですけど,set/multiset
の使い道ってイマイチ思い浮かばないんですが…
思い浮かばないなら使うなって。
使いたいと思ったやつが使うんだろ。
>>810
逐次入力されていく値をソートしたいとき。
813810:02/02/10 23:26
>812
なるほど,そーゆー時は確かにsetを使う価値はありますね.ふむふむ

>811
まぁそー言わんといて下さいよ.
見聞を少しでも広めようというだけなので…
814デフォルトの名無しさん:02/02/11 02:37
ofstreamデフォルトの<<演算子を行う前に独自の処理を入れたいと思い、
ofstreamを継承したクラスを作ってます。

<<operator引数の全パターンを網羅させるのは面倒なので、
以下のように安直な解決策を計ってみました。
よくわからないのがソース中の@、A、Bです。

class CMyFile : public ofstream
{
 public:
  // @ 全引数のパターンを一気に受けたい。
ostream& operator<<(void* input);
};

ostream& CMyFile::operator <<(void *input)
{
 // 独自の処理
 cout << input << std::endl;

 // 親の処理
 // A 親の<<を呼び出したい。
 parent? << input; // ???
 
// B 何を返すの?
  return ???; // ???
}
>814
return ofstream::operator<<(input);

ぢゃマズいかのぅ?
816815:02/02/11 02:58
あぁ,input って void* なのか.
うーん,そりは・・・任せたぞ!他の人!!
817デフォルトの名無しさん:02/02/11 03:22
C++で
int ** foo= new int[10][10];
みたいなことってできないんですか?
>>817
出来ね。
foo[1][1]はどこをさすんだ?
new int[10][10]とnew int[9][9]で別のアドレスをさす必要があるのにint**からじゃわからんだろ。
>>814
template 関数の出番じゃない? 詳細はともかく、こんな感じで。

template <typename T> ostream& (ostream& os, T& input)
820デフォルトの名無しさん:02/02/11 03:34
二次元配列を動的に確保するにはどうすれば良いのでしょう
821デフォルトの名無しさん:02/02/11 03:50
>>818
なにいってんのかわかんねーぞ
822突然すみません・・・:02/02/11 04:13
error LNK2001: unresolved external symbol "void __cdecl fileout(char *)" (?fileout@@YAXPAD@Z)
ってエラーどうやったらいいですか???
ちなみに初心者なんで、やさしくお願いします。
823初学者:02/02/11 04:53
質問です。

C++クラスメンバ関数ないで宣言したstaticな変数ってCのそれを同じと考えて良いですか?
つまり

MYSTRUCT *foo::boo()
{
  static MYSTRUCT mystruct;

  処理

  return &mystruct;
}
として呼び出し側からmystructを使うのは可能ですか?
でもこんなやり方するのかな?
こういう場合は皆さんどうします?構造体をそのまま返すと構造体が大きい場合負荷がかかりますよねぇ。
かといってポインタを返すと実体の生存時間が気になりますよね。
staticメンバにしてみてもべつのに上書きされる可能性があるし。
>>822 __cdecl の fileout(char *)の実体がないらしい探して
>>823 よくわからんけど、俺ならメンバ変数にしてそれのポインタを返すな。
属性も指定できるし。
>823
sigletonの安直な実装としては便利。
826デフォルトの名無しさん:02/02/11 08:32
>>823
可能。ただ、その手で作ったオブジェクトのデストラクトの順番に
気ぃつけるよーに。ただデータ入れただけの構造体なら大丈夫だと思うけど。

> かといってポインタを返すと実体の生存時間が気になりますよね。
std::auto_ptr で返してしまうとか。
827初学者:02/02/11 10:05
>>824-826
ありがとうございます。よくわかりました。ではでは。
newやdeleteのオーバーロードって
よくやりますか?
829814:02/02/11 19:59
>>815 >>819 ども。
お二人の意見を参考につくってみたんですが、リンクエラーが・・・

<テンプレートを使ったメソッド>
template <typename T> ofstream& CMyFile::operator<<(T input)
{
 return ofstream::operator <<(T input);
}

<使用例>
CMyFile cMyFile("XXXX.txt");
cMyFile.readOpen();
int a=1;
cMyFile << a ;

<リンクエラー>
 TestProj.obj : error LNK2001:
外部シンボル ""public: class std::basic_ofstream<char,struct std::char_traits<char> > &
__thiscall CMyFile::operator<<(int)"
(??6CMyFile@@QAEAAV?$basic_ofstream@DU?$char_traits@D@std@@@std@@H@Z)" は未解決です

オペレータでのテンプレートの使い方がよくわからんです。
830815:02/02/11 21:23
>814=829
うーむ g++ 3.0.3 では

template <typename T>
ofstream& CMyFile::operator<<(T input)
{
ofstream::operator<<(input);
return *this;
}

とすれば逝ける模様.

なんでそのまま return 出来ないんぢゃろう・・・
誰か教えてプリーズ
831デフォルトの名無しさん:02/02/12 00:05
誰か教えてケロ。
template<class T>class A
{
 void func(void);
};
void A::func(void){}
見たいに外で関数を定義したいのですがどうしたら良いのでしょうか。
template<class T>void A::func(void){}
833デフォルトの名無しさん:02/02/12 00:15
ん?
template<class T>void A<T>::func(void){}
じゃなかったっけ?
違ったらスマソ。
>>833 そうだった。スマソ。
835831:02/02/12 00:25
>>832-834
おお!ありがとうございます。
今まで、その方法が分からなかったもので。
助かりました。
836デフォルトの名無しさん:02/02/12 17:20
main(){
int * num = new int[1000];
delete num;
}
VC6のコンパイラは配列をdeleteするとき、
delete [] numとしなくてもいいのか?

実行してみても、
Detected memory leaks!
が表示されないだけれども…
VC6のコンパイラで、全てのリークが、検出されるというわけではない。
#つか、detected leakなんて報告するのは、ライブラリでわ‥‥
>>836
intやcharなどの組み込み型なら問題ない模様。
クラスや構造体はデストラクタが呼ばれないのでだめ。
839デフォルトの名無しさん:02/02/12 18:01
>>837
>>838
レスありがとうございます。

www.codeguru.com/richedit/SyntaxColorizer.html

実は、codeguruのCSyntaxColorizerクラスを実行したら、
~CSyntaxColorizer()で落ちるから、
何だろうと思ったら、配列のdeleteに一つも[]がついてないのよ。

それはunsigned shortの配列だったけど、
deleteに[]つけたら解決しました。

"Comments:"で誰も言及してないから、
マジ焦ったよ。
>>836
VC6 だと delete, delete[] は同じ動作をする。(だからといって、これに依存した
コード書いちゃダメだよ)
841814:02/02/13 00:32
>>830
メンバー関数をtemplateで作るときは、宣言部に直接本体を埋め込まないと
うまくいかないみたいですね。

CMyFile : ofstream public
{

template <typename T> bool write(T input)
{
cout << input;
return true;
}
};

それから、よく考えたらoperator<<をオーバーライドしてしまってるので、
望みの動作させるためには、friend関数の力を借りねばならないみたいです・・・・・・・・
842デフォルトの名無しさん:02/02/13 01:49
void func(void){cout<<"Hello"<<endl;}
template<class T1,class T2>
T1(*FUNC)(T2)=&(void func(void));

これなんでエラーになるんでしょう?
どこか間違えていますか??
テンプレートは、関数かクラスに対してしか使えないきがするけど‥‥
>>842
&(void func(void)) じゃなくて &func だろ。
>>844
いいえ。これはエラーにはなっていません。
>>843
確かに。しかし VC6 だと、こんなコードもコンパイル通るな(実行すると落ちるけど)。
もしかしたら、昔は OK だったのかも。

void func(int) {}
template<class T1,class T2> T1 (*f)(T2) = &func;

int
main(void)
{
  (*f)(1);
  return 0;
}
>>840
> VC6 だと delete, delete[] は同じ動作をする
マジですか? VC5 だと delete では配列の解放をしてくれなかったと思ったけど。
class Ca
{
public:
 ~Ca(){cout << "deleted." << endl;}
};

int main(int argc, char* argv[])
{
 Ca* pca = new Ca[16];
 delete pca;
 return 0;
}
deleteとdelete[]でちゃんと動作違うけど。@VC6SP5
>>847
ごめん、勘違いだわ。
#include <iostream>
using namespase std

class<a,b>
int main(void)
double abu;
omaemona-
851超初心者:02/02/13 16:58
FreeBSDでC++
勉強して1時間目です。

今、hello.ccというファイルに、
#include <iostream>

int main()
{
std::cout << "Hello, world!\n";
}
と書き、

$ gcc hello.cc
としたら、
$ gcc hello.cc
/tmp/ccGQTMfz.o: In function `main':
/tmp/ccGQTMfz.o(.text+0xf): undefined reference to `cout'
/tmp/ccGQTMfz.o(.text+0x14): undefined reference to `ostream::operator<<(char const *)'
となりました。

なぜうまくいかないのか説明してください。
> なぜうまくいかないのか説明してください。
って,きっとネタなんだろうな.まぁマジレスしとくと,
使うコマンドは gcc じゃなくって g++ にしろ

ほんでよ,
http://www.freeml.com/message/[email protected]/0001221
でなんか面白い事やってる
853852:02/02/13 17:18
最初の三行は >851へのレスね.
まぁ見りゃ分かると思うけど.
854超初心者:02/02/13 17:38
>>852
gccとg++
ってどうちがうの?
855超初心者:02/02/13 17:48
FreeBSD で XEmacs から C++ をコンパイル,実行する方法
を教えて.
[ESC]X+compile
ってやってからどーすんの?
それぐらい自分でしらべろよ。
なんでもかんでも
おしえて君だと、あとでこまるぞ。
857超初心者:02/02/13 17:54
最初が一番わからんのよ。
有る程度自分の足で立てるまで教えてよ。
>>857
なんでキミのために無料奉仕しなきゃならんのだ?
>854とか>857とか、どう見ても自分の足で立つ意志のある奴の吐くセリフじゃないな(w
Emacs使ってるなら、
M-x info
で>854も>855も解決する。infoの使い方がわからなかったらinfo読め。以上。
860デフォルトの名無しさん:02/02/13 19:52
delete delete[]ですが、組み込み型ならOKなのはVC6だけ
でしょうか?他の環境ではNGですか?
862860:02/02/13 19:59
>>838へのレスでした。
わかりにくくてスマソ
863デフォルトの名無しさん:02/02/13 20:04
>>860
VC6でもたまたまOKなだけだと思った方がいい。
現実にはほとんどの処理系でもOKだけど、悪癖は早いうちに矯正することを
お勧めする。
864860:02/02/13 20:12
>>863
ありがとう!
ちょうどそのネタで上司とちょっと揉めてました(汗)。
上司が [] つけない人なんです。
>>863
スタイルの問題をいうなら、そもそも delete[] を陽に呼び出すようなプログラムを
書くな、という気がするが。std::vector や boost::scoped_array を使うことを考えた
方が良い。
866852:02/02/13 20:37
>854,855
しょーがねーな.まぁ最初は確かにどこから手付けていいか分からんからな.

gcc は C コンパイラ, g++ は C++ コンパイラだと思っとけ.

Emacs の M-X compile は実質上 make を起動するだけだから,make について
お勉強するべし.make についてのサイトは探せば色々見付かるから自分で探
すべし.
867デフォルトの名無しさん:02/02/13 22:10
virtualキーワードについて質問です。
class A
{
 virtual class B
 {
 };
};
このvirtual付けたBってどういう扱いになるんでしょうか?
付けたときと付けない時の違いが分からないもので。
>>867
virtual class B なんて定義は C++ の規格にはないぞ。

virtual を使えるのは

1. メンバ関数
2. 継承

いずれかのみだ。
869デフォルトの名無しさん:02/02/13 22:43
>>868
それが何故か出来るんですよ。
(一応、バージョンは古いけどBCB、VC、GCCでは確認済み)
C++ の規格に無いなら気にしなくていいなっと。
どうもありがと。
エディットボックス上にデスクトップのファイルをドラッグ&ドロップして
エディットボックスにそのドラッグ&ドロップしたファイルのパスを表示してやりたいのですが
どうやったらいいでしょうか?
>>869
最近の gcc だと怒られる。

% g++ test.cpp
test.cpp:4: `virtual' can only be specified for functions
test.cpp:4: virtual outside class declaration
dragqueryfileかなんかで
ファイル名とかとれるでしょ?
>870
プラットフォーム依存の質問はそれぞれのスレへ逝け.
ここはスレ違いだ.
874791:02/02/14 01:10
>>866
アフォですか?
gccはフロントエンドだから.ccなファイルならC++コードのコンパイルが通る

>>851
のエラーメッセージを良く見ろリンカのエラーだろが

正解は
$gcc hello.cc -lstdc++
875!866:02/02/14 01:29
>>874
だから「思っとけ」なんだろ。

なんで、わざわざ煽るかなぁ。(カルシウムが足りてない?)
>>874
名前を消し忘れたな。
791とのギャップにワラタ
877デフォルトの名無しさん:02/02/14 02:27
漏れもワラタ
>>791
>>874を晒しage
private継承をコンポジション
どうやってつかいわけてる?
を→と
void func(void){}
template<typename T>T* t=func;

((void(*)(void))t)();

これは何で落ちるんでしょう?テンプレートはこのような使い方を
してはいけないのでしょうか?
template は関数かクラスだけ。

# …って、「落ちる」??
>>878
private 継承なんて使ったことないなあ。つか、なるべく継承より
コンポジションを使うようにしてるよ。継承のレベルが深くなると
後の保守が大変なんで。
>>880
そんな使い方出来ることすら知らなんだ。
operatorを定義しているのか?
多分それできるのってVCだけでしょ?
>>880
ネタだとは思うが、もしそれが可能だとするなら t をキャストしているのは
無意味。むしろ t<void(*)(void)>() にすべきかと。
template<typename T>T* t;
int main()
{t=func; }
ってやると、
'void(*)(int)'から' *'に変換できないとかすごいことを云われるYO!
これこそホントのvoidポインタなのかな(ワラ
886デフォルトの名無しさん:02/02/15 18:14
どんな単位でクラスをsoやdllに分けるのがいいのか
そういったことを解説してる本やサイトを知ってる人がいたら教えて下さい。
class{
}
クラスはヘッダファイルに書くものですか?
>>887
別に *.cpp の方に書いても良い。

俺は外部に公開したくないクラスについては *.cpp に書いてる。

// 外部に公開するのでヘッダに書く
class Foo {
  struct Impl;
  const std::auto_ptr<Impl> pImpl;
public:
  ...
};

// 実装は外部に公開しないので *.cpp に書く
struct Foo::Impl {
  // いろいろ
};
>>888
勉強になりました。
thanx!!
890デフォルトの名無しさん:02/02/16 01:06
template<typename T>class TCA{};
template<typename U>class TCB{
public:
   friend template<typename A>class TCA<A>;
};

何故エラーに・・・?普通のfrindなら通るのですが・・・。
A-T&T ベル研究所 所長:デニス・M・リッチィ博士
892デフォルトの名無しさん:02/02/16 01:46
>>890
Aのタイプは誰が決めるの?
893デフォルトの名無しさん:02/02/16 01:49
//皆で分担してソースを書くと
const int MIN = 0;
const int MAX = 9;
#include <iostream>

struct A {
int hoge(int i) {//A君が値の範囲チェック
if (i > MIN && i < MAX) return i * 3; return i;
}
};

struct B {
int hoge(int i) {//B君も値の範囲チェック
struct A a; if (i > MIN && i < MAX) return a.hoge(i); return i;
}
};

void main()
{
B b;
int i, num = 8;
if (num > MIN && num < MAX)//メイン君も値の範囲チェック
i = b.hoge(num);
else
i = num;
std::cout << i << std::endl;
}

//のような事が頻出するのですが、そもそも誰が値の範囲チェック
//をするべきとか、決まりはあるのでしょうか?
そんなだからC++って遅いんだ!あ〜納得!
>>893
そりゃ、仕様で決めるだろ。

assert() はあらゆる場所にばら撒いておくが、正常パスの値チェックは仕様で決めた
関数でしかやらない。
>>892
・・・成る程。そりゃそうですよね。型が決定しなけりゃエラーになりますよね。
>893
うちならA・Bの側では一切値のチェックなんてしないよ!
食わせる前にチェックしろと言う仕様。
こう決まってるほうが都合がよくない?
898デフォルトの名無しさん:02/02/16 03:40
え?
>>893の場合ではmain内でチェックする方がいいの?
899初心者:02/02/16 03:47
template<class Type>...
この<>のにはclassとtypenameどちらを使うのが主流なんですか?
本にはclassとあって、さっき見たサイトだとtypenameと書いてありました。
900デフォルトの名無しさん:02/02/16 03:54
ANSI/ISO では汎用関数には typename を、汎用クラスには class を
使うように推奨していますが、古い処理系には typename という予約語
がなく、すべて class で代用していたのです。
ですから古い処理系で書かれたプログラムをコンパイルする互換性と、
これから新しくC++を学んでいく人は、必要に応じて書き分ければ
いいでしょう。
901初心者:02/02/16 04:01
ありがとうございました。
902デフォルトの名無しさん:02/02/16 05:33
int (*p)[10];
とあるとき、
p = new int[5][10];
は分かる。これは組み込み型にかぎれば、
p = (int (*)[10])malloc(5*sizeof(int [10]));
と同じことだよね。

しかし、
p = new int[][10];
の意味が分からない。コンパイルは通るんだが、これは何をやってるの?
サイズを指定しなくていいの?
>>902
うちの gcc(2.95.3) じゃ parse error になったよ。
通るの?
>>903 ども。
VCなら通った。
どうもVCでは、new int[0][10]と解釈されるみたい。
なーんだ。
905デフォルトの名無しさん:02/02/17 13:20
次の様なことがしたいのですが、
class A
{
 void FuncX(void){}
 void FuncY(void){}
 void FuncZ(void){}
public:
 void Call(int sel)
 {
  void (*func[])(void)={FuncX,FuncY,FuncZ};
  func[sel]();
 }
};
メンバー関数からポインタ取って呼び出すことは出来ないのでしょうか。
C++相談室 540より。

class Hoge {
 double (*Hoge::myfunc)(double);
public:
 double func1(double a);
 void setfunc(void) { myfunc = func1; }
 double callfunc(double a ) { return( (this->*(myfunc))(a) ); }
...
};
907名無しさん:02/02/17 14:24
STLPortをインストールしてみたのですが、
e:\program files\microsoft visual studio\vc98\include\stlport-4.5.3\stlport\exception(60) : fatal error C1083: インクルード ファイルがオープンできません。'../include/exception': No such file or directory
のように出てビルドできません。
なんかvc98\includeにファイルを読みに逝ってるみたいなんですが・・・
解決方法を知っている方、いませんでしょうか?
>> 906

コンパイル出来ないものを書くな。

class Hoge {
 double (Hoge::*myfunc)(double);
public:
 double func1(double a);
 void setfunc(void) { myfunc = &Hoge::func1; }
 double callfunc(double a) { return( (this->*myfunc)(a) ); }
};

あと、最近のC++だと&Hoge::func1のように
明確に指定しないといけないみたい。
>>907
stl/_site_config.h を INCLUDE で検索
911905:02/02/17 14:40
>>906,>>908
いままでその方法が分からず、staticにしてやっていました。
どうもありがとうございます。
912デフォルトの名無しさん:02/02/17 15:26
.hで定義したクラスメソッドを.cppでinlineで実装する事って意味ある?
inlineについて小一時間勉強セヨ
>>912
ヘッダで定義したものを *.cpp でも定義したら、そりゃ二重定義で怒られるだろ。
915名無しさん:02/02/17 16:07
>>909
>>910
stl_msvc.hを編集したらパスが変更できたみたいなんですが、
e:\program files\microsoft visual studio\vc98\include\stlport-4.5.3\stlport\stdarg.h(23) : warning C4182: #include のネスト レベルは 546 です; 無限再帰の可能性があります。
e:\program files\microsoft visual studio\vc98\include\stlport-4.5.3\stlport\stdarg.h(23) : fatal error C1076: コンパイラの制限 : ヒープの領域を使い果たしました; 上限を設定するために /Zm オプションを使用してください。
上のようなエラーが出てしまいます・・・
>>915
単にパスの設定をミスって再帰的に同じファイルを #include してるだけだと思うが。

悩みたくなければ ..\vc98\stlport の下に STLport をインストールしとけ。include の
下に入れると、いろいろめんどうだ。
917名無しさん:02/02/17 16:38
# include _STLP_NATIVE_C_HEADER(stdarg.h)
最初からネストするようになってるみたいですが・・・
>>917
違うだろ。

STLport の stdarg.h を #include すると、標準ヘッダの stdarg.h が #include
されるのが正解。そこで設定をミスって STLport の stdarg.h を再度 #include
してるから無限ループにはまってる。

919名無しさん:02/02/17 17:25
うーん、exceptionの方にも同じようなのがあるんですが、
こっちはincludeには入っていないみたいなんですが・・・
>912
「定義」という用語の使い方が間違っているとして、
privateなメソッドならあっても変ではない。
921デフォルトの名無しさん:02/02/17 20:13
new
deleteを使う基準がわかりません。
クラスの中の変数としてそのクラスのヘッダファイルでポインタを宣言した
らデコンストラクタでFreeしてやればいいのでしょうか?
クラスの各関数の中でnewした場合はその関数を出るときにdeleteする必要があるのでしょうか?
それともないのでしょうか?
>>921
とりあえず一から勉強し直した方がいいように思う。…が、まぁいいや。

new で作ったオブジェクトは、どこかで delete しないと消えてくれない。
だから、new したまんま放っておくとメモリリークしたりリソースリークしたりて
よろしくない。ので、使い終わったらどこかで責任持って必ずdeleteせよ。

逆に、「deleteしないと消えない」ことを利用した使い方もある。
関数の中で string xxx; とかやって作ったオブジェクトは、関数から抜けるときに
必ず消えてしまう。これを外までもたせようとしたら、
string* pXxx = new string;
とかやって new で作って返すことになる。この場合関数の中でdeleteしちゃったら
何の意味もないので、別のどこかの関数で delete することになるだろう。

#1 あと、newで作ったのではないオブジェクトは delete するな。

#2 ていうか、new/delete の意味が理解できたら、 auto_ptr を積極的に使え。

以上、健闘を祈る。
その後
#3 でauto_ptrをコンテナに入れようとしてはまる
に一票
#4 そして boost::shared_ptr にたどり着く
>>923
>>924
彼らはEffective STLを読んだばかりで嬉しいのです
そうそして漏れも(w
926超初心者:02/02/18 00:52
>>855
です。

>Emacs の M-X compile は実質上 make を起動するだけだから,make について
>お勉強するべし.make についてのサイトは探せば色々見付かるから自分で探
>すべし.
ちょっとしらべたけど、わからんかった。
Makefileっていうのは、c++ファイルと同じディレクトリ
に作成したらいいんかいな?
で、そのMakefileはc++ファイル作るたびに、
別途用意しなあかんの?
結構めんどくさい気がするんだけど。
汎用性のあるMakefileってないの??
autoconf,automake
>926
M-x compile ってやったらミニバッファに make -k とか出るよな?
それを全部消して gcc hello.cc とでも入力してからENTER。
一行ですまないようだったら、スクリプトファイルにでも書いておいて
そのファイル名を入れればいい。
makeのありがたみがわからないうちはそれで十分。
929デフォルトの名無しさん:02/02/18 01:14
>926
とりあえず調べたサイトを列挙せよ
930デフォルトの名無しさん:02/02/18 01:15
931デフォルトの名無しさん:02/02/18 01:22
 % cat Makefile
 #
 % make hoge
 cc  tmp.c  -o tmp
 %
充分有り難い。
違った宇津
 % make hoge
 cc  hoge.c  -o hoge
 %
933デフォルトの名無しさん:02/02/18 03:04
テキストエディタ作りたいんすけど、文章を選択した範囲に
全角文字、半角文字(できれば英数と仮名を区別)が何文字あるかを
調べるにはどうしたらいいですか???
とりあえず過去ログで「半角」で全検索、もちろんサーチで検索も
してみました。よくわからない・・・です(^-^;
文字コードはSJISかな? 何か便利な関数がありそうな予感してるんですが。
>結構めんどくさい気がするんだけど。
>汎用性のあるMakefileってないの??
ソースと実行ファイルが一対一なら書かなくてもいいの。
デフォルトでルール持ってるから。
これは商用UNIX/Linux/BSD/Windows共通。
どれでも「make 実行ファイル名」だけ。
Visual-Cなら「nmake filename.exe」。
ファイル名拡張子を見て、CかC++かフォートランかパスカルを
起動してくれる。gcc->.cc, Visual-C->.cpp
935デフォルトの名無しさん:02/02/18 03:16
>>926

Makefileはそもそも、どういう目的で作られたのかを考えな!
ちなみにC++のファイルと同じじゃなくちゃいけないって事は無い!
Make は make install でセットアップまでしてくれますな。
(書いてあれば)
汎用性でいえば最強の部類に入ると思われ。
937デフォルトの名無しさん:02/02/18 07:41
マウスの位置やボタン状態、キーの状態(できれば押した瞬間でなく取得する度に
今押されているかどうかを知りたい)を取得したいのですが、APIからのメッセージ
は一度に一つしか送られてこないので使い勝手が悪いです。なにか良い関数は
あるでしょうか?
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は通らないのですか・・・
残念。