08/06/20 01:48:50
>>329
無理。外側の ClassA の定義が必要。 ClassA の中で class InnerClassA; としてあれば
InnerClassA の定義は必要ない。
332:デフォルトの名無しさん
08/06/20 08:20:45
>>315
>D* を B* としてアクセスするのは、規格の 3.10 p15 にあるエイリアスの制約に
>違反するので、未定義動作。
普通のアップキャストだからOKじゃないの?
333:332
08/06/20 08:34:45
332は>>315じゃなくて>>330だった。
なおModern C++ Designでは、
仮想継承でなければstatic_castによる
アップキャストは問題ないとなってた。
規格でどうなってるかは知らない。
334:332
08/06/20 09:16:06
>>330
もしかして static_cast<B**> がダメってことですか?
335:330
08/06/20 09:30:49
>>332
ごめん。まぎらわしいね。
「D* に B*& でアクセスするのは、~」ってことで、少しは伝わりやすいかな、と。
336:デフォルトの名無しさん
08/06/20 13:36:27
C++ の仕様では sizeof(B*) != sizeof(D*) の処理系もありえるのかな。
337:デフォルトの名無しさん
08/06/20 15:16:43
クラスが違うとポインタサイズも違うのか・・・?なんという
338:デフォルトの名無しさん
08/06/20 16:08:14
class XをSTL準拠にするため自作イテレータを作ろうと
operator++( X* x )みたくしたら
「クラス型パラメータがひとつもありません」と怒られました。
ハーバートシルト先生のSTL標準講座を読んでも解決法が書いてありません。
っていうか自作STLの書き方なんて載ってないし。
もうだめです。さようなら。
339:デフォルトの名無しさん
08/06/20 16:56:07
はい、さようなら。
340:デフォルトの名無しさん
08/06/20 17:37:07
using namespace std;という呪文が書いてある他人の作ったヘッダ(hoge.hh)をインクルードするのが気持ち悪かったので、
>hogehoge.hh
namespace hogehoge{
#include "hoge.hh"
};
>hogehoge.cc
#include "hogehoge.hh"
……
ってやったらhoge.hhの中でhogehoge::stdをさがしにいきやがったのが納得いかないんですが、
using namespace std;っていうのはstdをグローバルスコープにする命令じゃないんですか?
341:デフォルトの名無しさん
08/06/20 17:52:33
違うよ。
現在の名前空間から見てstd::以下にあるシンボルを現在のスコープにロードする命令だよ。
ちなみに、名前空間のなかから普通の"std"を読み込みたいなら
using namespace ::std;
とする必要がある。
342:デフォルトの名無しさん
08/06/20 18:11:09
>>338
ポインタで横着しようとしないで、イテレータ用のクラスを作る。
343:デフォルトの名無しさん
08/06/20 18:16:56
>>340
hogehoge::stdを探しにいったってことは、
hoge.hh内に namespace std {...} があるのか・・・。
using namespace std;で飽き足らず、
std空間にユーザー定義を追加するとは、不届きなヘッダだなw
とりあえず、
>hogehoge.hh
namespace hogehoge {
namespace std { using namespace ::std; } // これを追加
#include "hoge.hh"
};
しておけばおk。
344:343
08/06/20 18:54:47
あ、hoge.hhにstd系のincludeがあったら駄目か・・・。
345:デフォルトの名無しさん
08/06/20 19:01:52
>>341
うむむ、namespaceは奥深いですね。
>>343
namespace stdは見つかりませんでした。。。
あと、その行を追加してもhogehoge::stdを探しに行ってるように見えます。。。
一番簡単なのはヘッダのusing namespace std;の行を削除することなんだろうけど、
ファイルの上の方のコメントみたらcopyrightとか書いてあるし……
諦めて裸のままインクルードして使うことにします。
ありがとうございました。
346:デフォルトの名無しさん
08/06/21 13:11:25
>>344-345
hoge.hhの中にincludeがあるなら、
それを先にincludeしとけば良いんじゃね?
インクルードガードで無視されるから。
例えば #include <vector> があるなら↓のように。
#include <vector>
namespace hogehoge {
namespace std { using namespace ::std; }
#include "hoge.hh"
};
347:デフォルトの名無しさん
08/06/22 23:55:19
定数を指定するとき、C言語では#defineを使いましたが、
C++ではconstな変数を使え、とモノの本に書いてありました
ところで、定数がint型で何個も欲しいのですが、
列挙型の列挙子で代用するのはアリでしょうか?
348:デフォルトの名無しさん
08/06/23 00:09:47
>>347
どれくらいの個数かにもよるかもしれないけど、
列挙子で代用(?)している入門書は結構ある。
349:デフォルトの名無しさん
08/06/23 00:28:08
#define 使うなってのは、型だとか副作用だとかエラーメッセージだとかだから
enum なら問題ないと思うよ
350:デフォルトの名無しさん
08/06/23 00:30:07
配列の添え字に使いたかったんです
単なる数字より、文字のほうが読みやすいですし
ありがとうございました
351:デフォルトの名無しさん
08/06/23 00:34:33
>>347
なんで数が増えたら enum で代用するなんてことになるの?
意味が違うだろ。
352:デフォルトの名無しさん
08/06/23 00:37:28
連番なら enum だね。
353:デフォルトの名無しさん
08/06/23 00:46:05
>>351
いや、0から始まる連番なもんで
354:デフォルトの名無しさん
08/06/23 00:50:15
>>353
それなら代用じゃなくて enum が正解。逆に int const で用意するほうがありえない。
355:デフォルトの名無しさん
08/06/23 03:11:09
すみません.
ここでする質問ではないかも知れませんが.
C++でMPEG2を取り扱うプログラムを作らなくてはならなくなりました.
MPEG2を扱うにはどのようなlibraryを使わなければならないでしょうか?
またそのマニュアルが詳しく掲載しているサイトを教えてくれません?
Directshowは抜きでお願いします.
356:デフォルトの名無しさん
08/06/23 03:25:18
ffmpegでヤフれ
ただしMPEG2特許の利用ライセンスは自分でとってね!
357:デフォルトの名無しさん
08/06/23 16:44:37
VC++環境です。STLのlistについて質問です。
あるlist(Aとする)の情報をまるまる別のlist(Bとする)にassign()で写したのち、
Aのある位置を指しているイテレータをそのままBで使いたい
(Aで指していた位置にある情報を指させたい)
のですが、方法を探しても見つかりません。
アルゴリズムのfind()以外で何か方法はありますか?
358:デフォルトの名無しさん
08/06/23 17:13:09
>>357
std::distance(), std::advance()
ただ、listだとランダムアクセス出来ないから
一応それぞれO(n)で、セットでO(2n)になる。
まぁとんでもない要素数でない限り一瞬だろうけど。
359:デフォルトの名無しさん
08/06/23 17:18:01
listはアクセスするだけでもメモリの中を不規則な順序で飛び飛びするので、平均の次の要素へのアクセス速度は
要素が連続しているvectorよりも遅い。
360:デフォルトの名無しさん
08/06/23 17:24:45
>>357->>359
頭からの距離で考える発想は思いつきませんでした。
要素も少なく、実際に動かしてみても一瞬で処理できました。
ありがとうございました。
361:デフォルトの名無しさん
08/06/23 22:12:24
解決したようだが、
begin()~itとit~end()の2回に分けてコピーするのもいいな。
362:355
08/06/24 02:37:33
ffmpegをヤフりました.
MS-DOSで動くオープンソースの動画変換アプリなんですね.
ソースを見て参照方法を探れということですね?
これも方法の一つとしますが時間がかかるので,なにか他の方法はないでしょうか?
それと商用配布は考えていないのでライセンス申請の必要はありません.
363:デフォルトの名無しさん
08/06/24 03:12:10
いいえ、商用に限らず許可なく使うことは許されません。
364:デフォルトの名無しさん
08/06/24 07:35:29
特許権は、それを使ったものを製造、保管、流通することを制限することができるよ。
商用かどうかは関係ないよ。
詳しくは法務に聞こうね。
365:デフォルトの名無しさん
08/06/24 10:47:36
>>362
> MS-DOSで動くオープンソースの動画変換アプリなんですね.
違います。
> ソースを見て参照方法を探れということですね?
違います。
> これも方法の一つとしますが時間がかかるので,なにか他の方法はないでしょうか?
規格書読むより時間掛かりませんよ。
366:デフォルトの名無しさん
08/06/24 16:10:28
classのstaticメンバで、shortの配列があります。
例えば、
class hoge {
private:
static array[100];
};
となっていて、arrayの中身を
for(int i=0; i<100; i++){
array[i] = i*i;
}
のように初期化したいとします。
このよな作業はどの箇所で行えばいいでしょうか。
367:デフォルトの名無しさん
08/06/24 16:16:38
>>366
クラスの外で一回やっておけばよい。
main()が呼ばれる前に初期化される保証がある。
368:デフォルトの名無しさん
08/06/24 16:19:15
Singletonの問題のようにも思えるが
369:366
08/06/24 16:27:24
>>367
GCCですが、.cxxの先頭でやると怒られます。
src/hoge.cxx:24: error: expected unqualified-id before ‘for’
src/hoge.cxx:24: error: expected constructor, destructor, or type conversion before ‘<’ token
src/hoge.cxx:24: error: expected constructor, destructor, or type conversion before ‘++’ token
24: for(int i = 0; i < 100; i++){
370:デフォルトの名無しさん
08/06/24 16:28:58
#include <iostream>
class hoge {
private:
static int array[100];
static int flag;
public:
hoge() {
if (flag) {
for (int i = 0; i < 100; i++)
array[i] = i * i;
flag = 0;
}
}
void printa() const {
for (int i = 0; i < 100; i++)
std::cout << array[i] << ' ';
}
};
int hoge::flag = 1;
int hoge::array[100];
int main()
{
hoge h;
h.printa();
}
371:366
08/06/24 16:31:18
short* hoge::array = 0;
としておいて、constructorで
if(!array){
array = new short[100];
for(int i=0; i<100; i++){
array[i] = i*i;
}
}
でしょうか。それだと、いつdeleteするのでしょうか。
それとも、初期化フラグをメンバ変数に持っておいて、
それのtrue/falseでconstructorからfor文を呼び出す?
372:366
08/06/24 16:32:03
>>370
ということのようですね。
ありがとうございました。
373:デフォルトの名無しさん
08/06/24 17:22:54
どんな初期化をするかにも夜
コンストラクタとデストラクタは忘れないであげてくだちぃ
374:デフォルトの名無しさん
08/06/24 17:54:53
>>373
staticだからこの場合は無理なのよ
375:355
08/06/24 18:33:23
ffmpegのAPIを使ってMPEG2を読み込めということでしょうか?
現在mpeg2dec-0.4.1 とでどちらを使うか考えています.
両方の向き不向きについて何か教えてくれませんか?
376:デフォルトの名無しさん
08/06/24 18:49:21
C++相談室
377:355
08/06/24 19:53:12
すみません.
そうでした.完全にスレ違いになってしまいました.
去ります
378:デフォルトの名無しさん
08/06/25 00:49:33
C++って先頭からコンパイルしますよね
だから↓はコンパイルエラーになりますよね。
void main(){
int a=func(3);
}
int func(int x){
return x+5;
}
なのに、なぜ↓はコンパイルエラーにならないんでしょうか?
class cA{
public:
cA(){a=10;}
private:
int a;
};
379:デフォルトの名無しさん
08/06/25 00:50:14
C++って、単純な速さは他の言語と比較してどうなの?
380:デフォルトの名無しさん
08/06/25 00:56:45
>>378
そういう仕様に決まったから。
>>379
書き方や問題領域で当然変わってくるけど、大体Cと同じ。
381:デフォルトの名無しさん
08/06/25 00:58:44
ていうことは、C++のコンパイラは場合によっては、
読む場所を行ったり来たりしうるんですね
ありがとうございました
382:デフォルトの名無しさん
08/06/25 02:00:09
>>378
正確に述べると、クラス定義の中に関数定義を書くと、
そいつはクラス定義の終わった後に、inline付で定義されたものとして扱われるということになる。
383:デフォルトの名無しさん
08/06/25 02:15:49
クラス宣言じゃないのか。
384:デフォルトの名無しさん
08/06/25 07:37:29
定義。
385:デフォルトの名無しさん
08/06/25 07:51:00
クラス宣言って外部でメンバ関数の定義をしたりあと前方宣言
の時に使われる物?
386:デフォルトの名無しさん
08/06/25 08:26:28
クラスそのものを後方定義というやり方にも使う。
387:デフォルトの名無しさん
08/06/25 09:26:57
template<typename T> struct base{
typename T::X test(){ return typename T::X(); }
};
struct A : base<A>{
struct X{}
};
継承するクラスのテンプレートに継承するクラス自身を渡して、
継承するクラス内の型を基底型で使いたいのですが不可能でしょうか?
388:デフォルトの名無しさん
08/06/25 10:55:21
>>387
全く問題ない。
389:デフォルトの名無しさん
08/06/25 11:27:40
>>387
弾かれました
template<typename T> struct base{
typename T::X test(){ return typename T::X(); } <-error C2039: 'X' : 'A' のメンバではありません。
};
struct A : base<A>{
struct X{}
};
390:デフォルトの名無しさん
08/06/25 13:48:24
struct X {};
struct A { void add( X* x ); };
X* x = new X;
A a;
a.add( x );
A のオブジェクトは A::add() で追加した X のオブジェクトを delete する義務があります。
この場合 A::add() が失敗して例外を投げるとき A::add() は x を delete するべきでしょうか?
普通、関数が例外を投げるときその関数が何もしなかったことにするのが理想だと思いますが
delete したほうが便利な場合も多いと思うのですが。
391:デフォルトの名無しさん
08/06/25 14:02:32
すべきでないと思う
auto_ptrを使えばどうか
struct A{ void add(std::auto_ptr<X> x); };
std::auto_ptr<X> x(new X);
A a;
a.add(x);
392:デフォルトの名無しさん
08/06/25 20:30:13
>>390
391に同意。
a.add(x)に渡すxはnewしないといけないという変な制約が発生してしまうから。
393:デフォルトの名無しさん
08/06/25 20:45:33
boost の shared_ptr のコンストラクタや ptr_container の追加関数は
確か失敗したら delete される設計になってた。
394:デフォルトの名無しさん
08/06/26 02:56:30
>>390
そのインターフェースなら a.add(new X) したくなりそうだから、 delete したほうがいいと思う。
395:デフォルトの名無しさん
08/06/26 20:01:08
>>393
スマートポインタと一緒にしちゃだめでしょ。
>>394
X x;
a.add(&x)で落ちてもいいんだね。
396:デフォルトの名無しさん
08/06/26 20:08:30
>>395
boost::ptr_vector
397:デフォルトの名無しさん
08/06/26 20:27:03
C++で動く、フリーなライセンスの行列演算ライブラリはありませんか?
398:デフォルトの名無しさん
08/06/26 21:13:04
boost
399:デフォルトの名無しさん
08/06/26 21:34:13
boost::uBLASな
400:デフォルトの名無しさん
08/06/27 00:34:47
boost::uBLASってパフォーマンスより安全性とかを優先してて遅いとか、
書かれてるけど、実際どうなん?
401:デフォルトの名無しさん
08/06/27 00:48:54
boost::numeric::ublasは遅くないぞ
パフォーマンス表も書いてある
URLリンク(boost.cppll.jp)
402:デフォルトの名無しさん
08/06/27 01:02:54
liboctaveより遅いけどな
403:デフォルトの名無しさん
08/06/27 01:07:56
そうかもしれんがBlitz++のように途中で更新停止したり
するのが怖い
boostならまずそういう事はないだろうし
404:デフォルトの名無しさん
08/06/27 01:25:54
確かに。メンテされ続ける安心ってのは大事だな。
405:デフォルトの名無しさん
08/06/27 01:56:56
Program Optionsとか放置されてて酷いけどな。
一度使おうとして、あまりにも酷い出来で、ワイド文字対応がなってなかったんで、あきらめた。
内部的には全部マルチバイト文字にしてやがる。
そのため、ワイド文字でデフォルト値とか設定しようとするとコンパイルエラー。
少しいじって、utf16からutf8に変換するようにしてやれば動くが、
わざわざそんなことするぐらいなら、自前で書いたほうがいい。
ありゃ絶対に、一文字は絶対に一バイトで、しかも7bitに収まるって前提の南蛮人の書いたコードだ。
406:デフォルトの名無しさん
08/06/27 02:19:23
progressbarは?
407:デフォルトの名無しさん
08/06/27 03:59:44
>>401
ありがとうございました。
ありがとうございました。
ありがとうございました。
408:デフォルトの名無しさん
08/06/27 07:53:35
>>395
> A のオブジェクトは A::add() で追加した X のオブジェクトを delete する義務があります。
これが前提じゃないのか? new してないものは最初から渡せないだろ。
409:デフォルトの名無しさん
08/06/27 08:08:55
「渡せない」と「渡さない」の違い
410:デフォルトの名無しさん
08/06/27 09:33:28
すみません。boost::numeric::ublasを教えていただいた者ですが、
vc8でdebugモードとreleaseモードで結果が異なり、debugモードでのみ正常に動作します。
使用しているboostは1.34ですが、これにはバグがあるんでしょうか?
面倒なのでアップデートしたくないのですが・・・。
boostコード中で警告4267と4244が出てくるのでboostが原因かもしれませんが把捉しかねる状態です。
ご教示願います。
411:デフォルトの名無しさん
08/06/27 10:59:43
URLリンク(engineering.meta-comm.com)
1.34.1で悪いけど。
結構厳しいね。
412:デフォルトの名無しさん
08/06/27 12:45:56
>>397
俺はliboctave使ってたよ
もう遅いかもしれないけど…
413:デフォルトの名無しさん
08/06/28 21:07:42
C++ 始めたばっかなんですが、
this はなんでポインタなんでしょうか
せっかく参照というものがあるのに...
そんで、今日は C++ のオブジェクトが自身への参照を
self という名前で持てるようにいろいろがんばってました。
具体的には、そのクラスを継承したらクラス定義の中で self が使えるようなクラスを作ろー...と思ってたんですが、うまくいかず。
結局
#define self (*this)
しか思いつきませんでした orz
こういうんじゃなくって、ちゃんと自分自身への参照をメンバ変数にもつオブジェクトは作れないのでしょうか。
414:デフォルトの名無しさん
08/06/28 21:18:51
>>413
別の表記方法がないなら*thisでいいじゃん。表現に揺らぎがなくて結構なことじゃないか。同じものをいろんな名前で表現させるほうが混乱するんでないかい?
size length len count distance 同じ意味だったり違った忌みだったり混乱するね。
415:デフォルトの名無しさん
08/06/28 21:25:04
>>413
昔、this = malloc(1); てな構文があったんだよ
416:デフォルトの名無しさん
08/06/28 21:29:05
>this はなんでポインタなんでしょうか
thisが C with Classes に導入されたときには参照はまだなかった
417:デフォルトの名無しさん
08/06/28 21:31:11
JavaからC++への移行は推奨しません。
418:デフォルトの名無しさん
08/06/28 21:47:59
selfってことはJavaじゃないと思う
419:デフォルトの名無しさん
08/06/28 21:50:43
Object Pascalだね。
420:デフォルトの名無しさん
08/06/28 21:51:42
C++ではboostはデフォなのか?
421:デフォルトの名無しさん
08/06/28 21:51:52
現代版#define BEGIN {ですね、わかります。
422:デフォルトの名無しさん
08/06/28 21:58:28
>>420
一部はデフォになりつつある。
まあ、知って損はない。俺も最近使い始めた。今まで知らなくてずいぶん損したと思う。
423:デフォルトの名無しさん
08/06/28 21:59:31
>>420
中にはそういう人間もいる(俺もその1人だがな)。
当然、すべての人間にとってそうとは限らない、いつだって使えるとは限らないから、
Boostデフォを妄信するのは危険。使えないときは反動でだるくなる。
424:440
08/06/28 22:49:03
>442
勉強しておくよ。
GCとか便利そうだし
>443
仕事の場合だと、使えない場合が多そうだな。
425:デフォルトの名無しさん
08/06/28 22:50:24
今テレビでターミネーター2やってるよね。
未来から来たって話。
426:デフォルトの名無しさん
08/06/28 22:59:36
>>424
440基準でも未来レスかよw
427:デフォルトの名無しさん
08/06/28 23:01:52
Testってクラス書くとして
Test.cppとTest.h用意?
Test.cxx作ってそこに全部記述?
428:デフォルトの名無しさん
08/06/28 23:02:56
Testを他で使うなら.hも作っとけ
429:デフォルトの名無しさん
08/06/28 23:05:05
Test.hppにテンプレートクラスでイナフ
430:デフォルトの名無しさん
08/06/28 23:11:42
hppだとどういうコーディングルールがベスト?
サンプルないかな?
431:デフォルトの名無しさん
08/06/28 23:14:01
boost
432:デフォルトの名無しさん
08/06/28 23:14:07
>>426
意味不明だよ。
433:デフォルトの名無しさん
08/06/28 23:15:01
IDテスト
434:デフォルトの名無しさん
08/06/28 23:16:10
>>430
hppでの例
URLリンク(www.boost.org)
ベストかどうかは・・・分からんけど。
435:デフォルトの名無しさん
08/06/28 23:17:05
>>432
424 :440 [sage] :2008/06/28(土) 22:49:03
>442
勉強しておくよ。
436:デフォルトの名無しさん
08/06/28 23:18:40
>>434
オペレータの定義だけ外だし?
437:413
08/06/29 04:39:41
>>414
はっきりいってネタですw
でもthisが参照じゃないのは何でやろー && 参照だったら
Foo& Foo::operator=(const Foo& rhs) {
this.bar = rhs.bar;
return this;
}
こんな感じで(->)や(*)使わなくてすむのにと思ったので
>>415
kwsk
>>416
それじゃあ this が参照じゃないのは後方互換性のためなのか。
かつ *this があるから別の予約語を用意する必要もないと
>>419
ざっと見た感じでは self 使ってない雰囲気ですが
438:デフォルトの名無しさん
08/06/29 12:34:32
URLリンク(google-styleguide.googlecode.com)
Google社内でのコーディング規約らしい。例外は悪か、やっぱり。
439:デフォルトの名無しさん
08/06/29 12:55:16
>>438
全部読んでないけど、「例外は悪」とは書いてないと思うよ。
Googleの場合はデメリットがメリットより大きいから使わないという話と思う。
440:デフォルトの名無しさん
08/06/29 14:13:45
C++0xがでたら、boostも用済みなんだろうか…というか組み込まれるのか?
最近C++の書籍がどんどん廃刊したり、改訂版が出ないのは、やはりC++0x
待ちなのかな?早くして欲しいもんだ。
441:デフォルトの名無しさん
08/06/29 14:16:53
boostの一部は標準に取り込まれるが、
標準に新たな機能が追加されるわけで、
boostは更なる進化を遂げるだろう。
442:デフォルトの名無しさん
08/06/29 14:17:18
coocle
443:デフォルトの名無しさん
08/06/29 16:03:01
concept_map使った凶悪なライブラリがきっと入る、絶対入る
444:デフォルトの名無しさん
08/06/29 16:03:44
使わない、って書いてあるけど、
標準ライブラリ等で例外が投げられる奴らはどう使ってるんだろう?
使ってないのか?
new も nothrow で使ってんのかね。
445:デフォルトの名無しさん
08/06/29 16:09:02
catchしてNULL返す関数でラップしてるとか?
446:デフォルトの名無しさん
08/06/29 16:16:47
>>438
> string tableName; // Bad - mixed case.
おいらは google で仕事はできない
447:デフォルトの名無しさん
08/06/29 16:19:09
Googleに限らずどんな環境にも適合する人じゃないと駄目だよね。
448:デフォルトの名無しさん
08/06/29 16:19:53
まあ、その辺は統一取れてりゃ合わせるよ。
よほど変なのでなければ。
449:デフォルトの名無しさん
08/06/29 16:20:16
初心者もれに
string tableName; // Bad - mixed case.
なんでバッドなんだよって教えて干しいぉ?
450:デフォルトの名無しさん
08/06/29 16:24:31
>>449
誰がBADだと言っているのかは知らんが、MixedCaseなのがいかんと言っているだけじゃないか。
要は、caseをmixするなってことだろ。
451:デフォルトの名無しさん
08/06/29 16:26:28
変数名は全て小文字で。単語の区切りはアンダースコアで。
と書いてある。
452:デフォルトの名無しさん
08/06/29 16:28:25
コーディング規約に違反しているから bad なだけ
453:デフォルトの名無しさん
08/06/29 17:01:58
>>445
std::nothrowって知ってる?
454:デフォルトの名無しさん
08/06/29 17:05:12
>>453
標準ライブラリが例外を投げないようにするのに、
どうやってstd::nothrowを使うのか教えてほしい。
455:445
08/06/29 17:08:18
知りませんですた
456:デフォルトの名無しさん
08/06/29 17:34:59
標準ライブラリから例外が投げられてもそのままキャッチしないで死ぬ
だけ、とか?
もしくは標準ライブラリも書き直して使っているとか。
457:デフォルトの名無しさん
08/06/29 17:40:28
俺C++2年以上使ってるけど、例外処理ほとんどしたことない
458:デフォルトの名無しさん
08/06/29 17:50:04
Cの癖が抜けてないんじゃね?
459:デフォルトの名無しさん
08/06/29 17:56:07
まさにそれ…
460:デフォルトの名無しさん
08/06/29 17:57:11
googleって例外使わないってことは
C++でも、全部defineかenum斬った値返すだけってこと?
461:デフォルトの名無しさん
08/06/29 18:04:01
>>457
普段ほとんど気にしなくても、必要なときにキャッチするようにしておけば済むってのが強みだね。
462:デフォルトの名無しさん
08/06/29 18:08:41
C++はマルチパラダイム言語でしかも多機能だけど、別に
それを全部使ってプログラムする必要はない。
むしろSTLも含めて常時全部の機能を使うのは大変。
その人に合ったコーディングスタイルでいいんじゃないかと
思う。
463:デフォルトの名無しさん
08/06/29 18:10:39
>>462
ダメそれ無理
464:デフォルトの名無しさん
08/06/29 18:12:33
>>463
え?全部の機能を常時使えって?
その方が無理でしょ
常に10冊ほどの本を隣に置いておかないといけなくなるよ
465:デフォルトの名無しさん
08/06/29 18:13:35
より良い選択肢を無視するのは悪ではないか
けっきょく頑固な保守派はC言語をやれば良いではないか
466:デフォルトの名無しさん
08/06/29 18:14:40
>>464
全部の機能を覚えてれば本置いとく必要なくね?
467:デフォルトの名無しさん
08/06/29 18:16:04
>>464
学生じゃないなら20万ぐらいのドキュスキャン買って
本を全部PDF化するでしょ?
それで2画面で検索+コーディングするよね?
しない奴はカス
468:デフォルトの名無しさん
08/06/29 18:17:02
ええっ
例えばSTLの関数名全部覚えられるか?
現在のC++のSTLは当初標準化に際して提出された文書の
サブセットだそうだがそれでも一冊の本が書けるほどだぞ
469:デフォルトの名無しさん
08/06/29 18:18:25
例外大好きってわけじゃないけど、
RAIIしたら普通に例外に使わないか?
コンストラクタで例外出せないと、かなり面倒です・・・。
470:デフォルトの名無しさん
08/06/29 18:18:33
関数名なんて覚える必要ないが、だいたいどういうことが出来るか
という全体像を掴んでいれば、その都度調べて使えるし、いつの間にか
覚える。
471:デフォルトの名無しさん
08/06/29 18:19:33
>>462-464
よくわからんけど、話食い違ってるだけじゃね?
472:デフォルトの名無しさん
08/06/29 18:24:49
std::locale とか std::codecvt とか一度も使ったことないや
473:デフォルトの名無しさん
08/06/29 18:38:08
>>468
んな必要ねーし
憶え方なんざ ISO/IEC14882 にだって書いてあるぞ
たかが few 万円の費用が壁になるようなアマチュアの道具ではないってだけさ
474:デフォルトの名無しさん
08/06/29 18:40:20
few 万円で済めばいいが
俺はC++関連の本だけで既に百万は超えてる
475:デフォルトの名無しさん
08/06/29 18:45:14
>>474
スゲェ俺一冊w
476:デフォルトの名無しさん
08/06/29 18:46:37
一冊で済む奴はいいよな
俺頭悪いから、というかCの悪い癖を徹底的に取り除きたかった
からそれなりの出費を強いられたよ
477:デフォルトの名無しさん
08/06/29 18:50:37
俺は入門書とD&Eで2冊だった。あとはweb。
478:デフォルトの名無しさん
08/06/29 18:51:15
webって手もあるね。
479:デフォルトの名無しさん
08/06/29 18:51:55
学校の図書館に散々リクエストしまくっている俺がいる。
卒業したらリクエスト出しづらくなるから、早く0xが出てくれないと困る。
480:デフォルトの名無しさん
08/06/29 18:54:06
0xが2009年末くらいに出たとして、そこからそれに対応したコンパイラや
書籍が揃うまで、どのくらいかかるんだろうね。
481:デフォルトの名無しさん
08/06/29 18:55:03
webも含めて、他人のソースを見るのは結構効果的だと思う。
オープンソース系や、STLとかboostとか。
482:デフォルトの名無しさん
08/06/29 18:55:57
コンパイラの方はすぐだろ
書籍はそれから半年遅れてドバッと出てくるか
まあC++でほとんどのプログラミングテクニックは
出尽くしているから文法本しか買わないと思う
483:デフォルトの名無しさん
08/06/29 20:16:51
知り合いの達人プログラマーに
何から始めたらいい?って聞いたら
C++とロキやれって言われたけど
ロキってなに?
484:デフォルトの名無しさん
08/06/29 20:18:27
Lokiは今更だなぁ。boostで良いと思うよ。
485:デフォルトの名無しさん
08/06/29 21:19:50
コンストラクタやデストラクタにinline指定をして、メリットって
けっこうあるもん?
486:デフォルトの名無しさん
08/06/29 21:23:55
>>485
inline は使いまくるほど最適化がかかりやすくなる
487:デフォルトの名無しさん
08/06/29 21:26:53
>>485
プロファイルしてみれ
488:デフォルトの名無しさん
08/06/29 21:35:44
するってぇと、もはやコンストラクタは一般に
explicit inline 指定はデフォ?
489:デフォルトの名無しさん
08/06/29 21:37:19
場合による。吐き出すコードのサイズと相談だ。
490:デフォルトの名無しさん
08/06/29 21:37:52
force inlineして結果変った場合だけつけろよ
デバッグするとき泣くぞ?
491:デフォルトの名無しさん
08/06/29 21:49:44
>>485
最適化がかかりやすくなるかもしれんが、実装をヘッダに晒すようだとデメリットも大きい。
inline で向上する効率を確かめて、さらにそれが必要だといえる時だけ使うのがいい。
492:デフォルトの名無しさん
08/06/29 21:55:14
L2キャッシュに収まりきらないコード量をinline指定によって
吐くようになった場合はかえって性能が低下する事がある
実際に走らせてみるかプロファイル取ってみるかだな
493:デフォルトの名無しさん
08/06/29 21:56:36
アクセッサ程度のメンバ関数なら、無条件でinlineでおk?
494:デフォルトの名無しさん
08/06/29 22:11:51
おk
495:デフォルトの名無しさん
08/06/29 22:19:36
逆にヘッダに実装書きつつ、inlineにしたくない場合って
void hoge::hage(){...} ってクラス定義の後に分けて書けば良いんだっけ?
※コンパイラオプションはそのままで
496:デフォルトの名無しさん
08/06/29 22:23:45
>>493
491と同じではないかと思うけど。
C++ coding standardに載っている時期尚早な最適化(だったかな)じゃないかと思う。
497:デフォルトの名無しさん
08/06/29 22:24:26
ヘッダに非inline関数の実装を書いたら、そのヘッダを取り込んだ
翻訳単位それぞれに関数の定義ができて、重複エラーになるんでは?
498:デフォルトの名無しさん
08/06/29 22:30:16
>>497
普通なるね。
499:デフォルトの名無しさん
08/06/29 22:33:20
>>497
ならない。
inline 関数の定義が、リンクされるすべてのコンパイル単位間で矛盾して無い限りは問題ない。
500:デフォルトの名無しさん
08/06/29 22:33:33
重複した同じ定義を一つにする方法って無いんだったっけ?
テンプレートクラスとかの型毎のインスタンスはリンク後は一つになるよね?
501:デフォルトの名無しさん
08/06/29 22:34:08
>>499
非inline関数でっせ?
502:499
08/06/29 22:34:30
あれ?非inlineか。ごめん。
503:デフォルトの名無しさん
08/06/29 22:41:40
クラスの中に
static int a[] = {} かけないんだっけ?
504:デフォルトの名無しさん
08/06/29 22:50:36
>>503
無理
static const int のみ初期化OK
505:デフォルトの名無しさん
08/06/29 22:52:14
もっというと整数型がOKってことみたいだね。long や shortも
初期化おk
506:497
08/06/29 22:57:12
よく考えたら、
メンバ関数ならOKで非メンバ関数だとNGじゃないかな。
507:デフォルトの名無しさん
08/06/29 22:59:55
>>506
どっちでも同じ。ただしメンバ関数をクラス定義内で定義した時は自動的に inline 扱いになる。
508:デフォルトの名無しさん
08/06/29 23:35:16
>>506
俺が497だwなりすますな
509:デフォルトの名無しさん
08/06/29 23:52:16
最近のC++の流行では
getter/setterはどうやって書くの?
510:デフォルトの名無しさん
08/06/29 23:55:30
マクロを使って読みにくく且つ簡潔に書きます
511:デフォルトの名無しさん
08/06/29 23:55:57
今までの話の流れからすると、実装はソースファイルに書くのが
基本みたいな話だね。ただ、inline指定してみて効果が顕著だったら
inlineにするみたいな。
しかし、ほとんどの参考書では、GetやSetはクラスの型定義内に
inlineとして実装されてるよね。あれが誤解の元なんだろうか。
512:デフォルトの名無しさん
08/06/30 00:00:23
誰か>>500教えて~
513:デフォルトの名無しさん
08/06/30 00:02:22
リンカがよきにはからってくれるんじゃないの?
それか明示的にインスタンス化しておくとか
514:デフォルトの名無しさん
08/06/30 00:06:04
inlineはコンパイラによってはデフォルトで無視されるし
あまり気にしなくていいんじゃないの?
CPUがリターンキャッシュ持ってれば
515:デフォルトの名無しさん
08/06/30 00:17:18
>>492
P6のばやいL1じゃね?
516:デフォルトの名無しさん
08/06/30 00:26:54
>>514
無視するコンパイラにも、なるべく広範囲のソースを見せたほうがいい
処理系には何がしたいのかを伝えよ、禿の格言にもあるぞ
517:デフォルトの名無しさん
08/06/30 00:27:04
なんか初歩的な質問かもしれませんが、変数名やクラス名ってどう名づけてます?
変数や関数、インスタンスは小文字から始まり、
クラス名は大文字からはじめるのが一般的なんでしょうか
また、分かりやすい名前をつけると、クラス名とそのインスタンス名がかぶってしまうんですが、
何か分け方はありませんか
518:デフォルトの名無しさん
08/06/30 00:31:40
クラス名・変数名に迷ったら書き込むスレ。Part12
スレリンク(tech板)
ここで聞いてみるとか
519:デフォルトの名無しさん
08/06/30 00:36:48
>>517
クラス名の最初にcを付けてる
520:デフォルトの名無しさん
08/06/30 00:41:40
>>517
先生方のルールを参考にしてはどうかな
URLリンク(www.boost.org)
521:デフォルトの名無しさん
08/06/30 00:53:51
一応>>520のを書いておくと
クラス名 :小文字+アンダーバーの組み合わせ(例:multi_array)
ネームスペース名 :クラス名同様
ローカル変数名 :クラス名同様のルールで短めに
メンバ変数名 :クラス名のルールに加えて最後にアンダーバー
短くなくても良い(例:allocated_elements_)
関数名 :クラス名同様
テンプレート型引数名:パスカルケース(例:NDims)
マクロ名 :大文字+アンダーバーの組み合わせ
(BOOST_STATIC_CONSTANT)
522:デフォルトの名無しさん
08/06/30 00:54:58
typedef enumはどうすれあいいの?
523:デフォルトの名無しさん
08/06/30 01:03:51
typedefはクラス名同様
enumはメンバ変数名と同じ
ただ、boostの中で完全に統一されてるわけでもないみたい
524:デフォルトの名無しさん
08/06/30 01:04:28
>>517
unko_t unko;
525:デフォルトの名無しさん
08/06/30 01:16:04
Cの勉強をしているのですが、VCでスタティックライブラリを作ってみたりしました。
その後、似たものでシェアードライブラリ(.so)なるものがあるのを知ったのですが、
VCで作成することはできますか?
検索してもgccばかりが見つかってしまって。
ライブラリのファイルがないとexeの実行ができないようですが、dllと何が違うのか分かりません。
526:デフォルトの名無しさん
08/06/30 01:20:46
>>525
dll と同じようなものです
UNIX系では shared object
Windows系では dynamic link library
527:デフォルトの名無しさん
08/06/30 01:41:04
>>517
>438で出てたGoogleのルールのまとめ:
●ファイル名
ぜんぶ小文字で、単語は_か-で区切る。foo-bar.cc
●クラス名
各語の先頭を大文字にする。 FooBar
●名前空間名
ぜんぶ小文字。区切りについては明記してないけど、_? foo_bar
●変数名
ぜんぶ小文字で、単語は_で区切る。 foo_bar
●メンバ変数名
ぜんぶ小文字で、単語は_で区切り、最後は_にする。foo_bar_
●関数名
クラス名と同じ。アクセサだけは変数名と同じ。
●定数
先頭にkを付けて、単語区切りは大文字。 kFooBar
●マクロ名
マクロなんて使うな。
アクセサと定数が妙だなあ。
528:デフォルトの名無しさん
08/06/30 02:07:19
定数の接頭語のkって何の意味?
529:デフォルトの名無しさん
08/06/30 02:13:43
konstant。なぜかこれだけドイツ語。
530:デフォルトの名無しさん
08/06/30 02:13:47
koteiのk
531:デフォルトの名無しさん
08/06/30 02:16:10
>>518-521,527
細かくありがとうございます
いろいろな方法があるんですね
検討して、しっくりくる方法を選びたいと思います
532:デフォルトの名無しさん
08/06/30 03:23:02
constant でプレフィクス c だと、コーディング規約にも関わらず class と混同しそうだな
マクロ禁止なら全部大文字でもよさそうだが・・・
533:デフォルトの名無しさん
08/06/30 03:40:28
メンバはm_というつまらん駄洒落をまだやってる俺はどーせM$かぶれだい
534:デフォルトの名無しさん
08/06/30 07:48:41
>>533
boostにもあったりするよw
URLリンク(www.boost.org)
> const traits& m_traits;
> const Results& m_results;
> OutputIterator m_out;
> ...
535:デフォルトの名無しさん
08/06/30 12:36:05
標準的な識別子のプレフィックス一覧みたいなのなーい?
てか、どこの会社でもまちまちなんだろうけど。
536:デフォルトの名無しさん
08/06/30 12:41:49
プレフィックス一覧って?
命名ルールなら上で出てるgoogleかboostので十分だと思うけど。
537:デフォルトの名無しさん
08/06/30 15:27:37
なんか、なんちゃら記法みたいなのなかったっけ?
ポインタはpを付けるとか。C言語の時代か?
538:デフォルトの名無しさん
08/06/30 15:49:34
ジャンガリアン
539:デフォルトの名無しさん
08/06/30 15:50:56
ハンガリアン記法
URLリンク(ja.wikipedia.org)
ただし、ポインタにpを付けたりするのは
システムハンガリアンと呼ばれる間違ったハンガリアン記法。
本当のハンガリアン記法は
アプリケーションハンガリアンと呼ばれてる。
540:デフォルトの名無しさん
08/06/30 19:08:04
禿リアン
541:デフォルトの名無しさん
08/06/30 19:30:34
>>539
おお、それそれ。なんか批判が多いみたいだね。保守が大変とか。
けっきょくプレフィックスなんてないほうがいいのかね……
542:デフォルトの名無しさん
08/06/30 19:44:44
プレフィクスの使い方を間違わなければ有用らしいよ
間違ったコードは間違って見えるようにする - The Joel on Software Translation Project
URLリンク(local.joelonsoftware.com)
543:デフォルトの名無しさん
08/06/30 20:29:03
つまりアプリケーションハンガリアンてのは、識別子の補助的な意味を表す
プレフィックスを付けるって感じ?
システムハンガリアンはデータ型を表すプレフィックスを付けてるのかな?
544:506
08/06/30 21:13:12
>>508
ごめん。眠かったから間違えた。 by498
545:デフォルトの名無しさん
08/06/30 23:01:10
void hoge(const std::vector<foo>& foos);
という宣言をヘッダ(hoge.h)に書いたとき,fooを宣言している
ヘッダもhoge.hでインクルードしないといけないでしょうか?
それともhoge.hでは
class foo;
と書くだけでおkでしょうか?
546:デフォルトの名無しさん
08/06/30 23:50:55
データを線形リストでアクセス可能かつキューのように
扱えるデータ構造ってありませんかね?
data[3].hogeみたいにアクセスもしたいし
dequeue(data)みたにもアクセスしたい
547:デフォルトの名無しさん
08/06/30 23:58:57
>>546
std::dequeが火を噴くときが来たな
548:デフォルトの名無しさん
08/07/01 01:19:19
なんという出番w
549:デフォルトの名無しさん
08/07/01 08:09:47
>>545
標準ライブラリのテンプレート引数は基本的に完全型じゃないとダメ。
つまり class foo; だけじゃダメ。
550:デフォルトの名無しさん
08/07/01 10:33:31
forkについて
1プロセスで三回printfを実行して別プロセスを作成
そこからまた三回printfを実行して別プロセス
10プロセス実行完了したら最初のプロセスから終了していく
そんな課題なのだけどforkが理解できなくて困っている…
申し訳ないですがバカな俺でも理解できるように解説してくださらんでしょうか?
551:デフォルトの名無しさん
08/07/01 10:59:33
>>550
まずスレ違い。OSの話で言語と関係無い。
で、もうちょっと端的に質問しないと、ググって出るような解説をするしかないよ。
552:デフォルトの名無しさん
08/07/01 11:05:57
>>550
fork → UNIX/Linux系のシステムコールで環境依存
printf → C言語
【初心者歓迎】C/C++室 Ver.55【環境依存OK】
スレリンク(tech板)l50
>そんな課題
C/C++の宿題を片付けます 111代目
スレリンク(tech板)l50
>解説して
URLリンク(www.google.com)
553:デフォルトの名無しさん
08/07/01 12:25:56
質問です。
newでメモリを動的確保する場合失敗するとNULLが返るのですが、
これを意図的に失敗させたい場合どのような手段があるでしょうか?
どういう場合にnewが確実に失敗するのかがよくわかりません。
よろしくお願いします。
554:デフォルトの名無しさん
08/07/01 12:33:52
>newでメモリを動的確保する場合失敗するとNULLが返るのですが
返らないよ.
newが失敗したらbad_allocって例外が投げられる
ためしに以下の失敗するコードを実行してみるといいよ
char *a = new char[0x7FFFFFFF];
if (a == NULL) printf("%s", "メモリ失敗"); // 標準準拠のコンパイラではこのコードは絶対に実行されない
555:デフォルトの名無しさん
08/07/01 13:11:01
>>554
先生、失敗しないんですけど
556:デフォルトの名無しさん
08/07/01 13:24:11
ワロタ
557:デフォルトの名無しさん
08/07/01 14:00:19
struct test_type{ char mem[0x7FFFFFFF]; };
test_type *a = new test_type[0x7FFFFFFF];
if(a == NULL) printf("%s", "print format");
558:デフォルトの名無しさん
08/07/01 14:28:44
>>555 for (;;) で囲め。
559:デフォルトの名無しさん
08/07/01 15:19:53
コンパイラのバージョンを聞いたほうがいい
古いやつとか組み込み用は標準と違う動作をするだろ
560:553
08/07/01 16:19:49
ご回答ありがとうございます。
コンパイラはVC++2005付属のMSコンパイラVer 8.00.50727.42です。
>>554のサンプルコードを試しましたが、確かにNULLでなく例外を投げていますた。
コンパイラが古いとNULLを返す仕様になっているのでしょうか?
561:デフォルトの名無しさん
08/07/01 16:27:37
10年くらい前なら NULL を返したかもしれない
今はみんな bad_alloc を投げる
562:デフォルトの名無しさん
08/07/01 18:37:37
URLリンク(msdn.microsoft.com)(VS.80).aspx
>In Visual C++ 2005, the C Runtime Library's new function will also
>throw a std::bad_alloc exception if the memory allocation fails.
>If you still want the non-throwing version of new for the C Runtime Library,
>link your program with nothrownew.obj. However, when you link with nothrownew.obj,
>new in the Standard C++ Library will no longer function.
563:デフォルトの名無しさん
08/07/01 18:54:03
失敗時に NULLがほしいときは new (std::nothrow) じゃなかったっけ。
564:デフォルトの名無しさん
08/07/01 19:52:48
>>557
数学的に破綻してるコード嫌い
565:デフォルトの名無しさん
08/07/01 19:57:04
今、MSもVC++ Express Editionなる、無料コンパイラ配布してんだし、
最新の2008を使うべきでは。商用コンパイラ必要になるほどの
大プロジェクトじゃないならね。
566:デフォルトの名無しさん
08/07/01 20:00:24
>>564
数学的に破綻って?
567:デフォルトの名無しさん
08/07/01 20:18:41
>>566
失敗しない環境がありうるだろ
7で始まるのがプゲラとか言う問題ではない
568:デフォルトの名無しさん
08/07/01 20:43:06
大抵の環境で失敗するだろうから細かいことはいいんだお!
569:デフォルトの名無しさん
08/07/01 20:44:11
size_tの最大値じゃん。
570:デフォルトの名無しさん
08/07/01 20:56:07
>565
Express Edition は無料でいいんだが、MFCが使えん。
お偉いさんは、見た目が一番なんだよ。
571:デフォルトの名無しさん
08/07/01 21:53:20
>>570
見た目を気にするなら、なおさらMFCはダメだろ
572:デフォルトの名無しさん
08/07/01 22:11:16
>>569
何が?
573:デフォルトの名無しさん
08/07/01 23:35:10
size_tは符号無し整数だよ。サイズは処理系定義だけど。
それはともかく、普通に2Gも確保出来るってのが・・・w
>>565
2008はWin2Kに入らなかったりしてなw
2Kをバカにすん(ry
>>570
WTL+ATL使おうぜ
574:デフォルトの名無しさん
08/07/02 00:01:19
>>573
メモリ確保操作は、物理メモリのサイズが足りなくても
アドレスだけ確保して返して成功してしまう場合がある。
実際に手元の2GBしかメモリ積んでないマシンで2.5GB確保してもなんなく成功する。
これは、デマンドページングといって、物理メモリの確保が
実際にメモリを踏んだ段階で初めて起こるような仕組みが存在するため。
C++のnewの場合は、コンストラクタでメモリを踏んでしまう場合があるから
この仕組みがあったからといって実際に得はしないような気はするけどな。
575:デフォルトの名無しさん
08/07/02 00:04:33
UNIX系はそうなんだっけか
まあVCには全く関係がないな
連続した大領域確保しようとするとよく失敗するし
576:デフォルトの名無しさん
08/07/02 00:11:04
>>574
デマンドページングが動いている状態で、実際には確保されていない(&できない)アドレスにアクセスしたらどうなるの?
577:デフォルトの名無しさん
08/07/02 00:12:46
>>574
単にスワップメモリで足りただけじゃね?
578:デフォルトの名無しさん
08/07/02 00:24:19
>>576
典型的にはいらないページをスワップアウトしにいく
>>577
確保だけならスワップは発生せずに即終了する
579:デフォルトの名無しさん
08/07/02 00:35:06
「スワップに充分な領域が必要」な環境もあるし
「スワップに余裕があるか判断しない」環境もある。
後者だと、アクセスした途端にシステム全体でのメモリが不足することになる。
URLリンク(www.linux.or.jp)
>>578の世界はLinuxだけで出来ている模様。
あと、どうしても失敗したければ
new char[2 << (sizeof(void *) * CHAR_BIT - 1) - 1]; を2回もやれば十分だろうが
この2を2Lにしないとオーバーフローする環境もあるし
逆にlong引数のnewを認めない環境もあるんだろうな。
580:デフォルトの名無しさん
08/07/02 01:31:51
> new char[2 << (sizeof(void *) * CHAR_BIT - 1) - 1]; を2回もやれば十分だろうが
だから、何でそうなる
581:578
08/07/02 01:42:20
>>579
ん? なんで自分がバカにされているのか全然理解できないんだけど
いろいろな環境があることを頭に置いているからこそ578では
「典型的には」と頭につけたんだけどな
あとそのコード変だよ
少なくともビットシフトされる方は 2 じゃなくて 1 じゃないとおかしいし
そういうことやりたいなら
new char[std::numeric_limits<size_t>::max()] で十分じゃないかな
# ちなみにこういう最大限のメモリ確保は常識的な環境ならば1回ですぐに失敗するはず
# なぜなら、普通はスタックのためのアドレス空間やカーネルアドレス空間が同居しているから
582:デフォルトの名無しさん
08/07/02 12:26:21
> new char[std::numeric_limits<size_t>::max()] で十分じゃないかな
やっと出てきたw
が途中UNIXが出てきたり、やっと出てきたこれもmay beな言い方なので合格点はやれんな
583:デフォルトの名無しさん
08/07/02 12:35:24
std::size_t
584:デフォルトの名無しさん
08/07/02 12:36:06
SIZE_MAX
585:デフォルトの名無しさん
08/07/02 16:03:07
VC++のスレから来ました。相談させてください。
以下の710の質問をしました。
711の回答をもらいました。
それはそうだ、と納得しました。
---
710 :デフォルトの名無しさん [↓] :2008/07/02(水) 15:02:13
templateの使い方を教えてください
class parent;
class child : parent;
の2つのクラスがあって、
void hogeFunc(vector<shared_ptr<parent> > & param)
を呼び出したいとき、
vector<shared_ptr<parent> > vp;
は渡せるけど、
vector<shared_ptr<child> > vc;
が渡せないのはなんでかわからないです。
お分かりの方、理由を教えていただけないですか。
ちゃんと、pとcは親子関係にあるので問題ないと思っています。
711 :デフォルトの名無しさん [↓] :2008/07/02(水) 15:07:53
vector<shared_ptr<child> >& から vector<shared_ptr<parent> >& に変換できないから。
---
で、解決方法について相談させてください。以下は正しいですか?
・ void hogeFunc(vector<shared_ptr<parent> > & param)
のように、多態をvectorでやろうとしてるのが根本的に間違っている。
間違っているならこういったコンテナの要素を多態で扱いたいときは、
どのようにコーディングされているのか教えてください。
586:デフォルトの名無しさん
08/07/02 16:27:04
template<typename T> void hogeFunc(vector<shared_ptr<T> > & param){
struct check{ void f(){ T* a=NULL; parent* b = a; } };
...
}
587:デフォルトの名無しさん
08/07/02 17:29:52
樹木型(IPアドレスのような)のクラスを作成するにはどのようにしたらいいですか?
588:デフォルトの名無しさん
08/07/02 17:34:46
class Tree {
Tree[] subtrees;
}
589:デフォルトの名無しさん
08/07/02 17:36:01
ここC++だったorz
こんなのでいいんじゃない
class Tree {
std::vector<Tree*> subtrees;
};
590:デフォルトの名無しさん
08/07/02 17:55:38
template<typename T> struct node<T> {
T value;
node* prev;
node* next;
node* parent;
node* first_child;
static node* tree_next(node* n){
if(n==NULL){ return NULL; }
if(n->first_child!=NULL){ return n->first_child; }
return tree_next_no_child(n);
}
static node* tree_next_no_child(node* n){
if(n==NULL){ return NULL; }
if(n->next!=NULL){ return n->next; }
if(n->parent==NULL){ return NULL; }
return tree_next_no_child(n->parent);
}
};
for(node* it=n; it!=NULL; it=node::tree_next(it)){
}
591:デフォルトの名無しさん
08/07/02 18:27:09
>>587
C++を使う
できない人は他のスレで聞く
592:デフォルトの名無しさん
08/07/02 18:47:12
>>591
ここってC++スレじゃないのか??
593:デフォルトの名無しさん
08/07/02 20:33:00
>>592
そうだけど、あの聞き方ではhello worldから教える必要があるだろ
594:デフォルトの名無しさん
08/07/02 20:53:29
俺も興味あるんだが多階層にクラスを定義した場合下みたいな使いかたってできる?
Aclass.Bclass.element = NULL
昔クラスのpublic下にクラスを定義し派生用の関数で増やせるようなものを作ろうとしたんだがうまくいかなかった記憶があるもんで…
595:デフォルトの名無しさん
08/07/02 21:03:01
class Hoge {
const char msg="nullpo";
}
これだとエラー出ますが、こういうことをconst付けてやるにはクラス外に書くか
クラス.cppの方に書くか、もしくは使用する関数の中で書くしか無いのでしょうか。
596:デフォルトの名無しさん
08/07/02 21:03:35
大体型がおかしいだろ。
staticつけとけ
597:デフォルトの名無しさん
08/07/02 21:22:21
よーだょ。
ただしbool/char/short/int/long系に限りできる。floatは×
598:デフォルトの名無しさん
08/07/02 21:23:55
どうも、static付けてみます
599:デフォルトの名無しさん
08/07/02 21:40:22
enumが便利だよ
600:デフォルトの名無しさん
08/07/02 21:45:09
あ、なるほど。すっかり忘れてました。
601:デフォルトの名無しさん
08/07/03 00:45:52
C++0x出たら、ハゲはプログラミング言語C++の改訂版だすのかな?
なんか第3版の次の版が洋書では出てたけど、日本語版はスルーなのかな。
まぁこのタイミングでだしてもしょうがないし、できればC++0x反映させた
版を出して欲しいけどね。
602:デフォルトの名無しさん
08/07/03 01:10:26
const 定数のみのクラスってどうやってかけばいいのですか?
あとこういうエラー用の定数クラスは1枚のファイルに1こずつ
定義するのが流儀?
603:デフォルトの名無しさん
08/07/03 01:14:11
Javaじゃあるまいし
604:デフォルトの名無しさん
08/07/03 01:29:34
>>602
なんでクラスの中に定義する必要があるの
せいぜいネームスペースでいいじゃん
605:デフォルトの名無しさん
08/07/03 01:34:25
シングルトンですけど、boostに入ってないですよね?
Lokiぐらいしかないんでしょうか?
606:デフォルトの名無しさん
08/07/03 01:45:21
すみません、素朴な疑問なのですが
C++ではハードあるいはOSレベルの例外(例えば零による除算)は
通常どのように扱うののでしょうか?
もう少し具体的に言うと、例えばVC++なら_ _try, __except という
構造化例外のための機能が提供されていますが、
gccなどの他のコンパイラではこれと同様な機能を実現する手段は
ないのでしょうか。
windows, linux 双方で稼動させる必要のあるシステムを作るとしたら、
例外処理をどのようにするべきなのか非常に疑問です。
607:606
08/07/03 01:47:54
うーん・・・
URLリンク(msdn.microsoft.com)(VS.71).aspx
>C++ でプログラミングしたり、コードに移植性を持たせたい場合は、
>可能な限り標準 C++ の例外を使うことを強くお勧めします。
URLリンク(developer.mozilla.org)
>例外は、幅広くは実装されていない C++ の次なる一例です。
>そのため、それらの使用は C++ の移植性を低下させます。
>例外を使ってはいけません。運悪く、同じような機能をもったよい代替案はありません。
例外についての注意勧告がされていますが、では実際にどうするかという
代替案はないということなのか・・?
608:デフォルトの名無しさん
08/07/03 01:55:31
>>605
URLリンク(209.85.175.104)
609:デフォルトの名無しさん
08/07/03 01:56:59
鼻から悪魔という言葉があってな
610:デフォルトの名無しさん
08/07/03 02:05:31
>>607
俺はWinCE用のソースとかでは
std::auto_ptr<std::exception> を戻り値にしてる。
コンストラクタで失敗したものは fail() で返す。
で、毎回戻り値などのチェック。
パフォーマンス悪そうだし面倒なので全部そうしてるわけじゃないけど。
611:デフォルトの名無しさん
08/07/03 02:09:18
>>607
VC++の話をすると、/EH系のオプションがあって最適化やパフォーマンスの関係で使い分ける。
オプションなしの場合C++例外は一切使わない。
/EHs(c) 同期例外だけをキャッチする。c で extern "C"関数は例外を発生させないと仮定する。
/EHa 同期と非同期例外をc++例外としてキャッチする。
で /EHaの場合は stack overflowを除くほとんどのハード系の例外をキャッチ出来る。
もちろんゼロ除算も。
612:デフォルトの名無しさん
08/07/03 02:09:23
>>608
どうもです。
detailsの中にあることにはあるんですね。
とりあえずkろえを使っておきます。
613:デフォルトの名無しさん
08/07/03 02:26:36
>>610-611
ありがとうございます。
VC++の場合はわかるのですが、
gccなどでは同じような処理を行えないのでしょうか?
メモリの不正アクセスにしろ零除算にしろ、いくらでも
起こりうる例外だと思うのですが、Javaのように
統一的にcatchできないものかと悩んでいます・・・。
実際、至るところで零除算の起こりうる数値解析の
ようなシステムを作ったとして、いざシステムを起動
したら零除算で処理が中断したが、どこで起こったかは
わからない、なんてことは有り得ないですよね・・?
614:デフォルトの名無しさん
08/07/03 03:24:19
gccというよりunix系だとそういうのはsignalではないかな。
ゼロ除算ぐらいなら例外ではなくてプログラムで事前にチェックすべきもので、
メモリの不正アクセスはデバッグ時に潰すべきもので、
例外でキャッチしてリカバリーをかける類のものじゃない。
615:デフォルトの名無しさん
08/07/03 05:55:32
>>585
最初から vector<shared_ptr<parent> > だけ使ってればいいんじゃね?
616:デフォルトの名無しさん
08/07/03 05:59:33
>>594
struct { struct { void* element; } Bclass; } Aclass;
よくわからんが、これでやりたいことができたことになるの?
617:デフォルトの名無しさん
08/07/03 06:33:36
>>607
どこまでの移植性が必要かで判断すればいい。
Windowsだけなら構造化例外を使ってもいいだろうし。、gccあたりを含めるならくらいなら例外は使えるだろうし。
618:デフォルトの名無しさん
08/07/03 09:30:37
>>607
mozilla のページ、情報がえらく古いな
もっとも古いというだけでは済まされない記述も散見されるが
619:585
08/07/03 10:09:51
>>586
目からうろこがぼろぼろでた気分です。
ありがとうございました。
620:デフォルトの名無しさん
08/07/03 12:12:50
shared_ptrをメンバとして持つクラスで、そのメンバを取得したいとき、
getBBB1, getBBB2, getBBB3の実装をした場合、状況によるんでしょうが、適切なのはどれか教えてもらえないですか。
それぞれのメリット、デメリットがはっきりとわかっていません。
class AAA {
private:
shared_ptr<BBB> bbbptr;
public:
AAA() {
bbbptr = new BBB;
}
shared_ptr<BBB> getBBB1() {
return bbbptr;
}
shared_ptr<BBB>& getBBB2() {
return bbbptr;
}
BBB* getBBB3() {
return bbbptr;
}
};
621:デフォルトの名無しさん
08/07/03 12:55:48
状況による面もあるけど、
基本的にBBB1以外は間違った使い方だと思っていい。
622:デフォルトの名無しさん
08/07/03 13:00:22
#include <stdio.h>
int main(void)
{
float f;
for(f=1.0; (int) f<=5; f=f + 0.1)
printf("%f \n", f);
return 0;
}
このプログラム実行したら
2.600000
2.700000
2.799999
2.899999
2.999999
3.099999
3.199999
3.299999
3.399999
3.499999
と2.7から普通に計算できなくなりました
2.700000
2.800000
2.900000
と計算するようにしたいのですがどればいいですか?
623:デフォルトの名無しさん
08/07/03 13:07:39
>>622
float -> double
もしくは
二進化十進表現でgoogle
624:デフォルトの名無しさん
08/07/03 13:16:32
>>623
できました><
floatって精度かなり悪いみたいですね・・・
625:デフォルトの名無しさん
08/07/03 13:40:07
>>622
つうか思いっきりC言語じゃね?
626:デフォルトの名無しさん
08/07/03 13:48:35
Cで利用されることが推奨されているDLLがあって、そのヘッダファイルがC用に提供されていて、
それをC++で利用できない場合って、どういう理由が考えられますか?
できない場合があるとしたら、回避方法は、自分でヘッダを修正するってことでしょうか?
627:デフォルトの名無しさん
08/07/03 13:57:25
マングリング
extern "C"
628:デフォルトの名無しさん
08/07/03 16:25:02
>>626
#ifdef __cplusplus
#error C++ is not supported
#endif
とか書かれてるなら諦めるしかないだろ。
629:デフォルトの名無しさん
08/07/03 17:52:58
誰か教えてください。。。
現在プログラムでマウスクリックをさせるものを作っていて、
ボタンのクリックなどはできるようになったのですが、
タブ(TabControl)の切り替えができません。
だれかご存知の方がいましたらご教授いただけると助かります。。
以下プログラム抜粋----------------------------------
POINT pt = {任意の座標X , 任意の座標Y};
HWND hWnd = ::WindowFormPoint(pt.x , pt.y);
// マウスを任意の位置に移動
SetCursorPos(pt.x , pt.y);
// クリック (Down -> UP)
::SendMessage(hWnd , WM_LBUTTONDOWN , 0 , MAKELPARAM(pt.x , pt.y));
::SendMessage(hWnd , WM_LBUTTONUP , 0 , MAKELPARAM(pt.x , pt.y));
よろしくお願いします。
630:デフォルトの名無しさん
08/07/03 18:03:14
スレ違い、Win32APIスレで聞いたら
631:デフォルトの名無しさん
08/07/03 18:18:18
>>620
BB1は安全。戻り値最適化が期待できるので速度も十分
BB2は参照が生きているうちにAAAが削除される場合に問題が発生するが、それに気をつければ高速に使える。
BB3は危険。別のshared_ptrに戻りを代入するミスを誘発しそう。
632:デフォルトの名無しさん
08/07/03 23:49:12
BBB2も代入できるだろ
633:デフォルトの名無しさん
08/07/05 21:52:38
C99では
if (...)
statement...;
else
statement...;
などのstatementがそれぞれ{}で囲まれたように扱われるようですが
これはC++から来たものなのですか?
634:デフォルトの名無しさん
08/07/05 21:54:36
元から (C89から) そうでは?
635:デフォルトの名無しさん
08/07/05 21:59:52
C99よく知らないんだけど、
囲まれたように扱われる場合と
囲まれたように扱われない場合って何が違うの?
636:デフォルトの名無しさん
08/07/05 22:08:27
変数のスコープのこといってるんじゃね?
637:デフォルトの名無しさん
08/07/05 22:11:41
>>636
そもそも{}で囲まないと変数は定義できないだろう。
638:デフォルトの名無しさん
08/07/05 22:14:32
もともとif文の構文は
if (expr) statement [ else statement ]
expr ; の形の単文はstatementだから{}で囲む必要は無い
複文はstatementではないから、{}で囲んでstatementにしなければならない
そんだけのことだ
C99とかは関係ないだろ
639:デフォルトの名無しさん
08/07/05 23:36:13
URLリンク(seclan.dll.jp)
「選択文と反復文のブロック化」のことだな。
C++にもあるぞ、X3014:2003「6.4 選択文」の1, 2節目などなどに規定がある。
そこではこういう例が載せられている。
if (x)
int i;
このルールによって、if文を抜けたらiはもう使えないという具合。
>>637
C++だと、ブロック内の宣言は文だから、できるんだなこれが。
C99だと(なぜかC++と違って)文ではないから、お前の言うとおり出来ないけどな。
640:デフォルトの名無しさん
08/07/06 04:17:21
>>639
そんなVC6の時代の知識で語られても。
641:デフォルトの名無しさん
08/07/06 04:23:29
VC6でお世話になったマクロの意味がわかる
#define for if (0); else for
642:デフォルトの名無しさん
08/07/06 13:09:27
#define 定義は極力使わない方がいい、と、セキュアプログラミング系の本に書いてあったが
643:デフォルトの名無しさん
08/07/06 13:13:43
>>642
それは生兵法というもの
644:デフォルトの名無しさん
08/07/06 13:30:48
#define SubclassWindowみたいなマクロは死ねばいいと思う
使うならせめて大文字ですよね
645:デフォルトの名無しさん
08/07/06 13:51:36
>>642
OpenSSL脂肪wwwwwwwww
646:デフォルトの名無しさん
08/07/06 14:42:59
あとで#undefで即死されるマクロはいつもasdfだとかzxcvだとかに命名してる
647:デフォルトの名無しさん
08/07/06 16:56:32
>>646のコードはメンテしたくない。
648:デフォルトの名無しさん
08/07/06 20:25:50
同じく
649:デフォルトの名無しさん
08/07/07 08:09:21
hogehogeマクロ内でboost.pp.repeatとかつかってて子マクロが必要なら、
hogehoge_iとかhogehoge_iiにしてる。
後で#undefで即死されるのは同じだが。
650:デフォルトの名無しさん
08/07/08 00:13:06
while(1)中のswtch文で特定のcaseの場合whileから抜けたいのですが2重の構造をbreakさせる方法はありませんか?
gotoで抜ける手も考えましたがあまりスマートな方法じゃないのでできれば避けたいです
651:デフォルトの名無しさん
08/07/08 00:13:48
while(1)をやめる
652:デフォルトの名無しさん
08/07/08 00:19:50
whileの代わりにgotoをつかえばいい
653:デフォルトの名無しさん
08/07/08 00:26:15
>>650
フラグかgotoのどちらかを選ぶんだ。
654:デフォルトの名無しさん
08/07/08 00:29:06
>>650
そのwhileブロックは、breakをreturnに変えて
何らかの意味のある名前を付けられるくらいの処理ではありませんか?
655:650
08/07/08 00:40:53
whileを続行するかどうかのフラグ判定式に変更しwhileを抜ける場合はFALSEにセットしてからcontinueすればいい
656:650
08/07/08 00:42:49
ということに気づき自己解決しました。
レスありがとうございました
(うっかりEnterと一緒にShiftを押してしまい途中で書き込んでしまいました…)
657:デフォルトの名無しさん
08/07/08 05:41:19
あくまで自己解決と言い張るならもう質問すんなよ
658:デフォルトの名無しさん
08/07/08 06:09:44
何怒ってんだよw
659:デフォルトの名無しさん
08/07/08 06:25:05
657は別に怒ってないと思うが、658はなんでちょっぴり興奮してるんだろ、とは思う
660:デフォルトの名無しさん
08/07/08 09:38:38
>>653 でフラグ使えと書いてるのに、そんなレスみるまでもなく自分で解決したよ
と言うからだろうw
661:デフォルトの名無しさん
08/07/08 09:56:40
時間を鑑みるに、おっきしてるのを鎮めてる最中だったんだよきっと
662:デフォルトの名無しさん
08/07/08 11:15:01
自分のレスの後、同じような内容で
自己解決したと書かれたくらいで、もう質問すんなとか、
もうちょっと心に余裕を持った方が良いかと。
663:デフォルトの名無しさん
08/07/08 11:20:05
良いなぁこの馬鹿をかばう気持ち悪い空気
664:デフォルトの名無しさん
08/07/08 11:23:10
相当頭に来てる御様子ですね。
665:デフォルトの名無しさん
08/07/08 11:27:14
自己解決と書くのは、質問者が「お前ら役立たず」と言ってるようなもんだからなw
666:デフォルトの名無しさん
08/07/08 11:35:03
>>664
ていうか、こう書けば誰を馬鹿と思ってるのかがわかると思ったんで。
なるほどね。
667:デフォルトの名無しさん
08/07/08 11:46:23
>>666
>>662の後に>>663なら、普通は
「>>650(馬鹿)をかばう気持ち悪い空気」と捉えるでしょう?
そこでこう書けばというのは、それこそ馬鹿丸(ry
668:デフォルトの名無しさん
08/07/08 11:48:25
もう質問者にとって、このスレは用済みだからこねえよ
669:デフォルトの名無しさん
08/07/08 12:42:48
>>667
うん、こう書けば、無駄に食い下がるかどうかで痛い人かどうかがわかると思ったんで。
なるほどね。
670:デフォルトの名無しさん
08/07/08 12:49:02
オレには悔しいから一歩引いた視点の第3者を装って「なるほどね」と書いてるように見える。
671:デフォルトの名無しさん
08/07/08 12:50:18
>>669
それは自虐ギャグですか?
672:デフォルトの名無しさん
08/07/08 16:19:05
unique_ptrって本当にC++0xに入ってくれるんだろうか
673:デフォルトの名無しさん
08/07/08 16:47:35
ばかばっか
674:デフォルトの名無しさん
08/07/08 17:18:49
>>673
お前がな
675:デフォルトの名無しさん
08/07/08 17:26:45
>>674
オマエモナー
676:デフォルトの名無しさん
08/07/08 17:27:46
いってよし?
677:デフォルトの名無しさん
08/07/08 18:06:30
逝ってよし
678:デフォルトの名無しさん
08/07/08 22:11:51
>>650
なぜスマートな方法ではないと思うのかを誤魔化さずきちんと述べよ
679:デフォルトの名無しさん
08/07/08 22:13:35
gotoは悪って(事実かどうかは別にしても)よく言われてるからだろ。
多分。
680:デフォルトの名無しさん
08/07/08 22:38:18
初心者スレと分けてる意味が無いように思う
681:デフォルトの名無しさん
08/07/09 00:33:06
初心者スレってVC++しかなくね?
682:デフォルトの名無しさん
08/07/09 00:33:08
newで動的確保をする際の質問なのですが
Base* foo = new Base(int bar);
この書き方だとBaseの引数付きコンストラクタが呼ばれる事はわかるのですが
動的に配列を確保する場合に引数付きコンストラクタを呼ぶ事は可能なのでしょうか?
イメージ的には↓のようなことをしたいです
Base* foo = new Base[3] {Base(int bar), Base(int bar), Base(int bar), };
683:デフォルトの名無しさん
08/07/09 00:37:08
出来ません
684:デフォルトの名無しさん
08/07/09 00:37:54
>>683
ありがとうございます
685:デフォルトの名無しさん
08/07/09 07:03:55
一度配列か何かを確保しておいて、そこにforで引数付きコンストラクタをnewして回せば解決する。
デストラクタに注意
686:デフォルトの名無しさん
08/07/09 12:38:32
まずメモリに連続した領域内に生成したいものが、ほんとうに
クラスのインスタンスじゃないとダメなのか再考してみたら?
687:デフォルトの名無しさん
08/07/09 12:41:11
引き数つきのnewか…これはわりと難しいので、
あとで初期化用メソッドを呼ぶかポインタの配列にしたほうがらくちん。
688:デフォルトの名無しさん
08/07/09 19:09:17
VC6以前のVS持っている人はいませんか?
DDE spyを分けて欲しいのですが・・・
689:デフォルトの名無しさん
08/07/09 19:18:31
2.0のなら転がってるPCのHDDあされば出てくるかもだが・・・
690:デフォルトの名無しさん
08/07/09 19:56:05
>>688
それってダメなんじゃないの?
691:デフォルトの名無しさん
08/07/09 20:48:29
>>682
vectorじゃだめなのかい?
692:デフォルトの名無しさん
08/07/10 06:15:03
最新のVC++コンパイラって、C99に対する完全な上位互換を持っていると
思っていいの?
693:デフォルトの名無しさん
08/07/10 07:29:57
C99はまだスルーされてる
694:デフォルトの名無しさん
08/07/10 11:04:51
まだどころか多分永遠にスルーされる
今の所C99に準拠しているのはIntel C++程度
695:デフォルトの名無しさん
08/07/10 11:05:45
C99なんて有ったの… とか
696:デフォルトの名無しさん
08/07/10 12:30:01
対応させるメリットないしな
697:デフォルトの名無しさん
08/07/10 14:39:59
一行コメントと関数途中やfor初期化部での変数宣言に対応してくれればあとはいいや
698:デフォルトの名無しさん
08/07/10 15:25:18
たしかVC++チームのブログのコメント欄だかで、C99対応してくれってユーザの声はほとんど無いって言っていたような。
C99のいくつかの有用な機能、一行コメントだとか、restrictだとかは取り入れたが、C99全部入れても、誰も使わないしなぁ。
Variable-length arrayなんて、いまどき誰が使うんだ。
699:デフォルトの名無しさん
08/07/10 15:51:39
C++があるからねえ・・・
700:デフォルトの名無しさん
08/07/10 16:16:02
gccでは可変長配列に対応してたりするけどな
701:デフォルトの名無しさん
08/07/10 17:36:42
C99欲しい人は何が目当てなの?
702:デフォルトの名無しさん
08/07/10 17:39:47
>>698
歴史的経緯でalloca()が実装されてないから、可変長配列はあれば便利だぞ。
703:デフォルトの名無しさん
08/07/10 18:04:05
>歴史的経緯でalloca()が実装されてない
どこのはなし?
704:デフォルトの名無しさん
08/07/10 18:53:10
stdint.hが欲しいんだ。
705:デフォルトの名無しさん
08/07/10 19:07:41
よろしい
706:デフォルトの名無しさん
08/07/10 19:49:43
そもそもallocaはC89、C99の規格の中には存在しない。
ありゃPOSIX規格のモンだ。
このスレ的にはWin32 APIと同等に扱われるべき環境依存の関数。
なんだけど、itoaとかと同じで、事実上無視できない存在ではあるね。
とはいえ、90年代ならまだしも、
今日び、スタックからわずかなメモリを確保できたところで、それほど利点も無いだろ。
現代なら定数時間でメモリを確保解放できるメモリプールで良いじゃん。
707:デフォルトの名無しさん
08/07/10 20:24:39
C99を策定していた委員会の連中もC++98がこれだけ
広く使われるようになるとは夢にも思ってなかったろう。
でないとあれだけ緻密なC99の規格、しかもC89と互換性を
犠牲にしてわざわざ新しい規格を作るはずがない。
708:デフォルトの名無しさん
08/07/10 20:42:07
>>706
>702は、POSIXにはあるallocaがWin32にはないから、代わりに使いたいと言ってるんじゃないかと。
確かに、freeする必要がないメモリを好きに取れるのは楽かもしれんね。
それこそ、今時スタックサイズをけちることもないんだし。
709:デフォルトの名無しさん
08/07/10 20:50:59
ケチる必要は無いかもしれんが多用するのはバカのやることだぞ。
例えば、VCのリンカのデフォルトのスタックサイズは1MBだ。
何GBもメモリがある時代にたったの1MBだぞ。
*unixのことはよく知らんが、そう変わらんだろうよ。
現状の32bitコードで、スタックサイズが大きすぎると、
スレッドを数十個作っただけで、無駄にアドレス空間が浪費される。
だからスタックのサイズは小さいんだよ。
710:デフォルトの名無しさん
08/07/10 21:06:44
>>708
_alloca()ならVC++でも普通に使えるよ
711:デフォルトの名無しさん
08/07/10 21:50:21
こんなこともallocaと
って一度言ってみたいです
712:デフォルトの名無しさん
08/07/10 22:03:10
|:;:;:;:;:;:;:;:;:;:;:;:;:;:i;:;:;:;:;:;:;:;:;:;:;:;:;|
|;:;:_:;:_:;:_:;:_;:;_:;:l:;_;:_:;:_:;:_:;:_;:_;|
|______|_____|
| 三| _ _ |三 !
| 三| 三シ ヾ三 |三 |
| 三′ .._ _,,.. i三 |
ト、ニ| <でiンヽ ;'i"ィでiン |三.|
', iヽ! 、 ‐' / !、 ーシ |シ,イ
i,ヽリ ,' : !. |f ノ
ヾ! i ,、 ,..、ヽ lノ
| _ _ イ l malloca
l ,ィチ‐-‐ヽ i /、
゙i、 ゝ、二フ′ ノ/'"\
| \ ー一 / / _,ン'゙\
,ィ|、 \ /_,、-'" _,.-''´ `丶、__
_, イ | ヽ_ 二=''" _,. -''´ """""´´ ``ー
713:デフォルトの名無しさん
08/07/10 22:19:03
alloca は gcc の configure でもチェックあるよな
714:デフォルトの名無しさん
08/07/10 22:20:10
> バカのやることだぞ
まだそんなカキコしてるんですか? にっぽんのドクターさん
715:デフォルトの名無しさん
08/07/10 23:11:49
プログラム=PCアプリだと思ってる連中は気楽でいいのう・・
716:デフォルトの名無しさん
08/07/10 23:15:46
どう気楽なのかキッチリ説明してもらおう。 (と言ってみる
717:デフォルトの名無しさん
08/07/11 00:06:24
C99は無かったことにならないかな。下手にこんなのがあると、コンパイラ
ベンダーが、C99実装しかねない。
718:デフォルトの名無しさん
08/07/11 00:13:54
たいていのコンパイラベンダはC++を優先するだろ
sizeofがコンパイル時定数にならないとか悪夢過ぎるだろ
719:デフォルトの名無しさん
08/07/11 00:51:13
・conio.hを何とかして欲しい。
・stdint.hの声が何故大きくない?
720:デフォルトの名無しさん
08/07/11 00:58:56
それにしてもC++自体が変態化してきて誰にも使われなくなりそうな気がするのは俺だけだろうか
721:デフォルトの名無しさん
08/07/11 01:06:43
おれのVC++のソース、alloca普通に便利に使ってる
722:デフォルトの名無しさん
08/07/11 01:26:23
C++はいろいろ変な部分があるが、
代わりになるいい言語がないのも事実
web限定とかだとPerl系に軍配が上がるが
723:デフォルトの名無しさん
08/07/11 01:40:53
C++0xはC99みたいな立場になるだろうな
そして代わりに○○が台頭する
○○にはお好きな言語をどうぞ
724:デフォルトの名無しさん
08/07/11 01:55:57
Obj-C
725:デフォルトの名無しさん
08/07/11 01:58:45
アプリケーション(ダイアログ)に表示された文字を外のアプリケーションから取得する方法ご存知のかたいませんか?
726:デフォルトの名無しさん
08/07/11 02:01:16
D言語がいつか主流になる・・・
そんな風に考えていた時期がありました・・・
727:デフォルトの名無しさん
08/07/11 02:20:56
>>725
君がすれ違いだということだけは、はっきりわかる。
プラットフォームすら記載されてないので、どのすれが適当かはしらん。
728:デフォルトの名無しさん
08/07/11 03:03:54
>>726
今ひとつ流行らんよなアレ
729:デフォルトの名無しさん
08/07/11 04:15:06
>>728
だってDは、「言語仕様が確定=開発終了」だもん。
D1の仕様は決まったけど、D2のほうが進歩してるのに誰がつかうよ。
730:デフォルトの名無しさん
08/07/11 12:54:57
仕様と同時に実装が下りてくるってのもエキサイティングだとは思うがね
なんにせよ俺は指をくわえて見てるだけ
731:デフォルトの名無しさん
08/07/12 02:55:05
無名namespaceについて教えてください。
名前のある名前空間の場合、
namespace hoge{
void f();
}
というように宣言して、後で
void hoge::f(){}
のように定義できますが、名前無しの場合
namespace{
void f();
}
として後で定義を書く場合、??::f()というような形式では定義できないのでしょうか?
もちろん定義のときも
namespace{
}で囲ってやればいいのでしょうが、関数定義のような長いものをブラケットで
囲むというのも、邪魔くさいなぁと思い。
732:デフォルトの名無しさん
08/07/12 03:05:35
確かに邪魔くさいが、
だからこそそんなもの使わないですむようしておけって話じゃね?
733:デフォルトの名無しさん
08/07/12 03:08:33
>>731
>として後で定義を書く場合、??::f()というような形式では定義できないのでしょうか?
こういう参照が出来ないからこそ役に立つんだと思う
734:731
08/07/12 03:15:56
レスどうもです。
基本的に、C++では翻訳単位内でのみ使用する変数や関数は、C言語のような
staticを付けるのではなく、無名名前空間を推奨しているようですが、
そうなると関数の定義は
namespace{
void f() { }
}
のようにするということでしょうか。みんなそうしてるのかな。
735:732
08/07/12 03:27:22
ごめん。 もっとくだらない理由だと思ってた。
"翻訳単位内でしか使わない"っていうことを明示したいなら、
その邪魔くさいnamespaseが(目立つから)役に立つだろうし、
邪魔くさいnamespaseを使いたくないってことは、
"翻訳単位内でしか使わない"っていうことを明示しなくてかまわない
と、俺は思うけど。
本当に邪魔だと思うなら、翻訳単位内でしか使わないとか、あきらめなよ。
736:731
08/07/12 03:51:39
外部リンケージを持たせたくない変数や関数の宣言だけを
namespace{}に収めるところまでは、目立たせる意味でも
一覧という意味でも非常にスッキリしてると思うんですよね。
ただ、ここに関数のボディまで書いてしまうと、一望しづらくなるので
別途書くことになるのですが、関数定義をブラケットで囲むということに
少し拒否反応がでてしまった次第です。ただ、これしか方法がないなら
そうするしかないですね。邪魔だから使わないというわけにもいかない
機能ですし。あとは、関数定義1つ1つをnamespace{]で囲むのか、複数の
関数定義をまとめてnamespace[]で囲むのか、こだわれるところとしたら
そのくらいですか。
737:デフォルトの名無しさん
08/07/12 04:02:32
すごい余談だけど、目立たせなくてはいけないのは、関数本体だと思うんだ。
関数本体をメンテナンスするとき、どの関数に使用されているかが問題になるので。
宣言が目立たないと、間違って呼び出そうとしてリンクエラーでるじゃん? それもいやじゃん?
ていわれりゃそうなんだけどさ。
738:デフォルトの名無しさん
08/07/12 08:09:05
templateで、doubleとfloatだけしか使えないようにするには、
何か書き方があるのでしょうか。教えてください。
template<typename T> void hoge(T arg);
739:デフォルトの名無しさん
08/07/12 08:30:51
template<typename T> void hoge(T arg){return;}
void hoge(double arg);
void hoge(float arg);
740:デフォルトの名無しさん
08/07/12 08:33:12
>>738
template<typename T> struct hoge_chk{hoge_chk(){ use_float_or_double(); }};
template<> struct hoge_chk<float>{};
template<> struct hoge_chk<double>{};
template<typename T> void hoge(T arg){
hoge_chk<T>();
...
}
741:740
08/07/12 08:35:10
use_float_or_double()は定義されていない前提ね。
コンパイルエラーにさせるため。
742:デフォルトの名無しさん
08/07/12 08:39:49
template<typename T> void hoge(T arg);
template<> void hoge(float arg) { }
template<> void hoge(double arg) { }
でいいじゃん。
743:デフォルトの名無しさん
08/07/12 08:44:11
>>739 >>742
それだと
void hoge(float arg) {}
void hoge(double arg) {}
と同じだし、それぞれ実装書かないといけないから
テンプレート関数にする意味無いだろw
744:デフォルトの名無しさん
08/07/12 08:45:47
template<typename T> void hoge_impl(T arg) {}
template<typename T> void hoge(T arg);
template<> void hoge(float arg) { hoge_impl(arg); }
template<> void hoge(double arg) { hoge_impl(arg); }
745:デフォルトの名無しさん
08/07/12 08:52:53
>>743
同じじゃねーよ。そのコードでhoge("hogehoge")はエラーだけど>>739と>>742はエラーじゃない。
テンプレートにする意味がないっていうのは質問者に言えって。
746:デフォルトの名無しさん
08/07/12 08:55:57
>>745
いや、hoge("hogehoge")で>>742はエラーになるよ。
747:デフォルトの名無しさん
08/07/12 08:56:00
>>744
だから下のテンプレート関数は意味無いってw
それでやるならこうだろ
template<typename T> void hoge_impl(T arg) {}
inline void hoge(float arg) { hoge_impl(arg); }
inline void hoge(double arg) { hoge_impl(arg); }
748:デフォルトの名無しさん
08/07/12 08:59:00
質問者がdoubleとfloatだけしか使えないように、と言ってるので
使えてしまう>>739も駄目だな
749:デフォルトの名無しさん
08/07/12 09:04:54
>>745
>テンプレートにする意味がないっていうのは質問者に言えって。
>>740と>>747はテンプレートにする意味あると思うけど。
750:デフォルトの名無しさん
08/07/12 09:16:21
>>747
テンプレートの特殊化は関数の多重定義に優先するから
意味が違う
751:デフォルトの名無しさん
08/07/12 09:21:25
>>750
意味分かって言ってる?
それで困る「まともな状況」書いてみ
752:デフォルトの名無しさん
08/07/12 09:22:41
テンプレートの特殊化と関数の多重定義を二つかくと
関数の多重定義の方が無視されるだろ
753:デフォルトの名無しさん
08/07/12 09:25:48
>>752
>テンプレートの特殊化と関数の多重定義を二つかくと
それがまともな状況じゃないって言ってるんだよw
754:デフォルトの名無しさん
08/07/12 09:26:34
>>753
メンテナンスの程度次第ではいくらでもあり得る。
まともかまともな状況じゃないかはお前が判断する事じゃない。
755:デフォルトの名無しさん
08/07/12 09:27:36
>テンプレートの特殊化と関数の多重定義を二つかくと
>関数の多重定義の方が無視されるだろ
これ逆だよ。関数の多重定義の方が優先される。
だからテンプレートの特殊化と関数の多重定義は混ぜて
書くべきじゃない。
756:デフォルトの名無しさん
08/07/12 09:31:38
>>754
ワロタwどんな糞メンテナンスだよw
757:デフォルトの名無しさん
08/07/12 12:06:44
あれ?オーバーロードの方が特殊化より優先するよな?
758:デフォルトの名無しさん
08/07/12 12:52:15
>>757
>>755
759:デフォルトの名無しさん
08/07/13 12:38:07
boostスレ過疎ってんな・・・w
760:デフォルトの名無しさん
08/07/13 13:14:51
このスレ過疎ってるのでしょうか?
この話題↓で盛り上げてください!
やねう企画代表者やねうらお(本名・磯崎元洋)が
・ソフトウェアの不正コピーを行っていた
・労働契約上の違反をしていた
・他は不正コピーしていないことを証明しようとしてエロゲーのパッケージを発見し、
写真に撮ってアップロードしようとした。
URLリンク(d.hatena.ne.jp)
やねう企画の裏側(競馬の詐欺ソフトの製作現場)
URLリンク(d.hatena.ne.jp)
URLリンク(d.hatena.ne.jp)
URLリンク(d.hatena.ne.jp)
有限会社やねう企画(所在地・大阪府八尾市末広町2-1-2)が計画倒産
URLリンク(www.sia.go.jp)
やねうらおプロフィール
性格:友達から「チンピラ」「ヤクザ」と呼ばれている。前世で殺人鬼だった宿業を背負っているという妄想(自覚)あり。
最終学歴:専門学校卒
主な職歴:有限会社センキ(凌辱系アダルトゲームの製作会社)を経て独立、有限会社やねう企画を設立、2006年に計画倒産
代表作:『夜這いマニア』『盗撮マニア』『お楽しみCDシリーズ』『競馬詐欺ソフト』『BM98』
やねうらお語録
>「ワシのほうが潔癖やと思うんやけどな。
>絶対に違法コピーのソフトしか使わんし。
>たとえば強盗に入ったときに、ちょっとかわいそうになって
>十万円だけ残してったら、おかしいやろ?
>自分の『強盗する』という意思に対して矛盾やろ?
>だからワシは、一個も買ったソフトを使ったことがない!!」
761:デフォルトの名無しさん
08/07/13 13:18:26
759 :デフォルトの名無しさん [sage] :2008/07/13(日) 12:38:07
boostスレ過疎ってんな・・・w
760 :デフォルトの名無しさん [sage] :2008/07/13(日) 13:14:51
このスレ過疎ってるのでしょうか?
日本語が不自由のようだなw
762:デフォルトの名無しさん
08/07/13 14:27:07
キーワードによる自動コピペ
763:デフォルトの名無しさん
08/07/13 14:49:07
memset や memcpy の動作について質問です。
memset(buff, 0, 0); や memcpy(buff, work, 0);
764:763
08/07/13 14:50:35
すみません、途中で送信してしまいました。
memset(buff, 0, 0); や memcpy(buff, work, 0); のように
サイズが 0 の場合、何も行われないという認識で合っていますか?
MSDN では分らなかったです。
765:デフォルトの名無しさん
08/07/13 15:06:56
サイズ 0 ならガッされないなんて知ってても役に立たんだろ
766:デフォルトの名無しさん
08/07/13 15:09:41
>>764
そういう場合、不安だったらmy_memsetかなんか一個かましておけ
767:デフォルトの名無しさん
08/07/13 15:12:29
>>765
関数の呼び出し元にバッファ領域のポインタと領域サイズを渡させる場合に役に立ちます
memset や memcpy にサイズ 0 を渡しても大丈夫ということであれば、
領域サイズに 0 が指定された場合のエラーチェックをせずに済むケースがあるからです
768:デフォルトの名無しさん
08/07/13 15:25:06
規格書にはn文字ほげほげするとだけしか書かれてなかった希ガス。
詳しく知りたければJISのサイトでX3010を検索。
769:デフォルトの名無しさん
08/07/13 15:25:19
>Where an argument declared as size_t n specifies the length of the array for a
>function, n can have the value zero on a call to that function. Unless explicitly stated
>otherwise in the description of a particular function in this subclause, pointer arguments
>on such a call shall still have valid values, as described in 7.1.4. On such a call, a
>function that locates a character finds no occurrence, a function that compares two
>character sequences returns zero, and a function that copies characters copies zero
>characters.
0を渡すことはできるが、その場合でもNULLはダメらしい
770:デフォルトの名無しさん
08/07/13 15:44:01
>>766
なるほど、それは確かに賢いやり方ですね。
ちょっと考えてみます。
>>768
調べてみます。
>>769
NULL チェックだけは避けられないということですね。
やはり、エラーをチェックする自作関数をかました方が良いのかもしれないですね。
771:デフォルトの名無しさん
08/07/13 18:18:24
宣言と定義が別々になってるコンストラクタで、初期化リスト使う場合って
宣言と定義両方に初期化リストつけなきゃいけないんだっけ?
772:デフォルトの名無しさん
08/07/13 18:20:42
定義の方だけ
class A {
int a;
A();
};
A::A():a(0){}
773:771
08/07/13 18:25:33
ありがとう。
774:デフォルトの名無しさん
08/07/14 05:20:26
=== hoge.h ===
class hoge {
public:
template<typename T> T func(T a) const;
};
=== hoge.cxx ===
#include "hoge.h"
template<typename T>
T hoge::func(T a) const {
return a;
}
=== main.cxx ===
#include "hoge.h"
int main() {
hoge h;
int a;
h.func(a);
return 0;
}
775:774
08/07/14 05:22:22
GCC 4.0.1で、
$ g++ -c hoge.cxx -o hoge.o
$ g++ -c main.cxx -o main.o
$ g++ main.o hoge.o -o main
Undefined symbols:
"int hoge::func<int>(int) const", referenced from:
_main in main.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
となってしまいます。
templateのメンバ関数というのは、これではまずいですか?
776:デフォルトの名無しさん
08/07/14 05:41:04
まずいです。
h.func(a); を書いたソースから hoge::func の実装が見えるようにして下さい。
ようするに hoge.h に実装を書いてください。
777:デフォルトの名無しさん
08/07/14 05:50:17
>>775
exportキーワードをサポートしてないC++処理系では無理
778:774
08/07/14 06:14:12
>>776-777
まじですか。なんともめんどくさい。
設計からやり直さないと。
ありがとうございました。
779:デフォルトの名無しさん
08/07/14 20:11:37
VC++ 2008はもうexportをサポートしてる?
780:デフォルトの名無しさん
08/07/14 20:14:37
ネイティブコードなんてシロモノはOSぐらいしか使わないような世界になったなら、
exportもサポートされるかもな。
781:デフォルトの名無しさん
08/07/14 20:19:25
じゃあ2008でも未サポート?
782:デフォルトの名無しさん
08/07/14 20:57:28
>>780
なんで?
783:デフォルトの名無しさん
08/07/14 23:23:50
今やオブジェクト間最適化が当然の如く行なわれている。
export実装がそんなに困難であるはずがない。
784:デフォルトの名無しさん
08/07/14 23:29:47
コードレベルで保持しないとダメだから難しいでしょ。
D言語はうまいことやってるけど。
785:デフォルトの名無しさん
08/07/14 23:31:36
そろそろVC++2008でexportが実装されてるか教えてくれてもいいだろう
786:デフォルトの名無しさん
08/07/14 23:33:17
>>785
それがないんだな。
787:デフォルトの名無しさん
08/07/14 23:39:11
うそ~ん
788:デフォルトの名無しさん
08/07/14 23:49:19
exportが実装されるまでvcはスルー確定だな