[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 01/02 08:18 / Filesize : 209 KB / Number-of Response : 862
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part62



1 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 23:53:59 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part61
pc11.2ch.net/test/read.cgi/tech/1205059063/

331 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 01:48:50 ]
>>329
無理。外側の ClassA の定義が必要。 ClassA の中で class InnerClassA; としてあれば
InnerClassA の定義は必要ない。

332 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 08:20:45 ]
>>315
>D* を B* としてアクセスするのは、規格の 3.10 p15 にあるエイリアスの制約に
>違反するので、未定義動作。

普通のアップキャストだからOKじゃないの?

333 名前:332 mailto:sage [2008/06/20(金) 08:34:45 ]
332は>>315じゃなくて>>330だった。

なおModern C++ Designでは、
仮想継承でなければstatic_castによる
アップキャストは問題ないとなってた。
規格でどうなってるかは知らない。

334 名前:332 mailto:sage [2008/06/20(金) 09:16:06 ]
>>330

もしかして static_cast<B**> がダメってことですか?

335 名前:330 mailto:sage [2008/06/20(金) 09:30:49 ]
>>332
ごめん。まぎらわしいね。

「D* に B*& でアクセスするのは、〜」ってことで、少しは伝わりやすいかな、と。

336 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 13:36:27 ]
C++ の仕様では sizeof(B*) != sizeof(D*) の処理系もありえるのかな。

337 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 15:16:43 ]
クラスが違うとポインタサイズも違うのか・・・?なんという

338 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 16:08:14 ]
class XをSTL準拠にするため自作イテレータを作ろうと
operator++( X* x )みたくしたら
「クラス型パラメータがひとつもありません」と怒られました。
ハーバートシルト先生のSTL標準講座を読んでも解決法が書いてありません。
っていうか自作STLの書き方なんて載ってないし。
もうだめです。さようなら。

339 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 16:56:07 ]
はい、さようなら。



340 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:52:33 ]
違うよ。
現在の名前空間から見てstd::以下にあるシンボルを現在のスコープにロードする命令だよ。

ちなみに、名前空間のなかから普通の"std"を読み込みたいなら
using namespace ::std;
とする必要がある。

342 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 18:11:09 ]
>>338
ポインタで横着しようとしないで、イテレータ用のクラスを作る。

343 名前:デフォルトの名無しさん mailto:sage [2008/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 mailto:sage [2008/06/20(金) 18:54:47 ]
あ、hoge.hhにstd系のincludeがあったら駄目か・・・。

345 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 19:01:52 ]
>>341
うむむ、namespaceは奥深いですね。

>>343
namespace stdは見つかりませんでした。。。
あと、その行を追加してもhogehoge::stdを探しに行ってるように見えます。。。

一番簡単なのはヘッダのusing namespace std;の行を削除することなんだろうけど、
ファイルの上の方のコメントみたらcopyrightとか書いてあるし……

諦めて裸のままインクルードして使うことにします。
ありがとうございました。

346 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 23:55:19 ]
定数を指定するとき、C言語では#defineを使いましたが、
C++ではconstな変数を使え、とモノの本に書いてありました

ところで、定数がint型で何個も欲しいのですが、
列挙型の列挙子で代用するのはアリでしょうか?

348 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 00:09:47 ]
>>347
どれくらいの個数かにもよるかもしれないけど、
列挙子で代用(?)している入門書は結構ある。

349 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 00:28:08 ]
#define 使うなってのは、型だとか副作用だとかエラーメッセージだとかだから
enum なら問題ないと思うよ



350 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 00:30:07 ]
配列の添え字に使いたかったんです
単なる数字より、文字のほうが読みやすいですし
ありがとうございました

351 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 00:34:33 ]
>>347
なんで数が増えたら enum で代用するなんてことになるの?
意味が違うだろ。

352 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 00:37:28 ]
連番なら enum だね。

353 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 00:46:05 ]
>>351
いや、0から始まる連番なもんで

354 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 00:50:15 ]
>>353
それなら代用じゃなくて enum が正解。逆に int const で用意するほうがありえない。

355 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 03:11:09 ]
すみません.
ここでする質問ではないかも知れませんが.
C++でMPEG2を取り扱うプログラムを作らなくてはならなくなりました.
MPEG2を扱うにはどのようなlibraryを使わなければならないでしょうか?
またそのマニュアルが詳しく掲載しているサイトを教えてくれません?
Directshowは抜きでお願いします.

356 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 03:25:18 ]
ffmpegでヤフれ

ただしMPEG2特許の利用ライセンスは自分でとってね!

357 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 16:44:37 ]
VC++環境です。STLのlistについて質問です。
あるlist(Aとする)の情報をまるまる別のlist(Bとする)にassign()で写したのち、
Aのある位置を指しているイテレータをそのままBで使いたい
(Aで指していた位置にある情報を指させたい)
のですが、方法を探しても見つかりません。
アルゴリズムのfind()以外で何か方法はありますか?

358 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 17:13:09 ]
>>357
std::distance(), std::advance()

ただ、listだとランダムアクセス出来ないから
一応それぞれO(n)で、セットでO(2n)になる。
まぁとんでもない要素数でない限り一瞬だろうけど。

359 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 17:18:01 ]
listはアクセスするだけでもメモリの中を不規則な順序で飛び飛びするので、平均の次の要素へのアクセス速度は
要素が連続しているvectorよりも遅い。



360 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 17:24:45 ]
>>357->>359
頭からの距離で考える発想は思いつきませんでした。
要素も少なく、実際に動かしてみても一瞬で処理できました。
ありがとうございました。

361 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 22:12:24 ]
解決したようだが、
begin()〜itとit〜end()の2回に分けてコピーするのもいいな。

362 名前:355 mailto:sage [2008/06/24(火) 02:37:33 ]
ffmpegをヤフりました.
MS-DOSで動くオープンソースの動画変換アプリなんですね.
ソースを見て参照方法を探れということですね?
これも方法の一つとしますが時間がかかるので,なにか他の方法はないでしょうか?

それと商用配布は考えていないのでライセンス申請の必要はありません.

363 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 03:12:10 ]
いいえ、商用に限らず許可なく使うことは許されません。

364 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 07:35:29 ]
特許権は、それを使ったものを製造、保管、流通することを制限することができるよ。
商用かどうかは関係ないよ。
詳しくは法務に聞こうね。

365 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 10:47:36 ]
>>362
> MS-DOSで動くオープンソースの動画変換アプリなんですね.
違います。

> ソースを見て参照方法を探れということですね?
違います。

> これも方法の一つとしますが時間がかかるので,なにか他の方法はないでしょうか?
規格書読むより時間掛かりませんよ。

366 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 16:16:38 ]
>>366
クラスの外で一回やっておけばよい。
main()が呼ばれる前に初期化される保証がある。

368 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 16:19:15 ]
Singletonの問題のようにも思えるが

369 名前:366 mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/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 mailto:sage [2008/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 mailto:sage [2008/06/24(火) 16:32:03 ]
>>370
ということのようですね。
ありがとうございました。

373 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 17:22:54 ]
どんな初期化をするかにも夜
コンストラクタとデストラクタは忘れないであげてくだちぃ

374 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 17:54:53 ]
>>373
staticだからこの場合は無理なのよ

375 名前:355 mailto:sage [2008/06/24(火) 18:33:23 ]
ffmpegのAPIを使ってMPEG2を読み込めということでしょうか?
現在mpeg2dec-0.4.1 とでどちらを使うか考えています.

両方の向き不向きについて何か教えてくれませんか?

376 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 18:49:21 ]
C++相談室

377 名前:355 mailto:sage [2008/06/24(火) 19:53:12 ]
すみません.
そうでした.完全にスレ違いになってしまいました.
去ります

378 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 00:50:14 ]
C++って、単純な速さは他の言語と比較してどうなの?



380 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 00:56:45 ]
>>378
そういう仕様に決まったから。

>>379
書き方や問題領域で当然変わってくるけど、大体Cと同じ。

381 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 00:58:44 ]
ていうことは、C++のコンパイラは場合によっては、
読む場所を行ったり来たりしうるんですね
ありがとうございました

382 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 02:00:09 ]
>>378
正確に述べると、クラス定義の中に関数定義を書くと、
そいつはクラス定義の終わった後に、inline付で定義されたものとして扱われるということになる。

383 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 02:15:49 ]
クラス宣言じゃないのか。

384 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 07:37:29 ]
定義。

385 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 07:51:00 ]
クラス宣言って外部でメンバ関数の定義をしたりあと前方宣言
の時に使われる物?

386 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 08:26:28 ]
クラスそのものを後方定義というやり方にも使う。

387 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 10:55:21 ]
>>387
全く問題ない。

389 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 20:30:13 ]
>>390
391に同意。
a.add(x)に渡すxはnewしないといけないという変な制約が発生してしまうから。

393 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 20:45:33 ]
boost の shared_ptr のコンストラクタや ptr_container の追加関数は
確か失敗したら delete される設計になってた。

394 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 02:56:30 ]
>>390
そのインターフェースなら a.add(new X) したくなりそうだから、 delete したほうがいいと思う。

395 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 20:01:08 ]
>>393
スマートポインタと一緒にしちゃだめでしょ。

>>394
X x;
a.add(&x)で落ちてもいいんだね。

396 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 20:08:30 ]
>>395
boost::ptr_vector

397 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 20:27:03 ]
C++で動く、フリーなライセンスの行列演算ライブラリはありませんか?

398 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 21:13:04 ]
boost


399 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 21:34:13 ]
boost::uBLASな



400 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 00:34:47 ]
boost::uBLASってパフォーマンスより安全性とかを優先してて遅いとか、
書かれてるけど、実際どうなん?

401 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 00:48:54 ]
boost::numeric::ublasは遅くないぞ
パフォーマンス表も書いてある

boost.cppll.jp/HEAD/libs/numeric/ublas/doc/overview.htm

402 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 01:02:54 ]
liboctaveより遅いけどな

403 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 01:07:56 ]
そうかもしれんがBlitz++のように途中で更新停止したり
するのが怖い
boostならまずそういう事はないだろうし

404 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 01:25:54 ]
確かに。メンテされ続ける安心ってのは大事だな。

405 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 01:56:56 ]
Program Optionsとか放置されてて酷いけどな。
一度使おうとして、あまりにも酷い出来で、ワイド文字対応がなってなかったんで、あきらめた。
内部的には全部マルチバイト文字にしてやがる。
そのため、ワイド文字でデフォルト値とか設定しようとするとコンパイルエラー。
少しいじって、utf16からutf8に変換するようにしてやれば動くが、
わざわざそんなことするぐらいなら、自前で書いたほうがいい。

ありゃ絶対に、一文字は絶対に一バイトで、しかも7bitに収まるって前提の南蛮人の書いたコードだ。

406 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 02:19:23 ]
progressbarは?

407 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 03:59:44 ]
>>401
ありがとうございました。
ありがとうございました。
ありがとうございました。

408 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 07:53:35 ]
>>395
> A のオブジェクトは A::add() で追加した X のオブジェクトを delete する義務があります。
これが前提じゃないのか? new してないものは最初から渡せないだろ。

409 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 08:08:55 ]
「渡せない」と「渡さない」の違い



410 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 09:33:28 ]
すみません。boost::numeric::ublasを教えていただいた者ですが、
vc8でdebugモードとreleaseモードで結果が異なり、debugモードでのみ正常に動作します。
使用しているboostは1.34ですが、これにはバグがあるんでしょうか?
面倒なのでアップデートしたくないのですが・・・。
boostコード中で警告4267と4244が出てくるのでboostが原因かもしれませんが把捉しかねる状態です。
ご教示願います。

411 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 10:59:43 ]
engineering.meta-comm.com/boost-regression/1_34_1/user/numeric-ublas_release.html

1.34.1で悪いけど。
結構厳しいね。

412 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 12:45:56 ]
>>397
俺はliboctave使ってたよ
もう遅いかもしれないけど…

413 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:07:42 ]
C++ 始めたばっかなんですが、
this はなんでポインタなんでしょうか
せっかく参照というものがあるのに...

そんで、今日は C++ のオブジェクトが自身への参照を
self という名前で持てるようにいろいろがんばってました。

具体的には、そのクラスを継承したらクラス定義の中で self が使えるようなクラスを作ろー...と思ってたんですが、うまくいかず。
結局
#define self (*this)
しか思いつきませんでした orz

こういうんじゃなくって、ちゃんと自分自身への参照をメンバ変数にもつオブジェクトは作れないのでしょうか。

414 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:18:51 ]
>>413
別の表記方法がないなら*thisでいいじゃん。表現に揺らぎがなくて結構なことじゃないか。同じものをいろんな名前で表現させるほうが混乱するんでないかい?
size length len count distance 同じ意味だったり違った忌みだったり混乱するね。

415 名前:デフォルトの名無しさん [2008/06/28(土) 21:25:04 ]
>>413
昔、this = malloc(1); てな構文があったんだよ

416 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:29:05 ]
>this はなんでポインタなんでしょうか
thisが C with Classes に導入されたときには参照はまだなかった

417 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:31:11 ]
JavaからC++への移行は推奨しません。

418 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:47:59 ]
selfってことはJavaじゃないと思う

419 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:50:43 ]
Object Pascalだね。




420 名前:デフォルトの名無しさん [2008/06/28(土) 21:51:42 ]
C++ではboostはデフォなのか?

421 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:51:52 ]
現代版#define BEGIN {ですね、わかります。

422 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:58:28 ]
>>420
一部はデフォになりつつある。

まあ、知って損はない。俺も最近使い始めた。今まで知らなくてずいぶん損したと思う。

423 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:59:31 ]
>>420
中にはそういう人間もいる(俺もその1人だがな)。
当然、すべての人間にとってそうとは限らない、いつだって使えるとは限らないから、
Boostデフォを妄信するのは危険。使えないときは反動でだるくなる。

424 名前:440 mailto:sage [2008/06/28(土) 22:49:03 ]
>442
勉強しておくよ。
GCとか便利そうだし

>443
仕事の場合だと、使えない場合が多そうだな。



425 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 22:50:24 ]
今テレビでターミネーター2やってるよね。
未来から来たって話。

426 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 22:59:36 ]
>>424
440基準でも未来レスかよw

427 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:01:52 ]
Testってクラス書くとして

Test.cppとTest.h用意?
Test.cxx作ってそこに全部記述?



428 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:02:56 ]
Testを他で使うなら.hも作っとけ

429 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:05:05 ]
Test.hppにテンプレートクラスでイナフ



430 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:11:42 ]
hppだとどういうコーディングルールがベスト?
サンプルないかな?

431 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:14:01 ]
boost

432 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:14:07 ]
>>426
意味不明だよ。


433 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:15:01 ]
IDテスト

434 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:16:10 ]
>>430
hppでの例
www.boost.org/doc/libs/1_35_0/boost/shared_array.hpp

ベストかどうかは・・・分からんけど。

435 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:17:05 ]
>>432

424 :440 [sage] :2008/06/28(土) 22:49:03
  >442
  勉強しておくよ。

436 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:18:40 ]
>>434
オペレータの定義だけ外だし?

437 名前:413 mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 12:34:32 ]
google-styleguide.googlecode.com/svn/trunk/cppguide.xml
Google社内でのコーディング規約らしい。例外は悪か、やっぱり。



439 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 12:55:16 ]
>>438
全部読んでないけど、「例外は悪」とは書いてないと思うよ。
Googleの場合はデメリットがメリットより大きいから使わないという話と思う。




440 名前:デフォルトの名無しさん [2008/06/29(日) 14:13:45 ]
C++0xがでたら、boostも用済みなんだろうか…というか組み込まれるのか?

最近C++の書籍がどんどん廃刊したり、改訂版が出ないのは、やはりC++0x
待ちなのかな?早くして欲しいもんだ。

441 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 14:16:53 ]
boostの一部は標準に取り込まれるが、
標準に新たな機能が追加されるわけで、
boostは更なる進化を遂げるだろう。

442 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 14:17:18 ]
coocle

443 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 16:03:01 ]
concept_map使った凶悪なライブラリがきっと入る、絶対入る

444 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 16:03:44 ]
使わない、って書いてあるけど、
標準ライブラリ等で例外が投げられる奴らはどう使ってるんだろう?
使ってないのか?
new も nothrow で使ってんのかね。

445 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 16:09:02 ]
catchしてNULL返す関数でラップしてるとか?

446 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 16:16:47 ]
>>438
> string tableName; // Bad - mixed case.
おいらは google で仕事はできない


447 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 16:19:09 ]
Googleに限らずどんな環境にも適合する人じゃないと駄目だよね。

448 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 16:19:53 ]
まあ、その辺は統一取れてりゃ合わせるよ。
よほど変なのでなければ。

449 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 16:20:16 ]
初心者もれに
string tableName; // Bad - mixed case.

なんでバッドなんだよって教えて干しいぉ?



450 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 16:24:31 ]
>>449
誰がBADだと言っているのかは知らんが、MixedCaseなのがいかんと言っているだけじゃないか。
要は、caseをmixするなってことだろ。

451 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 16:26:28 ]
変数名は全て小文字で。単語の区切りはアンダースコアで。
と書いてある。

452 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 16:28:25 ]
コーディング規約に違反しているから bad なだけ

453 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 17:01:58 ]
>>445
std::nothrowって知ってる?

454 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 17:05:12 ]
>>453
標準ライブラリが例外を投げないようにするのに、
どうやってstd::nothrowを使うのか教えてほしい。

455 名前:445 mailto:sage [2008/06/29(日) 17:08:18 ]
知りませんですた

456 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 17:34:59 ]
標準ライブラリから例外が投げられてもそのままキャッチしないで死ぬ
だけ、とか?
もしくは標準ライブラリも書き直して使っているとか。



457 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 17:40:28 ]
俺C++2年以上使ってるけど、例外処理ほとんどしたことない

458 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 17:50:04 ]
Cの癖が抜けてないんじゃね?

459 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 17:56:07 ]
まさにそれ…



460 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 17:57:11 ]
googleって例外使わないってことは
C++でも、全部defineかenum斬った値返すだけってこと?

461 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:04:01 ]
>>457
普段ほとんど気にしなくても、必要なときにキャッチするようにしておけば済むってのが強みだね。

462 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:08:41 ]
C++はマルチパラダイム言語でしかも多機能だけど、別に
それを全部使ってプログラムする必要はない。

むしろSTLも含めて常時全部の機能を使うのは大変。
その人に合ったコーディングスタイルでいいんじゃないかと
思う。

463 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:10:39 ]
>>462
ダメそれ無理

464 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:12:33 ]
>>463
え?全部の機能を常時使えって?
その方が無理でしょ
常に10冊ほどの本を隣に置いておかないといけなくなるよ

465 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:13:35 ]
より良い選択肢を無視するのは悪ではないか
けっきょく頑固な保守派はC言語をやれば良いではないか

466 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:14:40 ]
>>464
全部の機能を覚えてれば本置いとく必要なくね?

467 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:16:04 ]
>>464
学生じゃないなら20万ぐらいのドキュスキャン買って
本を全部PDF化するでしょ?

それで2画面で検索+コーディングするよね?
しない奴はカス

468 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:17:02 ]
ええっ
例えばSTLの関数名全部覚えられるか?
現在のC++のSTLは当初標準化に際して提出された文書の
サブセットだそうだがそれでも一冊の本が書けるほどだぞ

469 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:18:25 ]
例外大好きってわけじゃないけど、
RAIIしたら普通に例外に使わないか?
コンストラクタで例外出せないと、かなり面倒です・・・。



470 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:18:33 ]
関数名なんて覚える必要ないが、だいたいどういうことが出来るか
という全体像を掴んでいれば、その都度調べて使えるし、いつの間にか
覚える。

471 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:19:33 ]
>>462-464
よくわからんけど、話食い違ってるだけじゃね?

472 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:24:49 ]
std::locale とか std::codecvt とか一度も使ったことないや

473 名前:デフォルトの名無しさん [2008/06/29(日) 18:38:08 ]
>>468
んな必要ねーし
憶え方なんざ ISO/IEC14882 にだって書いてあるぞ

たかが few 万円の費用が壁になるようなアマチュアの道具ではないってだけさ

474 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:40:20 ]
few 万円で済めばいいが
俺はC++関連の本だけで既に百万は超えてる

475 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:45:14 ]
>>474
スゲェ俺一冊w

476 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:46:37 ]
一冊で済む奴はいいよな
俺頭悪いから、というかCの悪い癖を徹底的に取り除きたかった
からそれなりの出費を強いられたよ

477 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:50:37 ]
俺は入門書とD&Eで2冊だった。あとはweb。

478 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:51:15 ]
webって手もあるね。

479 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:51:55 ]
学校の図書館に散々リクエストしまくっている俺がいる。
卒業したらリクエスト出しづらくなるから、早く0xが出てくれないと困る。



480 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:54:06 ]
0xが2009年末くらいに出たとして、そこからそれに対応したコンパイラや
書籍が揃うまで、どのくらいかかるんだろうね。

481 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:55:03 ]
webも含めて、他人のソースを見るのは結構効果的だと思う。
オープンソース系や、STLとかboostとか。

482 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:55:57 ]
コンパイラの方はすぐだろ
書籍はそれから半年遅れてドバッと出てくるか

まあC++でほとんどのプログラミングテクニックは
出尽くしているから文法本しか買わないと思う

483 名前:デフォルトの名無しさん [2008/06/29(日) 20:16:51 ]
知り合いの達人プログラマーに
何から始めたらいい?って聞いたら
C++とロキやれって言われたけど

ロキってなに?

484 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 20:18:27 ]
Lokiは今更だなぁ。boostで良いと思うよ。

485 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 21:19:50 ]
コンストラクタやデストラクタにinline指定をして、メリットって
けっこうあるもん?

486 名前:デフォルトの名無しさん [2008/06/29(日) 21:23:55 ]
>>485
inline は使いまくるほど最適化がかかりやすくなる

487 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 21:26:53 ]
>>485
プロファイルしてみれ

488 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 21:35:44 ]
するってぇと、もはやコンストラクタは一般に
explicit inline 指定はデフォ?

489 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 21:37:19 ]
場合による。吐き出すコードのサイズと相談だ。



490 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 21:37:52 ]
force inlineして結果変った場合だけつけろよ
デバッグするとき泣くぞ?

491 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 21:49:44 ]
>>485
最適化がかかりやすくなるかもしれんが、実装をヘッダに晒すようだとデメリットも大きい。
inline で向上する効率を確かめて、さらにそれが必要だといえる時だけ使うのがいい。

492 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 21:55:14 ]
L2キャッシュに収まりきらないコード量をinline指定によって
吐くようになった場合はかえって性能が低下する事がある

実際に走らせてみるかプロファイル取ってみるかだな

493 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 21:56:36 ]
アクセッサ程度のメンバ関数なら、無条件でinlineでおk?

494 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:11:51 ]
おk

495 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:19:36 ]
逆にヘッダに実装書きつつ、inlineにしたくない場合って
void hoge::hage(){...} ってクラス定義の後に分けて書けば良いんだっけ?
※コンパイラオプションはそのままで

496 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:23:45 ]
>>493
491と同じではないかと思うけど。
C++ coding standardに載っている時期尚早な最適化(だったかな)じゃないかと思う。

497 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:24:26 ]
ヘッダに非inline関数の実装を書いたら、そのヘッダを取り込んだ
翻訳単位それぞれに関数の定義ができて、重複エラーになるんでは?

498 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:30:16 ]
>>497
普通なるね。

499 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:33:20 ]
>>497
ならない。

inline 関数の定義が、リンクされるすべてのコンパイル単位間で矛盾して無い限りは問題ない。



500 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:33:33 ]
重複した同じ定義を一つにする方法って無いんだったっけ?
テンプレートクラスとかの型毎のインスタンスはリンク後は一つになるよね?

501 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:34:08 ]
>>499
非inline関数でっせ?

502 名前:499 mailto:sage [2008/06/29(日) 22:34:30 ]
あれ?非inlineか。ごめん。

503 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:41:40 ]
クラスの中に

static int a[] = {} かけないんだっけ?

504 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:50:36 ]
>>503
無理
static const int のみ初期化OK

505 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:52:14 ]
もっというと整数型がOKってことみたいだね。long や shortも
初期化おk

506 名前:497 mailto:sage [2008/06/29(日) 22:57:12 ]
よく考えたら、
メンバ関数ならOKで非メンバ関数だとNGじゃないかな。

507 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:59:55 ]
>>506
どっちでも同じ。ただしメンバ関数をクラス定義内で定義した時は自動的に inline 扱いになる。

508 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 23:35:16 ]
>>506
俺が497だwなりすますな

509 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 23:52:16 ]
最近のC++の流行では
getter/setterはどうやって書くの?



510 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 23:55:30 ]
マクロを使って読みにくく且つ簡潔に書きます

511 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 23:55:57 ]
今までの話の流れからすると、実装はソースファイルに書くのが
基本みたいな話だね。ただ、inline指定してみて効果が顕著だったら
inlineにするみたいな。
しかし、ほとんどの参考書では、GetやSetはクラスの型定義内に
inlineとして実装されてるよね。あれが誤解の元なんだろうか。

512 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:00:23 ]
誰か>>500教えて〜

513 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:02:22 ]
リンカがよきにはからってくれるんじゃないの?

それか明示的にインスタンス化しておくとか

514 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:06:04 ]
inlineはコンパイラによってはデフォルトで無視されるし
あまり気にしなくていいんじゃないの?
CPUがリターンキャッシュ持ってれば

515 名前:デフォルトの名無しさん [2008/06/30(月) 00:17:18 ]
>>492
P6のばやいL1じゃね?

516 名前:デフォルトの名無しさん [2008/06/30(月) 00:26:54 ]
>>514
無視するコンパイラにも、なるべく広範囲のソースを見せたほうがいい
処理系には何がしたいのかを伝えよ、禿の格言にもあるぞ

517 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:27:04 ]
なんか初歩的な質問かもしれませんが、変数名やクラス名ってどう名づけてます?
変数や関数、インスタンスは小文字から始まり、
クラス名は大文字からはじめるのが一般的なんでしょうか
また、分かりやすい名前をつけると、クラス名とそのインスタンス名がかぶってしまうんですが、
何か分け方はありませんか

518 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:31:40 ]
クラス名・変数名に迷ったら書き込むスレ。Part12
pc11.2ch.net/test/read.cgi/tech/1206118762/

ここで聞いてみるとか

519 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:36:48 ]
>>517
クラス名の最初にcを付けてる



520 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:41:40 ]
>>517
先生方のルールを参考にしてはどうかな
www.boost.org/doc/libs/1_35_0/boost/multi_array.hpp

521 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:53:51 ]
一応>>520のを書いておくと

クラス名        :小文字+アンダーバーの組み合わせ(例:multi_array)
ネームスペース名 :クラス名同様
ローカル変数名  :クラス名同様のルールで短めに
メンバ変数名    :クラス名のルールに加えて最後にアンダーバー
             短くなくても良い(例:allocated_elements_)
関数名        :クラス名同様
テンプレート型引数名:パスカルケース(例:NDims)
マクロ名       :大文字+アンダーバーの組み合わせ
             (BOOST_STATIC_CONSTANT)

522 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:54:58 ]
typedef enumはどうすれあいいの?

523 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 01:03:51 ]
typedefはクラス名同様
enumはメンバ変数名と同じ

ただ、boostの中で完全に統一されてるわけでもないみたい

524 名前:デフォルトの名無しさん [2008/06/30(月) 01:04:28 ]
>>517
unko_t unko;

525 名前:デフォルトの名無しさん [2008/06/30(月) 01:16:04 ]
Cの勉強をしているのですが、VCでスタティックライブラリを作ってみたりしました。
その後、似たものでシェアードライブラリ(.so)なるものがあるのを知ったのですが、
VCで作成することはできますか?
検索してもgccばかりが見つかってしまって。

ライブラリのファイルがないとexeの実行ができないようですが、dllと何が違うのか分かりません。

526 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 01:20:46 ]
>>525
dll と同じようなものです
UNIX系では shared object
Windows系では dynamic link library

527 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 01:41:04 ]
>>517
>438で出てたGoogleのルールのまとめ:
●ファイル名
ぜんぶ小文字で、単語は_か-で区切る。foo-bar.cc
●クラス名
各語の先頭を大文字にする。 FooBar
●名前空間名
ぜんぶ小文字。区切りについては明記してないけど、_? foo_bar
●変数名
ぜんぶ小文字で、単語は_で区切る。 foo_bar
●メンバ変数名
ぜんぶ小文字で、単語は_で区切り、最後は_にする。foo_bar_
●関数名
クラス名と同じ。アクセサだけは変数名と同じ。
●定数
先頭にkを付けて、単語区切りは大文字。 kFooBar
●マクロ名
マクロなんて使うな。

アクセサと定数が妙だなあ。


528 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 02:07:19 ]
定数の接頭語のkって何の意味?

529 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 02:13:43 ]
konstant。なぜかこれだけドイツ語。



530 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 02:13:47 ]
koteiのk

531 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 02:16:10 ]
>>518-521,527
細かくありがとうございます
いろいろな方法があるんですね
検討して、しっくりくる方法を選びたいと思います


532 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 03:23:02 ]
constant でプレフィクス c だと、コーディング規約にも関わらず class と混同しそうだな
マクロ禁止なら全部大文字でもよさそうだが・・・

533 名前:デフォルトの名無しさん [2008/06/30(月) 03:40:28 ]
メンバはm_というつまらん駄洒落をまだやってる俺はどーせM$かぶれだい

534 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 07:48:41 ]
>>533
boostにもあったりするよw
www.boost.org/doc/libs/1_35_0/boost/regex/v4/regex_format.hpp
> const traits& m_traits;
> const Results& m_results;
> OutputIterator m_out;
> ...

535 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 12:36:05 ]
標準的な識別子のプレフィックス一覧みたいなのなーい?
てか、どこの会社でもまちまちなんだろうけど。

536 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 12:41:49 ]
プレフィックス一覧って?
命名ルールなら上で出てるgoogleかboostので十分だと思うけど。

537 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 15:27:37 ]
なんか、なんちゃら記法みたいなのなかったっけ?
ポインタはpを付けるとか。C言語の時代か?

538 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 15:49:34 ]
ジャンガリアン

539 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 15:50:56 ]
ハンガリアン記法
ja.wikipedia.org/wiki/%E3%83%8F%E3%83%B3%E3%82%AC%E3%83%AA%E3%82%A2%E3%83%B3%E8%A8%98%E6%B3%95

ただし、ポインタにpを付けたりするのは
システムハンガリアンと呼ばれる間違ったハンガリアン記法。

本当のハンガリアン記法は
アプリケーションハンガリアンと呼ばれてる。



540 名前:デフォルトの名無しさん [2008/06/30(月) 19:08:04 ]
禿リアン

541 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 19:30:34 ]
>>539
おお、それそれ。なんか批判が多いみたいだね。保守が大変とか。
けっきょくプレフィックスなんてないほうがいいのかね……


542 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 19:44:44 ]
プレフィクスの使い方を間違わなければ有用らしいよ

間違ったコードは間違って見えるようにする - The Joel on Software Translation Project
local.joelonsoftware.com/mediawiki/index.php/%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E8%A6%8B%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B


543 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 20:29:03 ]
つまりアプリケーションハンガリアンてのは、識別子の補助的な意味を表す
プレフィックスを付けるって感じ?
システムハンガリアンはデータ型を表すプレフィックスを付けてるのかな?

544 名前:506 mailto:sage [2008/06/30(月) 21:13:12 ]
>>508
ごめん。眠かったから間違えた。 by498

545 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 23:01:10 ]
void hoge(const std::vector<foo>& foos);
という宣言をヘッダ(hoge.h)に書いたとき,fooを宣言している
ヘッダもhoge.hでインクルードしないといけないでしょうか?
それともhoge.hでは
class foo;
と書くだけでおkでしょうか?

546 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 23:50:55 ]
データを線形リストでアクセス可能かつキューのように
扱えるデータ構造ってありませんかね?

data[3].hogeみたいにアクセスもしたいし
dequeue(data)みたにもアクセスしたい

547 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 23:58:57 ]
>>546
std::dequeが火を噴くときが来たな

548 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 01:19:19 ]
なんという出番w

549 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 08:09:47 ]
>>545
標準ライブラリのテンプレート引数は基本的に完全型じゃないとダメ。
つまり class foo; だけじゃダメ。



550 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 10:33:31 ]
forkについて

1プロセスで三回printfを実行して別プロセスを作成
そこからまた三回printfを実行して別プロセス
10プロセス実行完了したら最初のプロセスから終了していく

そんな課題なのだけどforkが理解できなくて困っている…
申し訳ないですがバカな俺でも理解できるように解説してくださらんでしょうか?

551 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 10:59:33 ]
>>550
まずスレ違い。OSの話で言語と関係無い。
で、もうちょっと端的に質問しないと、ググって出るような解説をするしかないよ。

552 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 11:05:57 ]
>>550
fork → UNIX/Linux系のシステムコールで環境依存
printf → C言語
【初心者歓迎】C/C++室 Ver.55【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1213466622/l50

>そんな課題
C/C++の宿題を片付けます 111代目
pc11.2ch.net/test/read.cgi/tech/1214563642/l50

>解説して
www.google.com/search?q=fork

553 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 12:25:56 ]
質問です。
newでメモリを動的確保する場合失敗するとNULLが返るのですが、
これを意図的に失敗させたい場合どのような手段があるでしょうか?
どういう場合にnewが確実に失敗するのかがよくわかりません。
よろしくお願いします。

554 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 12:33:52 ]
>newでメモリを動的確保する場合失敗するとNULLが返るのですが
返らないよ.
newが失敗したらbad_allocって例外が投げられる
ためしに以下の失敗するコードを実行してみるといいよ
char *a = new char[0x7FFFFFFF];
if (a == NULL) printf("%s", "メモリ失敗"); // 標準準拠のコンパイラではこのコードは絶対に実行されない

555 名前:デフォルトの名無しさん [2008/07/01(火) 13:11:01 ]
>>554
先生、失敗しないんですけど

556 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 13:24:11 ]
ワロタ

557 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 14:28:44 ]
>>555 for (;;) で囲め。

559 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 15:19:53 ]
コンパイラのバージョンを聞いたほうがいい
古いやつとか組み込み用は標準と違う動作をするだろ



560 名前:553 mailto:sage [2008/07/01(火) 16:19:49 ]
ご回答ありがとうございます。
コンパイラはVC++2005付属のMSコンパイラVer 8.00.50727.42です。
>>554のサンプルコードを試しましたが、確かにNULLでなく例外を投げていますた。
コンパイラが古いとNULLを返す仕様になっているのでしょうか?

561 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 16:27:37 ]
10年くらい前なら NULL を返したかもしれない
今はみんな bad_alloc を投げる

562 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 18:37:37 ]
msdn.microsoft.com/ja-jp/library/kftdy56f(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 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 18:54:03 ]
失敗時に NULLがほしいときは new (std::nothrow) じゃなかったっけ。

564 名前:デフォルトの名無しさん [2008/07/01(火) 19:52:48 ]
>>557
数学的に破綻してるコード嫌い

565 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 19:57:04 ]
今、MSもVC++ Express Editionなる、無料コンパイラ配布してんだし、
最新の2008を使うべきでは。商用コンパイラ必要になるほどの
大プロジェクトじゃないならね。

566 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 20:00:24 ]
>>564
数学的に破綻って?

567 名前:デフォルトの名無しさん [2008/07/01(火) 20:18:41 ]
>>566
失敗しない環境がありうるだろ
7で始まるのがプゲラとか言う問題ではない

568 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 20:43:06 ]
大抵の環境で失敗するだろうから細かいことはいいんだお!

569 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 20:44:11 ]
size_tの最大値じゃん。



570 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 20:56:07 ]
>565
Express Edition は無料でいいんだが、MFCが使えん。

お偉いさんは、見た目が一番なんだよ。

571 名前:デフォルトの名無しさん [2008/07/01(火) 21:53:20 ]
>>570
見た目を気にするなら、なおさらMFCはダメだろ

572 名前:デフォルトの名無しさん [2008/07/01(火) 22:11:16 ]
>>569
何が?

573 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 23:35:10 ]
size_tは符号無し整数だよ。サイズは処理系定義だけど。
それはともかく、普通に2Gも確保出来るってのが・・・w

>>565
2008はWin2Kに入らなかったりしてなw
2Kをバカにすん(ry

>>570
WTL+ATL使おうぜ

574 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:01:19 ]
>>573
メモリ確保操作は、物理メモリのサイズが足りなくても
アドレスだけ確保して返して成功してしまう場合がある。
実際に手元の2GBしかメモリ積んでないマシンで2.5GB確保してもなんなく成功する。

これは、デマンドページングといって、物理メモリの確保が
実際にメモリを踏んだ段階で初めて起こるような仕組みが存在するため。
C++のnewの場合は、コンストラクタでメモリを踏んでしまう場合があるから
この仕組みがあったからといって実際に得はしないような気はするけどな。

575 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:04:33 ]
UNIX系はそうなんだっけか
まあVCには全く関係がないな
連続した大領域確保しようとするとよく失敗するし

576 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:11:04 ]
>>574
デマンドページングが動いている状態で、実際には確保されていない(&できない)アドレスにアクセスしたらどうなるの?

577 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:12:46 ]
>>574
単にスワップメモリで足りただけじゃね?

578 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:24:19 ]
>>576
典型的にはいらないページをスワップアウトしにいく

>>577
確保だけならスワップは発生せずに即終了する

579 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:35:06 ]
「スワップに充分な領域が必要」な環境もあるし
「スワップに余裕があるか判断しない」環境もある。
後者だと、アクセスした途端にシステム全体でのメモリが不足することになる。
www.linux.or.jp/JM/html/LDP_man-pages/man3/malloc.3.html
>>578の世界はLinuxだけで出来ている模様。

あと、どうしても失敗したければ
new char[2 << (sizeof(void *) * CHAR_BIT - 1) - 1]; を2回もやれば十分だろうが
この2を2Lにしないとオーバーフローする環境もあるし
逆にlong引数のnewを認めない環境もあるんだろうな。



580 名前:デフォルトの名無しさん [2008/07/02(水) 01:31:51 ]
> new char[2 << (sizeof(void *) * CHAR_BIT - 1) - 1]; を2回もやれば十分だろうが

だから、何でそうなる

581 名前:578 mailto:sage [2008/07/02(水) 01:42:20 ]
>>579
ん? なんで自分がバカにされているのか全然理解できないんだけど
いろいろな環境があることを頭に置いているからこそ578では
「典型的には」と頭につけたんだけどな

あとそのコード変だよ
少なくともビットシフトされる方は 2 じゃなくて 1 じゃないとおかしいし
そういうことやりたいなら
new char[std::numeric_limits<size_t>::max()] で十分じゃないかな
# ちなみにこういう最大限のメモリ確保は常識的な環境ならば1回ですぐに失敗するはず
# なぜなら、普通はスタックのためのアドレス空間やカーネルアドレス空間が同居しているから

582 名前:デフォルトの名無しさん [2008/07/02(水) 12:26:21 ]
> new char[std::numeric_limits<size_t>::max()] で十分じゃないかな

やっと出てきたw
が途中UNIXが出てきたり、やっと出てきたこれもmay beな言い方なので合格点はやれんな

583 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 12:35:24 ]
std::size_t

584 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 12:36:06 ]
SIZE_MAX

585 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 17:29:52 ]
樹木型(IPアドレスのような)のクラスを作成するにはどのようにしたらいいですか?

588 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 17:34:46 ]
class Tree {
Tree[] subtrees;
}

589 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 17:36:01 ]
ここC++だったorz
こんなのでいいんじゃない
class Tree {
std::vector<Tree*> subtrees;
};



590 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん [2008/07/02(水) 18:27:09 ]
>>587
C++を使う
できない人は他のスレで聞く

592 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 18:47:12 ]
>>591
ここってC++スレじゃないのか??

593 名前:デフォルトの名無しさん [2008/07/02(水) 20:33:00 ]
>>592
そうだけど、あの聞き方ではhello worldから教える必要があるだろ

594 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 20:53:29 ]
俺も興味あるんだが多階層にクラスを定義した場合下みたいな使いかたってできる?
Aclass.Bclass.element = NULL
昔クラスのpublic下にクラスを定義し派生用の関数で増やせるようなものを作ろうとしたんだがうまくいかなかった記憶があるもんで…

595 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:03:01 ]
class Hoge {
const char msg="nullpo";
}

これだとエラー出ますが、こういうことをconst付けてやるにはクラス外に書くか
クラス.cppの方に書くか、もしくは使用する関数の中で書くしか無いのでしょうか。

596 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:03:35 ]
大体型がおかしいだろ。
staticつけとけ

597 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:22:21 ]
よーだょ。
ただしbool/char/short/int/long系に限りできる。floatは×

598 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:23:55 ]
どうも、static付けてみます

599 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:40:22 ]
enumが便利だよ



600 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:45:09 ]
あ、なるほど。すっかり忘れてました。

601 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 00:45:52 ]
C++0x出たら、ハゲはプログラミング言語C++の改訂版だすのかな?
なんか第3版の次の版が洋書では出てたけど、日本語版はスルーなのかな。
まぁこのタイミングでだしてもしょうがないし、できればC++0x反映させた
版を出して欲しいけどね。

602 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:10:26 ]
const 定数のみのクラスってどうやってかけばいいのですか?
あとこういうエラー用の定数クラスは1枚のファイルに1こずつ
定義するのが流儀?

603 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:14:11 ]
Javaじゃあるまいし

604 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:29:34 ]
>>602
なんでクラスの中に定義する必要があるの
せいぜいネームスペースでいいじゃん

605 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:34:25 ]
シングルトンですけど、boostに入ってないですよね?
Lokiぐらいしかないんでしょうか?

606 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:45:21 ]
すみません、素朴な疑問なのですが
C++ではハードあるいはOSレベルの例外(例えば零による除算)は
通常どのように扱うののでしょうか?

もう少し具体的に言うと、例えばVC++なら_ _try, __except という
構造化例外のための機能が提供されていますが、
gccなどの他のコンパイラではこれと同様な機能を実現する手段は
ないのでしょうか。

windows, linux 双方で稼動させる必要のあるシステムを作るとしたら、
例外処理をどのようにするべきなのか非常に疑問です。

607 名前:606 mailto:sage [2008/07/03(木) 01:47:54 ]
うーん・・・

msdn.microsoft.com/ja-jp/library/cc440193(VS.71).aspx
>C++ でプログラミングしたり、コードに移植性を持たせたい場合は、
>可能な限り標準 C++ の例外を使うことを強くお勧めします。

developer.mozilla.org/ja/docs/C%2B%2B_Portability_Guide
>例外は、幅広くは実装されていない C++ の次なる一例です。
>そのため、それらの使用は C++ の移植性を低下させます。
>例外を使ってはいけません。運悪く、同じような機能をもったよい代替案はありません。

例外についての注意勧告がされていますが、では実際にどうするかという
代替案はないということなのか・・?

608 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:55:31 ]
>>605
209.85.175.104/search?q=cache:FXdOX_s6DgAJ:pc11.2ch.net/test/read.cgi/tech/1192662575/386-411+singleton

609 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:56:59 ]
鼻から悪魔という言葉があってな



610 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 02:05:31 ]
>>607
俺はWinCE用のソースとかでは
std::auto_ptr<std::exception> を戻り値にしてる。
コンストラクタで失敗したものは fail() で返す。
で、毎回戻り値などのチェック。

パフォーマンス悪そうだし面倒なので全部そうしてるわけじゃないけど。

611 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 02:09:18 ]
>>607
VC++の話をすると、/EH系のオプションがあって最適化やパフォーマンスの関係で使い分ける。
 オプションなしの場合C++例外は一切使わない。
 /EHs(c) 同期例外だけをキャッチする。c で extern "C"関数は例外を発生させないと仮定する。
 /EHa  同期と非同期例外をc++例外としてキャッチする。
で /EHaの場合は stack overflowを除くほとんどのハード系の例外をキャッチ出来る。
もちろんゼロ除算も。

612 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 02:09:23 ]
>>608
どうもです。
detailsの中にあることにはあるんですね。
とりあえずkろえを使っておきます。

613 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 02:26:36 ]
>>610-611
ありがとうございます。

VC++の場合はわかるのですが、
gccなどでは同じような処理を行えないのでしょうか?
メモリの不正アクセスにしろ零除算にしろ、いくらでも
起こりうる例外だと思うのですが、Javaのように
統一的にcatchできないものかと悩んでいます・・・。

実際、至るところで零除算の起こりうる数値解析の
ようなシステムを作ったとして、いざシステムを起動
したら零除算で処理が中断したが、どこで起こったかは
わからない、なんてことは有り得ないですよね・・?

614 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 03:24:19 ]
gccというよりunix系だとそういうのはsignalではないかな。
ゼロ除算ぐらいなら例外ではなくてプログラムで事前にチェックすべきもので、
メモリの不正アクセスはデバッグ時に潰すべきもので、
例外でキャッチしてリカバリーをかける類のものじゃない。


615 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 05:55:32 ]
>>585
最初から vector<shared_ptr<parent> > だけ使ってればいいんじゃね?

616 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 05:59:33 ]
>>594
struct { struct { void* element; } Bclass; } Aclass;
よくわからんが、これでやりたいことができたことになるの?

617 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 06:33:36 ]
>>607
どこまでの移植性が必要かで判断すればいい。
Windowsだけなら構造化例外を使ってもいいだろうし。、gccあたりを含めるならくらいなら例外は使えるだろうし。


618 名前:デフォルトの名無しさん [2008/07/03(木) 09:30:37 ]
>>607
mozilla のページ、情報がえらく古いな
もっとも古いというだけでは済まされない記述も散見されるが

619 名前:585 mailto:sage [2008/07/03(木) 10:09:51 ]
>>586
目からうろこがぼろぼろでた気分です。
ありがとうございました。



620 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 12:55:48 ]
状況による面もあるけど、
基本的にBBB1以外は間違った使い方だと思っていい。

622 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 13:07:39 ]
>>622
float -> double
もしくは
二進化十進表現でgoogle

624 名前:デフォルトの名無しさん [2008/07/03(木) 13:16:32 ]
>>623
できました><
floatって精度かなり悪いみたいですね・・・

625 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 13:40:07 ]
>>622
つうか思いっきりC言語じゃね?

626 名前:デフォルトの名無しさん [2008/07/03(木) 13:48:35 ]
Cで利用されることが推奨されているDLLがあって、そのヘッダファイルがC用に提供されていて、
それをC++で利用できない場合って、どういう理由が考えられますか?

できない場合があるとしたら、回避方法は、自分でヘッダを修正するってことでしょうか?

627 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 13:57:25 ]
マングリング
extern "C"

628 名前:デフォルトの名無しさん [2008/07/03(木) 16:25:02 ]
>>626
#ifdef __cplusplus
#error C++ is not supported
#endif
とか書かれてるなら諦めるしかないだろ。

629 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 18:03:14 ]
スレ違い、Win32APIスレで聞いたら

631 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 18:18:18 ]
>>620
BB1は安全。戻り値最適化が期待できるので速度も十分
BB2は参照が生きているうちにAAAが削除される場合に問題が発生するが、それに気をつければ高速に使える。
BB3は危険。別のshared_ptrに戻りを代入するミスを誘発しそう。

632 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 23:49:12 ]
BBB2も代入できるだろ

633 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 21:52:38 ]
C99では
if (...)
statement...;
else
statement...;
などのstatementがそれぞれ{}で囲まれたように扱われるようですが
これはC++から来たものなのですか?

634 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 21:54:36 ]
元から (C89から) そうでは?

635 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 21:59:52 ]
C99よく知らないんだけど、
囲まれたように扱われる場合と
囲まれたように扱われない場合って何が違うの?

636 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 22:08:27 ]
変数のスコープのこといってるんじゃね?

637 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 22:11:41 ]
>>636
そもそも{}で囲まないと変数は定義できないだろう。

638 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 22:14:32 ]
もともとif文の構文は
if (expr) statement [ else statement ]

expr ; の形の単文はstatementだから{}で囲む必要は無い
複文はstatementではないから、{}で囲んでstatementにしなければならない

そんだけのことだ
C99とかは関係ないだろ

639 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 23:36:13 ]
seclan.dll.jp/c99d/c99d07.htm#dt19991108
「選択文と反復文のブロック化」のことだな。
C++にもあるぞ、X3014:2003「6.4 選択文」の1, 2節目などなどに規定がある。

そこではこういう例が載せられている。
if (x)
  int i;
このルールによって、if文を抜けたらiはもう使えないという具合。

>>637
C++だと、ブロック内の宣言は文だから、できるんだなこれが。
C99だと(なぜかC++と違って)文ではないから、お前の言うとおり出来ないけどな。



640 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 04:17:21 ]
>>639
そんなVC6の時代の知識で語られても。

641 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 04:23:29 ]
VC6でお世話になったマクロの意味がわかる
#define for if (0); else for


642 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 13:09:27 ]
#define 定義は極力使わない方がいい、と、セキュアプログラミング系の本に書いてあったが

643 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 13:13:43 ]
>>642
それは生兵法というもの

644 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 13:30:48 ]
#define SubclassWindowみたいなマクロは死ねばいいと思う
使うならせめて大文字ですよね

645 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 13:51:36 ]
>>642
OpenSSL脂肪wwwwwwwww

646 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 14:42:59 ]
あとで#undefで即死されるマクロはいつもasdfだとかzxcvだとかに命名してる

647 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 16:56:32 ]
>>646のコードはメンテしたくない。

648 名前:デフォルトの名無しさん [2008/07/06(日) 20:25:50 ]
同じく

649 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 08:09:21 ]
hogehogeマクロ内でboost.pp.repeatとかつかってて子マクロが必要なら、
hogehoge_iとかhogehoge_iiにしてる。
後で#undefで即死されるのは同じだが。



650 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 00:13:06 ]
while(1)中のswtch文で特定のcaseの場合whileから抜けたいのですが2重の構造をbreakさせる方法はありませんか?
gotoで抜ける手も考えましたがあまりスマートな方法じゃないのでできれば避けたいです

651 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 00:13:48 ]
while(1)をやめる

652 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 00:19:50 ]
whileの代わりにgotoをつかえばいい

653 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 00:26:15 ]
>>650
フラグかgotoのどちらかを選ぶんだ。

654 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 00:29:06 ]
>>650
そのwhileブロックは、breakをreturnに変えて
何らかの意味のある名前を付けられるくらいの処理ではありませんか?

655 名前:650 mailto:sage [2008/07/08(火) 00:40:53 ]
whileを続行するかどうかのフラグ判定式に変更しwhileを抜ける場合はFALSEにセットしてからcontinueすればいい

656 名前:650 mailto:sage [2008/07/08(火) 00:42:49 ]
ということに気づき自己解決しました。
レスありがとうございました
(うっかりEnterと一緒にShiftを押してしまい途中で書き込んでしまいました…)

657 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 05:41:19 ]
あくまで自己解決と言い張るならもう質問すんなよ

658 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 06:09:44 ]
何怒ってんだよw

659 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 06:25:05 ]
657は別に怒ってないと思うが、658はなんでちょっぴり興奮してるんだろ、とは思う



660 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 09:38:38 ]
>>653 でフラグ使えと書いてるのに、そんなレスみるまでもなく自分で解決したよ
と言うからだろうw

661 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 09:56:40 ]
時間を鑑みるに、おっきしてるのを鎮めてる最中だったんだよきっと

662 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:15:01 ]
自分のレスの後、同じような内容で
自己解決したと書かれたくらいで、もう質問すんなとか、
もうちょっと心に余裕を持った方が良いかと。

663 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:20:05 ]
良いなぁこの馬鹿をかばう気持ち悪い空気

664 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:23:10 ]
相当頭に来てる御様子ですね。

665 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:27:14 ]
自己解決と書くのは、質問者が「お前ら役立たず」と言ってるようなもんだからなw

666 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:35:03 ]
>>664
ていうか、こう書けば誰を馬鹿と思ってるのかがわかると思ったんで。

なるほどね。

667 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:46:23 ]
>>666
>>662の後に>>663なら、普通は
>>650(馬鹿)をかばう気持ち悪い空気」と捉えるでしょう?
そこでこう書けばというのは、それこそ馬鹿丸(ry

668 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:48:25 ]
もう質問者にとって、このスレは用済みだからこねえよ

669 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 12:42:48 ]
>>667
うん、こう書けば、無駄に食い下がるかどうかで痛い人かどうかがわかると思ったんで。

なるほどね。



670 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 12:49:02 ]
オレには悔しいから一歩引いた視点の第3者を装って「なるほどね」と書いてるように見える。

671 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 12:50:18 ]
>>669
それは自虐ギャグですか?

672 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 16:19:05 ]
unique_ptrって本当にC++0xに入ってくれるんだろうか

673 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 16:47:35 ]
ばかばっか

674 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 17:18:49 ]
>>673
お前がな

675 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 17:26:45 ]
>>674
オマエモナー

676 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 17:27:46 ]
いってよし?

677 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 18:06:30 ]
逝ってよし

678 名前:デフォルトの名無しさん [2008/07/08(火) 22:11:51 ]
>>650
なぜスマートな方法ではないと思うのかを誤魔化さずきちんと述べよ

679 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 22:13:35 ]
gotoは悪って(事実かどうかは別にしても)よく言われてるからだろ。
多分。



680 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 22:38:18 ]
初心者スレと分けてる意味が無いように思う

681 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 00:33:06 ]
初心者スレってVC++しかなくね?

682 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 00:37:08 ]
出来ません

684 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 00:37:54 ]
>>683
ありがとうございます

685 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 07:03:55 ]
一度配列か何かを確保しておいて、そこにforで引数付きコンストラクタをnewして回せば解決する。
デストラクタに注意

686 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 12:38:32 ]
まずメモリに連続した領域内に生成したいものが、ほんとうに
クラスのインスタンスじゃないとダメなのか再考してみたら?

687 名前:デフォルトの名無しさん [2008/07/09(水) 12:41:11 ]
引き数つきのnewか…これはわりと難しいので、
あとで初期化用メソッドを呼ぶかポインタの配列にしたほうがらくちん。


688 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 19:09:17 ]
VC6以前のVS持っている人はいませんか?
DDE spyを分けて欲しいのですが・・・

689 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 19:18:31 ]
2.0のなら転がってるPCのHDDあされば出てくるかもだが・・・



690 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 19:56:05 ]
>>688
それってダメなんじゃないの?

691 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 20:48:29 ]
>>682
vectorじゃだめなのかい?

692 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 06:15:03 ]
最新のVC++コンパイラって、C99に対する完全な上位互換を持っていると
思っていいの?

693 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 07:29:57 ]
C99はまだスルーされてる

694 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 11:04:51 ]
まだどころか多分永遠にスルーされる
今の所C99に準拠しているのはIntel C++程度

695 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 11:05:45 ]
C99なんて有ったの… とか

696 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 12:30:01 ]
対応させるメリットないしな

697 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 14:39:59 ]
一行コメントと関数途中やfor初期化部での変数宣言に対応してくれればあとはいいや

698 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 15:25:18 ]
たしかVC++チームのブログのコメント欄だかで、C99対応してくれってユーザの声はほとんど無いって言っていたような。
C99のいくつかの有用な機能、一行コメントだとか、restrictだとかは取り入れたが、C99全部入れても、誰も使わないしなぁ。
Variable-length arrayなんて、いまどき誰が使うんだ。

699 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 15:51:39 ]
C++があるからねえ・・・



700 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 16:16:02 ]
gccでは可変長配列に対応してたりするけどな

701 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 17:36:42 ]
C99欲しい人は何が目当てなの?

702 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 17:39:47 ]
>>698
歴史的経緯でalloca()が実装されてないから、可変長配列はあれば便利だぞ。

703 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 18:04:05 ]
>歴史的経緯でalloca()が実装されてない
どこのはなし?

704 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 18:53:10 ]
stdint.hが欲しいんだ。


705 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 19:07:41 ]
よろしい

706 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 19:49:43 ]
そもそもallocaはC89、C99の規格の中には存在しない。
ありゃPOSIX規格のモンだ。
このスレ的にはWin32 APIと同等に扱われるべき環境依存の関数。

なんだけど、itoaとかと同じで、事実上無視できない存在ではあるね。
とはいえ、90年代ならまだしも、
今日び、スタックからわずかなメモリを確保できたところで、それほど利点も無いだろ。
現代なら定数時間でメモリを確保解放できるメモリプールで良いじゃん。

707 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 20:24:39 ]
C99を策定していた委員会の連中もC++98がこれだけ
広く使われるようになるとは夢にも思ってなかったろう。

でないとあれだけ緻密なC99の規格、しかもC89と互換性を
犠牲にしてわざわざ新しい規格を作るはずがない。

708 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 20:42:07 ]
>>706
>702は、POSIXにはあるallocaがWin32にはないから、代わりに使いたいと言ってるんじゃないかと。
確かに、freeする必要がないメモリを好きに取れるのは楽かもしれんね。
それこそ、今時スタックサイズをけちることもないんだし。

709 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 20:50:59 ]
ケチる必要は無いかもしれんが多用するのはバカのやることだぞ。
例えば、VCのリンカのデフォルトのスタックサイズは1MBだ。
何GBもメモリがある時代にたったの1MBだぞ。
*unixのことはよく知らんが、そう変わらんだろうよ。
現状の32bitコードで、スタックサイズが大きすぎると、
スレッドを数十個作っただけで、無駄にアドレス空間が浪費される。
だからスタックのサイズは小さいんだよ。



710 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 21:06:44 ]
>>708
_alloca()ならVC++でも普通に使えるよ

711 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 21:50:21 ]
こんなこともallocaと
って一度言ってみたいです

712 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 22:03:10 ]

         |:;:;:;:;:;:;:;:;:;:;:;:;:;:i;:;:;:;:;:;:;:;:;:;:;:;:;|
           |;:;:_:;:_:;:_:;:_;:;_:;:l:;_;:_:;:_:;:_:;:_;:_;|
        |______|_____|
        | 三|  _     _   |三 !
        | 三|  三シ   ヾ三  |三 |
        | 三′  .._     _,,..  i三 |
        ト、ニ| <でiンヽ  ;'i"ィでiン |三.|
        ', iヽ!  、 ‐' /  !、 ーシ |シ,イ
         i,ヽリ    ,' :  !.     |f ノ
         ヾ!    i ,、 ,..、ヽ   lノ
          |      _ _    イ l       malloca
            l    ,ィチ‐-‐ヽ  i /、
             ゙i、   ゝ、二フ′ ノ/'"\
              | \  ー一 / /   _,ン'゙\
          ,ィ|、  \     /_,、-'" _,.-''´ `丶、__
       _, イ  | ヽ_ 二=''" _,. -''´  """""´´  ``ー



713 名前:デフォルトの名無しさん [2008/07/10(木) 22:19:03 ]
alloca は gcc の configure でもチェックあるよな

714 名前:デフォルトの名無しさん [2008/07/10(木) 22:20:10 ]
> バカのやることだぞ

まだそんなカキコしてるんですか? にっぽんのドクターさん

715 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 23:11:49 ]
プログラム=PCアプリだと思ってる連中は気楽でいいのう・・

716 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 23:15:46 ]
どう気楽なのかキッチリ説明してもらおう。  (と言ってみる

717 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 00:06:24 ]
C99は無かったことにならないかな。下手にこんなのがあると、コンパイラ
ベンダーが、C99実装しかねない。

718 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 00:13:54 ]
たいていのコンパイラベンダはC++を優先するだろ

sizeofがコンパイル時定数にならないとか悪夢過ぎるだろ

719 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 00:51:13 ]
・conio.hを何とかして欲しい。
・stdint.hの声が何故大きくない?



720 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 00:58:56 ]
それにしてもC++自体が変態化してきて誰にも使われなくなりそうな気がするのは俺だけだろうか

721 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 01:06:43 ]
おれのVC++のソース、alloca普通に便利に使ってる

722 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 01:26:23 ]
C++はいろいろ変な部分があるが、
代わりになるいい言語がないのも事実
web限定とかだとPerl系に軍配が上がるが

723 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 01:40:53 ]
C++0xはC99みたいな立場になるだろうな
そして代わりに○○が台頭する

○○にはお好きな言語をどうぞ

724 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 01:55:57 ]
Obj-C

725 名前:デフォルトの名無しさん [2008/07/11(金) 01:58:45 ]
アプリケーション(ダイアログ)に表示された文字を外のアプリケーションから取得する方法ご存知のかたいませんか?


726 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 02:01:16 ]
D言語がいつか主流になる・・・
そんな風に考えていた時期がありました・・・

727 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 02:20:56 ]
>>725
君がすれ違いだということだけは、はっきりわかる。
プラットフォームすら記載されてないので、どのすれが適当かはしらん。

728 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 03:03:54 ]
>>726
今ひとつ流行らんよなアレ

729 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 04:15:06 ]
>>728
だってDは、「言語仕様が確定=開発終了」だもん。
D1の仕様は決まったけど、D2のほうが進歩してるのに誰がつかうよ。



730 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 12:54:57 ]
仕様と同時に実装が下りてくるってのもエキサイティングだとは思うがね
なんにせよ俺は指をくわえて見てるだけ

731 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 02:55:05 ]
無名namespaceについて教えてください。

名前のある名前空間の場合、
namespace hoge{
void f();
}
というように宣言して、後で
void hoge::f(){}
のように定義できますが、名前無しの場合
namespace{
void f();
}
として後で定義を書く場合、??::f()というような形式では定義できないのでしょうか?
もちろん定義のときも
namespace{
}で囲ってやればいいのでしょうが、関数定義のような長いものをブラケットで
囲むというのも、邪魔くさいなぁと思い。


732 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 03:05:35 ]
確かに邪魔くさいが、
だからこそそんなもの使わないですむようしておけって話じゃね?

733 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 03:08:33 ]
>>731
>として後で定義を書く場合、??::f()というような形式では定義できないのでしょうか?
こういう参照が出来ないからこそ役に立つんだと思う

734 名前:731 mailto:sage [2008/07/12(土) 03:15:56 ]
レスどうもです。

基本的に、C++では翻訳単位内でのみ使用する変数や関数は、C言語のような
staticを付けるのではなく、無名名前空間を推奨しているようですが、
そうなると関数の定義は
namespace{
void f() { }
}
のようにするということでしょうか。みんなそうしてるのかな。

735 名前:732 mailto:sage [2008/07/12(土) 03:27:22 ]
ごめん。 もっとくだらない理由だと思ってた。

"翻訳単位内でしか使わない"っていうことを明示したいなら、
その邪魔くさいnamespaseが(目立つから)役に立つだろうし、
邪魔くさいnamespaseを使いたくないってことは、
"翻訳単位内でしか使わない"っていうことを明示しなくてかまわない
と、俺は思うけど。

本当に邪魔だと思うなら、翻訳単位内でしか使わないとか、あきらめなよ。

736 名前:731 mailto:sage [2008/07/12(土) 03:51:39 ]
外部リンケージを持たせたくない変数や関数の宣言だけを
namespace{}に収めるところまでは、目立たせる意味でも
一覧という意味でも非常にスッキリしてると思うんですよね。
ただ、ここに関数のボディまで書いてしまうと、一望しづらくなるので
別途書くことになるのですが、関数定義をブラケットで囲むということに
少し拒否反応がでてしまった次第です。ただ、これしか方法がないなら
そうするしかないですね。邪魔だから使わないというわけにもいかない
機能ですし。あとは、関数定義1つ1つをnamespace{]で囲むのか、複数の
関数定義をまとめてnamespace[]で囲むのか、こだわれるところとしたら
そのくらいですか。



737 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 04:02:32 ]
すごい余談だけど、目立たせなくてはいけないのは、関数本体だと思うんだ。
関数本体をメンテナンスするとき、どの関数に使用されているかが問題になるので。

宣言が目立たないと、間違って呼び出そうとしてリンクエラーでるじゃん? それもいやじゃん?
ていわれりゃそうなんだけどさ。

738 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 08:09:05 ]
templateで、doubleとfloatだけしか使えないようにするには、
何か書き方があるのでしょうか。教えてください。
template<typename T> void hoge(T arg);

739 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 08:30:51 ]
template<typename T> void hoge(T arg){return;}
void hoge(double arg);
void hoge(float arg);



740 名前:デフォルトの名無しさん mailto:sage [2008/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 mailto:sage [2008/07/12(土) 08:35:10 ]
use_float_or_double()は定義されていない前提ね。
コンパイルエラーにさせるため。

742 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 08:39:49 ]
template<typename T> void hoge(T arg);
template<> void hoge(float arg) { }
template<> void hoge(double arg) { }

でいいじゃん。

743 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 08:44:11 ]
>>739 >>742
それだと
void hoge(float arg) {}
void hoge(double arg) {}
と同じだし、それぞれ実装書かないといけないから
テンプレート関数にする意味無いだろw

744 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 08:52:53 ]
>>743
同じじゃねーよ。そのコードでhoge("hogehoge")はエラーだけど>>739>>742はエラーじゃない。
テンプレートにする意味がないっていうのは質問者に言えって。

746 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 08:55:57 ]
>>745
いや、hoge("hogehoge")で>>742はエラーになるよ。

747 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 08:59:00 ]
質問者がdoubleとfloatだけしか使えないように、と言ってるので
使えてしまう>>739も駄目だな

749 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 09:04:54 ]
>>745
>テンプレートにする意味がないっていうのは質問者に言えって。
>>740>>747はテンプレートにする意味あると思うけど。



750 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 09:16:21 ]
>>747
テンプレートの特殊化は関数の多重定義に優先するから
意味が違う

751 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 09:21:25 ]
>>750
意味分かって言ってる?
それで困る「まともな状況」書いてみ

752 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 09:22:41 ]
テンプレートの特殊化と関数の多重定義を二つかくと
関数の多重定義の方が無視されるだろ

753 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 09:25:48 ]
>>752
>テンプレートの特殊化と関数の多重定義を二つかくと
それがまともな状況じゃないって言ってるんだよw

754 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 09:26:34 ]
>>753
メンテナンスの程度次第ではいくらでもあり得る。
まともかまともな状況じゃないかはお前が判断する事じゃない。

755 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 09:27:36 ]
>テンプレートの特殊化と関数の多重定義を二つかくと
>関数の多重定義の方が無視されるだろ

これ逆だよ。関数の多重定義の方が優先される。
だからテンプレートの特殊化と関数の多重定義は混ぜて
書くべきじゃない。

756 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 09:31:38 ]
>>754
ワロタwどんな糞メンテナンスだよw

757 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 12:06:44 ]
あれ?オーバーロードの方が特殊化より優先するよな?

758 名前:デフォルトの名無しさん mailto:sage [2008/07/12(土) 12:52:15 ]
>>757
>>755

759 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 12:38:07 ]
boostスレ過疎ってんな・・・w



760 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 13:14:51 ]
このスレ過疎ってるのでしょうか?
この話題↓で盛り上げてください!

やねう企画代表者やねうらお(本名・磯崎元洋)が
・ソフトウェアの不正コピーを行っていた
・労働契約上の違反をしていた
・他は不正コピーしていないことを証明しようとしてエロゲーのパッケージを発見し、
 写真に撮ってアップロードしようとした。
d.hatena.ne.jp/pmoky/19000106
やねう企画の裏側(競馬の詐欺ソフトの製作現場)
d.hatena.ne.jp/pmoky/20060510
d.hatena.ne.jp/pmoky/20060511
d.hatena.ne.jp/pmoky/20060512
有限会社やねう企画(所在地・大阪府八尾市末広町2−1−2)が計画倒産
www.sia.go.jp/~osaka/zenso/19.09.pdf

やねうらおプロフィール
性格:友達から「チンピラ」「ヤクザ」と呼ばれている。前世で殺人鬼だった宿業を背負っているという妄想(自覚)あり。
最終学歴:専門学校卒
主な職歴:有限会社センキ(凌辱系アダルトゲームの製作会社)を経て独立、有限会社やねう企画を設立、2006年に計画倒産
代表作:『夜這いマニア』『盗撮マニア』『お楽しみCDシリーズ』『競馬詐欺ソフト』『BM98』

やねうらお語録
>「ワシのほうが潔癖やと思うんやけどな。
>絶対に違法コピーのソフトしか使わんし。
>たとえば強盗に入ったときに、ちょっとかわいそうになって
>十万円だけ残してったら、おかしいやろ?
>自分の『強盗する』という意思に対して矛盾やろ?
>だからワシは、一個も買ったソフトを使ったことがない!!」


761 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 14:27:07 ]
キーワードによる自動コピペ

763 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 14:49:07 ]
memset や memcpy の動作について質問です。

memset(buff, 0, 0); や memcpy(buff, work, 0);

764 名前:763 mailto:sage [2008/07/13(日) 14:50:35 ]
すみません、途中で送信してしまいました。


memset(buff, 0, 0); や memcpy(buff, work, 0); のように
サイズが 0 の場合、何も行われないという認識で合っていますか?
MSDN では分らなかったです。

765 名前:デフォルトの名無しさん [2008/07/13(日) 15:06:56 ]
サイズ 0 ならガッされないなんて知ってても役に立たんだろ

766 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 15:09:41 ]
>>764
そういう場合、不安だったらmy_memsetかなんか一個かましておけ

767 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 15:12:29 ]
>>765
関数の呼び出し元にバッファ領域のポインタと領域サイズを渡させる場合に役に立ちます
memset や memcpy にサイズ 0 を渡しても大丈夫ということであれば、
領域サイズに 0 が指定された場合のエラーチェックをせずに済むケースがあるからです

768 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 15:25:06 ]
規格書にはn文字ほげほげするとだけしか書かれてなかった希ガス。
詳しく知りたければJISのサイトでX3010を検索。

769 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 15:44:01 ]
>>766
なるほど、それは確かに賢いやり方ですね。
ちょっと考えてみます。

>>768
調べてみます。

>>769
NULL チェックだけは避けられないということですね。
やはり、エラーをチェックする自作関数をかました方が良いのかもしれないですね。

771 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 18:18:24 ]
宣言と定義が別々になってるコンストラクタで、初期化リスト使う場合って
宣言と定義両方に初期化リストつけなきゃいけないんだっけ?

772 名前:デフォルトの名無しさん mailto:sage [2008/07/13(日) 18:20:42 ]
定義の方だけ
class A {
int a;
A();
};
A::A():a(0){}

773 名前:771 mailto:sage [2008/07/13(日) 18:25:33 ]
ありがとう。

774 名前:デフォルトの名無しさん mailto:sage [2008/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 mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 05:41:04 ]
まずいです。
h.func(a); を書いたソースから hoge::func の実装が見えるようにして下さい。
ようするに hoge.h に実装を書いてください。

777 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 05:50:17 ]
>>775
exportキーワードをサポートしてないC++処理系では無理

778 名前:774 mailto:sage [2008/07/14(月) 06:14:12 ]
>>776-777
まじですか。なんともめんどくさい。
設計からやり直さないと。
ありがとうございました。

779 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 20:11:37 ]
VC++ 2008はもうexportをサポートしてる?



780 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 20:14:37 ]
ネイティブコードなんてシロモノはOSぐらいしか使わないような世界になったなら、
exportもサポートされるかもな。

781 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 20:19:25 ]
じゃあ2008でも未サポート?

782 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 20:57:28 ]
>>780
なんで?

783 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 23:23:50 ]
今やオブジェクト間最適化が当然の如く行なわれている。
export実装がそんなに困難であるはずがない。

784 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 23:29:47 ]
コードレベルで保持しないとダメだから難しいでしょ。

D言語はうまいことやってるけど。

785 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 23:31:36 ]
そろそろVC++2008でexportが実装されてるか教えてくれてもいいだろう

786 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 23:33:17 ]
>>785
それがないんだな。

787 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 23:39:11 ]
うそ〜ん

788 名前:デフォルトの名無しさん mailto:sage [2008/07/14(月) 23:49:19 ]
exportが実装されるまでvcはスルー確定だな

789 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 01:19:30 ]
じゃ、どのコンパイラ使う気?



790 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 01:23:38 ]
Cマガってもう再開しないのかな。

791 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 01:25:14 ]
exportはおまえらが想像する程素敵じゃないのよとEffectiveC++3版にかいてあるよ

792 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 01:28:06 ]
Comeau

793 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 08:20:16 ]
ところでMore Effective C++が第2版になっても訳が最悪で読みづらいらしいが
実際どうなの?読む価値ナッシングぅ?

794 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 21:27:54 ]
>>793
読解可能なら原書を。
そうでないなら、項目を中心に辞書的に活用。

読む本としては厳しい。


795 名前:デフォルトの名無しさん [2008/07/15(火) 22:33:14 ]
「訳が最悪」という論評は原著が熟読できていて初めて可能
そうでなければ他人の論評の受け売り

796 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 22:36:38 ]
日本語版しか読んでないけど、読みにくいのは確か

797 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 22:47:18 ]
2つの補い合う16ビット整数について学べる本だと聞いたのだが本当かな?

798 名前:デフォルトの名無しさん [2008/07/15(火) 23:37:13 ]
原著が糞かどうかは見えていないわけか

799 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 02:18:51 ]
>>793
新訂版は知らんが、旧版についてなら>>794でFAだと思う。
はっきり誤訳とわかる箇所が散見される
(例:p.139 コンストラクターメンバ関数 → 例示コードでconstメンバ関数とわかる)、
一般的な訳語を使わない(例:省略時コンストラクター)などの問題がある。
訳者まえがきに「翻訳を急いだ」と書いてあるが、そういう問題かなという感じ。

ttp://www.pej-hed.jp/washo/38.html に新訂版の目次があるけど、
少なくとも訳語の問題はあまり変わっていないようす。
訳者は旧版の3人+新任1人なので、自分は読み直す気にはならない。




800 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 02:39:21 ]
800ならC++滅亡

801 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 02:56:32 ]
>訳者は旧版の3人+新任1人なので
懲りてないな。
トールキンで言うと戸田&山本の最凶タッグが成立するようなもんか。

802 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 14:34:49 ]
省略時ナントカは JIS X3014 の術語だからなんとも言えないけど
const → コンストラクタ は酷いな… orz
C++使わない人が訳したんだろうね。

803 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 21:09:25 ]
テンプレートを用いる際、引数として与えられた型があるコンセプトを満たすかどうかによって、
異なるテンプレートを用いることはできるでしょうか?

例えば、
template<typename T>
class foo
{
 //Tがコンテナの要件を満たしてなければこの実装
};
template<typename T>
class foo
{
 //Tがコンテナの要件を満たしていればこの実装
};
という感じのコードを書きたいと思っていますが、
やはりredefinition of 'class foo<T>'と怒られます。
上手く解決する方法はありますか?

804 名前:803 [2008/07/16(水) 21:17:36 ]
ちなみに、解決方法は多少技巧的になっても構いません。

805 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 21:38:26 ]
>>803
特殊化すればよろし

template< typename T, bool is_container >
class foo
{ /* コンテナ以外 */ };

template< typename T >
class foo< T, true >
{ /* コンテナの場合 */ };

is_container を自動的に判定するにはメタ関数を作る必要がある


806 名前:デフォルトの名無しさん [2008/07/16(水) 21:41:40 ]
CLIで関数ポインタ配列の宣言がどうしても通らないんです。
よかったら教えてください。

public ref class Form1 : public System::Windows::Forms::Form
{
public:
...
int fn1(int,int);
int fn2(int,int);
int fn3(int,int);
int (*fp[])(int,int){
fn1,
fn2,
fn3
};
...


関数ポインタの配列が作りたいのですが、error C4368がでます。

807 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 21:43:35 ]
>>806
C++/CLIは最早別の言語なので、専用スレへどうぞ。

808 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 21:45:11 ]
>>803
これくらいなら出来る

#include <boost/mpl/if.hpp>
#include <boost/type_traits/is_integral.hpp>

using namespace boost;

template<class T>
struct Y {};

template<class T>
struct Z {};

template<class T>
struct X {
typedef mpl::if_<is_integral<T>, Y<T>, Z<T> >::type type;
};


809 名前:デフォルトの名無しさん [2008/07/16(水) 21:46:08 ]
>>805
ありがとうございます。
そのメタ関数の作り方を教えていただけないでしょうか?
あるいは、そのようなテンプレートプログラミングについて解説してあるサイトを紹介してくださると助かります。



810 名前:デフォルトの名無しさん [2008/07/16(水) 21:46:10 ]
>807
すみません。移動します。

811 名前:デフォルトの名無しさん [2008/07/16(水) 21:57:08 ]
>>808
boost::MPLにはあまり詳しくないのですが、
Xが整数型なら X<T>::type == Y<T> 、そうでなければ X<T>::type == Z<T> ということでしょうか。
組み込み型か否かというような判断ではなく、
例えば「Tがメンバにbegin()とend()を持つか否か」や「Tがメンバにoperator()を持つか否か」で、
使うテンプレートを分岐させたいのですが、解決方法があれば幸いです。

812 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 22:27:34 ]
>>811
任意の型について
>「Tがメンバにbegin()とend()を持つか否か」や「Tがメンバにoperator()を持つか否か
を判定することは出来ないと思います

x.begin()

と呼ぶのではなく

begin(x)

などと呼んで型ごとにオーバーロードを用意するとかではダメですか?
Boost.Range がこの方法を採用して begin を持つ型にひ持たない型にも対応しています
私もたまにそうします

813 名前:デフォルトの名無しさん [2008/07/16(水) 22:38:50 ]
>>812
うーん、やはり無理ですか。

コンテナに対するオペレータのオーバーロードを考えていて、
コンテナが高階か1階かによって適用させる関数を変えたいと考えていたのですが、
どうもそういう発想に基づかない実装が必要なようですね。

ありがとうございました。


814 名前:デフォルトの名無しさん [2008/07/16(水) 22:45:39 ]
>>799, >>802
だーかーらー、原著者がかましたボケかどうか確認しろつーの

815 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 23:03:42 ]
>>813
役に立たないかもしれないけど、要件はクリア?
#include <iostream>

template<class T> struct Y { T m; };
struct Z {};

template<template<class T> class C>
struct X
{
template<class A>
static void f(C<A> x)
{
std::cout << "f(C<A>)" << std::endl;
f(x.m);
}

template<class B>
static void f(B x)
{
std::cout << "f(B)" << std::endl;
}
};

int main()
{
Y<Y<Z> > y;
X<Y>::f(y);
return 0;
}


816 名前:デフォルトの名無しさん [2008/07/17(木) 00:17:58 ]
>>815
この方法だと、型を1つ引数に取るテンプレートクラスか否かで分岐させているということでしょうか。
できればそれに限らないコンテナ(boost::arrayとか)も一括して扱いたいのですが、
確かにvectorやdeque, listに関してはこれで扱えそうですね。

教えてくださってありがとうございます。


817 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 22:37:21 ]
テンプレートクラスのインスタンス化についての質問で、
以下のようなことがしたいのです。
※以下の全ての例は当然コンパイルはできません。


// 動的にテンプレートの型
list* getList(int n) {
if(1 == n) {
// int型のリストをreturn
}

if(2 == n) {
// double型のリストをreturn
}
}

int main() {

// 型情報を持たないlistクラスの変数を用意(したい)
list* x;

int num;
std::cin>>num;

// キーボードで入力した値によって型を変える
x = getList(num);

}

このような処理を行いたいのですが、どうにかならないでしょうか…
JavaにおけるObjectクラスのようなクラスがあればいいのですが。

818 名前:817 mailto:sage [2008/07/17(木) 22:37:52 ]
私が考えてみたのは

(1)typedefを使う
(2)マクロを使う

で、どちらも上手くいきません。

(1)については、

// typedef の前方宣言(をしたい)
typdef typ_t;

// 動的に型情報を決定(これだとスコープ的にダメ?)
if(1 == n) {
typedef int type_t
}

if(2 == n) {
typedef double type_t
}

// 動的に定まった型を用いてインスタンス化
list<type_t> x;

こんな感じにできないかと思ったのですが、
宣言がの方法がわかりませんでした。(できない?)

819 名前:デフォルトの名無しさん [2008/07/17(木) 22:38:30 ]
(2)については

// とりあえず何か型を設定
#define TYPE_T int

// 動的に型情報を決定
if(1 == n) {
#undef TYPE_T
#define TYPE_T double
}

if(2 == n) {
#undef TYPE_T
#define TYPE_T char
}

// 動的に定まった型を用いてインスタンス化
list<TYPE_T> x;

これは n の値によらず最後に #defile された値
が常に適用されてしまい、ダメでした。
(今の場合でしたら常に list<char> が生成されてしまう。)

もう本当にお手上げ状態でして、みなさんのお知恵を
お借りしたいと思っている次第でございます;;

何卒よろしくお願いします



820 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 22:39:41 ]
>>818最後の行

×宣言がの方法が
○前方宣言の方法が

821 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 22:57:57 ]
>>819
テンプレートクラスを使わずに普通のクラスで対処したらいけないの?

class list { /* listの定義 */ };;
class IntegerList : public list { /* IntegerListの定義 */ };
class DoubleList : public list { /* DoubleListの定義 */ };

list* getList(int n) {
    if ( n == 1 ) { return new IntegerList(); }
    if ( n == 2 ) { return new DoubleList(); }
}

822 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 23:15:06 ]
インスタンス化クラスの型はコンパイル時に解決するから、実行時の多態性を実現する目的には向かない。

823 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 23:20:01 ]
テンプレートはコンパイル時の問題を解決するための道具です
実行時には役立ちません

実行時の問題は実行時用の道具で対処したほうが良いでしょう

824 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 23:29:17 ]
>>821
元々の目的が
「テンプレートクラスの型指定を実行時に動的に行いたい」
ということですので、それだと本来の目的に合わないのです。

が、>>822 >>823 さんの仰るように、そもそも本来の目的の
方向性が良くなかったようで…。
一度構成を考え直してみたいと思います。

みなさん、どうもありがとうございました。

825 名前:デフォルトの名無しさん mailto:sage [2008/07/17(木) 23:53:05 ]
boost.variantじゃ駄目なのか

826 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 04:24:38 ]
今、とある解説書でC++の例外を勉強しているのだが、投げられた例外を
受け取る例外ハンドラがない場合、terminage()が呼ばれabort()が呼ばれると。
abort()は何の後処理もせずプログラムを終了させるから具合が悪いという
ことが書かれているのだが、プログラムが終了すればすべてメモリは解放
されるのと違うの?プログラムが終了してまで、何か禍根が残るなんてこと
あるの?

827 名前:826 mailto:sage [2008/07/18(金) 04:25:20 ]
ミス
terminage() → terminate()

828 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 04:33:50 ]
>>826
ファイルシステムとかデータベースとか。

mkdir() を使ったロックなんかがわかりやすいかな?

829 名前:826 mailto:sage [2008/07/18(金) 04:39:16 ]
レスどうも。
つまりプログラムとは独立したなんらかのリソースを操作する場合に
影響が残るということか…



830 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 04:54:12 ]
VC++2008で
void f() throw( hoge1, hoge2, hoge3);
みたいな例外指定ってサポートされてないんだね。
標準C++勉強してると、意外と最近のコンパイラが標準準拠していない
ことに気づく。

831 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 07:57:37 ]
むしろ準拠しなくてもOSが「問題ないぜ!掛かって来い冷害!」

832 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 13:08:34 ]
初心者で申し訳ないのですが、
googleのsparse_hash_mapを使おうとして、マニュアル通り
#include <iostream>
#include <google/sparse_hash_map>
using namespace std;
using google::sparse_hash_map;
..
int main () {
sparse_hash_map<const char *, int, hash<const char *>, eqstr> months;
とすると、
'hash' was not declared in this scope
と、hash<const char *> すら定義されていないと言って怒られてしまいます。
hash_mapの場合も同じだったのですが、どうするといいでしょうか。
環境は g++ (GCC) 4.1.1 20070105, Linux FC6です。
よろしくお願いします。

833 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 13:25:34 ]
#include <ext/hash_fun.h>
を追加してみてはいかがでしょう。

834 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 14:28:03 ]
>>833
ありがとうございます。
もう一度追加してみたのですが、エラーメッセージは同じのようでした。
ちなみに using __gnu_cxx; したり、__gnu_cxx::hash<const char *>と
すると、もの凄いエラーメッセージが出ます。。

835 名前:832 mailto:sage [2008/07/18(金) 18:20:56 ]
すみません、自己解決しました。
上のコードの struct eqstr の持つ比較関数
bool operator() (const char *a, const char *b) const
で、最後の const が抜けていたのが原因のようでした。
using namespace __gnu_cxx; で const を加えると、問題なく通りました。
# たったそれだけで長大なエラーメッセージが表示されるとは、
C++、恐ろしい子・・・!!

836 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 18:31:34 ]
最初の方の数個のエラーだけ見て推測すりゃ良いだろ。
コンパイル時間と長大なエラーメッセージに怖気づくなよ。

837 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 23:32:51 ]
>>830
VCはずっとサポートされないままだね。(他は知らないけど)
やっぱ難しいんかな。

838 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 23:45:04 ]
          ζ
         / ̄ ̄ ̄ ̄\
       /         |
       | ⌒  ⌒   /|
       | (・)  (・)   |||||||
       | ⊂⌒◯-----∂)___   ___
       | ||||||||_     /     ゙Y"     \
         \ヽ_/ \/              \
         \    /                 \
          / ̄ ̄ ̄ ̄)        *      ( ̄ ̄ ̄ ̄)
         |    ─<         |\      >─   (
         |      )     /  (|ミ;\    (      )
         ヽ    ̄ ̄)    /(___人|,iミ'=;\  (  ̄ ̄   )
         /" ̄ ̄ ̄ ̄   /    《v厂リiy\  ̄ ̄ ̄ ̄\
         /        /        ゙|,/'' v:,,、.¨)z,_       \
        /       /         ミ/ .-─ .゙》z、      \
        /      /           〔」″ノ‐ 、u ¨\      )
       (      /             ゙|, ..冫 .rー    ̄\_    |
        |      〔              ミ./′   ..r-ー __,,ア┐  |
        |      |              {. .,,,,   .′  .´′ .¨\|
        |       |              ∨   ノ冖′ =vvvvvv¨\
        |     /               ミ.   ,i'           .゙\_
        |     /                .{.  ノ  ,r¬″       .¨\

839 名前:デフォルトの名無しさん mailto:sage [2008/07/18(金) 23:49:41 ]
>837
実装するだけなら全く難しくないと思うが
関数に try, catch 差し込んで unexpected 呼ぶだけでしょ



840 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 00:32:21 ]
例外指定なんて誰も使わないから別にいい

841 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 16:56:54 ]
Javaは例外指定必須だけどうっぜえ割に大してバグが減るわけでもない
はっきり言って全くいらない機能

842 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 23:51:23 ]
同意。C#の設計者もアレあんまし意味無いだろって言ってる品。
www.artima.com/intv/handcuffs.html

843 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 07:52:16 ]
>>838
これって遠近法で描かれたウンコなのかドリルなのか気になる

844 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 09:28:32 ]
激突
アナル vs ドリル

845 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 10:54:04 ]
new/delete演算子をオーバーライドしたいのですが、
これらの中からもとのnew/deleteを呼ぶにはどうしたらよいですか?


846 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 14:57:11 ]
置かれている状況が分からないから何とも言えないけど、
::operator newと::operator deleteでどうよ。

847 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 17:09:26 ]
operator newをオーバーライドしたなら、必要なのはメモリの固まりなわけで、
mallocでも呼んどきゃいいんでね?

848 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 17:58:46 ]
>>847
コンストラクタを呼びたいんじゃね?

849 名前:デフォルトの名無しさん mailto:sage [2008/07/20(日) 18:09:06 ]
「new演算子のオーバーライド」で、どのコンストラクタを呼びたくなるわけ?

ひょっとしてたとえば、メモリ管理クラスがあって、operator new()で
そのメモリ管理クラスをインスタンス化するためにnewしたくなったけど、
メモリ管理クラスのメモリはどうするんだってな話?



850 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 04:35:49 ]
クラスのメンバ関数が、自分自身をdeleteする処理を行っても
安全なのでしょうか?
つまりdelete this;ってことになるかな。
自分自身が解体された後にメンバ関数からリターンするって何か変ですよねぇ。
しかもdelete this;の後にも処理が続いてたらやばいですよね。

851 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 06:40:13 ]
>>850
安全。ただしもちろん、それやったあとにそのインスタンスを使っちゃいけない。

たとえばboost::intrusive_ptrみたいに、値に自身の参照カウンタを持たせるスマートポインタの場合、
値となる型に
void Release() { if (!--refCount_) delete this; }
みたいなメンバ関数を用意することになる。

852 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 06:41:32 ]
規格上どうなってるかは知らないけど、そういうことをやってるライブラリは知ってる。
他のメンバーにアクセスせずにリターンするだけなら問題はないような。

実際どっちのデザインがいいのだろ。
A a = A::createInstance();
a.Free();
A::Free(a);


853 名前:850 mailto:sage [2008/07/21(月) 06:50:27 ]
レスありがとうございます。
deleteした後に余計なことしなければ、いけるってことですね。

854 名前:デフォルトの名無しさん [2008/07/21(月) 16:09:12 ]
現在ublasを使っていて少しつまづいてしまったので教えていただきたいことがあるのですけど
教えていただけないでしょうか?

ある行列を多くの行列演算の和として計算したいのですが、
代入を繰り返すことでおそくなってしまいます。
例えば以下のような例です。
for(i=0;i<100;i++){
MAT1+=some_matrix;
}
some_matrixには毎回べつの行列が計算されてはいります。

expression template でこれを高速可できるということですが、
for文の中で毎回代入していまうとその時点で式が評価されてしまうので遅くなってしまうようです。
式そのものを変数として保持しておくような事はできるのでしょうか?

初歩的な質問ですみませんがどなたかお願いします。

855 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 16:15:30 ]
autoやdecltypeがあればいいんだがなぁ。

856 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 16:36:33 ]
draw_mark = rand() % 4 + 1;
draw_digit = rand() % 13 + 1;

if(h) {
printf("%sの%s\n", mark[draw_mark-1], digit[draw_digit-1]);
}
r = total[draw_digit-1];
この文の+1と-1はあってもなくても結果は同じですよね? 気になったので教えてください

857 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 16:46:49 ]
他の場所で使ってなければ同じ。

858 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 18:23:52 ]
結果は同じでも、可読性が違う。
乱数の結果が+1してあれば「乱数値を1オリジンに変換している」というニュアンスが伝わるし、
配列のインデックスが-1してあれば「カード番号を0オリジンに変換している」というニュアンスが伝わる。

859 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 18:34:07 ]
一方、ロシアは0オリジンで乱数値を扱った。



860 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 18:39:15 ]
>>859
そういう無意味な書き込みして楽しい?
そうかぁ、寂しい青春送っているんだね。

861 名前:デフォルトの名無しさん mailto:sage [2008/07/21(月) 18:49:41 ]
>>860
>>860






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<209KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef