■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part8
501 名前:498 :02/07/06 23:10
ごめんよく見てなかった&&勘違い。
問題はデフォルトパラメータは使えないこととと>>499だけだね

502 名前:495 :02/07/06 23:11
例が悪いというのは上の例が悪いってことです…。
誤解を招きそうな発言をして申し訳ありません。。。

503 名前:デフォルトの名無しさん :02/07/06 23:15
関数テンプレートのデフォルト引数が使えるのか…
VCは謎が多いな

504 名前:デフォルトの名無しさん :02/07/06 23:17
>>498
わかるよ。

505 名前:デフォルトの名無しさん :02/07/06 23:17
cont char *とchar const *は同じ意味なのですか?

506 名前:デフォルトの名無しさん :02/07/06 23:19
>>505
違う。constは直後の要素に掛かる。

507 名前:495 :02/07/06 23:19
>>503
あ、あと、BCCでもデフォルト引数が使えないみたいです。。。
一次クラステンプレートのみに使用できますとか言われて…
弱った。。。手持ちのコンパイラじゃ出来ないのか。。。(汗)

508 名前:デフォルトの名無しさん :02/07/06 23:20
>>505
関数の仮引数では同じだったはず
他は違う

509 名前:デフォルトの名無しさん :02/07/06 23:21
>>506
サンクス

510 名前:デフォルトの名無しさん :02/07/06 23:23
>>507
ん?
出来ないのが標準仕様(ISO)だけども何が問題?

511 名前:デフォルトの名無しさん :02/07/06 23:23
const char* と char const* は一緒じゃないの?

512 名前:デフォルトの名無しさん :02/07/06 23:24
だから違うというとるに

513 名前:495 :02/07/06 23:25
>>510
そうなんですか?
Stroustrup本のは…間違いなんですか?

514 名前:デフォルトの名無しさん :02/07/06 23:25
> 出来ないのが標準仕様(ISO)

ダセエな。

515 名前:デフォルトの名無しさん :02/07/06 23:25
>>495 & その他
関数テンプレートでもデフォルト引数は使える。
495 がダメなのは、2番目のテンプレート引数 C は関数引数から推測できるのに
1番目の引数 T の指定がないからじゃないのか。だから 499 が正解だと思う。
普通の関数のデフォルト引数だって、1番目はデフォルトにして2番目の引数だけ
指定するなんてことはできないだろう。

516 名前:デフォルトの名無しさん :02/07/06 23:29
>>506 通るけど。

class A {
public:
virtual const char *func() { return 0; }
};

class B : public A {
public:
virtual char const *func() { return 0; }
};

int main()
{
A a;
a.func();

B b;
b.func();
}

517 名前:デフォルトの名無しさん :02/07/06 23:29
まったまった、今酔ってて怪しいが、これはさすがに同じだろ
const char * str
char const * str

この辺と混同してないか?
char * str const
const char * const str

518 名前:495 :02/07/06 23:29
>>515
ふむ…。
では、引数から推測できないようにすると出来るのでしょうか?
ちょっと試してみます。

519 名前:デフォルトの名無しさん :02/07/06 23:30
511
同じ結果になるんですが・・・。

#include <iostream>
#include <typeinfo>
using namespace std;

int main()
{
 char const* p1 = "hoge";
 const char* p2 = "hoge";
 cout << typeid(p1).name() << endl;
 cout << typeid(p2).name() << endl;
 return 0;
}

520 名前:517 :02/07/06 23:30
わり、3番目の例はこう書きたかった
×char * str const
○char * const str

521 名前:499 :02/07/06 23:35
早速 Stroustrap 本読んでます (´ー`)
p.133 に書いてたんですが,"const *" は存在しないから基本形の一部と
見なされるらしくて,つまり "char const *" は "const char *" と
同等だということでした

# だんだん const の使い方が分かってきたかも

522 名前:515 :02/07/06 23:35
スマソ。いま ISO の規格書確認したら、
A default template-argument shall not be specified
in a function template declaration or a function template definition
って書いてあった。

523 名前:デフォルトの名無しさん :02/07/06 23:39
>>515
>関数テンプレートでもデフォルト引数は使える。
ここでの問題はデフォルトテンプレート引数だぞ
これは使えないだろ

524 名前:デフォルトの名無しさん :02/07/06 23:40
>規格書確認したら

持ってんのかよ!Σ(゚□゚=)
イイナァ

525 名前:523 :02/07/06 23:40
ごめん。読んでたら遅れた

526 名前:japh ◆J.5V8ta6 :02/07/06 23:41
「*を挟んでconstが右にあるか、左にあるかで見分けろ」
というようなことを何かで読んだよ。
(プログラミング言語C++だったかな…或いはEffective C++だったかもしれない)

527 名前:515 :02/07/06 23:44
>>524
たしか、20ドルくらいで買った。まあ、ふだんは
http://www.kuzbass.ru/docs/isocpp/
を見に行ってるけどね (w

>>525
いや、うっかり C++3rd を信じちまったおれが悪かった。

528 名前:495 :02/07/06 23:45
>>522
結局、ISO標準では関数テンプレートのデフォルト引数を使うことは無理なんですね。
Stroustrup本に書いてあるのは次のようなものです。

template<class T, class C = Cmp<T> >
int compare(const String<T>& str1, const String<T>& str2){
  for (int i=0; i<str1.length() && i<str2.length(); i++)
    if (!C::eq(str1[i], str2[i])) return C::lt(str1[i], str2[i]) ? -1 : 1;
  return str1.length()-str2.length();
}

529 名前:デフォルトの名無しさん :02/07/06 23:48
BCC5.6では、関数テンプレートにデフォルト引数を書いただけで
通らなくなりまっす。下のように書くしかありまっせん。

#include <iostream>

using namespace std;

template <class T, class C>
T test(const C& str)
{
return str[0];
}

int main(void)
{
cout << test<char>(basic_string<char>("Hello, world!")) << endl;
}

530 名前:495 :02/07/06 23:50
すいません。
ぐえ…。Stroustrup本が標準だとばかり思っていました…。
今度から>>527を見に言ってから発言するようにしたいと思います。

色々ありがとうございましたm(_ _)m


531 名前:デフォルトの名無しさん :02/07/06 23:50
>>527
ありがとう!

532 名前:デフォルトの名無しさん :02/07/06 23:56
手元になぜか refman.pdf という 2,860,601バイトの規格書があるが、
なぜだろう?いつの間に?

533 名前:デフォルトの名無しさん :02/07/07 00:03
検索してみたらcpp3rd.zipなんてのも出てくるな

534 名前:デフォルトの名無しさん :02/07/07 00:06
某所で出てから、一気に普及したんじゃないかな>refman

535 名前:デフォルトの名無しさん :02/07/07 00:09
ここのは無茶苦茶鯖が重いけど、今でも落とせるね。

http://mxlab.com:8080/ftp/docs/c++/?s

536 名前:デフォルトの名無しさん :02/07/07 00:13
527 のリンク先は、draft だからさらしてても OK なのか?
それともやっぱり違法?

537 名前:デフォルトの名無しさん :02/07/07 00:17
>>527のヂレクトリをいっこ登ると・・・(゚ε゚)キニシナイ!!

538 名前:デフォルトの名無しさん :02/07/07 00:24
constに関しては、>>526が正解。参考文献は、Effective C++ の21項。
あと、Exceptional C++ の43項も読んだら、constの正しい使い方が理解できるよ。

539 名前:デフォルトの名無しさん :02/07/07 00:32
うほほ


540 名前:デフォルトの名無しさん :02/07/07 00:44
激重(汗 ようやく落ちた

541 名前:デフォルトの名無しさん :02/07/07 07:47
const char* str なんつーダサい書き方は速く卒業してホスィ・・・
常に char* const str なら何も迷うこと無いでしょ

542 名前:デフォルトの名無しさん :02/07/07 07:57
char const* の間違い?

543 名前:デフォルトの名無しさん :02/07/07 07:58
>>542
あ、サンクス

544 名前:デフォルトの名無しさん :02/07/07 08:10
>何も迷うこと無いでしょ

つーか間違えてるなら、迷ったってことでわ?

545 名前:エキセントリック541 :02/07/07 08:19
>>544
絶対ゆわれるとオモタYO(恥
const の位置を間違ったんじゃなくて、
1行目でconstなcharへのポインタのことを考えていながら、
2行目でcharへのconst なポインタのことしか考えてなかった。

const char* const str なんつー・・・
char const* const str なら何も迷・・・
って書けばよかたよ



546 名前:デフォルトの名無しさん :02/07/07 08:35
実際問題、ポインタ自体をconstにすることなんてほとんどねーんだし、
そうするくらいなら、参照渡せよ、って感じだし。
(使用頻度において、T const * >> T * const ,T const *const)
ポインタのポインタも、ポインタへの参照とか、vector<vector<T> >つかえば
いいわけだから、ポインタでconst使うのは、実質 T const * ptr だけっしょ。
だったら、迷うもなにも、 const T *ptrってやっとけばいいんでないかい?

547 名前:デフォルトの名無しさん :02/07/07 08:40
漏れはバリバリ使う、9割方const
配列のときとかNULLのときとか参照使えないし

548 名前:デフォルトの名無しさん :02/07/07 13:57
>> 461
>> 当たり前のことにも名前ついてて少しワラタ。

若干オソレスだが

その当たり前ってやつを他人に説明するには、名前があったほうが便利だろ〜。

デザインパターンの目的のひとつは、そういうことだぞ。

だいたい、Gof本に書いてあることなんざ、ハッカーレベルじゃ全部当たり前。

549 名前:デフォルトの名無しさん :02/07/07 14:10
>>548
取りあえずこれ抽象クラスにしたら継承するだけでいろんな事に使えるやろ?
おお。確かに。

取りあえずこのクラスでFactoryMethodやるから。
はぁ?

日本的にあの名前達は有害かと。

550 名前:デフォルトの名無しさん :02/07/07 14:41
しかし、参照は便利だねえ。
NULL渡しチェックの必要がなくなるのは嬉しい。
今までCOMに毒されてたから気が付かなかったよ。

551 名前:デフォルトの名無しさん :02/07/07 14:43
>>550
逆にNULLが渡したくても渡せない罠。

552 名前:デフォルトの名無しさん :02/07/07 14:58
>>551
NULLを渡すって事は、前提とする状況ががらっと違うわけだから。
オーバーロードさせとくのが正しい、と俺は思う。

// ポインタ渡し
void Foo(RECT* pRect){
  if (pRect == NULL){
    SetRect(rect_);// メンバ変数
  } else {
    SetRect(*pRect);
  }
}

// 参照渡し
void Foo(RECT& rect){
  SetRect(rect);
}
void Foo(void){
  SetRect(rect_);// メンバ変数
}

こんな感じで。

553 名前:デフォルトの名無しさん :02/07/07 15:03
>>552
結局参照はPascalのvar以上の使い方はすべきでないですか?

554 名前:デフォルトの名無しさん :02/07/07 16:31
派生クラスを定義するときに
継承もとのクラスのコンストラクタをそのまま使いたいんだけど
良くわかりません。

継承もとのクラスのコンストラクタを派生クラスにコピペするのもあんまりだし・・・




555 名前:デフォルトの名無しさん :02/07/07 16:41
Class a{
a( int c );
};

Class b : public a {
b( int c );
};

b::b( int c ) : a( c )
{
}

こういうこと?
それとも、class b のコンストラクタの定義は無しで
class a のコンストラクタを流用したいってこと?
それは俺も知りたい、誰か教えてプリーズ。

556 名前:デフォルトの名無しさん :02/07/07 17:24
multimap<int, string> aaa;
として

  aaa.insert(make_pair(3, "abcdefg"));
としたらエラーがでました。なんか2番目の引数が問題らしいので
適当に

  aaa.insert(make_pair(3, string("abcdefg")));

としたらokになりますた。
これって一時的なオブジェクトstringを"abcdefg"で初期化して渡したって事ですよね?
CPUとメモリ消費しながら・・

この修正で正しいですか?間違ってますか?

557 名前:デフォルトの名無しさん :02/07/07 17:31
いいんじゃないの?

558 名前:デフォルトの名無しさん :02/07/07 17:35
そうでしたか。どうもです。
C++標準ライブラリ〜って本では文字列を渡してますが
VC++の癖ですかね〜


559 名前:デフォルトの名無しさん :02/07/07 17:37
char const *からstringへの変換は存在するが、
pair<int, char const * const>からpair<int, string>への変換は存在しない。

560 名前:japh ◆J.5V8ta6 :02/07/07 20:13
>>557
つまりmake_pair()じゃなくて単にpair<>のコンストラクタを使いなさいってこった。

aaa.insert(make_pair(3, string("abcdefg")));

aaa.insert( std::pair<int, std::string>(3, "abcdefg") );

561 名前:デフォルトの名無しさん :02/07/07 20:52
書くのはvalue_typeにしとけ

562 名前:561 :02/07/07 20:57
と思ったけどちょっと長いな
std::multimap<int,std::string>::value_type

563 名前:japh ◆J.5V8ta6 :02/07/07 21:28
>>561
うい、そっちの方が望ましいね。
長いのはtypedefで何とかすればよし。



564 名前:デフォルトの名無しさん :02/07/08 00:36
C++のソースで、cstdioじゃなくstdio.hをincludeすると、なにか問題ある?
stdio.hに愛着があるんで。

565 名前:デフォルトの名無しさん :02/07/08 00:38
>>564
名前空間がstdに包まれなくなる。つまり通常のCのようになる。

566 名前:デフォルトの名無しさん :02/07/08 00:38
おまえ死ねと言う気になる
グローバルネームスペースを汚すなと。

567 名前:デフォルトの名無しさん :02/07/08 00:39
>>564
これだからプロジェクトに加齢臭のするドキュソが入ってくるとロクなことにならねえ
と若い連中に思われる。

568 名前:デフォルトの名無しさん :02/07/08 00:41
.cpp で使う分には問題は少ないでしょ。

569 名前:564 :02/07/08 00:42
うわぁレスの早さからしてとてもだめなことを聞いたね。> 俺
今日から改めます。

570 名前:デフォルトの名無しさん :02/07/08 00:46
569は神。ジジイのカガミ。


571 名前:デフォルトの名無しさん :02/07/08 00:51
名前空間についておさらいだッ

572 名前:デフォルトの名無しさん :02/07/08 01:12
friendってどういう目的で使うのですか

573 名前:デフォルトの名無しさん :02/07/08 01:18
クラスのprivateなメンバにアクセスしたり。

574 名前:デフォルトの名無しさん :02/07/08 01:42
g++の2.95で、std::basic_string<unsigned char>のc_str()で
エラーが出たりしますか?

575 名前:デフォルトの名無しさん :02/07/08 01:46
cppってstdio.hインクルードすると良くないのかぁ・・・。
ストラップさんの本、読み直してみよう・・・。

576 名前:128 :02/07/08 01:46
>572
引きこもりは全部friendにしてしまう傾向があるから注意・・

577 名前:デフォルトの名無しさん :02/07/08 01:59
>>572
operatorを定義する時に便利。乱用は禁物。

578 名前:デフォルトの名無しさん :02/07/08 02:01
これってなんでエラーになるの?

class Test
{
public:
static int nHoge ;
};

int main()
{
Test::nHoge = 0;

return 0;
}



579 名前:デフォルトの名無しさん :02/07/08 02:03
nHogeの実体がないから。

580 名前:デフォルトの名無しさん :02/07/08 02:03
こんなの初めて見た(ワラ

581 名前:デフォルトの名無しさん :02/07/08 02:11
ワラウコトナイジャナイ...

582 名前:デフォルトの名無しさん :02/07/08 02:11
>>578 とにかく覚えなさい。

class Test
{
public:
static int nHoge;
};

int Test::nHoge;

int main()
{
Test::nHoge = 0;

return 0;
}

583 名前:デフォルトの名無しさん :02/07/08 02:14
クラス内の性的変数の定義の詳細を見ればどうにかなるんじゃない

584 名前:デフォルトの名無しさん :02/07/08 02:17
>>582
int Test::nHoge; ←これが実体なの?

うーん謎。

585 名前:デフォルトの名無しさん :02/07/08 02:24
>>584
class変数を複数作っても、staticメンバ変数は実体が一つしか
存在しない事に伴う特殊な書き方らしい。誰か詳細キボンヌ。

586 名前:デフォルトの名無しさん :02/07/08 02:25
>>584
それが実体。初期化する場合もそこで。

587 名前:デフォルトの名無しさん :02/07/08 02:29
>>585
class変数 を staticメンバ変数 と言い替えている罠



588 名前:デフォルトの名無しさん :02/07/08 02:30
アヒャヒャ!


589 名前:デフォルトの名無しさん :02/07/08 02:31
>>584
staticメンバはクラスに固有なもの
インスタンスをいくつ作っても、staticメンバは複数作られない
それは、概念的にstaticメンバが、インスタンスの外にあるから。

590 名前:デフォルトの名無しさん :02/07/08 02:37
>>587
わりィとちった。インスタンスだね。

591 名前:デフォルトの名無しさん :02/07/08 02:48
>>589
なるほど。わかりやすいです。
staticメンバの宣言は、
各インスタンスの外にある1つの実体を指すための
ポインタ的(Cで使う意味じゃなく)なものだということだすね。
だからいくつインスタンスを生成しても指す場所は同じってことで、
値はいっしょということだと。

592 名前:デフォルトの名無しさん :02/07/08 10:36
>>587
静的嫌がらせ


593 名前:デフォルトの名無しさん :02/07/08 15:19
ちょっと質問!
EnumWindowsとかで取得したHANDLEからそのアプリケーションが
あるパスを取得する方法を教えて下さい。

594 名前:デフォルトの名無しさん :02/07/08 15:21
無理っぽいが、
http://pc.2ch.net/test/read.cgi/tech/1023361418/l50

595 名前:デフォルトの名無しさん :02/07/08 15:29
>>594
サンクス、とりあえず、向こう逝きます、

596 名前:デフォルトの名無しさん :02/07/08 16:34
ここのみんなでさC++の入門書書かない?HTMLとかで
大勢で思考錯誤したり分担したりすればかなりいいものが作れる気がするんだが
痒い所に手が届くような大規模なFAQとかさ、、
学んでる最中の人のがいればどこがわからないとかが指摘できたりするわけで
ここには勉強中の人もかなりいるだろうからそう言うのも大丈夫だとおもう


597 名前:デフォルトの名無しさん :02/07/08 16:41
>>596
俺も似たようなことは考えてた。

598 名前:デフォルトの名無しさん :02/07/08 16:48
>>596
俺はハナからあきらめてた

599 名前:デフォルトの名無しさん :02/07/08 16:49
class a{
friend class b;
}

class c : public b{
}

この class c にも class b に対して行ったfriend宣言の効力を
効かせたいんですけど無理ですかね?
やっぱり class c のfriend宣言をあらためて加えないと駄目ですか?

600 名前:デフォルトの名無しさん :02/07/08 16:54
>>599
はい。


601 名前:デフォルトの名無しさん :02/07/08 16:58
>>600
あなたヤホーの掲示板に居たでしょ?

602 名前:デフォルトの名無しさん :02/07/08 18:34
>>599
なんでそんなことをしたいのよ?

603 名前:ななしあた :02/07/08 18:48
>>602
いいじゃない、別になんだってさ

604 名前:599 :02/07/08 18:56
そうですか、残念。

>>599
class b の派生クラスを作る度に
class a の宣言を改定しなければならないのがイヤだったんです。
class b の能力としては class a のプライベートメンバにアクセス権を持つ
というのが含まれているんで、継承でそれを派生クラスに持ち越せないって
なんか変な感じがしますね。これはちょと不満かも。

605 名前:599 :02/07/08 18:56
>>602の間違いでした。

606 名前:デフォルトの名無しさん :02/07/08 19:00
>>599
激しくお勧めできないが


class A
{
protected:
int i;
friend class B;
};

class friendlyA: public A { friend class C; };

class C
{
C()
{
A a;
static_cast< friendlyA* >( &a )->i = 10;
}
};


607 名前:599 :02/07/08 19:20
>>606
それはまたトリッキーで・・。
でも class friendlyA は class C の内部クラスにしてしまえば
それなりに綺麗に書けそうかも。どうも参考になりました。
それか、今思ったんですがfriend宣言のところだけマクロにして
切り離すってのもアリかも。

608 名前:デフォルトの名無しさん :02/07/08 19:51
>>596
いまにそれが有名になってこの板が2chの看板に!

609 名前:デフォルトの名無しさん :02/07/08 19:55
日本語で specialization を表すのに何を使ってますか?
「特殊化」や「専門化」は instantiation の訳に用いるほうがふさわしいし、
C++3rd の「特殊バージョン」は間違いではないにしろ、すわりが悪く感じます。

610 名前:デフォルトの名無しさん :02/07/08 20:18
特別化

611 名前:デフォルトの名無しさん :02/07/08 20:21
>>596
>>608
あれだけいってもC FAQ/C++ FAQすらよまねえ連中だらけなのにさらにゴミ文書増やすのかヨ



612 名前:デフォルトの名無しさん :02/07/08 20:34
>>610
ふむ、それも「専門化」とかと同じで、意味があってないんだよね

613 名前:デフォルトの名無しさん :02/07/08 20:42
>>612
何がしたいわけ?

614 名前:デフォルトの名無しさん :02/07/08 20:51
>>612
限定化

615 名前:デフォルトの名無しさん :02/07/08 20:55
>> 614
いろいろと「〜化」って挙げてくれてるけど、それって「操作」を意味する「サ変名詞」でしょ
だから、正しくない。
specailization は「操作」じゃなくて、クラスや関数でしょ。

616 名前:デフォルトの名無しさん :02/07/08 20:56
○○化物

617 名前:デフォルトの名無しさん :02/07/08 20:58
>>613
単に、specialization を日本語で "正しく" 表記したいだけだよ。
いつもは「スペシャライゼーション」って書いてるけど、長ったらしいしね

618 名前:デフォルトの名無しさん :02/07/08 20:59
言語のままspecializationと表記することに問題が?

619 名前:デフォルトの名無しさん :02/07/08 20:59
原語

620 名前:デフォルトの名無しさん :02/07/08 20:59
>>616
クラスや関数って「物」なんだろうか?

621 名前:デフォルトの名無しさん :02/07/08 21:02
>>618-619
うん、問題ない。めんどくさいけどね。
読みやすいかといわれると、疑問もあるけど。

622 名前:デフォルトの名無しさん :02/07/08 21:05
>>621
気持ちは分からんでもないが、戦時中じゃないんだから、
むりやり日本語にすることもあるまい。

623 名前:デフォルトの名無しさん :02/07/08 21:09
>>622
政府の見解は違うようだけどね(w
字面が場所とるのが嫌なんだが、現行どおり「スペシャライゼーション」で当面いきます。
おつきあい、ありがとう。

624 名前:デフォルトの名無しさん :02/07/08 21:24
政府を窓から投げ捨てろ!

625 名前:デフォルトの名無しさん :02/07/08 21:43
>>624
燃えるゴミの日に出したよ。政府

626 名前:デフォルトの名無しさん :02/07/09 06:44
templateは言うなればクラスの特殊な物なの?
具体的な型を指定してあげればクラスと同様に扱えますか?
つまり、基底クラスにして派生させてみたり、
その他いろいろ文法上はクラスと同等の扱いですか?

627 名前:デフォルトの名無しさん :02/07/09 07:57
>>626
>>templateは言うなればクラスの特殊な物なの?
逆、クラステンプレートは普通のクラスを型に対して一般化したもの。
同様に、関数テンプレートは関数を一般化したもの。

>>具体的な型を指定してあげれば、クラスと同様に扱えますか?
そのとおり、テンプレート引数を与えてやれば、コンパイラは
テンプレートをそれでインスタンス化してクラス定義を作成し、翻訳単位に挿入する。
そうやって作られたクラスは、通常のクラスとまったく同じように使用できる。

628 名前:デフォルトの名無しさん :02/07/09 08:31
>627
ありがとうございます

629 名前:デフォルトの名無しさん :02/07/09 22:48
2次元配列の要素数を取得するにはどうすればよいですか?

630 名前:デフォルトの名無しさん :02/07/09 22:51
vector?

631 名前:デフォルトの名無しさん :02/07/10 07:04
string に数値を文字列にしていれるのに一番すっきりした方法はなんでしょう?
sprintf を使ったりしてみたのですが、なんかカッコ悪いような……

632 名前:デフォルトの名無しさん :02/07/10 08:28
>>631
boost::lexical_cast<>
ちょい重いけど

633 名前:デフォルトの名無しさん :02/07/10 09:52
int x = 10;
string s = static_cast<ostringstream&>((ostringstream() << x)).str();
とか。

634 名前:デフォルトの名無しさん :02/07/10 09:55
itoa

635 名前:デフォルトの名無しさん :02/07/10 10:33
>>633
それだったらboost::lexical_cast<>でいいじゃねぇか。
どうせあれも内部でstringstream使ってるし。

636 名前:デフォルトの名無しさん :02/07/10 11:19
sprintfつかっとけ。

637 名前:デフォルトの名無しさん :02/07/10 17:24
stringオブジェクトの中身を編集したいのでstring::c_str()
で得られたconst char*をchar*にキャストして
そこがさす文字を置き換えたりとかしても平気ですか?


638 名前:デフォルトの名無しさん :02/07/10 17:46
自分が確保した領域にstrcpyしてからのほうがええんじゃないか?
エエジャナイカ、エエジャナイカヽ(・∀・)ノ

639 名前:デフォルトの名無しさん :02/07/10 17:59
>637
基本的にやってはいけない。
もしやるとしても、以下の出力の理由が理解できてから。

#include<string>
#include<iostream>
int main()
{
 using namespace std;
 string s1("abcde");
 string s2 = s1;

 char *p = (char *)s1.c_str();
 *p = 'A';

 cout << "s1 = " << s1 << endl;
 cout << "s2 = " << s2 << endl;
 return 0;
}


640 名前:デフォルトの名無しさん :02/07/10 18:03
基本的じゃなくて、絶対にやってはいけない。
内部文字列のコピーを返している場合もあるから。

641 名前:デフォルトの名無しさん :02/07/10 18:06
なるほど。よくわかりました。


642 名前:デフォルトの名無しさん :02/07/10 18:31
const_cast<>を使う時って、なんかいけないことをやってる気がするよ。


643 名前:デフォルトの名無しさん :02/07/10 18:45
うん。

644 名前:デフォルトの名無しさん :02/07/10 19:48
コンソールアプリケーションの実行ファイルサイズを抑えるために、
なにか心がけるといいことはありますか?C++で

645 名前:デフォルトの名無しさん :02/07/10 19:50
>>644
iostreamなどの標準ライブラリを使ったらすぐ大きくなる。

646 名前:644 :02/07/10 19:53
>>645
そうですよね。特にg++ 3.1なんかでは半端じゃないですよね。


647 名前:デフォルトの名無しさん :02/07/10 19:58
SGI STLのiostreamがでかいだけ。

648 名前:デフォルトの名無しさん :02/07/10 20:02
gcc-2.95.3とかでは割と小さかったのにな。残念だな。

649 名前:デフォルトの名無しさん :02/07/10 20:11
locale周りのサポートが入ったんだから、
でかくなるのは避けようがないでしょ

650 名前:デフォルトの名無しさん :02/07/10 20:11
stringstreamを使うだけででかくなるのはいただけない。
どうしてもsprintfの誘惑に負けちゃうよな

651 名前:デフォルトの名無しさん :02/07/10 20:26
だれかー初心者ですが

致命的エラー F1003 D:\borland\bcc55\Include\stdcomp.h 5: error 指令: Must use C++ for STDCOMP.H

ってでるんですけどなんでー(;_;)

652 名前:デフォルトの名無しさん :02/07/10 20:40
DirectX関係なんですが、クラス構造の問題なのでこっちで聞いてみます。

アクションゲームで人間クラス、背景クラス、Direct3Dラッパークラスがあるのですが
人間クラスのメンバ関数にDraw()を定義して
p人間クラス->Draw();
p背景クラス->Draw();
でDirect3Dを使って描画させたいのですが、この場合Direct3Dクラスから人間クラスと背景クラスを
継承させるのが正しいのでしょうか?ただし、Direct3Dクラスが複数できるのは問題があります。


653 名前:デフォルトの名無しさん :02/07/10 20:54
素朴な疑問なんですが、なぜ ++x は左辺値なのに
x++ は右辺値なんでしょうか。

654 名前:デフォルトの名無しさん :02/07/10 20:59
>>651
F1003は#error指令が出すメッセージです。
拡張子を.cppにしませう。

655 名前:japh ◆J.5V8ta6 :02/07/10 21:20
>>653
++xが左辺値なのは効率の為で、x++が右辺値なのはそうせざるをえないから、かな。
実装してみればわかるよ。

656 名前:デフォルトの名無しさん :02/07/10 21:27
むきー、x++しか使っていない
俺はまるで非効率な男みたいではないか!!

657 名前:デフォルトの名無しさん :02/07/10 21:30
>>652
描画インターフェースを定義して(IDrawable3D::Draw()とか)、
人間クラス、背景クラスがそれを "内部クラスで" 実装し、
そのインスタンスをD3D描画管理クラスに登録するというのはどうかな。
このやりかたなら、対象となるクラスが何であろうと、描画に持ち込むことができる。

デザインパターンでいうところの・・・何だっけ

658 名前:  :02/07/10 21:35
>>656
普通にプログラミングすれば、x++と--xだけあればいい。
++xやx--は使う前にアルゴリズムを見直してみることを勧める。

659 名前:デフォルトの名無しさん :02/07/10 21:36
++は右っ側、--は左っ側にするのか?

660 名前:652 :02/07/10 21:42
>>654
ありがとうございまする
動きました!!GCCなら動いてたんだけどなぁ
BCCは動かないのね…



661 名前:デフォルトの名無しさん :02/07/10 21:47
>アルゴリズムを見直してみることを勧める

そ、そんなに重大なことなのか!?

662 名前:デフォルトの名無しさん :02/07/10 21:48
>>658
++xとx++は、コピーコンストラクタ云々で効率が違うんだと。
詳しくは知らん。

663 名前:japh ◆J.5V8ta6 :02/07/10 21:56
>>658
ん〜む。何故にx++と--xのみ…
よければ理由を教えてもらえないかな?

664 名前:デフォルトの名無しさん :02/07/10 22:00
>x++が右辺値なのはそうせざるをえないから、かな。
x++が左辺値だったら、なんかまずいワケ?納得いかん。


665 名前:デフォルトの名無しさん :02/07/10 22:00
>>662
演算子の多重定義の事を考えてみると、前置++は参照値を返すように
書けるが、後置++はできない。関数内で一時変数を作成して、その値
を返すようにしなければならない。

それで、参照値が返せるというのは、すなわち左辺値になりうる、という
説明ではダメ?

666 名前:japh ◆J.5V8ta6 :02/07/10 22:05
そもそもxの通常の動作は
xをインクリメントし、インクリメントする前の古い値を返す
というもの。
「xをインクリメントする前の古い値」がxそのものであるはずがない…
つまり一時オブジェクトであるということだよ。

ちなみに、ユーザー定義型ではx++に代入させることも可能だよ。
俺はそんな型扱いたくないけどね。



667 名前:デフォルトの名無しさん :02/07/10 22:06
>>664
前置/後置で左辺値/右辺値でバランス取れてるじゃん!
右辺値だけ使いたい時も在るさ、多分

668 名前:664 :02/07/10 22:12
>>665
なるほど、納得しますた。
>>667
納得いくかっ!

669 名前:662 :02/07/10 22:30
>>665
さんくす。
しかし、それでも後置を使いたいんだなぁぁ。
前置は気持ち悪いのよね。

670 名前:デフォルトの名無しさん :02/07/10 22:39
>>669
気持ちが悪いという理由で演算子を使い分けられないのなら、プログラマは
向いてないと思われ……。

(それは仕様ですで何でも済ませるヤツもアレだが、仕様を納得できんのも
アレだ)

671 名前:デフォルトの名無しさん :02/07/10 22:41
プログラマはというか、C++は絶対に向いてないね

672 名前:デフォルトの名無しさん :02/07/10 22:44
しかしC++は後置だったりする

673 名前:662 :02/07/10 22:52
>>671
確かに向いてないかも。
templateとかあんまり好きじゃないしね。
ヘッダにずらずらと、なんだか汚く感じるんだなぁ。

674 名前:デフォルトの名無しさん :02/07/10 23:01
>>673
C++は他の言語のいい点をたくさん取り入れたが、汚い所もたくさん
取り入れてしまったね。

675 名前:デフォルトの名無しさん :02/07/10 23:05
ヘッダに書いた方が良いと思うが。
セパレーションは運用楽だしコンパイル速度も遅くならないが、管理が面倒。

676 名前:デフォルトの名無しさん :02/07/10 23:05
>>673
それは同意。
資源の浪費だし、テンプレートを使ったコードの最適化は信用できないし。

でも C++ は嫌いじゃないけど?


677 名前:デフォルトの名無しさん :02/07/10 23:08
どの言語が一番好きかといわれたらダントツでC++だな・・・


678 名前:デフォルトの名無しさん :02/07/10 23:11
んだんだ。

679 名前:デフォルトの名無しさん :02/07/10 23:21
仕事には私情を挟むつもりは無いが
同じく俺もだ。

680 名前:652 :02/07/10 23:50
>>657
ありがとうございます。
でもレスが少ないところを見ると、ゲーム分野でオブジェクト指向を取り入れてる人って少なそう。
私もラッパー程度の使い方にとどめておきます。

681 名前:デフォルトの名無しさん :02/07/10 23:59
>>680
オレはOOだよ。
シーンやシナリオはステートパターンで。
スプライトとかオブジェクトにしとけば便利。

682 名前:デフォルトの名無しさん :02/07/11 00:09
ゲームってOO使えそうじゃない

683 名前:デフォルトの名無しさん :02/07/11 00:14
例外処理が有効な時とか RTTI が有効な時に定義されるマクロって
何かありましたっけ?
__CPLUSPLUS みたいな感じの。

CodeWarrior と VC++ の場合を知りたいです。

684 名前:デフォルトの名無しさん :02/07/11 00:15
VC++はヘルプにあった。

685 名前:デフォルトの名無しさん :02/07/11 00:24
オブジェクトの何等かの状態を知りたい場合、intやdouble,booleanなどのメンバーに
アクセスする時にC++の教科書ではメソッドを介してアクセスされてますがなぜですか?

FieldやPropertyなど、メソッドを介さずに直接Publicなメンバーを用意して
値のやり取りも出来ると思うのですが。


686 名前:デフォルトの名無しさん :02/07/11 00:26
>685 その理由を説明していない教科書は捨てろ。

687 名前:デフォルトの名無しさん :02/07/11 00:32
(自分だけが)十分承知使うなら別にそれでもかまわんぞ

688 名前:デフォルトの名無しさん :02/07/11 00:34
>>685
#define class struct
#define private:
#define protected:
とでもして使えばいい罠。

689 名前:デフォルトの名無しさん :02/07/11 00:37
>>686
その理由に付いては何となく分かるんですが。(配列、ポインタ、インデクス
範囲、そんなキーワード思い付いたんですが)
教科書探して見ます。

>>687
わかりました。どうもです。

690 名前:デフォルトの名無しさん :02/07/11 00:38
#define private public
#define protected public
だわな。

691 名前:デフォルトの名無しさん :02/07/11 00:39
>>688>>690
極悪(w

692 名前:デフォルトの名無しさん :02/07/11 00:44
>>688-690
ワラタ

693 名前:デフォルトの名無しさん :02/07/11 05:39
>>680
> ゲーム分野でオブジェクト指向を取り入れてる人って少なそう。
絶対数は知らんが、俺は OO だよ。今度、転職する先のゲームメーカーでも
開発の主力言語は C++ だそうだ。

(別のトコロで C 主流ですって会社もあったけど、そっちは断った。言語が理由
じゃないけどね)

694 名前:デフォルトの名無しさん :02/07/11 05:43
>>688
ANSI C++ の規格では、private, protected, public の中ではメンバ変数のメモリ
配置順序は決まってるが、それをまたがった場合には実装依存になっている。
たとえば

private:
 x;
public:
 y;
private:
 z;

だと x, y, z ではなく x, z, y の順に配置されるかも知れんわけで、そのマクロを定義
すると既存のオブジェクトとバイナリ互換性を崩す可能性があるぞ。

まぁ、ネタニマジレス だけどさ(w

695 名前:デフォルトの名無しさん :02/07/11 13:57
シングルトンなクラスのgetInstance()とかでnewしたやつは
どこでdeleteすべきですか?

696 名前:デフォルトの名無しさん :02/07/11 14:05
mainの最後とか

697 名前:デフォルトの名無しさん :02/07/11 14:07
static Singleton* pinstance = NULL;
if (pinstance == NULL) {
 lock();
 if (pinstance == NULL) {
  static Singleton instance;
  pinstance = &instance;
 }
 unlock();
}
return pinstance;

こうすればいい

698 名前:695 :02/07/11 14:28
>>696,697
ども。697を見てて思ったんですけど、
Singleton* Singleton::getInstance()//staticなメンバ
{
 static Singleton inst;
 return &inst;
}
なんてするとヤヴァイですか?

699 名前:デフォルトの名無しさん :02/07/11 14:30
>>694
なるほど、そうすると、privateなメンバを持つクラスのヘッダファイルを
書き換えて、privateメンバをいじくって楽しむというのは危険な行為な
のですね。

まあもともとC++のカプセル化機構は、いくらでも壊すことができるから、
使う人に全責任があるわけですが。

700 名前:695 :02/07/11 14:31
>>698
むりですた

701 名前:デフォルトの名無しさん :02/07/11 14:45
>699
危険なヤシが居ます

702 名前:695 :02/07/11 14:45
ガーン。二重deleteしてるだけだった。
とりあえず>>698でよさげなのですが、697さんのように
いちいちチェックしたほうがよいですか?

703 名前:デフォルトの名無しさん :02/07/11 14:51
697のはマルチスレッドで間違って2つのインスタンスが生成されるのを防ぐ方法

704 名前:デフォルトの名無しさん :02/07/11 17:15
#include<stdio.h>
#include<stdlib.h>
typedef struct cell{
eki[20];
struct cell *next;
} CELL;
CELL *link(char *eki,CELL *p){
char *q,*r;
q=(CELL *)malloc(sizeof(CELL));
strcpy(q->eki,eki);
if(p==NULL){
q->next=NULL;
return q;
}
r=p;
while(r->next!=NULL){
r=r->next;
}
r->next=q;
q->next=NULL;
return p;
}
main(){
CELL *start=NULL;
char eki[20];
while(scanf("%s",eki)!=EOF){
start=link(eki,start);
}
連結リストの簡単なプログラムですがリナックスならこれで通りVCでは通りません。
ポインターの所にエラーがきます。どう直せばいいのでしょうか?


705 名前:デフォルトの名無しさん :02/07/11 17:17
ぜんぜんC++じゃないじゃん。

706 名前:デフォルトの名無しさん :02/07/11 17:22
> 連結リストの簡単なプログラムですがリナックスならこれで通りVCでは通りません。

このソースが通るコンパイラってあるのでしょうか…

707 名前:デフォルトの名無しさん :02/07/11 17:25
>>704
通るように修正したよ。(動作確認はしてない)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct cell{
char eki[20];
struct cell *next;
} CELL;

CELL *link(char *eki,CELL *p){
CELL *q,*r;
q=(CELL *)malloc(sizeof(CELL));
strcpy(q->eki,eki);
if(p==NULL){
q->next=NULL;
return q;
}
r=p;
while(r->next!=NULL){
r=r->next;
}
r->next=q;
q->next=NULL;
return p;
}

main(){
CELL *start=NULL;
char eki[20];
while(scanf("%s",eki)!=EOF){
start=link(eki,start);
}
}


708 名前:デフォルトの名無しさん :02/07/11 17:25
>>704
VCとunixとでは仕様が全然違う。きをつけろ

709 名前:デフォルトの名無しさん :02/07/11 17:25
eki[20];
何型?

710 名前:デフォルトの名無しさん :02/07/11 17:28
とおりましたありがとう。
ちなみに出力関数忘れてましたw。

711 名前:デフォルトの名無しさん :02/07/11 17:29
>>709
コピーするときに間違えたと思われ

712 名前:てすとちゅぅ :02/07/12 18:55
Σ(´д`;)

なんで仮想関数の方が呼び出しが早いんだろう・・・
おかしいな

713 名前:デフォルト名無しさん :02/07/12 19:07
Vicual C++で、

int main()
{

char ss[5];
cin >> ss;

cout << ss << '\n' ;

return 0;
}

を実行すると、8文字まで打ち込んでも返してくれます。
9文字目でエラー発生。

どうして???

714 名前:デフォルトの名無しさん :02/07/12 19:08
>>713
char ss[5];

715 名前:デフォルトの名無しさん :02/07/12 19:09
ふざけてんの?

716 名前:713 :02/07/12 19:09
>714
だからさ、5文字って指定しているのにどうして
8文字までOKなのかってことさ。

717 名前:デフォルトの名無しさん :02/07/12 19:09
>>704
C++でmallocなんて化石は使うな。
と言ってみる。

718 名前:デフォルトの名無しさん :02/07/12 19:11
>>716
あんたの環境ではたまたま大丈夫だったってだけだろ?

719 名前:713 :02/07/12 19:11
そんなもんなの???

720 名前:デフォルトの名無しさん :02/07/12 19:13
>>719
ss[4]以降もメモリーは続く。

721 名前:720 :02/07/12 19:13
s/ss[4]/s+4/

722 名前:721 :02/07/12 19:14
違う、ss+4だ・・

723 名前: :02/07/12 19:15
ss/ss[4]/ss+4 ?

724 名前:デフォルトの名無しさん :02/07/12 19:17
>>723
何気におもろかった。

725 名前:デフォルトの名無しさん :02/07/12 19:18
>>716
OKじゃなかったらバッファオーバーフロウの心配なんてしねーよ。

726 名前:723 :02/07/12 19:18
?

727 名前:デフォルトの名無しさん :02/07/12 19:22
s/じゃなかったら/なら

728 名前: ◆JAPH9PWA :02/07/12 20:10
つまり幅を制御したければstd::setwを使え、と。


729 名前:デフォルトの名無しさん :02/07/12 23:37
alignment …ああ、ネタにマジレスしちまった。

730 名前:デフォルトの名無しさん :02/07/13 12:42
例外をthrowする時いろいろ情報を渡したいので
MyException:クラスを作ってコンストラクタを
MyException::MyException(const、char* sourceFile, int sourceLine, const char* format, ...)
と定義して
throw MyException("HOGE(%d) %s", a , b);
等として使っているのですが、
これだとCのヘッダ <stdarg.h> をインクルードしないと巧く行きません。

iostreamとか使ってもっと、C++風にかっこよくするにはどうしたら良いのでしょう?


731 名前:デフォルトの名無しさん :02/07/13 12:44
まちがった!
throw MyException("HOGE(%d) %s", a , b);

throw MyException(__FILE__, __LINE__, "HOGE(%d) %s", a , b);
です

732 名前:デフォルトの名無しさん :02/07/13 13:14
無い

733 名前:デフォルトの名無しさん :02/07/13 13:16
vectorとかに格納してみるとか。

734 名前:デフォルトの名無しさん :02/07/13 13:17
「newしたものをdeleteしわすれる」以外に
メモリーリークすることってありますか?

735 名前:デフォルトの名無しさん :02/07/13 13:33
mallocしたものをfreeしわすれる

736 名前:デフォルトの名無しさん :02/07/13 13:37
配列のdeleteに[]を付け忘れる。

737 名前:デフォルトの名無しさん :02/07/13 13:42
>>735 >>736
以外でありますかね?
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
したらなぞのメモリーリーク検出するんですよねぇ。。
newもmallocもつかってないのに。。

738 名前:デフォルトの名無しさん :02/07/13 13:54
Winの場合だけども、リソースを解放し忘れてるとか。

739 名前:デフォルトの名無しさん :02/07/13 14:04
>>730
可変個引数はあきらめて、引数を1個、2個、3個、…持つ
テンプレート関数としてコンストラクタを定義する。

740 名前:734=737 :02/07/13 14:06
どうも。コメントアウトしながらつきつめていったら、
どうやらstd::stringのつかいかたをあやまっていたようです。

std::string str;
str = "";
ってだめコードですか?

741 名前:デフォルトの名無しさん :02/07/13 14:16
>>730

確か、operator,()ってオーバーロードできたよなぁ…
それ使って、

template <class T>
class variable_arg : public T {
  variable_arg(T);

  template <class T2>
  operator,(T2);
};


template <class T>
MyException(int,int,string,variable_arg<T>)

とかって定義してやるのは無理かなぁ…。。。
C++初心者なのでわかりませぬ…。。。

742 名前:741 :02/07/13 14:18
関係ないところを訂正

MyException(const string&, int, const string&, variable_arg<T>);

ちょっと試してみよう。。。

743 名前:デフォルトの名無しさん :02/07/13 14:32
>>740
駄目ではないと思う。
str.clear() だとリークは起こらないの?

744 名前:740 :02/07/13 14:39
stringに関することはstlすれかな?微妙だけどとりあえずここで。
stlport(4.5.3=今の最新)はメモリリークが発生します。
SGIのアローケーターがよろしくないらしいので、
$stlport\stl\_site_config.hの
#define _STLP_USE_NEWALLOC 1
をコメントアウトするといいようです。
ってがいしゅつ?(だろうな)

745 名前:デフォルトの名無しさん :02/07/13 14:48
ちゃいます。
普通はNode Allocatorが使われるので、
#define _STLP_USE_NEWALLOC 1

#define _STLP_USE_MALLOC 1
どちらかを定義します

746 名前:740 :02/07/13 14:51
thx.
自分のソースで定義しろってことですよね?

747 名前:デフォルトの名無しさん :02/07/13 15:02
違う
〜\stlport\stl_user_config.h
に書き加える。iostreamも使っている場合、
ビルドし直さないと原因不明のバグの元になる。

748 名前:デフォルトの名無しさん :02/07/13 15:14
>730
proxyクラスのインスタンスを作って、そいつをコンストラクタに渡すのはどうよ?

proxyとしてstd::ostringstreamがそのままつかえるかと思ったけど、
operator << が返すのはostream型なので
コンストラクタはostringstream型ではなくostream型にしなければいけない。
だから、そのまま使うとダウンキャストが必要で、
使い方によってはここで例外が出る(動作はしらん)。
その場合はこんな感じ。
class MyException {
 std::string str;
public:
 MyException(const std::ostream& s): str(dynamic_cast<const std::ostringstream&>(s).str()) {}
 const std::string& what() const { return str; }
};
void f()
{
 throw MyException(std::ostringstream() << " file: " << __FILE__ << " line: " << __LINE__ << " hoge");
}
int main()
{
 try {
  f();
 } catch (MyException& e) {
  std::cout << "Exception: " << e.what() << std::endl;
 }
 return 0;
}

749 名前:デフォルトの名無しさん :02/07/13 15:31
>>734
STLport使ってるとか?

750 名前:デフォルトの名無しさん :02/07/13 15:35
この不具合ってSTLportについてだけ報告されてるの?


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.