C++相談室 part63

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part63
http://pc11.2ch.net/test/read.cgi/tech/1217008269/
2デフォルトの名無しさん:2008/09/11(木) 23:50:03
■基本■
ググレカス
http://www.google.co.jp/
3デフォルトの名無しさん:2008/09/12(金) 09:53:12
ここは相談室ですが、使える答えは90%返ってきません。
ご了承ください。
4デフォルトの名無しさん:2008/09/12(金) 09:56:01
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
5デフォルトの名無しさん:2008/09/14(日) 06:39:48
むしゃくしゃした時は迷わずブックオフに行く。
そして棚に隠れながら「いらっしゃいませー」と
大きい声で言ってみる。
すると広いフロアの店員がいっせいにつられて「いらっしゃいませー」
と続く。
これを二・三回繰り返しスッキリしたら店を出る。
6z208.124-45-67.ppp.wakwak.ne.jp :2008/09/14(日) 09:23:01
C++っておいしいの?
7デフォルトの名無しさん:2008/09/17(水) 21:37:27
料理人依存です。
8デフォルトの名無しさん:2008/09/22(月) 19:03:42
最近付き合いだした私の彼氏はプログラマーだそうです。
外資系の会社勤務だそうで名詞を見せてもらったら英語の会社名でした。
ダイレクトがどうしたとかC++(ぷらぷらって読むんですか?)がこうとか、
メカセコなんたらなどとよく言っています。
私にはさっぱり理解できないのですが彼のような人はどの位の年収をもらっているものなのでしょうか。
知ってどうこうということはないんですけど。。。
9デフォルトの名無しさん:2008/09/22(月) 19:19:29
>>8
板違い。マ板行け。たぶんマ板でも「本人に聞け」「ネカマ市ね」とか言われると思うけどね。
10デフォルトの名無しさん:2008/09/24(水) 19:21:06
再利用?
11デフォルトの名無しさん:2008/09/24(水) 20:39:05
しばらくC++相談室を追いかけてなかった間になんかまた変なテンプレが増えてるw
12デフォルトの名無しさん:2008/09/24(水) 20:48:12
part64はここ?
13デフォルトの名無しさん:2008/09/24(水) 20:59:48
今研修で課題が出てるけどさっぱり解らん
14デフォルトの名無しさん:2008/09/24(水) 21:50:41
結局このスレ使うの?
15デフォルトの名無しさん:2008/09/25(木) 00:33:03
前スレ995すげー
16デフォルトの名無しさん:2008/09/25(木) 02:01:36
enum {
 ONE = 1 << 0,
 TWO = 1 << 1,
 THREE = 1 << 2,
 FOUR = 1 << 3,
};
とか、
enum { ONE, TWO, THREE, FOUR, }; しといて
使うときに(1<<ONE)とか
17デフォルトの名無しさん:2008/09/25(木) 08:00:56
>>16
あら?こうやって書けたの?
18デフォルトの名無しさん:2008/09/25(木) 08:19:17
>>17
定数なら演算が入ってもOKよ。
19デフォルトの名無しさん:2008/09/25(木) 19:25:08
シミュレーションで、ひたすら数値演算させるような場合って、
プログラムが終了するまではCPU使用率が100%になると思うんだけど、
これを60%くらいでダラダラ計算させるにはどうすればいい?

タイマー使って休み休みさせればいいの?
20デフォルトの名無しさん:2008/09/25(木) 19:39:42
適当にSleep入れるといいんじゃないか
21デフォルトの名無しさん:2008/09/25(木) 19:47:52
それでいいんですね
さんくす
22デフォルトの名無しさん:2008/09/25(木) 19:49:41
>>19
計算時間6に対して4休めばCPU占有率60%になるが、なんか意味あるのか。
23デフォルトの名無しさん:2008/09/25(木) 19:59:12
研究のシミュレーションが計算し終わるまで10分くらい
かかるんだけど、シングルコアだから他のアプリが動かなくなる。

前のシミュレーション結果をエクセルで加工してる間に、新しいパラメータで
シミュレーション。その結果をエクセルで加工・・・ループ

って感じ。デュアルコアだったら無問題なんだけど
24デフォルトの名無しさん:2008/09/25(木) 20:00:41
>>23
それならプロセスやスレッドの優先度を下げればいいだけ。
アイドル優先度にでもしておけば、他の作業を妨げることはない。
25デフォルトの名無しさん:2008/09/25(木) 20:05:19
そんなん出来るだ。初めて知ったわorz
ありがとうございます
26デフォルトの名無しさん:2008/09/25(木) 20:42:20
SetPriorityClass(GetCurrentProcess(), IDLE_PRIORITY_CLASS);
// こう?
27デフォルトの名無しさん:2008/09/25(木) 20:53:05
一番簡単にやるにはタスクマネージャを開いてプロセス名を右クリック
→優先度の設定から行ける

いちいちやるのが面倒いけど
28デフォルトの名無しさん:2008/09/25(木) 20:56:55
#include <windows.h>

Sleep(0); でいいじゃん

要するにメッセージキューに溜まったメッセージを処理させればいいんでしょ
DelphiならApplication.ProcessMessages だけど同じ事だし
29デフォルトの名無しさん:2008/09/25(木) 21:08:54
Sleepでキューのメッセージ処理されねーよ。
30デフォルトの名無しさん:2008/09/25(木) 21:35:59
>>29
やってみて言ってんのか?
31デフォルトの名無しさん:2008/09/25(木) 21:44:29
>>28
お前は質問を誤読してるよ。
恥ずかしいから黙っとけ。
32デフォルトの名無しさん:2008/09/25(木) 21:47:29
メッセージキューかんけーねーだろw
33デフォルトの名無しさん:2008/09/25(木) 21:50:56
だから計算プログラムを走らせている間にエクセルが無応答に
なるのを防ぐためにSleep(0)を計算プログラムの所々に入れるって
言ってるんだろ。

シングルコアのCPUにはこういうテクが必要なんだよ覚えとけ
34デフォルトの名無しさん:2008/09/25(木) 21:57:54
Win3.1でもつかってんの?
35デフォルトの名無しさん:2008/09/25(木) 22:19:53
Win3.1のようなノンプリエンプティブなOSではそもそもSleep()の
存在理由が全く異なる。

他の待機中のプロセスにCPUを移行して走らせるためのタスク
スイッチをユーザー側に負担を強いる事で押しつけている。
36デフォルトの名無しさん:2008/09/25(木) 22:41:49
通常の優先度で計算プロセスを動かしてる限り、エクセルが無応答になることはないだろ。
37デフォルトの名無しさん:2008/09/25(木) 22:46:56
linuxかcygwinなら、niceコマンド使え
簡単だぜ
38デフォルトの名無しさん:2008/09/25(木) 22:51:13
で、>>28=>>33がどれほどバカかは
他の人は皆わかってるんだよね?
39デフォルトの名無しさん:2008/09/25(木) 22:52:46
>>36
だから や っ て み ろ っ て

永久ループのプログラムを作って走らせておいて
エクセル立ち上げていろいろいじくってみれ

あまりの重さにイライラするから
40デフォルトの名無しさん:2008/09/26(金) 00:01:53
重いと無応答は違うんですが
41デフォルトの名無しさん:2008/09/26(金) 00:10:59
>>33
エクセルが重くなるのは単にタイムスライスが十分に回ってこないのが原因であって、
シングルプロセッサであることとは全く関係ないんですが。
42デフォルトの名無しさん:2008/09/26(金) 00:26:59
実験もしてみないで文句言う奴らばっかしだなここは
43デフォルトの名無しさん:2008/09/26(金) 04:32:45
Win API で Sleep(0) すると別スレッドに制御を渡し、待ち時間なしで待機状態になる
If you specify 0 milliseconds, the thread will relinquish the remainder of its time slice but remain ready.
44デフォルトの名無しさん:2008/09/26(金) 07:45:20
>>28
Sleep(0)でメッセージが処理されるとしたら他スレッドのもので、自スレッドのは処理されない。
ProcessMessagesとは全然違う。
45デフォルトの名無しさん:2008/09/26(金) 08:45:06
いい加減スレ違いなんだが。

Windowsプログラミング関連のスレとかOSi板のWindows関連のスレででもやれば?
46デフォルトの名無しさん:2008/09/26(金) 08:46:19
うわ、OSiってなんだ、ネットワークレイヤかよ(w OSだ。
47デフォルトの名無しさん:2008/09/26(金) 12:33:03
>>33
確かにSleep(0)をすれば他のプロセスに実行時間を多く割り当てられるようになるが、それは無駄なポーリングをしてるような場合のテクニックだな。
>>23のようにシミュレーションなど実のある処理には適さないな。
プライオリティの調整が適切でしょう。

48デフォルトの名無しさん:2008/09/26(金) 12:42:36
SuspendThread と ResumeThread で定期的に停止・再開させるっきゃねえべ
49デフォルトの名無しさん:2008/09/26(金) 14:08:30
c++の開発環境ってVisualStudioが一番いいの?

まわりがemacsなのでVisualStudioから以降してみてだいぶたつんだけど
やっぱりVisualStudioが一番便利に感じる

gdbだと変数追いかけるのが不便すぎる
50デフォルトの名無しさん:2008/09/26(金) 14:14:30
IDEとテキストエディタを比べられましても
51デフォルトの名無しさん:2008/09/26(金) 14:15:29
>>49
いいかどうかなんてその人次第
52デフォルトの名無しさん:2008/09/26(金) 14:17:55
やっぱり我が家が一番
53デフォルトの名無しさん:2008/09/26(金) 14:29:09
警備員は黙ってろ
54デフォルトの名無しさん:2008/09/26(金) 14:35:23
>>47
やってみた。スレ違いスマソ。Excelは起動毎にディスクキャッシュを
クリアして行った。

・Sleep(0)無し
Excelの起動速度は確かに遅くなったが、一度立ち上がって
しまえば別に重いと感じなかった。しかし計算速度は半分。

・Sleep(0)有り
Excelの起動速度にほとんど影響しない。立ち上がった後の
動作も通常と変わらない。計算速度も変わらない。

と言う事でSleep(0)有り無しではシングルコアでは結構差が出る
体感速度にはそんなに出ないが(Excelそのものはそんなに速度を
必要としないからか?)
55デフォルトの名無しさん:2008/09/26(金) 14:45:08
>>54には新メモリ最適化ツールおすすめ
56デフォルトの名無しさん:2008/09/26(金) 21:37:20
気になったので、試してみた。結論からいうと、>>26が正解だった。
(以下のソースを、cl /EHsc /Ox /Otでコンパイルして試した)
Sleep(0)が呼び出される間隔が短いと、それがオーバーヘッドになって
非常に遅くなるようだった。

#include <windows.h>
#include <iostream>
#include <ctime>
using namespace std;
void main(void){
SetPriorityClass(GetCurrentProcess(), IDLE_PRIORITY_CLASS);
unsigned int a=0;
unsigned long count;
count = clock();
for( a=0 ; a<0xFFFFFFFF ; ++a ){
//::Sleep(0);
if ( a % 0xFFFFFFF == 0 ) cout << a << endl;
}
count = clock() - count;
cout << count << endl;
}
57sage:2008/09/26(金) 23:35:57
参照の参照って合法ですか?

VC9では,

int main()
{
int n = 3;
int& r = n;
int& r2 = r;
std::cout << r2 << std::endl;
return 0;
}

とやると3とでるようですが.
58デフォルトの名無しさん:2008/09/26(金) 23:37:03
nullを指していなければ問題無し
59デフォルトの名無しさん:2008/09/26(金) 23:40:42
合法です。
というか、いちど参照変数作ってしまったらどっちが元だったか区別付かなくなる。
6057:2008/09/26(金) 23:52:13
>>58
>>59
ありがとうございます.
参照の参照が,まずいと聞いたことがあった気がしたのですが,
まずいのは,
int&&
でした.
普通やらないですね..
http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/cwg_defects.html#106
61デフォルトの名無しさん:2008/09/26(金) 23:53:53
>>57
参照の参照は違反
でも>>57は普通の参照になる
何も考えずにやってるとテンプレート関連で引き起こされる

>>58-59
適当いってんじゃねー



62デフォルトの名無しさん:2008/09/27(土) 02:38:44
>>56
そりゃそうでしょ。
システムコールはx86の場合大抵コールゲートを通しているので
大変重い。
SYSCALLを使っていれば少しは軽いんですが。
63デフォルトの名無しさん:2008/09/27(土) 04:16:46
関数ポインタとstd::vectorを使って順番に関数を実行したいと思ってます。
とりあえず
struct {
 bool (*func)(std::vector<std::string> vecStr, std::vector<size_t> vecValue);
 std::vector<std::string> vecStr;
 std::vector<size_t> vecValue;
} FS;
std::vector<FS> vfs;
FS fs;
fs.func = f1; fs.vecStr = vs; fs.vecValue = vv;
for(int i=0;int i<vfs.size();i++){
 vfs[i].func(vfs[i].vecStr,vfs[i].vecValue);
}
こんな感じでやってみたのですが、クラスを使わなければ動くのですが、
クラス内でやろうとするとコンパイルが通りません。
fs.func = &Test::f1;
error C2440: '=' : 'bool (__thiscall Test::* )(std::vector<_Ty>,std::vector<size_t>)' から 'bool (__cdecl *)(std::vector<_Ty>,std::vector<size_t>)' に変換できません。
with
[
_Ty=std::string
]
この変換が可能なコンテキストはありません。

根本的に何かダメでしょうか?
64デフォルトの名無しさん:2008/09/27(土) 04:34:55
65デフォルトの名無しさん:2008/09/27(土) 04:50:31
ありがとうございます。ぐーぐる先生で一杯でてきますね・・・
というかメンバ関数の場合はなんかめんどくさいっすね・・・
66デフォルトの名無しさん:2008/09/27(土) 04:59:52
なら、普通の関数を作ればいいんだよ。
class Test {
bool f1(std::vector<std::string>, std::vector<size_t>);
};
bool Test_f1(Test& t, std::vector<std::string>, std::vector<size_t>) {
return t.f1(t, vecStr, vecValue);
}
FSの中のfuncはこう直してね。
bool (*func)(Test& t, std::vector<std::string>, std::vector<size_t>);
……なんてことやっていると、結局メンバへのポインタ使うほうが楽と思う。
67デフォルトの名無しさん:2008/09/27(土) 05:22:29
あーなるほど・・・
クラス内で完結させることばっかりに目がいってました。
さっそく試してみます。ありがとうございます。
68デフォルトの名無しさん:2008/09/27(土) 13:50:38
boost::shared_ptr<std::vector<T> > pVector;
みたいにshared_ptrでコンテナを共有するコードってどう思いますか?
構文上問題ないのは分かるんですが、pVector(new vector<T>);を見て、
コンテナをnew(笑)と思ってしまいます。
でも、コンテナを共有するためにshred_ptrに入れる事って普通にありますよね?
69デフォルトの名無しさん:2008/09/27(土) 14:10:37
あらゆることがありえる
それがプログラミング
70デフォルトの名無しさん:2008/09/27(土) 16:58:53
boost::shared_ptr<T> pVector;
みたいにshared_ptrでTを共有するコードってどう思いますか?
構文上問題ないのは分かるんですが、pVector(new T);を見て、
Tをnew(笑)と思ってしまいます。
でも、Tを共有するためにshred_ptrに入れる事って普通にありますよね?


コンテナを特別視する理由が知りたい
71デフォルトの名無しさん:2008/09/27(土) 17:45:47
色んなスレッドからクッチャクチャにいじくるとかなら
同期取らせるラッパークラスに入れた方がいいかもな

そういう事しないなら別に
7268:2008/09/27(土) 17:46:18
>>69
ありです。
>>70
コンテナは動的に確保したメモリを扱うためのクラスだからです。
コンテナをnewするという事は、コンテナの中と外で2重にメモリを管理する事になるのが気になります。
73デフォルトの名無しさん:2008/09/27(土) 17:47:52
杞憂だな
7468:2008/09/27(土) 17:50:19
>>71
thx
75デフォルトの名無しさん:2008/09/27(土) 17:51:17
コンテナ自体をdeleteするのはshared_ptrの責任で、
コンテナの中身をdeleteするのはコンテナの責任になるだけ
コンテナは自分がどこにいようと、死ぬときに自分の責任は全うしてくれるはず

だから気にすんな
7668:2008/09/27(土) 18:06:25
ありがとうございました。
77デフォルトの名無しさん:2008/09/27(土) 18:54:49
んなこといってたらlistやmapはつかえんぞ
78デフォルトの名無しさん:2008/09/27(土) 19:37:07
>>76
問題ない。ただし自由度が高くなるので一見便利そうだが、後々複雑さが増す。
コンテナを包含するクラスを作って、それを共有するようにすることをお勧めしますですハイ。
79デフォルトの名無しさん:2008/09/27(土) 19:48:30
#include <iostream>
template<typename T>
class Hoge {
public:
Hoge(T i)
{
std::cout << i << std::endl;
}
};

new Hoge<int>(-1); // 結果:-1 (○)
new Hoge<unsigned short>(-1); // 結果:65535 (○)
new Hoge<unsigned char>(-1); // 結果: (×)
new Hoge<signed char>(-1); // 結果: (×)

どうすりゃいい?
80デフォルトの名無しさん:2008/09/27(土) 19:55:26
正しい動作ではあるね。

数値を常に出して欲しいなら、テンプレートを使わずに
Hoge(int i)
で受ければいいんじゃないかな。
81デフォルトの名無しさん:2008/09/27(土) 19:57:08
キャストすりゃいーじゃん
82デフォルトの名無しさん:2008/09/27(土) 19:58:22
>>79
charのとき特殊化してcout << (int)iするとか。
83デフォルトの名無しさん:2008/09/27(土) 19:59:23
そもそも何がしたいのかわからない
84デフォルトの名無しさん:2008/09/27(土) 20:04:17
79です。
>>80
すいません。
お試し用プログラムでかなり簡略化しちゃったので…
やはりsigned charとunsigned charのときだけ特殊化するしかないようですね。
やっぱprintfの方が使いやすい><
85デフォルトの名無しさん:2008/09/27(土) 20:13:38
std::cout<<boost::format("%1%")%i<<std::endl;
86デフォルトの名無しさん:2008/09/27(土) 21:47:20
すみません、C++でpthreadを使って一部のメンバ関数を別スレッドで実行したい
と思っているのですが、
たぶん、thisポインタがどうたらとか、デマングルがどうとかで、単純に普通(?)の
メンバ関数をpthread_create()の引数に渡したりしても駄目ですよね?
C++でpthreadを使う際の何か典型的なパターンというのはあるでしょうか。
87デフォルトの名無しさん:2008/09/27(土) 21:53:04
pthreadはCのライブラリだから引数に渡すのはPODじゃないとダメ

メンバ関数を実行したいなら、メンバ関数のポインタを直接渡すことは出来ないから
それを実行するだけの関数を別に作ってそのポインタ渡せばいいんじゃない
88デフォルトの名無しさん:2008/09/27(土) 22:02:36
>>86
スタティックメンバ関数のポインタなら渡せる。
インスタンスを区別するためにオブジェクトのポインタを引数にして渡せる。
89デフォルトの名無しさん:2008/09/27(土) 22:27:38

void *foo_call(void *foo_obj)
{
  static_cast<Foo *>(foo_obj)->bar();

}


pthread_t th;

pthread_create(&th, NULL, void * (*start_routine)(void *), void * arg);




90デフォルトの名無しさん:2008/09/27(土) 22:29:26
すまん適当に書いてたの途中送信しちまった

こういうfoo_call関数作って、pthread_createの第4引数に呼び出し元のオブジェクト与えればいいんじゃねと言いたかった
91デフォルトの名無しさん:2008/09/28(日) 17:51:18
親子関係のあるクラスを実装しています.
以下の2通りの方法を検討しているのですが,
使い分けの指針があったらアドバイスをお願いします.

class Child {
};

class Parent {
private:
Child* pC;
public:
Parent(){pC = new Child();}
virtual ~Parent(){delete pC;}
Child* GetChild(){return pC;}
};

class Parent {
private:
Child rC;
public:
Parent(){;}
Child& GetChild(){;}
virtual ~Parent(){;}
Child& GetChild(){return rC;}
};
9291:2008/09/28(日) 18:01:34
思いつきました.
親子の
・生成消滅のタイミングが違うとき
・子コンポーネントにポリモーフィズムを実装したいとき
にポインタ利用ですね.
スレ無駄にしてスマソ.
93デフォルトの名無しさん:2008/09/28(日) 22:23:41
こういう継承って出来ないんだっけ?

class CTest : public int
{};
94デフォルトの名無しさん:2008/09/28(日) 22:33:54
なんのためにintを継承?
95デフォルトの名無しさん:2008/09/28(日) 22:49:15
scanfで入力するときに、かな入力はどうすればできますか?
96デフォルトの名無しさん:2008/09/28(日) 22:51:45
>>95
意味がわかんないんだけど
コマンドプロンプトで日本語入力ならAlt + 半角/全角
でできるよ
97デフォルトの名無しさん:2008/09/28(日) 23:02:08
>>94テンプレート関係じゃね?
98デフォルトの名無しさん:2008/09/28(日) 23:17:31
アップキャストにdynamic_cast使うとRTTI動きますか?
99デフォルトの名無しさん:2008/09/28(日) 23:34:27
アップキャストは暗黙の型変換が使えるからそのまんま代入すればいい。
100デフォルトの名無しさん:2008/09/28(日) 23:37:51
>>98
アップキャストの時は普通にキャストしてくれるようにできてるはず
101デフォルトの名無しさん:2008/09/28(日) 23:42:08
>>99
答えになっていません
出直してきてください

>>100
ということはキャストせず代入と実行速度などのコストは
等価なのでしょうか?
102デフォルトの名無しさん:2008/09/28(日) 23:48:05
ごめん規格とか厳密なことだとかはは知らない
ここで見たってだけ
ttp://www7b.biglobe.ne.jp/robe/cpphtml/html02/cpp02042.html
103デフォルトの名無しさん:2008/09/28(日) 23:59:35
>>102
ありがとう^^
そのページに答えが書いてあったよ。

チェックする必要のないキャスト(普通のアップキャスト)では
static_cast と同じ処理に最適化されます。
10493:2008/09/29(月) 01:23:40
>>94
まさにテンプレートで、
実際には、
template<typename T>
class CNumeric : T
{
//追加メソッド
};
こんな感じで、Tに intやらshortを指定したいということ。

intをクラスのメンバーにすると、各種演算子の実装がめんどくさい
ってだけの話なんだけどね。
105デフォルトの名無しさん:2008/09/29(月) 04:45:37
親クラスにするならintが仮想デストラクタ持ってないとまずいよな
ということはintもvtbl持ってないとなー

馬鹿げたアイデアだとすぐ気付きそうなもんだが
106デフォルトの名無しさん:2008/09/29(月) 05:21:34
>>105
馬鹿げてるとは思わんな
この場合は機能追加だから仮想関数禁止でいいじゃん

あるいは、継承できなくてもいいから、std標準ライブラリに
組み込み型と同機能のtemplate classを実装しておいてほしい
107デフォルトの名無しさん:2008/09/29(月) 05:24:42
numeric_traits ?
108デフォルトの名無しさん:2008/09/29(月) 16:20:23
struct test{ template<typename T> int &t2i(){ static i = 0; retrun i; } };
test a, b;
struct x;
//テンプレート引数に入る型の情報はstruct testの定義よりも後
//本当は a.t2i<x>() と b.t2i<x>() を別々にしたい
a.t2i<x>();
b.t2i<x>();

コメントの通りにするのは不可能でしょうか?
109デフォルトの名無しさん:2008/09/29(月) 16:27:48
別々の意味を定義せよ
110デフォルトの名無しさん:2008/09/29(月) 16:29:51
&a.t2i<x>() != &b.t2i<x>() が求められる条件
111デフォルトの名無しさん:2008/09/29(月) 16:31:18
&(a.t2i<x>()) != &(b.t2i<x>())ね
112デフォルトの名無しさん:2008/09/29(月) 16:39:35
>>108
その、整数の参照を一体全体何に使うんだ?
その条件だと、単にメンバ変数でよさそうなんだが。
113デフォルトの名無しさん:2008/09/29(月) 16:41:36
あるクラスを特定のクラスからのみ生成できるようにしようと思って以下のコードを書いたのですが、

class Hoge{
protected:
Hoge();
public:
virtual ~Hoge();
};

class Piyo{
public:
Hoge& getHoge(){
struct TMP:public Hoge{
TMP():Hoge(){}
}TMP();
return TMP;
}
};

この場合もデストラクタにvirtualは必要ですか?それとHogeに他の関数がある場合、それらも
virtualにしないとダメですか?
114デフォルトの名無しさん:2008/09/29(月) 16:52:27
なるほど、要するにstatic変数が欲しいんだな?
しかしtest自体はテンプレートにしたくないというのか?
思いつくのはこんな方法しかないぜ。

struct test
{
  template < typename InterfaceGUID, typename T >
  int & get()
  {
    static int x ;
    return x ;
  }
} ;

使い方は以下の通り。

struct x {} ;//これ何か意味あるのか?

int main()
{
  test a ;
  int & ref1 = a.get< struct unique_id_0001, x>() ;
  int & ref2 = a.get< struct unique_id_0002, x>() ;
  
  std::cout << bool( &ref1 == &ref2 ) << std::endl ;
}

最初のテンプレート引数は、ユニークでさえあれば、どんな型でもいい。
一番簡単なのは、その場でstruct hogehogeと書くことだ。実体の宣言はなくてもかまわない。
ただ問題は、タイプミスができない。コンパイラも警告できないから。
このテクニックは、あまりお勧めしないぜ。
boostのsandboxに、c_function.hppってのが、このテクニックを使って、関数オブジェクトをCの関数ポインタから呼び出せるようにしている。
115デフォルトの名無しさん:2008/09/29(月) 20:25:20
>>93
ベースクラスになれるのはクラスのみ
int は型ではあるがクラスではないのでベースクラスにはなれない
struct も union もクラスだよ
116デフォルトの名無しさん:2008/09/29(月) 21:58:15
帰ってきた!
117デフォルトの名無しさん:2008/09/30(火) 08:01:47
第1種ベッセル関数で複素数引数が扱えるライブラリってありますか?
次数は整数です。
118デフォルトの名無しさん:2008/09/30(火) 09:14:59
>>117
liboctaveは使えるはず
119デフォルトの名無しさん:2008/09/30(火) 16:52:42
開発環境:Linux Fedora6
開発言語:C++
質問:
文字コード変換について質問させてください。
現在仕事で、UTF8とSJISの文字コード相互変換と、UTF8からJISへの変換(相互変換不要)を
する必要が出てきた為、変換方法を調べている最中なのですが、いい方法が見つかりません。

案1.文UTF8とSJISとJISの文字コード対応テーブルを作成し、それを元に変換をかける。
→コード量が多くなるためにあまりやりたくないのですが、これしか方法がない場合は
第一水準の漢字までの文字コード対応テーブルを作成して変換をかける。
案2.ICUライブラリを使用する。
→ものすごくいいものなんですが、よすぎるために容量が多すぎて搭載できません。

これ以外に方法はないでしょうか?
C/C++の標準ライブラリに変換関数は見当たらないようでしたし、
ICUよりもっと簡易的な変換ライブラリはないものでしょうか?
または、SJIS⇒JISのような文字コード変換みたく、簡単に計算できるものですか?
120デフォルトの名無しさん:2008/09/30(火) 17:25:45
iconvとか
121117:2008/09/30(火) 18:10:17
>>118
octaveですか。ちょっと試してみます。
他におすすめあればよろしくお願いします。
122119:2008/09/30(火) 19:41:15
>>120
こんなのあったんですね。完全に見落としてました。
どうもありがとうございます。これで何とかなりそうです。
123117:2008/10/02(木) 09:56:46
liboctave使ってインテルコンパイラでコンパイルってどうするんですか?
g++ならできるんですが、icpcでコンパイルするとエラーがでます。
124デフォルトの名無しさん:2008/10/02(木) 11:37:14
>>123
たぶん、g++以外ではそのままコンパイルはできないと思う…
UNIX板のoctaveスレで聞いたほうがいいかもね
125117:2008/10/02(木) 12:41:35
>>124
やっぱり普通にはできないんですね。octaveスレで聞いてみます。
どうもありがとうございます。
126デフォルトの名無しさん:2008/10/03(金) 20:20:23
More Exception C++ 日本語翻訳版キターーー
http://www.pej-hed.jp/washo/2591.html

日本語の Boost本 2 冊目キターーー
http://www.pej-hed.jp/washo/2590.html
12793:2008/10/04(土) 01:44:48
とりあえずこんなクラスにしてみた。
若干使い方に制限はあるけど、ほとんどの演算子が使えるんでOK。

template <typename T>
class CNumeric
{
T m_Value;
public:
CNumeric(T val=0);
T operator=(T val);
operator T() const;
operator T&();
public:
static T Parse(const char* pVal);
const char* ToString(const char* pFormatString);
};

typedef CNumeric<int> CInt32;
128デフォルトの名無しさん:2008/10/04(土) 09:34:30
>>127
operator const T&() const; でも可かな。
129デフォルトの名無しさん:2008/10/04(土) 11:48:54
イベント処理を委譲するためのクラスを設計しています。
環境はVC2008EEです。
少し長いのですが、以下のコードの問題を指摘して頂けないでしょうか。
コンパイルは通るのですが、アクセスエラーが発生してしまいます。

// Event.h
#include <iostream>
#include <map>

class Object {
protected:
virtual ~Object(){}
};

typedef void (Object::*MessageFunc)();
130デフォルトの名無しさん:2008/10/04(土) 11:49:24
class Event : public Object {
private:
std::map<int, MessageFunc> msgMap;

public:
long Procedure(int msg);
void AddMessage(int msg, MessageFunc mf);
};

class Component : public Object {
protected:
Event ev;

public:
Component();

long Procedure(int msg);
void AddMessage(int msg, MessageFunc mf);

virtual void OnEvent();
};
131デフォルトの名無しさん:2008/10/04(土) 11:51:24
// Event.cpp

#include "Event.h"

long Event::Procedure(int msg)
{
(this->*msgMap[msg])(); // エラー発生
/**
* Event.exe の 0x00000000 でハンドルされていない例外が発生しました:
* 0xC0000005: 場所 0x00000000 を読み込み中にアクセス違反が発生しました。
*/
return 0L;
}

long Component::Procedure(int msg)
{
return ev.Procedure(msg);
}

void Component::OnEvent()
{
std::cout << "コンポーネントのイベントが呼ばれた." << std::endl;
}
132デフォルトの名無しさん:2008/10/04(土) 11:52:40
void Event::AddMessage(int msg, MessageFunc OnMessage)
{
msgMap.insert(std::map<int, MessageFunc>::value_type(msg, OnMessage));
}

void Component::AddMessage(int msg, MessageFunc OnMessage)
{
ev.AddMessage(msg, OnMessage);
}
static const int EVENT_ID = 1;

Component::Component()
{
AddMessage(EVENT_ID, (MessageFunc)&Component::OnEvent);
}

int main()
{
Component c;
c.Procedure(EVENT_ID);

return 0;
}
133デフォルトの名無しさん:2008/10/04(土) 12:00:28
世の中にはpastbinを初めとしてソースコードを貼り付けられるサービスぐらい山ほどあってだな。
134デフォルトの名無しさん:2008/10/04(土) 12:10:31
>>129
たぶん msgMap[msg] が 0。ちゃんと AddMessage できてるか確認した?
135デフォルトの名無しさん:2008/10/04(土) 12:25:04
Event ev;
MessageFunc func = (MessageFunc)&Component::OnEvent;
(ev.*func)();
こんなことしてるんだから落ちて当然
136129:2008/10/04(土) 12:56:10
>>133
ありがとうございます。
利用してみました。
http://pastebin.com/m1babf58d
これなら動くようです。
(倍角の部分は読み替えて下さい)

>>134
http://pastebin.com/m1babf58d
のように変更してデバッグしたところ、
- msgMap [1]((1,0x004110cd [thunk]:Component::`vcall'{4,{flat}}' }')) std::map<int,void (__thiscall Object::*)(void),std::less<int>,std::allocator<std::pair<int const ,void (__thiscall Object::*)(void)> > >
+ [0] (1,0x004110cd [thunk]:Component::`vcall'{4,{flat}}' }') std::pair<int const ,void (__thiscall Object::*)(void)>
- ev.msgMap [1]((1,0x004110cd [thunk]:Component::`vcall'{4,{flat}}' }')) std::map<int,void (__thiscall Object::*)(void),std::less<int>,std::allocator<std::pair<int const ,void (__thiscall Object::*)(void)> > >
+ [0] (1,0x004110cd [thunk]:Component::`vcall'{4,{flat}}' }') std::pair<int const ,void (__thiscall Object::*)(void)>
となっていましたので、登録はできているみたいです。

>>135
呼び出しを調べてみます。
137129:2008/10/04(土) 12:59:32
>>134
>>135
ありがとうございます。
138デフォルトの名無しさん:2008/10/04(土) 13:15:40
倍角って用語がなつかしい
139デフォルトの名無しさん:2008/10/04(土) 13:36:02
まあ意味を間違えて使ってるんだろうがね
140129:2008/10/04(土) 13:46:01
>>135
Component::OnEvent()をEvent::OnEvent()に移動させたら動きました。

Event ev;
MessageFunc func = (MessageFunc)&Event::OnEvent;
(ev.*func)();

で,OKですね。ありがとうございました。
ただ、Component::OnEvent()を他のComponentを継承したクラスで
オーバーライドさせたいので、全体の実装方法はもう少し考えてみます。
141デフォルトの名無しさん:2008/10/04(土) 13:58:32
template <typename Derived>
class base
{
public:
 typename Derived::P1 p1;
};

template <typename _P1>
class derived : public base<derived<_P1> >
{
public:
 typedef _P1 P1;
};

int main(int, char*[])
{
 derived<int> d; // error("P1"は"derived<_P1>"のメンバではない)
 derived<int>::P1 p1; // ok
}

base から derived<int>::P1 を参照できないんだが、
規格上こういうテンプレートは書けないって事でいいのかな?
142デフォルトの名無しさん:2008/10/04(土) 14:23:04
何故できないんだろう。
baseのメンバ関数の中では普通に使えるのにな。
143デフォルトの名無しさん:2008/10/04(土) 14:33:57
derived<_P1>のインスタンスが生成されていないからでは?
144デフォルトの名無しさん:2008/10/04(土) 14:54:06
その通りです。
145デフォルトの名無しさん:2008/10/04(土) 15:26:27
でもbaseクラスのDerived::P1は実体化されるまで探されないんじゃないの?
146デフォルトの名無しさん:2008/10/04(土) 16:02:30
new で生成したオブジェクトのポインタは == で比較できるので
std::vector に入れて線形検索できるけど、std::set に入れて検索できますか?

new ではなく同一配列内のオブジェクトのポインタは場合は < で比較できるので問題ないと思いますが。
147デフォルトの名無しさん:2008/10/04(土) 16:10:24
>>145
derivedの前に基底クラスのbaseを生成するので
baseが生成される時は、derived::P1 が何かわからない。
たぶん・・・
148デフォルトの名無しさん:2008/10/04(土) 17:44:03
WindowsでつかうC++のコンパイラってどれがいいの?
149デフォルトの名無しさん:2008/10/04(土) 17:51:51
Win なら VC 以外ありえないだろ。
150デフォルトの名無しさん:2008/10/04(土) 17:57:49
BorlandやIntelはダメってことか?
151デフォルトの名無しさん:2008/10/04(土) 18:03:31
DMC++が最高にいいよ
152デフォルトの名無しさん:2008/10/04(土) 18:03:54
ttp://d.hatena.ne.jp/Cryolite/20040507#p1
ここに書いてあるoperator=はやってはいけない実装らしいのですが
どこらへんがだめなのでしょうか?
153デフォルトの名無しさん:2008/10/04(土) 18:05:30
>>148
用途によって変わると思うのだが
開発効率あげたければBorland C++Builder
API直だたきしてGUIアプリ作りたければM$ Visual C++ 6.0, M$ Visual Studio 200x
C++の勉強程度ならBorland C++ Compiler とか GNU Compiler Collection
とか、プロトタイプ程度でわざわざVC++やVSのC++立ち上げるの嫌だしな
いま手に入るか知らないが、M$ Visual C++ 6.0は軽くていいよ
154デフォルトの名無しさん:2008/10/04(土) 18:06:14
再帰になってね?
155デフォルトの名無しさん:2008/10/04(土) 18:06:26
軽いけどバグってる
156デフォルトの名無しさん:2008/10/04(土) 18:16:02
>>152
自己代入に対応してないことと、
E::operator =が例外を投げない保障をしない場合に例外安全にならないこと
くらいじゃないかな…
157デフォルトの名無しさん:2008/10/04(土) 18:22:29
E::operator =じゃなかった。E::operator []だ
それとE::operator []の戻り値の型のoperator = かな
158146:2008/10/04(土) 18:27:18
>>146 ですけど
オブジェクトが同じ集成体にない場合、< の結果は未規定なのでできないようです。

ポインタを十分な大きさの整数に reinterpret_cast した場合、その整数は元のポインタに戻せるので
ポインタと変換された整数は1対1の関係ということになり、その整数を < で比較できます。

ただし十分な大きさの整数が存在するかどうかは処理系によるので、オブジェクトごとに一意の
整数 ID を持たせるしかないかもしれません。
159デフォルトの名無しさん:2008/10/04(土) 21:23:08
>158
>オブジェクトが同じ集成体にない場合、< の結果は未規定なのでできないようです。
std::less にはその制限がないから大丈夫。
> 14882:2003 20.3.3/8
>For templates greater, less, greater_equal, and less_equal, the specializations for any
>pointer type yield a total order, even if the built-in operators <, >, <=, >= do not.
160146:2008/10/04(土) 21:59:13
おお、std::less にそういう仕様があったんですか。
単に operator< を関数オブジェクトにするのが目的だと思っていました。
ありがとうございました。
16193:2008/10/04(土) 23:25:28
>>128
const 付けちゃうと、a++ なんてのが出来なくなっちゃうんで。
162デフォルトの名無しさん:2008/10/04(土) 23:28:29
CNumericとconst CNumericで呼び分けられるように
operator T&()とoperator const T&() constは両方とも用意するのが普通
16393:2008/10/05(日) 00:31:15
↓のコードだと operator + があいまいって怒られちゃうんだが、何か間違ってる?
環境は、VC++6.0。

template <typename T>
class CNumeric
{
T m_Value;
public:
CNumeric(T val=0) : m_Value(val) {}
T operator=(T val) { return m_Value=val; }
operator T() const { return m_Value; }
operator T&() { return m_Value; }
operator const T&() const { return m_Value; }
};
typedef CNumeric<int> CInt32;

CInt32 a=1, b=2, c;
c = a+b;
164デフォルトの名無しさん:2008/10/05(日) 00:36:50
VC2008だと怒られないな
165デフォルトの名無しさん:2008/10/05(日) 00:51:40
VC6はそろそろ消えて欲しいな
そういう自分もVC6物件のメンテナンスを2件抱えている。もうすぐ1件に減るけど
16693:2008/10/05(日) 01:04:48
ほんとVC6は切り捨てたいんだが、
外注からバージョンアップ費用出せと脅されるわ、金無いわで、どうしようもないんだよな。
といっても、いつまでもVC6使ってる訳にもいかないし。
167デフォルトの名無しさん:2008/10/05(日) 01:56:49
VC6で止まってるところよりも、新しいとこ探したほうがいいんじゃないか?
16893:2008/10/05(日) 02:02:28
そうなんだが、長年使ってきたというのもあって、
ノウハウ握られ過ぎてるんだわ。
169デフォルトの名無しさん:2008/10/05(日) 02:03:49
コンパイラのバージョンを上げるということはシステム全体のテストを全部やり直すことを意味する
問題領域にもよるけどね
システムの性質しだいでは莫大な費用が発生する
170デフォルトの名無しさん:2008/10/05(日) 06:04:47
     liboctave で逆フーリエ変換したいのだが、うまくいかない。
    どこがだめなんだろうか?

    int OCTAVE_iFFT( double *OCT_POW, int DATASIZE, double *OCT_BUF)
    {
    ComplexMatrix originalData( DATASIZE/2, 1, 0.0 ) ;
    for( int ii=0; ii<DATASIZE/2; ii++ ){
    originalData( ii, 0 ).real() = OCT_POW[ii] ;
    }
    ComplexMatrix ifourierData = originalData.ifourier() ;
    for( int ii=0; ii<DATASIZE; ii++ )
    OCT_BUF[ii] = ifourierData( ii, 0 ).real() ;
    return 0 ;
    }
171デフォルトの名無しさん:2008/10/05(日) 08:47:28
>>170
どこがうまくいかないのだろうか?
172デフォルトの名無しさん:2008/10/05(日) 10:54:05
コンパイル&実行はできますが、できるだけです。
あるデータをFFT->逆FFTにしても、まったく別のデータとなります。

>170
のソースで引数は、
double *OCT_POW:スペクトルデータ
int DATASIZE:データ長
double *OCT_BUF:音データ

で、意識的に意味合いを持たせているのは、
1つ目のfor:FFT後のデータの後半は対称なので、前半半分を逆フーリエ変換の対象としている。
1つ目のforの中身:実部にデータを代入。虚部=0。(originalData自体にデータを代入したが変化なし。)
です。
お願いします。
173デフォルトの名無しさん:2008/10/05(日) 12:35:37
>>172
まず、全域を計算対象にして、正弦波をぶち込んで、FFTが正しく行われているか確認し、次に逆FFTが正しく行われているか確認する。
その後いろいろ弄れ
174デフォルトの名無しさん:2008/10/05(日) 14:29:39
>173
FFTの動作は確認済です。
色々とやってみます。
175デフォルトの名無しさん:2008/10/05(日) 15:36:00
>173
フーリエ変換する最初からやってました。
"全域で"できました。
ありがとうございました。
176デフォルトの名無しさん:2008/10/05(日) 23:06:16
vc++ 2005,winXP Proを使っています。
下のように、char型の配列に1バイト文字、2バイト文字混合の文字列を入れたとして、
char test[] = "abcあいうえお";
test[x]が1バイト文字の一部なのか、2バイト文字の前半なのか、後半なのかを判別する方法はないでしょうか?

よろしくお願いします。
177デフォルトの名無しさん:2008/10/05(日) 23:07:24
文字コードによる。
178デフォルトの名無しさん:2008/10/05(日) 23:11:44
_ismbbleadもしくは_ismbslead
179デフォルトの名無しさん:2008/10/06(月) 00:03:15
g++なのですがenumを論理和しちゃうとコンパイルエラーになります
typedef enum {
 NONE = 0x00000000,
 A  = 0x00000001,
 B  = 0x00000010,
 C  = 0x00000100
} Unko;

int main(int ac, char** av) {
 // Unko unko = A; OK
 Unko unko = A | B;
 std::cout << std::hex << unko << std::endl;
 return 0;
}
180デフォルトの名無しさん:2008/10/06(月) 00:18:07
>>179
Unko
181デフォルトの名無しさん:2008/10/06(月) 00:24:47
少なくとも AとBの論理和を、そのままUnkoという型に代入するのはおかしい
キャストでもしない限り警告は出るだろ

エラーはぱっと見分からん
182デフォルトの名無しさん:2008/10/06(月) 00:26:15
>>179
Unko に D = 0x11 を定義すれば OK じゃね?
183179:2008/10/06(月) 00:29:20
main.cpp: In function ‘int main(int, char**)’:
main.cpp:13: error: invalid conversion from ‘int’ to ‘Unko’
ってでてます。 昔をとくにErrorとかWarningなしで通ってた気がするのですが。。。
184デフォルトの名無しさん:2008/10/06(月) 00:32:07
int→enumは暗黙変換してくれない
enum→intはできる
185デフォルトの名無しさん:2008/10/06(月) 00:32:44
まず言えるのは
AはUnko型
BもUnko型
CもUnko型
しかし、A|Bはint型
そんな未知の値をUnko型にはコンバート出来んよ
そもそもint型でウケるべきでは?
列挙型の意味理解してる?ただの定数じゃないぞ
186デフォルトの名無しさん:2008/10/06(月) 00:46:23
>>183
Cでは暗黙変換で通る。C++では明示的なキャストがないと通らない。
187デフォルトの名無しさん:2008/10/06(月) 00:48:54
一応、こういう関数を定義してやることは可能。
Unko operaotr |(Unko lhs, Unko rhs)
{
return static_cast<Unko>(lhs | rhs);
}
188デフォルトの名無しさん:2008/10/06(月) 00:50:20
operaotr
189デフォルトの名無しさん:2008/10/06(月) 00:54:37
代入は出来ても、Unko型は「0x11なんて知りません」って感じだなw
190デフォルトの名無しさん:2008/10/06(月) 01:27:44
C++初心者にどうだ!って見せられる短めの超絶テク探してるんだけどどんなのがいいかな
191デフォルトの名無しさん:2008/10/06(月) 01:39:26
便利さを見せつけたいのか難解さを見せつけたいのか醜悪さを見せつけたいのか
目的による
192デフォルトの名無しさん:2008/10/06(月) 01:46:45
>>190
オレにとっては STL map スゲーだった
でも、C++から始める人には何がスゲーのか分からんだろうな
193デフォルトの名無しさん:2008/10/06(月) 11:53:40
>>191難解さ・・・かな?
194デフォルトの名無しさん:2008/10/06(月) 12:18:14
>>190
Cは使えるC++初心者なら、ifとswitchが全然ないプログラムを見せてやれ。

195デフォルトの名無しさん:2008/10/06(月) 12:35:10
>>194
こうですか?わかりません><
#include <cstdio>
using namespace std;
class Manko {
public:
void hoge1(){printf("1\n");}
void hoge2(){printf("2\n");}
};
void hoge(int i)
{
void (Manko::*p[])() = {&Manko::hoge1,&Manko::hoge2};
(*p[i])();
}
196デフォルトの名無しさん:2008/10/06(月) 13:04:29
メタプログラミング見せてやれってことじゃ?

boostのspiritなんかも面白いかもね
197デフォルトの名無しさん:2008/10/06(月) 13:13:29
// これはC++ならではのコメントです
198デフォルトの名無しさん:2008/10/06(月) 14:17:57
>>195
このほうが良くないですか?って言われて終了
void hoge(int i)
{
printf("%d\n", i+1);
}
199デフォルトの名無しさん:2008/10/06(月) 14:27:39
>>197
しかしMSCのかなり前のバージョンから使ってたなあ、それ。
200デフォルトの名無しさん:2008/10/06(月) 15:55:27
だいたいC99にもあるじゃねーか。
201デフォルトの名無しさん:2008/10/06(月) 20:39:57
gccも拡張で採用してたし
202デフォルトの名無しさん:2008/10/06(月) 21:55:57
もともとご先祖様のBCPLにあったと言う。
203デフォルトの名無しさん:2008/10/06(月) 21:58:26
なんかD言語のコンパイル時に出力されるFizzBuzz問題のやつみたいな「えー、そんなことできるの!?」ってやつがいいんだが
204デフォルトの名無しさん:2008/10/06(月) 22:15:09
MPLでコンパイル時にFizzBuzzのシーケンスを作ればいいじゃないか。
205デフォルトの名無しさん:2008/10/06(月) 23:15:27
>>195

> void (Manko::*p[])() = {&Manko::hoge1,&Manko::hoge2};

なんだこれwww
文法エラー
しかもstaticじゃないと関数ポインタ取得できない
206デフォルトの名無しさん:2008/10/06(月) 23:33:39
メンバ関数ポインタを知らないのですね
まぁ呼び出しの方はおかしいけど
207デフォルトの名無しさん:2008/10/06(月) 23:38:14
#include <cstdio>
using namespace std;

class Manko {
public:
void hoge1() {printf("1\n"); }
void hoge2() {printf("2\n"); }
};

int main()
{
void (Manko::*p[])() = {&Manko::hoge1, &Manko::hoge2};
Manko m;

(m.*p[0])();
(m.*p[1])();
}
208デフォルトの名無しさん:2008/10/06(月) 23:41:49
>>206

ほほぅ
インスタンスって知ってますか?www

関数ポインタ変数にメンバ関数ポインタとやらを代入して、
関数ポインタ変数越しに呼び出すコードを晒して下さい
コンパイルが通るコードね
209208:2008/10/06(月) 23:43:14
>>207

これはひどいwww
何がしたいの?www
210デフォルトの名無しさん:2008/10/06(月) 23:43:48
>>209
お前は一体何を・・・
211デフォルトの名無しさん:2008/10/06(月) 23:44:47
>>208
初期化子について勉強しなおしたほうがいい
212208:2008/10/06(月) 23:48:35
>>211

なんで突然初期化子が出てくんだよwww

あぁあれか、馬鹿の一つ覚えってやつかな?www
213デフォルトの名無しさん:2008/10/07(火) 00:03:22
C++初心者になら、どんなに凄いソースコードを見せるより、
テンプレート使ったときのエラーメッセージ見せる方が効果的。
「この数千文字のエラーはね、constがないってコンパイラが怒ってるんだよ」
214デフォルトの名無しさん:2008/10/07(火) 00:04:44
俺もメンバ関数ポインタの構文はひどいとは思うが・・・
そういうことを言いたいのではなさそうだな?
215デフォルトの名無しさん:2008/10/07(火) 00:22:33
207は逃げたかwwwwwwwwwwwwwwwwwwwwww
216デフォルトの名無しさん:2008/10/07(火) 00:25:17
>>207>>208みたいなのに絡まれて大変だなw
217デフォルトの名無しさん:2008/10/07(火) 00:25:28
>>215
悪いことは言わん、お前が逃げろ
今すぐにだ
218デフォルトの名無しさん:2008/10/07(火) 00:27:29
メンバ関数のアドレスとかいう馬鹿げたものをちゃんと説明できたらすぐ逃げますよ
はいどうぞwwwww
219デフォルトの名無しさん:2008/10/07(火) 00:27:52
208はこんな深夜にスレ住民を笑い死にさせる気のようです
220208:2008/10/07(火) 00:30:43
>>217

ん?
俺は>>212以降は書き込んでないが?
221208:2008/10/07(火) 00:31:56
間違えた

>>217じゃなく>>219
222デフォルトの名無しさん:2008/10/07(火) 00:33:11
左様ですか
223208:2008/10/07(火) 00:33:19
というか、
>>218は頭悪そうだなwww
224デフォルトの名無しさん:2008/10/07(火) 00:35:18
207ほどではないwwwww
225デフォルトの名無しさん:2008/10/07(火) 00:36:11
thisについて理解してない馬鹿が約一名いるようですね
226デフォルトの名無しさん:2008/10/07(火) 00:41:35
なにがなんだかわからない・・・・・・・
227208:2008/10/07(火) 00:42:01
>>225

理解していない馬鹿はお前
thisが関数ポインタとでも?www
228デフォルトの名無しさん:2008/10/07(火) 00:42:09
207は早く出てきて謝れよw
229デフォルトの名無しさん:2008/10/07(火) 00:43:05
208は.*が一つの演算子だということを知らないようだ。
230208:2008/10/07(火) 00:44:03
>>229

お前も何言ってんだ?www
231デフォルトの名無しさん:2008/10/07(火) 00:44:06
泳がせるのもいいが、早く張ってやれよww
http://www.geocities.jp/ky_webid/cpp/language/034.html
232デフォルトの名無しさん:2008/10/07(火) 00:44:54
また面白いことを言い出す奴が現れたw

あれ?こいつ207じゃね?
233デフォルトの名無しさん:2008/10/07(火) 00:46:10
>>208
お前が207叩くから恥かいた
謝れよ
234デフォルトの名無しさん:2008/10/07(火) 00:47:44
よく考えたらこんなC++ヲタしか知らないカオス機能を説明なしに使う207も悪い
207も謝れ
235208:2008/10/07(火) 00:48:42
>>231

こういう構文もあるのか、しらんかったorz
まったく実用性ないが

でも誤ろうとは思わない
236デフォルトの名無しさん:2008/10/07(火) 00:50:13
知らなくて当然だよな
新しい機能だろ?こんな変なの
237208:2008/10/07(火) 00:51:52
でもこれってさ、
void (CSample::*pFunc)() = &CSample::func;
この時点でメンバ関数ポインタを取得っておかしくね?
238デフォルトの名無しさん:2008/10/07(火) 00:53:53
こんなわけのわからない構文におかしいも糞もないよ
そういうものだと思うしかないんだろ
239デフォルトの名無しさん:2008/10/07(火) 00:56:00
>>237
別におかしくないよ。
240デフォルトの名無しさん:2008/10/07(火) 00:57:41
CSampleのインスタンスが一つもない状態から
どうやってfuncなるメンバ関数を特定するのかとても不可解です
241208:2008/10/07(火) 01:01:53
おそらくオフセット的なものがpFuncに入っているのだろう
そして、呼び出し時にインスタンスを指定したところで、
インスタンスのポインタ+オフセットをcallみたいなことなのかな?

ん〜、どう見ても使えんwww
242デフォルトの名無しさん:2008/10/07(火) 01:01:59
特定しません
インスタンス付けて実際に呼ぶまで実際に呼ぶ関数は決まりません(virtualの場合)
243デフォルトの名無しさん:2008/10/07(火) 01:02:01
メンバ関数の引数には、隠されたthisポインタがあることを知っていれば、別におかしくない。
class CSample { void func(); };
void (CSample::*pFunc)() = &CSample::func;
(obj.*pFunc)();

void func(CSample *this);
void (*pFunc)(CSample*) = &func;
(*pFunc)(&obj);
244デフォルトの名無しさん:2008/10/07(火) 01:02:39
で、何の役に立つのこのクソ機能
245デフォルトの名無しさん:2008/10/07(火) 01:05:59
ジャンプテーブルを作るとき
246デフォルトの名無しさん:2008/10/07(火) 01:08:47
大して役に立たない機能は他にもあるからなぁ
全部の機能が何かの役に立つわけではないだろう
247デフォルトの名無しさん:2008/10/07(火) 01:09:41
C#でdelegateでも弄ればきっとそのとてつもない便利さに目覚めるさw
248208:2008/10/07(火) 01:14:02
でもよく考えたら、
呼び出す時にインスタンス指定しなきゃいけないんだろ?

関数ポインタっつってるけど、
これ関数ポインタじゃねーじゃんwww
249デフォルトの名無しさん:2008/10/07(火) 01:15:53
>>248
納得いかないなら自分でthisとメンバ関数ポインタのペア作れよ、テンプレート使えば汎用的だし簡単にできるぞ
250デフォルトの名無しさん:2008/10/07(火) 01:21:08
クラスの仕組みをメモリイメージで解説してる入門書が少ないのが問題だな
251デフォルトの名無しさん:2008/10/07(火) 01:26:01
役に立たない、使い道が無いと思うのは経験不足。
無理に使う必要は無いが、使ったほうが楽になる場面というのはあるもんなんだぜ。
252デフォルトの名無しさん:2008/10/07(火) 01:30:26
くれぐれも覚えたてのテクだからって乱用すんなよw
253デフォルトの名無しさん:2008/10/07(火) 01:34:16
濫用してみたいけど使い道が全く思いつかないから大丈夫
254sage:2008/10/07(火) 01:41:26
経験豊富になっても使い道ないから安心しろ
255sage:2008/10/07(火) 01:57:09
こんな機能でジャンプテーブル作るくらいなら
普通は仮想関数使うががな
こんな機能を使い道あるとかいうやつは経験不足

仮想関数呼び出しにかかるコストが、とかいうやつは
なんでC++使ってんだって話だよな

一応オブジェクト指向言語なんだからさぁ
256デフォルトの名無しさん:2008/10/07(火) 02:01:11
オブジェォクト指向語るなら委譲くらい使いこなせるようにならないとなw
257デフォルトの名無しさん:2008/10/07(火) 02:11:28
Undo機能とか、マクロ機能とか、GUIのイベントハンドラとか、使い道はあるんだぜ?
258デフォルトの名無しさん:2008/10/07(火) 02:26:04
久方ぶりにC++をいじったら色々思い出せない、なんてこったぁぁぁ
リハビリ兼ねて C# の Func デレゲートを作ってみた
#include <stdio.h>
// ヘルパーコード
namespace detail {

template<typename TArg1,typename TResult> class FuncBase{
public:
 virtual TResult operator () (TArg1) = 0 ;
};

template<typename TObject,typename TArg1,typename TResult> class FuncBaseT : public FuncBase<TArg1,TResult> {
 TResult (TObject::*f_)(TArg1);
 TObject *o_;
public:
 FuncBaseT(TObject *o,TResult (TObject::*f)(TArg1)) : o_(o) , f_(f) {}
 TResult operator () (TArg1 arg1) {return (o_->*f_)(arg1);}
};

} // namespace detail {
259デフォルトの名無しさん:2008/10/07(火) 02:26:57
// C# の Func デレゲートもどき、委譲するぜえぇぇ
// TArg1 引数型、TResult 戻り値型
template<typename TArg1,typename TResult> class Func {
 detail::FuncBase<TArg1,TResult> *b_;
public:
 // object 実行対象、function メンバー関数ポインタ
 template<typename TObject>
 Func(TObject *object,TResult (TObject::*function)(TArg1))
  : b_(new detail::FuncBaseT<TObject,TArg1,TResult>(object,function)) {}

 // 関数演算子
 TResult operator () (TArg1 arg1) {return (*b_)(arg1);}
};
//使い方
class F2 {
public:
 double a_;
 double b_;
 double c_;
public:
 F2(double a ,double b,double c) : a_(a) , b_(b) , c_(c) {}
 // 二次方程式計算
 double Calc(int x) {return a_*x*x + b_*x + c_*x;}
};
int main(int,char*[]) {
 F2 obj(1,2,1);
 Func<int,double> func(&obj,&F2::Calc);
 printf( "%f" , func(10) ) ;
}
260デフォルトの名無しさん:2008/10/07(火) 02:30:34
2chの使い方も分かんねーやつに言われたくないねw
2chも満足に使えんのにオブジェクト指向言語なんてまともに使えないだろw
261デフォルトの名無しさん:2008/10/07(火) 03:18:21
ヘルパーコードを取り除いて、一つのクラスにしてコンパクトにまとめた、メンバ関数以外にスタテック関数も同様に取り扱える様にして、コピー・代入・比較も追加した。
これで実用レベルかな、typedef の使い方を忘れてしまっていたのに絶望した・・・C#にもほすぃ、そろそろ寝よう
template<typename TArg1,typename TResult> class Func {
 typedef Func<TArg1,TResult> ThisType;
 class Base {
 public:
  virtual TResult operator ()(TArg1) = 0 ;
 };
 template<typename TObject> class BaseM : public Base {
  TResult (TObject::*f_)(TArg1);
  TObject *o_;
 public:
  BaseM(TObject *o,TResult (TObject::*f)(TArg1)) : o_(o) , f_(f) {}
  TResult operator ()(TArg1 arg1) {return (o_->*f_)(arg1);}
 };
 class BaseS : public Base {
  TResult (*f_)(TArg1);
 public:
  BaseS(TResult (*f)(TArg1)) : f_(f) {}
  TResult operator ()(TArg1 arg1) {return (*f_)(arg1);}
 };
 Base *b_;
public:
 template<typename TObject>
 Func(TObject *object,TResult (TObject::*function)(TArg1)) : b_(new BaseM<TObject>(object,function)) {}
 Func(TResult (*function)(TArg1)) : b_(new BaseS(function)) {}
 Func(ThisType const & o) : b_(o.b_) {}
 ThisType & operator = (ThisType const & o) { b_(o.b) ; return *this;}
 bool operator == (ThisType const & o) { return b_ == o.b; }
 bool operator != (ThisType const & o) { return b_ != o.b; }
 TResult operator () (TArg1 arg1) {return (*b_)(arg1);}
};
262デフォルトの名無しさん:2008/10/07(火) 03:21:43
やべぇ、delete忘れてらwwwww
263デフォルトの名無しさん:2008/10/07(火) 03:36:09
そこでboost::function
264デフォルトの名無しさん:2008/10/07(火) 06:43:35
昨夜恥かいた子は、メンバ関数ポインタの役に立つ頻度に話をずらして
何とか急場を凌いだみたいだけど、
知識としては「メンバ関数ポインタすら知らない」ってあり得ないくらい無知だよな。
265デフォルトの名無しさん:2008/10/07(火) 07:17:24
ずいぶん伸びたな

メンバ関数ポインタはalgorithmの関数群を使うときに役に立つよ
266デフォルトの名無しさん:2008/10/07(火) 08:15:54
粒度の小さい Adapter パターンなどにも使えるな
仮想テーブルは、クラスひとつにつき一つ固定だが、メンバ関数ポインタを使い仮想テーブルを自分で作ってしまえばインスタンスの生成後に仮想テーブルを書き換え可能にでき動的な仮想テーブルが作れる。
他にもWindow関係のクラスのメッセージ処理のように、メッセージをキューイングしたりするのにも有効。
要はめちゃめちゃ使えるという事だな。
267デフォルトの名無しさん:2008/10/07(火) 09:15:32
俺も最近boost触り始めてfunction見つけて初めてメンバ関数ポインタを知った
268デフォルトの名無しさん:2008/10/07(火) 11:01:03
元々の趣旨>>190に沿ってるから十分役に立ったんじゃね?
C++多少使えますみたいのが釣れたみたいだし。
269デフォルトの名無しさん:2008/10/07(火) 15:44:46
3 [main] ? 3084 init_cheap: Couldn't reserve 3600336 bytes of space for cy
gwin's heap, Win32 error 487
C:\cygwin\lib\gcc\i686-pc-cygwin\3.4.4\cc1.exe (3084): *** AllocationBase 0x0, B
aseAddress 0x61820000, RegionSize 0x360000, State 0x10000

こんなエラーが出てしまったんですが、何が問題なんでしょうか。
270デフォルトの名無しさん:2008/10/07(火) 16:27:13
ヒープ領域を3.6GB確保できませんでした。
アルゴリズムを根本から見直せばか。
って怒ってるんじゃね。
271デフォルトの名無しさん:2008/10/07(火) 16:30:59
>>269
コンパイル時にメモリ不足だってメッセージ
272デフォルトの名無しさん:2008/10/07(火) 16:31:59
えっと、今までは出なかったのが今回出るようになった?
初めてやって出たのならインストール失敗してないか。
273デフォルトの名無しさん:2008/10/07(火) 16:34:43
もしかしてVista?
ttp://d.hatena.ne.jp/kazy/20080310/p1
これかもね。
274デフォルトの名無しさん:2008/10/07(火) 16:55:57
一回入れ直したせいかもしれない……
メモリ不足……3.6Gも!?

OSはXP SP2使ってます。
275デフォルトの名無しさん:2008/10/07(火) 16:56:54
3.6Gって32bitの限界じゃ?
276デフォルトの名無しさん:2008/10/07(火) 16:57:30
>>270
> 3.6GB
277デフォルトの名無しさん:2008/10/07(火) 17:49:02
>>255
メンバ関数へのポインタが仮想関数より低コストとは考えづらい。
どっちも間接呼び出しを少なくとも1回挟む必要がある。
278デフォルトの名無しさん:2008/10/07(火) 18:35:01
そういや新しい版のMore Effectiveにメンバ関数のポインタの話が載ってた気がする
たしかプロトコルクラスのところだったかな
279デフォルトの名無しさん:2008/10/07(火) 20:25:05
いい加減More Effective C++の日本語訳が出る予定はないんですか
赤ちゃん語版が出てるのは知ってるけど
280デフォルトの名無しさん:2008/10/07(火) 23:10:31
原書嫁
281デフォルトの名無しさん:2008/10/08(水) 00:22:44
俺が読むというより人に読ませたいんだよなぁ
英語だと読んでくれない
282デフォルトの名無しさん:2008/10/08(水) 02:38:51
つーかまともな訳には、
C++を理解していて、なおかつ文才のある人間が必要だし、無理だろ。
どちらか一方にたけている奴はゴロゴロいるだろうが、両方優れている奴は日本にいねぇよ。
283デフォルトの名無しさん:2008/10/08(水) 06:02:26
>>282
そんな考え方もあるのか
284デフォルトの名無しさん:2008/10/08(水) 11:04:02
ひどい訳のひどさはそんなもんじゃねぇよ
手を抜いてるとしか思えないもの、日本語として通じてないもの
たんに書いた奴に誠意がないだけ
285デフォルトの名無しさん:2008/10/08(水) 11:12:42
両方持ってるやつは別分野で実力発揮しているよ
286デフォルトの名無しさん:2008/10/08(水) 22:13:01
Moreじゃない方の訳者じゃダメなの?
287デフォルトの名無しさん:2008/10/08(水) 23:10:44
ASCIIのときの方がよかった
288デフォルトの名無しさん:2008/10/08(水) 23:23:05
MoreじゃないほうとSTLに比べると、Moreの駄目さが目立つよね
289デフォルトの名無しさん:2008/10/10(金) 02:22:58
boostのany見てて思ったんだけど、実行時に構造体を作ろうとしたときに、コンパイル前に
方が分かってるのとほぼ同じコストで構造体作るにはどうしたらいいんだろうか。

例えば実行時にユーザーに型情報を入力してもらって

int
long
char*
^Z

みたいに。それで実際そういうデータの集まりの構造体があるかのように振舞わせるには
290デフォルトの名無しさん:2008/10/10(金) 02:52:42
charの配列取っといて切り分けるとかしかないんじゃないの
エンディアンに依存するから移植性ないけどな
291デフォルトの名無しさん:2008/10/10(金) 09:00:02
コストかかるんじゃない。
292デフォルトの名無しさん:2008/10/10(金) 12:28:51
>>289
サイズからオフセットと総サイズを計算しておき、それが収まる領域に各要素のプレイスメントnewしている。ヒープからの取得一回分のコストでオブジェクトが作れる。

293デフォルトの名無しさん:2008/10/10(金) 16:05:44
とりあえずこんな風に作ってみました。ここもっとこうした方が効率いいとか、使いやすいとかあったら
突っ込みお願いします。

struct Struct{
  vector<unsigned int> align;
  Struct():align(1){align[0]=0;}
  template<typename T>
  void add(){add(sizeof(T));}
  void add(size_t s){align.push_back(align.back() + s);}
};
struct StructData{
  vector<unsigned int> s;//オフセット情報
  char *data;      //データ本体
  StructData(Struct st):s(st.align){data=(char*)malloc(s.back());}
  ~StructData(){free(data);}
  template<typename T>
  void assign(size_t index,T data){*(T*)(this->data + s[index]) = data;}
  template<typename T>
  T get(size_t index){return *(T*)(data + s[index]);}
};

Struct str;
str.add<long int>(); str.add<int>(); str.add<char>(); str.add<float>();
StructData sd(str);
sd.assign(2,100); sd.assign(3,1.5f);
printf("%d %f\n",sd.get<char>(2),sd.get<float>(3));
294デフォルトの名無しさん:2008/10/10(金) 23:23:27
try catch 使う時は、必ず catch( ... ) 付けろって言ってる奴が会社にいるんだけど、
理由を聞いてもピンとこない。

曰く「catch( ... ) は来ちゃいけないって意味だから、未知の例外としてプログラムを終了するべき」
という事なんだけど、これってほんとなの?
「catch( ... ) は来ちゃいけないって意味」、からして間違ってると思う。。。

catch( ... )を付けるかは、例外機構の設計によるのであって、いつも付けるってのは間違ってると思う。
常にcatch( ... )で例外受けたら、目的があって誰かが投げた例外を自分のコードで揉み消す事になり、
なんだか判らない例外で或る以上、原因も判らないという事になってしまう。

ソフトが御行儀よく終了する方が良いに決まってるけどさ、
自分の判らない事まで「気を聞かせて」処理してしまうのは、ただの無責任と思うんだが。

ご意見募集。
295デフォルトの名無しさん:2008/10/10(金) 23:36:21
>>294
catch で受けた後、やるべきエラー処理やってから throw; で再送できるから
不必要に揉み消すことはないよ。
296デフォルトの名無しさん:2008/10/10(金) 23:37:11
>>294
catch (...)したらthrow;する。これは常識。
catch (...)は例外発生時に確実にポインタやハンドルを開放するためのものであって、例外をなかったことにするためのもんじゃない。
まあ、スマートポインタなり使えで終わる話ではあるが。
297デフォルトの名無しさん:2008/10/10(金) 23:40:21
>>294
来るはずの無い例外が来たのなら、それは何らかのバグ。
きちんと捕捉して対応しないといけない。
catch(...)が無ければどっかへ飛んでいってしまうわけで。
switchのdefault的というか。

> 目的があって誰かが投げた例外
であればそれは仕様上に無いといけないし、
きちんと把握して処理しないといけない。
つまり対応するcatchを付ける。
その上で、発生しないはずの「その他」をcatch(...)で捕まえる。

> 自分のコードで揉み消す事に
消すなっての。
> 未知の例外としてプログラムを終了するべき
が何でもみ消すことになるんだ。

> なんだか判らない例外
なんだから、なんだか判らない状態になってるわけで、
そこでプログラム止めてどういう状態なのか調べないと。
298デフォルトの名無しさん:2008/10/10(金) 23:47:21
catch( ... ) はそれを受けたモジュール(やクラス)が自分を正常な状態に保つ為に使って
throw; で再送すれば問題ないってことか。

最初からそういってくれれば良いのに。
299デフォルトの名無しさん:2008/10/10(金) 23:48:11
本当に未知の例外ならmainまで突き抜けてランタイムの例外捕捉ルーチンが始末つける。
勝手に途中でcatch(...)する必要なんか無い。
300デフォルトの名無しさん:2008/10/11(土) 00:06:32
途中で catch( ... ) と throw; しても上位のモジュールでその例外を捕まえなかったら意味ないわな。
そこまでちゃんと設計してるかどうかってことなんじゃないか。
301デフォルトの名無しさん:2008/10/11(土) 00:29:37
catch( ... )は未知の例外に対処するんじゃなくて
未知の例外が通過するから、その前に自分の知ってる範囲の後始末をする所
無意味ということはない
302デフォルトの名無しさん:2008/10/11(土) 00:41:21
最近仕事ではJavaばっかやってるが、これExceptionに頼りすぎて、これに慣れきった技術者が心配になる
GOTO信者と大差ないよな
303デフォルトの名無しさん:2008/10/11(土) 00:48:03
むかし、VC++5.0だったかで、goto文で try ブロックの中に 入れるってのがあって、
仕様だったらしいけど流石に後で廃止されたという話を思い出した。
catchの中には入れたんだっけな。

goto TryBlock;

try {
TryBlock:
} catch ( ... ) {
}
304デフォルトの名無しさん:2008/10/11(土) 00:52:05
35.2361 → 35°14′9.96″
上記のように緯度経度を"度"から"度分秒"形式に
変換するコードを教えてください。
変換式は、まず
35.2361の小数点部分の0.2361×60=14.166
この結果の整数部分の14が分になります。
そして、14.166の小数点部分の0.166×60=9.96
この結果の9.96が秒になります。
305デフォルトの名無しさん:2008/10/11(土) 00:53:27
そこまでわかってるなら自分でやれよ
その程度C++なんか使うまでもないし
306304:2008/10/11(土) 00:59:06
初心者で全然わからないんですよ。
ちなみに初期値の35.2361は文字列です。
307304:2008/10/11(土) 01:03:52
出力値の35°14′9.96″も文字列です。
まじでお願いします。時間が無いのです。
308デフォルトの名無しさん:2008/10/11(土) 01:09:02
時間がないとは、どういったお仕事ですか?
309デフォルトの名無しさん:2008/10/11(土) 01:09:42
そもそもプログラムが出来ないんなら諦めたほうが早いぜ
とにかくソースコード書かないと進まんだろ
310デフォルトの名無しさん:2008/10/11(土) 01:10:13
学校の宿題なら諦めてくださいね
311304:2008/10/11(土) 01:11:52
>>308
仕事はハードウェアです。
時間が無いのです。誰かお願いします。
312デフォルトの名無しさん:2008/10/11(土) 01:16:16
>>304
#include <stdio.h>
int main()
{
  char s[] = "35.2361";
  int a , b;
  sscanf(s, "%d.%d", &a, &b);
  printf("%d° %d’ %d.%d”", a, b * 60 / 10000, b * 60 % 10000 * 60 / 10000,
      b * 60 % 10000 * 60 % 10000 / 100);
  return 0;
}
313デフォルトの名無しさん:2008/10/11(土) 01:19:05
>>304
#include <stdio.h>
int main()
{
  char s[] = "35.2361";
  char s2[500];
  int a , b;
  sscanf(s, "%d.%d", &a, &b);
  sprintf(s2, "%d° %d’ %d.%d”", a, b * 60 / 10000,
      b * 60 % 10000 * 60 / 10000,
      b * 60 % 10000 * 60 % 10000 / 100);
  puts(s2);
  return 0;
}
ほらよ文字列出力だw
314デフォルトの名無しさん:2008/10/11(土) 01:20:23
しょうがねえな
int a=strtod("35.2361",0)*'2'*'P'*'_'/'&';
printf("%d°%d′%d″",a/023420,a%023420*'<'/0x2710,a%023420*'<'%0x2710*((1<<6)-4)/'d');
デバッグはしていない
315デフォルトの名無しさん:2008/10/11(土) 01:24:31
#include <iostream>
#include <sstream>
#include <string>
#include <cmath>

int main()
{
std::string str = "35.2361";
std::istringstream os(str);
int i;
double d;

os >> i >> d;

std::cout << i << "°" << int(d * 60) << "’" << (d * 60 - std::floor(d * 60)) * 60 << "”";
}
316デフォルトの名無しさん:2008/10/11(土) 01:24:36
で、「°」と「′」と「″」は全角なのか?
適切に変換しないと多分>>312-314はそのままじゃ動かない
でも文字コードは隠してるみたいだからそこは自分でちゃんと出来ると言うことだな
317304:2008/10/11(土) 01:38:09
>>312>>315
本当にありがとうございます。参考にさせて頂きます。
っで312〜315の中でどれが一番上司に褒められますか?
可読性やパフォーマンスなどを考慮して。
318デフォルトの名無しさん:2008/10/11(土) 01:38:12
"仕事はハードウェア"って斬新な物言いだと思った。
319デフォルトの名無しさん:2008/10/11(土) 01:39:46
>>316
>>314がおすすめ、きっと興奮してくれる
320デフォルトの名無しさん:2008/10/11(土) 01:39:50
>>317
どれもそのままは使えないっての
316考慮しないとどれでも叱られる

まあでもそこは心配ないんだよな
321デフォルトの名無しさん:2008/10/11(土) 01:41:15
>>320
さっきから一体お前はどんな環境を想定しているのか
322デフォルトの名無しさん:2008/10/11(土) 06:39:48
学校じゃなくても宿題は宿題なんだから
このスレの範疇外だと思うが
323 ◆ccqXAQxUxI :2008/10/11(土) 15:53:00
test
324デフォルトの名無しさん:2008/10/11(土) 22:21:19
html 関連の質問です。
VC++ 2005、WinXPでプログラムを組んでいますが、あるhtmlファイルからanchorタグを読み込み、リンク先のページを取得したいと思います。
一々、自作のライブラリでリンク先を検出するようだと、作成時間がかかって仕方ないので、どなたか、htmlをパースしてリンク先のアドレスを取得できるような
ライブラリや関数などをご存知の方、教えていただけないでしょうか?
325デフォルトの名無しさん:2008/10/11(土) 22:32:20
>>324
鼬害。
326デフォルトの名無しさん:2008/10/11(土) 22:49:52
>>324
このスレで聞いてみるとか。

IEコンポーネントを使い倒すスレ Ver.2
http://pc11.2ch.net/test/read.cgi/tech/1145189322/
327デフォルトの名無しさん:2008/10/11(土) 22:58:21
>>326
どうもです、そちらで聞いてみます。
328デフォルトの名無しさん:2008/10/12(日) 15:20:44
エレガントなデータ構造やオブジェクト指向やらを持った
勉強になるソースはどっかに無いでしょうか?
トリッキーとかの意味じゃないほうで
329デフォルトの名無しさん:2008/10/12(日) 15:25:04
>>328
標準テンプレートや boost のインターフェースを読むんだ。
実装はトリッキーなものもあるから読まないほうがいいかもな。
330デフォルトの名無しさん:2008/10/12(日) 17:09:00
>>328
MFCは?
331デフォルトの名無しさん:2008/10/12(日) 17:27:33
>>328
C++ではないが、.NET Frameworkのクラス構成、インターフェースが参考になるかも。
俺もC#をしばらくやってたら、いつの間にかC++でも結構上手く書けるようになっていた。
332デフォルトの名無しさん:2008/10/12(日) 17:28:18
MFCは手軽で、エレガントでいいかもな
コーディング規約だけは残念だけど
333デフォルトの名無しさん:2008/10/12(日) 17:39:40
MFCがエレガント?!
334デフォルトの名無しさん:2008/10/12(日) 17:55:03
釣りでしょう
335デフォルトの名無しさん:2008/10/12(日) 18:29:59
>>332
MFC以外のフレームワークは使ったことはあるかい?
336デフォルトの名無しさん:2008/10/12(日) 18:31:51
C++だと最も手をつけやすいってことじゃねーの?
337デフォルトの名無しさん:2008/10/12(日) 18:32:04
マジレスしとくと.NETやJavaのSwing辺りが良い
338デフォルトの名無しさん:2008/10/12(日) 18:34:57
Swingはねーわ
339デフォルトの名無しさん:2008/10/12(日) 18:35:48
C++スレだし。
340デフォルトの名無しさん:2008/10/12(日) 18:42:56
Swingが良いというのはちょっとな・・・
.NETは良いかもしれないけど、C++との相性は最悪
今後普及するとも思えないC++/CLIを使うって言うのも
341デフォルトの名無しさん:2008/10/12(日) 18:59:19
wxWidgets Qt FoxToolkit とかいろいろあるけどどれがいい?
342デフォルトの名無しさん:2008/10/12(日) 20:34:03
.NETがライブラリとして良い設計だと思う人がいるとはショックだ
ほとんど同じ機能で名前が違うクラスがたくさんあるじゃない
初めて.NETに触ったときは何だコリャっておもった
どんだけ無秩序に設計したんだって呆れた覚えがある
.NETはちょっとしか触ったことないんだけど
勘違いなら設計者の方々ゴメン
343デフォルトの名無しさん:2008/10/12(日) 20:46:12
うん
344デフォルトの名無しさん:2008/10/12(日) 20:58:59
唐突に質問すみません。
C++勉強中のものです。

継承を勉強しています。
以下のコードのような書き方/使い方は一般的に良いのでしょうか?

やりたいことは、Hoge/FooはBaseクラスの機能を持ち、
かつ、Baseクラスのメソッドから自分のprivateメソッドを呼び出したい。
このprivateメソッドを継承によりオーバーライドしたいと考えているのですが、
こういったことをしたい場合、以下のようなコードで良いのでしょうか?

色々な書き方、考え方があるかとは思いますが、ご指導をお願いします。

ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7779.txt
345デフォルトの名無しさん:2008/10/12(日) 21:07:39
>>342
もしかして、同じ関数をパラメータで処理を分けるべきと思ってたりする?
346デフォルトの名無しさん:2008/10/12(日) 21:08:34
リンク先見てないけど、仮想関数の話か?
347344:2008/10/12(日) 21:16:00
>>346
そうです。仮想関数の話です。
348デフォルトの名無しさん:2008/10/12(日) 21:21:44
>>345
いや、自分が驚いたのは InstallerCollection ってなに?っこと
ArrayListとかでいいじゃないかと思ったんです
InstallContext とかも存在意義がわからないし

オブジェクト指向覚えたてのルーキーが設計したみたいでしょ
349デフォルトの名無しさん:2008/10/12(日) 21:28:09
>>344
それで正しい
それが一般的な書き方
NVIといわれるC++では推奨されるイディオム
350デフォルトの名無しさん:2008/10/12(日) 21:28:32
>>348
generics導入前にかじった人か……その頃のクラスは結構黒歴史化してる。
template抜きのC++を使ってクラス設計したようなものだから。
351344:2008/10/12(日) 22:01:42
>>349
ありがとうございます。
NVIというイディオムなんですね。
調べてみます。
352デフォルトの名無しさん:2008/10/12(日) 22:07:06
>>351
private:ではなくprotected:だね
353デフォルトの名無しさん:2008/10/12(日) 22:14:37
>>352
いいや private だ
354344:2008/10/12(日) 22:19:39
>>352
すみません。
おっしゃるprotectedはどこに適用するべきなのでしょうか?
Base::Func()のことでしょうか?

また、(もしそうだと仮定して)Base::Func()をprotectedにした場合、
privateのままのときより、どういったメリットが得られるのでしょうか?
355デフォルトの名無しさん:2008/10/12(日) 23:06:52
>>354
privateだとFuncから派生元のBase::Funcを呼べなくなる。って思ったけど、純粋仮想関数だから呼ばなくって良かったのだったのか。
356デフォルトの名無しさん:2008/10/12(日) 23:18:35
仮想関数ってprivateにしてても継承先でオーバーライド出来るんだね。
なんとなく違和感があるが、何の為?
357デフォルトの名無しさん:2008/10/12(日) 23:37:15
>>356
元々オーバーライドを禁止する理由が無いからじゃないの?
358デフォルトの名無しさん:2008/10/12(日) 23:46:34
いや、privateのメンバー変数やら普通のメソッドは継承先から見えないよね。
一律それに揃えておけば仕様が一環してて分かりやすいように思ったのだが。
359デフォルトの名無しさん:2008/10/12(日) 23:54:40
オーバーライドは出来るけど、親クラス名::関数名っていう感じで明示的なコールは出来ないだろ
360デフォルトの名無しさん:2008/10/12(日) 23:57:09
virtualを付けるということはオーバーライドされる事を想定してるわけで、
呼び出せなくても派生先にはそういう関数があるということは知らされるべきだと考えられる

本当に派生先に触って欲しくないならvirtualを付けなければいい
361デフォルトの名無しさん:2008/10/13(月) 00:15:20
そんな仕様だったなんて、privateにvirtualつけたことがなかったから気がつかなかった
362デフォルトの名無しさん:2008/10/13(月) 00:17:05
調べてみたら、C#では仮想関数にprivate指定出来なくなってるね。
確かにその方が private の意味が一環するからってことかもね。
363デフォルトの名無しさん:2008/10/13(月) 00:18:41
>>358
C++ の private メンバは、見えている。禁止されているのはアクセス。
規格の 11 Member access control p4
> It should be noted that it is access to members and base classes that is controlled, not their visibility.

オーバーロードの解決なんかでも private メンバ関数は見えている。
364デフォルトの名無しさん:2008/10/13(月) 00:22:12
なるほど、サンクス。
365デフォルトの名無しさん:2008/10/13(月) 00:26:47
TemplateMethod用ならありかな
366デフォルトの名無しさん:2008/10/13(月) 00:30:03
C++コミュニティでは仮想関数はprivateっていうのがいいとされているでしょ
privateでない仮想関数はインターフェースとカスタマイズポイントの2役を担っていて良くないという理由で
367デフォルトの名無しさん:2008/10/13(月) 02:50:44
>>366
>C++コミュニティでは仮想関数はprivateっていうのがいいとされているでしょ

はつみみです
368デフォルトの名無しさん:2008/10/13(月) 02:54:41
>>367 >349
369デフォルトの名無しさん:2008/10/13(月) 03:04:17
protectedは見るがprivateは見たことねえなあ

privateにする理由ある?
370デフォルトの名無しさん:2008/10/13(月) 03:14:10
protected にする理由が無い。
371デフォルトの名無しさん:2008/10/13(月) 03:23:25
常にnon-virtualなインターフェースの殻を通して呼んで欲しいものを
派生クラスから直接いじくれるようにする何かが嬉しくなるってことだよな
protectedにするってことは

想像も付かん
372デフォルトの名無しさん:2008/10/13(月) 06:33:43
>>344
~Base() {};
デストラクタも virtual に
最後の;は要らん
373デフォルトの名無しさん:2008/10/13(月) 10:08:23
>>370
privateだと、オーバーライドする時にスーパークラスの元関数を呼べないんじゃないか?
374デフォルトの名無しさん:2008/10/13(月) 10:49:43
そんな事は無い。実装継承でぐぐれ。
375デフォルトの名無しさん:2008/10/13(月) 13:46:22
>>373
派生先から呼ばれることを前提に protected にしているメンバ関数はインターフェースであり
カスタマイズポイントの役割を負わすべきではないとNVIは言う
376デフォルトの名無しさん:2008/10/13(月) 14:05:04
privateでいいじゃない
呼ばせたくないんだから
377デフォルトの名無しさん:2008/10/13(月) 14:13:40
>>373が言いたいのは要するにこういう事?(>>344の例で行くと)

void Derived::Func()
{
 ... //追加の処理

 Base::Func(); //呼べねえ困った
}

でもそういう共通処理をやるために噛ませてるのがBaseFunc()なんだから
そっちに書けばBase::Func()は実装なしに出来るし、
Base::Func()を最後に呼べなんていう忘れられがちな約束を派生先としなくて済む
というかそれが目的でこんな事してるんだ

Base::Func()をするタイミングが派生先によってコロコロ変わるってなら
確かにprotectedにしないといけないけど、その場合そもそもNVIする意味がない
378デフォルトの名無しさん:2008/10/13(月) 14:38:23
virtual ~Dtor() = 0;
ってダメだっけ?
379デフォルトの名無しさん:2008/10/13(月) 15:01:20
どっかに実体を定義する必要がある
380デフォルトの名無しさん:2008/10/13(月) 17:23:57
何もしないなら
virtual ~Dtor() = 0 {}
でおk

どうでもいいけど純粋仮想デストラクタって必殺技の名前みたいだよな
381デフォルトの名無しさん:2008/10/13(月) 17:40:11
いや全然
382デフォルトの名無しさん:2008/10/13(月) 17:46:38
内包されたクラスをoperator <<(std::basic_ostream<T, E> &os, const typename test<A>::asdf &a)で出力しようとしても探査に失敗します。
なぜでしょうか?対策を教えてください。

#include <iostream>

namespace tekitou{
 template<typename T> struct test{ struct asdf{}; };

 template<typename T, typename E, typename A>
 std::basic_ostream<T, E> &operator <<(std::basic_ostream<T, E> &os, const test<A> &a){
  os << "test"; return os;
 }

 //こいつが探査されない
 template<typename T, typename E, typename A>
 std::basic_ostream<T, E> &operator <<(std::basic_ostream<T, E> &os, const typename test<A>::asdf &a){
  os << "asdf";
  return os;
 }
}

int main(){
 //これはコンパイルできる
 tekitou::test<void> a;
 std::cout << a << std::endl;

 //なぜか関数の探査に失敗する
 tekitou::test<void>::asdf b;
 std::cout << b << std::endl;
 return 0;
}
383デフォルトの名無しさん:2008/10/13(月) 17:54:36
>>382
仕様
そこまでは探してくれない

対策は asdf を外に出す
384デフォルトの名無しさん:2008/10/13(月) 18:05:09
下記で a は int だけど f(int(0)) はどうなる?

template<class T> struct A { typedef T type; };

template<class T> void f(typename A<T>::type);

A<int>::type a;

f(a);
385デフォルトの名無しさん:2008/10/13(月) 18:10:32
逆にboost::implicit_castなんか探索されない仕様を活用している。
386デフォルトの名無しさん:2008/10/13(月) 18:16:35
C++コミュニティでは仮想関数はprivateが常識ですよ
レベル低い奴は帰ってね
387デフォルトの名無しさん:2008/10/13(月) 18:20:39
privateかprotectedで宗教戦争レベルには落ち着いていると思う。
とりあえずpublicでさえなければどっちでもいい。
388デフォルトの名無しさん:2008/10/13(月) 18:25:18
>>386
そこまで認知されてないだろ。
389デフォルトの名無しさん:2008/10/13(月) 18:26:27
>>387
は? private と protected は全然違うだろ?
どっちでもいいわけがない。
390デフォルトの名無しさん:2008/10/13(月) 18:28:14
PIMPLイディオムよりは認知されているようだ

C++ nvi の検索結果 約 38,700 件中 1 - 50 件目 (0.50 秒)
C++ pimpl の検索結果 約 26,100 件中 1 - 50 件目 (0.60 秒)
391デフォルトの名無しさん:2008/10/13(月) 18:29:16
五十歩百歩じゃねーかw
392デフォルトの名無しさん:2008/10/13(月) 18:47:44
たかがC++ごときで粋がるなよあんちゃん 世の中広いんだぜ
お前の知らないことを知ってるやつなんてごまんといる。
393デフォルトの名無しさん:2008/10/13(月) 18:53:11
こういう話題について WAN 側でぺらぺらしゃべくる奇特な人口を世界の趨勢と勘違いしてる痛い香具師が後を絶たない
394デフォルトの名無しさん:2008/10/13(月) 18:55:23
メンバ関数は全てpublicにせよ(あとでいじれないと困るから)
という嘆かわしいルールで開発してる所も未だに実在しますので
395デフォルトの名無しさん:2008/10/13(月) 19:25:06
>>394
ワロタ
396デフォルトの名無しさん:2008/10/13(月) 19:30:59
>>394
お前、頭いいな^^
397デフォルトの名無しさん:2008/10/13(月) 20:33:52
こらこら、ちょっと FIT でも勉強してきなさい
ttp://fit.c2.com/
398デフォルトの名無しさん:2008/10/13(月) 23:10:59
>>393
メンバ関数ならまだマシ。
俺のところはメンバ変数も全てpublicだ。
もちろん理由はみんながいじれないと困るから。
399デフォルトの名無しさん:2008/10/13(月) 23:11:56
アンカー間違ったけどどうでもいいや
400デフォルトの名無しさん:2008/10/13(月) 23:17:30
>>398
それなら class ではなく struct を使えばいいな
401デフォルトの名無しさん:2008/10/13(月) 23:18:53
既存のコードを変更する恐怖が生んだルールですね
自動化されたテストがないんですね

でもテストの自動化が非常に困難なプロジェクトでは理にかなったルールなのかも知れない
402デフォルトの名無しさん:2008/10/13(月) 23:41:22
テストの自動化どころか、ロジックの自動化が(ry
403ちんぱんじー:2008/10/14(火) 00:24:45
ヘッダーファイル<*.h>ってなんですか?
教えてください
404デフォルトの名無しさん:2008/10/14(火) 00:27:11
インクルードすると色々な関数が使えるようになる魔法のファイル
405デフォルトの名無しさん:2008/10/14(火) 00:33:35
コンパイル時に、その先のファイルの内容が、ごそっとその場所にコピペされると思えばいい
406ちんぱんじー:2008/10/14(火) 00:52:06
インクルードファイルが開けませんってでたんですが、
それはヘッダーファイルと関連性はあるんですか?
407デフォルトの名無しさん:2008/10/14(火) 00:54:30
>>406
もっとわかりやすく質問したほうがいいと思います
408ちんぱんじー:2008/10/14(火) 00:55:58
質問内容変えます。
つまりhファイルがないとどうなるんですか?
409デフォルトの名無しさん:2008/10/14(火) 00:59:01
>>408
そのhなファイルの内容について詳しく。
410ちんぱんじー:2008/10/14(火) 01:00:46
#ifndef CALIB_CAMERA_H
#define CALIB_CAMERA_H

#include <AR/gsub_lite.h>

#define H_NUM 6
#define V_NUM 4
#define LOOP_MAX 20
#define THRESH 100

typedef struct {
double x_coord;
double y_coord;
} CALIB_COORD_T;

typedef struct patt {
unsigned char *savedImage[LOOP_MAX];
ARGL_CONTEXT_SETTINGS_REF arglSettings[LOOP_MAX];
CALIB_COORD_T *world_coord;
CALIB_COORD_T *point[LOOP_MAX];
int h_num; // Number of dots horizontally in the calibration pattern.
int v_num; // Number of dots vertically in the calibration pattern.
int loop_num; // How many images of the complete calibration patterns we have completed.
} CALIB_PATT_T;

void calc_distortion( CALIB_PATT_T *patt, int xsize, int ysize, double dist_factor[3] );
int calc_inp( CALIB_PATT_T *patt, double dist_factor[4], int xsize, int ysize, double mat[3][4] );

#endif // CALIB_CAMERA_H
411デフォルトの名無しさん:2008/10/14(火) 01:01:50
>>403
たぶんC++勉強し始めたばかりで分からないことは2chで聞いとけって思ってるんだろうけど、
なんでもここで聞くというより最低限の入門書/入門サイトで一通り勉強してきたら?
ヘッダファイルが何なのかすら載ってないようなら、他の本/サイトを探すべき。
412ちんぱんじー:2008/10/14(火) 01:03:25
いちおうコピペしましたが。
ヘッダーファイルの内容かかわらず、
具体的にどのようなエラーがでるんですか?
関数を処理できないとか
413ちんぱんじー:2008/10/14(火) 01:04:41
>>411
その通りですね、新しい本買ってみます。
414デフォルトの名無しさん:2008/10/14(火) 01:08:28
>>412
どんなエラーが出るかはヘッダファイルの内容とそれをインクルードするファイルの内容によって変わります

たとえば構造体のサイズや構成がわからないとか
定数や変数が定義、宣言されていないとか
C++では関数のシグニチャがわからないとか
415デフォルトの名無しさん:2008/10/14(火) 01:23:46
ARToolKitか。
まずは環境作らないとね
416146:2008/10/14(火) 12:13:52
関数内で定義したクラスにテンプレートメンバー関数を定義できないのはなぜですか?
VC8ではできませんでした。
417デフォルトの名無しさん:2008/10/14(火) 12:32:20
>>416
コードプリーズ
418デフォルトの名無しさん:2008/10/14(火) 12:44:14
>>416
規格によって禁じられているためです。
419146:2008/10/14(火) 14:08:25
>>418
ありがとうございます。

できれば便利だと思ったのですが残念です。
420デフォルトの名無しさん:2008/10/14(火) 14:32:18
System::String の変数を const char[] にキャストして代入したいのですが、
色々調べてやってみたのですが上手くキャストできません。
お手数ですが良い方法は無いでしょうか?
421デフォルトの名無しさん:2008/10/14(火) 14:36:16
配列の変数をlvalueにできたっけ?
422デフォルトの名無しさん:2008/10/14(火) 14:36:29
stdだと、&s[0]かs.c_str()
423デフォルトの名無しさん:2008/10/14(火) 14:52:07
&*s.begin()
424デフォルトの名無しさん:2008/10/14(火) 15:20:13
>>420
C++/CLI?
System::Runtime::InteropServices::Marshal::StringToHGlobalAnsiで変換できるよ

あと、C++/CLIには専用スレがあるよ
425420:2008/10/14(火) 15:50:12
皆さん色々と教えていただきありがとうございます。

使用しているのは Visual C++ 2005 Expressです。
std::stringだとc_str() や begin() は使用できるのですが、
System::String だと無理のようです。

でも System::String -> td::stringのキャスト方法もありそうなので、
色々と調べてみます。

System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi
も試してみます。






426デフォルトの名無しさん:2008/10/14(火) 16:14:38
内包されたクラスをoperator <<(std::basic_ostream<T, E> &os, const typename test<A>::asdf &a)で出力しようとしても探査に失敗します。
なぜでしょうか?対策を教えてください。

#include <iostream>

namespace tekitou{
 template<typename T> struct test{ struct asdf{}; };

 template<typename T, typename E, typename A>
 std::basic_ostream<T, E> &operator <<(std::basic_ostream<T, E> &os, const test<A> &a){
  os << "test"; return os;
 }

 //こいつが探査されない
 template<typename T, typename E, typename A>
 std::basic_ostream<T, E> &operator <<(std::basic_ostream<T, E> &os, const typename test<A>::asdf &a){
  os << "asdf";
  return os;
 }
}

int main(){
 //これはコンパイルできる
 tekitou::test<void> a;
 std::cout << a << std::endl;

 //なぜか関数の探査に失敗する
 tekitou::test<void>::asdf b;
 std::cout << b << std::endl;
 return 0;
}
427デフォルトの名無しさん:2008/10/14(火) 17:00:30
428デフォルトの名無しさん:2008/10/14(火) 17:25:31
内包されたクラスをoperator <<(std::basic_ostream<T, E> &os, const typename test<A>::asdf &a)で出力しようとしても探査に失敗します。
なぜでしょうか?対策を教えてください。

#include <iostream>

namespace tekitou{
 template<typename T> struct test{ struct asdf{}; };

 template<typename T, typename E, typename A>
 std::basic_ostream<T, E> &operator <<(std::basic_ostream<T, E> &os, const test<A> &a){
  os << "test"; return os;
 }

 //こいつが探査されない
 template<typename T, typename E, typename A>
 std::basic_ostream<T, E> &operator <<(std::basic_ostream<T, E> &os, const typename test<A>::asdf &a){
  os << "asdf";
  return os;
 }
}

int main(){
 //これはコンパイルできる
 tekitou::test<void> a;
 std::cout << a << std::endl;

 //なぜか関数の探査に失敗する
 tekitou::test<void>::asdf b;
 std::cout << b << std::endl;
 return 0;
}
429デフォルトの名無しさん:2008/10/14(火) 17:58:39
内包されたクラスをoperator <<(std::basic_ostream<T, E> &os, const typename test<A>::asdf &a)で出力しようとしても探査に失敗します。
なぜでしょうか?対策を教えてください。

#include <iostream>

namespace tekitou{
 template<typename T> struct test{ struct asdf{}; };

 template<typename T, typename E, typename A>
 std::basic_ostream<T, E> &operator <<(std::basic_ostream<T, E> &os, const test<A> &a){
  os << "test"; return os;
 }

 //こいつが探査されない
 template<typename T, typename E, typename A>
 std::basic_ostream<T, E> &operator <<(std::basic_ostream<T, E> &os, const typename test<A>::asdf &a){
  os << "asdf";
  return os;
 }
}

int main(){
 //これはコンパイルできる
 tekitou::test<void> a;
 std::cout << a << std::endl;

 //なぜか関数の探査に失敗する
 tekitou::test<void>::asdf b;
 std::cout << b << std::endl;
 return 0;
}
430デフォルトの名無しさん:2008/10/14(火) 18:01:28
postした後にF5やリロードボタンでリロードするのはやめろ
431デフォルトの名無しさん:2008/10/14(火) 18:03:02
内包されたクラスをoperator <<(std::basic_ostream<T, E> &os, const typename test<A>::asdf &a)で出力しようとしても探査に失敗します。
なぜでしょうか?対策を教えてください。

#include <iostream>

namespace tekitou{
 template<typename T> struct test{ struct asdf{}; };

 template<typename T, typename E, typename A>
 std::basic_ostream<T, E> &operator <<(std::basic_ostream<T, E> &os, const test<A> &a){
  os << "test"; return os;
 }

 //こいつが探査されない
 template<typename T, typename E, typename A>
 std::basic_ostream<T, E> &operator <<(std::basic_ostream<T, E> &os, const typename test<A>::asdf &a){
  os << "asdf";
  return os;
 }
}

int main(){
 //これはコンパイルできる
 tekitou::test<void> a;
 std::cout << a << std::endl;

 //なぜか関数の探査に失敗する
 tekitou::test<void>::asdf b;
 std::cout << b << std::endl;
 return 0;
}
432デフォルトの名無しさん:2008/10/14(火) 18:09:16
内包されたクラスをoperator <<(std::basic_ostream<T, E> &os, const typename test<A>::asdf &a)で出力しようとしても探査に失敗します。
なぜでしょうか?対策を教えてください。

#include <iostream>

namespace tekitou{
 template<typename T> struct test{ struct asdf{}; };

 template<typename T, typename E, typename A>
 std::basic_ostream<T, E> &operator <<(std::basic_ostream<T, E> &os, const test<A> &a){
  os << "test"; return os;
 }

 //こいつが探査されない
 template<typename T, typename E, typename A>
 std::basic_ostream<T, E> &operator <<(std::basic_ostream<T, E> &os, const typename test<A>::asdf &a){
  os << "asdf";
  return os;
 }
}

int main(){
 //これはコンパイルできる
 tekitou::test<void> a;
 std::cout << a << std::endl;

 //なぜか関数の探査に失敗する
 tekitou::test<void>::asdf b;
 std::cout << b << std::endl;
 return 0;
}
433デフォルトの名無しさん:2008/10/14(火) 18:27:53
悲しみとかないの?
434デフォルトの名無しさん:2008/10/14(火) 18:50:03
は?
435デフォルトの名無しさん:2008/10/14(火) 19:37:58
ひ?
436デフォルトの名無しさん:2008/10/14(火) 19:42:49
うざい質問は答える気が起きない(それ以前に読む気が起きない)
437デフォルトの名無しさん:2008/10/14(火) 19:49:12
内包されたクラスをoperator <<(std::basic_ostream<T, E> &os, const typename test<A>::asdf &a)で出力しようとしても探査に失敗します。
なぜでしょうか?対策を教えてください。

#include <iostream>

namespace tekitou{
 template<typename T> struct test{ struct asdf{}; };

 template<typename T, typename E, typename A>
 std::basic_ostream<T, E> &operator <<(std::basic_ostream<T, E> &os, const test<A> &a){
  os << "test"; return os;
 }

 //こいつが探査されない
 template<typename T, typename E, typename A>
 std::basic_ostream<T, E> &operator <<(std::basic_ostream<T, E> &os, const typename test<A>::asdf &a){
  os << "asdf";
  return os;
 }
}

int main(){
 //これはコンパイルできる
 tekitou::test<void> a;
 std::cout << a << std::endl;

 //なぜか関数の探査に失敗する
 tekitou::test<void>::asdf b;
 std::cout << b << std::endl;
 return 0;
}
438デフォルトの名無しさん:2008/10/14(火) 20:07:48
この質問はどこかで読んだような気がする。
439デフォルトの名無しさん:2008/10/14(火) 20:09:57
おれも少し前にも見た気がする
440デフォルトの名無しさん:2008/10/14(火) 20:20:59
気のせいじゃね?
441デフォルトの名無しさん:2008/10/14(火) 20:24:36
template<typename T, typename E>
std::basic_ostream<T, E > &operator<<(std::basic_ostream<T, E> &os, typename tekitou::test<void>::asdf &a)
{
os << "asdf";
return os;
}

442デフォルトの名無しさん:2008/10/14(火) 20:31:52
(´・∀・`)ヘー
443デフォルトの名無しさん:2008/10/14(火) 21:09:32
>>437
A が推測できないから、その関数が実態されず、コールできない。
tekitou::operator <<<char, std::char_traits<char>, void>(std::cout, b);
ってしたらコールできる。

よくわかんねぇ〜けどwww
無い知識しぼりだして答えてみたwww
444デフォルトの名無しさん:2008/10/14(火) 21:10:38
>>443
>>437
○ A が推測できないから、その関数が実態されず、コールできない。
× A が推測できないから、その関数が実態化されず、コールできない。
445デフォルトの名無しさん:2008/10/14(火) 21:52:06
>>443
>>437
○ A が推測できないから、その関数が実態されず、コールできない。
× A が推測できないから、その関数が実態化されず、コールできない。
446デフォルトの名無しさん:2008/10/14(火) 21:57:04
× 実態化
△ 実体化
○ 具現

内臓デバイスみたいな間違いこくなよ
447デフォルトの名無しさん:2008/10/14(火) 22:08:27
実態もだが開放も間違って返還される確立他界よな
448デフォルトの名無しさん:2008/10/14(火) 22:09:43
>>446
スマン
449デフォルトの名無しさん:2008/10/14(火) 22:12:42
>>446
ちなみに、「間違い」は「こく」ものではなく、「する」ものですけどね
450デフォルトの名無しさん:2008/10/14(火) 22:29:41
教えてください。

base64をデコードできるライブラリはありますか?
451デフォルトの名無しさん:2008/10/14(火) 22:39:23
>>450
ライブラリが必要なことか?
452デフォルトの名無しさん:2008/10/14(火) 22:40:00
そんくらい自分で作れw
十数行で出来るだろ
453デフォルトの名無しさん:2008/10/14(火) 23:27:51
>>446
実体化の方が使用例が多いぜ。
まあ、一番多い実体化でも、たったの千件なんだが。
これも、templateを詳しく解説した日本語の本ってないせいだな。
むしろ現状では、instantiationと言った方がよくね?

http://www.google.com/search?hl=en&q=C%2B%2B+instantiation+実体化
http://www.google.com/search?hl=en&q=C%2B%2B+instantiation+具現化
http://www.google.com/search?hl=en&q=C%2B%2B+instantiation+具現
454デフォルトの名無しさん:2008/10/14(火) 23:33:04
実体化のほうが好みだけど、X3014では具現化なんだよな……。
455デフォルトの名無しさん:2008/10/14(火) 23:38:23
"C++ 具現", "C++ 実体化" でググると、一万七千件と七万千件か。

>>454
ああ、すっかり忘れてた。そういえばそんなのあったね。
JIS規格を読んでいる日本人なんて、本家のISO/IEC 14882を読んでいる日本人より少なそうだが。
456デフォルトの名無しさん:2008/10/14(火) 23:54:02
自身の型を返す関数を注入するテンプレートを作ろうとしてCRTPをやる際に、
テンプレート自身が純粋仮想関数をもつクラスの派生だと通らないのですが、
これって解決できないでしょうか。

class Derived: public Base<Derived> { ... }
が通るのはいいとして、

class Interface { Interface* f()=0; }
template<class C> class Base: public Interface { C* f() { return static_cast<C*>() } }
class Derived: public Base<Derived> { ... }
とすると、
DerivedがBaseの派生であることが定義されないままBase<Derived>が実体化されるので、
Base中のCがInterfaceを継承したものと認識されずにコンパイル不可になります。
457デフォルトの名無しさん:2008/10/14(火) 23:58:01
VisualC++2008ExpressとDirectXSDKをインストールしたのに
ファイル→新規作成→プロジェクト
をしてもDirectX App....とかが出ない。どうしてでしょう・・
458デフォルトの名無しさん:2008/10/15(水) 00:12:21
スレ違い
459デフォルトの名無しさん:2008/10/15(水) 00:14:56
>>449
おれも「こく」より「する」派だな.おならもね.
460デフォルトの名無しさん:2008/10/15(水) 00:29:45
>>457
ディレクトリにDirectXが追加されてるかは見た?
461デフォルトの名無しさん:2008/10/15(水) 01:47:23
>>456
Base<C>::f の戻り型はC*にする必要があるの?
Interfaceを通して扱うのなら、Interface* でもいいのではと思った。
462デフォルトの名無しさん:2008/10/15(水) 03:04:07
>>437
優しい俺様が問題点を3行にまとめてさしあげます
template<typename T> struct test{ struct asdf{}; };
template<typename T> void f(const typename test<T>::asdf &a);
int main() { f(test<void>::asdf()); }
463457:2008/10/15(水) 03:34:51
>>458
すいません。別スレに移って聞いて見ます。すれ違いすいませんでした。
>>460
実行可能ファイル、インクルードファイル、ライブラリにもちゃんと入ってましたが何も変わりませんでした。
464デフォルトの名無しさん:2008/10/15(水) 08:57:08
>>461
456ではないが、共変戻り値を使いたいのだから答えになってないのでは?
Interface*を返すぐらいならBase<C>*を返す方が(こちらはコンパイルできる)、まだ意図に近い。
465デフォルトの名無しさん:2008/10/15(水) 23:22:42
>>464
そういう意図です。
Interfaceを継承させても扱いたいが、
単独で動作させることが多いんで、
メソッドチェーンを使いたいが困った、といった感じです。
466デフォルトの名無しさん:2008/10/15(水) 23:51:49
>>465
cloneが最端で実装するかないのと同じ理由でダメなんじゃないだろうか
467デフォルトの名無しさん:2008/10/15(水) 23:59:33
あるクラスに他のクラスを登録するという仕組みで悩んでいます。
class Item{
};
class Hoge{
  std::vector<Item> items;
public:
  void add(Item);
  Item get();
};

このaddやgetのところで引数や返り値は実体にすべきか、参照にすべきか、ポインタにすべきか
で悩んでいます。どこからでも登録できるようにして、あまりオブジェクトの削除の面倒なども見たくないので
スマートポインタとして取ろうかと思っているんですが、なにかコペルニクス的実装はないでしょうか?
468デフォルトの名無しさん:2008/10/16(木) 00:20:43
オブジェクトのオーナーは誰よ。
469デフォルトの名無しさん:2008/10/16(木) 00:23:19
>>467
> あるクラスに他のクラスを登録するという仕組みで悩んでいます。
「登録」の意味が曖昧
Item を Hoge の所有物にしたいと見えるが (つまりは composite) 違うのかな?

> このaddやgetのところで引数や返り値は実体にすべきか、参照にすべきか、ポインタにすべきか
> で悩んでいます。
const& Item で良いと思うが
何か良くないことがあるので悩んでいるのだろうか?

> どこからでも登録できるようにして、
これは access 権のことなのか?
何ら問題ないように思うが

> あまりオブジェクトの削除の面倒なども見たくないので
composite なら何の問題もないと思うが

あ、俺、何が問題なのか全然見当ついてないわ
470デフォルトの名無しさん:2008/10/16(木) 00:42:19
経験のなさだな>問題
471デフォルトの名無しさん:2008/10/16(木) 01:01:28
addもgetも自由に出来るようにするならHogeなんてクラスいらんがな
vector<Item>をそのまま扱えばいい

そういう話じゃなくて?
472デフォルトの名無しさん:2008/10/16(木) 02:13:27
C言語では、linuxでいうところのman -S 3 strlenなどで
includeするヘッダファイル名を知ることができたり
ヘッダファイル名の中で宣言されている関数名を知ることができたのですが
C++では、こういった体系的な情報はどうしたら得ることができるのでしょうか?
linuxではなくwindowsでも結構です。よろしくお願いします。
473デフォルトの名無しさん:2008/10/16(木) 02:28:16
ISO/IEC 14882:2003かJIS X3014でも読むがいい
474472:2008/10/16(木) 02:56:09
業務上で使うプログラムではなく趣味レベルで考えていますので
まだ規格書まで読み解こうとは思っておりません。
使うにあたって、もう少しリファレンスしやすいものを勧めていただけたら幸いです。

というのも、実は勉強しはじめるときに使ったwebサイトでは、
include文ではC言語と異なり<iostream>のように.hを除いた名前を使用するように
書いてあり、VC++2008で実行確認しながら進めていたのですが、
先日買った「C++ クラスと継承 完全制覇」という書籍では、
これらが全て.hの付いた名前で使用されており、
coutについてもusing namespaceしていないのにstd::をつけていない状態でした。

環境を変えてgccではコンパイルできたのですが、それでも警告が出る状態でして
結局VC++2008付属のコンパイラではコンパイルすらできませんでした。
調べた結果、中で使われていたstrcpy()をstrcpy_s()にしないとならなかったり、
includeでは.hをつけない、coutはやはりstd::coutで使用しないと名前解決できないなどでした。

これからも個々の問題の解決方法を調べるのが大変だと思い、簡単なリファレンスを探しているのです。
長くなりましたがよろしくお願いします。
475デフォルトの名無しさん:2008/10/16(木) 03:03:47
>>474
つ google
476デフォルトの名無しさん:2008/10/16(木) 03:05:46
「C++ クラスと継承 完全制覇」を捨てて他の本を買うのがいい
http://www.amazon.co.jp/Programming-Principles-Practice-Using-C/dp/0321543726
まだ発売されてないけどこれがいいと思う
477デフォルトの名無しさん:2008/10/16(木) 03:10:21
>>474
買った本が悪かったようだな。
ライブラリのクイックリファレンスでよければ、
ttp://www.amazon.co.jp/gp/product/487311196X/ref=sib_rdr_dp
478デフォルトの名無しさん:2008/10/16(木) 03:11:20
>>474
C++は比較的最近にも規格がかなり変わって、ちゃんとそれが使われてるるので
古い本はよした方がいい

strcpyの件はそれとは違うけど
479472:2008/10/16(木) 03:30:08
>>475-478
ありがとうございます。
上に挙げた書籍は2002年に発売されたものなので
比較的新しいと思ったのですがこれでも古いのですね・・・
Programming: Principles and Practice Using C++は
結構いい値段しますが格式高そうな本でいいですね。
オライリーの方は本屋にありそうですので、立ち読みしてみます。

結局、linuxのmanコマンドでCのリファレンスがあるのは
システムプログラミングの側面があるからなのでしょうね。
C++は膨大なものなのだそうで仕方ないのかもしれませんが、残念です.
480デフォルトの名無しさん:2008/10/16(木) 05:20:44
>>474
>477で勧められている本がマジで良い.あちしは職場と自宅に一冊ずつ用意して使ってる.

STLを使ったジェネリックプログラミングなどについては一切解説していないので、その辺の知識は別の本が良いだろうけど.
481デフォルトの名無しさん:2008/10/16(木) 08:35:00
>>474
strcpy_sは、MS独自の関数だよね。
482デフォルトの名無しさん:2008/10/16(木) 20:07:18
移植性が大事なら警告をオフにしてstrcpyを使うべきだね。
C++なら_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMESである程度対応できるし。
483デフォルトの名無しさん:2008/10/16(木) 21:04:17
C++的には本当はstringを使うべきなのかもしれんがな
484デフォルトの名無しさん:2008/10/16(木) 21:58:08
>>483
なんで自信ないんだよ
485デフォルトの名無しさん:2008/10/16(木) 22:27:05
だって…あんなものを必ず使えだなんて言えない…
486デフォルトの名無しさん:2008/10/16(木) 22:35:21
てすつ
487デフォルトの名無しさん:2008/10/16(木) 22:46:04
>>468 オーナーはHoge意外とだけ言っておきます。
>>469 登録というのは例えばリスナーを登録する時のように、オブジェクトに
イベントを通達できるような何らかのアクセス手段を持たせておくことです。
後出しで申し訳ないのですが、Itemは多態をさせたいので、そもそも実体では無理でした。すいません。
どこからでもというのは特に気にしなくていいです。
Itemをポインタにしたときnewして登録したあと、Hogeにdeleteさせるのは気持ち悪いなと思ったので・・・

ていうか普通はリスナーとかってどう実装すべきなんだろう
488デフォルトの名無しさん:2008/10/16(木) 23:23:26
>>487
ほぼ自分で答え出てるじゃん
リスナーはキャスターの所有物ではない
ItemはHogeの所有物ではない
Itemをcompositeする(所有する)のはHoge意外の何か別の人
HogeのインターフェースはItemの参照でもポインタでもお好きに
489z169.219-103-218.ppp.wakwak.ne.jp :2008/10/16(木) 23:24:50
boost::function + shared_ptr
490デフォルトの名無しさん:2008/10/16(木) 23:34:46
>>488ありがとうございました。
491デフォルトの名無しさん:2008/10/17(金) 18:24:43
std::map<int, int> *pmap = new std::map<int, int>();

int v = pmap[5];

と書くと
492デフォルトの名無しさん:2008/10/17(金) 18:27:04
なんと!
493デフォルトの名無しさん:2008/10/17(金) 18:38:11
コンパイルエラーが出ます
494デフォルトの名無しさん:2008/10/17(金) 18:42:42
ナンダッテー!
495デフォルトの名無しさん:2008/10/17(金) 18:46:50
>>491
少なくともstd::map<int, int> v = pmap[5]; だろ
それにpmap[0]にしか実体が存在してないのでpmap[5]には
何が入っているかわからない
496デフォルトの名無しさん:2008/10/17(金) 18:50:45
(*pmap+1)になってoperator[Key]が呼ばれないのね。ってことでふぁ。
497デフォルトの名無しさん:2008/10/17(金) 19:06:43
int v = (*pe1)[5];
498デフォルトの名無しさん:2008/10/18(土) 19:06:23
質問させてください。
std::stack<T, std::list<T> >にpushやpopするとき、
push/popされるTオブジェクト以外、
つまり既に格納されているTオブジェクトに対しては、コピーは発生しませんよね?
規格で保証されてますよね?
499デフォルトの名無しさん:2008/10/18(土) 19:27:19
>>498 はい。
500デフォルトの名無しさん:2008/10/18(土) 21:13:34
>>499
ありがとうございました。
これで安心してTに大きなオブジェクトを使用しようと思います。
501デフォルトの名無しさん:2008/10/18(土) 23:30:30
どなたか、お助け下さい。

char を wchar_t に変換する必要があったので、色々調べてみたのですが、よく分からない所があったので質問します。
char から wchar_t への変換には、mbstowcs() か Win32APIの MultiByteToWideChar() を使えばいいというのは分かったのですが、
mbstowcs を使うと問題が発生します。

c:\\ダミー\\dummy.file\0\0 のような double null-terminated な文字列を変換するとき、
mbstowcs だと最初の\0に到達した時点で関数が変換を止めてしまうようです。
(MultiByteToWideCharだと最後の\0\0も含めて変換してくれるようです)
いくつかの'\0'も含めてワイド文字列に変換するにはどうすれば良いのでしょうか?

携帯から書き込みしています。見にくかったらすみません。
502デフォルトの名無しさん:2008/10/18(土) 23:35:35
\0\0に出会うまでmbstowcsを何度も使えばいいかと
503デフォルトの名無しさん:2008/10/19(日) 00:12:57
STLはlambdaを早く導入してもらわんと使い物にならんな
504デフォルトの名無しさん:2008/10/19(日) 00:24:00
なわけないだろ
505デフォルトの名無しさん:2008/10/19(日) 00:31:51
>>501
予想だけどlocale
506デフォルトの名無しさん:2008/10/19(日) 00:32:25
そうだそうだ
コンセプトも欲しい。
507デフォルトの名無しさん:2008/10/19(日) 03:55:55
SHFileOperation でフォルダーが削除出来ない orz

c:\ダミー\ だとエラーがでるし
c:\ダミー だと削除は出来るがアクセスエラーがでるし

もう訳ワカメ ('A`)
508デフォルトの名無しさん:2008/10/19(日) 04:25:12
\0\0
509デフォルトの名無しさん:2008/10/19(日) 08:46:30
>>501
> mbstowcs だと最初の\0に到達した時点で関数が変換を止めてしまうようです。
仕様です
510デフォルトの名無しさん:2008/10/19(日) 10:18:07
>>507
削除できてんじゃん
つかスレ違いじゃね?
511483じゃないけど:2008/10/19(日) 10:48:46
>>484
string はbasic_string<T, Trait> の、特定のテンプレート引数による実体化になっており、Traitの部分で
「どの文字とどの文字が等価か」などが定義されている.また、これに基づいて辞書式順序も定義される.
場合によってはそれが邪魔になる.
512デフォルトの名無しさん:2008/10/19(日) 10:51:43
>>499
安心していいのかい?

stack<T> theStack;
theStack.push_back(new T());

でTのコンストラクタが例外を投げたときにどうやってリカバリする?
513512:2008/10/19(日) 10:52:38
>>512 は >>500 に対するレスね.
514デフォルトの名無しさん:2008/10/19(日) 11:15:21
stack<T>

new T()

push_backできへんやろ・・
515デフォルトの名無しさん:2008/10/19(日) 12:30:03
仮に *T or shared_ptr<T> だったとするなら、push_back と new という 2 つの操作を一文で行おうとするのが間違い。
516デフォルトの名無しさん:2008/10/19(日) 12:30:51
×*T
○T*
あと、stack のテンプレートパラメータがってことね。
517デフォルトの名無しさん:2008/10/19(日) 16:01:07
\0に到達した時点で関数が変換を止めてしまう

そりゃ文字列の終わりだから
長さを指定しないと永遠に続けることになる
518デフォルトの名無しさん:2008/10/19(日) 17:14:11
ストリーミング型配列を扱うクラスを作りたいと思っています。
struct Vector
{
float x, y;
Vector(){};
Vector(float _x, float _y)
{
x = _x; y = _y;
}
};
のようなクラスがあって、これの配列を
class VectorArray
{
float x[10];
float y[10];
};
のように定義してoperator[]を使って読み書き出来るようにしたいのですが、
読み出しだけだったら
Vector operator[](int n)
{
return Vector(x[n], y[n]);
}
で出来たのですが、
VectorArray[n] = Vector(0, 0);
のように書き込めるようにするにはどうしたらよいのでしょうか?
どなたか教えて下さい。
519デフォルトの名無しさん:2008/10/19(日) 17:29:47
>>518
戻り値を参照にすればいい筈…
Vector& operator[](int n)
{
return Vector(x[n], y[n]);
}
520デフォルトの名無しさん:2008/10/19(日) 17:38:22
>>518 質問と関係ないが
_(アンダースコア)で始まる変数名を使うのはよろしくないぜよ
標準ヘッダの定義と被っても文句は言えない
521デフォルトの名無しさん:2008/10/19(日) 17:39:49
大文字が続いてなければ、非グローバルスコープで使っても大丈夫。
条件を確認するのがメンドイから全部禁止と考えたほうが楽だけどね。
522デフォルトの名無しさん:2008/10/19(日) 17:40:30
>>519
デタラメ言うな

>>518
そのままだとトリッキーなことをしないとダメなので
VectorArrayの定義をVectorの配列にすれば簡単
class VectorArray {
Vector v[10];
};
Vector& operator[](int n) {
return v[n];
}
523デフォルトの名無しさん:2008/10/19(日) 17:42:11
const
524デフォルトの名無しさん:2008/10/19(日) 17:46:04
書いてる間に新着レスが
どうしてもVectorArrayを変更できない場合は
>>522のいうような「トリッキーなこと」をする必要がある。
たとえばこんな感じ
struct VectorProxy {
VectorArray*a_;
int n_;
VectorProxy(VectorArray*a,int n):a_(a),n_(n){}
operator Vector() const {
return Vector(a_->x[n_],a_->y[n_]);
}
VectorProxy& operator=(Vector const& v) {
a_->x[n_]=v.x; a_->y[n_]=v.y; return *this;
}
};
VectorProxy VectorArray::operator[](int n) {
return VectorProxy(this,n);
}
525デフォルトの名無しさん:2008/10/19(日) 18:06:10
>>521
2文字目が小文字(大文字とアンダースコア以外)ならOKなんだね
フォローありがと
526デフォルトの名無しさん:2008/10/19(日) 18:24:16
m_hoge ってのもだめなの?
527デフォルトの名無しさん:2008/10/19(日) 18:27:15
>>526 問題ない。 >525 は先頭がアンダースコアで始まる名前の話 (>520-521) だよ。
528518:2008/10/19(日) 19:30:21
>>522
あー、なるほど、そういう方法があるんですね。とても参考になりました。

御回答下さった皆様、どうもありがとうございました。
529デフォルトの名無しさん:2008/10/19(日) 20:05:39
>>514
すまん、完全寝ぼけてたw
530デフォルトの名無しさん:2008/10/19(日) 20:13:20
std::vector<T>::swapが例外を投げない保証はあるのでしょうか?
531デフォルトの名無しさん:2008/10/19(日) 22:17:46
Tに依存するところがないんじゃね?
532デフォルトの名無しさん:2008/10/19(日) 22:25:37
>>530
ISO/IEC14882 23.2.4 の段落 2 によれば、保証はない。

> class vector {
(中略)
> void swap(vector<T,Allocator>&);

と、例外指定がないことが示されている。
533デフォルトの名無しさん:2008/10/19(日) 23:01:52
T::operator = とかが例外投げたらそれがそのままくるだろうね
534デフォルトの名無しさん:2008/10/19(日) 23:05:31
それはswapの実装次第じゃね
535デフォルトの名無しさん:2008/10/19(日) 23:16:29
>>532
俺が見ているのはJIS X3014:2003なんだが、
23.1 コンテナに対する要件の10段落目の中にこう書いてある。

- コンテナの比較子オブジェクト(23.1.2参照)(もし存在すれば)の
コピーコンストラクタまたは代入演算子が送出する例外を除いて、
関数swapは例外を送出しない。
536デフォルトの名無しさん:2008/10/19(日) 23:50:54
>>535
例外を送出しないことを関数のシグネチャに含めてしまうと色々不便だから書いていないだけで
実際には例外を送出しないように規定されているわけか.
537デフォルトの名無しさん:2008/10/20(月) 00:06:35
>>535
なんか 23.2.4.3 の説明が変だね。
23.2.4 の段落 2 では
> // 23.2.4.3 modifiers:
(中略)
> void swap(vector<T, Allocator>&);
とあるのに、
23.2.4.3 には swap の説明がない。

>>531,533 が言っているようなことは当然考えられるし、比較子が swap にどう関係するのか説明がないのは変だろ。

しかも JIS に至っては、
23.2.4 の段落 2 で modifiers を修飾子と訳しているのに、
23.2.4.3 では変更子になっている。まあ、これは単語の誤訳でも別にいいんだが。

C++ Standard Library Active Issues List (Revision R60)
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html
でも、特に変更は見あたらないようだが、、、?
原文に説明があってこそ、初めて deffects になれるのかな。
538デフォルトの名無しさん:2008/10/20(月) 00:08:42
>>536
「〜を除いて、」とあるから、「〜」に該当する場合は例外を送出するとも読めるだろ
539デフォルトの名無しさん:2008/10/20(月) 00:15:35
vector は比較子オブジェクトを持ってないけどね
540デフォルトの名無しさん:2008/10/20(月) 00:19:18
>>537
swapについては表65-1 コンテナ要件1(PDFだと23.1の中)で説明済みってことなんだろ。
いちいち書いていたらページ数が膨れ上がって仕がない。

比較子については疑問だが、とりあえずvectorには関係ない
(それは23.1.2が連想コンテナという項目から明らか)ので今は無視しよう。
541デフォルトの名無しさん:2008/10/20(月) 00:44:55
それじゃあ少なくともTが組み込み型だと投げないわけか
542536:2008/10/20(月) 02:49:38
>>538
おっしゃるとおりです.
543デフォルトの名無しさん:2008/10/20(月) 03:04:35
絶対に例外を投げない関数には "throw ()" と書いて済ませる
(コメントで書かなくてもよくする)ことを考えてるんだけど、
↓で言われてるような効率の低下が実際に起こるコンパイラって知ってる?
http://www.boost.org/development/requirements.html#Exception-specification
> A "dumb" compiler, however, may make all kinds of pessimizations.
>
> For example, some compilers turn off inlining if there is an exception-specification.
> Some compilers add try/catch blocks.

そういうのは相当古いコンパイラだけと決め付けて切り捨てちゃおうかと思ってるん
だけど、大丈夫かな?
544デフォルトの名無しさん:2008/10/20(月) 08:38:44
throw()なら例外が起きないんだからオーバーヘッドは無いと信じたい
実際、throw()ならboostでも使われてるし
545デフォルトの名無しさん:2008/10/20(月) 11:40:02
>>544
"例外が起きない" じゃなくて、"例外がスローされてはならない" じゃなかったか?
例外がスローされた場合は、unexpected関数が呼び出されるはず
たぶん、それをするためのコードをベタ書きしちゃうのが A "dumb" compiler なんだろ
546デフォルトの名無しさん:2008/10/20(月) 15:42:43
今月からガソリン価格がTOCOM、WTI原油先物相場を迅速に反映させた売値になりました!
先週のWTI相場1バレル70−75ドルを換算し、円高という値下げ要因を加味すると
来週月曜(10月27日)からレギュラーガソリンが全国平均128円になる「はず」なのです!


          _____
  .ni 7    /        \
l^l | | l ,/.) / /・\  /・\ \    .n
', U ! レ' / |    ̄ ̄    ̄ ̄  |  l^l.| | /)
/    〈  |    (_人_)    |  | U レ'//)  値下げしないよ〜〜んw
     ヽっ     \   |    /   ノ    /
 /´ ̄ ̄ ノ     \_|    \rニ    |
                      `ヽ   l
          日清食品
          出光興産
          新日本石油
          山崎製パン

便乗値上げ四天王「日の出新山」
547デフォルトの名無しさん:2008/10/20(月) 18:46:40
Test::Func のポインタを static 変数の Test2::s_pFunc にセットして、
呼び出したいんですが、どうやってもコンパイルが通りません。

class Test
{
public:
void Func() { std::cout << "Func!" << std::endl; }
};

class Test2
{
public:
static void (Test::*s_pFunc)();
void (Test::*m_pFunc)();
};


int main()
{
Test obj;
Test2 obj2;

obj2.m_pFunc = &Test::Func; // OK
(obj.*(obj2.m_pFunc))(); // OK

Test2::s_pFunc = &Test::Func; // NG コンパイルエラー
(obj.*(Test2::s_pFunc))(); // NG コンパイルエラー
return 0;
}

よろしくおねがいします。
548デフォルトの名無しさん:2008/10/20(月) 19:05:41
>>547
error message くらい晒したらどうか
俺は通った
549デフォルトの名無しさん:2008/10/20(月) 19:14:34
俺はリンクエラーが出た
まあTest2::s_pFuncの実体が定義されてないから当たり前だけど
550デフォルトの名無しさん:2008/10/20(月) 19:42:49
すみません、コンパイルエラーではなく、リンクエラーの間違いでした。
おっしゃるとおり、実体がないのにリンク通るわけないですね。

class Test2
{
public:
static void (Test::*s_pFunc)();
};
void (Test::*Test2::s_pFunc)() = &Test::Func;

とすればよかったのですね。

失礼しました。
551デフォルトの名無しさん:2008/10/21(火) 04:32:37
標準やboostにstring<->wstringの変換を行う関数ってないんですか?
検索してみても、手間がかかる方法ばかりで、そのものズバリという方法が出てこない・・。
552デフォルトの名無しさん:2008/10/21(火) 05:13:49
>>551
そもそも「そのものズバリ」なんて方法が存在し得ない。
string に入っているデータの文字エンコードが euc なのか sjis なのかそれとも utf-8 なのかわからないんだから。
553デフォルトの名無しさん:2008/10/21(火) 05:14:07
だからboostと書いてるんじゃないのか
554デフォルトの名無しさん:2008/10/21(火) 05:33:39
>>553
意味がわからんぞ
boostだからどうだというんだ
555デフォルトの名無しさん:2008/10/21(火) 05:48:50
>>551
標準的には codecvt で提供してるつもりなんだろうけど、超メンドイよな。
結局 mbstowcs とか使って自作したことがある。

C++0x では codecvt が何とか使い物になりそうな感じ。
556デフォルトの名無しさん:2008/10/21(火) 06:00:52
漏れはMultiByteToWideCharでやってるわ
ATLならCA2Wとか
557551:2008/10/21(火) 06:08:06
レスthx

>>552
やはりないんですか。
標準にmbstowcs()とwcstombs()はあるんだから、それをラップした関数がstringにあってもよさそうに・・・。

>>555,556
やはりそのあたりの関数を使ってやるしかないんですね。
頻出の部分なのに、すっきりしないですねぇ。
558デフォルトの名無しさん:2008/10/21(火) 06:20:35
速度と汎用性ではMultiByteToWideChar
559デフォルトの名無しさん:2008/10/21(火) 06:22:18
これでやっている

int char2wchar(string x, wstring &y){
int m=x.size();
if(m<=0)return 0;
y.resize(m);
m=MultiByteToWideChar(CP_ACP, 0, &x[0], m, &y[0], m);
y.resize(m); y[m]=0; return 1;}

int wchar2char(wstring x, string &y){
int m=x.size();
if(m<=0)return 0;
y.resize(2*m);
m=WideCharToMultiByte(CP_ACP, 0, &x[0], m, &y[0], 2*m, NULL, NULL);
y.resize(m); y[m]=0; return 1;}
560デフォルトの名無しさん:2008/10/21(火) 08:31:46
MultiByteToWideChar に便乗。
今、SJIS → UTF8 に変換する必要があったんだけど、MultiByte 同士の変換 API ってない?
結局 MultiByteToWideChar と WideCharToMultiByte で、SJIS → Unicode → UTF8 と2段階で変換したけどなんか無駄なことしてる気がする
561デフォルトの名無しさん:2008/10/21(火) 09:31:57
テストに関して相談です。

システムコールとかのエラーのテストってどうやって起こしたりしてますか?
writeとかreadの際のエラー時のコードをどう実行させればいいのかが
よくわかりません。
どなたかわかる方いますか?
(テストフレームワークとしては、googletestを使っています)
562デフォルトの名無しさん:2008/10/21(火) 14:34:00
うごきません。 最後の行を動かしたいです。 どうやれば良いですか?

class ClassA { public: int m; } ;
template<ClassA &x> class ClassB { public: int n; };

int main(){
ClassA a;
ClassB< a > b;
}
563デフォルトの名無しさん:2008/10/21(火) 14:36:17
すみません。これでいいようです。

class ClassA { public: int m; } ;
class ClassB { public: int n; ClassB(ClassA x){} };

int main(){
ClassA a;
ClassB b(a);
}
564デフォルトの名無しさん:2008/10/21(火) 16:41:49
こんにちは。
gccを使用のC++初心者です。。
拙い質問、大変恐縮です。

とあるライブラリに
ClassName Instance = ClassName();
という表記がありました。

次の表記、
ClassName Instance = new ClassName();
との差異が解らないのですが、どなたか教えていただけますでしょうか?
565デフォルトの名無しさん:2008/10/21(火) 16:59:13
>>564
下はコンパイルエラーにならない?
566564:2008/10/21(火) 17:07:06
エラーになりました。
newはポインタを返し、上の例のようにインスタンスの実体(?)を指す変数にいきなり代入するときはnew不要ということなのでしょうか?
567デフォルトの名無しさん:2008/10/21(火) 17:22:59
いきなりというか、普通に代入してるだけ
ClassName Instance1();
ClassName Instance2 = Instance1;
と似たようなもの
568デフォルトの名無しさん:2008/10/21(火) 17:25:43
>>560
WindowsならConvertINetString (要IE 5.5)ってのがあるけど、
おそらくこれも中ではUTF-16を介している。
ほかのライブラリもみんな中ではUnicodeを介すのが一般的だと思う。
569デフォルトの名無しさん:2008/10/21(火) 17:40:37
>>566
上の書き方は一時的にオブジェクトを作る。それはその行が終わったら消える。
なのでその行でコピーするなりする。

newしたものはdeleteするまであり続ける。
どこにあるのかわからないと使えないからポインタを覚えておく。
570デフォルトの名無しさん:2008/10/21(火) 17:46:58
>>560
SJISとUnicode、つーかUTF-16 or UCS-2の変換は文字集合間、UTF-16からUTF-8への変換は表現形式の変換。
まあ、SJISからUTF-8に変換する変換テーブルとかも作れないことは無いが、メモリ無駄に食うだけだから普通はやらない
571デフォルトの名無しさん:2008/10/21(火) 18:03:22
ある画像からある画像をを引くプログラムってどう作りますか?
572デフォルトの名無しさん:2008/10/21(火) 18:08:47
>>571
「引く」ってどういう処理をイメージしてんの?
573デフォルトの名無しさん:2008/10/21(火) 18:15:57
>>572輝度温度を引く画像です。
それぞれ別々の輝度温度の画像(例えばR1、R2)があって
これをR1画像からR2の画像を引くような画像です
574デフォルトの名無しさん:2008/10/21(火) 18:20:56
画像を扱うにはどうしたらいいのか聞いてるのか?
575デフォルトの名無しさん:2008/10/21(火) 18:23:05
std::wstring hoge = L"文字列のようなもの。"
size_t dsize = 0, ssize = 0;
mbstowcs_s(&ssize, NULL, 0, hoge.c_str(), _TRUNCATE);
std::string buffer(ssize);
mbstowcs_s(&dsize, &buffer[0], ssize, hoge.c_str(), _TRUNCATE);
576デフォルトの名無しさん:2008/10/21(火) 18:27:34
>>573
なら普通に引き算すればいいんじゃ?
577デフォルトの名無しさん:2008/10/21(火) 18:34:06
>>575
文字列クラスのポインタに勝手に書き込んでもいいの?
578デフォルトの名無しさん:2008/10/21(火) 18:43:19
画像を読み込んで、引き算するようなプログラムかな?
579デフォルトの名無しさん:2008/10/21(火) 18:54:50
そうです
580デフォルトの名無しさん:2008/10/21(火) 18:56:33
画像を読み込むところから作るの?
581デフォルトの名無しさん:2008/10/21(火) 18:59:12
>>580 はい、それで引き算をしたいんです
582デフォルトの名無しさん:2008/10/21(火) 19:03:56
いやそれstringとwstringが逆だろ
583デフォルトの名無しさん:2008/10/21(火) 19:22:45

fatal error C1853: '.\../../../Build/Obj/MfColors/Debug/MfColors.pch'
プリコンパイル ヘッダー ファイルが旧バージョンのコンパイラで作成されています。
また、C++ のプリコンパイル済みヘッダー ファイルを C で使用しています
(その逆も考えられます)。

というエラーメッセージが出て、stdafx.hの行をさしています。

このエラーはいったいどうすれば解決できるのでしょうか。
584デフォルトの名無しさん:2008/10/21(火) 19:28:07
リビルド
あと、cとcpp混在してる?
585583:2008/10/21(火) 19:30:18
リビルドしても同じエラーがでてます。
cとcppは混在です。
extern "C"{}
は一応つかってます。
586デフォルトの名無しさん:2008/10/21(火) 19:39:18
VC++のプリコンパイルヘッダは、そこで言われているようにCとC++で共通利用できない。
言語をどっちかに統一するか、片方の言語でのみPCHを使うようにするかしないといけない。
587583:2008/10/21(火) 19:43:59
すいません、解決しました。
「プリコンパイル済みヘッダをインクルードする」という設定を
しないに変えたら動きました。
588デフォルトの名無しさん:2008/10/21(火) 19:47:20
>>567
> いきなりというか、普通に代入してるだけ
代入はしてないね

>>569
> >>566
> 上の書き方は一時的にオブジェクトを作る。それはその行が終わったら消える。
作らないね
589デフォルトの名無しさん:2008/10/21(火) 19:56:36
小室直樹の本を読んでるけど
投資をどんどんやれば景気は回復する。
あとプロテスタントの倫理と資本主義の精神を持たないといけないんだって。
(1)宗教的に働くことが重要で経営や労働自体に喜びを感じる。
(2)いくら儲けても貯金や消費しないで投資する。

資本主義の精神を持って投資にどんどんお金を使えば不況なんか絶対こないみたいだぞ。
簡単だね。
590デフォルトの名無しさん:2008/10/21(火) 21:39:20
>>567
> ClassName Instance1();

これだと、引数なしでClassNameを返す「関数」Instance1の宣言になる
591デフォルトの名無しさん:2008/10/21(火) 21:40:23
>>589
お前はまず就職しろ
592デフォルトの名無しさん:2008/10/21(火) 21:48:37
>>588
本来のセマンティクスでは「作る」
593デフォルトの名無しさん:2008/10/21(火) 22:28:38
>>592
規格で「作らないことを許されている」から、
「作る」と断言できないんじゃない?
594デフォルトの名無しさん:2008/10/21(火) 22:45:41
本来のセマンティクスでは、だろ?
ClassName()で、ClassNameのデフォルトコンストラクタで一時オブジェクトを作る
その一時オブジェクトを引数にとったコピーコンストラクタでInstanceを作る
コードはそういう意味のはず

そのように見せかけるだけで、実際にはオブジェクト作らないように
コンパイラが裏で細工しても良いってのはまた別の話
595593:2008/10/21(火) 22:54:05
>>594
それって単に見た目上の意味じゃん。
規格を考慮した上でコードの意味を考えれば、
「作る」と言えないんじゃないかって言いたかった。

ま、単なる言葉の行き違いな気もするが。

596デフォルトの名無しさん:2008/10/21(火) 23:01:48
>>595
本当か? 本来のセマンティクスとある処理系での実行結果がなぜ違うか認識していたか?
597デフォルトの名無しさん:2008/10/21(火) 23:17:44
とりあえずClassNameのデフォルトコンストラクタ、コピーコンストラクタ、デストラクタの
どれかをユーザー定義してた場合は一時オブジェクトの生成は省略出来ない
全部なければコンパイラが省略してくれるかもしれないってだけ

ClassNameの詳細が不明なら、一時オブジェクト作ると思っといた方がいいね
598593:2008/10/21(火) 23:19:07
>>596
ごめん、何が言いたいのかさっぱりわからん。

まず、「本来のセマンティクス」ってのがオレの主張する方と
594が主張してる方のどっちが正しいのかもはっきりしていないじゃん。
599デフォルトの名無しさん:2008/10/21(火) 23:28:07
セマンティクスという言葉は普通お前が言ってるような意味では使わない
コードのセマンティクスというのはコンパイラの吐くバイトコードとは別に存在するもの
600デフォルトの名無しさん:2008/10/21(火) 23:33:16
>>598
俺の言う「本来」はおおむね >>594 が段落1で言ってくれた
601593:2008/10/21(火) 23:35:03
>>599
わかった。

規格の12.2で、「一時オブジェクトの生成が避けられる場合であっても、
すべての意味規則上の制約は、一時オブジェクトが生成されたかのように
遵守しなければならない」とあるから、確かに594が正しいね。
602593:2008/10/22(水) 00:08:38
>>597
規格の12.8.15を読んだ限り、デフォルトコンストラクタはともかく、
コピーコンストラクタ、デストラクタは関係ないみたいだけど
603デフォルトの名無しさん:2008/10/22(水) 11:39:43
>581
opencv,cvSub
604デフォルトの名無しさん:2008/10/23(木) 13:06:58
ここって実際仕事でC++使ってる人とかいるのか?
605デフォルトの名無しさん:2008/10/23(木) 13:17:35
ノシ
606デフォルトの名無しさん:2008/10/23(木) 13:59:57
サボってないで仕事しろ
607デフォルトの名無しさん:2008/10/23(木) 19:14:27
今は使ってないな
たぶん来年のプロジェクトでMFCやると思う
608デフォルトの名無しさん:2008/10/23(木) 21:04:26
ご愁傷さまです。
609デフォルトの名無しさん:2008/10/24(金) 14:26:53
いきなりの質問で申し訳ありません。
C++を勉強中の者です。

関数テンプレートを関数ポインタを経由して呼び出したいのですが
そういったことはできるのでしょうか?
また、どのように書けばよろしいのでしょうか?

参考になるページなどありましたら教えて頂ければありがたいです。
610デフォルトの名無しさん:2008/10/24(金) 14:29:26
>>609
できるよ。テンプレートじゃない時とだいたいいっしょだけど、テンプレート引数を
明示的に示す必要があるかもしれない。
611デフォルトの名無しさん:2008/10/24(金) 16:54:02
c++の開発環境をemacsで作ってるかた
どんな環境なのかおおしえいただけないでしょうか?
参考にしたいです
612デフォルトの名無しさん:2008/10/24(金) 19:43:30
>>610
ありがとうございます。やってみます。
613デフォルトの名無しさん:2008/10/24(金) 22:25:15
>>611
c++-mode
614デフォルトの名無しさん:2008/10/25(土) 18:29:28
>>611
kterm + emacs -nw
または
TeraTermPro + emacs -nw
615デフォルトの名無しさん:2008/10/27(月) 13:57:03
(1) MyClass myobj;
MyClass *pObj = &myobj;
(2) MyClass *pObj = new MyClass();

上の2つなんですが何か違いはあるんでしょうか?オブジェクとが確保されるメモリ領域など違いはありますか?
616デフォルトの名無しさん:2008/10/27(月) 13:59:57
全然違う
MyClass myobj はどこに作ってんのかな?
617デフォルトの名無しさん:2008/10/27(月) 14:02:46
違う
(1)だとスコープ抜けたら消える
後スタックかヒープかも違う
618デフォルトの名無しさん:2008/10/27(月) 14:03:18
かぶったぁあああ
619デフォルトの名無しさん:2008/10/27(月) 14:05:31
両方ともローカル関数内です。
(1)はスタックに作られるから関数ぬけたらdeleteしなくても消滅
(2)はヒープに作られるから自分でdeleteしないと残る
という理解であってますか?
620デフォルトの名無しさん:2008/10/27(月) 16:14:53
>>619
概ね合っている。
621デフォルトの名無しさん:2008/10/27(月) 17:19:30
「スタック」に作られるといのは
実装依存なんだっけ?
まあふつう話は通じると思うけど
622デフォルトの名無しさん:2008/10/27(月) 18:03:35
MyClass *pObj = new MyClass();
を自動deleteに出来ないんですか?
623デフォルトの名無しさん:2008/10/27(月) 18:08:56
自動って何かdeleteするタイミングが自動でとれるのかい?
624デフォルトの名無しさん:2008/10/27(月) 18:17:53
>>623
そこをうまくやるの技術者PGで、出来ないのがドカタPGでしょ
625デフォルトの名無しさん:2008/10/27(月) 18:21:15
そうじゃなくて自動でとれるなら可能だし、取れないなら不可能
626デフォルトの名無しさん:2008/10/27(月) 18:22:01
(1)と(2)ってふつうはどっち使うといいの?
どう使い分ければよい?
627デフォルトの名無しさん:2008/10/27(月) 18:24:44
スコープを抜けたときに勝手にdeleteしてほしい場合は(1)
スコープを抜けたときに勝手にdeleteされて困る場合は(2)
628デフォルトの名無しさん:2008/10/27(月) 18:25:02
普通は考えるまでもない、必要なほうに決まる。
自動じゃ無理な時だけnewしたらいいと思うよ。
629デフォルトの名無しさん:2008/10/27(月) 18:27:19
>>622
スマートポインタに入れる。
通常はstd::auto_ptr、コンテナに入れたりコピーしたり
する時はstd::tr1::shared_ptr
630デフォルトの名無しさん:2008/10/27(月) 18:27:23
>>625
自動でとれるようにするのが技術者PG、できないのがドカタPGでしょ
631デフォルトの名無しさん:2008/10/27(月) 18:31:32
いやだから、その自動ってやつの定義がいるだろう。
・・もしかして、質問者はスコープ抜けたらというタイミングしか想定してないのかな?
ウィンドウが破棄されたら、とか例があるからそういう自動を連想してしまった。
632デフォルトの名無しさん:2008/10/27(月) 18:32:04
>>622
std::auto_ptr や boost::shared_ptr じゃダメか?
633デフォルトの名無しさん:2008/10/27(月) 18:32:47
>>624=630は典型的なドカタ
634632:2008/10/27(月) 18:33:58
見なかったことにしてくれ
635デフォルトの名無しさん:2008/10/27(月) 18:41:05
>>629, >>632
どうも、どうも
どう使うのかは分からないですけど
やっぱ、自動deleteを実現する機能ってあるんですね
636デフォルトの名無しさん:2008/10/27(月) 18:48:51
自分でプログラム書くんですから
自動でとれるよう(開放忘れがないように)に工夫するしないんですか
637デフォルトの名無しさん:2008/10/27(月) 19:32:26
スルーしないよ
638デフォルトの名無しさん:2008/10/27(月) 19:39:19
>>627
>>628
速度的にはどうなんですか?たとえば、
(A) vector<MyClass> myobj;と
(B) vector<MyClass*> myobj;
はどっちの方がよいとかあります?
(A)形式でオブジェクトをそのまま格納するより(B)のようにnewで作ったポインタを格納した方がいいって聞いたのですが
639デフォルトの名無しさん:2008/10/27(月) 19:39:50
(A) vector<MyClass> myvector;
(B) vector<MyClass*> myvector;
のまちがえでした
640デフォルトの名無しさん:2008/10/27(月) 19:41:57
いやその例の変数名はどうでもいいだろうw
641デフォルトの名無しさん:2008/10/27(月) 20:09:30
>>638
MyClassとMyClass*のどっちの方がコピーに時間がかかるかっていう話。
クラスのコピーコンストラクタが単純なメンバのコピーであったとしても、ほとんどの場合、クラスのサイズはポインタ1個分より大きいためBの方が速い。
但し、Bの場合myobjからeraseしたりclearしたり、あるいはmyobjの寿命が切れたりしただけではポインタはdeleteされないので注意。
642デフォルトの名無しさん:2008/10/27(月) 20:21:07
テンプレートの中に、テンプレートが入ってるプログラムなのですが、
これはどういうふうに理解すればよいでしょうか?

template <class DataType,
     template <class DataType> class Buffer = RingBuffer >
class InPort
 : public Buffer<DataType>
{
     :

よろしくお願いします。
643デフォルトの名無しさん:2008/10/27(月) 20:26:37
>>641
みなさんアドバイスありがとうございます。

ある人にチューニングしてもらったら(A)を(B)に書き換えられていて何でだろと思ったので調べていました。そのような理由があったんですね。(B)ではちゃんとデストラクタ作ってdeleteされてました。

C++はいろいろ知らないといいコードかけないと痛感orz
644デフォルトの名無しさん:2008/10/27(月) 20:38:16
boost::ptr_vector 使おうぜ
645デフォルトの名無しさん:2008/10/27(月) 20:45:41
MyClassがポインタを持たないなら、(A)のほうが速いぞ
メモリが一箇所になるからな
646642:2008/10/27(月) 21:27:16
どなたか教えてください。
ぐぐってもそれらしい物が見つかりません。
647デフォルトの名無しさん:2008/10/27(月) 21:29:10
@独自の形式の画像を表示するためのビューワを作る
Aエクスプローラで縮小版にするとサムネイル表示される(ダブルクリックでビューワが起動する)

今やりたいことなんですが、
Aの設定方法と
Aをするためには@のビューワ作成時にしないといけない約束事みたいなのはあるんでしょうか?

開発環境はVC++6.0です。
648デフォルトの名無しさん:2008/10/27(月) 21:44:40
>>642
InPortはテンプレート引数を2つ取る。
第一引数(DataType)は見ての通り。
第二引数(Buffer)は、テンプレート引数を1つ取るクラステンプレートで、デフォルト引数としてRingBufferクラスが指定されている。
そして、Bufferのテンプレート引数にDataTypeを渡して実体化した型を継承している。

template <class T> class Hoge { ... };
InPort<int> x;//1
InPort<int, Hoge> y;//2
1と2どちらの使い方もできる。
649デフォルトの名無しさん:2008/10/27(月) 21:50:37
648さん

ありがとうございます。
全く理解出来なくて、困っていました
650デフォルトの名無しさん:2008/10/28(火) 20:24:37
(A) vector<MyClass> myvector;
(B) vector<MyClass*> myvector;

Bを選んだときに必ずnewでインスタンス化しないといけないわけではないよ。

newする場合は、そうでない場合に比べて時間がかかりがちだから、
Bにする場合でもnewしなくてすめばその方がいいと思うよ。
deleteでトラブりやすいし。

MyClass m;
vector<MyClass*> myvector;
myvector.push_back(&m);
651デフォルトの名無しさん:2008/10/28(火) 20:29:11
>>650
そのpush_back()で何が格納されるのかよーく考えてくれ。
652デフォルトの名無しさん:2008/10/28(火) 20:29:55
つーか、ここまで馬鹿だといっそ清清しいな。
653650:2008/10/28(火) 20:35:20
>>651
何が変?
654デフォルトの名無しさん:2008/10/28(火) 20:45:26
それってvector使う意味あるのか?
655デフォルトの名無しさん:2008/10/28(火) 20:51:23
>>650
boost::ptr_vector使えばdelete不要
656デフォルトの名無しさん:2008/10/28(火) 21:14:18
>>654
650 じゃないけど、例えば vector< MyClass > のリストに対するループ処理
があるとして、その中で失敗した要素のポインタを vector< MyClass* > に蓄
積し、失敗データリストを一括処理、とか。
推奨はしないけど、実際に仕事でこういう処理を書いた事がある。
657デフォルトの名無しさん:2008/10/28(火) 21:51:10
>>650
はMyClass m;がローカルだったらスコープぬけたら消滅しちゃうってこと?newで作れば消滅しないけど。
658デフォルトの名無しさん:2008/10/28(火) 21:53:31
myvectorのスコープから言って問題ないじゃん
659デフォルトの名無しさん:2008/10/28(火) 21:56:33
ローカル変数のポインタをvectorに追加することに意味があるかどうかが問題だ。
newを使わない限り、一定個数のオブジェクトしか扱えないのだからオブジェクト配列の一つもあれば充分だろう。
660デフォルトの名無しさん:2008/10/28(火) 21:58:03
>>656
それはそれで途中でうっかり削除や追加をすると怖いことになりそうだな
661デフォルトの名無しさん:2008/10/29(水) 00:29:20
純粋に所有権なしのpointerのvectorっていくらでも使う機会はあると思うが
662デフォルトの名無しさん:2008/10/29(水) 00:38:52
そりゃそうだけど、>>650の話は受け入れられない。
663デフォルトの名無しさん:2008/10/29(水) 12:24:37
すでに&演算子がオーバーロードされているクラスのオブジェクトに対してアドレスを出したい時はどうすればいいんでしょうか?
struct Hoge{
 int i;
 int* operator&(){return &i;}
};

Hoge hoge;
Hoge* foo=&hoge;
664デフォルトの名無しさん:2008/10/29(水) 12:33:37
::
665デフォルトの名無しさん:2008/10/29(水) 12:36:51
::operator&ですか?何度もやってるんですがどう表記するのが正解なんでしょうか
666デフォルトの名無しさん:2008/10/29(水) 12:54:51
Hoge.::operator & (); とかじゃない?
667デフォルトの名無しさん:2008/10/29(水) 13:10:05
だめですた
668デフォルトの名無しさん:2008/10/29(水) 13:10:52
>>663
boost::addressofでできるよ
なにをやってるかはソースコードをよめばわかる
669デフォルトの名無しさん:2008/10/29(水) 15:17:38
流れ豚切るが質問させてくれ。今、2次元ウェーブレット変換を作ってるんだが、参考書やらググル先生に聞いたら2回転置してるんだ。
転置無しでやろうとしたら結果が真っ黒(=0.0ばっか)で…。多分配列の参照がおかしいんだが、自分で見直してみても判らんので見てもらえないだろうか。
int dwt2d(double *s0, unsigned int H, unsigned int W, const double *p, const double *q, unsigned int sup, double *s1[4])
{
// s0:入力(2次元画像の先頭ポインタ) W, H:幅と高さ p, q:係数配列 sup:係数配列の長さ s1:結果格納先(外部でメモリ確保済み)
// 作業領域確保
unsigned int Size = W * H / 2;
double *tmp[2] = {new double[Size], new double[Size]};
double *ptr[2] = {tmp[0], tmp[1]};
// X軸方向のdwt
for(unsigned int lp = 0;lp < H;lp++){
dwt1d(s0 + lp * W, W, p, q, sup, ptr);
ptr[0] += W / 2;
ptr[1] += W / 2;
}

// Y軸方向のdwt
double *tmp2[4] = {s1[0], s1[2], s1[1], s1[3]};
for(unsigned int lp = 0;lp < W / 2;lp++){
dwt1dt(tmp[0] + lp, H, W / 2, p, q, sup, tmp2);
dwt1dt(tmp[1] + lp, H, W / 2, p, q, sup, tmp2 + 2);
tmp2[0]++;  tmp2[1]++; tmp2[2]++; tmp2[3]++;
}

// 作業領域解放
// #define SAFE_DELETEC(p) if(p){delete[](p);(p) = NULL;}
SAFE_DELETEC(tmp[0]);
SAFE_DELETEC(tmp[1]);

return 0;
}
続く…
670669:2008/10/29(水) 15:20:30
続き
// 一次元ウェーブレット変換
int dwt1d(double *s0, unsigned int len, const double *p, const double *q, unsigned int sup, double *s1[2])
{
// 1d dwt
for(unsigned int k = 0;k < len >> 1;k++){
s1[0][k] = 0.0; s1[1][k] = 0.0;
unsigned int t = k << 1;
for(unsigned int n = 0;n < sup;n++){
unsigned int index = (n + t) % len;
s1[0][k] += p[n] * s0[index];
s1[1][k] += q[n] * s0[index];
}
}
return 0;
}
// Y軸方向ウェーブレット変換
int dwt1dt(double *s0, unsigned int len, unsigned int step, const double *p, const double *q, unsigned int sup, double *s1[2])
{
// step:画像の1ラインの長さ
for(unsigned int k = 0;k < len >> 1;k++){
s1[0][k] = 0.0; s1[1][k] = 0.0;
unsigned int t = k << 1;
for(unsigned int n = 0;n < sup;n++){
unsigned int index = (n + t) % len; // ここあたりが怪しい?
s1[0][k * step] += p[n] * s0[index * step];
s1[1][k * step] += q[n] * s0[index * step];
}
}
return 0;
}
671デフォルトの名無しさん:2008/10/29(水) 15:54:12
>>670
怪しい辺りで変数の値でも追跡してみればいいじゃない。
見て判らなければ動かすのが今のプログラミング。
672デフォルトの名無しさん:2008/10/29(水) 17:55:37
Exceptional C++って本が評判良いようなので、買ってみましたが
newのエラーチェックは必要ないとかとんでもないことが書いてあったので本棚の奥に片づけました

で、タイトルよく見るとExceptional C++ Styleだったので偽物掴まされたのかと思ったんですが
書いてる人同じなんですね

Styleの方はダメ本ですが、Exceptional C++ってのは大丈夫なんですか?
673デフォルトの名無しさん:2008/10/29(水) 18:13:45
>newのエラーチェックは必要ないとかとんでもないことが書いてあったので本棚の奥に片づけました
お前がとんでもない。
674デフォルトの名無しさん:2008/10/29(水) 19:36:58
>>672
int* p = new int;
if (p == 0) ←これが要らないっていう話?
675デフォルトの名無しさん:2008/10/29(水) 19:39:00
なぜいらないのかも、なぜ使われていたかも両方説明されてたと思うんだけどな
676デフォルトの名無しさん:2008/10/29(水) 19:40:29
627は本をちゃんと読めない子なんですね
677デフォルトの名無しさん:2008/10/29(水) 19:41:44
>>674
いいや
bad_allocを捕まえることもnew(nothrow)をヌルチェックすることも意味がないと書いてある
メモリは遅延確保するからnewは常に成功するとか書いてる
ひどすぎる
678デフォルトの名無しさん:2008/10/29(水) 19:42:23
676は数字をちゃんと読めない子なんですね
679デフォルトの名無しさん:2008/10/29(水) 19:44:01
>>677
それは Linux を含む一部の環境では実際正しい。
というか、malloc じゃなくて new でその説明があった?
680デフォルトの名無しさん:2008/10/29(水) 19:46:49
>>679
C++の本だもん、もちろんnewの話ですよ
でも滅多に起こらないとしても、環境によっては絶対に起こらないとしても、
それでもやるのがエラーチェックでしょう?

著者の姿勢に疑問を感じざるを得ないです
681デフォルトの名無しさん:2008/10/29(水) 20:07:24
>>677
参考までにどこのページ?
682デフォルトの名無しさん:2008/10/29(水) 21:05:17
>>680
それは哲学の問題であって、プログラミングの問題ではないよ。
683デフォルトの名無しさん:2008/10/29(水) 21:11:50
>>681
気になったので、手元の本で調べたら p.177 辺りの話のようだ。
久しぶりに読んでみたが、個人的には、真っ当な事が書かれてると感じた。
ところで new に失敗した時、一体どんな処理をするのだろうか?
メモリ枯渇が原因だとして、そんな環境で打つ手があるのか。
684デフォルトの名無しさん:2008/10/29(水) 21:24:57
>>683
他(ユーザーのデータやシステム)に致命的被害を及ぼしたりしないように安全に終了する。
可能であれば、自分が扱っているデータも安全に保存した上で。
685デフォルトの名無しさん:2008/10/29(水) 21:27:59
予め余計に確保しておいてそっちを使うとか
686デフォルトの名無しさん:2008/10/29(水) 21:46:59
>>684
それは普通に組んでれば例外がさかのぼる途中で実現される気がする

newで失敗したときにいろいろしたければnew_handlerでやればいいし、正直bad_allocが投げられたらオワリなんじゃ?
687デフォルトの名無しさん:2008/10/29(水) 21:55:45
その前のページ(p.176)に「エラーチェックしないなんてとんでもないこと書いてる」っていう人も居るとは思うがってわざわざ書いてるじゃん。

ちなみにその章の Summary の訳。

>nothrow new の使用は避けること。通常の例外を送出する new と比べて、最近では意味のある利点がないこと、
>また大抵はより悪い失敗時の特徴を持つからである。
>
>いつくかの理由から、とにかく new の失敗をチェックしようというのはあまり利点がないということは覚えておくべきである。
>
>メモリの枯渇について正当な懸念があるなら、チェックしていると考えているものがチェックできているか気をつけよう。
> - メモリが使用されるまでメモリ確保しないシステムでは、new の失敗をチェックすることは大抵役に立たない。
> - 仮想メモリシステムでは、new の失敗に遭遇することはまれか全くない。なぜなら仮想メモリが枯渇する遥か以前の
> 時点で、大抵スラッシングが発生し管理者がプロセスを kill し始めるからである。
> - 特別な場合を除いて、new の失敗を検出した場合でも、本当にメモリが残されていないなら、できることは多くはない。
688デフォルトの名無しさん:2008/10/29(水) 22:01:25
とある官庁向けのシステムで、メモリ不足のときにご丁寧にダイアログでメッセージを出すプログラムを書いてきた
シナ系ソフトハウスがあった。実際にメモリ不足の状況を作ってやったら、ダイアログを出そうとする行為自体が
メモリ確保エラーを起こすらしくて画面を埋め尽くす勢いでダイアログが開いていき、メモリスワップに突入。
メモリ不足の状況を解除してからダイアログの増殖が止まるまでに20分掛かったのはいい思い出w

教訓。実際にメモリ不足の状況に陥ったら、できることは高が知れている。
689デフォルトの名無しさん:2008/10/29(水) 22:08:37
やらない方がマシだとは思うが終了処理とかのために予め5MB位最初に確保しておき
メモリ不足になったら開放してメモリをあけるみたいなテクニックを聞いたことがある。
690デフォルトの名無しさん:2008/10/29(水) 22:13:05
メモリもだが、ファイルディスクリプタ枯渇も面倒
エラーログはこうとしてファイルをオープンしようとするが失敗
そのエラーのログをさらにはこうとして…(以外同文
691デフォルトの名無しさん:2008/10/29(水) 22:33:43
エラーログ出力のエラーログ出力をするヴァカがここにもまた一人
692デフォルトの名無しさん:2008/10/29(水) 22:33:47
>>688
俺も、実際に似たような事例に遭遇したので、>>683 を書いた。
エラーチェックは良い事だが、その実効性を検証しないと意味がないし、メモリ確保の問
題は OS が深く絡むので、OS がするより良い対応をアプリケーションで行うのは非常に難
しく、副作用の方が心配になる。
もし大量のメモリ確保が心配なら、API で空きメモリ量を得て、new する前に妥当性チ
ェックする方が真っ当だと思うし ( チェック直後に枯渇した場合は事故とする )。
693デフォルトの名無しさん:2008/10/30(木) 01:36:37
xxx* p = new xxx;
if (p == 0) {*}←これ

実際に、これが実行された経験ある奴いるの?
1Tバイトぐらいのメモリよこせと言えば実行さるるのかな
694デフォルトの名無しさん:2008/10/30(木) 01:39:39
>>693
まともな処理系なら、bad_allocが飛ぶので、絶対に実行されることはない。
695デフォルトの名無しさん:2008/10/30(木) 01:50:46
賢い処理系なら最適化として if を丸ごと削除してもいいだろう。
696デフォルトの名無しさん:2008/10/30(木) 07:09:37
operator new が定義されている場合を誰も考慮しねえのな、このスレ
697デフォルトの名無しさん:2008/10/30(木) 07:12:35
定義されてたら何だってんだ?
メモリ確保とは全く別の目的に使うような病的な場合を除いて
組み込みのnewと同じ議論が全部当てはまると思うけど
698デフォルトの名無しさん:2008/10/30(木) 08:45:02
>>672にしろ>>696にしろ、
大勢の人間や高名な人間を下に見ることが可能な素晴らしい閃きが
急に自分の頭に訪れたような気がしたら、
意気揚々とそれを書き込む前に疑ってみたほうがいいと思うんだ。

「いやいや待てよ、馬鹿な俺がこんなことをこんな簡単に見出せるはずがない」

って。
699デフォルトの名無しさん:2008/10/30(木) 09:15:53
何でこんな簡単なことだれも思いつかないしやらないんだ?www
俺SUGEEEEEEEEEEwwwwwww

と思ってやってみたら出来ないことはよくあるよな…
700デフォルトの名無しさん:2008/10/30(木) 09:26:05
それはお前だけ
701デフォルトの名無しさん:2008/10/30(木) 09:40:00
>>672
>Styleの方はダメ本ですが、Exceptional C++ってのは大丈夫なんですか?

安心しろ、大丈夫じゃないのは君の理解力のほうだ.

#もうちょっと基礎的なところから勉強しなおしましょう.
702デフォルトの名無しさん:2008/10/30(木) 09:46:23
>>683
>ところで new に失敗した時、一体どんな処理をするのだろうか?
>メモリ枯渇が原因だとして、そんな環境で打つ手があるのか。
枯渇じゃなくて確保失敗することもあるだろ・・
ねえ、馬鹿なの?
703デフォルトの名無しさん:2008/10/30(木) 09:49:53
>>702
>枯渇じゃなくて確保失敗することもあるだろ・・
kwsk
704デフォルトの名無しさん:2008/10/30(木) 09:59:55
石油資源はまだまだ埋蔵されてるのに原油高で調達できないみたいな
705デフォルトの名無しさん:2008/10/30(木) 10:10:13
shobjidl.hをインクルードしてビルドすると
c:\program files\microsoft platform sdk\include\shtypes.h(102) : error C2011: '_SHITEMID' : 'struct' で
示される型としてすでに定義されています。
c:\program files\microsoft platform sdk\include\shtypes.h(120) : error C2011: '_ITEMIDLIST' : 'struct'
で示される型としてすでに定義されています。

c:\program files\microsoft platform sdk\include\shobjidl.h(1159) : error C2011: 'IEnumIDList' :
'struct' で示される型としてすでに定義されています。
c:\program files\microsoft platform sdk\include\shobjidl.h(1312) : error C2011: 'tagSHGDN' : 'enum' で
示される型としてすでに定義されています。
c:\program files\microsoft platform sdk\include\shobjidl.h(1322) : error C2011: 'tagSHCONTF' : 'enum'
で示される型としてすでに定義されています。
c:\program files\microsoft platform sdk\include\shobjidl.h(1331) : error C2371: 'SHCONTF' : 再定義され
ています。異なる基本型です。

Sample.dll - エラー 175、警告 19
のようなエラーが延々と出るので、サイトで調べたところ
#define NO_WIN32_LEAN_AND_MEAN
#include <shobjidl.h>
とすることで、解決できるみたいなんですが、まだ全く同じエラーが出てしまいます。
プロジェクトオプションに
/D "NO_WIN32_LEAN_AND_MEAN"
を追加しても同じです。
原因わかる方いましたら教えてください。
Windows XP Pro SP3
VC++6.0
Platform SDK Server 2003 SP1
706デフォルトの名無しさん:2008/10/30(木) 10:18:11
>>682
ねえよww
おまえはクライアントに
「エラーは処理しません、手抜きじゃなくて哲学なんです」
って説明するのか?
707デフォルトの名無しさん:2008/10/30(木) 10:19:59
>>697
むしろ定義されてても同じ議論がなりたたないとダメのような…

別にnew_handlerやbad_allocを使うか否かは定義する人の自由だけどさ。
708デフォルトの名無しさん:2008/10/30(木) 10:20:27
return文の後ろにコード書くようなもんだ。
709デフォルトの名無しさん:2008/10/30(木) 10:21:03
returnが失敗した時用のエラー処理だなw
710デフォルトの名無しさん:2008/10/30(木) 12:10:10
retrun (0);
711デフォルトの名無しさん:2008/10/30(木) 12:20:34
括弧はいらね
712デフォルトの名無しさん:2008/10/30(木) 12:45:31
#define return(x)
713デフォルトの名無しさん:2008/10/30(木) 13:32:38
retrun(0);

戻りつつ走るという高尚な関数呼び出しだ。
714デフォルトの名無しさん:2008/10/30(木) 13:42:41
retrun (0 + 0) / 0;
715デフォルトの名無しさん:2008/10/30(木) 13:47:47
#define retrun return
716デフォルトの名無しさん:2008/10/30(木) 21:22:26
#define elif(x) else if(x)
717デフォルトの名無しさん:2008/10/30(木) 21:23:19
file: "studio.h"
----
#include <stdio.h>
----
718デフォルトの名無しさん:2008/10/30(木) 21:28:18
>>702
あのさ、ここまでの流れ読めてる?
719デフォルトの名無しさん:2008/10/30(木) 21:31:48
すいません、>>702を見て気になったんですが
メモリが足りない以外に失敗とはどんな場合なのでしょうか?
720デフォルトの名無しさん:2008/10/30(木) 21:39:56
超断片化したとか?それも一種の枯渇と言えなくもないし・・

ハードやアロケータによっては一回に確保できるサイズに制限があったりするかもしれない?
721デフォルトの名無しさん:2008/10/30(木) 21:40:50
>>697
つまり、定義する必要性がある状況だ
722デフォルトの名無しさん:2008/10/30(木) 21:57:20
>>719
心配になるぐらいでかいサイズを確保するなら、前もって足りるか調べるのが
定石なんじゃないかね。たとえばオンメモリでの画像処理とか。
その場合でもでかいバッファをいきなり作るんではなくて、常識的なサイズで
小分けにするだろうから、そういう意味でも考えなくていい状態だろ。
bad_alloc や NULL チェックする派の人って STL コンテナとかのメモリ確保失
敗も対処するんだろか。vector v(100) みたいなコードも try ブロックに入れな
きゃならないとしたら、無理すぎんだろ。
723デフォルトの名無しさん:2008/10/30(木) 22:30:26
mainでキャッチしかしません
724デフォルトの名無しさん:2008/10/30(木) 23:23:41
>>705
既に precompile header に入ってるのでは
725デフォルトの名無しさん:2008/10/31(金) 00:03:41
>>719
確実にnewが失敗すると思われるのは、アドレス空間が不足するケース。
32bit OSだったらアドレス空間は全体で4GBで、さらにユーザ空間で使えるのはその一部なので、
4GB近くのメモリ確保を行ったら連続したアドレスが確保できずbad_allocが飛ぶ(メモリを4GB以上積んでてもダメ)。
726デフォルトの名無しさん:2008/10/31(金) 00:08:11
_beginthreadexで作ったスレッドを別のスレッドから終了させるにはどうしたら良いんでしょうか?
727デフォルトの名無しさん:2008/10/31(金) 00:10:41
>>726
Win32系のスレへ逝け、ボケ!
TerminateThread();
728デフォルトの名無しさん:2008/10/31(金) 00:14:27
>>726
つ _endthreadex()
729デフォルトの名無しさん:2008/10/31(金) 00:25:07
>>722
int main(int ac, char** av)
{
try{
}
catch( ry
730デフォルトの名無しさん:2008/10/31(金) 00:29:20
visual c++でプログラミングをはじめたのですが、
1.25*1.25*1.25などの小数点の掛け算を行うと四捨五入されます。
四捨五入をさせない方法はありますか?
731デフォルトの名無しさん:2008/10/31(金) 00:30:52
>>730
表示の桁を増やしたいのか?
setwとか%10f とかじゃね
732730:2008/10/31(金) 01:54:36
小数点を含んでいて6ケタ以上だと四捨五入されるみたいです。
setwはうまくいきませんでした。
なぜだ…
733デフォルトの名無しさん:2008/10/31(金) 02:06:10
丸め誤差でぐぐれ

その計算の場合は
5*5*5/4.0/4/4とかにした方がいい
734デフォルトの名無しさん:2008/10/31(金) 02:11:31
小数や割り算は、C++で奇麗な記述が出来ると思わない方がいい
735デフォルトの名無しさん:2008/10/31(金) 02:12:36
>>731-732
setwではなくsetprecision
%10fではなく%.10f
736730:2008/10/31(金) 03:39:29
<<733
ぐぐってみました…そういうことなのね。
やはり回避するようなプログラミングをしなくてはいけないのですね。
<<734
わかりました。
737デフォルトの名無しさん:2008/10/31(金) 03:53:29
>>736

アンカーはこう書きます
738730:2008/10/31(金) 03:59:38
>>736
慌てていたとはいえ…
欝だ
739デフォルトの名無しさん:2008/10/31(金) 06:37:03
よく見るアホの典型
正解レスのみスルーする
740デフォルトの名無しさん:2008/10/31(金) 08:02:03
>>739
たしかにこれは見事なスルーっぷりだなw
741デフォルトの名無しさん:2008/10/31(金) 08:41:57
釣りだろ、釣られるなよ
742デフォルトの名無しさん:2008/10/31(金) 08:48:22
釣られるなよ、絶対釣られるなよ!
743デフォルトの名無しさん:2008/10/31(金) 10:55:49
ヘッダファイルで次のように宣言されている場合、publicの後に書かれているslotsにはどういう意味があるのですか?

public slots:
void setValue(int value);
744デフォルトの名無しさん:2008/10/31(金) 11:22:58
Qtのマクロ?
745デフォルトの名無しさん:2008/10/31(金) 11:26:54
>>744
Qtを使ったプログラムなんですが、publicの後に":"以外の文字が書かれている構文を見たことが無いので
このようなpublic宣言はどういう意味を持つのかが理解できないのです。
746デフォルトの名無しさん:2008/10/31(金) 11:33:01
#define slots で空に置換される
C++的には意味がない
ツールが認識するキーワード
747デフォルトの名無しさん:2008/10/31(金) 11:36:18
>>746
あ、そうなんですね。emitと同じようなもんですか。
よく分かりました。ありがとうございます。
748デフォルトの名無しさん:2008/10/31(金) 19:15:47
More Exceptional C++
11/5 発売になってるけど今日、紀伊国屋で入手した。
749デフォルトの名無しさん:2008/11/01(土) 02:05:35
7年も前の、現行規格が出来る前の本を今更翻訳されてもな
役に立つのかな
750デフォルトの名無しさん:2008/11/01(土) 07:39:39
>>687
>> - 仮想メモリシステムでは、new の失敗に遭遇することはまれか全くない。なぜなら仮想メモリが枯渇する遥か以前の
>> 時点で、大抵スラッシングが発生し管理者がプロセスを kill し始めるからである。

これちょっとダウトじゃないかなあ。
例えば実メモリは4GB以上ある32bit OSだと、あるユーザプログラムのメモリ使用量が
4GB - (システム等使用分)に到達すると脂肪だが、システム全体にはまだ余裕がある、
なんて場合はあるかと。OSにもよるわけだが。
751デフォルトの名無しさん:2008/11/01(土) 08:49:25
>749
1998 と 2003 の違いなんて大してないんじゃね?
vector の連続性保証は 2003 だっけ?
752デフォルトの名無しさん:2008/11/01(土) 10:57:29
質問です。

namespace NS {

struct T
{
    int val;
    operator int&() { return val; }
    T& operator+=(const T&) { return *this; }
};

}

void test()
{
    NS::T t;
    t = 3; // not compiled
    t += 3; // compiled
}

これをコンパイルすると not compiled の方は VC++ 2003, 2005, 2008, gcc 3.4.4, 4.3.2, Comeau C++ 4.3.9beta で
>tc.cpp:15: error: no match for 'operator=' in 't = 3'
みたいなエラーが出ます(↑は gcc 3.4.4 の例)。
一方、CodeGear C++ 5.93, 6.10(それぞれ RAD Studio 2007, 2009)だと通ります。
どちらの挙動が正しいのでしょう?

NS::T::opeator= が見つかるのは Argument Dependent Lookup であって、unqualified name lookup では組み込み(built-in)の
int& operator=(int&, int) が見つかって良い気がしますのでコンパイルできていいのではないかと思うのですが。
+= の方はコンパイルできているわけですし。
753デフォルトの名無しさん:2008/11/01(土) 14:09:10
デフォルトのコンストラクタに暗黙の型変換を許す旨があるので通る方が正しい。
754デフォルトの名無しさん:2008/11/01(土) 14:30:44
今からC++始める人だっているだろ
755デフォルトの名無しさん:2008/11/01(土) 14:59:44
代入の左辺が暗黙変換されたらまずいだろう
通らない方が正しい

何法の何条かを示すべきだろうが、面倒だからやらない
756デフォルトの名無しさん:2008/11/01(土) 16:11:20
>755
見つけました。ありがとうございます。

> 13.3.1.2/4
> For the built-in assignment operators, conversions of the left operand are restricted as follows:
> - no temporaries are introduced to hold the left operand, and
> - no user-defined conversions are applied to the left operand to achieve a type match with the left-most
>    parameter of a built-in candidate.

複合代入演算子についてはどうなのか?という点については↓がありました。
ttp://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#423

ということで、VC++ 他の挙動が正しいようです。
757デフォルトの名無しさん:2008/11/01(土) 16:32:29
まあ挙動が怪しい時はgccとVCが大抵正しくてBCCがおかしい
場合がほとんどだわな。

BCCももう少し頑張ってboost対応してくれよ・・・・BCB2009で
regexには対応したんだけどね。
758デフォルトの名無しさん:2008/11/01(土) 16:46:14
BCBは近い将来C++0x対応をうたってなかったか?
759デフォルトの名無しさん:2008/11/01(土) 17:46:23
Builder Xのころにexportに対応したプレビュー版とか出してた気はするが
760デフォルトの名無しさん:2008/11/01(土) 18:37:00
>758
とりあえず 2009 でドキュメントに載ってる対応機能

・alignof 演算子
・型特性関数(__has_nothrow_copy_constructor 等)
・noreturn 属性と final 属性
・explicit 変換演算子
・extern テンプレート
・列挙型の前方宣言
・右辺値参照
・静的アサーション(static_assert)
・厳密な型指定の列挙型
・型指定子 decltype
・Unicode 文字型とリテラル(char16_t, char32_t と u'', U'')
761デフォルトの名無しさん:2008/11/01(土) 19:48:07
autoなしでC++0x対応を謳うとか何なの
762デフォルトの名無しさん:2008/11/02(日) 10:46:12
sprintfとかprintfをc++で使うときはcstdio、strcpyとかstrcmpを使うときはcstringをincludeしろって書いてあるんですがg++だとincludeしなくても使えるのはなんででしょう?コンパイルできてもincludeしておくべくなんでしょうか?
763デフォルトの名無しさん:2008/11/02(日) 11:13:30
>>762
直接 include していないだけで、間接的に include されてんじゃない?
764デフォルトの名無しさん:2008/11/02(日) 11:15:35
宣言なくても使えるからそれの可能性もあるね、警告オプション無しだとなにも言ってこないし
型のあたりで問題が出るんだけど
765デフォルトの名無しさん:2008/11/02(日) 11:30:58
あーなるほど
iostreamをincludeしてると使えるっぽいです。
iostreamをincludeしないと使えなくなりました。
766デフォルトの名無しさん:2008/11/02(日) 11:41:55
そうなのか。
てっきりunix Cっぽくincludeなしでもprintfとかは使えるようにしてあるのかと思った。
767デフォルトの名無しさん:2008/11/02(日) 11:42:46
Cは型チェックがゆるいからできた芸当。
768デフォルトの名無しさん:2008/11/02(日) 12:49:07
<stream.h> なら <stdio.h> を含む仕様だったが <iostream> は違う
769デフォルトの名無しさん:2008/11/02(日) 13:45:46
C++はその辺特に規定してなかったはず
770デフォルトの名無しさん:2008/11/02(日) 18:21:42
More Exceptional C++ 19ページのCloneableって綴りは作者のJavaへの嫌みか
771デフォルトの名無しさん:2008/11/02(日) 18:27:11
非英語ネイティブに対する配慮かも。
772デフォルトの名無しさん:2008/11/02(日) 18:37:30
は?何か問題あるの?
773デフォルトの名無しさん:2008/11/02(日) 19:57:17
>何か問題あるの?
過去の前例や詳細な説明を書こうかと思ったけど「は?」になんかむかついたのでやめた。
774デフォルトの名無しさん:2008/11/02(日) 20:14:07
いちいちそんな説明するなんておまえ律儀だな。
775デフォルトの名無しさん:2008/11/02(日) 21:50:40
「そこを解説しないと、答えられなくて敵前逃亡したと思われる」
って考えたんだろう。

解説すると、もっとそういう雰囲気出ちゃうのが玉に瑕だが。
776デフォルトの名無しさん:2008/11/03(月) 11:11:58
言わぬが花ですね
777デフォルトの名無しさん:2008/11/03(月) 11:27:57
つうかスペルみれば想像はつきそうなもんだが
778デフォルトの名無しさん:2008/11/03(月) 11:49:14
言葉が悪かったとかちょっと謝ればいいだけの話なのに、おまえらときたら。
779デフォルトの名無しさん:2008/11/03(月) 20:14:30
Pythonとか使ってるとC++でも下のようにオブジェクと作ってしまうのですが問題ありですか?(1) MyClass obj = MyClass(100);
(2) MyClass obj(100);との違いは何かありますか?どっちもコンパイルできてエラーも出ないのですが。
780デフォルトの名無しさん:2008/11/03(月) 20:44:14
(1)はMyclass(100)を生成して,それをさらにコピーコンストラクタでobjを初期化している
つまり
>C++でも下のようにオブジェクと作ってしまうのですが問題ありですか?
問題ありすぎる.今すぐコード全部書き直して首つって死ね
781デフォルトの名無しさん:2008/11/03(月) 20:44:54
782デフォルトの名無しさん:2008/11/03(月) 20:55:20
試してみたけどコピーコンストラクタは呼ばれないんですが?=の代入で呼ばれるの?

#include <iostream>
#include <algorithm>

using namespace std;

class MyClass {
public:
MyClass(int a) {
cout << "constructor! " << a << endl;
m_value = a;
}
~MyClass() {
cout << "destructor!" << endl;
}
MyClass(const MyClass& obj) {
cout << "copy constructor" << endl;
}
void Show() {
cout << m_value << endl;
}
private:
int m_value;
};

int main() {
MyClass obj = MyClass(10);

return 0;
}
783デフォルトの名無しさん:2008/11/03(月) 20:56:41
ちなみに結果は
constructor! 10
destructor!
784デフォルトの名無しさん:2008/11/03(月) 20:56:53
>>601嫁カス
あと=は代入ではない
785デフォルトの名無しさん:2008/11/03(月) 21:02:15
読んだけど意味がわからないorz
結局、コピーコンストラクタが呼ばれないようにコンパイラが裏で細工しているだけで実際はやっちゃいけないってことですか?
786デフォルトの名無しさん:2008/11/03(月) 21:03:17
意味なく煽ってる奴はなんなの
787デフォルトの名無しさん:2008/11/03(月) 21:03:44
>>785
そゆこと
788デフォルトの名無しさん:2008/11/03(月) 21:10:01
なるほど、了解。

でもロベール本のp283見ると下の2つは若干の差はあるが基本的には同等とか書いてあるね。

Integer b = Integer(3)
Integer b(3)
789デフォルトの名無しさん:2008/11/03(月) 21:14:38
やっちゃいけないと言うが、誰もそんな変な書き方しないからやめておけという程度のこと。
極端な例を出せば#define BEGIN {のようなもの。
790デフォルトの名無しさん:2008/11/03(月) 21:16:47
Integer b = 3;
は、ときどき見かける
791デフォルトの名無しさん:2008/11/03(月) 21:19:10
>>788
そういう書き方をさせないためのexplicitです
792デフォルトの名無しさん:2008/11/03(月) 21:23:24
>>783
のようになるコンパイラは
.>>601
の規格に非準拠ということですか
793デフォルトの名無しさん:2008/11/03(月) 21:26:30
>>792
>>601 をもっぺんよーく嫁
特に避けられるってとこと、制約ってとこ
794デフォルトの名無しさん:2008/11/03(月) 21:27:20
>>792
g++使ったよ。

郷に入れば郷に従えってことでC++の書き方に慣れるよ。Pythonは
Integer b = Integer(3)
だからつい癖でC++でも使っちまうorz
795デフォルトの名無しさん:2008/11/03(月) 21:32:54
>>793
20回くらい読みましたが解りませんorz
796デフォルトの名無しさん:2008/11/03(月) 21:55:19
>>795
20回で足りる奴ばかりとは限らんが、255回でも65535回でも2147483647回でも考えれ
無限回必要でないことは俺が保証する
797デフォルトの名無しさん:2008/11/03(月) 22:05:32
うーん解らん
なにが制約なのでしょう
798デフォルトの名無しさん:2008/11/03(月) 22:08:47
>>797
ヒント: private
799デフォルトの名無しさん:2008/11/03(月) 22:14:23
>>798
なるほど
800デフォルトの名無しさん:2008/11/03(月) 22:15:31
俺バカ・・・言っちゃだめじゃん
801デフォルトの名無しさん:2008/11/04(火) 13:28:17
class Hoge {
public:
  vector& GetVec() { return vec_; }
private:
  vector<int> vec_;
};
こんな感じでメンバの参照をconstもつけずに返すのって設計間違ってますか?
しかし、参照返す方法以外でvectorへの操作を提供しようと思うと面倒くさすぎる。
802デフォルトの名無しさん:2008/11/04(火) 13:32:35
>>801
そもそも、ベクタの実装を公開してしまっていいかどうかが判断基準じゃないのか?
GetVec()使えばなんでもできてしまうってことは、Hogeクラスで管理しても意味がなくなるってことなんだけど。
例えばHoge hogeがあったとして、hoge.GetVec().clear()されてしまうかもしれないからね。
803デフォルトの名無しさん:2008/11/04(火) 13:54:32
>>801
それ、vec_をpublicにするのと同じじゃないか?
804デフォルトの名無しさん:2008/11/04(火) 13:56:00
>>801
なるほど。

今回のケースは、メンバ関数の引数で毎回vectorを受け取るのが面倒くさくて、vectorをメンバで保持してる意味が強いかもしれません。
vectorの中身を管理する目的がなければ、参照を返して問題ないということですね。

ありがとうございました。
805804:2008/11/04(火) 13:59:29
アンカーミスしました。×>>801>>802

>>803
言われてみれば・・・。
publicにvectorを置くほうがわかりやすいかなぁ・・。
806デフォルトの名無しさん:2008/11/04(火) 16:14:39
>>801
外部からvec_内部を直接触る構造が間違ってる気がするぜ
GetVec()使わすくらいなら、その処理をメンバ関数で内包しちゃったほうがスマートな気がするが
807デフォルトの名無しさん:2008/11/04(火) 16:22:14
構造だの設計だのって how なこと以前に、what なところで何が起きているか省みるべし
is a なものを has a で実装しようとしてないか?
808デフォルトの名無しさん:2008/11/04(火) 16:31:57
>今回のケースは、メンバ関数の引数で毎回vectorを受け取るのが面倒くさくて、vectorをメンバで保持してる意味が強いかもしれません。
裏を返せば、クラスhogeはベクタの参照(それも、const参照で済むかもしれない)を持っているだけでいいのかもしれない。
809デフォルトの名無しさん:2008/11/04(火) 16:33:18
まずは、この設計を採用することになった状況ってのが知りたい
810801:2008/11/04(火) 17:34:59
>>806-809
うーん、やはり設計がおかしかった気がします。

何がしたかったかというと、
void Hoge::XXX(vector<int>& vec);
void Hoge::YYY(vector<int>& vec);
...
このように必要なデータをvectorで受け取るメンバ関数がいくつかあります。
Hogeの利用者は、vecにデータをつめてHogeに渡すわけですが、このvecはHogeにしか使わないものなので、
Hogeのメンバにしてはどうかと思いました。
ここで問題なのは、vecにデータをつめるのはHogeの利用者であって、Hogeにはできないことなのです。
そこでvecの参照を返すのが一番手間がかからないと思い、参照返すgetterを考えました。
811デフォルトの名無しさん:2008/11/04(火) 17:43:42
>>810
vecにデータ詰めてから渡したらだめなん?
812デフォルトの名無しさん:2008/11/04(火) 17:50:56
何だろう、オブジェクト分割の段階で間違ってる気がする
813デフォルトの名無しさん:2008/11/04(火) 17:57:04
>>811
データ詰まったvectorを受け取って、メンバ変数vecとswapということですよね?
それが一番いいかもしれません。
>>812
特別珍しいケースというわけではないと思うのですが、意外に難しくて困っています。
814デフォルトの名無しさん:2008/11/04(火) 18:12:50
>808でいいんじゃないのか?
コンストラクタでベクタのコンスト参照でも渡しておけば、後は世話なし。
# いい設計だとは思わないけどw
815デフォルトの名無しさん:2008/11/04(火) 18:34:16
>>814
あーconst参照でオブジェクトの寿命が引き伸ばせるんでしたっけ。
でも、なんかスタックに確保したオブジェクトの参照を保持するのは気持ち悪く思えます。
それならswap使う方法にしたいです。
816デフォルトの名無しさん:2008/11/04(火) 18:37:06
>>815
おいこら、参照を何だと思っているんだ、貴様は。
817デフォルトの名無しさん:2008/11/04(火) 18:49:29
小粒でもぴりりと辛い
818デフォルトの名無しさん:2008/11/04(火) 19:00:51
>>815
メンバでは引き延ばせないし、今回の話とも関係ない。
819デフォルトの名無しさん:2008/11/04(火) 19:55:29
>>816,818
勘違いしていました。
const参照で寿命云々は一時オブジェクトのときの話でした。

参照をメンバとして持つのって、寿命管理の面で気持ち悪くないですか?
swapの方が自然だと思ったんですが。
820デフォルトの名無しさん:2008/11/04(火) 20:17:12
フツーはvec_に対してやりたい(許可したい)操作用のメンバ関数を一式用意するもんだと思うんだが
挿入も削除も要素アクセスもオールクリアも外からやりたい放題出来ていいの?
本当にそれでいいならpublicで全然問題ないんじゃね

特定のなんかのクラスがそういうことやるってならvec_は多分Hogeじゃなくてそいつの物だ
821デフォルトの名無しさん:2008/11/04(火) 20:42:31
メソッドに必要なデータ=パラメータを
メンバにしようって発想自体が
そもそも大失敗と推測されます
822デフォルトの名無しさん:2008/11/04(火) 21:39:23
>>820,821
vec_にデータつめるのは特定の場所(クラス)でやります。
「Hogeクラスにデータをセットする」という操作はおかしくないと思うのですが、swapじゃだめなんですか?

Hoge使うときにvec_が絶対必要になるし、Hogeの寿命がきれたらvec_の寿命もきれていいので、メンバにすればちょうどいいのかと思いました。
Hogeは複数のクラスから参照されるので、vec_をHogeのメンバにしないとなると、Hogeの他にvec_の参照も複数のクラスが持たないといけなくなるもよくないかなと。
823デフォルトの名無しさん:2008/11/04(火) 21:40:53
一度UMLツールでクラス図かけよ。
824デフォルトの名無しさん:2008/11/04(火) 22:09:51
なんかswapしてみたいだけと違うのかと
825デフォルトの名無しさん:2008/11/04(火) 22:27:25
自分は、データそのものの保持が主体のclassは
structで宣言してメンバを直接触らせている

例えば何かのファイルヘッダを読み込んだ結果とか
いちいち get, set関数を用意するのがうざいだけ
826デフォルトの名無しさん:2008/11/04(火) 23:07:57
>>823
UMLはほとんど知識なくてまともに書けないです。
>>824
ただのsetterですめばいいんですが、vectorはコピーにコストかかるからswapにしようかと。
>>825
データの保持が主体というわけではないです。
データを詰める作業がHogeの外なこと以外は、普通のメンバと一緒だと思うんですけど、うーん・・。
827デフォルトの名無しさん:2008/11/05(水) 00:56:17
>>826
データを詰める時に、vector<int>じゃなくてHogeのvec_アクセス関数を直接読んじゃダメなの?
operator[]かpush_backあたりを1個作れば終わるような気がしなくもないんだが
828デフォルトの名無しさん:2008/11/05(水) 01:01:29
Pythonも使ってる人結構いるのかな
829デフォルトの名無しさん:2008/11/05(水) 02:20:41
データを詰める作業ってのがよくわからんな
なんか追加するだけならHoge::push_backかなんか作ればいいだけだし
一から丸ごとvectorを構築するならHoge::vec_swapかなんか作ればいいだろうし
vec_に元々入ってるデータも使って複雑に中身をとっかえひっかえするなら
やっぱりHogeじゃなくてそれをやるクラスの物だと思うし
830デフォルトの名無しさん:2008/11/05(水) 15:04:25
>>827,829
push_backがあれば必要最低限ですが、データの追加はできて削除はできないの?とか、
要素の並びにも意味があるので、ソートもできた方がいいんじゃないかとか多すぎて・・。
で、最初に考えたのが、参照で返すことによってvectorの機能丸ごと使えるようししようと思いました。

> 一から丸ごとvectorを構築するならHoge::vec_swapかなんか作ればいいだろうし
今考えてるのはまさにこれです。
Hogeの外で自由にvectorにデータ詰めて、それをHogeに渡してswapでHogeのメンバvec_に移す方法です。
この方法にします。
ありがとうございました。
831デフォルトの名無しさん:2008/11/05(水) 15:33:37
コスト気にするならHogeに持った方がメモリ解放する回数が減るだろうし、
コスト気にしないなら単純にコピーでいいんじゃ
832デフォルトの名無しさん:2008/11/05(水) 17:52:58
>>830
それって結局削除とかソート、というか特にソートか
外部でコード書いてやらんといかんくなるんでしょ?
>>810にある考え方と矛盾してる気がしてしょうがないけどまぁいいか・・・
833デフォルトの名無しさん:2008/11/05(水) 18:00:15
push_back が出てくる時点で vector の採用自体について悩みそうだな、俺なら
834デフォルトの名無しさん:2008/11/05(水) 18:01:19
vec_が何を入れるための物で、それを責任もって管理すべきなのは誰なのかってことから
考え直した方がいいような気がする

そもそもvectorの要素の削除だのソートだのというのは低レベルな操作であって外様に見せるもんじゃない
もっと何かそれ以上の意味のある操作のまとまりとして外に提供しないとクラスで包む意味がない
(それの内部処理が結局の所vectorの操作に過ぎないとしてもだ)
835デフォルトの名無しさん:2008/11/05(水) 18:46:41
もうvectorを継承したクラスでいいじゃん
836801:2008/11/05(水) 19:17:21
しつこいようですが、再度書き込みます。

HogeはBoost.Graphのadjacency_listのようなものと思ってください。
adjacency_listは、イテレータで複数のEdgeを受け取るコンストラクタの他に、
add、remove、remove_if、clearなどの関数でEdgeの追加/削除を行えるようになっていますが、
今回のケースではこれに加え、要素の並びにも意味があるので、
insertやsortなども必要になり、結局vectorの機能全部なんじゃないかと思うわけです。

そこで、Hogeの外で自由にvectorいじってもらって、完成したvectorを受け取ってswapするのが良いと思いました。
837デフォルトの名無しさん:2008/11/05(水) 19:19:51
>>834
> 考え直した方がいいような気がする
考え直す気はないよ
swapしてみたいだけだもん
838デフォルトの名無しさん:2008/11/05(水) 19:28:08
swapだとHogeから取り出すこともできるんだよな
参照やpublicと大差ないと思うけど

まぁ自分しか使わないなら好きなようにやったんでいいと思う
839デフォルトの名無しさん:2008/11/05(水) 22:50:59
いっそ auto_ptr<vector<int> > で受ければ?
840デフォルトの名無しさん:2008/11/05(水) 22:58:57
Hogeにvecメンバの操作管理機能つける必要ないなら vecを呼び出し元のクラスのメンバにしとけ
841デフォルトの名無しさん:2008/11/06(木) 00:01:34
C++のマクロ定義の部分で、
#define <文字列1> <文字列2>
の<文字列2>が存在しないんですが、
これはどういった意味になるのでしょうか?
842デフォルトの名無しさん:2008/11/06(木) 00:03:22
定義してるだけ

#ifdef なんかではちゃんと読まれる

文中に書けば無視される
843デフォルトの名無しさん:2008/11/06(木) 00:05:47
>>841
再定義の無いやつか。
#ifdef/#ifndef〜#else〜#endifでコンパイラ制御に使う。
844843:2008/11/06(木) 00:06:49
被った orz
845デフォルトの名無しさん:2008/11/06(木) 00:19:25
defined のこともたまには思い出してあげてください。
846デフォルトの名無しさん:2008/11/06(木) 00:26:04
俺は
#ifdef
と書いたら必ず
#endif // defined(hogehoge)
みたいなコメントを後ろに書いてる
我ながら整合性ねーよなw
847デフォルトの名無しさん:2008/11/06(木) 01:02:30
まずつかわないけど
<文字列1>
が消滅する効果もあるじゃない
848デフォルトの名無しさん:2008/11/06(木) 01:53:46
よく使うよ。
例えば、C++には本来restrictはないけれどコンパイルオプションで使えるケースもあるから役に立つ。
#if defined(USE_RESTRICT)
# define RESTRICT restrict
#else
# define RESTRICT
#endif
849デフォルトの名無しさん:2008/11/06(木) 02:05:22
VC++の__restrictも忘れないで
850デフォルトの名無しさん:2008/11/06(木) 02:07:51
ちゃんとenum使おうぜ
851デフォルトの名無しさん:2008/11/06(木) 02:29:27
>>850
なにに?
852デフォルトの名無しさん:2008/11/06(木) 12:13:28
質問です。
(*this)<<buf;のところでセグメンテーション違反になっちゃう理由が分りません。(カッコは要らないと思うけどなんとなく。)
cout<<buf;だと大丈夫です。

#include <iostream>
#include <string>
#include <cstdarg>

using namespace std;

class FormatedOstream:public basic_ostream<char> {
public:
void printf(const char* format, ...){
va_list vl;
va_start(vl, format);
static char buf[1024];
vsprintf(buf, format, vl);
(*this)<<buf;
va_end(vl);
}
};

int main(){
FormatedOstream out;
out.printf("str:%s value:%d\n", "hello", 10);
return 0;
}

853デフォルトの名無しさん:2008/11/06(木) 12:25:59
>>852
classの作り方がおかしい。継承は間違っている。コンポジションにすべき。
854デフォルトの名無しさん:2008/11/06(木) 12:30:50
ios_baseにあるstreambufがnullぽだから<<でそこ書き込むときに
nullぽに書きこもうとしてSEGVってるな
俺iostreamを作るならboost::iostreamを使うのがおぬぬめ
標準だけで作るのは結構面倒だったと思う
855852:2008/11/06(木) 12:37:41
継承にした理由は、今のがうまくいったら、
template <class STREAM>
class Formatedstream:public STREAM {
. . . .
}

Formatedstream<ofstream> ofs

みたいな感じで、どんなストリームでもOKよ。という風にしたかったんですが、そもそもそんなの無理ですか?
856デフォルトの名無しさん:2008/11/06(木) 12:39:30
だいたいstd::ofstreamがstd::ostreamから継承してるんだから
俺iostreamを作る時もそれに倣った方がいいと思うが
857デフォルトの名無しさん:2008/11/06(木) 13:19:39
class FormatedOstream {
std::ostream& ost;
public:
FormatedOstream(std::ostream& o) : ost(o) {}
void printf(const char* format, ...){
va_list vl;
va_start(vl, format);
static char buf[1024];
vsprintf(buf, format, vl);
ost<<buf;
va_end(vl);
}
};

void f(FormatedOstream& out) { out.printf("str:%s value:%d\n", "hello", 10); }

int main(){
FormatedOstream o1(std::cout);
f(o1);
std::ofstream ofs("foo.txt");
FormatedOstream o2(ofs);
f(o2);
return 0;
}

どんなostreamでもOKよ
858デフォルトの名無しさん:2008/11/06(木) 14:27:12
どうも

>853
>857
コンポジションだと演算子やらその他ストリームの便利機能を書かなきゃならんのですが、それくらい面倒くさがるなってことですかね。

>854
なるほ

>856
もっと根元からやれってことですね。
859852:2008/11/06(木) 15:49:00
coutのstreambufferをいれてあげたら一応望みどおりになりました。
単語の意味合い的になんか微妙ですが。
どうもでした。

class FormatedOstream:public ostream {
public:
FormatedOstream(ostream& s):ostream(s.rdbuf()){}
void printf(const char* format, ...){
va_list vl;
va_start(vl, format);
static char buf[1024];
vsprintf(buf, format, vl);
*this<<buf;
va_end(vl);
}
};

int main(){
FormatedOstream out(cout);
out.printf("str:%s value:%d\n", "hello", 10);
out.precision(10);
out<<0.333333333333333333333<<endl;
out.setf(ios_base::scientific);
out<<0.333333333333333333333<<endl;
return 0;
}
860デフォルトの名無しさん:2008/11/06(木) 16:32:02
if(OpenDialog1->Execute()) {

Fname1 = OpenDialog1->FileName;

TStringList *astringlist = new TStringList;
astringlist->LoadFromFile(Fname1);
  A1 = astringlist->Strings[0];
A2 = astringlist->Strings[1];
   A3 = astringlist->Strings[2];
              ・
              ・

Load();
}

void __fastcall TForm1::Load()
{
File *fp;

fp = fopen(A1.c_str(), "rb" );
  fread(data,2,10,fp);

fclose(fp1);
}
    ・
    ・
    ・

あらかじめテキストファイルに数行に渡って読み込みたいファイルのパスが書いて
あり、上のように作って読み込むプログラムを作ってみたのですがうまくいきません。
アドバイスお願いします。
861デフォルトの名無しさん:2008/11/06(木) 16:43:26
読み込みたいファイルのパスをフルパスにしてみるとか
862860:2008/11/06(木) 16:55:11
>>861
テキストにはフルパスで書いてあります。。
863デフォルトの名無しさん:2008/11/06(木) 16:57:29
うまくいかないってのはどこでどういう失敗するんだ?
オープン直前でファイル名表示させてみては
864デフォルトの名無しさん:2008/11/06(木) 18:07:08
fgets にハメられてる悪寒
865デフォルトの名無しさん:2008/11/06(木) 18:51:56
それ、C入門スレのネタじゃね?w
866デフォルトの名無しさん:2008/11/06(木) 19:52:57
だって 860 は fopen を使ってるんだぜ?
867デフォルトの名無しさん:2008/11/06(木) 20:24:22
ttp://tripper.kousaku.in/20080914.html

ここにあるプログラムで擬似乱数が作成できるらしいんですが、
どうやって乱数を出すのか分かりません。
どなたか教えていただけませんか?
868デフォルトの名無しさん:2008/11/06(木) 20:30:50
M系列とか線形合同法かなにかとおもったらMTかよw
そのアルゴリズムの説明は一言じゃすまないつーか普通の人には無理だ
かなり数学の知識が・・・・
メルセンヌツイスタの論文は公開されてるからためしに見てみればいい、きっと意味がわからない
869デフォルトの名無しさん:2008/11/06(木) 20:34:12
使い方聞いてるんじゃない?w
870デフォルトの名無しさん:2008/11/06(木) 20:43:46
dSFMTなら状態を構造体で持てるからそのライブラリの存在意義も薄いなあ
MT19937ならboostから持ってきた方が便利だし
871デフォルトの名無しさん:2008/11/06(木) 20:44:19
>>868
アルゴリズムの解読ではなく、
実際にこのアルゴリズムを使って乱数を出すにはどうしたらいいのかを聞きたいのです。。
説明下手ですみません。

>>869
その通りです。。
872867:2008/11/06(木) 20:47:11
アルゴリズムっていうより「プログラム」ですね。

とりあえず、1〜50までの乱数を取り出すようにしたいのですが・・・。

>>870
ごめんなさい。
全く意味が分かりません・・・
873デフォルトの名無しさん:2008/11/06(木) 20:50:06
親切な解説ページは無視?
874デフォルトの名無しさん:2008/11/06(木) 20:53:51
>>872
本家を使えばいい
マニュアル載ってるし、CでコンパイルしてCリンケージでリンクするだけ
ttp://www.math.sci.hiroshima-u.ac.jp/~m-mat/bin/dl/dl.cgi?SFMT:dSFMT-src-2.0.zip

それも面倒なら下の関数をコピペして、適当に構造体に直す
状態変数の命名規則に気をつけて、tに適当な種をやれば十分使える
unsigned long xor128(){
    static unsigned long x=123456789,y=362436069,z=521288629,w=88675123;
    unsigned long t;
    t=(x^(x<<11));x=y;y=z;z=w; return( w=(w^(w>>19))^(t^(t>>8)) );
}
875デフォルトの名無しさん:2008/11/06(木) 21:10:58
どうでもいいけどライセンスにだけは気を付けろよ
876867:2008/11/06(木) 21:24:06
>>873
解説ページは見たところ無かったのですが・・・

>>874
本家の方を見てみました。
cファイル、hファイルをプロジェクトに追加したのですが、
後はrand()と打てば乱数を取り出せるのでしょうか?

>>875
再配布とかはしないので大丈夫だと思います
877デフォルトの名無しさん:2008/11/06(木) 21:32:19
本家のほうの.cファイルにはmain関数が入っているはず。
それが使い方の見本にもなっている。
もちろん自分のプログラムに組み込むときには、
そのmainは削除かコメントアウトする必要がある。
878デフォルトの名無しさん:2008/11/06(木) 21:44:44
再配布しないならboost::randomのmt使えばいいやん
ググれば一発で使い方でてくるし
879デフォルトの名無しさん:2008/11/06(木) 23:34:35
>>780
(1)ではコピーコンストラクタ呼ばれないってリップマンが言ってた.
880デフォルトの名無しさん:2008/11/07(金) 00:01:48
かなり迷ってやっとこさ見つけたバグが
ファイルに書き込む順番と、読み込む順番が違っていた事でした
そういったものを無くすような工夫とかは何かあるんでしょうか?
やっぱ、気をつけるしかないんですかね orz
881デフォルトの名無しさん:2008/11/07(金) 00:09:23
つTDD
882デフォルトの名無しさん:2008/11/07(金) 00:52:46
シリアライズ系のライブラリを使う
883デフォルトの名無しさん:2008/11/07(金) 09:47:42
現象から原因を特定するための推理力と調査する手段を多く持つ
884デフォルトの名無しさん:2008/11/07(金) 10:56:45
青魚を積極的に食べて頭を良くする
885デフォルトの名無しさん:2008/11/07(金) 11:37:01
シングルトンってどういうときに使えばいいの?
freetypeの初期化と解放とかそういうの?
886デフォルトの名無しさん:2008/11/07(金) 12:38:36
少なくともC++に限った話ではないな。
887デフォルトの名無しさん:2008/11/07(金) 13:04:21
ここは初心者スレか?
888デフォルトの名無しさん:2008/11/07(金) 14:44:29
初心者いがいいると思うのか?
889デフォルトの名無しさん:2008/11/07(金) 16:35:08
まぁ普通は思うよな
890デフォルトの名無しさん:2008/11/07(金) 17:36:59
newについて質問があります。

あるクラスの中のコンストラクタに、以下の記述がありました。
CMfLayout* MfNewLayout(MfFilterID ID, double x, double y, double z, double size)
{
return new CMfLayout(ID, x, y, z, size);
}
ID,x,y,zというのは、領域確保には関係がないとおもうんですが、
これでも正しくdouble size分だけ確保されるんでしょうか?
891デフォルトの名無しさん:2008/11/07(金) 17:43:29
いや、単にCMfLayoutのコンストラクタに引数渡してるだけだろう。
892デフォルトの名無しさん:2008/11/07(金) 17:56:50
うーん、ここから先が何も記述されていないんですよね。
new int(100)
とかしたら領域確保されるからそれと同様に
new CMfLayout(size)
でもなりそうな気がしたんですが…
893デフォルトの名無しさん:2008/11/07(金) 17:58:01
classは全部でこんなふうにかかれてました。
class __declspec(dllexport) CMfFeatureLayout : public CMfFilterData
{
friend DLLEXPORT CMfFeatureLayout *MfNewLayout(MfFilterID ID, struct feature feat,struct feautre size);
private:
struct feature m_feat;
struct feature size;
protected:
CMfFeatureLayout(MfFilterID ID, struct feature feat,struct feautre size);//コンストラクタ(初期化)
virtual ~CMfFeatureLayout();
virtual void Free();
public:
MfDataType GetType() const;
struct feature GetFeat() const { return m_feat; };
};
CMfFeatureLayout* MfNewLayout(MfFilterID ID, struct feature feat,struct feautre size){
return new CMfFeatureLayout(ID, feat);
}
CMfFeatureLayout::CMfFeatureLayout(MfFilterID ID, struct feature feat,struct feautre size){
SetID(ID);
this->m_feat = feat;
}
CMfFeatureLayout::~CMfFeatureLayout(){}
void CMfFeatureLayout::Free()
{
delete this;
}
MfDataType CMfFeatureLayout::GetType() const
{
return FILTER_DATATYPE_LAYOUT;
}
894デフォルトの名無しさん:2008/11/07(金) 18:05:32
>>892
なんかC++の文法を思いっきり勘違いしてるみたいだから、まともな入門書読むことからやり直すことを勧める。
895デフォルトの名無しさん:2008/11/07(金) 18:16:57
CStringを使いたくなったので
#include "afx.h"

エラー発生
1>LINK : fatal error LNK1104: ファイル 'uafxcw.lib' を開くことができません。」
Program Files検索してみたが64用しかなかった

uafxcw.libはどこでダウンッロードできる?


896デフォルトの名無しさん:2008/11/07(金) 18:25:05
VC++環境依存の問題はスレ違いどす
897デフォルトの名無しさん:2008/11/07(金) 18:28:47
事故解決

MFCって有料なのか
express editionには入ってないのね
898デフォルトの名無しさん:2008/11/08(土) 00:12:18
そもそもMFCの外でCStringなんか使おうとすんな
899デフォルトの名無しさん:2008/11/08(土) 00:16:34
ATL/WTLで使っちゃダメかい?
900デフォルトの名無しさん:2008/11/08(土) 01:25:44
ダメだろ
CStringはMFCにベッタリ依存してる
901デフォルトの名無しさん:2008/11/08(土) 01:27:23
というかCStringはMFCそのものw
902デフォルトの名無しさん:2008/11/08(土) 01:36:09
あれ?VS2005辺りからATL化されたと思ってたが?
903デフォルトの名無しさん:2008/11/08(土) 01:59:28
WTLにもCStringあるよ
904デフォルトの名無しさん:2008/11/08(土) 02:05:39
std::stringじゃダメな理由はなんだ
CStringだって五十歩百歩だろ
905デフォルトの名無しさん:2008/11/08(土) 03:54:38
.c_str()をつけなくてもいいあたりはすごく楽でいい。
906デフォルトの名無しさん:2008/11/08(土) 04:13:00
あと、CString::Format();
907デフォルトの名無しさん:2008/11/08(土) 07:32:09
VS2002からCStringはMFC/ATL共有クラスになってる
実際にはどちらもATL::CSimpleStringT<T>から派生したATL::CStringT<T>のtypedef

自分の使ってるフレームワークについてくらい
もうちょい勉強しような
908デフォルトの名無しさん:2008/11/08(土) 08:44:58
私の勤務する会社のMS贔屓はBuffer()とかGetBuffer()を理由に挙げてた。
909デフォルトの名無しさん:2008/11/08(土) 10:59:04
ATLのCStringを使うなら、<atlbase.h>あたりをインクルードしないといけないはず。
こっちもExpressでは使えないけど。

そう言えば、std::basic_stringもstd::vectorみたいに要素数連続の保障を加えるって話なかったっけ?
それとstring-wstring間の変換関数があれば、
もう自分にとってCStringを使う理由がほとんどなくなるんだけどな。
910デフォルトの名無しさん:2008/11/08(土) 15:44:02
>>908>>909 の言うようになればアドバンテージではなくなるか
911デフォルトの名無しさん:2008/11/08(土) 15:51:01
printf風にformatしたいんじゃね
俺はstringsteam使うけど
912デフォルトの名無しさん:2008/11/08(土) 15:57:02
boost::format
913デフォルトの名無しさん:2008/11/08(土) 15:57:34
914909:2008/11/08(土) 16:08:01
いやいや、そんなのを使わなくても0xまで待てば変換できるようになるのは知っているぞ。
915デフォルトの名無しさん:2008/11/08(土) 21:35:04
gccでC++ λfunctionって使えるの?
916デフォルトの名無しさん:2008/11/08(土) 21:52:43
gccのg++でboost使えば今でも
trは知らん
917デフォルトの名無しさん:2008/11/09(日) 04:58:24
class Type
{
bool MF( void *p ) return p == this;
};

Type *p = new Type;
bool result = p->MF( p );


これ、trueになるって保証されてる?環境依存?
918デフォルトの名無しさん:2008/11/09(日) 05:03:17
>>917
とりあえずコンパイルエラーなわけだが、 Type* → void* の変換は1対1だから
たぶん心配してるような問題は無いよ。
919デフォルトの名無しさん:2008/11/09(日) 05:56:48
このケースでは問題にならないけど、継承が絡む場合で
Type 以外の型のポインタから void* に変換されている場合は
アドレスが異なったりするから true になるとは限らない。

つか、なんだその構文はw
920デフォルトの名無しさん:2008/11/09(日) 11:57:04
newで確保したメモリをdeleteしないとメモリリークを起こして危険と書いてありますが、プログラムを強制終了しても確保したメモリは解放されないんでしょうか?OSを再起動すれば解放されるとは思いますが。
921デフォルトの名無しさん:2008/11/09(日) 12:04:01
>>920
標準またはユーザ定義の operator new が、どのようにメモリ割付を実装しているかによる
自動的な解放を行う実装と、行わない実装の、両方に互換性のある書き方は言うまでもあるまい
922デフォルトの名無しさん:2008/11/09(日) 12:06:18
>>920
Windows では、プロセスを強制終了するとシステムが不安定になる旨の警告をしてくるだろ
923デフォルトの名無しさん:2008/11/09(日) 12:11:56
>>920
少なくともVxWorksは解放してくれない。
それに組み込みで再起動はありえない。
924デフォルトの名無しさん:2008/11/09(日) 12:13:20
>>922
そのWindowsでは、強制終了してもメモリは解放される。
925デフォルトの名無しさん:2008/11/09(日) 12:17:45
強制終了するとメモリが開放されなかったのは、Win95系だっけか?
16bit Windows辺りだったかな?
926デフォルトの名無しさん:2008/11/09(日) 12:21:04
メモリリークに気をつけなきゃいけないのは組み込みとかインフラとか簡単に止められない系のプログラムだけってこと?
927デフォルトの名無しさん:2008/11/09(日) 12:25:48
valgrind --leak-chek=fullでSDLアプリをモニタするとですね…
928デフォルトの名無しさん:2008/11/09(日) 12:28:30
>>924-925
スレ違い
929デフォルトの名無しさん:2008/11/09(日) 12:29:43
>>926
何の限定をしようとしているんだ?
930デフォルトの名無しさん:2008/11/09(日) 13:11:44
つまり環境による
931デフォルトの名無しさん:2008/11/09(日) 13:20:48
>>926
そうとは限らない。
共有メモリを使うようなプログラムであれば、
どんなOSであれ気をつけなければならない
932デフォルトの名無しさん:2008/11/09(日) 14:29:54
933デフォルトの名無しさん:2008/11/09(日) 17:58:22
32bitコードを64bit化するときって
どこから手をつけるべきなの?
934デフォルトの名無しさん:2008/11/09(日) 18:02:29
整数をポインタにキャストしているところとか
935デフォルトの名無しさん:2008/11/09(日) 18:06:03
size_tが64bitになるなんて
936デフォルトの名無しさん:2008/11/09(日) 18:14:52
Windowsの場合。

Visual C++ の 64 ビットへの移行に関する一般的な問題
http://msdn.microsoft.com/ja-jp/library/3b2e7499(VS.80).aspx
937デフォルトの名無しさん:2008/11/09(日) 20:08:15
>>918
>>919
thx.
継承元とかにキャストしちゃってvoid* pに渡すと、
offsetがずれたまま渡されちゃうのね。

newした型でvoid*するとoffset変更なしでアドレスも同じ。と。
助かったーまぢさんすこ
938デフォルトの名無しさん:2008/11/09(日) 21:44:41
>>932
新スレ乙
939デフォルトの名無しさん:2008/11/09(日) 21:49:58
part63が二つあってその次がpart64か。
940デフォルトの名無しさん:2008/11/09(日) 22:16:01
GPで木構造に新しいノードを追加したいんですがプログラムを教えてください。
941デフォルトの名無しさん:2008/11/09(日) 22:16:47
struct Foo {
int i;
union {
int x;
int y;
struct {
int a;
int b;
};
};
};
こういう構造体はC++で禁止されてますが
Foo f;
f.a;f.b;とアクセスでき、かつ同じような構造になるようなものは
どうしたら定義できますか?
942デフォルトの名無しさん:2008/11/09(日) 22:23:16
サイズが違うものを共用体っすか
943デフォルトの名無しさん:2008/11/09(日) 22:24:22
すんません
無名構造体の中のやつらはcharです
944デフォルトの名無しさん:2008/11/09(日) 22:37:43
無名じゃなくて有名にすりゃいいと思うんだが。
945デフォルトの名無しさん:2008/11/09(日) 22:43:28
無名のままでも次のコードで通るが、まあ、直接a, bに通したい理由があるのだろう

struct Foo {
        int i;
        union {
                int x;
                int y;
                struct {
                        char a;
                        char b;
                } z;
        };
};

Foo f;
f.z.a; // valid
946デフォルトの名無しさん:2008/11/09(日) 23:33:32
本当は
union { int x; char a; };
union { int y; char b; };
がやりたいのと違うか?
947デフォルトの名無しさん:2008/11/12(水) 11:36:07
標準出力を自分で用意したstd::ostringstreamに変更して、
標準出力への出力文字列を全部ostringstreamに受け取るには
どうすればよいでしょうか?
948デフォルトの名無しさん:2008/11/12(水) 12:17:45
cout.rdbuf(自分で用意したostringstream.rdbuf());
949デフォルトの名無しさん:2008/11/12(水) 12:46:38
試してみた結果
最終ステップでsegvる(gcc-4.2.4@x86_64 linux 2.6.24)んですが、環境依存なんでしょうか?

#include <iostream>
#include <sstream>

int main(int, char *[])
{
std::ostringstream os(std::ostringstream::out);
std::cout.rdbuf(os.rdbuf());
}
950デフォルトの名無しさん:2008/11/12(水) 13:14:16
えーと、どこが笑い所?
951デフォルトの名無しさん:2008/11/12(水) 13:39:04
初めてだから優しくしてあげてね


#include <iostream>
#include <ostream>
#include <sstream>

int
main()
{
std::ostringstream oss;
std::cout.rdbuf(oss.rdbuf());

std::cout << "Hello World!!" << std::flush;

std::cerr << "result: " << oss.str() << std::endl;

return 0;
}
952949:2008/11/12(水) 13:44:12
#include <iostream>
#include <sstream>
#include <cassert>

int main(int, char *[])
{
std::ostringstream os;
os << "foo";
assert( os.str() == "foo");
os.str("");
assert( os.str().empty() );
std::streambuf *lastbuf = std::cout.rdbuf(os.rdbuf());
std::cout << "foo";
assert( os.str() == "foo" );
std::cout.rdbuf(lastbuf);
}

できました!
理由はよくわかりませんが元のstreambuf*を戻してやる必要があるみたいです
(ref http://bytes.com/forum/thread133393.html)
953デフォルトの名無しさん:2008/11/12(水) 19:09:52
埋め

次スレ>>33
import_featuresのために必要な.libファイルをリンクしてないだけかと。
954デフォルトの名無しさん:2008/11/12(水) 20:46:31
>>952
そんな行儀悪いことするよりも、文字列出力を行う関数の引数に
int func(int a, int b, ostream& os = cout)
とかしておいて、必要に応じて引数にストリーム与えたほうがいいよ。
オブジェクトの寿命とかちゃんと管理しておかないとミスの元だから
955デフォルトの名無しさん:2008/11/12(水) 21:36:09
すみません質問です。
enum test{ a }
とした場合、test::a でも単に a としてもアクセスできてしまい悩んでいます
test::aに限定したくてtestクラスに含めて見たのですが、そうすると列挙を受け取る
引数の型などに test::test としなければならず悩んでいます。

何かいいやり方はないでしょうか?
諦めてクラスにstatic const int aとでもするべきでしょうか・・・
956デフォルトの名無しさん:2008/11/12(水) 21:56:30
>>955
名前空間を使えば?
namespace test の中に enum を定義し、この enum を指定するクラスや
関数も同じ名前空間内に入れれば、それらの型部分に修飾は不要。
これらを使用する側は using namespace test を書くまで test:: を省略出来ない。
namespace 内に enum ではなく、直に定数を定義すれば、更に目的に近いかも。
957デフォルトの名無しさん:2008/11/12(水) 23:39:51
オペレータに関しての質問です。

bool operator < (const HOGE &value) const { ...}
と教わったのですが、
最後の"const"の文法的な意味、また必要性がわかりません。

どなたか教えて頂けないでしょうか?
958デフォルトの名無しさん:2008/11/12(水) 23:41:31
>>957
C++プライマー買え
全部載ってる
959デフォルトの名無しさん:2008/11/12(水) 23:44:41
>>958
糞本薦めるな

>>957
その関数内でいかなる変数もクラスも変更しないという意味
mutableを付けるとconstの意味を壊せるがお勧めしない
960デフォルトの名無しさん:2008/11/12(水) 23:48:34
>>958
>>959
さん、ありがとうございます。

なるほど、では、引数にあるconstは冗長で、

bool operator < (const HOGE &value) const { ...}
でなく、
bool operator < (HOGE &value) const { ...}
としても同じだということですか?
961デフォルトの名無しさん:2008/11/12(水) 23:52:15
constは付属する位置でどれを修飾するのか
違うからきちんと位置と意味づけ考えろ
962デフォルトの名無しさん:2008/11/12(水) 23:52:53
>>957
*this が const になるしるし

class Hoge {
int x;
void foo() const {
x = 1; // できない
}
void bar() {
x = 2; // できる
}
};
const Hoge *hoge;
hoge->foo(); // 呼べる
hoge->bar(); // 呼べない
963デフォルトの名無しさん:2008/11/13(木) 00:00:41
>>957
大抵の場合、比較演算子はインスタンス変数を変更せずに実装できるので、constを付けておいた方がいい。
最後のconstを付けないと、例えばその比較演算子を定義したクラスのconstオブジェクトで比較演算が行えない。

組み込み型と動作を合わせると言う意味で、オブジェクトの比較演算はそのオブジェクトがconstか非constかに関わらず行えることが望ましい。
964デフォルトの名無しさん:2008/11/13(木) 00:07:04
>>962
>>963
さん、ありがとうございます。
目から鱗です。大変よくわかりました!

比較演算子のオーバーロードのサイトを見ていると、
最後のconstが無いところがほとんどで、ハテナマークがでてました。

ありがとうございます!
965デフォルトの名無しさん:2008/11/13(木) 00:45:54
C++ 12年ぶりに次世代スタンダードへ - "C++0x" 策定進み草案公開へ
2008/11/12

The C++ Programming Language

プログラミング言語C++は1998年に発行され2003年に改訂された国際標準ISO/IEC 14882を仕様として採用している。
ISO/IEC 14882はC++の言語仕様と標準ライブラリの双方を規程しており、1998年に規程されたものは通称C++98、2003年に改訂されたものは通称 C++03と呼ばれている。
現在、JTC1/SC22/WG21 - The C++ Standards Committeeにおいて次期C++仕様"C++0x"の策定が進められている。最終的に12年ぶりに新しいC++が登場ということになりそうだ。

C++0xはC++98/03との互換性は確保しつつ、言語仕様と標準ライブラリの双方の規約を改訂するもので、新しい機能として並列プログラミングのサポートやプログラミングの簡素化、
関数プログラミング機能の強化、ジェネリックプログラミングのアップデート、オプショナルガベージコレクタ機能の導入、新しい言語仕様の機能を活用した新しい標準ライブラリの策定が盛り込まれる見通しになっている。
従来のC++との互換性を損なうことなく、より効率のいい開発ができるように拡張されるというわけだ。

ttp://journal.mycom.co.jp/news/2008/11/12/003/index.html
966デフォルトの名無しさん:2008/11/13(木) 19:29:46
あのすいません、
unsigned char* をunsigned int*に清く正しく型変換するのどうするんですか?
unsigned int* PUINT = (unsigned int*)PUCHAR; じゃないですよね。
967デフォルトの名無しさん:2008/11/13(木) 19:36:11
それで変換できてるよ

C++的にはreinterpret_castの方がいいかもしれんが
968デフォルトの名無しさん:2008/11/13(木) 21:00:14
清く正しい(動作として問題ない)かどうかは指してる先による。
969デフォルトの名無しさん:2008/11/13(木) 21:36:38
>>967
reinterpret_castって、下記のように関連のないのに変換する場合使うんですよね。
unsigned int INT = reinterpret_cast<unsigned int>PUCHAR
ポインタ同士の場合ポインタで関連があるから。
unsigned int* PUINT = static_cast<unsigned int*>PUCHAR
じゃないんですか?
970デフォルトの名無しさん:2008/11/13(木) 22:31:09
それstatic_cast通らなくない?
971デフォルトの名無しさん:2008/11/14(金) 01:10:50
ポインタのキャストにはreinterpret_castが必要です。
972デフォルトの名無しさん:2008/11/14(金) 01:27:53
俺の中で、unsigned char* と unsigned int* は
鶏の卵と蛇の卵くらいの違いがあるんだ。 みんなそうだと思ってた。
973デフォルトの名無しさん:2008/11/14(金) 01:54:49
>>972
可能な状況でかつその必要があるからやるんだろ
974デフォルトの名無しさん:2008/11/14(金) 02:16:31
卵の話は、>>969に係るのです。
975デフォルトの名無しさん:2008/11/14(金) 06:43:00
unsigned int* PUINT = static_cast<unsigned int*>(static_cast<void *>(PUCHAR))
なら通る
976デフォルトの名無しさん:2008/11/14(金) 07:00:48
どうしてポインタ変換はstatic_castでなくreinterpret_castなの?
977デフォルトの名無しさん:2008/11/14(金) 07:12:33
どうして>>975 だととおるの?
978デフォルトの名無しさん:2008/11/14(金) 07:20:23
キャストしてるから
979デフォルトの名無しさん:2008/11/14(金) 07:24:45
>>978
unsigned int* PUINT = static_cast<unsigned int*>PUCHAR
だとどうして駄目なの?
980デフォルトの名無しさん:2008/11/14(金) 07:32:35
暗黙に出来るポインタの変換はX*→void*だけだから
981デフォルトの名無しさん:2008/11/14(金) 10:18:02
>>979
たとえば中身がchar s [1] だったとして十分危険だろ?
982966:2008/11/14(金) 19:11:32
>>966=969です。
>>975>>980 そういうことなんですか。ありがとうございました。
暗黙変換が可能なケースが?ですけど、staticの場合、暗黙に変換出来るもの
じゃなければ変換不可で、ポインタ間変換ではX*→void*とvoid*→X*しか
暗黙変換出来ないから、それ以外のポインタ間変換はreinterpretで行うと。
えらく賢くなったv
983デフォルトの名無しさん:2008/11/14(金) 20:15:51
>>966
暗黙変換できるのはX*→void*だけ
static_castは暗黙変換と「暗黙変換の逆変換」ができるからvoid*→X*もできる

ポインタの変換を多用するんだったらこんなん作っとくといいよ
reinterpret_castと違ってintとかをポインタにしようとするとコンパイルエラーになってくれるから

template <typename T*>
inline T ptr_cast(void *p)
{
  return static_cast<T>(p);
}

unsigned int* PUINT = ptr_cast<unsigned int*>(PUCHAR);
984デフォルトの名無しさん:2008/11/14(金) 20:16:46
変なの入ってた

template <typename T>
inline T ptr_cast(void *p)
{
  return static_cast<T>(p);
}
985デフォルトの名無しさん:2008/11/14(金) 21:34:21
static_cast はコンストラクタを呼び出してるだけなんだよね。
986デフォルトの名無しさん:2008/11/14(金) 21:49:38
すいませんが
それはどういう意味なのか教えていただけませんか?
987デフォルトの名無しさん:2008/11/14(金) 21:51:08
二次元配列を動的に確保したいんですが、これってどこがまずいですか?
どう書いたら動きますか?

struct feature **features = new struct feature*[CATEGORY];
for(i = 0; i < CATEGORY; i++) features[i] = new struct feature[CANDIDATES];

988デフォルトの名無しさん:2008/11/14(金) 21:52:33
少しくらい自分で勉強してから質問したらどうかと・・・
989デフォルトの名無しさん:2008/11/14(金) 21:59:18
>>983-984
unsigned int* PUINT = ptr_cast<unsigned int*>(PUCHAR); じゃなく
もっと短く
unsigned int* PUINT = ptr_cast(PUCHAR);
とか出来ないですか? unsigned int*を二回も書くのメンドイです。
たとえば、
unsigned int* PUINT;
PUINT = reinterpret_cast<unsigned int*>PUCHAR の場合
<unsigned int*>をつけたほうが分かりやすいですが、
unsigned int* PUINT = reinterpret_cast<unsigned int*>(PUCHAR)の場合なんか、
見れば何に変換するのか明らかなのに、なぜ<unsigned int*>をつけるのか不思議です。
990デフォルトの名無しさん:2008/11/14(金) 22:02:11
0xでauto PUINT = ptr_cast<unsigned int*>(PUCHAR);と書けるようになるからもう少しの辛抱。

いやまあ今でも>>989みたいな書き方はできるよもちろん。
http://ml.tietew.jp/cppll/cppll/article/1071
991デフォルトの名無しさん:2008/11/14(金) 22:11:24
>>990
ありがとうございます。やっぱり出来るんですか、メモメモ
新しいのは、後ろじゃなく前のほうを略すですか。
992989:2008/11/14(金) 23:33:43
すみません、>>984, >>990を元にポインタ変換をつくたんですけど
これで、ポインタ間変換以外はエラーで且つ、T* t = auto_cast(X* x);
な使い方できますか?

template<class T> class auto_cast_type {
 void* value;
public:
 auto_cast_type(T* x) : value(x) {}
 template<class U> operator U () { return static_cast<U>(value); }
};
template<class T> inline auto_cast_type<T> auto_cast(T* x) { return x; }

ところで、下記は何をやっているんですか? で、どこで呼ばれるのですか?
template<class U> operator U () { ... }
993デフォルトの名無しさん:2008/11/14(金) 23:37:14
Cでのキャストをオーバーロードしているんでね?

operator int(){...}
とかのテンプレート版。
994989:2008/11/14(金) 23:54:02
>>992
auto_cast_type(T* x) : value(x) {} は
auto_cast_type(T* x) { value = static_cast<void*>(x); }
が良いですか?

>>993
つまり U u =(U)自分; の変換法を記しているですか
995デフォルトの名無しさん:2008/11/15(土) 06:04:18
void*へ変換してることをはっきりしたいならこう
初期化リストで書けるものは初期化リストで書く

auto_cast_type(T* x) : value(static_cast<void*>(x)) {}

まあvoid*へは暗黙変換できるんだしなくてもいいと思うが
996デフォルトの名無しさん:2008/11/15(土) 20:50:06
void*に変換した物をdeleteするとうまく消せるのってどういう場合ですか?
997デフォルトの名無しさん:2008/11/15(土) 21:09:45
void*に変換する直前の型に変換し戻した場合
998デフォルトの名無しさん:2008/11/15(土) 21:15:54
・newした時の型
・newした時の型の、仮想デストラクタを持つ基底クラスへのポインタ

の時だけかな
999デフォルトの名無しさん:2008/11/15(土) 21:48:31
         ,. -──- 、           ミ r‐、
       / _ -v-- 、  \          ノ)  }
      / / rv、  、`ヾヽ /ハ         l  ! / ))
      l/ //   | l  l  lヾヘマヽ     / \/
      / /ー '^′`ー:: ┼l_」ヘ/|   /     /
       H'´ ≡/////≡  | /  | j  /     /
      l{ ::::: ┌─ ┐ :::::: 冂ヽ lく /    /
     八   |   |   l´レj /    /
     / /\ |   |   | |/    /     ここに来てね〜!
     〈_/ rく ` ー--‐ 7´:! {:{    /  http://pc11.2ch.net/test/read.cgi/tech/1226347371/
      /\    /  l/Ll:|:. .:/|
     /  / ー-/   :|:  l:l:/  l
    /  /    i   :|:  //:.    ヽ
   /ヽ   ヽ、 __::人 __:ノ:/'´|:. l:  __ノ
   \ \_ { ,,,):::::l(,,.;;}   .:|:.__冫´
   / `ー/ー┤:::l      .:|
1000デフォルトの名無しさん:2008/11/15(土) 21:52:33
              _,,,-'''´ ̄       ̄`''- ,,,_
           _,,-'''´                 `'-,,
         /                      `ヽ
        /                          \
.      /                             ヽ
     /                                ヘ
    /.            l       i              ヘ
.   /        i     |.       |         .,      l
.   l   l     |.     |       λ         l.      |
   |.   |     .|    λ      .l l   ト     .|.|      .|
.  |    | i.   _/ヘ    | .|      .|  l  |.ヽ_,, -''´| |   .,   |
  |   , .|   /`''ヽ.,,_ .|  l      |  ヽ,-|''ヘ   l ノ  .i |   .|
  |   | ヾ  .|__ゝ_`,|、,, ヽ   ヽ、.| ,,-''´_ゝ,、‐ヽ'''''∧  //   .|
.  |   | ヾ  |.l  i. `-' ̄|`i'-'\,,_ `|´,'7´`‐' .l  ヘ/ ヾ /    .|  22:00 MX 見て!
   |  i ヘ. ゞ、,|.ヘ, \,,,,,,ノ.丿    `'' ヘ,,ゝ,,,,,,,ノ  /. i , ., λ |
   ヘ ∧ ヘ 丶ヘ `''‐--‐'''´        `''‐--‐''´./  ./ / /.| /
    \ .ヘ `i\ .ヘ         =         ./ ,,-''1.,ィ  / ノ  
      ヘ |ヽ `ト、_ゝ                 '''´  ./'' .| /
       ヽl. \l     `''-,,,,___,,,,-''      /
.           \                 ,,-''
             `''- ,,_       _,, -'''´
                   ̄''''''''''''''' ̄
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。