■過去ログ置き場に戻る■
1-
前250
次250
最新50
[memo]
"9999999999_00.html#R20"
という感じで、URLの最後に "#R
レスNo
" を追加すると幸せになれます。
C++相談室 part53
251
名前:
デフォルトの名無しさん
:2006/10/06(金) 00:32:35
>>250
まずはchar_traits<unsigned char>からなんだろうけど。
しかも、basic_string<>は仮想デストラクタを持ってないし、継承されることを
前提にしてない。
252
名前:
デフォルトの名無しさん
:2006/10/06(金) 00:37:46
>>250
UTF-8 を扱うのに std::string に何の不満がある?
253
名前:
デフォルトの名無しさん
:2006/10/06(金) 01:08:13
>>250
http://piza.2ch.net/tech/kako/967/967004691.html
254
名前:
デフォルトの名無しさん
:2006/10/06(金) 01:19:35
typedef std::basic_string<unsigned char> ustring;で十分な気がする。
char_traits も特に特殊化する必要があるものはないと思う。
後はwstringとの変換をする関数を作れば十分だろ。
255
名前:
デフォルトの名無しさん
:2006/10/06(金) 01:23:06
>>251
private継承して公開するメンバをusingすれば安全じゃね?
面倒だけど。
256
名前:
デフォルトの名無しさん
:2006/10/06(金) 08:01:25
private継承使うならコンポジションも考えよう
257
名前:
デフォルトの名無しさん
:2006/10/06(金) 08:28:24
コンポジションってなに?
private メンバとして持てばいいじゃないってこと?
258
名前:
デフォルトの名無しさん
:2006/10/06(金) 22:48:14
そう。包含ってやつだ
クラス間にis-a関係が成立しないなら
なるべくそうした方がいいらしいぞ
259
名前:
デフォルトの名無しさん
:2006/10/07(土) 09:00:47
重〜い計算ソフトの2次元版と3次元版を並行して作っており、
悩んでいることがあります。
例えば、2次元版で、
for (Vec2D vec(0, 0); vec[0] < maxVec[0]; vec[0]++)
{
for (vec[1] = 0; vec[1] < maxVec[1]; vec[1]++)
{
foo(vec);
}
}
であった箇所が、3次元版では
for (Vec3D vec(0, 0); vec[0] < maxVec[0]; vec[0]++)
{
for (vec[1] = 0; vec[1] < maxVec[1]; vec[1]++)
{
for (vec[2] = 0; vec[2] < maxVec[2]; vec[2]++)
{
foo(vec);
}
}
}
となります。
できれば、2D/3Dのソースの2元管理はしたくないし、
大量の #ifdef をソース中にばら撒くこともしたくありません。
ループの深さの違いをうまく吸収して、
2D/3Dを共用するアイデアはないでしょうか?
(元々、巨大な計算なのでパフォーマンスに影響は与えたくありません)
260
名前:
デフォルトの名無しさん
:2006/10/07(土) 09:16:45
blitz++とかあるでしょ。
http://www.oonumerics.org/blitz/
> vec[0] < maxVec[0]; vec[0]++
とかやばすぎ
261
名前:
(^-^)
◆MONSOON/qo
:2006/10/07(土) 09:50:30
計算量の多いところ(3D)を高速化すれば2Dはそれに含まれそれ以下の速度
262
名前:
(^-^)
◆MONSOON/qo
:2006/10/07(土) 09:56:22
回転とかだったら一度に全部が動くわけではないんだから結局は一次元とかに分割されるでしょ
263
名前:
デフォルトの名無しさん
:2006/10/07(土) 09:58:36
for (vec[2] = 0; vec[2] < maxVec[2]; vec[2]++)
{
foo(vec);
}
だけくくり出してテンプレにでもしたらいいべや
264
名前:
デフォルトの名無しさん
:2006/10/07(土) 11:27:50
>>254
typedef std::basic_string<unsigned char> ustring;
で十分なんだろうけど
operator<<とかこのへんは最低限実装しないとダメだよね?
265
名前:
デフォルトの名無しさん
:2006/10/07(土) 14:00:13
java.util.concurrent にあるような「待機状態のない」FIFOキューの
C++での実装って、どこかにない?
266
名前:
デフォルトの名無しさん
:2006/10/07(土) 14:02:23
>>259
です。アドバイスありがとうございます。
>>260
問題依存のメンバー関数があったりするので blitz++ の利用は
見送りました。
それから、ご指摘の箇所がヤバイ理由はよくわからないのですが...
>>261
2Dでも十分遅いので...(涙)
>>262
最内ループの部分は、行数も含めて可変ですので template 化は
困難かと...
267
名前:
デフォルトの名無しさん
:2006/10/07(土) 14:05:53
引き続き
>>259
です。
>>262
class abstract
{
virtual bool Scan() = 0;
}
class VecXD: public abstractVec
{
bool Scan();
}
あるいは、
class PolicyXD{ ... }
teplate<typename DimPolicy> Vec: public DimPolicy
{
bool Scan();
}
と定義しておいて、
while(vec.Scan())
{
foo(vec);
}
て感じでしょうか?
virtual を使いたくないし、後者もfor ループではなくなると、
無駄なコードが出力されるような予感がします。
268
名前:
デフォルトの名無しさん
:2006/10/07(土) 14:31:43
template<int I>
struct Loop{
template<class T>
void calc(T& vec){
for(vec[I]=0; vec[I] < maxVec[I}; vec[i]++){
Loop<I-1>::calc(vec);
}
}
};
template<>
struct Loop<0>{
template<class T>
void calc(T& vec){
foo(vec);
}
};
Vec3D vec;
Loop<3>::calc(vec);
269
名前:
デフォルトの名無しさん
:2006/10/07(土) 14:33:04
<<245
template<typename T> class Test
{
public:
Test()
{
Val_[0] = 100;
Val_[1] = 1000;
}
T GetVal() { return Val_[0]; }
private:
T Val_[2];
};
270
名前:
デフォルトの名無しさん
:2006/10/07(土) 14:35:34
(続き)
template<> double Test<double>::GetVal()
{
return Val_[1];
}
としておいて
Test<int> testInt;
Test<double> testDouble;
std::cout << "Int: " << testInt.GetVal()
<< " Double: " << testDouble.GetVal() << "\n";
とやったら、Int: 100 Double: 1000 とでましたが
271
名前:
デフォルトの名無しさん
:2006/10/07(土) 14:38:42
>>265
std::queue
272
名前:
デフォルトの名無しさん
:2006/10/07(土) 15:02:26
>>270
>とやったら、Int: 100 Double: 1000 とでましたが
で、だから何?
273
名前:
デフォルトの名無しさん
:2006/10/07(土) 15:49:44
>>270
もういい。くんな
274
名前:
デフォルトの名無しさん
:2006/10/07(土) 17:24:02
>>271
std:queue は順列コンテナSequenceを自分では実装していないし
デフォルトのSequenceであるdequeが「 「待機状態のない」FIFOキュー」だなんて話はきいたことがない。
275
名前:
デフォルトの名無しさん
:2006/10/07(土) 17:26:56
「待機状態のない」ってどういう事なの?
276
名前:
デフォルトの名無しさん
:2006/10/07(土) 17:48:32
マルチスレッドで排他なしでちゃんと動くってこと
277
名前:
デフォルトの名無しさん
:2006/10/07(土) 17:50:26
>>276
マルチスレッドを考慮していない現状の C++ 標準にそんなコンテナあるわけ無い。
何をどう考えたら、それが「待機状態のない」なんて表現になるんだ?
278
名前:
デフォルトの名無しさん
:2006/10/07(土) 17:52:48
>>277
誰が「C++標準」なんて言った?
279
名前:
デフォルトの名無しさん
:2006/10/07(土) 17:52:55
ググってみるとこんなのが出てきた。何かの訳語だね。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/concurrent/ConcurrentLinkedQueue.html
280
名前:
デフォルトの名無しさん
:2006/10/07(土) 17:52:55
http://www.google.co.jp/search?q=non-blocking+queue
で頭のほうに出てくるPDFで
アルゴリズムは紹介されてる。既存の実装はないんかいな?
281
名前:
デフォルトの名無しさん
:2006/10/07(土) 17:57:26
Lock-free と同義?
282
名前:
デフォルトの名無しさん
:2006/10/07(土) 17:57:49
non-blocking ってことだしょ
283
名前:
デフォルトの名無しさん
:2006/10/07(土) 17:58:28
実際には、要素の追加だけはブロッキング不要で取り出しはブロックかかるはずだけど
まあそれはどうでもいいか。
284
名前:
デフォルトの名無しさん
:2006/10/07(土) 18:08:09
いやこっちだろ。
http://ja.wikipedia.org/wiki/Lock-free%E3%81%A8Wait-free%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0
285
名前:
デフォルトの名無しさん
:2006/10/07(土) 18:09:39
Lock-free や Wait-free アルゴリズムを作るには、CPUが専用のアトミックな命令を提供し、それを使う必要がある。最も重要なのは、「比較して交換」(Compare and swap, CASと省略する)である。
つーわけで C++だけではこの機能は実装できない。
286
名前:
デフォルトの名無しさん
:2006/10/07(土) 18:13:23
http://www.audiomulch.com/~rossb/code/lockfree/
ここの "Existing source code and libraries" で、
都合のいい実装が見つかるかもしれない。
287
名前:
デフォルトの名無しさん
:2006/10/07(土) 18:53:24
CPU、コンパイラ別のアトミックな命令の使用例は
boost::shared_ptr の参照カウンタで使われてるのが参考になると思う。
288
名前:
デフォルトの名無しさん
:2006/10/07(土) 20:27:44
LinuxとFreeBSDはカーネル読めばそこそこ悩めば実装できると思うよ
289
名前:
デフォルトの名無しさん
:2006/10/07(土) 21:25:47
Google Code of Summer で Lock-free Container のプロジェクト提案されてたなぁ
結局誰も取らなかったのかな,あれ
290
名前:
デフォルトの名無しさん
:2006/10/07(土) 21:26:26
>289
>Google Code of Summer
間違えた. Google Summer of Code だ
291
名前:
デフォルトの名無しさん
:2006/10/07(土) 22:07:19
標準とやらをすぐに持ち出す規格厨ばっかでマジツマンネーな
292
名前:
デフォルトの名無しさん
:2006/10/07(土) 22:14:41
それがこのスレのいいところ
293
名前:
デフォルトの名無しさん
:2006/10/07(土) 23:51:45
時々規格厨の人につっこんでもらわないと、普段使ってる実装の挙動だけで脳内完結しちまうしな。
モヒカン乙というか。
294
名前:
デフォルトの名無しさん
:2006/10/08(日) 00:33:37
このスレはC++規格票の人力検索エンジンです
295
名前:
デフォルトの名無しさん
:2006/10/08(日) 00:35:49
適当なこと言ったり軽く煽ったりすると、規格を引用してくれるから便利だよねw
296
名前:
デフォルトの名無しさん
:2006/10/08(日) 00:36:39
たまに
>>277
みたいな人の話を聞かずにレスするバカもいるけどな。
297
名前:
デフォルトの名無しさん
:2006/10/08(日) 01:42:54
質問よろしいでしょうか……
クラス内クラスのアクセス制御て、クラス内クラスのメンバのアクセス制御には
影響しないんだっけ? とりあえずVC++ 8.0では通ったみたい。
class A {
private:
class B {
public:
void test() { std::cout << "test" << std::endl; };
};
B b_;
public:
B& b() { return b_; };
};
int main()
{
A a;
a.b().test(); // ok?
A::B b(a.b()); //NG
}
298
名前:
デフォルトの名無しさん
:2006/10/08(日) 01:55:29
>>297
影響しないよ。下は VC8 でも NG なんだよね?
299
名前:
デフォルトの名無しさん
:2006/10/08(日) 01:55:32
>>297
そりゃVC8のバグだ。
300
名前:
デフォルトの名無しさん
:2006/10/08(日) 01:56:19
>>297
あ、下はNGなのか。それでいい。
301
名前:
デフォルトの名無しさん
:2006/10/08(日) 02:01:06
何が問題なのか理解するまで30秒かかった。
なんだこりゃwこれ通っちまうのか、VC。見損なったわ!
302
名前:
デフォルトの名無しさん
:2006/10/08(日) 02:08:09
>>301
は?何いってんの?正しい動作だろ
303
名前:
297
:2006/10/08(日) 02:12:33
>298
そうか、OKなのか。サンクス
何かおもしろいことできそうかな……と思ったけど、
delete &(a.b());
が通っちまうのね……
class B {
~B() {};
friend A;
public:
void test() { std::cout << "test" << std::endl; };
};
とすりゃいいけど、これはこれで面倒か……
304
名前:
デフォルトの名無しさん
:2006/10/08(日) 02:14:47
俺は関数定義の } の後に ; つける奴は信用しない。
305
名前:
デフォルトの名無しさん
:2006/10/08(日) 02:19:10
いくらprivateにしても、参照を返したら何にもならんだろ。
306
名前:
デフォルトの名無しさん
:2006/10/08(日) 07:51:20
>>297
ややこしいこと書いているが、
> A::B b(a.b()); //NG
< A::B x; //NG
の時点で駄目だぞ。
307
名前:
デフォルトの名無しさん
:2006/10/08(日) 10:33:58
>>306
読解力0のクズは氏ね。去れ。
308
名前:
デフォルトの名無しさん
:2006/10/08(日) 10:56:14
>299
>301
>306
ごめん。誤解しちまったか……
A::B b(a.b()); //NG
自体はコンパイル通らんです。コメントアウトしとけばよかったな。
>305
確かにそうか。
カスタマイズポイントに使えないかな?と思ったけど、よくよく考えたら
クラス内クラスの時点で継承できない(カスタマイズできない)よね……
309
名前:
デフォルトの名無しさん
:2006/10/08(日) 11:00:52
>>307
プッ
310
名前:
デフォルトの名無しさん
:2006/10/08(日) 11:38:20
ちょいと質問だが、
複数のテンプレート引き数を取るテンプレート関数の、一部引き数だけの特殊化ってできるんだろか。
例えば
template<typename T, int N>inline T factrial(T s = 1){return factrial<T, N - 1>(s * N);}
template<>T factrial<T, 1>(T s){return s;}
みたいなことがしたいんだけど。
template<>double factrial<double, 1>(double s){return s;}
これなら巧くいくんだけどね。
311
名前:
デフォルトの名無しさん
:2006/10/08(日) 11:51:35
できるよ。まぁ、コンパイラによるかもね。
312
名前:
デフォルトの名無しさん
:2006/10/08(日) 11:53:03
>>309
読解力0のクズは氏ね。去れ。
313
名前:
310
:2006/10/08(日) 11:56:00
>>311
にえ〜、gcc@cygwinで通らない〜(TT
314
名前:
デフォルトの名無しさん
:2006/10/08(日) 12:00:16
>>311
なんで嘘をつくの?
315
名前:
デフォルトの名無しさん
:2006/10/08(日) 12:02:08
>310
>template<>T factrial<T, 1>(T s){return s;}
普通に特殊化しているように見えるけど……
template<T>T factrial<T, 1>(T s){return s;}
の間違い?
316
名前:
310
:2006/10/08(日) 12:15:50
いや、それはTが未定義とエラーにされる。
TとNのうちNだけ特殊化ってのはできないのかねぇ。
317
名前:
デフォルトの名無しさん
:2006/10/08(日) 12:27:54
>>315
typenameが抜けてますよ。(これでもダメだけど)
template<typename T>T factrial<T, 1>(T s){return s;}
テンプレート関数の部分特殊化は禁止されてるはず。
テンプレート構造体ならなんとかなる。
template<typename T,int N>
struct factorial
{
T operator()(T s=1){return factorial<T,N-1>()(s*N);}
};
template<typename T>
struct factorial<T,1>
{
T operator()(T s){return s;}
};
318
名前:
デフォルトの名無しさん
:2006/10/08(日) 12:28:57
>>310
関数テンプレートは部分特殊化できない。
(関数テンプレートを部分特殊化できちゃう処理系があるかどうかは知らん)
クラステンプレートなら部分特殊化できるから、
実体はクラスにして入口だけ関数にする感じでがんばれ。
319
名前:
315
:2006/10/08(日) 12:52:57
>317
指摘サンクス
>310
Exceptional C++ Styleにちょうどその話題が載ってるから、買って読んどけ
そういや、More Exceptional C++の邦訳は出ないのか……?
320
名前:
デフォルトの名無しさん
:2006/10/08(日) 13:29:26
D&Eには、関数テンプレートは部分特殊化はしてもいいかもしれないけど、
まだ良く分からないからやめてるんだと書いてあったはず。
頑張ってC++0xには入れてほしい。
321
名前:
310
:2006/10/08(日) 14:13:47
>>317-319
レスTHX、本も探してみる。
で、結局、
>317
ではTへのキャストオペレータがなくて巧くなかったのでこうなった。
関数版と名前がぶつかるのも回避。
#include <cstdio>
#include <cstdlib>
template <typename T> inline T factorial(const int n, const T s = 1) {return n <= 1 ? s : factorial(n - 1, s * n);}
template<typename T, const int N> struct Factorial {operator T() const {return Factorial<T, N - 1>() * N;}};
template<typename T>struct Factorial<T, 1> {operator T() const {return 1;}};
int main(int argc, char ** argv)
{
printf("%d\n", factorial<int>(atoi(argv[argc - 1])));
Factorial<double, 10> foo;
printf("%.20g\n", double(foo));
printf("%.20g\n", double(Factorial<double, 21>()));
return 0;
}
テンプレート引き数だと定数性が求められるから、末尾再帰じゃなくても大丈夫ってことですかね。
322
名前:
デフォルトの名無しさん
:2006/10/08(日) 14:32:42
Exceptional C++ Styleにまんま載ってるよ、それ
staticメンバ使ってたけどな
323
名前:
デフォルトの名無しさん
:2006/10/08(日) 16:55:05
質問です
C++でC言語ライクなスクリプト言語を作ろうとしているのですが
まずファイルを読み込み、string scriptに収納します。
次にscriptのコメント(/* */)を削除するのですが、
ここでbool DeleatComment(string &str);という自前の関数を使って
while(DeleatComment(script));と、コメントが全て消えるまでループさせるのですが
なぜかコメントが消えません。/*と*/が消えるだけなのです。
問題のDeleatCommentの部分は
bool DeleatComment(string &str){
string::size_type com_begin = str.find_first_of("/*");
if(com_begin != string::npos){
string::size_type com_end = str.find_first_of("*/",com_begin);
if(com_end != string::npos){
str.erase(com_begin,com_end-com_begin+2);
return true;
}
}
return false;
}
こうなってます。
324
名前:
デフォルトの名無しさん
:2006/10/08(日) 16:56:13
英語勉強しな
325
名前:
デフォルトの名無しさん
:2006/10/08(日) 17:19:40
>>323
find_first_of() ではなくて find() だと思うそこは
326
名前:
デフォルトの名無しさん
:2006/10/08(日) 17:24:25
>>325
ありがとうございます!
なぜだかよく分かりませんが、findにしたら消えました
327
名前:
デフォルトの名無しさん
:2006/10/08(日) 17:25:34
>>324
どこかでdelatCommentを使っちゃったんだろ。
初心者はよくやる。察してやろうZE
328
名前:
デフォルトの名無しさん
:2006/10/08(日) 17:34:11
>>327
>324
329
名前:
デフォルトの名無しさん
:2006/10/08(日) 17:35:04
>>326
std::string::find_first_of(A, B)は文字列Aの中から
「文字列Bの中のどれか一文字が最初に見つかったindexを返す」
のでした
<algorithm>のstd::find_first_of()の説明を見るとなんとなくわかるかもしれない
330
名前:
デフォルトの名無しさん
:2006/10/08(日) 17:37:17
>>324
すみません、deleatではなくdeleteでしたね
今気づきました
331
名前:
デフォルトの名無しさん
:2006/10/08(日) 17:38:21
>>328
まじれすされた(^o^)
332
名前:
デフォルトの名無しさん
:2006/10/08(日) 17:40:06
>>329
ごめん俺が馬鹿
find_first_of(A, B)
を
A.find_first_of(B)
に置き換えてみると俺が救われます
333
名前:
デフォルトの名無しさん
:2006/10/09(月) 13:05:57
こんな意味不明な警告が出たんですけど、なんのことやらさっぱりです!
warning C4786: 'std::reverse_bidirectional_iterator<std::list<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,
std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >::iterator,std::basic_string<char,std::char_traits<char>,
std::allocator<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> > &,std::basic_string<char,std::char_traits<char>,
std::allocator<char> > *,int>' : 識別子が '255' 文字に切り捨てられました (debug 情報内)。
list<string>を定義したら出たので、その辺の警告なんだと思いますが・・・
334
名前:
デフォルトの名無しさん
:2006/10/09(月) 13:07:08
日本語嫁
335
名前:
デフォルトの名無しさん
:2006/10/09(月) 13:07:51
超FAQ
336
名前:
デフォルトの名無しさん
:2006/10/09(月) 13:13:56
>>334
listの< >内が255文字以上あるということですか?
337
名前:
デフォルトの名無しさん
:2006/10/09(月) 13:17:28
>>336
違います。
338
名前:
デフォルトの名無しさん
:2006/10/09(月) 13:21:33
じゃあlist< >の中に同じSTLのstringとかstackとかが入るとまずいっていうことですか?
339
名前:
デフォルトの名無しさん
:2006/10/09(月) 13:25:27
http://www.google.co.jp/search?q=warning+C4786
340
名前:
デフォルトの名無しさん
:2006/10/09(月) 13:28:18
よくわからないので諦めます
341
名前:
デフォルトの名無しさん
:2006/10/09(月) 13:40:20
>>338
違います。
336の方が正解に近いな。
342
名前:
デフォルトの名無しさん
:2006/10/09(月) 13:41:53
>>333
俺にもさっぱりだが、
>339
を見る限り、
・VC++の環境依存っぽい
・キニスンナ
ということは解る。
343
名前:
デフォルトの名無しさん
:2006/10/09(月) 13:45:00
読売
北朝鮮が核実験を実施・・・朝鮮中央通信
産経
北朝鮮が核実験を実施
毎日
北朝鮮:中央通信「核実験行った」報じる プルトニウム型
日経
「核実験を実施」中央朝鮮通信
--------------------ここまで日本の新聞----------------------
朝日
北朝鮮「地下核実験に成功」
344
名前:
デフォルトの名無しさん
:2006/10/09(月) 13:52:15
さっさと核戦争始まらないものかねー
345
名前:
デフォルトの名無しさん
:2006/10/09(月) 14:42:40
>>344
俺らも被爆するぞ
346
名前:
デフォルトの名無しさん
:2006/10/09(月) 18:24:27
STLが多様してあると読みずらいよね?
347
名前:
デフォルトの名無しさん
:2006/10/09(月) 18:29:20
逆に読みやすいです
348
名前:
デフォルトの名無しさん
:2006/10/09(月) 18:38:48
std::だらけになってお願いしますusing使わせてくださいって
思うときはある
349
名前:
デフォルトの名無しさん
:2006/10/09(月) 18:58:46
>>348
上司に
「関数スコープ単位での"using namespace std;"は常識なんだよ」
って言うじゃない。
・
・
・
・
そしたら、あんたクビだからぁ〜〜。
350
名前:
デフォルトの名無しさん
:2006/10/09(月) 19:05:08
usingとusing namespaceは別物。
351
名前:
(^-^)
◆MONSOON/qo
:2006/10/09(月) 19:24:08
bsearchが正しい値を返さないのですがどこがいけないのかわかりますか?
N=100;
int *d = new int [N]; // dには適当な数値が入る
k=13421030;
q=(int *)bsearch(&k, d, N, 4, f);
x=(int)(q-d)+1; //サーチした番号
int f(const void *a, const void *b)
{return (*(const int *)a - *(const int *)b);}
352
名前:
(^-^)
◆MONSOON/qo
:2006/10/09(月) 19:26:28
あと、比較関数を
int f(const void *a, const void *b)
{return (*(const int *)b - *(const int *)a);}
に変更しても結果は同じになるんでしょうか?
別の番地が返ってくるのですが
353
名前:
デフォルトの名無しさん
:2006/10/09(月) 19:30:47
int [N]はちゃんとソートしてる?
354
名前:
デフォルトの名無しさん
:2006/10/09(月) 19:31:45
>>348
そういう時に export template<> だと実装側にusingが使いまくれて経済的
355
名前:
(^-^)
◆MONSOON/qo
:2006/10/09(月) 19:34:02
>>353
ばっちりしてあります 出力して確認済みです
実際にはN=57928730なんですが
数字が大きいと誤作動したりするんでしょうか
356
名前:
デフォルトの名無しさん
:2006/10/09(月) 19:39:07
んーnewした領域はたかだか220Mほどしかないし、誤動作するとすれば
もしかしたらsizeof(int) != 4の環境かねえ。
357
名前:
デフォルトの名無しさん
:2006/10/09(月) 19:41:58
>>351
C++なんだからlower_boundとか使えじゃ駄目?
358
名前:
(^-^)
◆MONSOON/qo
:2006/10/09(月) 19:44:41
>>356
駄目でした 4でした
どんな値でも、初めの200番代くらいまでの番号しか返してきません
>>357
つかってみます!
359
名前:
デフォルトの名無しさん
:2006/10/09(月) 19:45:01
例えばこれなんかちゃんと動作するよ。何か間違ってないか?
int main()
{
const int N = 100;
int* d = new int[N]; // dには適当な数値が入る
int k = 13421030;
std::fill(d, d + N / 2, 0);
d[N / 2] = k;
std::fill(d + N / 2 + 1, d + N, k + 1);
int* q = (int *)std::bsearch(&k, d, N, sizeof(int), f);
int x = (int)(q - d) + 1; //サーチした番号
std::cout << x << std::endl;
}
int f(const void *a, const void *b)
{
return *(const int *)a - *(const int *)b;
}
360
名前:
デフォルトの名無しさん
:2006/10/09(月) 19:47:23
レス番が飛んでる
361
名前:
(^-^)
◆MONSOON/qo
:2006/10/09(月) 19:55:22
>>359
10個や100個の連番で実験するとうまくいくのですが本番では失敗します
ちゃんとソートされているかどうかをプログラムで確認してみます
362
名前:
デフォルトの名無しさん
:2006/10/09(月) 19:56:57
>>361
んだね。std::qsortとかstd::sortの呼び出し方が間違っているのかもしれん。
363
名前:
(^-^)
◆MONSOON/qo
:2006/10/09(月) 21:04:01
>>362
原因解明しますた 358にヒントがありました
xがunsigned char型だったのを忘れてしまっていたようです
364
名前:
デフォルトの名無しさん
:2006/10/09(月) 21:39:36
そりゃ255までしか……って、何故そんなところにunsigned charなぞ使うw
365
名前:
デフォルトの名無しさん
:2006/10/09(月) 21:45:13
最初っからコンパイルできるソースを貼れってことだな。
366
名前:
デフォルトの名無しさん
:2006/10/09(月) 22:09:19
('A`)
367
名前:
デフォルトの名無しさん
:2006/10/09(月) 22:13:49
(´ω`)
368
名前:
デフォルトの名無しさん
:2006/10/09(月) 22:16:04
さすがにそこまでエスパーレスは出来なかったわ。
369
名前:
デフォルトの名無しさん
:2006/10/09(月) 22:27:54
誰か比較関数の整数オーバーフローについてつっこんでやれよ。
370
名前:
デフォルトの名無しさん
:2006/10/09(月) 22:31:21
>>369
なにそれ?わかんない。
371
名前:
デフォルトの名無しさん
:2006/10/09(月) 23:14:02
>>370
あの比較関数だと a と b が取り得る全範囲の数値の組み合わせの中で
約半数の組み合わせで比較関数が期待されるのとは逆の結果を返すだろ。
372
名前:
デフォルトの名無しさん
:2006/10/09(月) 23:16:19
ifもしくは?:演算子で分岐か。
373
名前:
デフォルトの名無しさん
:2006/10/09(月) 23:18:19
switch〜caseで行ってみよう〜
374
名前:
デフォルトの名無しさん
:2006/10/11(水) 20:54:23
C++ のソースコードのカバレージを測定するフリーのツールってありますぅ?
375
名前:
デフォルトの名無しさん
:2006/10/11(水) 23:59:34
スレ違い
376
名前:
デフォルトの名無しさん
:2006/10/12(木) 00:00:09
ソースコードのカバレッジってなんだろう?
テストのカバレッジならわかるんだが。
377
名前:
デフォルトの名無しさん
:2006/10/12(木) 00:27:27
>>376
PureCoverageみたいなやつのことでしょ?
378
名前:
デフォルトの名無しさん
:2006/10/12(木) 01:24:20
カバチャン
379
名前:
デフォルトの名無しさん
:2006/10/12(木) 03:18:30
誰がカバやねん!
380
名前:
デフォルトの名無しさん
:2006/10/12(木) 05:22:54
ファイル分割し、それぞれのソースである1つのクラスを使用したいのですが、
オブジェクトの生成を何処ですればいいのでしょうか?
381
名前:
デフォルトの名無しさん
:2006/10/12(木) 05:27:38
>>380
好きにしろ。
382
名前:
デフォルトの名無しさん
:2006/10/12(木) 06:00:23
データでかくないなら、起動時がオススメ
383
名前:
380
:2006/10/12(木) 06:25:00
>>381
>>382
レスサンクスです!質問の仕方が悪かったです、すいません。
AとBという二つのファイルでCというクラスを使用する際、オブジェクトを生成
する場所は何処でするのか?という初心者丸出しの質問なんですが。
やはり共通のヘッダで宣言するといった形でよろしいのでしょうか?
384
名前:
デフォルトの名無しさん
:2006/10/12(木) 07:47:20
そうそう。共有ヘッダーで宣言しないと、とっても、みずらくなっちゃうから、共有ヘッダーで、ぜんぶ、宣言してね
385
名前:
デフォルトの名無しさん
:2006/10/12(木) 08:06:09
>384
こらこら
386
名前:
デフォルトの名無しさん
:2006/10/12(木) 09:31:24
どう考えても「連鎖」って訳はおかしいだろ……
387
名前:
デフォルトの名無しさん
:2006/10/12(木) 10:02:39
誤爆やん
388
名前:
デフォルトの名無しさん
:2006/10/12(木) 10:26:46
>383
が
>380
に比べて質問のしかたがよくなったとは思えんのだが
てか,「生成する場所」を「ヘッダで宣言」て・・・?
389
名前:
デフォルトの名無しさん
:2006/10/12(木) 10:59:19
>>383
extern の使い道を考えてみるといいかもしれません
390
名前:
389
:2006/10/12(木) 11:18:04
>>386
誤爆に正式爆撃先がマジレス
http://pc8.2ch.net/test/read.cgi/tech/1143608073/
外国の単語にも複数の意味がついているのに
特定団体が利便性の為「だけ」で一つの日本の単語にあてはめる姿勢が駄目
だから単語の揚げ足取りばかりに終始して全く議論が進まない
Sequence という単語から複数本伸びている「枝(意味)」のうち私が選んだ一本を
私は日本の単語「連鎖」に当てました
しかし
連鎖という単語から複数本伸びている「枝(意味)」のうち貴方が選んだ一本が
Sequence という単語に当てられるかどうかまでは私には判りません
以降は上記スレで
スレ違い失礼致しました
391
名前:
デフォルトの名無しさん
:2006/10/12(木) 12:02:21
>>390
お前空気読めない類だな。
392
名前:
390
:2006/10/12(木) 12:13:07
>>391
毎日が妄想嫁とのラブラブハネムーンです><
393
名前:
デフォルトの名無しさん
:2006/10/12(木) 15:04:40
GAを使った卒論でFラン大でもできる題材ないですか?
394
名前:
デフォルトの名無しさん
:2006/10/12(木) 20:16:04
>>390
いいから原文のみを貼り、変な訳語は一切付けるな。以上。
395
名前:
380
:2006/10/12(木) 21:33:11
レスして下さった皆様、感謝です。
まだまだ、言葉足らずで申し訳ないです。
1つのオブジェクトを複数のファイルから参照出来るようにしたい、
この場合のオブジェクトの宣言は何処でどのようにしたらいいのか。
と、この様な書き方(言い方?)でいいんでしょうか?うまく伝わるか自信ないのですが。
>>389
externを使えば出来るのですね。有難う御座います。
以前、変数に対してexternを使用した時はすんなり出来たのですが、
記述の仕方が悪かったのか、クラスの場合は出来なかったのです。
もうちょっと頑張ってみます。
396
名前:
デフォルトの名無しさん
:2006/10/12(木) 22:13:30
要するに↓こういうことでっしゃろ?
>AとBという二つのファイルでCというクラスを使用する際、オブジェクトを生成
>する場所は何処でするのか?
↓
AとBという二つのファイルでCというクラスのオブジェクトを使用する際、オブジェクトを生成
する場所は何処のファイルでするのか?
397
名前:
デフォルトの名無しさん
:2006/10/12(木) 22:23:08
>>395
もしかしてこーゆーことがしたかったんかな?
// C.h
class C {
public:
static C& getInstance();
};
// C.cpp
C& C::getInstance() {
static C instance;
return instance;
}
398
名前:
デフォルトの名無しさん
:2006/10/12(木) 22:45:46
ストロー・ストラップマンセー
399
名前:
デフォルトの名無しさん
:2006/10/13(金) 02:00:55
お禿さま
400
名前:
デフォルトの名無しさん
:2006/10/13(金) 02:57:08
>>395
シングルトン?
401
名前:
デフォルトの名無しさん
:2006/10/13(金) 12:24:03
あ〜,
>>380
は「クラス」と「オブジェクト(→インスタンス)」の区別がついてないのかな?
402
名前:
デフォルトの名無しさん
:2006/10/13(金) 12:29:25
>>401
文脈からfile.objの事でないか?
403
名前:
デフォルトの名無しさん
:2006/10/13(金) 12:53:13
>>401
あらゆる意味で痛いです
404
名前:
デフォルトの名無しさん
:2006/10/13(金) 13:34:32
Exceptional C++ Style日本語版買ってきた。今から読む。
取り敢えずめぼしい書籍はこれ位しかなかった。
405
名前:
デフォルトの名無しさん
:2006/10/13(金) 13:35:22
>>380
が意味不明な件は?
406
名前:
デフォルトの名無しさん
:2006/10/13(金) 13:42:37
Exceptional C++とか読むヤツ居るんだな・・・
変態的と評される程ムズいと聞いて以来、
手に取ったことすら無いw
407
名前:
デフォルトの名無しさん
:2006/10/13(金) 13:45:38
Exceptional C++ Styleってどんな内容?
Exceptional C++は読んでるんだが想像つかん
408
名前:
デフォルトの名無しさん
:2006/10/13(金) 13:59:49
そこまで難しいことも無い。
409
名前:
デフォルトの名無しさん
:2006/10/13(金) 14:13:29
>>407
Exceptional C++を読んでいるなら、Exceptional C++ Styleは軽い読み物
だと思う。無理に買う必要はない内容。
410
名前:
380
:2006/10/13(金) 16:48:50
皆様、レスありがとです。度々すいません。
>>396
そうですね。それ+どのようにっていうのがあると助かります。
>>397
これが
>>400
氏が仰っているシングルトンと言う物(?)なのでしょうか?
ちょっと調べた感じではこれで良いような気がしました。どもです。
411
名前:
デフォルトの名無しさん
:2006/10/13(金) 18:38:34
変態的なのは「Modern C++ Design」だよ。
あれはおもしろい。役に立つかどうかは不明。
412
名前:
デフォルトの名無しさん
:2006/10/13(金) 19:43:23
Modern C++ Desgin は今改めて読むとめちゃくちゃ分かりやすい入門書だと思う。
Boost みたいに変態的な手段を使わず、基礎を知るには非常にいい本。
413
名前:
デフォルトの名無しさん
:2006/10/13(金) 20:02:40
>>380
もしかして以下のようなこと?
//--- foo.h ---
class C {
....
};
extern C c; // どこかにあるグローバル変数cを参照するための宣言
//--- foo.c ---
C c; // グローバル変数cの実体を定義
//----aaa.c---
#include "foo.h"
void func_a()
{
c.meber_func1(100); // cにアクセス
}
//----bbb.c---
#include "foo.h"
void func_b()
{
c.meber_func2(); // cにアクセス
}
上の例はオブジェクトcをグローバル変数で定義しているから改めて生成はしていないけど、
グローバル変数としてCのポインタを定義、宣言するなら、オブジェクトの生成(c = new C)は
aaa.cでもbbb.cでもOK.
414
名前:
デフォルトの名無しさん
:2006/10/13(金) 20:44:21
シングルトンって結局グローバル変数なんじゃないの
カッコいいネーミングしてるが。
っと使ったこと無いが言ってみる
415
名前:
デフォルトの名無しさん
:2006/10/13(金) 20:48:45
シングルdはクラスとインスタンスが必ず1:1の関係になる設計じゃね?
っと使ったこと無いが言ってみる
しかしEffectiveC++ホントに面白いな
ここ数日必携の書になってる(*´ω`)
416
名前:
デフォルトの名無しさん
:2006/10/13(金) 20:54:44
必要があれば複数のインスタンスを生成することも可能なのがSingletonの利点の一つ。
417
名前:
デフォルトの名無しさん
:2006/10/13(金) 21:09:37
>>414
グローバル変数は生成されるタイミングを制御しにくい。
A a;
B b;
で、a のコンストラクタが b を使いたいときなど。
418
名前:
デフォルトの名無しさん
:2006/10/13(金) 21:24:07
Modern C++ DesignのSingletonはいくらなんでも
ライブラリ利用者疑いすぎじゃないかって思えてくるな。
419
名前:
デフォルトの名無しさん
:2006/10/13(金) 21:28:14
atexitに登録された関数から使われたらまずいかも、とか考えてたんだっけw
420
名前:
デフォルトの名無しさん
:2006/10/13(金) 22:45:19
なんか人が書いたソースを見てると、
::AfxBeginThread(略);
みたいな書き方で関数を使ってる部分があるんですが、「::」の意味がわかりません。
こういうのって左側にクラス名も書くものじゃないんですか?
421
名前:
デフォルトの名無しさん
:2006/10/13(金) 22:50:18
ああ、なにも書かないと一番外側
422
名前:
デフォルトの名無しさん
:2006/10/13(金) 22:50:21
namespaceに入っていないグローバルスコープな関数を呼んでる。
(でも多分実際はVSのインテリセンスを動かすため)
423
名前:
デフォルトの名無しさん
:2006/10/13(金) 23:00:02
いや、MFCがWin32APIと同名のメンバ関数作りまくるんで、APIのほうを明示的に呼ぶときには::つきで書く習慣がある。
424
名前:
420
:2006/10/13(金) 23:00:41
大体わかりました。「::」は書かなくてもいいけど、
書いた方が明示的になるし入力候補も出るから便利ってことですね。
425
名前:
デフォルトの名無しさん
:2006/10/14(土) 00:05:19
>>420
書かなきゃならん場合もある。てか、予めそーゆー事態も想定しての明示。
426
名前:
デフォルトの名無しさん
:2006/10/14(土) 00:06:06
>>424
違う。
427
名前:
デフォルトの名無しさん
:2006/10/14(土) 00:08:50
>>420
は namespace を理解できていない気がする。
428
名前:
デフォルトの名無しさん
:2006/10/14(土) 00:17:33
>424
名前解決のやり方が変わるので、明示的にグローバルな名前空間の
関数を呼びたいときはこうすべき。
429
名前:
デフォルトの名無しさん
:2006/10/15(日) 13:36:07
質問です。
仮想関数を持つクラスにはvtblなどの隠れたデータが挿入されますよね?
で、純粋仮想関数をもつクラスには挿入されないと思いますが、それを継承したクラスには必ず隠れデータが挿入されてしまいますか?
430
名前:
デフォルトの名無しさん
:2006/10/15(日) 13:42:02
>>429
純粋仮想関数を持つクラスにも vtable は要るよ。
431
名前:
デフォルトの名無しさん
:2006/10/15(日) 13:48:30
インスタンス化されないのにですか?
432
名前:
デフォルトの名無しさん
:2006/10/15(日) 13:56:02
>>431
継承されたクラスのインスタンスには基底クラスのインスタンスが含まれる。
433
名前:
デフォルトの名無しさん
:2006/10/15(日) 14:00:49
多重継承の仕組み教えて。
434
名前:
デフォルトの名無しさん
:2006/10/15(日) 14:03:43
なるほど。
では、純粋仮想関数と普通の関数のみを持つクラスにはvtableは挿入されないという解釈は正しいですか?
435
名前:
デフォルトの名無しさん
:2006/10/15(日) 14:26:29
>>434
普通の関数の有無に関係なく、(純粋でも、そうでなくても)仮想関数があればvtableは必要でしょ。
436
名前:
デフォルトの名無しさん
:2006/10/15(日) 14:28:56
つ C++STD 10.4
純粋仮想関数を特別扱いする規定は無さそうだから、普通の仮想関数と
同じように扱う必要があるんじゃね?
実際は(vtbl含めて)実装次第だと思うけど。
というか、何でそんなにこだわるのかわからん。
437
名前:
デフォルトの名無しさん
:2006/10/15(日) 14:33:03
実装系に依存するやろ。
vtableは仮想関数(広く言うとメンバ関数)の実装方法だから。
つか
>>429
で「隠れた」って自分でいうとるやないか。
アホじゃね?
438
名前:
デフォルトの名無しさん
:2006/10/15(日) 14:55:27
えーと、派生させる予定のないクラスA,Bがありましてそれらの共通するインターフェースを純粋仮想関数をもつクラスIとしてくくりだそうと思ったのです。
このときA,BをそれぞれIから継承したとすると自動的にA,Bも仮想クラスになってしまうのかと思ったのです。
つまり本来必要ない無駄なオーバーヘッドが生じてしまうのではないのかと思いまして、質問した次第です。
439
名前:
デフォルトの名無しさん
:2006/10/15(日) 15:00:06
それならテンプレートでいいのでは?
440
名前:
デフォルトの名無しさん
:2006/10/15(日) 15:03:12
A, Bを実行時多相で扱いたいならvtblのコスト払うのは至極真っ当
A, Bに実行時多相が必要なく単に共通の実装を括り出したいだけなら
vtblのコストを払わずに実装を括り出す方法は他にたくさんある
441
名前:
デフォルトの名無しさん
:2006/10/15(日) 15:10:39
分かりました。違う方法を考えてみます。
テンプレートってのは派生クラスをテンプレート引数にして基底クラスに渡せってことでしょうか。んで基底クラスを派生クラスにキャストすると。なるほど。
442
名前:
デフォルトの名無しさん
:2006/10/15(日) 15:18:59
だから多態したいのは実行時なのかコンパイル前なのかと。
443
名前:
デフォルトの名無しさん
:2006/10/15(日) 15:20:28
>>441
キャストが必要になった時点で何かおかしいと気付くように。
444
名前:
デフォルトの名無しさん
:2006/10/15(日) 15:22:12
>>441
その方法だとインターフェースの継承には向かないと思うよ。
445
名前:
デフォルトの名無しさん
:2006/10/15(日) 15:24:55
thisを派生クラスのポインタ型にstaticキャストしてインターフェースクラスから派生クラスのメンバ関数を呼び出せばよいのではないでしょうか…boostの何かでこんな実装をしてた気がします。
446
名前:
デフォルトの名無しさん
:2006/10/15(日) 15:28:36
こんにちは。Visual Studio 2005 Visual C++ express editionを使っています
#include <iostream>
using namespace std;
int main()
{
int num;
int sum = 0;
cout << "いくつまでの合計を求めますか?\n";
cin >> num;
for(int i=1; i<=num; i++){
sum += i;
}
cout << "1から" << num << "までの合計値は" << sum << "です。\n";
return 0;
}
上記コードがビルドできないんですが何故でしょうか?
447
名前:
デフォルトの名無しさん
:2006/10/15(日) 15:32:27
>>445
それは、インターフェースじゃないでしょ。
見かけ上の基本クラスから派生クラスのメソッドを呼び出すだけなら
それでもいいよね。
448
名前:
デフォルトの名無しさん
:2006/10/15(日) 15:32:53
エラーメッセージを貼れとママに言われなかったかい?
449
名前:
446
:2006/10/15(日) 15:33:04
エラーメッセージは下記です。
Sample34.cp
error C3872: '0x3000': この文字を識別子で使用することはできません
error C2146: 構文エラー : ';' が、識別子 ' ' の前に必要です。
error C2065: ' ' : 定義されていない識別子です。
どなたか原因の分かる方がいればお願いいたします
450
名前:
デフォルトの名無しさん
:2006/10/15(日) 15:36:46
>>447
ああ、そっか。インターフェースっていうからまずかったのですね。すいません。
要は実行時のコストなしで共通する実装を括り出したいだけだったんです。煩わしい言い方してすいませんでした。
iterator_facadeでした今思い出しました。解決しました。
451
名前:
デフォルトの名無しさん
:2006/10/15(日) 15:39:27
全角空白が入っている。エラーメッセージにも書いてあるよ。
なれないうちはエラーメッセージが出たというだけで、
何か分からないことが起きているとすぐ諦めがちだが、
とりあえずメッセージをよく読む習慣をつけるべし。
そのうち分かるようになるよ。
452
名前:
デフォルトの名無しさん
:2006/10/15(日) 15:41:24
ここは本当に役に立たないインターネットですね
453
名前:
デフォルトの名無しさん
:2006/10/15(日) 15:43:59
ダメな奴にはどんな情報も役に立たないからな
454
名前:
デフォルトの名無しさん
:2006/10/15(日) 15:49:02
>450
ポリシークラス使え
protected 非仮想デストラクタにするのを忘れるなよ
455
名前:
デフォルトの名無しさん
:2006/10/15(日) 15:49:27
>>451
446
ありがとうございます!
何度見てもおかしな点がなかったので途方に暮れていたのですが、全角が入っていたとは・・・
エラーメッセージの読み方がまだわからないので、これから勉強したいと思います
ありがとうございました
456
名前:
デフォルトの名無しさん
:2006/10/15(日) 15:50:58
>452
馬を水飲み場まで連れて行くことはできるが水を飲ませることはできない
457
名前:
デフォルトの名無しさん
:2006/10/15(日) 15:59:31
>>454
共通する実装を派生クラスにして異なる実装をポリシーとして渡してそれを基底にするってことですか?
実はコンストラクタが異なるので派生クラスにしないといけないんですよ…う〜む。
458
名前:
デフォルトの名無しさん
:2006/10/15(日) 17:26:21
>>456
「ミネラルウォーターじゃなきゃヤダ!」とか言って
そっぽ向く馬もネットにはたくさん居るしな。
459
名前:
デフォルトの名無しさん
:2006/10/15(日) 17:38:53
template < class _Policy > class Interface
{
public:
void F()
{
policy_.F();
}
private:
_Policy policy_;
};
class Policy
{
public:
void F(){ /* impl */ };
};
こんなの?
>>454
protected 非仮想デストラクタにするのを忘れるなよ
ってのがよくわからんのだが。
460
名前:
デフォルトの名無しさん
:2006/10/15(日) 17:51:56
>459
Policy クラスを継承することを想定しているんでしょう
継承する場合,459のような例ではEBCOが効く可能性があるという利点があります
461
名前:
デフォルトの名無しさん
:2006/10/15(日) 18:22:28
template < class _Policy > class Interface :private _Policy
{
public:
void F()
{
_Policy::F();
}
};
class Policy
{
protected:
~Policy(){ /*ぷろてくてっどっと。*/ };
public:
void F(){ /* impl */ };
};
継承すれば最適化されてPolicyクラスが0Byteになることがあるよってことね
>>459
462
名前:
デフォルトの名無しさん
:2006/10/15(日) 18:27:37
EBCOなんか聞いたことないぜー
ググっても出ないし。
流れからするとEmptry byte class optimizationとかそんなの?
463
名前:
デフォルトの名無しさん
:2006/10/15(日) 18:29:38
_Policy はマズイな。
464
名前:
デフォルトの名無しさん
:2006/10/15(日) 18:30:12
>>462
Empty base class optimization
465
名前:
デフォルトの名無しさん
:2006/10/15(日) 18:34:41
>>464
トン
再びググってみる(・∀・)
466
名前:
デフォルトの名無しさん
:2006/10/15(日) 18:55:47
>>461
みたいな書き方どっかで見かけて
何で継承してるんだろうとか思ってたけど、そういうことだったのか…。
467
名前:
デフォルトの名無しさん
:2006/10/15(日) 18:59:16
どっかで見たことあるなーと思ったらEffectiveC++に書いてあるんね
身についてねえ('A`)
468
名前:
デフォルトの名無しさん
:2006/10/15(日) 19:11:18
>>465
empty base optimization, EBO ともいう。つーかEBOで覚えてた。
どっちの名前も使われてるっぽいね。
469
名前:
デフォルトの名無しさん
:2006/10/15(日) 19:32:53
strlenとかprintfとかはstd名前空間に入ってるのに
assertが入ってないのはなぜなんだぜ?
マクロとかそういうオチですか?
vc8だとstd::assertでエラーだった。
gcc3.2だと通ったけど。
470
名前:
454
:2006/10/15(日) 19:36:01
>457
>461
のことですな。詳細はModern C++ Design参照。
カスタマイズポイントをユーザーに提供しないんだったら
単純に包含でもいいかもね?
ポリシークラスてそんなにマイナーだっけ?
>460
いや、「実行時のコストなしで共通する実装を括り出したいだけ」
つうてるから忠告しただけ。
何も言わなかったら非仮想publicデストラクタを使いそうだからね。
詳しくは C++ Coding Standards参照
471
名前:
デフォルトの名無しさん
:2006/10/15(日) 19:41:13
>>469
assert() はマクロ。 std::assert() は不正。
472
名前:
デフォルトの名無しさん
:2006/10/15(日) 22:53:29
ポリシークラスっていう「名前」がマイナーなんじゃね
MC++D前から同じようなのはいっぱいあった
473
名前:
デフォルトの名無しさん
:2006/10/15(日) 22:54:34
>>469
#include <cassert>
でstd名前空間にあった気がする
474
名前:
デフォルトの名無しさん
:2006/10/15(日) 22:54:45
名は体を表す って言うしな
475
名前:
デフォルトの名無しさん
:2006/10/15(日) 22:58:07
>>473
デマを流すな。確認してから書け。
476
名前:
デフォルトの名無しさん
:2006/10/15(日) 23:01:18
画像処理プログラムを組んでいます。
ビットマップを読み込む自作クラスに
class Bitmap
{
public :
bool readBmp( string str ) {}
bool writeBmp( string str ) {}
};
のような感じでファイルを読み込む関数を作っていますが、ファイルの読み込みエラーが起きたときに
上記のような感じでbool型のfalseを返すか、例外をthrowするかで悩んでいます。
どっちでもいいっちゃどっちでもいいんですが、どうしても気になって・・・。。。
bool型を返すと
Bitmap pic;
bool flag;
do {
flag = pic.readBmp( "xxx.bmp" );
}
while( !flag );
のような感じでファイルが読み込めるまで繰り返す、という処理をかけるのですが、
こういった記述は例外処理でも可能でしょうか?
※"xxx.bmp"は、他のプログラムでも使用していて、読み込みのタイミングによってはロックされているため
477
名前:
デフォルトの名無しさん
:2006/10/15(日) 23:04:00
>472
ヒドス
boostでも使われているのに
ttp://www.boost.org/more/generic_programming.html
478
名前:
デフォルトの名無しさん
:2006/10/15(日) 23:05:00
>>476
for(;;) try { pic.readBmp( "xxx.bmp" ); break; } catch (...) {}
479
名前:
デフォルトの名無しさん
:2006/10/15(日) 23:05:58
>>475
すみません、VC8の環境でですが、
cassertヘッダの内部では
assert.hをインクルードしてるだけでした。
よって、std名前空間には入りません
480
名前:
デフォルトの名無しさん
:2006/10/15(日) 23:06:01
>>476
「なんでビットマップにファイルが関係するの?」という些細な問題は端に追いやってしまったわけね
とりあえず俺なら例外を発生させる
わざわざ例外機構があるのに利用しないで条件分岐で対応するのは分が悪い
481
名前:
476
:2006/10/15(日) 23:06:46
>>478
ありがとうございます!
それでやってみます
482
名前:
デフォルトの名無しさん
:2006/10/15(日) 23:07:52
>>479
根本的に、 assert() はマクロだから名前空間に入れることができない。
>>471
で FA 。
483
名前:
デフォルトの名無しさん
:2006/10/15(日) 23:08:55
>>478
せめて必要な例外だけをcatchするようにしようよ……。
484
名前:
478
:2006/10/15(日) 23:11:07
>>483
俺に言うな。必要な例外は
>>476
本人しか知らない。
485
名前:
476
:2006/10/15(日) 23:11:48
>>480
他にいい設計の仕方があれば助言をお願いします。
自分としては、Bitmapを扱う際には当然、ファイルから読み込む機能がないと不便だと思ったのですが・・・
486
名前:
デフォルトの名無しさん
:2006/10/15(日) 23:12:07
>>475
俺もstd::assertで使った記憶がある…
何でだろ…
487
名前:
476
:2006/10/15(日) 23:13:31
>>438
,478
ケンカしないで;;
もちろん例外は必要なものだけ実装します
488
名前:
デフォルトの名無しさん
:2006/10/15(日) 23:14:01
>>485
readBmp() の中でループまわせ。
489
名前:
476
:2006/10/15(日) 23:14:25
あっ、↑の
>>438
は
>>483
の間違いです。。。
490
名前:
476
:2006/10/15(日) 23:17:08
>>488
それだと、ファイルが読み込めなかったときの処理が
読み込むまでループ
に固定されてしまいます。
読み込めなかったときの処理もある程度制御したいので・・・
とりあえず例外を発生させる形で組んで見ます
491
名前:
デフォルトの名無しさん
:2006/10/15(日) 23:25:44
>>485
> 他にいい設計の仕方があれば助言をお願いします。
> 自分としては、Bitmapを扱う際には当然、ファイルから読み込む機能がないと不便だと思ったのですが・・・
そりゃ当然ファイルから読み込める機能がなきゃ不便に感じる。
でもそれをそのまま実現する必要は無いだろ?
今のBitmapクラスを説明すると次の様になる。
・Bitmap.readBmp(str)=ビットマップがファイル:strから読み込む
・Bitmap.writeBmp(str)=ビットマップがファイル:strに書き込む
本来ビットマップは「Bitmapped data」だけを専門にすればいいだけで、
こういった雑事はBitmapのCreatorさんが担うべき仕事だと俺は思うわけ
つまり
・Bitmap ('utility' , 'createBitmap' , str ) : 'utility'がファイル:strからBitmapを作る
・('utility' , 'writeBitmap' , Bitmap , str) : 'utility'がBitmapをファイル:strに書き込む
みたいな
まぁ、それほど酷使しないつもりならこのままでも悪くは無いかもね、という小さなこと。
492
名前:
デフォルトの名無しさん
:2006/10/15(日) 23:46:38
>>491
わざわざ複雑度を上げることも無い。 YAGNI ってやつだ。
493
名前:
デフォルトの名無しさん
:2006/10/16(月) 00:06:21
>>492
ぉぅぃぇ
まあ小さなことだし、ぶつかって機能分割するのもよしかと思ってる
494
名前:
デフォルトの名無しさん
:2006/10/16(月) 00:19:06
めんどいときこそテンプレートで表現してしまうけどな。
template<IT >
Bitmap::readBmp(IT first,IT last) {}
file_bitmap.readBmp(file::iterator i,file::iterator end);
stream_bitmap.readBmp(&str[0],&str[0] + sizeof(str));
495
名前:
476
:2006/10/16(月) 00:51:19
>>491-494
ありがとうございます。
まだC++使いこなしているわけではないので、とりあえずBitmap::readBmp()で実装してみて、
使いにくいようなら
>>491
さんの助言を参考にしてみます
496
名前:
デフォルトの名無しさん
:2006/10/16(月) 03:15:56
char *x = new char[100];
// hogehoge
for (int i = 0; i < 100; ++i)
delete &x[i];
こんな感じに配列として確保したメモリを要素ごとに開放した場合、
正規の動作が保障されるのでしょうか?
サンプルコードを書いて試してみたところ、vc2005では特に問題なく
動いた(ように見える)のですが、やはりdouble deleteされているのでしょうか?
497
名前:
デフォルトの名無しさん
:2006/10/16(月) 03:20:16
未定義
newはdelete
new T[]はdelete[]
これ以外は鼻から悪魔
498
名前:
デフォルトの名無しさん
:2006/10/16(月) 03:32:38
掛かってる梯子の途中を無くしたらどうなるんだろうな?
499
名前:
デフォルトの名無しさん
:2006/10/16(月) 03:41:14
サードパーティーのヘッダーファイルと、
社内のヘッダー内でのtypedefを使った型定義が衝突して困ってます。
1.解決方法として社内ヘッダー側で、
サードパーティー側のヘッダーファイル内にdefineされているマクロシンボルを
チェックして定義を回避する。
しかし、相互チェックではないので、ヘッダーのインクルード順に気を使う必要がある。
2.社内用のヘッダーをnamespaceで囲い、
内部を参照する時はスコープ解決演算子を伴って使用する。
しかし、C用のソースで使用できない。
これぐらいしか対処法が思い浮かばないのですが、他に良い解決方法はないでしょうか?
500
名前:
デフォルトの名無しさん
:2006/10/16(月) 03:42:55
自社製の方を他の型にtypedefして元の型をundefする。
■過去ログ置き場に戻る■
1-
前250
次250
最新50
DAT2HTML
0.33f Converted.