C++相談室 part38

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いッス。

前スレ part37
http://pc5.2ch.net/test/read.cgi/tech/1098543578/

過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
2デフォルトの名無しさん:04/11/26 21:49:42
3デフォルトの名無しさん:04/11/26 21:50:28
4デフォルトの名無しさん:04/11/26 21:51:02
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq-lite/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****

[禿 Stroustrup]
 http://www.research.att.com/~bs/
[C++ International Standard]
 http://www.kuzbass.ru/docs/isocpp/
 http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf
 http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=38110&ICS1=35&ICS2=60&ICS3=
[JTC1/SC22/WG21 - C++]
 http://www.open-std.org/jtc1/sc22/wg21

[C/C++ Users Journal]
 http://www.cuj.com/
[cppll (ML)]
 http://www.trickpalace.net/cppll/ (日本語)
5デフォルトの名無しさん:04/11/26 21:52:01
6デフォルトの名無しさん:04/11/26 21:52:34
7デフォルトの名無しさん:04/11/26 21:53:19
8デフォルトの名無しさん:04/11/26 21:54:20
>>1乙!
9デフォルトの名無しさん:04/11/26 21:56:14
あ"ー
10デフォルトの名無しさん:04/11/26 21:58:31
あ"ー
11デフォルトの名無しさん:04/11/26 22:02:13
あ"ー?
12デフォルトの名無しさん:04/11/26 22:02:18
あ"ー
13デフォルトの名無しさん:04/11/26 22:05:51
STLつかうと一気に実行ファイルサイズが10倍に?!
14デフォルトの名無しさん:04/11/26 22:07:15
1天乙
15v(^・^)v:04/11/26 22:09:32
>>13
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
16デフォルトの名無しさん:04/11/26 22:15:08
17v(^・^)v:04/11/26 22:17:08
>>15
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
18デフォルトの名無しさん:04/11/26 22:17:51
>>17
実際増えないだろ。
19v(^・^)v:04/11/26 22:20:01
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
20デフォルトの名無しさん:04/11/26 22:20:57
>>19 マルチパラダイムシフト
21v(^・^)v:04/11/26 22:21:03
>>19
#include <stdafx.h>

後死ね。
22v(^・^)v:04/11/26 22:22:04
>>21
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
23デフォルトの名無しさん:04/11/26 22:24:31
今回のテンプレにマジレス
>>17,>>19 計2件

今回のあ"ー
>>9-12 計4件
24デフォルトの名無しさん:04/11/26 22:25:18
テンプレにマジレスは
×>>17,>>19
>>18,>>20
の間違いだった
25デフォルトの名無しさん:04/11/26 22:42:24
ここは人工無能のいるスレでつか?
26デフォルトの名無しさん:04/11/26 22:50:18
age
27デフォルトの名無しさん:04/11/27 00:26:12
伊能四郎のような感じですか?
28デフォルトの名無しさん:04/11/27 00:29:12
珍子産む嚢
29デフォルトの名無しさん:04/11/27 01:00:31
http://pc5.2ch.net/test/read.cgi/tech/1101484548/
↑はネタスレでいいか。あの俺俺スレみたいに。
30停止しました。。。:04/11/27 01:18:40
真・スレッドストッパー。。。( ̄ー ̄)ニヤリッ
31再開しました。。。:04/11/27 01:26:57
真・スレッドリジューマー。。。( ̄ー ̄)ニヤリッ
32デフォルトの名無しさん:04/11/27 01:27:58
初めてみたw
33デフォルトの名無しさん:04/11/27 01:59:35
どっちが本刷れ?
34デフォルトの名無しさん:04/11/27 02:04:06
>>33
時間的にはこっちが本スレ。
ネタスレ用にされた方は削除依頼してほしいんだけど。
このスレ一回ageた方がいいのかもしれん。
35デフォルトの名無しさん:04/11/27 02:08:12
前回に続き重複か。
今後は宣言してから建てるようにしてくれや。
36デフォルトの名無しさん:04/11/27 10:45:33
age
37デフォルトの名無しさん:04/11/27 11:03:09
>>35
voidがわざと重複させたように見える
38デフォルトの名無しさん:04/11/27 11:36:35
下のコードなんですが、なんとか一時オブジェクトを作らずに済ます方法は無いでしょうか

#include <iostream>
#include <list>
class Destroy{
char* name;
public:
Destroy( char* new_name ){
name = NULL;
setName( new_name );
}
Destroy( const Destroy& destroy ){
name = NULL;
setName( destroy.name );
}
~Destroy(){
delete [] name;
std::cout << "デストラクタが呼ばれました" << std::endl;
}
void setName( const char* new_name ){
if( name ){ delete [] name; }
int size = strlen(new_name);
name = new char[ strlen(new_name)+1 ];
strcpy( name, new_name );
}
};
int main(){
std::list<Destroy> list_destroy;
list_destroy.push_back( "Hage" );
std::cout << "--------終了--------" << std::endl;
return 0;
}
39デフォルトの名無しさん:04/11/27 12:00:46
Destroyへのポインタを格納するようにするとか。
ただそれするとリストを使う意味があるかどうかという問題が。
4038:04/11/27 12:14:15
>>39
ありゃ、それしか無いんですか。
ポインタで持つのは良くやるのですが、仰るとおりで、終了時に一々deleteが
必要で面倒なんですよね。面倒というかなるべく危険は避けたいというか。

まぁ、しょうがないので一時オブジェクト有りで…レスありがとうございました。
41デフォルトの名無しさん:04/11/27 12:28:59
>>40
>終了時に一々deleteが必要で面倒なんですよね。
スマートポインタ
42デフォルトの名無しさん:04/11/27 12:32:09
counted pointer を copy-on-write で
43デフォルトの名無しさん:04/11/27 21:19:07
テンプレートクラスにBridgeパターン、もしくはpimplイディオムで、インターフェースと実装を分離したいのですが、どうすればいいのでしょうか。

当たり前なんですが、以下のようにするとエラーです。

// Test.h

class Test_impl;

template<typename T>
class Test {
Test_impl<T> *pImpl;

public:
Test( void );
~Test( void );

void Set( T data );
T Get( void );
};
44続き:04/11/27 21:19:29
// test_impl.cpp
#include "test.h"

template<typename T>
class Test_impl
{
T p;
public:
Test_impl( void ){}
~Test_impl( void ){}

void Set( T data ){ p = data; }
T& Get( void ){ return p; }
};

template<typename T> Test<T>::Test( void )
{
pImpl = new Test_impl<T>;
}

template<typename T> Test<T>::~Test( void )
{
delete pImpl;
}
45続き:04/11/27 21:21:17
Getが参照返してるのは見なかったことにして下さい……。
46デフォルトの名無しさん:04/11/27 21:55:09
>>43
Test_implの前方宣言にもtemplate<typename T>を書けばコンパイルは通ったけど?
47デフォルトの名無しさん:04/11/27 22:02:47
>>43
// Test.h
template<typename T>
class Test
{
class Impl;
Impl *pImpl;

// test_impl.cpp
#include "test.h"
template<typename T>
class Test<T>::Impl
{
48デフォルトの名無しさん:04/11/27 23:00:31
あ、忘れてました。

コンパイルは通ると思いますが、実際に宣言すると、外部参照でエラーがでるかと思います。
4943:04/11/27 23:02:07
#include "test.h"

int main( void )
{
Test test; // !エラー

return 0;
}
50デフォルトの名無しさん:04/11/27 23:03:52
>>48-49 意味わからん。
51デフォルトの名無しさん:04/11/27 23:06:49
しょせんプリプロセッサだから。
5243:04/11/27 23:09:25
Test<T> が TestImpl<T> をnewするため、TestImplの定義以降に、Test<T> のコンストラクタを定義しないといけないんですが、テンプレートクラスなんで、出来ないんですよね、、、
53デフォルトの名無しさん:04/11/27 23:12:37
まさかリンクしてないだけ
54デフォルトの名無しさん:04/11/28 14:34:06
あれだ。「explicit instantiation」
55デフォルトの名無しさん:04/11/28 14:37:35
clsss Test test;
だったりして・・・
56デフォルトの名無しさん:04/11/28 17:01:54
>>52
export が使えない以上、test_inst.cpp を作って、

// test_inst.cpp
#include "test_impl.cpp" // cpp は変えたほうがいいかも
template class T<int>;
template class T<char>;

エラーが出なくなるまで explicit instantiation を並べるしかないんじゃない?
5743:04/11/28 18:49:52
>>56
ありがとうございます。この方法でいきたいと思います。
58デフォルトの名無しさん:04/11/28 23:36:42
規格書丸暗記した。もう俺にC++に関して分からないことはない。
59デフォルトの名無しさん:04/11/28 23:37:02
ごめんうそついちゃった。今がんばって読んでます。
60デフォルトの名無しさん:04/11/28 23:39:08
規格書、印刷しようと思っても紙代も馬鹿になんないな…
本とか出てるの?本買った方が安いかも。
61デフォルトの名無しさん:04/11/28 23:50:10
>>60
JISのなら紙で買えるはず
62デフォルトの名無しさん:04/11/28 23:50:55
>>61
いくら?どこで買えるの?
63デフォルトの名無しさん:04/11/28 23:51:45
>>61
ANSI/ISOとJISで差異とかあります?ないなら日本語だし願ったり叶ったり
なんですが。
64デフォルトの名無しさん:04/11/28 23:57:26
>>62
規格番号 JIS X 3014:2003
標題 プログラム言語C++
和文冊子 17,325円

JSA Web Store から検索・注文できる。
http://www.webstore.jsa.or.jp/webstore/top/index.jsp
65デフォルトの名無しさん:04/11/28 23:58:43
ありがとう。でも高いー。
66デフォルトの名無しさん:04/11/29 00:04:39
サソクス
67デフォルトの名無しさん:04/11/29 00:13:24
>>63
www.jsa.or.jp へ行くと、内容の同一性についてもはっきり区分わけしてあるよ
68デフォルトの名無しさん:04/11/29 00:32:48
>IDT: identical(一致)
>以下の場合、地域又は国家規格は国際規格と一致している。
>  a) 地域又は国家規格が、技術的内容、構成及び文言において一致している。又は、
>  b) 地域又は国家規格が、ISO/IEC GUIDE 21の4.2節に規定した最小限の編集上の変更はあるが、技術的内容において一致している。「逆も同様の原理」があてはまる。
69デフォルトの名無しさん:04/11/29 03:44:04
今時紙に印刷されたものを読もうなんてださいな。
70デフォルトの名無しさん:04/11/29 03:46:40
>>69
煽り乙
71デフォルトの名無しさん:04/11/29 03:51:06
>>70
JISの中の人乙
72デフォルトの名無しさん:04/11/29 12:56:47
VC++で計算した数値を引数で表示したいんですが、printfで表示されません。だからMessageBoxを使って表示したいんですがエラーがでます。どうしたらいいんでしょうか?どなたか分かる人教えてください。
73デフォルトの名無しさん:04/11/29 13:39:35
>>72
言ってることがわかりません。
コードとエラーメッセージをコピペしてください。
74デフォルトの名無しさん:04/11/29 13:49:31
> 分かる人教えてください。
と書いてあるんだから分からない人は黙っていろよ。
75デフォルトの名無しさん:04/11/29 13:59:47
おまえもな
76デフォルトの名無しさん:04/11/29 14:08:31
つーか、マルチなんだからほっとけよ。
http://pc5.2ch.net/test/read.cgi/tech/1101100031/183
7721:04/11/29 14:48:47
コードです。
int delta_time=final_time-initial_time;
MessageBox(hwnd,delta_time,"時間",MB_OK);
エラーメッセージは
'hwnd' : 定義されていない識別子です。
hwndをこのコードの前に
HWND hwnd;
と宣言するとこのエラーがでます。
'MessageBoxA' : 2 番目の引数を 'int' から 'const char *' に変換できません
整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です
と表示されます。
誰か分かる人教えてもらえると助かります。
78デフォルトの名無しさん:04/11/29 15:04:44
>>77
MessageBoxは文字列しか受け付けない。
文字列へ直せ。
MessageBox(NULL, _itoa(delta_time), "時間", MB_OK);
79デフォルトの名無しさん:04/11/29 22:25:53
〜〜file1〜〜   〜〜file2〜〜
datax1 datay1
datax2 datay2
datax3 datay3
って感じでデータが並んでいるファイルがいくつもあって、それを5つごとに
決まった順番で一つのファイルにまとめたいです。データを順番に並べたんですが
どんどん書き出していくと、file1とfile2と…の間に1行空行ができてしまいます。
具体的にどういうプログラムを書いたかというと

ifstream ifs;
ofstream ofs;
char datax[20],datay[20];
ifs.open(file1); ofs.open(outputfile)
while(!ifs.eof()){
ifs >> datax >> datay;
ofs << datax << " " << datay << "\n";
}
ifs.close();
ifs.open(file2);
while(!ifs.eof()){
ifs >> datax >> datay;
ofs << datax << " " << datay << "\n";
}
ofs.close();

って感じです。実際はfile1、file2と指定するのにループとか使ってるけど。
8079:04/11/29 22:27:20
空行があると、その後の処理がまた面倒になるので、空行は
入ってほしくないんですが、このプログラムでおかしいところって
ありますか?
81デフォルトの名無しさん:04/11/29 22:48:41
>>80
datayに改行が入ってるんでないの?
8279:04/11/29 23:15:28
>>81
ビンゴでした。
ありがとうございます。
83デフォルトの名無しさん:04/11/30 01:26:31
ttp://namazu.org/~satoru/unimag/9/

ここのHPのテキスト "abracadabra" の Suffix Array を作成する C 言語のサンプルプログラムのソースを
VC++6.0でビルドするとerror C2440: 'initializing' : 'void *' から 'int *' に変換することはできません。とエラーが出ます
どうにかならんもんでしょうか?
84デフォルトの名無しさん:04/11/30 01:32:39
C++ではなくCとしてコンパイルする。

「C言語のサンプルプログラム」って、てめーで書いてるじゃねーか。
85デフォルトの名無しさん:04/11/30 13:58:49
VC++6, 7.1で、デストラクタを呼び出すときに、
クラス名でなく、変数名を使えるんですが、正しい仕様ですか?
g++ではコンパイルがとおりませんでした。

//以下コード
struct C
{
C(){cout << "C" << endl;}
~C(){cout << "~C" << endl;}
};

int main()
{
C c;
new(&c) C;
c.~c();
}
//以上コード

//以下出力
C
C
~C
~C
//以上出力
86困りました:04/11/30 14:03:26
VC6 で、最頻値の平均を計算するテンプレート関数を作りました。

/**
 *  Calculate average of mode elements (most frequently appearing elements).
 *  @param  cont    Container of numeric values.
 *  @return         Mode average.
 */
template<typename Cont>
Cont::value_type ModeAverage(const Cont& cont)
{
    typedef map<Cont::value_type, int>  ValueCounter;
    ValueCounter counter;

    // Count up value furequency and get max frequency.
    int maxFreq = 0;
    {
        Cont::const_iterator it;
        for (it = cont.begin(); it != cont.end(); it++) {
            int& c = counter[*it];
            c += 1;
            maxFreq = MAX(maxFreq, c);
        }
    }
87困りました:04/11/30 14:03:45

    // Sum up container element of the max frequency.
    Cont::value_type sum = 0.0;
    int sumCount = 0;
    {
        ValueCounter::const_iterator it;
        for (it = counter.begin(); it != counter.end(); it++) {
            if ((*it).second == maxFreq) {
                sum += (*it).first;
                sumCount++;
            }
        }
    }

    return sum / sumCount;
}
88困りました:04/11/30 14:04:10

    // Sum up container element of the max frequency.
    Cont::value_type sum = 0.0;
    int sumCount = 0;
    {
        ValueCounter::const_iterator it;
        for (it = counter.begin(); it != counter.end(); it++) {
            if ((*it).second == maxFreq) {
                sum += (*it).first;
                sumCount++;
            }
        }
    }

    return sum / sumCount;
}
89困りました:04/11/30 14:04:48
ごめんなさい。2重送信してしまいました。。。
90困りました:04/11/30 14:05:37
上記の関数をテストする関数を書きました。

    // test ModeAverage
    {
        double data[10] = { 2.0, 1.0, 2.0, 5.0, 3.0, 4.0, 5.0, 2.0, 5.0, 4.0 };
        vector<double> v;
        for (int i = 0; i < 10; i++) {
            v.push_back(data[i]);
        }

        double ave = ModeAverage(v);
        double must = (2.0 + 5.0) / 2;
        ASSERT(DOUBLE_EQUAL(ave, must, 1.0e-100));
    }
91困りました:04/11/30 14:06:19
このテストが、アクセス違反を起こします。
原因は何が考えられるでしょうか?
92デフォルトの名無しさん:04/11/30 14:08:57
ここは宿題スレじゃないよ
9391:04/11/30 14:24:18
すいません、
int& c = counter[*it];
の前に
if (counter.find(*it) == counter.end()) {
    counter.insert(ValueCounter::value_type(*it, 0));
}
を入れたら正常動作しました。

でもおかしいですね。
map の [ ] は自動的に要素を追加してくれるはずなのに。。。
94デフォルトの名無しさん:04/12/01 12:38:31
cout<< (1==0)?'a':'b';

うんこ
95RADE:04/12/01 19:03:52
識者の方にお伺いをしたく思います。
スレ違いかもしれませんが・・・

VC++6.0でCreateFileでCOMポート開いて、通信速度を
1bpsに設定して、オシロスコープで波形観測してみますた。

本当は、通常のCOMポートって、デバイスマネージャ等で設定
できる値以外にどんな値がセットできるかを確認するうえでの
プログラムをしたのですが、幸い1bpsに関してもポート設定
ができましたもので、ならばこの糞遅いボーレートの観測を
してやろうと思いまして。

しかし、です。どうみても1秒間隔でビットが送られているように
みえません。送ったデータは&hAAで、ビット的に10101010となる
ものです。つまり、ハイ・ローの間隔が1秒毎にしたわけです。

擬似的に1bpsが実現していて、ハードウェア的に1bpsは実現して
なかったということでしょうか?
96デフォルトの名無しさん:04/12/01 19:08:05
誤爆?
97デフォルトの名無しさん:04/12/01 23:05:15
ネタ?
98デフォルトの名無しさん:04/12/01 23:05:34
釣り?
99デフォルトの名無しさん:04/12/01 23:06:07
結論:スレ違い。
100デフォルトの名無しさん:04/12/02 00:30:24
自分で確保したメモリ領域に対して、あるクラスのコンストラクタをコールすることは出来ないのでしょうか?
101デフォルトの名無しさん:04/12/02 00:35:47
>>100
placement new
102100:04/12/02 00:48:50
>101
ありがとうございます。下記コードを試してみたところ、再定義されましたとエラーが出ました。
void* operator new(size_t size, void* p)
{
  return p;
}

どこかで定義されているだろうと思い、以下のテストコードを試してみましたが、エラーが出てしまいました。
・・・
 int i[32];
 int *pi = new(i) int;
}

環境はVisualC++2002です。何か根本的な間違いをしているのでしょうか?
103100:04/12/02 00:54:39
自己解決しました。

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

が原因でした。お騒がせしました。
104デフォルトの名無しさん:04/12/02 09:50:27
今プログラミング言語C++の例外処理のところを読んでいたら
explicit auto_ptr (X* p = 0) throw() { ptr=p; }
という記述が出てきたのですが、このthrow()とはどういう意味なのでしょうか?

前後を読んでみても何も説明がないようなのですが。
105デフォルトの名無しさん:04/12/02 09:52:33
「例外を投げるかもしれない関数です」という意味です
106デフォルトの名無しさん:04/12/02 10:00:14
>>105
P440に書いてありました。
ありがとうございました。
107デフォルトの名無しさん:04/12/02 10:12:25
>>105-106
オイオイ
108デフォルトの名無しさん:04/12/02 10:47:13
>>105
知ったか厨は氏ね!
109デフォルトの名無しさん:04/12/02 11:08:23
throw(e1, e2) は e1 , e2 型、それから派生した型のどれかが投げられる可能性があるという意味
なにも例外を投げない時は throw() と書く
110デフォルトの名無しさん:04/12/02 12:03:20
可能性で言い出したら、
std::exceptionとその派生がスローする可能性をどう扱うべきなのかと言う点で
ザルのような仕様だよね。
111デフォルトの名無しさん:04/12/02 12:22:02
一つのクラスが記述されたcppファイルがただいま251KBなのですが、
これってどうでしょう、大きすぎますか?

一応コンポジット関係にあったクラスすら、他のファイルに切り分けたのですが
それでもこの結果です。

些末ですし、普段ならさほど気にならないのですが、
オープンソースにしなければで・・・恥かきたくないなぁ。
112デフォルトの名無しさん:04/12/02 13:38:39
いっそさっさとオープンにして、その判断を任せればいいんでは?
恥ったって、バージョン上がるごとに過去のソースは恥ずかしく思えるだろうし(たぶん)

むしろその恥を隠すために更新が滞らなくなれば尚更(・∀・)イイ
113デフォルトの名無しさん:04/12/02 13:50:05
>>111
>112に激しく同意。
114デフォルトの名無しさん:04/12/02 14:09:59
>>112-133

ぶっちゃけ開発放棄のためのオープンs…ゴッホゴッホ
確かに内容にもよりますし、中見ないことには判断出来ないですよね。
レスありがとうございました。
115デフォルトの名無しさん:04/12/02 14:18:49
ブランクの何にも書いてないただのウィンドウを作ってみたところ、
一回目だけちゃんとえらーが出ずに窓が開けたんですが、
二回目以降はプロセスにとどまったまま開かず、数回コンパイル>ビルド
を繰り返したところ、
DebugLINK : fatal error LNK1168: cannot open Debug/Win.exe for writing
というメッセージでコンパイルすらできなくなり、そしてまたビルドしたら開かず、コンパイルはまたできるようになって。

一応ネットで模範のコードを2つと、本に書いてあったコード全部試してみて
同じ結果だったので、作り方に問題があるとは思えないけど。。。
プロセスを強制終了させてまたビルドし直しても、またプロセスに留まるだけ。。
これは仕様なの?
116デフォルトの名無しさん:04/12/02 14:23:02
>>115
PostQuitMessageしてないと超予想
117115:04/12/02 14:26:39
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{

case WM_CLOSE:

DestroyWindow(hWnd);

break;

case WM_DESTROY:

PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

こんな感じでPostQuitMessageしてるよ。
118デフォルトの名無しさん:04/12/02 14:33:24
>>115
たぶん仕様です。
115が「そういう動作をするコード」を書いたので、C++コンパイラやらOSやらは
正しく仕様どおりにそういう動作をしている、ってこと。
119デフォルトの名無しさん:04/12/02 14:34:50
C++は不特定多数で開発するオプソには不向き。
中心となる人が優れていて、最初の公開の段階で
ある程度見通しがいいものならいいんだけど。
120デフォルトの名無しさん:04/12/02 16:12:17
じゃぁある程度見通しがたっていなくともC言語なら開発しやすいわけ?
121デフォルトの名無しさん:04/12/02 16:45:43
>>120
クラス名とかメソッド名の名前付けのセンスがあわない時に泣きたくなる位じゃないかと思うがなぁ。
仕事ならなんとかなるけど、好きで作ってる物でかち合うと悲しいんだよなぁ。
122デフォルトの名無しさん:04/12/02 16:49:05
ひととおり動くβ版ができてから公開ってのがいいかもね。
設計段階からオープンにするとたしかにしんどそう。
123デフォルトの名無しさん:04/12/02 19:13:29
ぶっちゃけ、オープンソースで開発しようったってコード書くやつなんか
限られてる。特に動かないうちなんか興味を持たれることすらまずない。
逆に動かないものを公開するとそれっきりになる危険すらある。

なので、>>122に賛成。

設計から付き合うやつなんて、まずいないって。
124デフォルトの名無しさん:04/12/02 19:22:01
>>123
まぁ、知合い同士でわいわいする為のネタ。
125デフォルトの名無しさん:04/12/03 01:11:15
よく、クラスで演算子を定義する時には、
「+」の処理で、あらかじめ実装しておいた「+=」を使えばいいとか聞くけど、
なぜ「+=」の処理で「+」を使うようにしないの?
「+=」は、「a=a+b」を「a+=b」という風に簡略化して書くためにあるものだから、
「+」を先に実装するもんだと思うんだが……。
別におかしいと言ってるわけじゃないんだけど、何か理由があるのかと気になる。
126デフォルトの名無しさん:04/12/03 01:13:46
+=は代入先のオブジェクトがあるので、テンポラリオブジェクトなしで
演算を終えることができるため。
127125:04/12/03 01:16:02
>>126
早い……。
ありがとう。
128ほんたま:04/12/03 07:09:41
プログラマーのみなさん、教えてください。
ひとつのオブジェクトを2つに分裂させるコードを書きたいのですが、どう書けばいいのですか?
擬似的に2つに分裂したように見えるのではなくて、実際に2つに分裂するコードを書きたいのです。
つまり1つから2つのオブジェクトが同時に発生し、2つのオブジェクトの発生にはほんの少しの時間差もないという、事実上の分裂を書きたいのですが…
129デフォルトの名無しさん:04/12/03 07:34:00
↓何事もなかったかのようにC++相談室をお送りします。
130デフォルトの名無しさん:04/12/03 12:03:05
点のリスト PointList を作りました。

struct Point {
  double x, y, z;
}
typedef vector<Point> PointList;

ここで PointList 内の点を列挙することは簡単です。
イテレータを使えばいいです。

PointList points = ...;
PointList::const_iterator it;
for (it = points.begin(); it != points.end(); it++) { ... }

では、PointList 内の x 座標を列挙するするイテレータを
作るにはどうしたらよいでしょうか?
列挙するだけであれば、点を列挙して .x をとればいいですが、
x だけを列挙するイテレータがほしいのです。

x_iterator it = ...;
double x = *it;

このようなイテレータを簡単に作ることはできるでしょか?
イテレータ クラスを自分で書くしかないですか?
131デフォルトの名無しさん:04/12/03 12:12:11
PointList::const_iterator it;

... it->x ...
132デフォルトの名無しさん:04/12/03 12:15:25
boostのiterator_adaptorでも使えば?
133デフォルトの名無しさん:04/12/03 21:02:58
ありがとうございます。やっぱり boost ですか。
これぐらいは C++ 標準で用意してほしいですよね。
134デフォルトの名無しさん:04/12/03 21:50:34
>>133
文句はC++標準化委員会に言って下さい。
ここはお前の日記じゃねーんだ。
135デフォルトの名無しさん:04/12/03 21:54:49
技術的に反論できねーカスがスレの存在意義を否定してるんじゃねえよ (プ
136デフォルトの名無しさん:04/12/03 22:00:32
>>135
負け惜しみか?氏ねば?
137デフォルトの名無しさん:04/12/03 22:24:31
>>136
あ? 何だお前、それで勝負でもしてたつもりだったのか? (プゲラ
138デフォルトの名無しさん:04/12/03 22:26:51
>>137
それで技術的な反論のつもりですか?
「はい」ならあなたは完璧に負け犬、「いいえ」なら頭の悪い厨確定ですね ;-)
139デフォルトの名無しさん:04/12/03 22:35:23
冬厨が湧くにはまだ少し早いと思うのだが。
140デフォルトの名無しさん:04/12/03 22:43:59
┌───────────────────┐
|致命的なエラー                [×]|
├───────────────────┤
|質問者は致命的なエラーを抱えています。  |
|                             .|
|スルーしますか?                  |
|     [ はい(Y) ] [ いいえ(N) ]        |
└───────────────────┘
141デフォルトの名無しさん:04/12/03 22:53:21
秋は唯一厨の沸かない季節だと誰が決めたんだろう
142デフォルトの名無しさん:04/12/03 22:56:35
>>138
お前の脳内で確定されても痛くもかゆくもない
スコープの概念が見えてないアフォが煽ったつもりらしいがw
143デフォルトの名無しさん:04/12/03 23:34:50
マジレスで失礼するが、
そう口論は感情を抑えて早く離れるべき。
144デフォルトの名無しさん:04/12/04 11:32:33
void myStrcpy( char* a, char* b){ while (*a++ = *b++) ; }

これで、++は、何を増加させてるのですか?
a,bはCharだから、アスキーコードを考えて、アルファベットが一文字ずつ上がっていくってこと?
この関数もBodyって、whileの部分だけだよね?
ってことは、これ、いつこのループは、終わるんでしょう。。。
145デフォルトの名無しさん:04/12/04 11:36:25
ポインタの勉強しろ。それで解決する。
146デフォルトの名無しさん:04/12/04 11:37:52
>>144
++はデリファレンスよりも優先順位が高いから、
*a++ は *(a++) と同じ。
ポインタをインクリメントしてから参照してる。
(後置だから参照してからインクリメントが正しいか)
文字列の終端に来たら *a == 0になってループを抜ける
147デフォルトの名無しさん:04/12/04 11:38:18
>>144
Cスレ逝けよ。C厨の方がポインタをずっと親切に教えてくれるから。
148デフォルトの名無しさん:04/12/04 13:53:08
だって a++,b++,!C++ だもんね!
149デフォルトの名無しさん:04/12/04 14:42:17
>>147
唐突に別の言語の話をはじめて ( ゚д゚)ポカーン されるJ厨等と同類
150デフォルトの名無しさん:04/12/04 15:12:25
>>149
( ゚Д゚)ハァ?C++だから当然Cのポインタも含んでいるけど、
>>144の質問はどう考えてもCのスレの方がお似合いだろ。
空気読め池沼。
151デフォルトの名無しさん:04/12/04 15:18:04
>>150
思いこみの激しい人だな。
C は別の言語だ。 C++ じゃない。
似ていようがいまいが、それはあくまで与太話でしかない。
ここはム板だ。技術的な話はドライなスタンスが基本であることは言うまでもない。
152デフォルトの名無しさん:04/12/04 15:26:07
>>151
じゃあCがC++と「別の」言語だと捉えている貴方に質問しますが、>>144
質問はC++で常に答えてやった方がいいと思うのか?
>>146==>>151だと思うが、別に>>146を俺は叩いたつもりは無いはずだが、
もしかして被害妄想か?
153デフォルトの名無しさん:04/12/04 15:42:48
>>152
俺は 151 だが 146 ではない。

いいもへったくれもない。
単に C++ の話であり、他のどの言語の話でもない。
154デフォルトの名無しさん:04/12/04 15:43:57
>>153は池沼。
単なるchar型へのポインタの話でさえCとC++は全く違っていて、互換性の
ある説明は出来ないと思いこんでいるバカ。
155デフォルトの名無しさん:04/12/04 15:46:52
>>154
C++ のポインタについて聞いている人に C のポインタの答えをするトンマが泣いてるよ
156デフォルトの名無しさん:04/12/04 15:47:13
もちろんCスレに行けば適切に答えてくれるだろうが、
正しいC++の質問をわざわざ誘導するのはどうかと思うぞ。
157デフォルトの名無しさん:04/12/04 15:47:50
>>155
もういいよ。アホの相手をするのは疲れた。
158デフォルトの名無しさん:04/12/04 15:49:37
>>156
そしたらCの質問をあたかもC++の質問のようにする厨が多量に流入しても
お前は答えてやるつもりなんだな!?そしたらもうC専用スレの存在意義が
(100%ではないが95%ほどは)なくなるね。
159デフォルトの名無しさん:04/12/04 15:51:20
>>155
いちいちageんなウゼえ
160デフォルトの名無しさん:04/12/04 15:53:39
>>158
ほう、>>144 がそうだとでも言う気かよ
161デフォルトの名無しさん:04/12/04 15:55:35
>>160
釣りなら海に行ってしてくれ。今日は天気が悪いから釣れないだろうがな
162デフォルトの名無しさん:04/12/04 15:57:36
>>158
最初にそう断ってからから誘導すれば、荒れずにすんだと思われることが多々ある。
163デフォルトの名無しさん:04/12/04 15:58:19
>>158
>そしたらCの質問をあたかもC++の質問のようにする厨が多量に流入しても
>お前は答えてやるつもりなんだな!?
Cの質問かC++の質問か区別できない場合には、そうする。

>そしたらもうC専用スレの存在意義が
>(100%ではないが95%ほどは)なくなるね。
そうか?いずれC++を学ぶにしてもCから始める
学習者は多いと思うが。

本人がC++を学んでいるつもりであれば、C++スレに質問するだろう。
そういう場合に、内容がCと重複しているからといって、Cスレに誘導するのは、
独立した言語のスレとしてどうなんだろう、といいたい。
164デフォルトの名無しさん:04/12/04 16:00:14
>>163
>そうか?いずれC++を学ぶにしてもCから始める
>学習者は多いと思うが。

だったらなおさらの事、CとC++で重複している質問はCスレへ誘導してやれよ。
このスレの過密化を防ぐためにわざわざ独立スレとして立ててるんだろ。
165デフォルトの名無しさん:04/12/04 16:01:03
>>162
それぐらいは空気読んでわからんか?頭が悪いね。
166デフォルトの名無しさん:04/12/04 16:06:16
>>144
当分の間はこれと同じことをしていると思えばいい。
void myStrcpy(char* a, char* b) {
 while (1) {
  *a = *b;
  if (*a == '\0')
   return;
  a++;
  b++;
 }
}
167デフォルトの名無しさん:04/12/04 16:11:55
>>144
void myStrcpy( char* a, char* b){ while (*a++ = *b++) ; }

void myStrcpy( char* a, char* b){ do { *a = *b; a++; b++; } while (*a) ; }

このスレは池沼の住処だから、これ以上のことはCスレで訊きんしゃい。
ちなみにこのコードは空文字が与えられた時の挙動がダメダメってことと
>>144 もすぐに挙動が分からなかったように可読性も悪いコードとして
有名だから真似はせんようにね。
168デフォルトの名無しさん:04/12/04 16:15:15
>>167
>このコードは空文字が与えられた時の挙動がダメダメ
下のほうのことだよね?
169デフォルトの名無しさん:04/12/04 16:52:09
この++って、*aと*bが格納されてる場所のアドレスが増えてるってことだよね?
つまり、Bodyにカウントをつけたとしたら、
最初与えられたアドレスから連続していくつ、そのメモリが使われてるか分かるってこと?
170デフォルトの名無しさん:04/12/04 16:54:52
>>169
Cスレ逝け池沼
171デフォルトの名無しさん:04/12/04 16:56:38
>>167
アホでたー
172デフォルトの名無しさん:04/12/04 16:56:59
>>169
そうじゃなくて*a = *b;を行っているから文字列のコピーだよ。関数名見ろ。
173144:04/12/04 16:59:11
このスレには>>167みたいな低脳しかいないのですか?
174デフォルトの名無しさん:04/12/04 17:11:51
167はいつもCスレを荒らしているC++厨
175デフォルトの名無しさん:04/12/04 17:13:45
>>167
めっちゃ恥ずかしいなお前。人の事を池沼呼ばわりしておいて、
自分が池沼と言われても仕方ないようなレス書いて。
176デフォルトの名無しさん:04/12/04 17:18:36
>175
>めっちゃ恥ずかしいなお前。人の事を池沼呼ばわりしておいて、
>自分が池沼と言われても仕方ないようなレス書いて。

池沼の住処とは自分の事を指していたのでは?
177デフォルトの名無しさん:04/12/04 17:39:44
池沼って誰のことですか。
178デフォルトの名無しさん:04/12/04 17:42:47
144=167のこと。
179デフォルトの名無しさん:04/12/04 17:55:32
>このスレの過密化を防ぐためにわざわざ独立スレとして立ててるんだろ。

これは初耳
180デフォルトの名無しさん:04/12/04 17:55:52
166さんありがとう。
当分の間はこれと同じことをしていると思えばいい。
void myStrcpy(char* a, char* b) {
 while (1) {
  *a = *b;
  if (*a == '\0')
   return;
  a++;
  b++;
 }
}


if (*a == '\0')って、if (*a == '\0'||*b == '\0')じゃなくて?
181デフォルトの名無しさん:04/12/04 17:59:42
*b++は何を表してる?って聞かれたら。。。
低脳なの、承知です。
プログラム初めてなもので・・・。
すいません。
182デフォルトの名無しさん:04/12/04 18:00:24
池沼・・・
183デフォルトの名無しさん:04/12/04 18:02:01
>>181
*a に *b を代入しているので、片方を0と比較すればもう片方はその必要がない。
184デフォルトの名無しさん:04/12/04 19:19:13
質問です。
arrayに入ってる中身の順序を逆さに並び替えたいんだけど、
追加のstrageなしでってことで、XORを使おうとしてるんだけど、
XORがいまいち、よく分からないのです。
reverseOrder(array[]);の定義なのですが・・・。
185デフォルトの名無しさん:04/12/04 19:21:35
必殺!「いまいちよく分からない」!
186デフォルトの名無しさん:04/12/04 19:23:36
184です。解決しました。
187デフォルトの名無しさん:04/12/04 19:24:38
お前の言いたいことがよくわからんが、逆さはとりあえずこれで出来るぞ

#include <algorithm>

const int N = 10;
int array[N];

std::reverse(&array[0],&array[N]);
188デフォルトの名無しさん:04/12/04 19:25:38
「C++の前にCを学ぶべきか」っていうスレが必要だな
189デフォルトの名無しさん:04/12/04 19:28:55
>>184
宿題スレで聞いたほうがいいと思う。
なぜなら質問点を明確にできていないから。

(xor について独り言)
神話に出てくる大先生の本にさえ「驚くべき」とか書いてあることを
ノーヒントで放り出す教授の意図はいったい・・・

大学の存在意義がここにあるわけだが
190デフォルトの名無しさん:04/12/04 19:31:41
>>189
もったいつけずに言いたいことを言ってくれ。
191デフォルトの名無しさん:04/12/04 19:35:14
どうせ「トリッキーなコード その2」の44だろ?
192デフォルトの名無しさん:04/12/04 19:37:03
要は初心者レベルの質問は
宿題スレか初心者スレに逝けってことだ

ぼるじょあがC/C++の宿題を片付けますYO! 35代目
http://pc5.2ch.net/test/read.cgi/tech/1101568895/l50
【初心者歓迎】C/C++室 Ver.12【環境依存OK】
http://pc5.2ch.net/test/read.cgi/tech/1101100031/l50

>>144だの>>184だのこのスレで扱う話題じゃない。
193伊能四郎:04/12/04 23:59:14
どうもです。
194デフォルトの名無しさん:04/12/05 00:36:53
ズン!!
195デフォルトの名無しさん:04/12/06 17:52:54
1 "hogehoge" "hage" 123 //int 文字列 文字列 int
2 "hige hige" 456       //int 文字列 int
3 "hegehege" "hage" 789 //int 文字列 文字列 int

こういう既存のtxtファイルがあるのですが、1や3の様にhageてる場合と
2の様にhageが無い場合があるんです。
STLでこれを、区別して読むにはどうすれば良いのでしょうか。

またhige higeの様に間にスペースが入ってしまう時にも
""内を一息に読み込む方法はあるのでしょうか。
いまは終端の"が無ければ一回読み込み、結局strcatで連結しています。
196195:04/12/06 17:54:01
書き忘れすいません
hageは例でして、必ずhageという文字列とは限らないんです
197デフォルトの名無しさん:04/12/06 18:02:12
>>195
それはSTLの問題ではないだろ。
読み込みパーザを書きなさい。
198デフォルトの名無しさん:04/12/06 18:03:07
>>195
STL?std::ostream_iteratorでも使うって意味か?
std::ifstreamの間違いじゃないの?
199195:04/12/06 18:13:47
しまったSTLは取り消します。仰るとおりstd::fstreamです。

あるいは読み込み区切り文字を変えたりして
簡単に出来ないかなと思ったのですが、やはりこの辺は細かくやらなきゃなんですか。

となるとあまり恩恵も感じられないし、、
fgetsに戻りたくなりますねぇ。レスサンクスでした。
200デフォルトの名無しさん:04/12/06 18:22:20
std::getline()で一行をstd::stringに読み込み、それをstd::stringstreamに
ぶち込んで、1や3を前提として読んで、エラーが起きればclear()して
seekg()で先頭に戻し、2を前提で読み込む。
201195:04/12/06 18:32:46
>>200
ありがとうございます。
そうかそこだけ別streamに取って無理矢理エラーを出させれば良いのか。
感謝です。
202デフォルトの名無しさん:04/12/06 20:51:40
while(getline(ifs,line)){
escaped_list_separator<char> sep(''\\,' ');
tokenizer<escaped_list_separator<char> > tok(line,sep);
tokenizer<escaped_list_separator<char> >::iterator it = tok.begin();
・・・
}
203デフォルトの名無しさん:04/12/08 09:51:45
正規表現で一番速いライブラリはどれだと思う?
204デフォルトの名無しさん:04/12/08 10:07:32
pcre
205デフォルトの名無しさん:04/12/08 12:29:00
boost::regex は?
206デフォルトの名無しさん:04/12/08 19:10:52
今読んでる本に組み込み型ってあったんですけど、
これって std::complex 等標準クラスも含まれるんですか?
それとも int, char long 等だけですか?
207デフォルトの名無しさん:04/12/08 19:12:00
C++の場合はPODと言った方がいいかもな。
208デフォルトの名無しさん:04/12/08 19:29:31
質問ですunsorted list(ソートされないリスト)で
┏━┳━┳━┳━┳━┳━┓
┃10┃53┃24┃35┃  ┃  ┃
┗━┻━┻━┻━┻━┻━┛
と配列が渡されたとき、「75」を挿入すると

┏━┳━┳━┳━┳━┳━┓
┃10┃53┃24┃35┃75┃  ┃
┗━┻━┻━┻━┻━┻━┛
となるので正しいですか??

また、
┏━┳━┳━┳━┳━┳━┓
┃10┃53┃24┃35┃  ┃  ┃
┗━┻━┻━┻━┻━┻━┛
から53を削除した場合、リストはどの様に並びますか?
よろしくおねがいしますm(_ _"m)
209デフォルトの名無しさん:04/12/08 19:35:18
>>208
unsorted listでは何を指すかわからない。もっと具体的に書こう。
もし、std::listならば、>>208で正しい。
単に削除と書かず、具体的に実行した関数(erase()など)を添えよう。
210デフォルトの名無しさん:04/12/08 19:40:50
>>208
マルチうざい。
211デフォルトの名無しさん:04/12/08 19:45:15
>>206
std::complex<>は標準ライブラリによって定義されているので
組み込み型とは言わない。
組み込み型とは、言語によって定義されている、bool, int, char,...の事。

>>207
PODはまた別の概念。たとえば
struct point{int x,y;};
はPODだが組み込み型ではない。
212デフォルトの名無しさん:04/12/08 20:15:01
PODって英語で言うと何の略だっけ?
いや意味は分かるんだけど、英単語がどれか迷う
ネタフリじゃないよ
213デフォルトの名無しさん:04/12/08 20:15:53
Plain Old Dataじゃなかったか
214デフォルトの名無しさん:04/12/08 20:21:53
>>213
おおサンクス!胸のつかえが取れたよ
よもやネタ無しでレス頂けるとは
215デフォルトの名無しさん:04/12/08 20:28:02
上島竜平が「絶対に押すんじゃないぞ」と言っていたら、
本当に押されなかった様な哀愁を感じる
216デフォルトの名無しさん:04/12/08 23:51:03
意地が悪いな(w
217デフォルトの名無しさん:04/12/09 16:02:53
あるクラスのメンバ関数を(明示的に)インライン化しようと思って
定義をソースファイルからヘッダに移したのですが、
その関数の中で使われているクラスが"認識できない型"と言われ
コンパイルできなくなってしまいました。
明示的インライン化を行うときは何か特別な手続きが必要なのでしょうか?
218デフォルトの名無しさん:04/12/09 16:11:57
age
219デフォルトの名無しさん:04/12/09 16:15:29
>>217
include してる?
220デフォルトの名無しさん:04/12/09 16:16:45
>>219
はい、さすがにincludeはしてます
221デフォルトの名無しさん:04/12/09 16:21:42
>>220
あやしい…
ソースファイルでincludeしたもの全部インクルードしてもそうなる?
222デフォルトの名無しさん:04/12/09 16:23:34
ソース見ないとワカラン
223デフォルトの名無しさん:04/12/09 16:33:24
ソースはこんな感じです
(改行が多いといわれたのでメンバ変数を省略しました)
GetEdgeToのなかでEdgeクラスが見つからないと言われてしまいます

#include "CommonInclude.h"
#include <list>
#include "boost/numeric/ublas/vector.hpp"
#include "Edge.h"
using namespace std;
class Edge;
class Vertex
{
public:
Edge *GetEdgeTo(Vertex *vertex);
protected:
void SetPoint(vector<precision> *point) {this->point = point;}
void SetEdgeList(list<Edge> *edgeList) {this->edgeList = edgeList;}
private:
list<Edge> *edgeList;
};
inline
Edge *Vertex::GetEdgeTo(Vertex *vertex)
{
for (list<Edge>::iterator itr = edgeList->begin(); itr != edgeList->end(); itr++) {
Vertex *head = (*itr).GetHead();
if (head == vertex)
return &*itr;
}
return NULL;
}
224デフォルトの名無しさん:04/12/09 16:35:08
>>223
Edge.hの中でEdgeクラスが定義されてるなら
class Edge; ←これを消してみれば
225デフォルトの名無しさん:04/12/09 16:37:05
additional storage 使わないでスワップするときって、int型ならXOR使ってっていうのは、
分かったんだけど、doubleとか char の場合ってどうするか分かりますか?
226217:04/12/09 16:38:28
>>224
Edge.hの中でVertexクラスを使っているので
それをとってしまうと循環参照がうまく解決されないのです
227デフォルトの名無しさん:04/12/09 17:28:03
>>226
ならinlineは無理
228217:04/12/09 17:36:13
>>227
そういうものなんですか・・・
それってどの辺を調べれば出てきますか?
229デフォルトの名無しさん:04/12/09 17:44:35
1クラス1ファイルという馬鹿げた習慣をやめる
230デフォルトの名無しさん:04/12/09 17:50:01
>>223
// a.h
#ifndef A_H
#define A_H
class B;
class A {B *mv; void mf();};
#include "B.h"
inline void A::mf() {B b;}
#endif
//b.h
#ifndef B_H
#define B_H
class A;
class B {A *mv; void mf();};
#include "A.h"
inline void B::mf() {A a;}
#endif
231デフォルトの名無しさん:04/12/09 18:16:01
>>226
>Edge.hの中でVertexクラスを使っているので
どういうコード書こうとしているのかによりますけれど,普通edgeにはvertexを
指す機能だけを持たせればよいのですから,Edgeが必要とするのは
Vertex *(またはそれと同等なもの)だけで,その場合Edgeから見えるべきなのは
Vertexの前方宣言だけで良いと思うのですが.

あと根本的な話として,Boostを使っているならBoost.Graphを見てみてはどうですか?
232デフォルトの名無しさん:04/12/09 18:43:30
UNIXじゃC++はバッチ処理にしか使われてないって本当?
233デフォルトの名無しさん:04/12/09 18:55:38
バッチ処理に使われているのはRuby
C++なんて問題外^^;;;
234デフォルトの名無しさん:04/12/09 18:57:53
そうですか、やっぱりRubyを勉強することにします。
ありがとうございました。
235デフォルトの名無しさん:04/12/09 19:21:48
ちょっと待って!
ソフトウェアの規模によって違うよ。 Ruby > Perl > awk かな??
236デフォルトの名無しさん:04/12/09 19:29:37
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> awk >>>>>>>>>>>>>>>>>>>>> sed >>>>>Perl
237デフォルトの名無しさん:04/12/09 19:48:01
何でそんなに比較したがるの?
238デフォルトの名無しさん:04/12/09 19:50:30
Rubyが優れた言語であることは否定のしようがない事実。
そのことを皆が分かるまで続けます。
239デフォルトの名無しさん:04/12/09 19:51:11
Pe = ぺ・ヨンジュン
240デフォルトの名無しさん:04/12/09 19:51:49
>>237
どれもスクリプティング言語だから、それぞれの特徴にあった使い分けをする必要がある。
もし、それをしなかったら世の中に一つの言語しかなくなるよ。
そして、>>235は各言語に向いている開発規模を比較したものであり、言語の優劣を
比較したものではない。
241デフォルトの名無しさん:04/12/09 19:51:55
Perlだけは許せない。
242デフォルトの名無しさん:04/12/09 19:52:43
>>238
自己記述可能な処理系になってから言って下さい
243デフォルトの名無しさん:04/12/09 19:53:02
最近のUNIXではPerlは入ってないよ。
既にRubyに完全に取って代わられました。
244デフォルトの名無しさん:04/12/09 19:54:06
UNIX板にRubyのスレはありますがPerlのはありませんね。
それが全てを物語っています。
自分もPerlは削除しました。
245デフォルトの名無しさん:04/12/09 19:55:47
Perlerはクズみたいな連中だからwebprogにでも行けばいいのに。
なに大きな顔してム板にいるのやら。
CGIと混同されるぐらいしか脳のないセンス0の糞言語が。
246デフォルトの名無しさん:04/12/09 19:58:07
C++も糞。
Ruby作者のmatz氏のお言葉をよく聞け。

http://web.archive.org/web/20000302001334/http://www.ruby-lang.org/ja/compar.html

C++
いろいろと有名なオブジェクト指向言語であるC++とRubyを比較すると:


C++なぞ問題外.^^;;;

http://web.archive.org/web/20000302001334/http://www.ruby-lang.org/en/compar.html

C++
C++ is famous OOPL in many places. Now, let's compare C++ with Ruby:


Ruby is too good to compare ;-)
247デフォルトの名無しさん:04/12/09 20:03:16
なぜLispと比較しないのか
248デフォルトの名無しさん:04/12/09 20:03:35
Rubyの欠点は速度かな
249デフォルトの名無しさん:04/12/09 20:06:54
Rubyの欠点は名前のせいでPerlと何か関係があるかのように信じている人が多いこと。
RubyはPerlより先に生まれ、独自に発展した言語。
Perlを参考にしたこともなければその格からして違う。
250デフォルトの名無しさん:04/12/09 20:09:49
南京大虐殺なみの捏造ですね
251デフォルトの名無しさん:04/12/09 20:13:21
たかが宣伝のためのリップサービスをまともに受け取っている馬鹿がいる。
RubyはPerlと全く関係がない。作者自身がそれを明言している。
252デフォルトの名無しさん:04/12/09 20:57:20
ここが C++ スレだということを忘れそうになる惨状だな……
253マイク ◆yrBrqfF1Ew :04/12/09 21:57:19
>>240
使い分ける必要はないな。
好きな言語を作る自由があるから沢山言語があるだけだ。
254デフォルトの名無しさん:04/12/09 23:57:14
Rubyが大好きだということはわかったから、連投はやめれ
255デフォルトの名無しさん:04/12/10 00:02:17
C++がRubyよりはるかに劣った存在であるということもご理解いただけましたか?
256デフォルトの名無しさん:04/12/10 00:10:56
Ruby使ってるとキチガイになるということがよく分かった。
257デフォルトの名無しさん:04/12/10 00:17:45
matz氏がイカレポンチであると再認識した
258デフォルトの名無しさん:04/12/10 00:52:42
JISX3014が閲覧可能。日本語版のANSI/ISO14882:2003のようなもんだな。
http://www.jisc.go.jp/app/pager?id=120287
259デフォルトの名無しさん:04/12/10 00:54:31
げっ、こいつ一丁前にreferrer見てやがる。
トップページから、JIS検索→X3014とやって見てくれ。
http://www.jisc.go.jp/
260デフォルトの名無しさん:04/12/10 01:07:32
JISのPDFは画像データだから検索が出来ないんだよな…
261デフォルトの名無しさん:04/12/10 01:08:23
>>260
できないね。糞だわ。でもタダだし一応取っておいて損はない鴨。
262デフォルトの名無しさん:04/12/10 05:30:46
その点ドキュメントの充実しているRubyとは違うね。
263デフォルトの名無しさん:04/12/10 09:40:01
質問です。

何らかのタイプ設定をenumでセットするクラスがあるとすると、通常はこういう構成になると思います。

class Hoge{
public:
  enum TYPE {A,B,C};
  Set(TYPE type);
private:
  TYPE type_;
};

Hoge hoge; hoge.Set(Hoge::A); hoge.Set(Hoge::B); hoge.Set(Hoge::C);

Setを呼び出すたびにHoge::という修飾が必要なのがわずらわしいので、
以下のように名前空間を利用できないだろうかと考えています。
なお、名前空間名は必ずクラス名をすべて大文字にしたもの、で統一するつもりです。

namespace HOGE { enum TYPE {A,B,C}; }
class Hoge{
public:
  Set(HOGE::TYPE type);
private:
  HOGE::TYPE type_;
};

using namespace HOGE; Hoge hoge; hoge.Set(A); hoge.Set(B); hoge.Set(C);

クラス利用者がusingディレクティブによって必要に応じて冗長な修飾を
削れるため、後者のほうが、優れた手法だと思っています。
なにか見落としている欠点などありますでしょうか?
264デフォルトの名無しさん:04/12/10 11:02:15
>>263
他の同じようなクラスで、enum TYPE {A, B, C};のようなことができない。
例えば、class Hageでも同じようなenumがあったとして、
名前空間を使わなければhoge.Set(Hoge::A) と hage.Set(Hage::A) で使い分けられる。
名前がぶつからないようにHageの方ではAを使わないようにするくらいなら、
初めからenumをclass内に閉じ込める必要ないと思う。
265デフォルトの名無しさん:04/12/10 11:06:03
class Hoge{
public:
    SetHogeA();
    SetHogeB();
    SetHogeC();
};
にしとけば利用者の手間は一番減る
266デフォルトの名無しさん:04/12/10 11:14:27
>>264
>名前空間を使わなければhoge.Set(Hoge::A) と hage.Set(Hage::A) で使い分けられる。
名前空間を使っても使い分けられるよ
267デフォルトの名無しさん:04/12/10 11:44:32
template<class Foo>
class Hoge {...}
という場合、Hoge は「テンプレート クラス」ですが、
Foo はなんと呼べばよいでしょうか?
268デフォルトの名無しさん:04/12/10 11:51:17
>>267
テンプレート引数。
実際に渡される実引数と区別するなら仮引数。
intなどの非型引数と区別するなら型引数。

ちなみに、Hogeは規格中の言葉の「クラステンプレート」のほうをお勧めしたい。
269263:04/12/10 11:56:30
>>264
すでに>>266さんが指摘されてますが、名前空間でもその点は問題ありません。
ちなみにEfffective C++の28項に解説してあります。

>>265
なるほど、つまりこうですね。

class Hoge{
public:
  void SetTypeA(void){Set(A);}
  void SetTypeB(void){Set(B);}
  void SetTypeC(void){Set(C);}
protected:
  enum TYPE {A,B,C};
  Set(TYPE type);
private:
  TYPE type_;
};

インラインだから余計なコストもおそらくないし、全部クラス内に収まってるし、
enumの範囲チェックも不要になるしで、どうもこれがベストの手法に思えます。
ありがとうございました。

>>267
ついでの横レスですが、
×テンプレートクラス
○クラステンプレート
だったはずですよ。
270デフォルトの名無しさん:04/12/10 13:27:02
>>258
前まで売ってたやつですか?
次回からテンプレ追加ですね。しかし混んでいるのか落とせねぇ
271デフォルトの名無しさん:04/12/10 13:35:55
常に定数しか引数にしないのか?
272デフォルトの名無しさん:04/12/10 13:37:40
float型やdouble型に対する
% 演算子的な標準関数または手法ってあるんでしょうか?

なければ作るまでですが、自分で変なの拵えるよりはと。
273デフォルトの名無しさん:04/12/10 13:40:48
fmod
274デフォルトの名無しさん:04/12/10 13:42:45
>>273
即レスありがとうございました。助かりました。
275267:04/12/10 14:00:02
>>268 >>269 ありがとうございます。
クラス テンプレート、テンプレート引数、ですか。

あともう一つ呼び名が分からないのですが、
クラス テンプレートのテンプレート引数として指定するクラスの
シグニチャのことを何と呼ぶのでしょうか?

たとえば、
template<class Junk, class Food>
class JunkFood {...};

となっていて、Junk と Food には、
ある種のプロトタイプのメンバ関数が必ず必要とします。
このような場合、私はダミークラスを定義しているのですが、

// 実装のないシグニチャだけのクラス
class JunkTempl {
void Weight(void);
double Value(void);
};

このような JunkTempl を一般になんと呼ぶのでしょうか?
276デフォルトの名無しさん:04/12/10 14:03:07
インターフェースクラス
277デフォルトの名無しさん:04/12/10 14:05:01
クラスインターフェースか(´・ω・`)
しかも微妙に違ってるorz
278ネムー:04/12/10 15:36:26
forループの中に、計算データを保存するプログラムを書いて、
10ループ毎に計算データを保存するというような事はできるんでしょうか?

ファイル名をループ毎に自動で指定させる事ができなくて困っています。
bccを使っています。
わかる方教えてください。よろしくお願いします。
279デフォルトの名無しさん:04/12/10 15:37:56
>>278
std::stringstream
280デフォルトの名無しさん:04/12/10 15:41:19
>>278
単なる一例ですが。

#include <iostream>
#include <sstream>
#include <string>

int main()
{
for (int i = 0; i < 100; i++)
if ((i % 10) == 0) {
std::string s;
std::stringstream str(s);

str << "filename" << i / 10;
std::cout << str.str() << std::endl;
}
}
281デフォルトの名無しさん:04/12/10 21:10:37
>>261
思いっきりナメられてるな
OCR 書ける香具師はこんなの見ねえってさw
282デフォルトの名無しさん:04/12/11 00:53:02
ウインドウモードの時、指定した画面サイズ(W,H)から周りの枠線やタイトルバーを除いた幅と高さはどうやって求めればいいのですか?
283デフォルトの名無しさん:04/12/11 01:01:01
スレ違い
284282:04/12/11 01:56:40
ん?C++スレの質問ですよね?
間違っていないと思うんですが、一体どこで質問しろとorz
285デフォルトの名無しさん:04/12/11 02:00:04
ウィンドウ(GUI)が出てくる時点で標準C++の規格外。
WindowsならAPIスレなりMFCスレに逝くべし。
286デフォルトの名無しさん:04/12/11 02:01:17
>>284
このスレは機種に依存しない話題だけをメインに扱っている。
多分Win32APIかどこかで聞いた方がいい。
287デフォルトの名無しさん:04/12/11 02:06:51
どこが適切な場所かわからないなら環境依存OKスレで聞いとけ。
288デフォルトの名無しさん:04/12/11 02:11:44
それを言うならこっちだろ
http://pc5.2ch.net/test/read.cgi/tech/1100963189/
289282:04/12/11 02:16:38
そうなんですか、知らなかった・・・ソウイウダイジナコトハテンプレニイレテテクダサイヨorz
VBでは領域を調べることができるのでC(++)でもできるのかと思ってました。
>>288
なんかこれもスレ違いな気がするけど行ってきます(´`)>
290デフォルトの名無しさん:04/12/11 02:20:27
iteratorを扱う関数って、NULLチェックとend()チェックしないとダメなの?
void f(T::iterator i) { 
  if (i && i->ptr) { 
    x = i->ptr->data; 
  } 

もっと簡単にできる?
291デフォルトの名無しさん:04/12/11 02:21:27
C++はマイクロソフトの商品名じゃねぇぞ。アフォ。
292デフォルトの名無しさん:04/12/11 02:22:20
まちがえた。
void f(T::iterator i) { 
  if (i && i != c.end() {
    x = i->data; 
  } 

293デフォルトの名無しさん:04/12/11 02:29:36
このスレでたまに初心者を煽ってる人いるんだが、
本来、C++プログラマってあんまり劣等感に満ち溢れた奴って少ないだろ?
会社などでも比較的優秀な人材をC/C++に配属するしさ。

でありながら、>>291のように誹謗の機会をうかがう哀れな負け組がこのスレにくるのは何故だろう・・・?
会社の研修でC/C++をやらされたが会社側に事実上のダメ出しされたために屈折してしまった馬鹿が
Cプログラマを装ってスレを荒らしているのではないか?

私の知ってるCプログラマは、皆、温厚で忍耐強いがなぁ。
私は、短気なCプログラマに出会ったことがない。
294デフォルトの名無しさん:04/12/11 02:30:41
iteratorの有効性なんぞ呼び出し側に保証させとけ
295デフォルトの名無しさん:04/12/11 02:35:13
Dプログラマだから
296デフォルトの名無しさん:04/12/11 02:40:12
Dプログラマは所詮お遊び。仕事には使えない。
297270:04/12/11 02:45:29
クッキー切ってたorz
298デフォルトの名無しさん:04/12/11 02:45:57
GNU次第
299デフォルトの名無しさん:04/12/11 08:59:34
>>293
>私の知ってるCプログラマは、皆、温厚で忍耐強いがなぁ。

お前はそいつらの何を知ってる?全部を知り尽くしてるのか?
表で温厚で忍耐強くがんばってる分、抑圧されたストレスも他の人より多いだろう。
300デフォルトの名無しさん:04/12/11 09:05:18
つうかそもそも >>282 のことぐらいググるなり、MSDN検索するなりして自分で調べろ、と思うんだが。
301デフォルトの名無しさん:04/12/11 14:36:39
>>299
> 表で温厚で忍耐強くがんばってる分、抑圧されたストレスも他の人より多いだろう。
お前はそいつらの何を知ってる?全部を知り尽くしてるのか?
302デフォルトの名無しさん:04/12/11 15:55:18
ostringstream o("aaa");

o << "bbb";
cout << o.str() << endl;

これを実行するとbbbとしか表示されないのですが
正しい挙動ですか?
aaabbbと表示されるのを期待していたのですが。
303デフォルトの名無しさん:04/12/11 16:02:37
>>258
これローカルに落とせないの?
304デフォルトの名無しさん:04/12/11 16:18:18
>>302
std::ostringstreamのコンストラクタは std:string を引数に取る。

従って、

std::ostringstrem o("aaa"); は、
std::ostingstream(std::string("ooo")); と同じ。

以降はこの一時stringオブジェクトに対して操作が行われる。
そして、最初の出力を実行した時、書き込みポインタはバッファの
先頭にあるため、"aaa"が"bbb"で上書きされる。

もし期待通りの結果を得たければ、先に o.seekp(3); としておかなければならない。
305デフォルトの名無しさん:04/12/11 16:19:43
>>303
大きな声では言えないが、Temporary Internet Filesの中にあるはず。
これ以上は自分で考えろ。
306デフォルトの名無しさん:04/12/11 16:29:15
>>304
ありがとうございました。
o.seekp(3);を挟んだらaaabbbと表示されました。

本にo << "aaa" << "bbb";を、>>303のように書くこともできる
と書いてあったので困惑してました。
307デフォルトの名無しさん:04/12/11 16:33:47
>>306
ちなみに、それ、何て本?
308デフォルトの名無しさん:04/12/11 16:36:08
>>307
プログラミング言語C++第3版です
309デフォルトの名無しさん:04/12/11 16:37:03
>>304
std::stringstreamが取るのはconst std::string&だろ?
310デフォルトの名無しさん:04/12/11 16:41:57
つか日本語訳なんていらんだろ
311デフォルトの名無しさん:04/12/11 16:43:45
>>308
何章かな?
>>309
確かにそうだね。という事は バッファの中身をいじっても元の std::stringは
不変である事を保証しているのかな?謎だ・・・・
312デフォルトの名無しさん:04/12/11 16:47:54
スマソ。>>304には間違いがありました。

std::stringstreamは独自の内部バッファを持ち、コンストラクタに取った
std::stringの中身は内部バッファにコピーされるんでした。だから
const std::string& なんだね。

しかし、書き込み/読み取りポインタがバッファの先頭にある事は変わり
ないので、書き込んだり読み取ったりすると、先頭から行われるのは
変わらない。
313デフォルトの名無しさん:04/12/11 16:49:22
>>311
21.5.3の文字列ストリームの732ページ
>>280で知って、使ってみようとちょっと読んだだけなので
自分が間違ってるかも。
314デフォルトの名無しさん:04/12/11 16:51:14
>>313
今読んでみたが、>>306のような事は書いてない。
ま、文字列ストリームは普通のファイルストリームと似たような感覚で
扱えばいいんじゃない?
315デフォルトの名無しさん:04/12/11 17:02:23
今日本語訳の方ではなく、元の方のerrataを見たら
ostringstream o("aaa",ios_base::ate);
こんな風に直されてました。
316デフォルトの名無しさん:04/12/11 17:05:41
>>315
それなら分かる。std::ios_base::ateは、ファイルを開いた後にファイルの最後に
移動するオープンモードフラグだから。
317デフォルトの名無しさん:04/12/11 17:11:17
>>299,301
Cプログラマに外向的な性格の人は少ないでしょ。
ストレスを他者への攻撃に転化するタイプは少ないように思う。
ただし、あくまで人数が多い少ないの話であって2chを訪れる人の中には、
Cプログラマの適性がないにもかかわらず、
Cをやってるorやらされてる、迷惑な人が少ないながらもいるんだろう。

C/C++は古い言語ということもあって新しい言語よりも理不尽。
その理不尽さに耐えるだけの適性がないと、辛いわな。
318デフォルトの名無しさん:04/12/11 17:33:41
>>303,305
>大きな声では言えないが、Temporary Internet Filesの中にあるはず。
>これ以上は自分で考えろ。
大きな声で言えないも何もkonquerorだと開くか保存するかを聞いて来るのだけど
これってローカルに入れちゃダメなの?
319デフォルトの名無しさん:04/12/11 17:50:31
言語で性格がくくれると思っている人は、星座占いとか好きそうだな
320318:04/12/11 18:04:50
>>319
私は、星座占いや血液型占いは全く信じないし、
TVの朝のニュース番組で占いが出てくると即、チャンネルを変える。
朝のバタバタした時間帯に占いを流すTV局が増えたのは実に情けないことだと思っている。
非科学的な分野が市民権を得ていることが情けない。

公共の電波は落書き帖じゃねーんだ。そういうことは毒電波専門チャンネルで流せ、な?(AA略)
と、心の中でツッコミを入れている次第である。
321デフォルトの名無しさん:04/12/11 18:16:50
このコードを強引にコンパイルする方法はありますか?

struct Object
{
    static void static_hoge() {};
};
void Hoge()
{
    Object.static_hoge(); // この2行は、
    Object object; // 一切変更できない
}

例えば、
typedef Object* ObjectPtr;
const Object& Object = *((ObjectPtr)0);
をグローバル宣言することでstatic_funcの呼び出しは解決しますが、
型名と変数名が衝突してしまいます。

目的はパズル的な事なので意味はありません。
322デフォルトの名無しさん:04/12/11 18:19:32
よくわからん。出直せ。
323デフォルトの名無しさん:04/12/11 18:27:05
>>332
Object::static_hoge();
ではなく
Object.static_hoge();
でアクセスできないかという意味です
324デフォルトの名無しさん:04/12/11 19:08:21
txtファイルに文字をうって
そのあと、そのファイルに文字を追加入力するには
どうすればいいのでしょう?
読み込んだ配列に配列を足すでは無理みたいで
325デフォルトの名無しさん:04/12/11 19:20:43
>>323
staticメンバ変数はインスタンス無しで呼び出せるが、後者の書式は
インスタンスを必要とするので、何でもいいからObject型のオブジェクトを
作成すればいいのでは。
326デフォルトの名無しさん:04/12/11 19:33:39
>>325
Object.static_hoge();の部分は変更できませんので、
インスタンス名がObjectでないといけません。
そうするとObject objectの部分で型名と衝突し、
通常はコンパイルエラーが出ると思います。

また、適当なインスタンスを作成するよりは、
325の通りNULL参照を使う方が低コストかと考えました。
327デフォルトの名無しさん:04/12/11 19:41:25
つまり、JavaなりDelなりからC++に移って
記法が気に入らないから、合わせる方法はないか探しているということですね。
328デフォルトの名無しさん:04/12/11 19:53:56
>>327
そんなところです。
気に入らないわけではありませんが
同じコードが動けば楽かと思いまして。
329デフォルトの名無しさん:04/12/11 20:03:00
無理なものは無理
330デフォルトの名無しさん:04/12/11 20:05:38
プリプロセッサでも通せ
331デフォルトの名無しさん:04/12/11 20:34:21
namespaceで囲えばいいんでは?

namespace Hoge {
 struct Object {
  static void func() { cout << "Nurupo" << endl; }
 };
}

typedef Hoge::Object *ObjectPtr;
const Hoge::Object& Object = *((ObjectPtr)0);

Object.func();
332デフォルトの名無しさん:04/12/11 20:55:30
>>331
この2行をクリアしたいのですが、無理ではないでしょうか
Object.func();
Object obj;

スレ違いな気もしますので、これ以上はやめておきます。
失礼しました。
333デフォルトの名無しさん:04/12/11 21:22:07
郷に入れば郷に従え
334デフォルトの名無しさん:04/12/11 21:29:03
>>332
cppで。

#define Object instance
Object.func();
#undef Object
#define Objec className
Object obj;
335デフォルトの名無しさん:04/12/12 11:58:12
インデックス値が、小さい方から大きい方へ順番に入っている
配列やリストを指す言葉ってありますか?大きい方から小さい方でも構いません。
336335:04/12/12 12:00:25
これじゃ意味不明だ。
ええとインデックス値というのは、ユーザ定義の序列みたいなものでお願いします。

どうでも良いといえば良いのですが、こういう概念を一言で表せると考えやすいので…。
337デフォルトの名無しさん:04/12/12 12:03:38
もしかして昇順、降順のことか?
338デフォルトの名無しさん:04/12/12 12:31:06
>>337
ありがとうございます
昇順リスト、昇順配列と呼ぶことにします
339303:04/12/12 14:30:21
>>305
いや、ここで聞く前にそこ探したんだけど
イメージが見つからなかったのよ… とほほ
340デフォルトの名無しさん:04/12/12 14:50:26
>>339
Cygwinでも入れてfindで探すとか。
341デフォルトの名無しさん:04/12/12 14:54:37
Operaで開こうとすると「保存しますか?」と出て保存できるのは内緒だ
342デフォルトの名無しさん:04/12/12 15:12:24
C99のときは再インストール後、Acrobat Readerをインストールする前にそこへ行ってきて、
お馴染み、ファイルのダウンロードのダイアログから堂々と保存しました。

今回はTemporary 〜 から引っぱってきたけどね。
343デフォルトの名無しさん:04/12/12 15:19:19
>>339
画面にPDF開いた状態で探さないと閉じたら消されるとかかもしれん。
画面に出したまま探してみ。拡張子PDFで。
344デフォルトの名無しさん:04/12/12 16:07:40
>>339
C:\Documents and Settings\XXXXXXX\Local Settings\Temp\
にPDFのtmpファイルがあったのでリネームでOKだったxp。
345339:04/12/12 17:05:37
>>340-344
みんなアリガト

ExplorerだとTemporary Internet Filesの下のContent.IE5とかが見えなかったんだけど
Cygwinでfind . -name '*.pdf'したら一発で見つかったよ

これローカルに落としてもAcrobatのメニューが使えないのね…
346デフォルトの名無しさん:04/12/12 17:27:31
>>345
画像データだから。
それからExplorerだと隠しフォルダ属性を取らないと見つからないかもね。
347デフォルトの名無しさん:04/12/12 18:21:14
コンテナからeraseするときは、iteratorを後置インクリメントすると良いと習ったのですが

for (iterator = container.begin(); it != container.end();){
    if (条件が合えば){
        container.erase( iterator++ );
//     iterator = container.erase( iterator );
    }
    else {
        ++iterator;
    }
}

これだとcontainerがvectorなどだと、最後尾のコンテナを削除したとき
エラーが出てしまいます(コメントアウトした方のやり方だと大丈夫)。
私が習ったやり方はあまり良い物では無いのでしょうか。
348デフォルトの名無しさん:04/12/12 18:26:45
>>347
Effective STL 嫁
削除系関数はイテレータを無効化するので
container.erase( iterator )
では iterator が無効化されてしまう
349デフォルトの名無しさん:04/12/12 18:27:40
>>347
>私が習ったやり方はあまり良い物では無いのでしょうか。
その通り。
350348:04/12/12 18:28:31
あ、スルーしてくり
351デフォルトの名無しさん:04/12/12 18:29:28
>>347
オマエ、もしかして早合点のクセないか?
そんなことを教えるわけがなさそう
352デフォルトの名無しさん:04/12/12 18:31:09
>>348-349
listとかだと上手くいくので、私が何か勘違いしているのかと不安でした。
今後はコメントアウトした方で行きます。Effective STLも求めてみます。
レスありがとうございました。
353デフォルトの名無しさん:04/12/12 18:41:17
>>352
「習った」とあるが、本当にそう教わったのなら教えた香具師が馬鹿。
教えた香具師が信頼できるのなら教わった藻前が早合点している。
354デフォルトの名無しさん:04/12/12 18:49:41
標準シーケンスコンテナではeraseの戻り値、
標準連想コンテナではのようにするってことじゃないの?
355デフォルトの名無しさん:04/12/12 22:02:51
基本的なことなんですけど、文字色はどうやったらかえれますか、
できたら教えてください。
356デフォルトの名無しさん:04/12/12 22:04:00
>>355
ちっとも基本的なことじゃないから安心しろ。
http://www.kumei.ne.jp/c_lang/intro/no_58.htm
357デフォルトの名無しさん:04/12/12 22:04:25
できないので教えられない
358デフォルトの名無しさん:04/12/12 22:04:52
なるほど、ありがとうございます
359デフォルトの名無しさん:04/12/13 00:03:23
wmpの視覚エフェクトを自分で作っているのですが、
現在再生中のファイル名と
再生した経過時間を取得するにはどうすればいいでしょうか。。

板違いだと思うのですが、どこで聞いてよいか分からなくて、、、
どなたかご教授ください。
360デフォルトの名無しさん:04/12/13 00:50:00
361359:04/12/13 00:57:53
誘導ありがとうございます。
362デフォルトの名無しさん:04/12/13 11:27:29
以下のようなコード(ただしhoge_tはPODではない)で、クラスA,Bの
コンストラクタ起動時は変数a,bのコンストラクタ起動前なのに
a,bへのポインタを使っていますが、これはC++の規格的にOKですか?

#include<iostream>
class Base {
protected:
  hoge_t a b, *ptr;
  Base( hoge_t *p ) : a(), b(), ptr( p )
  { a= ...; b= ...; } //aとbの初期化処理
public:
  const hoge_t get(void) { return *ptr; }
};
class A : public Base {
public:
  A(void) : Base( &a ) {}
};
class B : public Base {
public:
  B(void) : Base( &b ) {}
};
int main(void){
  A a;
  B b;
  std::cout<< a.get()<< "\n";
  std::cout<< b.get()<< "\n";
  return 0;
}
363デフォルトの名無しさん:04/12/13 21:25:44
フラグを使うときにintなら
int f_hoge=0;
f_hoge = 1 - f_hoge;
みたいに出来ますが、
このフラグをboolでやるとすると
どのようになりますか?
364デフォルトの名無しさん:04/12/13 21:30:55
>>363
bool fHoge = false;
fHoge = !fHoge;
365デフォルトの名無しさん:04/12/13 21:32:04
>>362
hoge_tってどこから出てきた?
366デフォルトの名無しさん:04/12/13 22:15:46
>>362
それは結局「以下が可能か?」という問いに帰着されるような気がする
struct hoge_t {};
struct Base {
hoge_t a, *ptr;
Base() : ptr( &a ), a() {}
};

gccだと362は(typoを適当に直して)-Wallでも警告なしでコンパイルされるのに対して
上の例は警告が出る
規格だとどうなんでしょうね?
367デフォルトの名無しさん:04/12/13 22:22:07
>>362
struct hoge_t {};
class Base {
protected:
hoge_t a, b, *ptr;
Base() : a(), b(), ptr(0) {}
};
class A : public Base {
public:
A(void) : Base() {ptr = &a;}
};
class B : public Base {
public:
B(void) : Base() {ptr = &b;}
};
だと規格上確実だと思うけどダメかい?
368デフォルトの名無しさん:04/12/13 22:32:59
>>366
派生クラスの構築は、基底クラスのコンストラクタが呼び出されてから
メンバ、派生クラスの順に初期化されるから大丈夫じゃね?

gcc3.4.2で-Wallにしてみたが警告は出ない。
369デフォルトの名無しさん:04/12/13 22:35:56
>>367
あーそっか。aとbがまだ初期化されてないうちに使うとまずいね。
370デフォルトの名無しさん:04/12/14 01:43:18
皆さん回答ありがとうございます。
>365氏
hoge_tは実際にはテンプレートを使ったクラスです。
>366氏
そのコードでは、aへのポインタを得るタイミングが>362より若干遅い気がします。
>367氏
最初はそのコードと同様にしてたのですが、それだと
・ptrをNULLで初期化してから派生クラスでもう一度設定しなおすという回りく
 どい処理になる
・派生クラスでptrの設定をしなくてもコンパイルできてしまう(実行時まで派生
 クラスでのptr設定忘れに気が付けない)
ので>362でコードを書いて、Win2KPro,cygwin1.5.9,gcc3.3.1という環境でコン
パイルは通るのですが、未初期化の変数へのポインタを使うことがC++の規格と
して正しいのか気になって質問しました。
私はなんとなくCの不完全型へのポインタと似た感じを受けるので規格違反して
いないと思っています。
371362:04/12/14 01:44:10
失礼しました。>370は私の書き込みです。
372デフォルトの名無しさん:04/12/14 01:51:48
>>370
未初期化の変数へのポインタが使えないと、自己参照型クラスは
作れなくなるぞ。
373デフォルトの名無しさん:04/12/14 01:56:34
>>370
もし hoge_t::operator&() があると、ctor の前にこれ呼ばれる?
374デフォルトの名無しさん:04/12/14 02:00:01
>373
それは完全にundefined behavior
375デフォルトの名無しさん:04/12/14 13:56:45
C++はC99と後方互換が無いんですか?
376デフォルトの名無しさん:04/12/14 14:02:22
>>375
後方互換の話ならC99スレを立ててそこで議論してくれ。
もちろん後方互換ではないけど。
377デフォルトの名無しさん:04/12/14 14:34:52
後方互換とはなんだと調べようとしたらIMEのやつ広報5巻って出してくる。
ワラッテサキヘススメン。
378デフォルトの名無しさん:04/12/14 18:22:11
% [ttt.cpp] %%%%%%%%%
#include <stdio.h>
class SampClass {
public:
SampClass();
~SampClass();
private:
void memFunc000(void);
};
typedef struct tagSampStruct {
struct {
SampClass aaa;
};
} SampStruct;
int
main(int argc, char **argv)
{
printf("Hello\n");
}
%%%%%%%%%%
というコードをgccでコンパイルすると、
> ttt.cpp:14: error: member SampClass tagSampStruct::<anonymous struct>::aaa'
> with constructor not allowed in anonymous aggregate
> ttt.cpp:14: error: member SampClass tagSampStruct::<anonymous struct>::aaa'
> with destructor not allowed in anonymous aggregate
というエラーが発生しますが、VC++ではエラーが発生しません。
VC++でも同様のエラー(ワーニングでも可)を発生させたいのですが
そのようなことは可能でしょうか?
ご教示おねがいいたします。
379デフォルトの名無しさん:04/12/14 20:06:08
教えて下さい!
参照って何 具体的な使用例とか、詳しいサンプルとかほしいなぁ
お勧めのホームページとか、あったら教えて欲しいし
お願いしますね
380デフォルトの名無しさん:04/12/14 20:09:14
>>379
詳しくはC++Primerをお読みください。
381デフォルトの名無しさん:04/12/14 20:10:45
>>378
警告レベルをW4にすると
warning C4201: 非標準の拡張機能が使用されています : 無名の構造体または共用体です。
と出てくれる
382デフォルトの名無しさん:04/12/14 20:15:52
>>380
ありがとうございます。
でも ごめんなさい・・・C++Primerって何処にあるんですか???
383デフォルトの名無しさん:04/12/14 20:16:22
本屋
384デフォルトの名無しさん:04/12/14 20:18:49
本屋さんですか?(泣)
C++Primerって本なんですか?困ったな
385デフォルトの名無しさん:04/12/14 20:26:08
>>384
初心者にありがちなのですが、初心者だから初めはWEBページでちょっと勉強してから、
というような人が多いようです。
しかし、誰か得体もしれぬ人が作ったようなWEBページは多くの場合、説明が不適切・
不親切であったり、まとまりにかけていたり、そうでなかったとしてもごく一部の
話題しか取り扱わなかったりして、とても読みにくいものです。
また、解かりやすい解説を捜し当てるのにかかる手間がかかるでしょう。
もし、許されるならば書籍を購入された方がはるかに有意義だと思いますよ。
386デフォルトの名無しさん:04/12/14 20:27:40
>>385
> また、解かりやすい解説を捜し当てるのにかかる手間がかかるでしょう。
訂正:また、解かりやすい解説を探し当てるのにわりと手間がかかるでしょう。
387デフォルトの名無しさん:04/12/14 21:26:44
C++Primerってヘンーナ日本語訳しているよね。
デリファレンスとか、インデクスとか。
388デフォルトの名無しさん:04/12/14 22:05:02
一見親切にも見えるWebページは情報が不正確だったり
最悪うその垂れ流しだったり、うのみにしてはいけない。
その判断が自分で出来ないなら書籍を買う方が良い。
ただし、書籍にも糞本はいっぱいあるから気を付けれ。
389デフォルトの名無しさん:04/12/14 22:17:13
390デフォルトの名無しさん:04/12/14 22:26:59
レビューがすごいな
391デフォルトの名無しさん:04/12/14 22:28:53
>>379
まずは、禿本だな
それでわからんかったとこを方々調べて解読

俺自身、そうやって憶えた
当時の禿本は初版だったが・・・
392デフォルトの名無しさん:04/12/14 22:30:39
>>389
俺もだまされたうちの一人
393デフォルトの名無しさん:04/12/14 23:23:58
>>389 にくらべればこっちの方が100倍マシ
ttp://www.amazon.co.jp/exec/obidos/ASIN/4798008532/
394デフォルトの名無しさん:04/12/14 23:39:26
>>389
レビュー禿ワラタ
395デフォルトの名無しさん:04/12/14 23:40:21
立ち読みで判りそうなことばかり・・・ アフォかこいつら
396デフォルトの名無しさん:04/12/14 23:52:14
>>395
買わなくてもコメント出来るから君もすれば?
397デフォルトの名無しさん:04/12/15 00:25:45
構造体って必要ですか?
全部クラスに統一した方がスッキリすると思うんだけど。
398デフォルトの名無しさん:04/12/15 00:30:30
>>397
そもそもC++の構造体はクラスと大差ない。
399デフォルトの名無しさん:04/12/15 00:34:12
>>398
っていうかデフォルトの可視性以外全部一緒
400デフォルトの名無しさん:04/12/15 00:39:47
つーか、classのデフォルトもpublicでいいだろ。特に基底クラス
401デフォルトの名無しさん:04/12/15 00:39:51
>>399
機能としてはそうですよね。
言語仕様を無駄に煩雑にしてる気がするんですが、
クラスを使わず構造体を使う方が適切なケースってあります?
402デフォルトの名無しさん:04/12/15 00:40:56
Cからの遺産
403デフォルトの名無しさん:04/12/15 00:42:35
POD使いたい時
404デフォルトの名無しさん:04/12/15 00:46:43
>>400
だよな。デフォルトがprivateだからついついメンバ変数を先に書いちゃったりする。
普通に考えたらインターフェースであるpublicメンバ変数が上に来てるほうが良いってことは明らかなのに。
405404:04/12/15 00:48:19
>publicメンバ変数
publicメンバ関数
406デフォルトの名無しさん:04/12/15 00:48:49
C++FAQには短いプログラムを書くときにこの方が便利だからと
書いてあったが、やっぱ public が上にある方がいいよな
407デフォルトの名無しさん:04/12/15 01:01:19
>>406
その場合structで書けばいい。
関数オブジェクトはよくstructで書く。
408デフォルトの名無しさん:04/12/15 01:03:11
>>406
class いらねーよな
テンプレには typename だし
409デフォルトの名無しさん:04/12/15 02:29:05
C++自体がいらない
410デフォルトの名無しさん:04/12/15 02:41:20
>>409
んなこたぁーない。
411デフォルトの名無しさん:04/12/15 03:05:42
構造体がアラインされてないとパフォーマンスが大きく低下するって聞いたのですが、何故こうなるんですか?
412デフォルトの名無しさん:04/12/15 03:10:08
>>411
CPUによる。CPUによってはアラインされていないとバスエラーを起こして
そもそも動かないものもある。
413デフォルトの名無しさん:04/12/15 03:55:11
32bitのデータを32bit境界から開始しておけばそのまま32bitで取り出せるが
8bit境界で適当に開始されていると24bit+8bitとか16bit+16bitとか分離して
読み込んだあと結合しないといけないから。
414デフォルトの名無しさん:04/12/15 09:05:10
>>413
器用で、寧ろ余計なお世話なCPUだな。普通のCPUはそんなことしない。
415デフォルトの名無しさん:04/12/15 09:32:15
>>414
かつて "普通" だった CPU はしっかりやっていたが・・・
416デフォルトの名無しさん:04/12/15 09:49:53
余計なお世話というより、互換性のためにしょうがなくやってるって感じか。
417デフォルトの名無しさん:04/12/15 10:03:50
組込み系だといまだにそれが普通なんじゃないの?
418デフォルトの名無しさん:04/12/15 10:58:01
alignmentがいい加減でもパフォーマンスが落ちるか落ちないか
っていうのはRAM側の問題じゃないの?
419デフォルトの名無しさん:04/12/15 11:05:35
>>418
DSPなんかだと、RAMというよりコアの問題だと思う。
C++の話題じゃないけど(w
420デフォルトの名無しさん:04/12/15 11:12:08
>>418
dynamic phase alignment をサポートしてるかどうかってことでいいの?
スレ違いだけど >>411 の疑問は解消しなければ
421デフォルトの名無しさん:04/12/15 11:15:02
RAMとは関係ないんじゃないの?
メモリ空間にマッピングされるのってRAMだけとは
限らないわけだし。(例えばレジスタとか)
422デフォルトの名無しさん:04/12/15 11:21:22
構造体のメンバーへのアクセスってメモリの先頭からのオフセットだよね?
mallocとかnewとかで確保した領域にアクセスする場合でも
最適化でレジスタに読まれてから処理されてるん?
アセンブラ出力させて調べてみよう・・・orz
423デフォルトの名無しさん:04/12/15 11:22:20
>>422
質問の意味がわからないけど、レジスタに入れないとなにもできないと思う……
424デフォルトの名無しさん:04/12/15 11:27:11
>>423
そうか?
425デフォルトの名無しさん:04/12/15 11:40:04
>>424
俺もわからん。解説してくれ。
426423:04/12/15 11:59:34
アホなこと言った?だったらゴメン。
レジスタ使わないでできることと言ったら、DMAくらいしか思いつかない……。
427デフォルトの名無しさん:04/12/15 12:18:25
x86系なら、一応メモリに直接演算出来るし
比較程度だったら、レジスタに読み出さないでやってるかも。
速度的には不利になる場合も多いけど。

でも、メモリに対して演算できても、
その結果を読み出して使う段では、普通はレジスタにロードするね。


関係ないけど、google翻訳(日→英)で、デストラクタを訳すと
Death Tractor (死のトラクター)になるらしい。
D言語スレで見た。
428デフォルトの名無しさん:04/12/15 14:11:13
むしろExcite翻訳がかなり正確にム用語を訳せて驚いた
429デフォルトの名無しさん:04/12/15 18:03:37
>>422
アーキテクチャに夜。
32bitと64bitでも違うことあるし。
430デフォルトの名無しさん:04/12/15 18:41:42
1+2+3,1+2-3,1-2-3,1*2-3,・・・・・・のように符号を変えていって値を
求めたいのですが、

char fugou[4]={'+','-','*','/'};
for(a=0; a<=2; a++){
cout<<1<<fugou[a]<<2<<fugou[a]<<3<<endl;
}

COUTからどのようにして答えを出せばいいのでしょうか?
431デフォルトの名無しさん:04/12/15 19:33:53
すっごい初歩的な事かもしれないんですが、いくら書籍&サイトを
探しても載ってなかったので質問です。

メンバにint mIntを持つクラスAがあったとして

A a;
int n = a; //int n = a.mInt;

というような代入をする演算子をオーバーロードする事は出来ますか?
既出だったらすみません。


432デフォルトの名無しさん:04/12/15 19:35:13
>>430
その宿題は演算子の優先順位も考慮しないといけないんじゃないのかな?
433デフォルトの名無しさん:04/12/15 19:42:00
>>431
intへのキャストをオーバーロードすればいいんでない?
434デフォルトの名無しさん:04/12/15 20:00:01
>>433
なるほど!!!!!
ありがとうございます!!!!
あ、キャストをオーバーロードした時って何か弊害ありますかねぇ?
435デフォルトの名無しさん:04/12/15 20:04:30
import java.awt.Graphics;
import java.applet.*;
import java.awt.Image;

public class Test extends Applet {
Image im[] = new Image[4];

public void init() {
im[0] = getImage(getDocumentBase(), "a.gif");
im[1] = getImage(getDocumentBase(), "b.gif");
im[2] = getImage(getDocumentBase(), "c.gif");
im[3] = getImage(getDocumentBase(), "d.gif");
}

public void paint(Graphics g) {
double x = Math.PI * 0;
double y = 200 - Math.sin(x);
for (int i=0; i<4; i++){
g.drawImage(im[i], 100 * x, y, this);
x += Math.PI * 1/4 ;
}
}
}

という画像をsinカーブ上に並べる プログラムを作成したのですが、コンパイルすると、
436デフォルトの名無しさん:04/12/15 20:04:50
シンボルを解決できません。
シンボル:メソッド drawImage (java.awt.Image,double,double,Test)
場所 : java.awt.Graphics の クラス
   g.drawImage(im[i],100 * x,y,this);
    ^
エラー1個

というエラーがでてしまいます。どこがおかしいのでしょうか?
ttp://pc5.2ch.net/test/read.cgi/tech/1100559011/859-861
でも聞いたのですが直りません。お願いします。


437デフォルトの名無しさん:04/12/15 20:06:25
>>434
不用意にprivateメンバの保護を剥がすような(ポインタを返すような)事をしなければ大丈夫
438デフォルトの名無しさん:04/12/15 20:07:10
>>435>>436
Java厨はスレ違いだから他へ逝け。
439デフォルトの名無しさん:04/12/15 20:09:35
標準偏差ってどう求めればいいの?
440デフォルトの名無しさん:04/12/15 20:16:39
>>439
分散の平方根でいいのでは?
441デフォルトの名無しさん:04/12/15 20:16:56
ぐぐれ
442デフォルトの名無しさん:04/12/15 20:17:39
>>439

平均値を出して、各値と平均値の差を二乗し、その和を取り、要素数-1で割り、平方根を取る
443デフォルトの名無しさん:04/12/15 20:25:39
>>437
ありがとうございました。早速使ってみます!
444デフォルトの名無しさん:04/12/15 20:26:35
> 要素数-1で割り

どっから出た
445デフォルトの名無しさん:04/12/15 20:30:01
>>444
高卒?
446デフォルトの名無しさん:04/12/15 20:33:46
>>444
1/nでもいいんだけど、n-1にしておくと
無作為にm個選んだ場合の分散の期待値が
全体の分散と一致するんだよ
447デフォルトの名無しさん:04/12/15 20:48:24
439です
どうもありがとう
エクセルのような関数ってないですか
448デフォルトの名無しさん:04/12/15 20:53:38
>>447
stdev及びstdevp
helpをみると446の話が出てくるはず
449デフォルトの名無しさん:04/12/15 20:54:38
>>447
>エクセルのような関数
なのね
間違ったorz
450デフォルトの名無しさん:04/12/15 20:58:28
>>447
gslとか
451デフォルトの名無しさん:04/12/15 21:00:27
gslはライブラリの名前です
ttp://www.gnu.org/software/gsl/

標準ではないと思う
452デフォルトの名無しさん:04/12/15 21:02:22
ていうかそれぐらい自作しる
453デフォルトの名無しさん:04/12/16 12:34:05
447です。
gsl 英語が読めないので自作します
ありがとうございます。

454デフォルトの名無しさん:04/12/16 13:31:26
template <class T, int A> T aaa()
{
return A + aaa<T, A - 1>();
}

template <class T> T aaa<T, 1>()
{
return 1;
}

エラーが出てコンパイル出来ないのですが
どこが間違えているのでしょうか?
455デフォルトの名無しさん:04/12/16 13:56:20
>>454
ModernC++Designにも書いてある通り、
関数テンプレートはメンバ/非メンバ問わず部分的な特殊化ができない。
(コンパイラはオーバーロードなのか特殊化なのか判別ができない)
オーバーロードを使って解決することも出来るけど、
その程度ならコンパイル時定数として保持するのが吉。
456デフォルトの名無しさん:04/12/16 14:02:54
>>455
ありがとうございます。
これは試しに書いてみただけなので困ることはないんですけど
すっきりしました。
457デフォルトの名無しさん:04/12/16 15:30:52
>>454
関数テンプレートの部分特殊化をエミュレートする方法として
クラステンプレート + 静的関数ってのがあるので,参考までに.

template<class T, int A>
class aaa
{
static T invoke(){ return A + aaa<T, A - 1>::invoke(); }
};

template<class T>
class aaa<T, 1>
{
static T invoke(){ return 1; }
};

aaa<int, 10>::invoke();
458デフォルトの名無しさん:04/12/16 17:53:25
標準入力の入力バッファをクリアする方法ってあるでしょうか?
scanf() するときに、以前に入力されたものが入力バッファに入っていると、
使いにくいプログラムになるので、
scanf() する前に入力バッファをクリアしたいのです。
459デフォルトの名無しさん:04/12/16 18:06:44
>>458
std::cin.readsome()ってのがあったような。
OSのバッファには効かないけど。
460デフォルトの名無しさん:04/12/16 18:10:50
>>458
while (getchar() != EOF); では駄目かな
461デフォルトの名無しさん:04/12/16 18:52:19
それだと、入力にウェイトがかかって無限ループになるだけ。
462デフォルトの名無しさん:04/12/16 19:36:33
直接のC++の相談じゃないんだけど、
C++でコンパイルして、MS−DOSで結果でた、そのウインドウを
そのウインドウ自体のまま画像にするのってどうしたらいいんでしょう??
463デフォルトの名無しさん:04/12/16 19:37:35
>>458
fgets()でめいっぱい読み込んでからsscanf()するのは、そういう問題が
起きないようにするためだ。

但しfgets()で指定した文字数よりも余計に入れられると、これもだめだ
けどね。
464デフォルトの名無しさん:04/12/16 19:53:10
>>462
デジカメで撮る。
465デフォルトの名無しさん:04/12/16 19:59:56
>>462
Alt + PrintScreen
466デフォルトの名無しさん:04/12/16 20:19:06
>>465
ありがとう。
でも、できないみたいけど・・・?
できてるとしたら、画像ってどこに配置されてる?
467デフォルトの名無しさん:04/12/16 20:20:15
>466
板違い。PC初心者板へ池
468デフォルトの名無しさん:04/12/16 20:23:25
>>466
ペイント開いて、Ctrl+V
469デフォルトの名無しさん:04/12/16 20:24:02
>>466
クリップボード
470デフォルトの名無しさん:04/12/16 22:14:14
>>462
つーか、何で画像にしたいの?
471デフォルトの名無しさん:04/12/17 01:20:12
>>462
foo.exe > foo.txt

これで済むんじゃないのん?
472デフォルトの名無しさん:04/12/17 02:21:45
Javaできる、C#できるって人がC++始めたいのに最適な書籍はありませんか?
その前にC覚えろって話しですか?
473デフォルトの名無しさん:04/12/17 03:24:10
その前に先ず日本語だろ。
474デフォルトの名無しさん:04/12/17 03:30:07
>>473
オマエガナー
475デフォルトの名無しさん:04/12/17 03:41:51
>>472
C++Primer
476デフォルトの名無しさん:04/12/17 11:09:28
タスク教えて
477デフォルトの名無しさん:04/12/17 11:44:08
>>476
どの?
478デフォルトの名無しさん:04/12/17 13:34:02
ゲイは澪タスク
479デフォルトの名無しさん:04/12/17 15:05:58
局所静的オブジェクトって最初に通る時に一度だけ初期化されるんですよね。これって
どうやってるんですか? 素直に考えてフラグを持って通るたびに条件分岐?
それとも最初に通った時に自分自身を書き換えるような事をしてるんでしょうか。
480デフォルトの名無しさん:04/12/17 15:08:13
>>479
もちろん実装依存だが、普通は毎回テストしてるはず。
481デフォルトの名無しさん:04/12/17 15:28:37
>>479-480
「最初に通る時に一度だけ初期化」っていうのはそういう意味じゃなくて、
「実行ファイルのロード時に局所変数領域にイミディエイト値もロードされる」
ってこと。
482デフォルトの名無しさん:04/12/17 15:31:50
局所変数領域がなんで最初に確保されるんだ?っていう突っ込みもあろうが、
それはコンパイラが提供するスコープ範囲の機能を実現する都合だけであって、
静的である以上はいつ確保しても同じ。
483デフォルトの名無しさん:04/12/17 15:34:08
>481-482
オブジェクトと変数は違うと思うけど・・・
484デフォルトの名無しさん:04/12/17 15:48:53
当然だとは思うけど

class Hage {・・・};
void hoge() { static Hage hage; }

hogeを複数スレッドから同時に呼び出した場合、hogeの初期化を同期なんてしてくれませんよね?
485484:04/12/17 15:49:33
hogeじゃなくてhageの初期化でした。
486デフォルトの名無しさん:04/12/17 15:50:44
static だからインスタンスは1個
同期も糞もないと思うが
487デフォルトの名無しさん:04/12/17 15:55:20
staticメンバはmain()関数の実行を開始する前に既に初期化を終えているんだっけ?
488デフォルトの名無しさん:04/12/17 16:11:45
>>486
関数内のstatic変数は最初に実行されたときに初期化されると規格で決まってるらしい。
489デフォルトの名無しさん:04/12/17 17:00:31
>>487
通常のローカル変数同様、変数宣言の字面上の位置で初期化される。
例えば int f(int a) { static b = a; return b; } があった場合、
b には初回呼び出し時の引数が代入され、以後ずっと変化しない。

>>486
一個だからこそ同期うんぬんという話が出てくるように思えるが・・・
490デフォルトの名無しさん:04/12/17 17:04:38
int f(int a) { static const b = a; return b; }
これなら大丈夫
491デフォルトの名無しさん:04/12/17 20:13:54
もちろん実装依存だとは思うけど

VC++,bcc,gccの3つは
初期化処理が必要な、関数内のstaticデータ
int f() { static int n = atoi("123"); return n; }
は、単純にフラグを使って
実行されるたびに初期化されたかを判定していて
同期処理は無しでした。
492デフォルトの名無しさん:04/12/17 22:40:50
C++ で行列クラスを作っていて、転置行列を返す関数を実装したいと思っています。
その場合、

class Matrix {
  ...
  Matrix Transpose(void) const;
};

のような設計で問題ないでしょうか?
たとえば、

Matrix a;
Matrix b = a.Transpose()

とした場合、Matrix オブジェクトは一度しか生成されていない (それが b)
ということが保証されるでしょうか?
493デフォルトの名無しさん:04/12/17 22:48:20
いんにゃ
普通はコピーコンストラクタでコピーされる

設計は問題ないと思うけどね
494デフォルトの名無しさん:04/12/17 22:49:08
敢えて言うなら返値はconst Matrixの方がいいと思う
495デフォルトの名無しさん:04/12/17 22:50:32
>>493
そうですか。
やはり無駄なコピーを抑えたければ、
void Transpose(Matrix* m) const;
みたいにしないといけませんか。

>>494
え?その必要はないと思いますけど。。。
496デフォルトの名無しさん:04/12/17 22:52:48
>>494
参照でもないのに何で const ?
497デフォルトの名無しさん:04/12/17 22:54:04
一時オブジェクトへの代入を禁止するため?
498デフォルトの名無しさん:04/12/17 22:57:48
何も考えてないんじゃ?
499デフォルトの名無しさん:04/12/17 22:58:35
C++ にこんな仕様があると便利かも。
仮にキーワード noncopy を導入して

class Matrix {
  noncopy Matrix Transpose(void)
  {
    noncopy Matrix m;
    ... m を転置行列としてセットアップ ...
    return m;
  }
};

と記述すると、戻り値の Matrix が引数の最後にポインタとして
渡されたかのように処理される。
そのポインタを受け取るのが、実装における noncopy 宣言された変数。
500デフォルトの名無しさん:04/12/17 23:02:33
>>493
実際は大抵最適化でコピーしないようになるし、規格だってそういう動作にしても良いと書いてあるはず。
501デフォルトの名無しさん:04/12/17 23:19:46
それ(戻り値最適化)が出来るのは
戻り値を return Matrix(...); と書ける場合のみ
502デフォルトの名無しさん:04/12/17 23:20:38
ちょっと訂正
×戻り値最適化が出来るのは
○戻り値最適化によって、コピー回数がゼロになるのは
503デフォルトの名無しさん:04/12/18 03:28:29
>502
名前付き戻り値最適化っていうのも規格上は許されていますけれどね.
実際にコンパイラが最適化出来るかどうかはまた別の問題ですが.
504デフォルトの名無しさん:04/12/18 07:29:39
>>501
明示的なキャストの評価結果は?
505デフォルトの名無しさん:04/12/18 07:30:22
>>501
オブジェクトを()ではなく=で初期化した場合は?
506501:04/12/18 07:34:04
揚げ足取りうざい
507デフォルトの名無しさん:04/12/18 08:02:28
>>506
ちょっとしたタイポ類ではなく
言ってる内容の本筋の誤りを指摘したわけだが
逆切れか・・・

ま、そういう手合いならこちらもそのつもりでいようか
508デフォルトの名無しさん:04/12/18 08:57:54
>>504=>>505=>>507はトリップ付けてね
509504=505=507 ◆dGkqy8VIyg :04/12/18 09:05:50
すまんかった
510デフォルトの名無しさん:04/12/18 09:24:35
509は俺じゃない
ま、「そーゆー手合い」のすることですから (プ
511デフォルトの名無しさん:04/12/18 09:27:03
(何一人で熱くなってるんだろ…)
512デフォルトの名無しさん:04/12/18 09:29:54
ナニこのヒト?
って感じ。
513デフォルトの名無しさん:04/12/18 09:38:02
最適化の話はどうした?
ぐうの音も出ないのか

ま、そーだろな (プ
514デフォルトの名無しさん:04/12/18 09:54:18
ぐぅ〜



( -Д-)あ〜腹減った…
515デフォルトの名無しさん:04/12/18 13:46:52
二次元配列を動的にメモリ確保するにはどうすればいいんでしょうか。

int xsize = 100;
int ysize = 100;
int ** array = new int[xsize][ysize];

では駄目でした。
516デフォルトの名無しさん:04/12/18 13:57:53
>>515 Ruby!
517デフォルトの名無しさん:04/12/18 13:58:28
>>515
こうすればいいけど、std::vectorを使うほうが楽。
int x = 100;
int y = 100;
int ** array = new int*[x];
array[0] = new int[x * y]
for (int i = 1; i < x; i++)
  array[i] = array[0] + i * y;

delete[] array[0];
delete[] array;

518デフォルトの名無しさん:04/12/18 15:12:29
>>517 は二次元配列とは呼ばない。ポインタの配列。
519デフォルトの名無しさん:04/12/18 15:24:17
>>515
char (*p)[50];
p = new char[100][50];
520デフォルトの名無しさん:04/12/18 16:09:58
MFCのダイアログベースアプリ作ってます。
CStringの変数の中に半角スペースが入っているか確かめるにはどうすればいいでしょうか。
全角スペースは関係なしです。

たとえば、CString AAA; の中身が
"c:\\program files\\test\\test.exe"
これならNG
"c:\\testapp\\test\\test.exe"
これならOK
という具合にしたいです。
521デフォルトの名無しさん:04/12/18 16:18:01
>>520
AAA.Find(' ')じゃだめか?
ついでにGetShortPathNameも調べてみな
522デフォルトの名無しさん:04/12/18 16:18:28
>>520
スレ違い。
523デフォルトの名無しさん:04/12/18 18:42:32
どなたか>>519をかみ砕いて説明していただけないでしょうか…
char(*)[50]型のpを宣言しているのは何となく分かるのですが
524デフォルトの名無しさん:04/12/18 18:50:51
>>523
char a[100][50]; は char b[50]; が100個繋がったもの。
つまりchar b[50]; がarray_50という型だとすると array_50 a[100]; という風に考えることができる。
>>519に当てはめると
array_50 *p;
p = new array_50[100];
となるから俺もわかんなくなってきたから自分で考えてくれ。
525デフォルトの名無しさん:04/12/18 18:59:49
new char[100] はcharが100個連続したものを返してくるから
charへのポインタで受ける。
new char[100][50] はchar[50]が100個連続したものを返してくるから
char[50]へのポインタで受ける。
526デフォルトの名無しさん:04/12/18 19:13:05
>>524,525ありがとうございます。
やっていることはわかるのですがpの宣言の仕方にひっかかっています。
もっと調べてみます。
527デフォルトの名無しさん:04/12/18 19:16:27
>>519
それだと

int x = 100, y = 100;
char (*p)[y];
p = new char [x][y];

これができないと思うんだけど
528デフォルトの名無しさん:04/12/18 20:09:53
そもそもyの部分がコンパイル時に決まらないと2次元配列は無理だな。
529デフォルトの名無しさん:04/12/18 20:21:38
>>517
でええやん。
530& ◆QWv3R1XL8M :04/12/18 21:08:56
15日でC++をSTL、テンプレまで使えるようになる修行方法教えてください。
531デフォルトの名無しさん:04/12/18 21:10:33
>>530
まずはペンキ塗りからだ。終わったら床掃除。
532デフォルトの名無しさん:04/12/18 21:15:09
便所掃除も忘れるなよ
533デフォルトの名無しさん:04/12/18 21:25:56
>>529
>>517 は論外
534デフォルトの名無しさん:04/12/18 21:48:29
ある動的に生成されたクラスが、他のポインタに参照されている
、あるいはされていないということを実行中に知ることは出来ますか?

class CA{...}:

int main(void){
CA pca = new CA();
void* = pca;
if(pca->参照されているか否か())
{
cout<<"参照されてない"<<endl;
}

}
535デフォルトの名無しさん:04/12/18 21:52:28
>>534
言わんとすることはわかるが、めちゃくちゃだな。
答えとしてはできない。
536デフォルトの名無しさん:04/12/18 21:58:32
多分求めたいものはshared_ptr
537デフォルトの名無しさん:04/12/18 22:00:45
shared_ptr<CA> pca(new CA);
shared_ptr<CA> pca_p;

pca_p = pca;

if (pca.use_count() == 1) {
 cout << "参照されていない" << endl;
}
538デフォルトの名無しさん:04/12/18 22:01:03
>535
すまん、C++は余り知らんのだ。

C++でJAVAのGCみたいなことできないかなと思ったが、
やっぱ素直にスマートポインタ使えと言うことなのかな
539デフォルトの名無しさん:04/12/19 03:01:55
>534
weak_ptr?
540362:04/12/19 03:28:51
>538
Boehm GCはどうよ?
541デフォルトの名無しさん:04/12/19 05:03:53
月狼タンハァハァ
542デフォルトの名無しさん:04/12/19 05:11:53
うちの大学の講師が変数は全て関数の最初で宣言した方が
わかりやすいって言っているんですが、これってどうなのでしょうか…?
543デフォルトの名無しさん:04/12/19 06:16:21
ただ単にCに慣れてるだけだろ
544デフォルトの名無しさん:04/12/19 07:58:31
>>542
(;´Д`)
わかりやすいかどうかは別にして、無駄にコンストラクタが呼ばれることが増えるな。
545デフォルトの名無しさん:04/12/19 08:37:59
>>542
関数の最初ではなくスコープの最初というのなら、わからんでもない。
ソースをCに移植した時、泣きを見ずにすむのは確かだ。
546デフォルトの名無しさん:04/12/19 08:45:57
>>545
>ソースをCに移植した時
そんなことするか?
するとしたらそれこそ変数の宣言位置の問題なんかかわいいもんだろう。
547デフォルトの名無しさん:04/12/19 10:08:33
>>542
そのうち、

メンバ関数を使うと処理が分散してわかりにくくなるので禁止
アクセスしやすいようにメンバ変数はグローバルにする
#define TRUE 1

などと言い出すに違いない
548デフォルトの名無しさん:04/12/19 10:13:30
>ソースをCに移植

extern "C"
549デフォルトの名無しさん:04/12/19 10:19:31
>>545
現実問題としてC++で構築されたものをCしかない環境へ移植しなければならないって案件見たことないんだけど、なんか事例ある?
よほど小さい簡易なコードならわからんでもないんだけど。
550デフォルトの名無しさん:04/12/19 10:39:28
551デフォルトの名無しさん:04/12/19 10:55:08
Cocoaアプリへの移植とか?
Mac使ったことないから良く知らないけど
552デフォルトの名無しさん:04/12/19 13:22:33
>>547
> #define TRUE 1
これの笑いどころが理解出来ない。
553デフォルトの名無しさん:04/12/19 13:28:31
if(strcmp(unko, geri) == TRUE) goto 552;
554デフォルトの名無しさん:04/12/19 13:35:11
555デフォルトの名無しさん:04/12/19 14:08:52
>>553
ワロタ
556デフォルトの名無しさん:04/12/19 14:24:18
>>553-555の笑いどころが理解できない
557デフォルトの名無しさん:04/12/19 19:26:18
>>556の笑いどころが理解できない
558デフォルトの名無しさん:04/12/19 19:37:40
void func()
{
return void;
}

int main()
{
func();
}

結果:コンパイルエラー
結論:C++はvoidを返値として使えるというのは嘘です。
559デフォルトの名無しさん:04/12/19 19:39:13
int func()
{
return int;
}

int main()
{
func();
}

結果:コンパイルエラー
結論:C++はintを返値として使えるというのは嘘です。
560デフォルトの名無しさん:04/12/19 19:58:40
( ゚д゚)ポカーン
561デフォルトの名無しさん:04/12/19 20:02:38
m9(^Д^)プギャー
562デフォルトの名無しさん:04/12/19 20:05:54
563デフォルトの名無しさん:04/12/19 20:09:10
>>558
観測対象の選択を誤っている
564デフォルトの名無しさん:04/12/19 20:22:10
なんとなくぬるp
565デフォルトの名無しさん:04/12/19 20:24:09
main()
{
char a;

(int)a = 0;
}

結果: コンパイルOK
結論: 標準変換の結果は左辺値であるというのは本当です。
566デフォルトの名無しさん:04/12/19 20:38:41
>>565
error出たぞ
567デフォルトの名無しさん:04/12/19 20:56:28
test.cpp(5) : error C2106: '=' : 左のオペランドが、左辺値になっていません。
test.cpp(6) : warning C4508: 'main' : 関数に戻り値の型が指定されていません。戻り
値を void 型と見なします。
568デフォルトの名無しさん:04/12/19 21:15:30
リソースファイルの書き方が詳しく乗ってるサイト知りませんか?
検索したのに見つかりません
569デフォルトの名無しさん:04/12/19 21:18:46
>>568
リソースファイルってもいろいろあるわけなんだが…
570568:04/12/19 21:23:22
bcc + winAPI
のです。
英語出来ないので日本語のページでお願いします
571デフォルトの名無しさん:04/12/19 21:51:44
英語できないならプログラミングも止めたら?
572デフォルトの名無しさん:04/12/19 21:54:10
>>571
うっせー馬鹿。シネヨ屑
573デフォルトの名無しさん:04/12/19 21:56:44
>>572
人間やめたら?
574デフォルトの名無しさん:04/12/19 22:01:02
575デフォルトの名無しさん:04/12/19 22:01:05
>>517ってdelete[]時にxが必要無いようにするアプローチだと思いますが
これって三次に拡張できますか?
576デフォルトの名無しさん:04/12/19 22:08:25
>>575
そりゃできるけど、面倒くさい。vector使え。
577デフォルトの名無しさん:04/12/19 22:09:58
boost::multi_arrayの方がいいかと
メモリを連続領域に確保してくれるし
578デフォルトの名無しさん:04/12/19 22:18:43
>>573
    ・ ・ ・ ・ ・ ・
俺は人間をやめるぞぉぉ JoJoォォォ
579デフォルトの名無しさん:04/12/19 22:23:15
>>576,577
どうもです。
vector使ってますが、517の手法は初めて見たもんでおもしろくて。
やれるのであれば、やってみます。
580568:04/12/19 22:51:23
>>574さん
ありがとうございます
調べるキーワードが、見当違いだったみたいです。
>>572さん、落ち着いて
581デフォルトの名無しさん:04/12/20 02:50:06
ISO/IEC 14882:1998とISO/IEC 14882:2003でどこが変わったのか書いてある資料ってありませんか?英語でもかまいません。
規格票には変更点は書いてないようなんですが、あの量を読み比べるのはさすがにつらいので。
582デフォルトの名無しさん:04/12/20 03:58:58
>581
1998から2003への変更は正誤表(Technical Corrigenda, TC)の追加なのでそれを追えば良いと思います.
言語のコアな部分に関しては
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#TC1%20Status
で"Status: TC1"となっているもので,標準ライブラリに関しては
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html
で"Status: TC"となっているものがそれに当たります.
上のリストには2003以降で新たにTCとなったものも入ってるかも知れません.
583デフォルトの名無しさん:04/12/21 11:12:04
C++でビットマップなどの画像表示とかってできるのでしょうか?
584デフォルトの名無しさん:04/12/21 11:12:55
こりゃまた抽象的な質問ですね
585デフォルトの名無しさん:04/12/21 11:16:18
質問させてください、仮想関数を持つクラスから菱形継承した場合、
普通のメンバの曖昧さの解決はできると思いますが、仮想関数は
どうなるのでしょうか。試してみたのですが仮想関数の継承でエラー出ました。
以下のようなパターンです↓
class A {
  int i;
  virtual void Hoge(void){i = 0;}
};

class B : virtual public A {
  void Hoge(void){i = 1;}
};

class C : virtual public A {
  void Hoge(void){i = 2;}
};

class D : public B, public C {
};

この場合DにHogeを書けばコンパイルは通りますが、
例えばDでBのHogeを使いたいなんて思ったときどうすればよいのでしょうか?
「多重継承なんか使うな」とかは無しでお願いします
586デフォルトの名無しさん:04/12/21 11:26:52
>>584
できる
587586:04/12/21 11:27:27
みす。
>>583
588デフォルトの名無しさん:04/12/21 11:28:48
>>585
B::Hoge();
589デフォルトの名無しさん:04/12/21 11:53:24
レスありがとうございます、すみません仮想継承だということを
書き忘れてました(´・ω・`) (i と Hoge()の実体を一つにしたいわけです
DでHogeを実装しない場合(585のコードそのままだと)
「error C2385: 'C::Hoge' の派生があいまいです。
warning C4385: 可能性 : 'Hoge' がベース 'A' of class 'C' にあります。
warning C4385: または : 'Hoge' がベース 'B' of class 'C' にあります。」
と出ました(´・ω・`) (VC
DにBと同じ内容のHogeを書けば済むのですが、
そんなことしなくても済む方法があればなぁと思いました。
590デフォルトの名無しさん:04/12/21 12:02:31
class D : public B, public C {
void Hoge(){ なんか }
void Piyo(){ B::Hoge(); }
}
って意味じゃないの?
591デフォルトの名無しさん:04/12/21 12:04:10
クラスの静的メンバ変数を、インラインで定義することはできないでしょうか?
↓こんな感じにやりたいのですが。
class Hoge {
public:
  static const char* name = "ほげ太郎";
};
592デフォルトの名無しさん:04/12/21 12:07:02
>>591
できない
593585:04/12/21 12:09:50
なるほど!理解力なくてすみませんでした_| ̄|○
コード量も無駄に増えなくて済みますね(菱形継承の時点でアレだけど)、
>>588 >>590 助かりました、どうもありがとうございました!
594デフォルトの名無しさん:04/12/21 12:11:56
>>591
環境依存でいいのなら__declspec(selectany)
595デフォルトの名無しさん:04/12/21 12:53:47
C++で自作した汎用的なソースが増えたので
自作ライブラリを構築しようかと思っておりますが
名前とか、ファイルのフォルダ分けとかの形式
悩んで作れません。
名前空間使うとdoxygenのhtmlヘルプファイルがわかりにくくなるし
かといって無しだと、何かとぶつかる可能性もあるし(CThread等)
クラス名のプリフィックスにライブラリ名(ここでは、GDKとする)
GDKThreadとつけても、なんかしっくりこない。
3日後には、ププーGDKなんて何かっこつけてんですか?
どうせラッパーでしょ。と自己嫌悪

あと、フォルダ分類。
Graphis/Sound/Input/Window/...等分類しようとしていますが
分類しづらいファイルタイプもあったりするし
#include "Graphics/Texture.h"みたいにわざわざ改装指定めんどいし、
かと言って、全部同じフォルダだと150以上のファイルがごっちゃになるわけで。


自分の優柔不断さに呆れてきました。
ガツンと何か言ってくれ

596デフォルトの名無しさん:04/12/21 13:16:54
>>595
公開するインクルードファイルが何でそんなにたくさんになるのやら。
必要最低限だけ公開するようにしたら?
#まさか1クラス1ファイル主義じゃあるまいし。
597デフォルトの名無しさん:04/12/21 13:59:41
>>595
名前空間を使え
ディレクトリは細分しちゃえ

迷ったら「boost もそうしてるし」と念じる。
598デフォルトの名無しさん:04/12/21 15:16:28
>>596
主義じゃないけどたまに1クラス1ファイルあるかも。

Graphics関連が
Mesh.Texture,Light,Fog,Camera,Sharder,...等たくさんあったり
ひとまとめにした方がいいですかね。
でも、モデルファイル(XFile)が複雑だ
あああ

>>597
boostの構造調べてみます。
みました。細分してみたー。
yaneSDK3みたいになってきた。(´・ω・`)これでいいのかな。

まあああ
整理整頓できない子ですみません。

とりあえず、名前空間は導入
名前空間使う言語って少数派じゃない?
きもいけど慣れたら大丈夫かな

こうなったら、たくさんC++機能利用してやるか。

古い人に教わってたから
変な呪いがかかってるんだ。
C依存考慮、固定少数の呪縛や、速度、容量(数KByte)気にしすぎたりとか。
599デフォルトの名無しさん:04/12/21 16:07:41
Javaのパッケージは高度な名前空間と言えなくもない。
600デフォルトの名無しさん:04/12/21 17:05:11
パッケージが羨ましい

namespace MyName{

   伺か

}

閉じるのめんどくさい。
601デフォルトの名無しさん:04/12/21 17:09:12
伺かかよ
602デフォルトの名無しさん:04/12/21 17:16:51
deleteすんのめんどくさい
603デフォルトの名無しさん:04/12/21 17:32:30
そこでD言語ですよ
604デフォルトの名無しさん:04/12/21 17:38:16
そこでBoehmですよ
605デフォルトの名無しさん:04/12/21 17:52:32
j a v a
606デフォルトの名無しさん:04/12/21 18:00:53
BCBからSQLiteを操作するのに参考になるサイトを教えてもらえませんか?
607デフォルトの名無しさん:04/12/21 18:19:14
たぶんスレ違い
Builderスレ
608デフォルトの名無しさん:04/12/21 18:19:53
609デフォルトの名無しさん:04/12/21 18:46:13
ひまわり言語
610デフォルトの名無しさん:04/12/21 23:55:08
>>596
そんなもん人の勝手
611デフォルトの名無しさん:04/12/22 00:08:07
>>600
namespace MyName{

   伺か

\e
612デフォルトの名無しさん:04/12/22 00:37:03
C以外の何か with class

                                  \e
613デフォルトの名無しさん:04/12/22 00:55:29
今初めてえんい〜の意味を知った
そのままだったのね
614デフォルトの名無しさん:04/12/22 02:07:41
C with classがあるのにD without classがないのはなぜだろう
615デフォルトの名無しさん:04/12/22 03:15:45
>>613
そのまま??
わからんおせーて
616デフォルトの名無しさん:04/12/22 08:49:18
>>614
みんな君ほど頭がヒマじゃないからだと思う。
617デフォルトの名無しさん:04/12/22 20:12:09
>C with classがあるのに

ねえよ、少なくとも C++ の系譜上にそんなのは
禿のサイトでも調べてからもの言えよまったく
618デフォルトの名無しさん:04/12/22 20:23:50
619デフォルトの名無しさん:04/12/22 21:35:17
STLのvectorコンテナについてわからないことがあるのですが

int型を格納する場合は
vector<int> array;
int data;
ary.push_back(data);
のように単純ですが

自作のクラスを格納する場合は
vector<JisakuClass> array;
JisakuClass *aaaa = new JisakuClass;
ary.push_back(*aaaa);

この場合は2行目のnewで確保したメモリは
ary.clear();
などしたときにSTL側で開放処理をしてくれるのでしょうか?
それとも自分で開放しなければいけないのでしょうか?自分で開放するのでしたら
どのタイミングで開放すればいいのでしょう・・・

vector<JisakuClass> array;
JisakuClass data;
ary.push_back(data);

そしてこのようにした場合、dataがスコープ外にでて消滅した場合でもvector内のデータは大丈夫なのか
その辺の関係がわかりません
簡単にでもいいので助言をくださいませ
>などしたときにSTL側で開放処理をしてくれるのでしょうか?
いいえ。
>それとも自分で開放しなければいけないのでしょうか?
はい。
newによって割り当てられたオブジェクトへのポインタがコンテナに格納されている場合は
自分で全部deleteしてまわる必要があります。

>自分で開放するのでしたら
コンテナを破棄する前に自分で解放する必要があります。

>そしてこのようにした場合、dataがスコープ外にでて消滅した場合でもvector内のデータは大丈夫なのか
大丈夫じゃありません。

>簡単にでもいいので助言をくださいませ
see also boost::shared_ptr
621デフォルトの名無しさん:04/12/22 22:00:41
>>619
push_back()でpushされるJisakuClassのオブジェクトは、JisakuClassのコピーコンストラクタ
によって生成されたオブジェクトです。
これはstd::vectorのclear()時にJisakuClassのデストラクタを呼び出してくれますが、元々
newで確保した方のオブジェクトはそのままです。
push_back()でstd::vector()に入れられるオブジェクトと、newで生成したオブジェクトは別の
物である事を理解しましょう。
622デフォルトの名無しさん:04/12/22 22:21:22
619です

あくまでvectorコンテナに格納されるものはコピーコンストラクタによって
作成されたオブジェクトであって、コピー元のデータは自分で処理をする

vectorにクラスを格納する場合、STLが開放処理をしてくれる
vectorにクラスへのポインタを格納する場合、clearするまえに自分で開放する

要約するとこういうことになるのでしょうか

もっと勉強しよう・・・( ´・ω・`)
623デフォルトの名無しさん:04/12/22 22:21:44
お礼をわすれてました。
ありがとうございます
624デフォルトの名無しさん:04/12/22 22:26:27
>>622
push_bnack()の実現方法によっては、コピーコンストラクタではなくて代入演算子
で書かれているかもしれないので、一応両方用意しておくのが鉄則。

と言っても、クラス内部でnew/deleteするようなクラスでないと必要ないがな。
625デフォルトの名無しさん:04/12/22 22:33:23
>>619
オブジェクトの生成、解放はSTLコンテナにすべて一任するのが楽。
だから、newしたものを突っ込むんじゃなくて値をそのまま突っ込むべし。
626デフォルトの名無しさん:04/12/22 22:33:53
>>620の痛さが光るな。氏んでいいよw

>newによって割り当てられたオブジェクトへのポインタがコンテナに格納されている場合は
>自分で全部deleteしてまわる必要があります。

vector<JisakuClass> array;って明記してあるのに、
勝手にvector<JisakuClass*>の話に勘違いした挙句

>>そしてこのようにした場合、dataがスコープ外にでて消滅した場合でもvector内のデータは大丈夫なのか
>大丈夫じゃありません。

100%ウソ回答ww

vector<JisakuClass> array;

{
  JisakuClass data;
  array.push_back( data );//ここでdataのコピーがarrayに追加される
}//ここでdataが破棄される

arrayに入るのはdataのコピーなので、dataが破棄されても全然平気です。
627デフォルトの名無しさん:04/12/22 22:35:21
変なのがいるな。
628デフォルトの名無しさん:04/12/22 22:35:27
幸いnew/deleteは使っていない単純なクラスなので
デフォルトのコピーコンストラクタ(というか無し)で
問題なさそうです

もしクラス内部にまた別のvectorコンテナとmapコンテナが入っている場合は
特殊なことが必要なのでしょうか・・・?

629デフォルトの名無しさん:04/12/22 22:37:49
何も必要ありません。
630デフォルトの名無しさん:04/12/22 22:40:29
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> C++
とか書いている馬鹿がいるスレはココですか?
631デフォルトの名無しさん:04/12/22 22:41:31
rubyユーザって痛い人が多いの?
632デフォルトの名無しさん:04/12/22 22:45:03
>>626
俺も>>620のような内容を書きかけて、>>619をよく読んで「オブジェクトへのポインタ」の問題じゃ
なかったから投稿やめたのに。

>>628
>>629さんが答えているけど、コンテナがデータメンバなら必要ない。但し、コンテナへのポインタ
だと代入演算子とコピーコンストラクタが自前で必要になる。
633デフォルトの名無しさん:04/12/22 22:51:16
>>631
まぁ、教祖が痛いから。
634デフォルトの名無しさん:04/12/22 22:55:23
619です。

コピーされると思っていなかったため最初の質問分が既にトンチンカンでした
ごめんなさい

動的確保したメモリなどを使っていると、コピーしたときに
コピー先とコピー元でポインタがかぶるためコピーコンストラクタで
自分で確保しなおしてあげることが必要ということでしょうかね

625さんがおっしゃられているように、クラスもクラスの内部も
すべてnew/delete等を使わない設計のほうが楽チンなので
そうすることにします。

教えてくださったみなさま助かりました(`・ω・´)
635デフォルトの名無しさん:04/12/22 23:02:39
>>634
そそ。領域がかぶると、一つの動的に確保したデータメンバを書き換えただけですべてのその
クラスのデータメンバが書き換わってしまうだけでなく、多重deleteによりプログラムが不正終了
する原因になるからタブーなのね。

コピーコンストラクタと代入演算子で、動的なデータメンバの中身も自分でコピーしてやる事に
より、それぞれが別々の実体を持つようになり、そのような問題はなくなる。
636デフォルトの名無しさん:04/12/22 23:02:42
STLコンテナにポインタを格納するのは主に継承によるポリモーフィズムを
使うときなど。
637デフォルトの名無しさん:04/12/22 23:06:16
んで、ついつい面倒になるのでboost::shared_ptrを使いたくなるけど、そうするってえと
std::mem_fun()が使えなくなるから、boost::bindやboost::mem_fnを使うようになり、
ますますboostにはまっていくという罠。
638デフォルトの名無しさん:04/12/22 23:11:38
const_castの挙動が理解不能な件について

#include <iostream>
using namespace std;
int main()
{
const int a=100;
int *pa=(int *)&a;
*pa=200;
cout<<&a<<" "<<pa<<endl;
cout<<a<<" "<<*pa<<endl;
return 0;
}

実行結果
0013FED4 0013FED4
100 200

なぜですか。
639638:04/12/22 23:13:52
あ、const_cast使ってなかった。
int *pa=const_cast<int *>(&a);
としても同様。
動作確認はVC++.net2003で。

アドレスが同じなのになぜ値が違うんだ……
640デフォルトの名無しさん:04/12/22 23:14:37
>>636
継承によらないポリモーフィズムってあるんですか?
641デフォルトの名無しさん:04/12/22 23:18:54
>>640
一言多い天の邪鬼め。
642638:04/12/22 23:19:00
*((int *)&a) と *((const int *)&a) の値が違うらしい。ますます理解不能
643デフォルトの名無しさん:04/12/22 23:20:43
const_castを嬉々として使う奴を初めて見た
644デフォルトの名無しさん:04/12/22 23:21:28
>>640
テンプレートや関数オーバーロードだって広義のポリモーフィズム。
645デフォルトの名無しさん:04/12/22 23:22:16
>638
ローカルなconst valueが定数に最適化されるからでしょ。
実体を伴う必要はないから。
*(int *)&a も、中身はただのaであることがコンパイラには分かるから。
646デフォルトの名無しさん:04/12/22 23:22:51
const intの方は定数リテラル的に扱われてるのかもね。
だめじゃんw
647デフォルトの名無しさん:04/12/22 23:24:22
ていうかconst_castっていつ使うの?元々constにしなかったら
いいだけじゃないの?と燃料投下。
648デフォルトの名無しさん:04/12/22 23:26:25
こちらへどうぞ。
【C++】 const だけでメシが3杯食えちゃうスレ
http://pc5.2ch.net/test/read.cgi/tech/1078193971/l50
649デフォルトの名無しさん:04/12/22 23:27:28
>>647
じゃなくて、static_cast、reinterpret_castと分類してしまったから、必然的にconst_cast
が必要になったんだろ。
dynamic_castはC++特有の物だから別格。
650デフォルトの名無しさん:04/12/22 23:31:10
>>649
必然的にってのを詳しく
651デフォルトの名無しさん:04/12/22 23:32:49
で、10種類はまだですか?
652デフォルトの名無しさん:04/12/22 23:34:29
既存のCのキャストの代用として、static, reinterpret, dynamicを作ったけど、
これらのキャストのどれにもconst hoge => hoge の変換はしっくり来ない。
だからconst_castが導入された、と>649は言いたいのではないかと。
653デフォルトの名無しさん:04/12/22 23:34:56
スレ違い
654653:04/12/22 23:35:55
ごめん
655デフォルトの名無しさん:04/12/22 23:38:17
mutable
656638:04/12/22 23:45:35
なるほど、最適化されて実行時にはすでに定数、と……
参考になったトンクス
657デフォルトの名無しさん:04/12/22 23:49:09
いや、目の付け所は悪くないんだけどね・・・
ローカル変数なんだし、ポインタ参照されてる時点で
最適化をやめるぐらいのココロイキがほしいところだ
658デフォルトの名無しさん:04/12/22 23:49:26
>>656
そしてまた、規格票を確認もせずに与太話を強固にプリンティングされたアフォが1匹増えたわけか

undefined hehavior
unspecified behavior
implementation defined behavior
well formed
ill formed
659デフォルトの名無しさん:04/12/22 23:50:55
>>658
そういうチミは、今回のconst_castの件はセクションどこなのか即答できるのかね。
俺は探してる所だ。
660デフォルトの名無しさん:04/12/22 23:51:45
>>652
C++になってconstポインタからポインタへの変換を廃止するか、
reinterpret_cast扱いにするかって選択肢もあったような気がするわけよ。
661デフォルトの名無しさん:04/12/22 23:53:52
>>659
§5.2.11.7だと思うが。
undefined behavior。つまり未定義。
662デフォルトの名無しさん:04/12/22 23:54:44
>>661
参りました。師匠と呼ばせて下さい。
663デフォルトの名無しさん:04/12/22 23:54:54
>>659
は? それは有料です
教えてくれそうな会社をディレクトリで探して聞いてみて下さい
もしかして、私が答えてるかも知れませんね
664デフォルトの名無しさん:04/12/22 23:55:23
>>662
いや、君のような出来の悪い弟子は(゚听)イラネ。
665デフォルトの名無しさん:04/12/22 23:59:37
>>664
Ruby最高?
666デフォルトの名無しさん:04/12/24 11:52:17
で、プリンティングって何?
667デフォルトの名無しさん:04/12/24 18:52:20
洋菓子の一種
668デフォルトの名無しさん:04/12/24 19:07:24
私はライスプディングがどうしても食べられないんだ。
669デフォルトの名無しさん:04/12/24 19:21:45
俺も…なんかぐちょぐちょして甘くて気持ち悪い
670デフォルトの名無しさん:04/12/24 20:23:03
イギリス行ってM&Sあたりで適当なケーキ類買ってみれ。

日本で売ってるライスプディングなんてまだぬるかったと思い知らされるから。。
671デフォルトの名無しさん:04/12/24 21:10:05
イギリスで食っていいのはフィッシュアンドチップスと中華とイタリアンとマクドナルドだけだ。
672デフォルトの名無しさん:04/12/24 21:13:58
インド料理を忘れないでくれ
673デフォルトの名無しさん:04/12/24 21:23:38
>>670
ちょっと用事でイギリス行った時にホテルで食べたんだけど、やっぱり日本人には
ミルクとご飯の組合せはダメだね。
674デフォルトの名無しさん:04/12/24 21:35:17
サンドイッチと、コーンフレーク類(本格的なやつね)はかなり美味しい。

イギリス行くなら、朝コーンフレーク、昼サンドイッチ、夕中華orインド料理で耐えるといい。
675デフォルトの名無しさん:04/12/24 23:06:08
日本人にとって、ミルクとご飯の組み合わせとは、給食の残りを
残飯として混ぜ込んでいたときの光景を想起させるものである。
676デフォルトの名無しさん:04/12/24 23:31:30
鶏肉の中華粥、ミルク味すきだけど・・・
677デフォルトの名無しさん:04/12/24 23:37:55
BSEパイってイギリスだっけ?
678デフォルトの名無しさん:04/12/24 23:41:22
マイクロソフトのビルゲイツ(敬称略)が、「いいプログラマになるためには、天才プログラマが書いたプログラムを
読むのがよい」といったらしいのですが、
それを聞いて、自分も天才プログラマが書いたC++プログラムを読みたいと思ったのですが、
で、最近オープンソースが話題になっており、何か参考になるようなフリープログラムはないですかねぇ?
紹介していただくとうれしいです!
679デフォルトの名無しさん:04/12/24 23:47:09
firefox
680デフォルトの名無しさん:04/12/24 23:50:19
gcc linux
681VC++です:04/12/25 00:39:16
#import "c:/Program Files/Microsoft Office/Office/MSO9.DLL"
#import "C:/Program Files/Common Files/Microsoft Shared/VBA/VBA6/VBE6EXT.OLB"
// windows.h に DialogBox などが定義されているため、リネームで回避する
#import "c:/PROGRAM FILES/MICROSOFT OFFICE/OFFICE/EXCEL9.OLB" \
rename("RGB", "RBGXL") \
rename("ExitWindows", "WordExitWindows") \
rename("DialogBox", "DialogBoxXL") \
rename("DocumentProperties", "DocumentPropertiesXL")

こういう感じでEXCELとワードのVBAをVC++からつかえるようにしたのですが、

BSCMAKE: warning BK4502 : 切り捨てられた .SBR ファイル '.\Debug\StdAfx.sbr' は Debug/EightAppSdi.bsc 内にありません。

というエラーが出て、クラスウィザードが使えなくなりました。
助けてください
682デフォルトの名無しさん:04/12/25 02:45:44
スレ違い。
683デフォルトの名無しさん:04/12/25 02:49:11
>>682
何でですか?
Visual 「C++」の話ですよ。
答えられないなら黙っていて下さい。
684デフォルトの名無しさん:04/12/25 02:56:07
>>681
こっち行け
★初心者にVisual C++を教えるスレ★ Part16
http://pc5.2ch.net/test/read.cgi/tech/1101022051/
685デフォルトの名無しさん:04/12/25 03:04:20
>何でですか?

#import
686デフォルトの名無しさん:04/12/25 03:10:34
Chest! A buttock of a very rare Japanese serow!
687デフォルトの名無しさん:04/12/25 10:32:47
CppUnit って、使う価値あるものですか?
簡単に調査した限りでは、あまりテストコードを書く助けにならないような気がするのです。
ライブラリをビルドしたりする分だけ、逆に手間がかかるように思います。
みなさんの率直なご意見をお願い致します。
688デフォルトの名無しさん:04/12/25 13:57:59
必要な人には必要とされる。
素人にはおすすめできない。
689自己レス:04/12/25 14:42:49
>>681
昨日は調べ方が甘かった・・・
stdafx.hに書けばいいらしい
690デフォルトの名無しさん:04/12/25 16:36:49
new演算子をオーバーロードして、それを継承させることはできますか。
具体的には、親クラスでオリジナルなメモリ管理ライブラリをnew演算子にオーバーロード
(ここまでは簡単)、さらに、そこから派生させた子クラスもやはりその独自ライブラリでnew する、
みたいなの。
さらに、子クラスがtemplete で勝手な型を作ったときも、やはり、親クラスが勝手に作った
独自メモリ管理ライブラリがその勝手な型の中で使われないとまずいんです。

以上、何とかしてください。
691デフォルトの名無しさん:04/12/25 16:40:27
オーバーロードできるnewは、グローバルなoperator new一つだけじゃなかったでしたっけ。
692デフォルトの名無しさん:04/12/25 16:41:47
>>690
>さらに、そこから派生させた子クラスもやはりその独自ライブラリでnew する、
>みたいなの。
これは普通に出来る。

>さらに、子クラスがtemplete で勝手な型を作ったときも、
どういう事?
693デフォルトの名無しさん:04/12/25 17:15:38
>>690
Effective C++7項〜10項
More Effective C++項目8

templateについては俺も知らん。
694デフォルトの名無しさん:04/12/26 17:40:10
別スレで聞いたのですが答えがなかったのでここで質問させて頂きます。
C++で、読み込みファイルのランダムアクセスをするような、
以下のコードを書きましたが、
ifstream fin;
fin.open("data.txt",ios::in);
  n=fin.tellg();//→n=0

do{
・・・
}while(fin.getline(buf,256));
   n=fin.tellg();//→n=70000
ここでまたデータを最初から読み込むために
fin.seekg(0,ios::beg);
としたところ
     n=fin.tellg();//→n=-1
となってしまいうまく行きません。
ご教授いただけないでしょうか。
695デフォルトの名無しさん:04/12/26 17:44:51
>>694
一度最後まで読み切ってしまうとEOFフラグが立って、
それ以降ストリームが無効になると思われ。

fin.clear(); してみては?
696デフォルトの名無しさん:04/12/26 17:46:10
>>694
seekg() の直後にエラー判定して std::perror() でも出してみると、原因がわかるかもしれん。
697694:04/12/26 17:56:22
695さん、696さん、ありがとうございました!!
fin.clear();で解決できました。

ただ、fin.seekg(0,ios::beg);の後に
perror("perror says :" );としたところ、うまくできる時
(clesrしたとき)もうまくいかない時(clearしないとき)も
同じ値でした。エラーにはなってないのですかね。

698デフォルトの名無しさん:04/12/26 18:24:20
>>697
clear() でいけたんなら、ストリームインスタンスだけの問題。
errno は関係ない。
699デフォルトの名無しさん:04/12/26 18:36:03
perror(errno)は、単に、クリアされないまま
前回エラーが起きた時(読み込み時にEOF)の値が残っているのでは
700694:04/12/26 18:51:03
>699さん
説明不足でしたが、clearした場合としない場合でそれぞれ実行した結果、
perror("perror says :" );で、perror says : No error
と出ましたので、(よく知らないですが)stream instanceの問題のようです。
701デフォルトの名無しさん:04/12/26 18:53:32
C++標準でのエラーとは「規格とは外れた動作」を指すんじゃないんでしょうか?
EOFが返ってくるのは規格と適合しているからエラーではないのでは
702デフォルトの名無しさん:04/12/26 22:52:52
エラーの意味の取り方の違いでしょ?
何を基準に考えてるかっていうかね、そんな感じ。
703デフォルトの名無しさん:04/12/27 21:58:18
すみません、教えてください。
Cの構造体をC++でも使いたいのですが、どのようにすればいいのでしょうか?

<test2.c>
#include "test2.h"

AAA aaa;

<test2.h>
extern struct AAA {
int int1;
char str[256];
} aaa;

<test1.cpp>
#include "test2.h"

???


↑こんな感じで使いたいです。
また、構造体を使うほかにCとCPPで値を共有する方法などはあるでしょうか。
宜しくお願いします。
704デフォルトの名無しさん:04/12/27 22:01:47
.cから.cppのhoge関数を使いたい場合は、

// hoge.cpp

extern "C" {
void hoge() {…}
}

あとCの構造体はそのままcppでも使えると思うけど
705デフォルトの名無しさん:04/12/27 22:12:57
>>703
Cだとstruct AAA aaa;じゃないか?
706703:04/12/27 22:13:58
704さんありがとうございます。
Cの構造体は普通に使えるんですね。

includeして実際にやってみまして、コンパイルは通りました。
が、実態がないようで、値の代入が出来ません。
デバッガで値を見ると、アドレスはあるみたいなのですがポインタ参照みたいになっています。

aaa : struct AAA * aaa

みたいな感じです。
Cで実態を持たせてるのですが、CPP側でもincludeのほかになにかやらなければいけないことがあるのでしょうか?
707デフォルトの名無しさん:04/12/27 22:20:31
>>706
根本的なことが分かってない気がする
708デフォルトの名無しさん:04/12/27 22:21:37
>>705,706
ああスマンコ
Cでは
struct AAA { ・・・ };
で使用は
struct AAA hoge;
だけど、C++ではstructはclassと同じ扱いだから
AAA hoge;
だけでいい
709デフォルトの名無しさん:04/12/28 00:21:39
> 705さん、708さん
ありがとうございました。
どうにかできているみたいです。
C++だとクラスと同じ扱いになるんですね。
710デフォルトの名無しさん:04/12/28 00:45:28
>>709
C++でのclassとstructの違いは省略時にpublicになるかprivateになるかだけ。
711デフォルトの名無しさん:04/12/28 21:55:09
newの戻り値がnullかどうかってチェックするべきなんでしょうか?
今までVC6を使ってたんで一応、

char* ptr = new char[5]
if (!ptr) return;

みたいにしてたんですが、
VC7.1ではnewが失敗したら例外をなげるから、
if (!ptr) return; は無意味になる。

nullチェックってもう忘れちゃってもいいんでしょうか?
712デフォルトの名無しさん:04/12/28 22:11:56
例外を投げるのが標準だから、
VC6を今後使うつもりがないなら無視してOK。
713デフォルトの名無しさん:04/12/28 22:13:45
一応、Mozillaのコーディングスタイルでは
newの後のnullチェックを義務づけてるけどね
714デフォルトの名無しさん:04/12/28 22:20:22
>>712
ありがとうございます。
VC7以降なら標準にしたがって堂々と無視してOKってことですよね。

VC7以降と6で大幅に違うのってこれくらいでしょうか?

今はまわりがVC6から7.1に移行してる段階なんでいろいろ混乱がありそうです。
715デフォルトの名無しさん:04/12/28 22:22:48
>>713
それも気になっていました。
Mozillaの場合は例外自体を使えない(発生しない)ようにしてる、は間違いですか?
716デフォルトの名無しさん:04/12/28 22:24:18
>>714
テンプレートの部分特殊化の有無は
newが例外投げるより大きいんじゃなかろうか…
717デフォルトの名無しさん:04/12/28 22:46:11
>>716
テンプレートの部分特殊化・・・、えーと、勉強してきます・・・orz
718デフォルトの名無しさん:04/12/28 22:57:15
<new>ヘッダをインクルードしてnewをnew(nothrow)に変更すれば、古いnewと同じ動作をする。

#include <new>

char* ptr = new(nothrow) char[5] 
if (!ptr) return; 
719デフォルトの名無しさん:04/12/28 23:32:32
>>718
using書いていないからnew(std::nothrow)ってつっこみはおいといて、
俺んとこは<new>をインクルードしなくてもnew(std::nothrow)が使えるんだけど、
<new>をインクルードしたほうがいい?
720デフォルトの名無しさん:04/12/28 23:35:21
>>714
for の初期化部で宣言した変数のスコープがfor内部のみになった。
#つまりISOに準じた。

STLを使っても識別子の長さオーバーの警告が出なくなった。

CStringがテンプレートクラスになった。
#おまけでエンバグしたり仕様が変わった。
721デフォルトの名無しさん:04/12/28 23:40:36
>>719
std空間はいかにしてソースに組み込まれたのであろうか?
インクルードヘッダが一切ない状態で試してこそ、真の漢である。
722デフォルトの名無しさん:04/12/29 01:06:49
>>720
使えちゃったり。(VC7.1)

for(int i = 0; i < 10; ++i){ /* 何か */ }
i += 10; // OK
for(int i = 0; i < 10; ++i){ /* 何れか */ }
i += 10; // OK
723デフォルトの名無しさん:04/12/29 02:30:24
>>722
俺もそれ気になってた、vc6.0では無理とか言ってるやつがいたから試したけど.netでも普通に使えた
724デフォルトの名無しさん:04/12/29 02:41:36
//map<wstring, wstring> mapss;
//wstring tmp;

tmp = _T("key");
tmp += _T(" ") + mapss[tmp];
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~のところの式は合っているんでしょうか?
725デフォルトの名無しさん:04/12/29 02:54:54
>>722
VC6互換にすると二番目のforでエラーにならないか?
ISO準拠なら当然代入がエラーな訳だが。
#ディフォルトがVC6互換なのは困ったもんだが。
726デフォルトの名無しさん:04/12/29 03:03:14
>>724 「式が合っている」とは?
727デフォルトの名無しさん:04/12/29 03:54:15
>>725
VC7.1ではエラーにならなかったりする。
ただ、VC6では >>722 のコードはエラーになる。
(C2374 : i が2回宣言されているぞ)

つまり、VC7.1では、状況が悪化していると…
728デフォルトの名無しさん:04/12/29 03:58:53
>>727
悪化はしてないと思うが、
forスコープの外でiが使えるのは気持ち悪いな
729デフォルトの名無しさん:04/12/29 08:47:41
>>721
俺の負けだ。
何もインクルードしていないときはnothrowはstd::付ける付けない関係なしに無理だった。OTL
730デフォルトの名無しさん:04/12/29 08:51:09
>>724
typedef basicstring<TCHAR> tstring; // _TCHARでも可
map<tstring, tstring> mapss;
tstring tmp;
tmp = _T("key");
tmp += _T(" ") + mapss[tmp];
上か下か好きな方を選べ。
map<wstring, wstring> mapss;
wstring tmp;
tmp = L"key";
tmp += L" " + mapss[tmp];
731デフォルトの名無しさん:04/12/29 12:25:02
>>726
>>730
レスありがとうございます
「式が合っている」とは、tmp += _T(" ") + mapss[tmp];でtmpに代入しますよね
その時にmapssでがちゃんと[tmp]をキーとして使えるのかなと思っただけです、よく考えたら使えますよね orz
=の右辺は一回どこかのバッファにためられてから左辺に代入してるのかな(わからないです)

すみませんbasicstringってなんですか、下のでも似たようなことが出来そうですけど
#define UNICODE
 typedef wstring tstring;
#else
 typedef string tstring;
#endif
732携帯 ◆QkYL666666 :04/12/29 12:37:07
どこにカキコすればいいのかわからないのでここにカキコします。
情報工学科の大学一年です。
学校でC言語の講義があってLinuxを使っています。
自分はすごく苦手で毎日空き時間は学校のパソコン使って練習しています。
課題はできるのですが試験が全く出来ません。
例えば課題の例を出しますと、
毎日の睡眠時間を読み込んでその最大値と最小値と何日目であるのかを示すプログラムをかけ。
というようなものでそのようなものならできますが、試験では
データの数(これはなんとかできます)、データの合計を秒単位と時間分秒で表す、最大値を分単位で表す、最小値を秒単位で表す、日毎の変動時間の平均値を分単位で表す、変動時間が一時間以上である回数
を表させるようにもっと複雑になってしまい何も出来ないです。
いつも数式を立てるのは紙に書けばすぐできますしフローチャートも順調に書けます。
けどプログラムをパソコンで組むと作れないことが多いです(コンパイルでは異常ないけど実行すると目茶苦茶な結果が出て来る)
どうすれば解決できるようになりますか。他の筆記科目(微積、線形代数、力学、電磁気、化学、英語、回路講義、計算機についての講義等パソコンではなくペーパー試験)はだいたい8割以上とれるけど、このプログラムだけは半分もとれません。
やっぱり基礎が出来ていないからですかね。一応家には学校で支給されたKNOPPIXというのがあるので実家に戻って使う予定です。
733デフォルトの名無しさん:04/12/29 12:40:43
>>732
で、何が聴きたいんだ?
とりあえず普段頭と紙だけで考えて、実際に動かしてないだろ。
734デフォルトの名無しさん:04/12/29 12:40:55
>722-
ttp://www.tietew.jp/cppll/archive/11282
このトピックなんかも参考に。
735デフォルトの名無しさん:04/12/29 16:44:56
732
必要な道具(関数)を考えろ。外部設計の基礎だ。
736デフォルトの名無しさん:04/12/29 21:01:29
>>732
あー、いるいる。そういう奴。
初めから大風呂敷ひろげすぎては自爆を繰り返す藁パターンな。
(何を隠そう若き日の俺だったりするが)

まずシンプルに徹したVer1を確実に押さえてから少しずつVer-upすれ。
もともと複雑怪奇な問題はより単純な問題に分解することを再帰的にやれ。
気長な話だが、短気な性格にも活かし方はある。
737デフォルトの名無しさん:04/12/29 21:19:52
>>731
basic_stringはstringやwstringの実体。ここからtypedefされている。
typedef basic_string<char> string;
typedef basic_string<wchar_t> wstring;
お前の#ifdef UNICODE〜#endifとtypedef basic_string<TCHAR> tstring;は結果は同じ、好きな方を選べ。
738デフォルトの名無しさん:04/12/29 21:51:17
TCHARが short だったりしてな。
739デフォルトの名無しさん:04/12/29 21:58:30
>>738
せめてunsigned shortだろ。
740デフォルトの名無しさん:04/12/30 18:27:28
templateなstaticメンバ変数だけヘッダで初期化できるのは不公平だと思います!
741デフォルトの名無しさん:04/12/30 19:41:19
http://www.rubyist.net/~matz/20041227.html#p03
Ruby以外の言語は糞であるとRuby作者自身が明言した!
742デフォルトの名無しさん:04/12/30 19:51:55
>>740
C++使いにはいくつかの禁句があることを知れ
743デフォルトの名無しさん:04/12/30 19:53:03
<<で出力とかばっかじゃねぇの?

とか?
744デフォルトの名無しさん:04/12/30 21:51:43
>>743
それはむしろC++使いも同意だったりするんじゃないかと
745デフォルトの名無しさん:04/12/30 21:56:56
データはストリームに流すんだ
と心の中で100回唱えれば納得できる
746デフォルトの名無しさん:04/12/30 22:51:03
ロシア語で考えるんだ!
пиписка!!
747デフォルトの名無しさん:04/12/31 00:39:15
ズドラーストヴィーチェ!
748デフォルトの名無しさん:04/12/31 06:01:53
<<で出力ってそんなにまずいのか?
bit shiftと似て左に流れる=出力って分かりやすい気がするが
cout << 'string'; で標準出力に流れていくみたいな

ただ、<<がC++の最高の応用例と書かれていたり
最悪の応用例と書かれていたりかなり両極端だよな
749デフォルトの名無しさん:04/12/31 06:39:30
iostreamの演算子オーバーロードは間違いなく邪悪。

演算子の意味把握するのにいちいち連想ゲームさせるな
750デフォルトの名無しさん:04/12/31 06:42:01
lhs = rhs で左辺に代入されるから

 cout << "string";
 a_variable << cin;

が自然だと思うんだけどな…
751デフォルトの名無しさん:04/12/31 11:49:33
cout << "string" << cin;
string foo;
cout << foo << cin;
752デフォルトの名無しさん:04/12/31 11:55:38
Rubyの方が100倍美しく10倍効率的。
753デフォルトの名無しさん:04/12/31 12:43:10
<<,>>演算子は、可変引数をもつ関数解決のための別アプローチだろ。
754デフォルトの名無しさん:04/12/31 14:39:38
>>752
そして10倍以上遅い
755デフォルトの名無しさん:05/01/01 04:24:09
cinってなんて読むのですか?
756デフォルトの名無しさん:05/01/01 04:39:23
シーイン
757デフォルトの名無しさん:05/01/01 09:37:47
input 〜 from console
758デフォルトの名無しさん:05/01/01 13:29:34
昔、cout を コート と読んでいたのは秘密だ
759デフォルトの名無しさん:05/01/01 14:09:39
こうとな・・・・・・質素で上品な。けばけばしくなく上品な。「若いのにえらいこうとなもん着たはりますなあ。」
760デフォルトの名無しさん:05/01/01 14:11:52
>>754
OCamlだったらSTLばりばり使ったC++より速いよ
761デフォルトの名無しさん:05/01/01 15:09:57
>>760
速度有利なものと速度不利なものを比較して何が言いたいんだ?
762デフォルトの名無しさん:05/01/01 15:12:44
質問です。
classのメンバーに別のクラスを含んだんですが
その別のクラスのメソッドを、包括するクラスのメソッドとしても
実行できるようにしたいんですが
別クラスhoge
void test(void);

包括クラスage
void (*test)();

test=this->test;

としたのですが
メンバー関数は呼び出すかそのアドレスをとらなければならないと言われます。
どうすればいいでしょう。
763デフォルトの名無しさん:05/01/01 15:14:59
class hoge {
public:
 void test() {}
};

class age {
 hoge _hoge;
public:
 void test() { _hoge.test(); }
};
764デフォルトの名無しさん:05/01/01 15:16:37
>>762
メンバ関数ポインタとか調べてみれ
765デフォルトの名無しさん:05/01/01 15:23:09
>>763,764
ありがとうございます。
勉強します。
766デフォルトの名無しさん:05/01/01 16:23:17
>>760
そもそもC++で作ったプログラムの実行速度なんて同じハードウェア環境下でも
処理系やコンパイルオプションによって雲泥の差があるんだから
その手の情報のほとんどは全然あてにならん。
767デフォルトの名無しさん:05/01/01 17:03:12
Java だと toString メソッドを出来るだけ書けっていわれますが、これってC++にも当てはまりますか?
768デフォルトの名無しさん:05/01/01 17:46:31
>>767
当てはまらない。
JavaはObjectクラスがtoStringを持ってるからオーバーライドすべきなの。
C++ならシステムがクラス名を必要とするときだけ同等のことをすれば良い。
769デフォルトの名無しさん:05/01/01 19:55:06
>>761
速度有利なものと速度不利なものを比較しないと勝てないくらい実行速度に差があるって事だろ?
そもそもRubyとC++では土俵が違うし、それを無理やり比較して勝とうとするのは・・人はそれを厨と呼b・・(ry
言語間の違いを理解して目的に応じて使い分けるのが賢いやり方だろう。
(勿論、それだけで全てをこなすエキスパートの技術は素晴らしいと思うがな)

まぁ、どの程度実行速度に差があるのかは検証した事ないし
>>766の言う様に状況に寄って結果も変動するからねぇ
770デフォルトの名無しさん:05/01/01 20:06:34
要求を聞いた時点から言語の選択を誤り更に修正できない香具師は痛い
771デフォルトの名無しさん:05/01/01 22:28:13
>>757
cout は char* out じゃないか?
772771:05/01/01 22:29:25
×cout/out
○cin/in
773デフォルトの名無しさん:05/01/01 22:40:40
>>771-772
そんなばかな
774デフォルトの名無しさん:05/01/01 23:59:00
const_reverse_iterator を const_iterator に変換するにはどうすればいいの?
とりあえずvectorの場合で。
775デフォルトの名無しさん:05/01/02 00:26:27
.base()
776デフォルトの名無しさん:05/01/02 00:27:47
advance と distance を使う
777デフォルトの名無しさん:05/01/02 00:29:01
>>775
おぉ、サンクスコ。
778デフォルトの名無しさん:05/01/02 00:30:12
>>776
あぁ、そういうのもあったね。忘れてた...
iterator使い鳴れないもんで..
779デフォルトの名無しさん:05/01/02 00:49:21
もひとつお願い。
vectorのある位置を指すiteratorってどうやって表すのがスマート?
vector<int> v;
const_iterator f(int idx) { return v.begin() + idx; }
だとちょっとカッコ悪かなと...
780デフォルトの名無しさん:05/01/02 00:53:00
>779
それでいいんでない?
vectorのイテレータはランダムアクセスイテレータなんだから
わざわざadvanceを使ったりすることもないべ。
781デフォルトの名無しさん:05/01/02 00:57:03
&v[idx]から変換できないのかなと思って...
だめ?
782デフォルトの名無しさん:05/01/02 01:22:26
漏れは統一目的でadvance使った方がいいと思うけど
783デフォルトの名無しさん:05/01/02 01:23:00
std::vector<T>(ただしT != bool)に限っては、その保持するデータのメモリ
上のレイアウトが配列と同じでなければならないという訂正が規格に入った
から、v.begin() + (&v[idx] - &v[0])で間違いではないだろう。iteratorと
ポインタの同一視は一般的にはあまりよくないだろうが。
784783:05/01/02 01:24:23
ん?何か俺頓珍漢なことを言ってるな。忘れてくれ。
785デフォルトの名無しさん:05/01/02 01:27:12
>>782
ちなみに、advance()使った場合はどう書けばいいの?
const_iterator i;
advance(i, idx);
return i;
とか?
return &v[idx];
くらいに簡単にしたいんだけど...
786デフォルトの名無しさん:05/01/02 01:34:41
小数の下の0の除去。例えば
0.0012300
これを
0.00123
にする場合、みなさんならどういう方法でやりますか?
787デフォルトの名無しさん:05/01/02 01:44:33
string str="0.0012300";
double num;
num = lexical_cast<double>(str);
str = lexical_cast<string>(num);
cout << str << endl;
788デフォルトの名無しさん:05/01/02 01:57:43
boostライブラリ?
789デフォルトの名無しさん:05/01/02 02:05:13
boost::lexcal_cast<>が楽だろうねぇ。
790デフォルトの名無しさん:05/01/02 03:00:35
boost知らなかった。
標準関数やsprintfでは0の除去は用意されていないんですね。
791デフォルトの名無しさん:05/01/02 03:19:15
boost使うと「文字列の末尾から'0'を取り除く」と直接書くこともでける
string s = "0.0012300";
trim_right_if(s, _1 == '0');
792デフォルトの名無しさん:05/01/02 03:32:19
is_any_of("0")じゃないの?
793791:05/01/02 03:33:40
is_any_ofの存在を忘れてマスタ orz
794デフォルトの名無しさん:05/01/02 03:42:02
誰か知識を貸してください!

#ifndef __INITIALIZATION
#define __INITIALIZATION
#include "main.h"
void initialization(MAIN_DATA*data);
#endif

をコンパイルすると
e:###initialization.h(6): error C2065: 'MAIN_DATA' : 定義されていない識別子です。
e:###initialization.h(6): error C2065: 'data' : 定義されていない識別子です。
e:###initialization.h(6): error C2182: 'initialization' : 'void' 型が不適切に使用されています。
となりました。
ソースの方は↓でコンパイルは通ります。
void initialization(MAIN_DATA*data)
{
......
}

main.hの中には
typedef struct_MAIN_DATA
{
......
}MAIN_DATA;
としています。

助けてエロイ人。
795デフォルトの名無しさん:05/01/02 03:47:39
struct_MAIN_DATA
   ↑なんだこの_は
796デフォルトの名無しさん:05/01/02 03:50:02
>>795
タブが消えたんでないの
797795:05/01/02 03:50:56
なる
798デフォルトの名無しさん:05/01/02 04:07:54
>>785 boost::prior(v.begin(),idx)
799デフォルトの名無しさん:05/01/02 04:22:52
next じゃないの?
800798:05/01/02 05:01:30
まちがえちゃった。
801デフォルトの名無しさん:05/01/02 05:02:37
>>794
根本的な問題の解決方法じゃないが
void initialization(struct MAIN_DATA*data);
としてみそ。
802デフォルトの名無しさん:05/01/02 06:01:25
>>801
やってみましたが再定義されていますとのことorz
レスさんくすです^^
803デフォルトの名無しさん:05/01/02 09:37:57
>>794
main.h の最終行は改行しているか?
804デフォルトの名無しさん:05/01/02 09:43:06
802
typedef int int;
805デフォルトの名無しさん:05/01/02 09:50:43
typedef struct→糞 _MAIN_DATA MAIN_DATA
806デフォルトの名無しさん:05/01/02 09:55:28
#ifdef __cplusplusplus
#else
#endpg
807デフォルトの名無しさん:05/01/02 16:11:21
よくoperatorで戻り型にconstつけて、かつoperator関数にもconstつける
けど、戻り型にconstつけるとoperator関数にconstつけなきゃいけないのは
なぜなんでしょうか?
808807:05/01/02 16:15:11
operatorの呼び出し元のオブジェクトをconstな型として扱わないと
constな戻り型で返せないからですかね?
809デフォルトの名無しさん:05/01/02 16:59:22
>operatorの呼び出し元のオブジェクトをconstな型として扱わないと
>constな戻り型で返せないからですかね?

はい.ただしデータメンバへの参照を直接返す場合とかの話ですけどね.
810デフォルトの名無しさん:05/01/02 17:09:35
struct{
static int a;
int b;
}xx;

本体はstaticではなく、一部のメンバだけstaticって有り?無し?
811デフォルトの名無しさん:05/01/02 17:11:54
もちろん、あり。
812807:05/01/02 17:15:06
>809
なるほど!!ありがとうございます!
const abcclass operator*(const abcclass &ob)const;
~~~~~ ~~~~~
(1) (2)

(1):戻し型の指定であって、呼び出し元とは関係ない
(2):呼び出し元のオブジェクトを(一時的に)const扱いにする
っていうイメージですかね。
813807:05/01/02 17:16:16
あ、半角スペース無視されるんだった。
すいません、(1)ははじめのconstで、(2)は最後のconstです。
814デフォルトの名無しさん:05/01/02 17:44:34
>>812
その通りですけれど,そのoperator*の戻り値は一時オブジェクトなので
(1)のconstはあっても無くてもコンパイルは通りますよ.
(このconstを付けるか付けないかはこれはこれでよく議論の火種になりますけど)
815807:05/01/02 18:17:02
>814
そうなんですかー。
gccではテンポラリなオブジェクトはなぜかconst扱いになってしまうので
(VCは呼び出し元依存だった気がします)、あってもなくても同じかと
思っていたのですが、議論されるまでのものだったんですかー。
816デフォルトの名無しさん:05/01/02 20:59:18
組込型同様左辺値にはならないように互換性をとる
テンプレートの実体化を邪魔して冗長なのでやめれ

こんなとこか
817デフォルトの名無しさん:05/01/02 21:03:13
ってかoperatorをconstにするのは当たり前だろ
constテンポラリが呼び出すかもしれないし

>>807は基本からやりなおせ
818デフォルトの名無しさん:05/01/02 21:35:59
>>803

改行はしていますよ。
あぁぁぁぁぁ・・・全然すすまない〜><
819デフォルトの名無しさん:05/01/02 21:37:47
typedef struct_MAIN_DATA
ナニコレ?
820デフォルトの名無しさん:05/01/02 21:38:35
てかそもそもC++ならtypedefいらないし。
821デフォルトの名無しさん:05/01/02 21:42:21
入門書を買ったのですが、途中まで親切なのに
AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_
#pragma once
が突然出てきて、解説が無くて困ってます
何か良い本ないですか?
822デフォルトの名無しさん:05/01/02 21:43:10
その解説書はVC++の本なのでC++の本じゃ無いです。
違う本を買ってね。
823デフォルトの名無しさん:05/01/03 00:11:51
まさか年賀状に、

「新年あけましておめでとうございます」

なんて書いちゃった人いませんよね。
824デフォルトの名無しさん:05/01/03 00:18:49
>>823
書きましたがなにか。
825デフォルトの名無しさん:05/01/03 00:25:56
重複表現ってやつ?
俺は「新年おめでとうございます」って書いたけど
826デフォルトの名無しさん:05/01/03 00:42:18
「新年」がどうなってめでたいのか書かないとだめ。
「新年」つまり「新しい年」がめでたいのではなくて、「新年」が「あけた」事がめでたい。
「新年」自体は「あけた」という意味が付随していないから、
「新年あけましておめでとうございます。」
は全く問題ないと思う。
827デフォルトの名無しさん:05/01/03 00:45:32
「新年」に「あけた」が付随してるんじゃなくて
「あけた」に「新年が」が付随してるからダメだ、と
年賀状の書き方とかに載ってるよ
828デフォルトの名無しさん:05/01/03 00:52:19
gooの辞書によると

あ・ける 0 【明ける/空ける/開ける】
(動カ下一)[文]カ下二 あ・く
(2)時間が経過して次の新しい年・日や季節が始まる。主語を示すことはない。《明》

とのこと。主語を示しちゃいかんそうな。
829デフォルトの名無しさん:05/01/03 00:52:48
830デフォルトの名無しさん:05/01/03 00:56:29
placement-newじゃないですが
void* buf = (void*)new char[sizeof(HOGE)];
Hoge* hoge = (HOGE*)buf;
hoge->hoge(); // コンストラクタ呼び出し
hoge->~hoge(); // デストラクタ呼び出し

これって大丈夫ですか?
delete hoge とかやるとデストラクタ呼び出してくれるんでしょうか。
831デフォルトの名無しさん:05/01/03 01:10:01
そいつぁやばいでしょ
832デフォルトの名無しさん:05/01/03 01:26:12
>>830
ちゃんと placement-new 使え。
833デフォルトの名無しさん:05/01/03 16:51:51
謹賀新年

 本年もご指導ご鞭撻のほどよろしくお願い申し上げます

                     2005年1月
                         ぬるぽ
834デフォルトの名無しさん:05/01/03 17:05:45
ガっ
835デフォルトの名無しさん:05/01/03 18:42:43
class NullPointerException : public std::logic_error {
836デフォルトの名無しさん:05/01/03 19:32:43
ぬるぽってlogic_errorとは限らないんじゃ・・・
837デフォルトの名無しさん:05/01/03 19:35:31
struct NullPointerException : public 2ch::nurupo {
 const char* what() { return "ガッ!"; }
};
838デフォルトの名無しさん:05/01/03 20:40:11
継承したときのコンストラクタの書き方で質問です。
親クラスParentと、そこから派生したChildがあったとして、
ChildのコンストラクタでParentのコンストラクタも呼びたい時、

Child::Child():Parent(){}
と書くのと、
Child::Child(){
    Parent::Parent();
}
と書くのでは何が違うのでしょうか。
839デフォルトの名無しさん:05/01/03 20:46:48
class NullPointerException : public ぬるぽ {
    NullPointerException(const std::string& what) throw(ぬるぽ) : ぬるぽ(0) {}
};

なぜこれが標準でないのか小一時間問いつめたい
840デフォルトの名無しさん:05/01/03 21:03:53
>>838
前者は親コンストラクタ->派生コンストラクタと呼ばれるが
後者は親デフォルトコンストラクタ->派生コンストラクタ->親コンストラクタと呼ばれる。
つーか後者みたいな呼び方っていいんだっけ?
841デフォルトの名無しさん:05/01/03 21:05:20
コンストラクタ内でthisが絡む事はやっちゃいけないんじゃなかった?
842デフォルトの名無しさん:05/01/03 21:08:18
>838 後者はコンパイラによって暗黙的に次のようなコードになる。
843デフォルトの名無しさん:05/01/03 21:09:24
// 途中で送信しちまったorz
Child::Child() : Parent() {
    Parent::Parent();
}

だから、親クラスのコンストラクタを2回呼び出していることになる。
844デフォルトの名無しさん:05/01/03 21:11:20
貴様らにイイ事を教えてやろう。いや、お前らにとってはバッドニュースになるかな?ククク…。
昨日の練習で俺はボクシングを完全に理解した。なにせボクシングビデオの技はもう全て使いこなせるからな。
ジャブからパリングまで完璧だ。
連れに受けてもらったが全然俺のパンチがかわせない。
スパーリングって奴だな。
もちろん連れの撃つ素人パンチは全然当たらない。
今の俺はプロレヴェルに達してる。
845デフォルトの名無しさん:05/01/03 21:11:51
>>838
前者の形でしか呼べませんです。
後者は Parent クラスの一時オブジェクト(this の異なる他人)を作ってるだけだよ。
846デフォルトの名無しさん:05/01/03 21:14:52
>>844
SUGEEEEEEEEEEEEWEWWEEEE!!!!!!!
847デフォルトの名無しさん:05/01/03 21:15:33
>840-843
No

・・・って答えかかれちゃった
848838:05/01/03 21:16:22
なるほど分かりました。
親クラスのコンストラクタは、普通の関数のように呼び出してはいけないんですね。
ありがとうございました。
849デフォルトの名無しさん:05/01/04 04:23:58
#define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } }

というマクロはもしinline関数に直すとすると

inline void safe_delete(void* ptr)
{
delete ptr;
ptr = NULL;
}

これでいいのでしょうか?
NULLポインタはdeleteしても問題ないそうなのでif文は省略しました。
850デフォルトの名無しさん:05/01/04 04:27:11
>>849
駄目。
駄目だからこそマクロが未だに存在する。
851デフォルトの名無しさん:05/01/04 04:31:16
>>849
template <class T>
inline void safe_delete(T*& p)
{ delete p; p = 0; }

これで無問題
852デフォルトの名無しさん:05/01/04 04:31:45
>>850
即答ありがとうございます。
素直にマクロ使うことにします。
853デフォルトの名無しさん:05/01/04 04:33:48
俺なら>>851を使うかな…
854デフォルトの名無しさん:05/01/04 04:38:45
>>851
テンプレートを使うことは考えましたが、ポインタへの参照を使うとは盲点でした。
修行が足りませんですね。回答ありがとうございました。
855デフォルトの名無しさん:05/01/04 04:41:56
SAFE_DELETRマクロとの互換性を考えないなら
template <class T>
inline void safe_delete(T** p)
{ delete *p; *p = 0; }

int* hoge = new int;
safe_delete(&hoge);
でもいいんだけどね

あと
>ptr = NULL;
はローカル変数を変えてるだけだから意味ないよ
856デフォルトの名無しさん:05/01/04 04:47:19
これは初歩的なミスを…
逝って来ます。
857デフォルトの名無しさん:05/01/04 06:16:40
namespaceごとにフォルダを作ってそこにソースを格納した方がいいのでしょうか?
例えば
namespace foo 内にかかれたライブラリ(のソース)は /foo に、
namespace bar 内にかかれたライブラリ(のソース)は /bar に配置、といった具合です。
858デフォルトの名無しさん:05/01/04 08:45:14
type_infoのコピーコンストラクタや代入演算子が
private属性に制限されている理由を教えてください。
よろしくお願いします。
859デフォルトの名無しさん:05/01/04 08:52:27
>>858
代入などがしたければ type_info へのポインタを使えば十分だから。
860デフォルトの名無しさん:05/01/04 08:53:21
> safe_delete
std::auto_ptr 使え。
861デフォルトの名無しさん:05/01/04 09:08:50
>>857 良い心がけだと思う。
862デフォルトの名無しさん:05/01/04 11:00:54
>>858
理由はない。設計者がヘボだっただけだ。
863デフォルトの名無しさん:05/01/04 13:26:28
>>862
(;´Д`)
864デフォルトの名無しさん:05/01/04 14:01:24
>>858
太陽が黄色かったから
865デフォルトの名無しさん:05/01/06 03:18:44
866デフォルトの名無しさん:05/01/06 03:32:05
微妙に今更感も漂うけどね。
867デフォルトの名無しさん:05/01/07 23:30:42
std::ofstream fd( "hoge" );
に文字列を書き出します。
fd << "hoge\n"と
fd<< "hoge" << std::endl;
を比較すると(試したのはもう少し複雑ですが\nをstd::endlに置き換えると)
1.6倍くらい遅くなりました。こういうものなのでしょうか?なんか対策はないですか?
環境は、IntelC++のver.8です。
868デフォルトの名無しさん:05/01/07 23:38:45
>>867
それはendlにはバッファのフラッシュの機能が含まれているからです。
よって"hoge\n"だけでは表示されない場合があります。逆に言えば、
何度も改行を行う場合には'\n'の出力によって行い、最後にcout << flush;
とした方が、バッファのフラッシュを一度しか行わず、一般的に処理が
高速になります。
869デフォルトの名無しさん:05/01/08 00:04:57
>>868 早速のお返事有難うございました。
しかし、cのFILEよりもc++のofstreamはかなり遅いですね。
test-cpp.cpp
#include <fstream>
int main( void ) {
std::ofstream fd( "hoge" );
for ( std::size_t i( 0 ); i < 10000000; ++i ) {
fd << "hoge\n";
}
return 0;
}

test-c.cpp
#include <stdio.h>
#include <stdlib.h>
int main( void ) {
FILE *fd( fopen( "hoge", "w" ) );
for ( unsigned int i( 0 ); i < 10000000; ++i ) {
fprintf(fd, "hoge\n" );
}
return 0;
}

をコンパイルして速度を比較してもFILE*の方が2倍近く速度が出ました…
870デフォルトの名無しさん:05/01/08 00:06:09
まあ使い分けろってこった
871デフォルトの名無しさん:05/01/08 02:07:18
>>869
STLportのファイル入出力はかなり速いぞ。
872デフォルトの名無しさん:05/01/08 07:15:15
>>869
cygwin gcc 3.3.3 で /dev/null に対してテストしてみた。
c : cpp = 3 : 4
くらいだった。

2、3段関数呼び出しがはさまったていどじゃ、
こんなに差は出ないよな?
具体的なオーバーヘッドって、なんだろう。
873デフォルトの名無しさん:05/01/08 12:17:13
拡張性、柔軟性を高めてるんだから、その分遅くなるのもしょうがない。

void load(FILE *fp);
こんな関数ではファイル、stdinくらいしか渡せないが

void load(istream &is);
この関数にはファイルもstdinも文字列ストリームも(自作すれば)TCPストリームでも、
istreamを継承したものならなんでも渡せる。


柔軟性なんかいらない、スピードだけが欲しい、というのならfopen使っとけ。
874デフォルトの名無しさん:05/01/08 12:40:54
>>872
最適化してその結果?
つーか、gccだと単純なfprintf()はfputs()呼ぶからなぁ。
875デフォルトの名無しさん:05/01/08 13:22:10
std::cout << "hoge\n";でもいっぺんデバッガで追ってみれば遅くて当然と納得できるだろ。
876デフォルトの名無しさん:05/01/08 18:03:52
Metrowerks CodeWarrior for Windows v8.3
c:cpp = 6453:7297
877デフォルトの名無しさん:05/01/08 22:07:44
参考までに、
minGW, VC7で iostream VS FILE* 試してみたけど
バイナリ入出力では誤差ぐらいしか違わんかった。
878デフォルトの名無しさん:05/01/08 22:24:55
>>877
じゃあ、問題は iostream の方じゃなくて、string の側にあるってことか。
まあ、string は機能性重視のクラスだしね。
879デフォルトの名無しさん:05/01/09 01:56:46
stringの実装は大きく違うからねぇ
VC6と7.xでも確か変わらなかったっけ?
短文用のバッファが導入されたとか
880デフォルトの名無しさん:05/01/09 02:01:47
std::string って copy-on-write?
881デフォルトの名無しさん:05/01/09 02:03:08
実装次第。VC++7.1付属のものはCOWじゃない。
882デフォルトの名無しさん:05/01/09 03:28:14
VC6 に string::clear がなかったのには驚いた
おかげで全部 string::erase に書き換え…
883デフォルトの名無しさん:05/01/09 03:41:30
VC6だったらstlport使うから無問題だろ
884デフォルトの名無しさん:05/01/09 03:42:17
まあ、10年近く前のコンパイラだし。許したれ。
C++のISO標準もまだできてない頃だったと思うし。
885デフォルトの名無しさん:05/01/09 04:03:08
ようするにC++じゃないってことだろ?
さっさと2003に乗り換えなさい
886デフォルトの名無しさん:05/01/09 04:11:09
とりあえずコンパイラをVCTKのに。
887デフォルトの名無しさん:05/01/10 14:56:06
fstream にてファイルのステータス等を調べるにはどうしたらよいでしょうか?

ちょっくら調べたのですが Cでいうところの fstatのようなのが見つからないです。
888デフォルトの名無しさん:05/01/10 14:57:48
fstatって標準関数じゃないような…?
889887:05/01/10 15:15:06
標準関数では
_stat
_stat64
_stati64
_wstat
_wstat64
_wstati64
_fstat
_fstat64
_fstati64
とかいっぱいあるのはわかっているのですが、あくまでもC標準関数なので・・

fstreamクラスのメソッドとしては実装されていないんでしょうか?

こんな感じで使えないのかな、と思いまして・・・

fstream testfile(c:\hoge.data);

stat_t file_info;

testfile.stat(&file_info);

890887:05/01/10 15:16:16
>fstream testfile(c:\hoge.data); ×
fstream testfile("c:\hoge.data");

ないのであればfstatにしておきます〜
891デフォルトの名無しさん:05/01/10 15:20:16
Cの標準関数じゃないって
892887:05/01/10 15:22:44
え?そうなんですか?
よくわかってなくてすいません;;
893デフォルトの名無しさん:05/01/10 15:28:13
Cの標準関数じゃないから、C++の標準関数にも入ってない
894887:05/01/10 15:38:48
あ〜そういえばPOSIXでしたね・・・
895デフォルトの名無しさん:05/01/10 16:22:17
「そういえば」って、おまえ・・・
896デフォルトの名無しさん:05/01/10 16:51:25
久しぶりに痛い香具師を見たな。
897デフォルトの名無しさん:05/01/10 17:32:00
>>889
標準関数かどうか確認できる資料くらい揃えとけ
http://www.jsa.or.jp

C++ は ISO/IEC14882 もしくは JIS X3014
C は ISO/IEC9899 もしくは JIS X3010
898デフォルトの名無しさん:05/01/10 20:39:59
>>897
なんか有料になってるな
899デフォルトの名無しさん:05/01/10 20:43:02
失敬閲覧可能なのはこっちか
http://www.jisc.go.jp/
900デフォルトの名無しさん:05/01/10 20:49:32
<boost/regex.hpp>
をインクルードした状態で
fopen とか memset とか使うと
「オーバロード関数の呼び出しが解決できません」
と出るんだけど、回避策を知ってる人いませんか?
901900:05/01/10 20:51:57
ごめん、自己解決しました
::fopen
とか書くと解決できるみたいです
なんかめんどいけど・・・
902デフォルトの名無しさん:05/01/10 21:14:31
>>901
× ::fopen

#include <cstdio>
#include <cstring>

std::fopen
std::memset
903デフォルトの名無しさん:05/01/11 01:01:01
ttp://jp.thespoke.net/MessageBoard/MessageBoard_ViewThread.aspx?postid=486

あの似顔絵ウィザードも含めて、HomeStyle+ って
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.NET Framework で書かれてるんですね。。。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
逆アセンブルしてみたら気づきました・・・・。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ああいうのを作品に組み込むのも面白いかも(笑)

MSの製品を逆汗するような奴をMSはMVPに選んでいるんです。MSは逆汗を認めていると
904デフォルトの名無しさん:05/01/11 13:57:42
001.hに
#define TATE 10があって、
int intarray[TATE];のような形で利用してるんですが、

001.cppにも
#define TATE 10があってそれを使っているんですよ。

どちらか片方から 10 という定数を消す方法は無いですか?
ちょっと変えたいときに*.cppと*.h両方変えるのが面倒なんです。

VC++6とBCCを使用してます。
905デフォルトの名無しさん:05/01/11 14:43:58
>>904
001.cppで001.hを#includeしちゃだめなのか?
906904:05/01/11 15:00:22
>905
001.hを#includeすれば001.cppに書く必要は無いんですね。
目から鱗が垂直離陸。
907904:05/01/11 15:00:57
途中で送信してしまいました。ありがとうございました。
908デフォルトの名無しさん:05/01/12 02:32:29
垂直離陸いいなw
909デフォルトの名無しさん:05/01/12 21:52:35
#ifndef TAKE
#define TAKE 10
〜〜〜〜〜
#endif

こんな方法もある
910デフォルトの名無しさん:05/01/12 22:17:01
>>909
インクルードガードかよっ!
911デフォルトの名無しさん:05/01/12 23:12:51
それを書くなら
#ifndef TATE
#define TATE 10
#endif
だな。
912デフォルトの名無しさん:05/01/13 00:26:22
>>909
っつーか、そもそも ANSI C++ の規格上、同じマクロを二回定義しても問題ないぞ。
値が違う (#define TATE 10 と #define TATE 5 とか) のはダメだが。
913デフォルトの名無しさん:05/01/13 02:51:03
#define TATE
だけでいいんじゃね?値なんてどうでも良いし。
914デフォルトの名無しさん:05/01/13 02:51:25
ageちまった。スマソ
915デフォルトの名無しさん:05/01/13 08:07:36
質問読めよ池沼
916デフォルトの名無しさん:05/01/13 16:43:44
インクルガードじゃねーのか。スマソ
917デフォルトの名無しさん:05/01/15 01:12:51
最近スレが閑散としてますね
918デフォルトの名無しさん:05/01/15 02:55:00
下ネタかよ...orz
919デフォルトの名無しさん:05/01/15 12:37:51
参照渡しって結局ポインタを渡すからコストはポインタ渡しと変わらないんでしょうか?
それともインライン展開のことを考えるとポインタたどらなくていい参照渡しの方がいいんでしょうか?
920デフォルトの名無しさん:05/01/15 13:12:07
参照もポインタ辿るよ
921デフォルトの名無しさん:05/01/15 13:55:40
¬¬
922デフォルトの名無しさん:05/01/15 14:11:57
スレ違いで申し訳ないのだが、お尋ねしたいことがあります。
一番初めに学ぶべき言語はなんですか?(HTML除く)
923デフォルトの名無しさん:05/01/15 14:15:11
>>922
もう来なくて結構ですから。
すれ違いですから。
いけませんから。
924デフォルトの名無しさん:05/01/15 14:18:42
最初に学ぶべきなのは日本語。
次は英語。
925デフォルトの名無しさん:05/01/15 14:19:13
>>922
ニホンゴワカリマスカ?
926デフォルトの名無しさん:05/01/15 14:34:19
な、何だ!この青汁みたいな色のスレッドは!
927デフォルトの名無しさん:05/01/15 14:36:09
>>922
俺はだまされないぞ。
お前は埋め厨だろう?そうだろう?そうだといえ!
928デフォルトの名無しさん:05/01/16 01:46:25
ちょいと質問。
complexのようなtemplate classで、座標値をあらわすようなものはないだろか。
complexでも悪くないのだけれど、公開メンバx,yがあるようなのがいいなぁと。
いやまぁ、標準ならそれを使うし、boostならそれをパクるし、そうでないなら自作するのだけれど。
929デフォルトの名無しさん:05/01/16 01:48:43
>>928
pair
930デフォルトの名無しさん:05/01/16 01:53:07
>>929
first, secondをx, yの代わりに使うのか?
931デフォルトの名無しさん:05/01/16 01:54:09
>>928
boost::tuples::tuple
932デフォルトの名無しさん:05/01/16 01:57:45
>>930
そういう事になるな。3次元への拡張性はないけれど。
933デフォルトの名無しさん:05/01/16 02:18:24
>>929-932
レス感謝。
tupleを持ち出すのもpairを使うのもI/Fがオーバスペックな気がするので
complexの実装見ながらもう少し考えてみる。
934デフォルトの名無しさん:05/01/16 10:01:43
>>932
pair<x, pair<y,z> >
935デフォルトの名無しさん:05/01/16 11:24:51
>>934
w
936928=933:05/01/16 14:31:26
要求仕様見ながら実装してたらなんだかMFCのCPointのようになって来た悪寒。
あっちは整数だったと思ったけど。
937デフォルトの名無しさん:05/01/16 16:10:45
class TestA{
public:
TestA() {
a = new int;
}
~TestA() {
delete a;
}
int *a;
};
class TestB : public TestA{
public:
TestB() {
b = new int;
}
TestB(const TestB& B) {
b = new int;
*b = *B.b;
}
~TestB() {
delete b;
}
int *b;
};
main() {
TestB a;
TestB b = a;
}

というプログラムで何故コピーコンストラクタでTestAクラスのメンバのaに別のアドレスを割り当てなくても大丈夫なのでしょうか?
C言語なら俺に聞け!スレでスレ違いと言われたのでこちらに来ました
938デフォルトの名無しさん:05/01/16 16:14:32
大丈夫じゃないだろ
main()
{
TestB *a = new TestB();
a->a = 100;
TestB b = *a;
delete a;
cout << b.a << endl;
}
ってやってみ
939デフォルトの名無しさん:05/01/16 16:25:42
>>937
TestB b = a;
ではTestAのデフォルトコンストラクタ->TestBのコピーコンストラクタと呼ばれるから
TestA::a自体は有効なアドレスを示してる。
アドレスが指してる先の値はコピーされてないけどな。
940デフォルトの名無しさん:05/01/16 16:27:29
なるほど
ありがとうございました
941デフォルトの名無しさん:05/01/16 16:32:47
デストラクタが必要なクラスは必ずコピーコンストラクタと代入演算子が必要
http://c2.com/cgi/wiki?RuleOfTheBigThree
942デフォルトの名無しさん:05/01/18 03:51:28
あるソフトのプラグイン用のDLLを作成しているのですが
いままでC言語(C++ではない)形式で作っていました。

複雑になってきたので、処理の一部をC++で書き換えたところ
うまく関数をエクスポートできなくなってしまいました。

インターフェイス部分のみCで、内部の処理をC++で書きたい場合は
どのようにすればいいのでしょう?
943デフォルトの名無しさん:05/01/18 06:10:22
extern "C"のことを聞いてるのか?
それともどういったかんじで関数を処理すればいいのかという話か?
944デフォルトの名無しさん:05/01/18 07:08:53
942です

いままでaaa.cですべてまかなっている状態だったのを
内部の処理のほとんどの部分を新規にbbb.cppに作り直して
aaa.cとbbb.cppの二つのファイルにし
エクスポートする関数はいままでと同じ書式のままaaa.cに残したいのですが
aaa.cからbbb.cppのクラスを呼ぶことができません
C言語とC++との混在している状態でコンパイルするのは不可能ですか?
945デフォルトの名無しさん:05/01/18 08:23:31
>>944
そりゃ、aaa.c はC言語だから、クラスは使えないね。
そんなときは extern "C" 使ってくっつける。

// bbb.h
#if !defined(__cpluplus)
extern "C" {
#endif

int bbb_xxxx( int a , int b );

#if !defined(__cpluplus)
}// extern "C"
#endif

// bbb.cpp
#include "bbb.h"
class bbb {...};
int xxxx( int a , int b )
{
 bbb b( a );
 return b.xxx( b );
}

// aaa.c
#include "bbb.h"
946デフォルトの名無しさん:05/01/18 20:22:19
942です
externで検索していろいろ調べてみました

CとC++ではリンゲージというものが違うようですね
extern "C"を指定してエクスポートすることで
あえてaaa.cのほうは使う必要がなくなったので
bbb.cppのほうからextern "C"にてエクスポートすることにしました。

大変参考になりました。ありがとうございます
947デフォルトの名無しさん:05/01/19 00:05:44
ビャーン先生がD&Eの前書きでこてこてなjava批判してたねぇ
948デフォルトの名無しさん:05/01/21 00:25:19
まだ読んでないんだけどどんな批判なの?
949デフォルトの名無しさん:05/01/21 00:30:28
ツルピカ
950デフォルトの名無しさん:05/01/22 17:03:44
C++にもスレッド入らないかな?
951デフォルトの名無しさん:05/01/22 17:38:26
もしかしてタスクスケジューラを C++ で書いてる例か?
952デフォルトの名無しさん:05/01/22 18:08:48
class BASE{
public:
  virtual void out(int n = 0){ 〜; }
  virtual void out(void){ 〜; }
};

class A1 : public BASE{
public:
  void out(void){ 〜; }
};

int main()
{
  A1 a;
  a.out();
  a.out(2);  // ←コンパイルエラー

  return 0;
}


これってなんでコンパイル通んないんでしょう?
MSVC .NET使ってます。
953デフォルトの名無しさん:05/01/22 18:13:29
>>952
通らない。
http://www.fides.dti.ne.jp/%7Eoka-t/cpplab-hide-overload.html

あと、引数のない関数を定義するのに void って書くの気持ち悪いからやめれ。
あと、デフォルト引数とオーバーロードを一緒に使うのやめれ。
954デフォルトの名無しさん:05/01/22 18:14:27
out(void)がBASE::(int)を隠しているから
隠すなら private に明示的に using する
隠したくないなら public に using する
はっきり汁!
955デフォルトの名無しさん:05/01/22 18:18:42
>>952
名前解決の順序が、引数型によらず

1. まず最も内側のスコープ内 (この場合だと A クラス内部) で探す
2. 見つからなかったら、一つ外のスコープ (この場合だと BASE) で探す

でリストアップしてきて、その中から引数型が合うものを選択するため。
そうなってる理由はともかく a.out(2) で BASE::out(int)を呼び出したければ
class A1 の定義中で using BASE::out; しとけば OK。

あと BASE::out() は BASE::out(int n = 0) と BASE::out(void) どちらを呼んで
欲しいのか意図が謎。なおした方が良いと思うぞ。
956デフォルトの名無しさん:05/01/22 18:27:19
>あと、引数のない関数を定義するのに void って書くの気持ち悪いからやめれ。
エー
957952:05/01/22 18:36:27
>>953-955
ほんとありがとうございます。よーく分かりました。

>デフォ引数
色々実験してる内に付けてしまったもので、投稿前に消し忘れてました。スマソ
あいまいになる!って突っ込まれるなあと思ってました。。。
何はともあれ、明快な解答ありがとうございました!
958デフォルトの名無しさん:05/01/22 18:52:39
>>956
エー、じゃない。おまいはCプログラマか。
959デフォルトの名無しさん:05/01/22 19:07:38
extern "C" のときは書いてる >(void)
960デフォルトの名無しさん:05/01/22 20:28:54
>>950
そんなあなたにboost::thread
961デフォルトの名無しさん:05/01/22 20:33:36
>>960
使ってるけど全然だめぽ
おとなしく言語仕様に取り入れてほしい

でも時期標準のリストにはスレッドのスの字も無かったっけ…orz
962デフォルトの名無しさん:05/01/22 20:36:29
極力機種依存を避けてる以上無理だろねぇ
963デフォルトの名無しさん:05/01/22 21:02:10
実装レベルをいくつかに分けるとか、
モジュールに分けたりとかして、
実装がサポートする範囲を選べるようにできないかなぁ……

やっぱ無理かなぁ……
964デフォルトの名無しさん:05/01/22 21:07:43
せめて synchronized, wait, notify, notifyAll, join だけでもサポートして欲しい
965デフォルトの名無しさん:05/01/22 21:09:52
おとなしくjava使えよハゲの下僕ども
966デフォルトの名無しさん:05/01/22 21:13:41
>>961
何がダメなん?
967デフォルトの名無しさん:05/01/22 22:12:58
>>961
無理だろうな。D&E でも Bjarne が「並列処理を必要とするアプリケーションは
多いが、そのための唯一の支配的な方式はない」と断言してる。

C++ の用途は数値計算からオフィススイート、データベースエンジン、OS、
ゲームまで幅広い。特定のプログラミングスタイルや、目的に特化した機能は
現状の C++ の利点を殺すことになるから、まず入らん。
968デフォルトの名無しさん:05/01/22 23:04:09
>>963
実装レベルを分けるってのはいいね。
EC++の逆ね。やって欲しいな。
969デフォルトの名無しさん:05/01/23 00:33:47
質問なんですけど、

class MyString {
string *pstr;
public:
MyString(const MyString ©) {
pstr = new string;
*pstr = *copy.pstr; // ←この部分
}
string *GetString() const { return pstr; }
}

*pstr = *copy.pstr;
この記述はなんでコンパイルエラーにならないんですか?
*pstr = *copy.GetString();
じゃなきゃだめだと思うんですが。
ちなみにコンパイラは BCC5.5 です。
970デフォルトの名無しさん:05/01/23 00:37:14
>>969
クラスの定義内では自分自身と同じ型の変数はprivateでも丸見えだよ。
971デフォルトの名無しさん:05/01/23 00:40:15
C++的にOKだからココンパイルエラーにならないんだよ坊や
972デフォルトの名無しさん:05/01/23 00:50:09
落ち着け坊や
973969:05/01/23 00:54:17
( ・∀・)つ〃∩ ヘェー
どうもありがとうございました
974デフォルトの名無しさん:05/01/23 00:54:36
privateの仕様:
「メンバへのアクセスが制限され、
そのクラスのメンバ関数とフレンド以外はアクセスできなくなる。」


【クラス】とは書かれているが、【インスタンス】とは書かれていない。
詐欺的表現にも見えるが、所詮、騙される方が悪い。
975デフォルトの名無しさん:05/01/23 01:00:06
なぜ C++ は以下のように浮動乗数点数の定数を定義できない仕様にしたのでしょうか?
struct X {
static const int i = 100; // OK
static const float pi = 3.1416f; // error
};
976デフォルトの名無しさん:05/01/23 01:02:44
むしろprotectedのときに引っかかるんだな。
基底クラスのprotectedメンバに触れるのは
自分自身と同じ型を参照しているときだけってのに
気が付かないで基底グラス型を参照しながら、
「protectedメンバに触れねぇぞ、なんじゃこらぁ!」
977デフォルトの名無しさん:05/01/23 01:13:02
>>975
質問がおかしい。static constな整数型のみクラスボディで初期化可能なのであって、
それ以外の静的データメンバはクラスボディの外側で初期化しなければならない。

だからstatic const intが特別な例外なのだ。
978デフォルトの名無しさん:05/01/23 01:17:50
>>975
「なぜ Bjarne は」もしくは「なぜ WG21 は」じゃないか?
979デフォルトの名無しさん:05/01/23 01:26:15
昔はFPUがなかったりして浮動小数点の処理がいちいち関数だったりしたからじゃないか?
980デフォルトの名無しさん:05/01/23 01:32:49
不動小数点数がコンパイル時定数である必要性が無いからかな

struct X {
static const int i = 100; // OK
static const float pi;
};

const float X::pi = 3.14f; //OK

これでいいだろ。:
981デフォルトの名無しさん:05/01/23 02:11:05
>>980
ヘッダで定義できないのは嫌じゃないか?
982デフォルトの名無しさん:05/01/23 02:19:20
ヘッダとでバラバラに書くのが鬱陶しいよな
C++ FAQ ではヘッダに書けるもんはヘッダに書けばいいって書いてたけど
983デフォルトの名無しさん:05/01/23 02:59:33
float pi() {return 3.1416f;}
984デフォルトの名無しさん:05/01/23 03:02:24
>>981
定数を返す関数を淫乱にすればいい
985デフォルトの名無しさん:05/01/23 03:02:33
数値を見てそれと分かるんだから
#define PI 3.1415f
986デフォルトの名無しさん:05/01/23 03:06:54
>>985
float 限定やだ
それがたとえ long double 限定でも同じこと
987sage:05/01/23 03:39:32
Task.hで
class Task{
...
}

Task.cppで定義する
んでもって
Enemy.hで
#include "Task.h"
  class Enemy:public Task{←ここでエラー
...
}

"型名が必要" とエラーになってしまします。
どういうことでしょうか?ご助力お願いします。
BccとBccdev使ってます。
988デフォルトの名無しさん:05/01/23 03:43:36
>>987
class Task {
...
}; ←このセミコロンを忘れているというオチじゃないよね?
989デフォルトの名無しさん:05/01/23 03:44:17
そろそろ次スレの季節なの?
990987:05/01/23 03:53:40
すいません、大丈夫です・・・
書くの忘れてました
991デフォルトの名無しさん:05/01/23 04:20:57
>>990
俺の所ではエラーでないぞ。ソース全部晒してみろ。
992デフォルトの名無しさん:05/01/23 05:05:18
次スレのタイトルはスレが乱立しないように
C++相談室(STL含む) part39
でよろしく
993デフォルトの名無しさん:05/01/23 10:07:20
>>975
enumとの互換性を保つ為に、クラスボディで整数型のみ初期化可能にした
994デフォルトの名無しさん:05/01/23 10:33:05
C++相談室(STL,template含む) part39
995デフォルトの名無しさん:05/01/23 10:40:25
STLつかうと一気に実行ファイルサイズが10倍に?!
996デフォルトの名無しさん:05/01/23 10:44:32
>>992
STL含むって言うけどさ>>1
「テンプレートライブラリ(STL含む)に関する質問は専用の別スレにお願いッス。」
って書いてあるのはどうする?

templateスレの次スレのスレタイにSTLを入れてもらう方がいいんじゃないか?
997デフォルトの名無しさん:05/01/23 11:05:55
そのうち関数スレとかクラススレとか・・・・ もうアフォかとヴァカかと
998デフォルトの名無しさん:05/01/23 13:17:23
>>997
はぁ?お前が馬鹿でアホだろ。C++より長いCでもそんなスレできてねーだろタコ。




と煽ったからって自分で糞すれ立てたりするなよ。馬鹿は困るねぇ。
999デフォルトの名無しさん:05/01/23 13:18:34
999
1000デフォルトの名無しさん:05/01/23 13:19:12
rubyyyyyyyyyyyyyyyyyyyy!!!!!!!!!!!
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。