■過去ログ置き場に戻る■ 1- 前250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 Part4
751 名前:デフォルトの名無しさん :02/02/04 18:27
>>747
プログラム終了と同時にメモリは解放されます。

752 名前:デフォルトの名無しさん :02/02/07 00:28
boostはここでいいんでしょうか?

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

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

# Boostって日本語の解説は少ないですね


753 名前:デフォルトの名無しさん :02/02/07 01:02
>>752
libs/src/thread.cpp 見ると pthread_create() してるから、使ってる POSIX Thread
ライブラリが SMP 対応なら、問題なく SMP で動くと思われ。

754 名前:デフォルトの名無しさん :02/02/07 01:52
ショボイ質問。
deleteって配列消すとき、[ ]付けても付けなくてもどっちでもいいんだっけ?
それは何次でもかわらん?

755 名前:デフォルトの名無しさん :02/02/07 01:54
>>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の結果が違う。
どうしてなんだろう?

757 名前:754 :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以外が評価されてる。


761 名前:デフォルトの名無しさん :02/02/07 02:12
(*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;


765 名前:デフォルトの名無しさん :02/02/07 23:12
>764
だからそれぞれのプラットフォームのスレ逝けっつーの


766 名前:デフォルトの名無しさん :02/02/07 23:16
>>765
これだな。

新C++Builder相談室
http://pc.2ch.net/test/read.cgi/tech/997074601/


767 名前:デフォルトの名無しさん :02/02/08 08:26
C++では、「Cでchar*型をつかっていたような場所では
string型にすべておきかえられる。また、そのほうが効率がいい」
って、どっかの本にかいてあったんだけど、
すべておきかえられるもの?
char*型がいらないってことではないよね?

768 名前:デフォルトの名無しさん :02/02/08 08:52
>>767
corbaのstringってcharにマッピングされてなかったっけ?
というかもし今でもそうなら仕様を変えた方がいいような、、、

769 名前:デフォルトの名無しさん :02/02/08 20:57
すべてなわけはないけど、文字列を扱ってる箇所なら置き換えて良いのでわ。
効率に関してはノーコメント。

770 名前:デフォルトの名無しさん :02/02/08 21:20
>>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}
};

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



772 名前:デフォルトの名無しさん :02/02/09 05:05
>>771
俺はそのソースそのままコピペで通るんだけど。

773 名前:771 :02/02/09 05:19
>>772
おおぉ、
new CommandA()
にしたら、とおった。
そのままじゃむりっぽい。
ちなみに、うちのコンパイラはVC++6です。
ご協力サンクス

774 名前:デフォルトの名無しさん :02/02/09 14:59
クラスの中でメンバ関数
void abc::hoge(void) {}
を定義して、クラスの外で
void hoge(void) {}
を定義した場合、

クラスの中でhoge()を読んだ場合、メンバ関数が優先して呼ばれるのでしょうか?
そうならば、クラス内でグローバルな関数を呼びたい場合はどうするのでしょうか?

775 名前:デフォルトの名無しさん :02/02/09 15:05
::hoge()

776 名前:デフォルトの名無しさん :02/02/09 15:08
>>775
できました。ありがとうございます。

777 名前:デフォルトの名無しさん :02/02/09 15:52
さまざまなファイルに頻繁にアクセスするプログラムを作っているんですが、
ファイルアクセスに関するエラー処理ってほんとにいるんですかねぇ?

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

一行書き込む毎に、いちいちエラー処理って入れなきゃならないものなんでしょうか?


778 名前:デフォルトの名無しさん :02/02/09 15:55
メディアが満杯とか

779 名前:デフォルトの名無しさん :02/02/09 15:56
じゃあ かかなきゃえーやんかー

780 名前:デフォルトの名無しさん :02/02/09 15:57
とりあえず空き不足

781 名前:デフォルトの名無しさん :02/02/09 15:57
可能性はある。
ディスクフルとか、
ネットワークファイルシステムでサーバだのルータが落ちたとか、
実はpipeで相手のプロセスが終了してEPIPEとか。


782 名前:デフォルトの名無しさん :02/02/09 15:57
鬱氏

783 名前:777 :02/02/09 16:03
ふむ。ディスクフル、ネットワークドライブ・・・
ありそうですねぇ。

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

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

てな感じで毎行毎行入れてかなきゃならないでしょうか?
とても現実的な話ではないような気がするんですが。

784 名前:デフォルトの名無しさん :02/02/09 16:04
>>783
思いっきりシステム依存。他行け

785 名前:デフォルトの名無しさん :02/02/09 16:05
いちいち調べたくないときはラッパー作って例外投げればいいんじゃない?

786 名前:777 :02/02/09 16:13
>>785
こんなかんじ?

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

でもひょっとしてこれの同じものを、ofstreamそのものの例外でもってたりします?

787 名前:デフォルトの名無しさん :02/02/09 16:21
>>777
C++ なんだから、例外で拾うようにすれば、と答えとく。

788 名前:デフォルトの名無しさん :02/02/09 16:22
>>786
ios_base あたりに、書き込み失敗したら例外投げるようにフラグを立てるメソッドが
あったと思うが

789 名前:デフォルトの名無しさん :02/02/09 16:28
>> 783
> とても現実的な話ではないような気がするんですが。

あたりまえなんじゃないの?
フロッピーに書き込みにいって途中で抜いてみるとか、
手元のアプリでためしてみれば?


790 名前:777 :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];
}


792 名前:デフォルトの名無しさん :02/02/09 22:21
上記Vector4::operator []・・・の間違いです

793 名前:デフォルトの名無しさん :02/02/09 22:37
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が使えるから
書きやすいと思うのです

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

795 名前:デフォルトの名無しさん :02/02/09 23:19
>これをやるには一時的に配列に入れるしかないかな?

つか、793で書いたのは、まさしくfloat& operator [](int i)の
コードなんだが‥‥

796 名前:デフォルトの名無しさん :02/02/09 23:27
>>795
あそうか
すいませんアホデシタ・・・

自分で割り振ってやれば良いんですね
これで逝ってみます有難うございました

797 名前:デフォルトの名無しさん :02/02/09 23:30
>794
union {
 struct { float x, y, z, w; };;
 float f[4];
};
とでもしとくとか。

798 名前:デフォルトの名無しさん :02/02/09 23:48
>797
それってstructのパディングの関係で上手く逝かない事無い?

799 名前:798 :02/02/09 23:51
悪い,float だったらならないか・・・本当?
実はその辺の知識漏れ怪しいわ.スマソ

800 名前:デフォルトの名無しさん :02/02/09 23:58
たとえfloatが32ビットでアラインメントが64ビットだとしても、float2個で、64ビット境界またがないから、
アラインメントの問題は無いでしょ。
パディングは通常、アラインメントをまたがないと、発生しないのよ。

801 名前:デフォルトの名無しさん :02/02/09 23:59
>>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];}
...
};
としそうなもんだな。()が邪魔っけだが。

802 名前:デフォルトの名無しさん :02/02/10 00:06
float &x = f[0], &y = f[1], &z = f[2], &w = f[3];
で逝けるかもよ。

803 名前:791 :02/02/10 00:38
みなさん色々有難うございます
>>801も考えたんですが仰るように()がちと邪魔なのと
i, jアクセスはあまり頻繁には使わないのとで
>>793の方法で逝っていますがどれが一番一般的でしょうか?
別にどれがというのは無いかな?

804 名前:デフォルトの名無しさん :02/02/10 00:57
俺は>>797の方法取ってる。

805 名前:デフォルトの名無しさん :02/02/10 01:01
>>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];}
};

808 名前:807 :02/02/10 21:28
ちょい間違い
const float& operator[](int i)const{return f[i];}

809 名前:デフォルトの名無しさん :02/02/10 21:29
>>807
それだと Vector4 のサイズが大きくなるから、ちょっと嫌かと。

810 名前:デフォルトの名無しさん :02/02/10 22:35
皆さん set/multiset ってどーゆー時に使います?
シーケンスコンテナとか map/multimap, hash とかは
使い道はだいたい思い浮かぶんですけど,set/multiset
の使い道ってイマイチ思い浮かばないんですが…


811 名前:デフォルトの名無しさん :02/02/10 22:45
思い浮かばないなら使うなって。
使いたいと思ったやつが使うんだろ。

812 名前:デフォルトの名無しさん :02/02/10 23:15
>>810
逐次入力されていく値をソートしたいとき。


813 名前:810 :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 ???; // ???
}

815 名前:デフォルトの名無しさん :02/02/11 02:57
>814
return ofstream::operator<<(input);

ぢゃマズいかのぅ?

816 名前:815 :02/02/11 02:58
あぁ,input って void* なのか.
うーん,そりは・・・任せたぞ!他の人!!


817 名前:デフォルトの名無しさん :02/02/11 03:22
C++で
int ** foo= new int[10][10];
みたいなことってできないんですか?

818 名前:デフォルトの名無しさん :02/02/11 03:27
>>817
出来ね。
foo[1][1]はどこをさすんだ?
new int[10][10]とnew int[9][9]で別のアドレスをさす必要があるのにint**からじゃわからんだろ。

819 名前:デフォルトの名無しさん :02/02/11 03:33
>>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メンバにしてみてもべつのに上書きされる可能性があるし。

824 名前:デフォルトの名無しさん :02/02/11 05:07
>>822 __cdecl の fileout(char *)の実体がないらしい探して
>>823 よくわからんけど、俺ならメンバ変数にしてそれのポインタを返すな。
属性も指定できるし。

825 名前:デフォルトの名無しさん :02/02/11 06:03
>823
sigletonの安直な実装としては便利。

826 名前:デフォルトの名無しさん :02/02/11 08:32
>>823
可能。ただ、その手で作ったオブジェクトのデストラクトの順番に
気ぃつけるよーに。ただデータ入れただけの構造体なら大丈夫だと思うけど。

> かといってポインタを返すと実体の生存時間が気になりますよね。
std::auto_ptr で返してしまうとか。

827 名前:初学者 :02/02/11 10:05
>>824-826
ありがとうございます。よくわかりました。ではでは。

828 名前:デフォルトの名無しさん :02/02/11 13:22
newやdeleteのオーバーロードって
よくやりますか?

829 名前:814 :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)" は未解決です

オペレータでのテンプレートの使い方がよくわからんです。

830 名前:815 :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){}
見たいに外で関数を定義したいのですがどうしたら良いのでしょうか。

832 名前:デフォルトの名無しさん :02/02/12 00:08
template<class T>void A::func(void){}

833 名前:デフォルトの名無しさん :02/02/12 00:15
ん?
template<class T>void A<T>::func(void){}
じゃなかったっけ?
違ったらスマソ。

834 名前:デフォルトの名無しさん :02/02/12 00:18
>>833 そうだった。スマソ。

835 名前:831 :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!
が表示されないだけれども…

837 名前:デフォルトの名無しさん :02/02/12 17:28
VC6のコンパイラで、全てのリークが、検出されるというわけではない。
#つか、detected leakなんて報告するのは、ライブラリでわ‥‥

838 名前:デフォルトの名無しさん :02/02/12 17:30
>>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:"で誰も言及してないから、
マジ焦ったよ。


840 名前:デフォルトの名無しさん :02/02/12 20:13
>>836
VC6 だと delete, delete[] は同じ動作をする。(だからといって、これに依存した
コード書いちゃダメだよ)

841 名前:814 :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));

これなんでエラーになるんでしょう?
どこか間違えていますか??

843 名前:デフォルトの名無しさん :02/02/13 01:54
テンプレートは、関数かクラスに対してしか使えないきがするけど‥‥

844 名前:デフォルトの名無しさん :02/02/13 01:55
>>842
&(void func(void)) じゃなくて &func だろ。

845 名前:デフォルトの名無しさん :02/02/13 02:00
>>844
いいえ。これはエラーにはなっていません。

846 名前:デフォルトの名無しさん :02/02/13 02:00
>>843
確かに。しかし VC6 だと、こんなコードもコンパイル通るな(実行すると落ちるけど)。
もしかしたら、昔は OK だったのかも。

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

int
main(void)
{
  (*f)(1);
  return 0;
}

847 名前:デフォルトの名無しさん :02/02/13 10:05
>>840
> VC6 だと delete, delete[] は同じ動作をする
マジですか? VC5 だと delete では配列の解放をしてくれなかったと思ったけど。


848 名前:デフォルトの名無しさん :02/02/13 10:21
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


849 名前:デフォルトの名無しさん :02/02/13 14:05
>>847
ごめん、勘違いだわ。

850 名前:デフォルトの名無しさん :02/02/13 14:20
#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 *)'
となりました。

なぜうまくいかないのか説明してください。

852 名前:デフォルトの名無しさん :02/02/13 17:16
> なぜうまくいかないのか説明してください。
って,きっとネタなんだろうな.まぁマジレスしとくと,
使うコマンドは gcc じゃなくって g++ にしろ

ほんでよ,
http://www.freeml.com/message/cppll@freeml.com/0001221
でなんか面白い事やってる


853 名前:852 :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
ってやってからどーすんの?

856 名前:デフォルトの名無しさん :02/02/13 17:52
それぐらい自分でしらべろよ。
なんでもかんでも
おしえて君だと、あとでこまるぞ。

857 名前:超初心者 :02/02/13 17:54
最初が一番わからんのよ。
有る程度自分の足で立てるまで教えてよ。

858 名前:デフォルトの名無しさん :02/02/13 18:36
>>857
なんでキミのために無料奉仕しなきゃならんのだ?

859 名前:デフォルトの名無しさん :02/02/13 18:47
>854とか>857とか、どう見ても自分の足で立つ意志のある奴の吐くセリフじゃないな(w
Emacs使ってるなら、
M-x info
>854>855も解決する。infoの使い方がわからなかったらinfo読め。以上。

860 名前:デフォルトの名無しさん :02/02/13 19:52
delete delete[]ですが、組み込み型ならOKなのはVC6だけ
でしょうか?他の環境ではNGですか?


861 名前:デフォルトの名無しさん :02/02/13 19:54


862 名前:860 :02/02/13 19:59
>>838へのレスでした。
わかりにくくてスマソ

863 名前:デフォルトの名無しさん :02/02/13 20:04
>>860
VC6でもたまたまOKなだけだと思った方がいい。
現実にはほとんどの処理系でもOKだけど、悪癖は早いうちに矯正することを
お勧めする。

864 名前:860 :02/02/13 20:12
>>863
ありがとう!
ちょうどそのネタで上司とちょっと揉めてました(汗)。
上司が [] つけない人なんです。

865 名前:デフォルトの名無しさん :02/02/13 20:14
>>863
スタイルの問題をいうなら、そもそも delete[] を陽に呼び出すようなプログラムを
書くな、という気がするが。std::vector や boost::scoped_array を使うことを考えた
方が良い。

866 名前:852 :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ってどういう扱いになるんでしょうか?
付けたときと付けない時の違いが分からないもので。

868 名前:デフォルトの名無しさん :02/02/13 22:19
>>867
virtual class B なんて定義は C++ の規格にはないぞ。

virtual を使えるのは

1. メンバ関数
2. 継承

いずれかのみだ。

869 名前:デフォルトの名無しさん :02/02/13 22:43
>>868
それが何故か出来るんですよ。
(一応、バージョンは古いけどBCB、VC、GCCでは確認済み)
C++ の規格に無いなら気にしなくていいなっと。
どうもありがと。

870 名前:デフォルトの名無しさん :02/02/13 22:50
エディットボックス上にデスクトップのファイルをドラッグ&ドロップして
エディットボックスにそのドラッグ&ドロップしたファイルのパスを表示してやりたいのですが
どうやったらいいでしょうか?


871 名前:デフォルトの名無しさん :02/02/13 22:52
>>869
最近の gcc だと怒られる。

% g++ test.cpp
test.cpp:4: `virtual' can only be specified for functions
test.cpp:4: virtual outside class declaration

872 名前:デフォルトの名無しさん :02/02/13 23:07
dragqueryfileかなんかで
ファイル名とかとれるでしょ?

873 名前:デフォルトの名無しさん :02/02/13 23:27
>870
プラットフォーム依存の質問はそれぞれのスレへ逝け.
ここはスレ違いだ.

874 名前:791 :02/02/14 01:10
>>866
アフォですか?
gccはフロントエンドだから.ccなファイルならC++コードのコンパイルが通る

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

正解は
$gcc hello.cc -lstdc++


875 名前:!866 :02/02/14 01:29
>>874
だから「思っとけ」なんだろ。

なんで、わざわざ煽るかなぁ。(カルシウムが足りてない?)

876 名前:デフォルトの名無しさん :02/02/14 02:12
>>874
名前を消し忘れたな。
791とのギャップにワラタ

877 名前:デフォルトの名無しさん :02/02/14 02:27
漏れもワラタ
>>791
>>874を晒しage

878 名前:デフォルトの名無しさん :02/02/14 19:20
private継承をコンポジション
どうやってつかいわけてる?


879 名前:デフォルトの名無しさん :02/02/14 19:20
を→と

880 名前:デフォルトの名無しさん :02/02/14 22:48
void func(void){}
template<typename T>T* t=func;

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

これは何で落ちるんでしょう?テンプレートはこのような使い方を
してはいけないのでしょうか?

881 名前:デフォルトの名無しさん :02/02/14 23:30
template は関数かクラスだけ。

# …って、「落ちる」??

882 名前:デフォルトの名無しさん :02/02/15 01:00
>>878
private 継承なんて使ったことないなあ。つか、なるべく継承より
コンポジションを使うようにしてるよ。継承のレベルが深くなると
後の保守が大変なんで。


883 名前:デフォルトの名無しさん :02/02/15 07:25
>>880
そんな使い方出来ることすら知らなんだ。
operatorを定義しているのか?
多分それできるのってVCだけでしょ?

884 名前:デフォルトの名無しさん :02/02/15 11:09
>>880
ネタだとは思うが、もしそれが可能だとするなら t をキャストしているのは
無意味。むしろ t<void(*)(void)>() にすべきかと。


885 名前:デフォルトの名無しさん :02/02/15 11:18
template<typename T>T* t;
int main()
{t=func; }
ってやると、
'void(*)(int)'から' *'に変換できないとかすごいことを云われるYO!
これこそホントのvoidポインタなのかな(ワラ

886 名前:デフォルトの名無しさん :02/02/15 18:14
どんな単位でクラスをsoやdllに分けるのがいいのか
そういったことを解説してる本やサイトを知ってる人がいたら教えて下さい。

887 名前:デフォルトの名無しさん :02/02/15 22:49
class{
}
クラスはヘッダファイルに書くものですか?

888 名前:デフォルトの名無しさん :02/02/15 23:59
>>887
別に *.cpp の方に書いても良い。

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

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

// 実装は外部に公開しないので *.cpp に書く
struct Foo::Impl {
  // いろいろ
};

889 名前:デフォルトの名無しさん :02/02/16 00:28
>>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なら通るのですが・・・。

891 名前:デフォルトの名無しさん :02/02/16 01:15
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;
}

//のような事が頻出するのですが、そもそも誰が値の範囲チェック
//をするべきとか、決まりはあるのでしょうか?

894 名前:デフォルトの名無しさん :02/02/16 01:57
そんなだからC++って遅いんだ!あ〜納得!

895 名前:デフォルトの名無しさん :02/02/16 02:09
>>893
そりゃ、仕様で決めるだろ。

assert() はあらゆる場所にばら撒いておくが、正常パスの値チェックは仕様で決めた
関数でしかやらない。

896 名前:デフォルトの名無しさん :02/02/16 02:23
>>892
・・・成る程。そりゃそうですよね。型が決定しなけりゃエラーになりますよね。

897 名前:デフォルトの名無しさん :02/02/16 02:54
>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];
の意味が分からない。コンパイルは通るんだが、これは何をやってるの?
サイズを指定しなくていいの?

903 名前:デフォルトの名無しさん :02/02/16 06:42
>>902
うちの gcc(2.95.3) じゃ parse error になったよ。
通るの?

904 名前:デフォルトの名無しさん :02/02/16 07:32
>>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]();
 }
};
メンバー関数からポインタ取って呼び出すことは出来ないのでしょうか。

906 名前:デフォルトの名無しさん :02/02/17 13:29
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にファイルを読みに逝ってるみたいなんですが・・・
解決方法を知っている方、いませんでしょうか?

908 名前:デフォルトの名無しさん :02/02/17 14:25
>> 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のように
明確に指定しないといけないみたい。

909 名前:デフォルトの名無しさん :02/02/17 14:28
http://pc.2ch.net/test/read.cgi/tech/1006834463/n885-

910 名前:デフォルトの名無しさん :02/02/17 14:31
>>907
stl/_site_config.h を INCLUDE で検索

911 名前:905 :02/02/17 14:40
>>906,>>908
いままでその方法が分からず、staticにしてやっていました。
どうもありがとうございます。

912 名前:デフォルトの名無しさん :02/02/17 15:26
.hで定義したクラスメソッドを.cppでinlineで実装する事って意味ある?

913 名前:デフォルトの名無しさん :02/02/17 15:28
inlineについて小一時間勉強セヨ

914 名前:デフォルトの名無しさん :02/02/17 16:07
>>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 オプションを使用してください。
上のようなエラーが出てしまいます・・・


916 名前:デフォルトの名無しさん :02/02/17 16:12
>>915
単にパスの設定をミスって再帰的に同じファイルを #include してるだけだと思うが。

悩みたくなければ ..\vc98\stlport の下に STLport をインストールしとけ。include の
下に入れると、いろいろめんどうだ。

917 名前:名無しさん :02/02/17 16:38
# include _STLP_NATIVE_C_HEADER(stdarg.h)
最初からネストするようになってるみたいですが・・・

918 名前:デフォルトの名無しさん :02/02/17 16:42
>>917
違うだろ。

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



919 名前:名無しさん :02/02/17 17:25
うーん、exceptionの方にも同じようなのがあるんですが、
こっちはincludeには入っていないみたいなんですが・・・

920 名前:デフォルトの名無しさん :02/02/17 17:37
>912
「定義」という用語の使い方が間違っているとして、
privateなメソッドならあっても変ではない。

921 名前:デフォルトの名無しさん :02/02/17 20:13
new
deleteを使う基準がわかりません。
クラスの中の変数としてそのクラスのヘッダファイルでポインタを宣言した
らデコンストラクタでFreeしてやればいいのでしょうか?
クラスの各関数の中でnewした場合はその関数を出るときにdeleteする必要があるのでしょうか?
それともないのでしょうか?

922 名前:デフォルトの名無しさん :02/02/17 20:27
>>921
とりあえず一から勉強し直した方がいいように思う。…が、まぁいいや。

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

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

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

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

以上、健闘を祈る。

923 名前:デフォルトの名無しさん :02/02/17 21:00
その後
#3 でauto_ptrをコンテナに入れようとしてはまる
に一票


924 名前:デフォルトの名無しさん :02/02/17 22:24
#4 そして boost::shared_ptr にたどり着く

925 名前:デフォルトの名無しさん :02/02/17 22:33
>>923
>>924
彼らはEffective STLを読んだばかりで嬉しいのです
そうそして漏れも(w

926 名前:超初心者 :02/02/18 00:52
>>855
です。

>Emacs の M-X compile は実質上 make を起動するだけだから,make について
>お勉強するべし.make についてのサイトは探せば色々見付かるから自分で探
>すべし.
ちょっとしらべたけど、わからんかった。
Makefileっていうのは、c++ファイルと同じディレクトリ
に作成したらいいんかいな?
で、そのMakefileはc++ファイル作るたびに、
別途用意しなあかんの?
結構めんどくさい気がするんだけど。
汎用性のあるMakefileってないの??


927 名前:デフォルトの名無しさん :02/02/18 00:58
autoconf,automake

928 名前:デフォルトの名無しさん :02/02/18 01:11
>926
M-x compile ってやったらミニバッファに make -k とか出るよな?
それを全部消して gcc hello.cc とでも入力してからENTER。
一行ですまないようだったら、スクリプトファイルにでも書いておいて
そのファイル名を入れればいい。
makeのありがたみがわからないうちはそれで十分。

929 名前:デフォルトの名無しさん :02/02/18 01:14
>926
とりあえず調べたサイトを列挙せよ

930 名前:デフォルトの名無しさん :02/02/18 01:15
http://pc.2ch.net/test/read.cgi/tech/1009071535/

931 名前:デフォルトの名無しさん :02/02/18 01:22
 % cat Makefile
 #
 % make hoge
 cc  tmp.c  -o tmp
 %
充分有り難い。

932 名前:デフォルトの名無しさん :02/02/18 01:23
違った宇津
 % make hoge
 cc  hoge.c  -o hoge
 %

933 名前:デフォルトの名無しさん :02/02/18 03:04
テキストエディタ作りたいんすけど、文章を選択した範囲に
全角文字、半角文字(できれば英数と仮名を区別)が何文字あるかを
調べるにはどうしたらいいですか???
とりあえず過去ログで「半角」で全検索、もちろんサーチで検索も
してみました。よくわからない・・・です(^-^;
文字コードはSJISかな? 何か便利な関数がありそうな予感してるんですが。

934 名前:デフォルトの名無しさん :02/02/18 03:10
>結構めんどくさい気がするんだけど。
>汎用性のある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++のファイルと同じじゃなくちゃいけないって事は無い!

936 名前:デフォルトの名無しさん :02/02/18 03:42
Make は make install でセットアップまでしてくれますな。
(書いてあれば)
汎用性でいえば最強の部類に入ると思われ。

937 名前:デフォルトの名無しさん :02/02/18 07:41
マウスの位置やボタン状態、キーの状態(できれば押した瞬間でなく取得する度に
今押されているかどうかを知りたい)を取得したいのですが、APIからのメッセージ
は一度に一つしか送られてこないので使い勝手が悪いです。なにか良い関数は
あるでしょうか?

938 名前:937 :02/02/18 07:45
すいません、キー状態ってのはどのキーが押されているかではなく、
どれか一つでもキーが押されているかどうか知らせてくれる、ってことです。
マウスとキーを同時に扱えない(メッセージが1つ&瞬間なので)ので困ってます。

939 名前:デフォルトの名無しさん :02/02/18 07:49
Windowsならdirectinput使うのはどうでしょう

940 名前:デフォルトの名無しさん :02/02/18 07:52
>>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++;
}
こんな感じで数えりゃいいんでないの?
↑には流れしか書いてないから実装は自分で好きなようにどーぞ。

941 名前:937 :02/02/18 08:14
>>939
ありがとうございます。ちょっとやってみます。

942 名前:デフォルトの名無しさん :02/02/18 17:45
>>940
さんくす! そんな関数あったんやね。
isSingleByteCharはC++にあるん? 半角カナも取得したいっすな。
さすがにもうちょい自分で調べまっす。

943 名前:940 :02/02/18 18:33
>>940
そんな関数は無いから自分で作れゆーとるんじゃゴルァ (゚д゚ )
iskanji とか ismbcslead とか何かそんなのはあるかもしれんが。

ガンバッテーネ。

944 名前:940 :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
抽象クラスは戻り値の型に使えないのですか?

947 名前:デフォルトの名無しさん :02/02/18 23:22
純粋仮想関数じゃエラーでるんじゃないの?


948 名前:デフォルトの名無しさん :02/02/18 23:23
>>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;

とかだとどうもポインタが出てきて嫌なんですが…。
かといって参照だとスコープとかの関係で無理っぽいし…。
というわけでかっこいい書き方をおしえてください。


952 名前:デフォルトの名無しさん :02/02/18 23:54
>>948
え?なんで?

953 名前:デフォルトの名無しさん :02/02/19 00:03
>>952
ポインタじゃないからって事じゃない?

954 名前:デフォルトの名無しさん :02/02/19 00:51
このスレ見てると
C++が使える人がそんなに多くないのと、
C++にあこがれる人がまだ沢山いるのとの
二つがよく分かって少し安心しました。

955 名前:デフォルトの名無しさん :02/02/19 01:19
>951
それでいいんじゃん,別に.見て何やってんのかスグ分かるし.
まぁあとは3項演算子使いたければ使えってぐらいで.

ただ ifs っつーと ifstream を連想するのは漏れだけ?
istream だったら・・・ is ・・・ かなぁ?

956 名前:名無しさん :02/02/19 01:34
http://ex.2ch.net/test/read.cgi/entrance/1013876601/l50
>683

IDカコイイ

957 名前:デフォルトの名無しさん :02/02/19 07:02
>>953
ポインタ返しにすればいいわけね。
ほんと、俺はバカだな。ありがとう。

958 名前:デフォルトの名無しさん :02/02/19 10:03
>>951
ifstream(name)の生存期間が不明だからあまり具体的にはアドバイス
出来ないけど、ひとつの関数で作業をやりすぎてないか?
実際のコードではint iじゃなくて、もっといろいろ入力するんだろ?

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

という二つの作業があるんだから、別の関数に分けた方が
いいと思うぞ。そうやって構造をスッキリさせれば、ポインタを
なくす方法も見えてくるはずだ。

959 名前:デフォルトの名無しさん :02/02/19 23:31
static関数のなかでクラスの変数にアクセスするにはどうしたら良いのでしょうか?
クラスにflag変数をもっておいて
そのflagの値によってstatic関数の中で処理を変化させたいのです。
クラス内でstatic BOOL flagを宣言するとコンパイラは通るのですが、
実行ができません。

960 名前:デフォルトの名無しさん :02/02/19 23:47
>959
誰もが平均0.6回は通る道だな。
クラスの外側(ソースファイルのどれか)で static BOOL xxx::flag; と定義すれ。

961 名前:デフォルトの名無しさん :02/02/20 00:04
>960
でもそれだったらリンカエラー出るからそーゆー話じゃないんじゃない?
>959
> static (でprivate or protected) な関数の処理をメンバ変数の値によって
> 挙動を変えたい
という意味不明の事を言ってるように見えるのはヲレの日本語能力が足りない
からかな?

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



962 名前:959 :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かそうでないのか)持たすのが一番良いでしょうか?

963 名前:デフォルトの名無しさん :02/02/20 01:02
当て嵌るかどうかは不明だが、このような要求のあるケースとして、
thisをもらえない関数であるウインドウプロシジャー/
コールバック関数からメンバー関数を使いたいということある。
マックならウインドウのプロパティにクラスへのポインタを
セットする。ウインドウのプロパティからそのウインドウを
作成したインスタンスを参照する。
WindowsならばGetWindowLongのユーザーデータを使用したい
ところだなと、マニュアルを見ながら思った。


964 名前:デフォルトの名無しさん :02/02/20 01:49
>962
SortItemsの第2引数で工夫してflagの値も引き渡すようにするのが筋ではないかと。
たとえば、サブアイテムの個数がWORDの範囲を超えないのなら
MAKELONG(pNMListView->iSubItem, flag) としてみるとか。

965 名前:デフォルトの名無しさん :02/02/20 02:00
>>959
そのstatic関数に、該当するインスタンスのポインタを渡してやればいいんじゃないの?
全体がどーゆーデザインになってるのか見当がつかんが。

966 名前:デフォルトの名無しさん :02/02/20 02:04
CListViewで項目の間のバーをドラッグしたときにウインドウに
送られるメッセージは何でしょうか?
Spy++を使ってみましたが量が多すぎてよくわかりませんでした。

967 名前:デフォルトの名無しさん :02/02/20 02:08
Visual C++ でSTLを使うようになってから
Debugビルドでは平気なのにReleaseビルド
すると計算結果がおかしくりました。私が
悪いのでしょうか?

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




968 名前:デフォルトの名無しさん :02/02/20 02:48
>>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++をメインで使うプロジェクトに参加することになりました。
よろしく

970 名前:デフォルトの名無しさん :02/02/20 11:01
>966
VCスレ逝け

971 名前:デフォルトの名無しさん :02/02/20 11:43
もしかして
  VC++ == C++
と思ってる奴って多くない?

972 名前:デフォルトの名無しさん :02/02/20 15:12
>971
operator == の定義によると思われ。

973 名前:デフォルトの名無しさん :02/02/20 15:51
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;

何故にエラーになる・・・???

976 名前:デフォルトの名無しさん :02/02/20 21:31
>> の間に空白入れてっか?

977 名前:デフォルトの名無しさん :02/02/20 21:38
> >

ここにスペースがないと >>演算子とカンチガイしてしまう

978 名前:デフォルトの名無しさん :02/02/20 21:42
>>976,977

をを、そうだったのですか。
動きました♪有難うございます♪

979 名前:デフォルトの名無しさん :02/02/20 22:26
C言語の基礎を工業高校時代に習ったのですがC++とはC言語の基礎が役にたちますか?
それとも普通のC言語とはまったくの別物ですか?
いまから趣味でプログラムやるならCとC++のどっちのほうがいいですか?

980 名前:デフォルトの名無しさん :02/02/20 22:29
>>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){};

これがエラーになるのは何故なのでしょうか?

982 名前:デフォルトの名無しさん :02/02/20 23:34
>981
CB<T>::func
にしる!!


983 名前:デフォルトの名無しさん :02/02/20 23:37
何故だかスレッド立てすぎですって怒られた…。

誰か新スレ立てない?

984 名前:982 :02/02/20 23:40
スマソ思いっ切りウソ付いた

985 名前:デフォルトの名無しさん :02/02/21 00:07
新スレ立てた
http://pc.2ch.net/test/read.cgi/tech/1014217496/l50

986 名前:デフォルトの名無しさん :02/02/21 00:22
>>981
g++ 3.0.2 だと通るけど。たんに使ってるコンパイラが
メンバテンプレートに対応していないだけなんじゃない?


987 名前:デフォルトの名無しさん :02/02/21 01:07
VSは通らないのですか・・・
残念。


■過去ログ置き場に戻る■ 1- 前250 最新50
DAT2HTML 0.33f Converted.