C++相談室 part62 ..
[2ch|▼Menu]
331:デフォルトの名無しさん
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
ハンガリアン記法
Wikipedia項目リンク

ただし、ポインタに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はダメだろ


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4766日前に更新/209 KB
担当:undef