トップページ⇒tech
920コメント374KB

C++相談室

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
v(^・^)v
0002デフォルトの名無しさんNGNG
あげとくのv(^・^)v
0003デフォルトの名無しさんNGNG
CやめてC++に移ることのメリットとデメリットを教えてv(^・^)v
0004デフォルトの名無しさんNGNG
C/C++って書いたらハッカーを名乗る人に怒られました
どうしてですか?
0005デフォルトの名無しさんNGNG
>>4
そいつ、「ハッカー」じゃなくて「バッカー」じゃなかったですか?
もしかしたら、プロブラマかもしれません。
00064NGNG
そのひといわく

CとC++は別のものだから一緒にしちゃだめだよ〜(笑
キミ、もっとべんきょうしたほうがいいよ
いまどきC/C++なんて書いてるようじゃだめだめだね。

ということだそうです。
「別だから」って意味不明です。
0007デフォルトの名無しさんNGNG
|C/C++って書いたらハッカーを名乗る人に怒られました
|どうしてですか?

ザーメンがたまってむしゃくしゃしていたんだよ。
そーゆーもんよ
0008デフォルトの名無しさんNGNG
C++でPerlなどのようなパターンマッチをしてくれる関数は無いんですか?
0009デフォルトの名無しさんNGNG
>>6
>いまどきC/C++なんて書いてるようじゃだめだめだね。
時代は関係無いぜ。
そいつだってC++でCのライブラリ使ってんだろ?
コンパイラはC/C++両用だろ?
違うなら「別」でいいけど、氏んで欲しいナ!>バッカー

>>8
Perlよく知らんのだけど、正規表現とか?lexとかじゃダメ?
0010デフォルトの名無しさんNGNG
class A {
public:
class B {
public:
void Set(const A& a);
private:
int m_nCnt;
}
private:
int m_nNum;
};

で

void A::B::Set(const A& a)
{
m_nCnt = a.m_nNum;
}

がコンパイルエラーになります。
コンパイラは「A::m_nNumにアクセスできないよ」
といいます。
そういうものなのでしょうか?
001110NGNG
あらら、インデントがなくなってる・・・
見づらくてごめんなさい。
0012>10NGNG
privateだし。
publicにしちゃだめなの?
001310NGNG
>>12
publicしてもいいんですが
せっかくクラスをネストさせてるのに
アクセスできないんじゃさみしぃなぁとおもったので。
イテレータっぽいの書いてたんですけど
イテレータって、どうしてもコンテナの内部にアクセスしなきゃ
ならなくて、
なるべく公開するもの少なくしようとしてクラス(この場合イテレータ)を
ネストさせたんですが、上のようなエラーが無常にも出てしまったんです。
ネストしたクラスの特権(特徴)ってあんまりないんですかね??
0014デフォルトの名無しさんNGNG
MFC的
#define offsetof(s,m) (size_t)&(((s *)0)->m)

class A {
public:
class B {
public:
void Set();
private:
int m_nCnt;
} m_xB;
friend class B;
private:
int m_nNum;
};

void A::B::Set()
{
A* pThis = ((A*)((char*)this - offsetof(A, m_xB)));
m_nCnt = pThis->m_nNum;
}

001510NGNG
MFCってなんかすごそう。。。
ヌルポインタから->伸ばすあたりはドキドキものですね。。。

ところで
friend class B;
ならば、そこまでトリッキーにならなくてもいいんじゃないかと・・・
(というか、pThisがどこをアクセスしているのか良く分かりません・・・)
0016デフォルトの名無しさんNGNG
>>15
同じこと思いました。>>10のclass Aの中にfriend B;を加えれば全て解決です。

friend は誤解されることが多いのですが、これは安全のためにあるのですよ。
隠蔽度を高くするためにあるのです。
public な A::GetNum() const; を作るほうがはるかに危険だから、
firend を使うわけですよ。
0017デフォルトの名無しさんNGNG
class A に public インターフェースで m_nCnt を変更する
メソッドをつけるのはためしました?
ネストしたクラスっていうのは書いたこと無いんでわからないんだけど
0018デフォルトの名無しさんNGNG
あーごめん ボケですな >>17
001910NGNG
>>16
friendは安全のためなのですか。
そうだったのですか・・・了解です。
「friendは悪」と思っていたので
friend使わないで良い方法を探していたのですが
(それでネストしたクラスとか試してたんですが)、
friend使うことにします。
002010NGNG
>>17
ありがとうございます。
とりあえずfriend使う方針で逝きます。
ネストしたクラスについても知りたかったのですが、
もうすこし自分で調べてみます。
では。。。
0021デフォルトの名無しさんNGNG
C++とJavaを較べると将来生き残ってそうなのはどちらですか?
0022初心者NGNG
2つ疑問があるのですが
VC++6でDOS画面での実行結果がすぐに閉じてしまう。
あと、コマンドライン引数を打ち込むことができない。
よかったらおしえていただけますか。
0023>22NGNG
[プロジェクト]-[設定]-[デバック]-[プログラムの引数]
で設定できると思う。
0024>22NGNG
>VC++6でDOS画面での実行結果がすぐに閉じてしまう。
!ボタンなら閉じないと思う。
それか、main()の最後に、_getch()とでも書いておく。
0025初心者NGNG
>23
ほお。
>24
なるほど。

ずっとCの勉強はLSIC86でやってたんでなれてないです。
また疑問があったら質問しにきます。
ほんとにありがとうございました。
0026デフォルトの名無しさんNGNG
CLASS B{
 B();
 ~B();
 AA* aa;
}

CLASS A:public AA{
 A();
 ~A();
 B b;
}

という二つのクラスがあったとき
b.aaにAのthisポインタを渡したいんですけど、
AのコンストラクタではthisはNULLでした。
thisはコンストラクタが動いた後からしか使えないんでしょうか?
0027デフォルトの名無しさんNGNG
>thisはコンストラクタが動いた後からしか使えないんでしょうか?
そんなことは無い。
0028デフォルトの名無しさんNGNG
>>26
class B
{
private:
 AA *aa;
public:
 B(AA &);
};

B::B(AA &a)
: aa(&a)
{
}

class A : public AA
{
private:
 B b;
public:
 A();
};

A::A()
: b(*this)
{
}

こういうことをしたいのでしょうか?

>>19
>「friendは悪」と思っていたので
>friend使わないで良い方法を探していたのですが

gotoと同じで、無闇に使うのは悪です。
friendを使わなくてもいいのに済むならそのほうがいいですし、
上手く使うにはある程度の技量が必要です。
しかしこの例の場合のように、明らかに friend を
使ったほうが安全な場合もあるため、
無闇に嫌うのもまた問題があるのです。
002926NGNG
>>28
ごめんなさい
A::A()
: b(*this)
{
}
みたいなのがちょっと良くわかんないので勉強してきます。

簡単にいうと、
AAは既製のクラスなんですが、
一部機能がわかりにくいので使いやすくまとめたクラスがBなんですが
やっぱり機能を使うには
aa->〜〜()
みたいにAAクラスのポインタを使ってるんです(^^;

単に馬鹿なだけでしょうか(^^;
0030ひげNGNG
>>29

これをコンパイル実行してみてください。
この方法は「初期化」と呼ばれる方法です。
「代入」と同じ効果を生むのですが、厳密には異なります。
 (たとえば、メンバフィールドが const 変数であった場合など)
詳しい議論は『Effective C++』の第12項を参照すると良いと思います。

// 実行結果
// 777

#include <iostream>
using namespace std;
class Test
{
public:
int number;
Test();
};

Test::Test() : number(777)
{
}

int main()
{
Test t;
cout << t.number << endl;
}
0031デフォルトの名無しさんNGNG
>29
A::A():b(*this)は、
Aのメンバ変数bを、thisポインタが参照しているインスタンスの値
(つまり自分自身の値)を引数とするコンストラクタを起動して
初期化する、っていう意味だよん。

class BB{
private:
 AA* aa;
public:
 void hage(){aa->hoge();}
}
とやるのは、オブジェクト指向の委譲の考え方。別に変じゃないよ。

ただ、そもそもclass Aとclass Bが相互参照している必要があるの
かどうかをチェックしてある?
003226NGNG
>>28
申し訳ない、どあほうでした

単にクラスAが準備出来てないタイミングで
機能使おうとしてただけでした・・・・

鬱だ・・・・

>>30 >>31
たった今調べ終わったとこでした
解説ありがとうございました。

簡単に言うとMFCでCView(AAクラス)のスクロール関数を
外(Bクラス)にまとめただけです(^^;

AクラスがCViewの派生クラスで、いろいろと使いまわせないかなぁと(^^;
0033デフォルトの名無しさんNGNG
>32
最近Javaしかやってないので、間違ってると思うが
一応FactoryMethodパターンをどうぞ。
詳しい人突っ込みよろしく。

class B{
public:
 static const int TYPE_AA;
 static const int TYPE_A;
private:
 AA* aa;
 setAA(AA* in){aa = in;}
 B(){}
public:
 B~(){delete aa;}
 static B* create(int B){
  B* instance = new B();
  switch(B){
   case TYPE_A:
    instance.setAA(new A());
    break;
   case TYPE_AA:
    instance.setAA(new AA());
    break;
  }
  return instance;
 }
}
//static変数初期化
static const int B::AA=0;
static const int B::A=1;

使用法
B* bAA=B::create(B::AA);//AAのインスタンスをBに持たせたいとき
B* bA=B::create(B::A); //AのインスタンスをBに持たせたいとき
0034デフォルトの名無しさんNGNG
間違った。

//static変数初期化
static const int B::TYPE_AA=0;
static const int B::TYPE_A=1;

使用法
B* bAA=B::create(B::TYPE_AA);//AAのインスタンスをBに持たせたいとき
B* bA=B::create(B::TYPE_A); //AのインスタンスをBに持たせたいとき

0035質問の名無しさんNGNG
ARMだったかプログラミング言語C++かなんかに書いてあったのですが、
「operator T()の定義は避けよう」と有ったのですが
理由がよくわかりません。やっぱり、あいまさの問題が出てくるからでしょうか?
0036デフォルトの名無しさんNGNG
operator T()?そんな定義できるなんて知らんかった。
デフォルトコンストラクタのテンプレート(になるのでしょうか?)
なんか作ってどうするの?
0037デフォルトの名無しさんNGNG
>>36
いや、キャスト演算子だと思う。

避ける理由は良くわかんないですが、
僕は暗黙の型変換がどうも好きになれないので書かないようにしてます。
(明らかに便利&安全そうなものには書いちゃいますけど)
引数が1つだけのコンストラクタにはexplicit付けてます。
0038ミトコンドリ子NGNG
>>35
36のいうとおり、キャスト演算子ね。

避ける理由は
「More Effective C++」,Scott Meyers,安村 通晃 他訳,アジソン・ウェストレイ,1998
ISBN4-7561-1853-4
項目5:ユーザ定義の変換関数に気をつける
を参照してちょうだい。

ちょう要約すると「基本的な問題は、このような関数がしばしばあなたが望みもしなければ
期待もしないようなときに呼ばれてしまうことにある。結果は正しくなくなることもあれば、
診断が気の狂うほど難しくなるような、直感的でないプログラムの振る舞いに
なることもある。」
0039デフォルトの名無しさんNGNG
 wide characterを使った処理をしたいのですが、
wofstream に wchar_tで出力しても、ofstreamにcharで出力しても
結果がまったく変わりません。バイナリモードでファイルを開いても
だめです。例えば、L'A'を出力したときに、0x4100がファイルに
入っていればいいんですけど。
この厨房をお助けください。
0040デフォルトの名無しさんNGNG
 すいません。39です。処理系を書くべきでした。
 環境はWindowsNT4でVC6です。ただ、質問がVC関係ではないので
ここを選ばせてもらいました。よろしくおねがいします。
0041名無しさん@@NGNG
>>39
うん、だから入出力時にマルチに変換してる。
ライブラリの問題以前に規格やフォントの問題もあるし。
linuxだとwctomb関数がマニュアルにある。
(マルチスレッド云々と状態の切り替えの話に注意して読んで)

0042デフォルトの名無しさんNGNG
みんなC++を使うのだage
0043デフォルトの名無しさんNGNG
DOSの16bitの環境で動作するANSI C++に追従してる処理系ってあります?
DJGPPみたいに、DPMI上で動く様なのは除外してください。
つまり80186で動く様な物です。
テンプレートはでかくなるので無くても良いですが。
(すると、ライブラリの大半が使えない?)
「例外」程度は使いたいです。
0044デフォルトの名無しさんNGNG
BCC45
0045デフォルトの名無しさんNGNG
>>44
Borland処理系は4以降からDPMI使ってるみたいなのでだめです。
0046デフォルトの名無しさんNGNG
>>45
TC++1.0
一番初期のヤツね。ディスク3枚組みのヤツ。
正真正銘16BitDOSでC++。
80186オプションもちゃんとあるぞ。
0047デフォルトの名無しさんNGNG
>>46
43の「ANSI C++に追従している」という意味は、多分
RTTIやnamespaceや例外やテンプレートのような後発の仕様、
および STLその他現在の標準C++ライブラリをサポートしている
という意味だと思うが....俺は知りません。
しかしテンプレート使うとモノがでかくなりがちであり
pureなDOS環境ではちと厳しいのでは。
0048デフォルトの名無しさんNGNG
複数のクラスから使いたいサブルーチン(memcpy類似のアプリ固有
のよく使う処理)って、どういう名前空間に置きますか?
アプリのメインのクラス内にpublicで置くと、そのクラスのインス
タンスをexternするか、子クラスにポインタを渡していかなければ
ならず、すっきりしません。
かといって大域に置くのも何かCくさくて嫌なのです。
0049デフォルトの名無しさんNGNG
singletonにすればー.
005046NGNG
>>47
43はテンプレート無しで良いっていってんじゃん。よく読め。
RTTIって使ってる奴いんの?その辺はどうだか知らん。
0051デフォルトの名無しさんNGNG
>>48 はstaticなメソッドを知らないらしい。

>>50 Embedded C++ だね、それ。
RTTI を使っているやつは存在する。
オブジェクト指向初心者は多重継承を下手に使って失敗する。
オブジェクト指向中級者は多重継承を嫌って使わない。
オブジェクト指向上級者は多重継承を上手く使って楽をする。

ちなみに俺は中級者。
0052デフォルトの名無しさんNGNG
ATL固有の話になってしまって申し訳ないのですが、
CWindowImpl<>::Create()
ってオーバーライドしても平気なのでしょうか?
オーバーライドする必要があるのですが、virtual宣言されていないので
どうなってしまうのでしょうか。

実際に使ってみたところ問題なく使用できているのですが、
正しいのか間違いなのか、教えてください。
0053デフォルトの名無しさんNGNG
>>52
virtualをちゃんと勉強しよう。
ライブラリ的には問題ないと思う(信じたい)けど、
52の使い方次第。
virtual宣言すると、派生元のクラスのポインタで呼んでも、
派生クラスで生成してれば派生クラスのメンバ関数が呼ばれる。
(デストラクタだとちょっと違うが)
0054デフォルトの名無しさんNGNG
オーナードローボタンクラスを作ってたのですが、
生成するたびにBS_OWNERDRAWを指定させるのもなんだかな、って思ったので、
CreateをオーバーライドしてBS_OWNERDRAWをしていしてから
CWindowImpl<>::Create()に渡しているのですが、
この場合問題なさそうですね。

>virtual宣言すると、派生元のクラスのポインタで呼んでも、
>派生クラスで生成してれば派生クラスのメンバ関数が呼ばれる。

これはわかっていましたが、オーバーライドさせるときは無条件で
virtualと思ってたので、質問しました。
やっぱりプログラミング言語C++買うべきですね。
あれってCと違ってべらぼうに高いんですが(^^;
0055デフォルトの名無しさんNGNG
高いのは理解できなくなもないが、
分厚くてでかいのがきつい。
持ち運び不便。
005655NGNG
1行目
なくな→なく
0057デフォルトの名無しさんNGNG
おいら、多重継承は前まで絶対しないことにしてたんだけど、
Javaを覚えてからは、C++で多重継承するときは必ず片側は
完全抽象クラスのみにするようになった。
関数実装の多重継承は禁止。これで安心。僕って上級者???
005843NGNG
ボーランドサイトでTurboC++1.01が見つかりましたので、これで我慢します。
ちなみに例外は使えない様です。4.0からかな?
ついでですが、RTTIや名前空間とかは使わないです。>47
#C++はもっとCみたいにコンパクトな言語にならないですかね。
005943NGNG
いままでわたしはCでOO風に書いてきました。
CでOO風に書く利点としては、Cさえ動けばどんな環境でも使える事ぐらいですが、こういう事やってる(やってた)人います?
不便な点は、Cではinlineキーワードが標準で使えないから、アクセサの効率を上げる為に、処理系毎に__inlineだの、static __inline__だのをマクロ定義しなきゃいけないとか、色々面倒が多いですが。
それと、他人にソースを渡す場合は困りますね。
いちいち書き方の説明する様な事をしなくちゃいけないんで。
そういう時はC++でラップして渡しています。(二度手間ですが)
0060デフォルトの名無しさんNGNG
RTTIって何に使うの?用途が思い浮かばない。デバッグ?
0061名無しさん@EmacsNGNG
callback してきたオブジェクトをいつ delete するか悩んでいます.
例えば...

class B {
public:
 B(A* a) { a->onCallBack(); }
};

class A {
public:
 B* createB() { return new B(this); }
void onCallBack();
};

とかなってる場合,
B のインスタンスはいつ delete すればよいですか?
A::onCallBack() に B* を乗せて
void onCallBack(B* b) { delete b; }
とかするのはだめですよね.

つまり, callback 後は必要ないオブジェクトの破棄をいつ行うか?
ということなんですが, いい方法あるでしょうか?
0062デフォルトの名無しさんNGNG
>59
多分CでOO風に書くって、1ファイル1クラスに見立てて、ファイルスコープ
のグローバル変数をインスタンス変数に見立てて、そのファイルの関数を
唯一のそのグローバル変数へのアクセス手段にするようにするとかだよね。

CでOO風に書いても、クラスとインスタンスの関係は実現できないので
ポリモルフィズムが表現できないと思うんだけど、其の辺は無視?
単なる概念モジュールの階層構造化を指してOOと呼んでるのでしょうか?

>60
ポリモーフィズムの意義を勉強せよ。
0063デフォルトの名無しさんNGNG
>61
よう分からんが、Bのインスタンスはスマートポインタで
ラップして値で持ちまわるようにしたら?
006460NGNG
>>62
RTTIでポリモフィズムとなると、
typeid演算子を使って、実際のクラスを判別するんですか?
かえっておかしなことになるような。

なんか勘違いしてます?
006543NGNG
>>62
グローバル変数は一切使いません。
インスタンスはスタック、またはヒープに確保します。
シングルトンパターンの実装やリソースカウンタなどはstaticな変数を使いますが。
多態が必要な場合、typeid(実はenumやint)と関数のポインタテーブルを使って実装します。(かなり面倒ですが。)
0066ミトコンドリ子NGNG
>>60
RTTIはtypeidよりはdynamic_castでよく使うんじゃないかしら。

用途としては、抽象クラスのポインタ(参照)しかとれない場合(たとえば
抽象クラスのポインタのコンテナをイテレートするとき)に、なんらか
(派生クラスでしか定義されていないメンバを呼びたいとか)の理由で
ダウンキャストしなくちゃいけないときが一番多いかしら。
なるべく使いたくないけど、compositeパターンなんかを使うと
ある程度は使わざるをえなくなることが多いわ...

なるべくdynamic_castを使わずにすむように心がけながら設計
してるけどね。
0067ミトコンドリ子NGNG
>>61
まず所有関係に注意しながら設計を見直すのが最初だと思うわ。多くの場合は
きちんと考えれば、どのインスタンスをいつ破棄すれば良いかは明確にできると
思うけど。
それが難しい場合(スレッド間で受け渡しするインスタンスなど)は、63の言うとおり
何らかのスマートポインタを使うのがいいんじゃないかしら。
でもうまく使わないとバグの温床になるわよ。気をつけてね。
0068デフォルトの名無しさんNGNG
わかったからそのネカマ言葉をやめてくれ
0069デフォルトの名無しさんNGNG
>67
C++を知らない奴が、スマートポインタに関数内のローカル変数の
アドレス渡して、その後原因不明で落ちる!と大騒ぎするのを
多々目撃しております。
007060NGNG
>>66
RTTIってdynamic_castも含めるのね。dynamic_castなら使っていますので解かります。
てっきりRTTI=typeidで得るclass type_infoのことかと思い込んでいました。
親切な回答ありがとうございました。

では改めて質問。
typeid演算子、ならびにclass type_infoって何に使っていますか?
0071デフォルトの名無しさんNGNG
デバッグ用機能です
0072ミトコンドリ子NGNG
>>69
やりがちよね。
class Foo {
protected:
Foo();
public:
virtual ~Foo();
public:
static SmartPointer<Foo> create();
};
みたいにして、スマートポインタの使用を強制するようにしてるわ。

>>70
めったに使わないわ。おもにassertで使うわね。
派生クラスじゃなくて、ぜったい特定のクラスのインスタンスが
欲しいときとかに assert( typeid(*ptr)==typeid(Foo) );とか。
0073デフォルトの名無しさんNGNG
ミリ秒間、何かの処理をさせるみたいな時に使う時間をはかるもの
タイマーって言うんでしょうか?
そういったタイマーで、一般的に使われる関数を教えて下さい
0074SAGENGNG
>>73
時間を計るなら clock かな?
0075デフォルトの名無しさんNGNG
winapi -> SetTimer()
0076デフォルトの名無しさんNGNG
精度が必要ならマルチメディアタイマー
007761NGNG
>>63
B を作るオブジェクトは最後まで死なないので
スマートポインタは使えなさそうな気がします.
なんか間違ってるかな.

>>67
設計見直しですか.
いや, そんな気はしてんだよなぁ.

もちっと考えてみます.
2人ともありがとっ
007873NGNG
なるほど
ありがと、74・75・76
0079ageNGNG
class A
{
public:
  A();
private:
  const int m_data[10];
};

で、class AのコンストラクタA::A()を書こうとして困ってしまいました。
A::m_data[10]の初期化はどのように書けば良いのでしょうか?
constにしているのは困っているところを強調するためなのでご了承ください。
メンバ配列の初期化ってムリなんですかね・・・
0080minimaNGNG
>>79さん
const を外して
A::A(){
  for( int i=0; i<10; i++)
    m_data[i] = i;
}
です。

・・・だと思います・・・自信なし・・・。
008180NGNG
あああ〜〜〜〜
やっぱし違うと思います。すいません。無視してください。
0082デフォルトの名無しさんNGNG
A() {
 int i;
 int * p = (int *)m_data;
 for( i = 0; i < 10; i++ ) p[i] = 0;
}
こんなんど?
008379NGNG
>>80,82
質問のしかたがまずかったかもしれません。
やりたいこととしては

A::A()
: m_data(????)
{
 //ここには書きたくないのです・・・
}

のように初期化列の中に配列の初期化を書きたいなぁと思ったのです。
普通のメンバ変数だったら

class B
{
public:
B() : m_data(0) {}
private:
const int m_data;
};

みたいに書けるのに、配列はどう書けばよいのやら・・・
どうあがいてもムリ??
0084デフォルトの名無しさんNGNG
配列はできないような…?std::vectorじゃだめ?
008579NGNG
>>84
std::vectorほどの柔軟性は必要なかったりしてるんです。
動的にメモリ確保されても困るので・・・
具体的には今3Dのプログラム組もうとしていて、
4次元ベクトルのクラスとか作ろうとしたとき
struct Vector
{
  Vector(float x, float y, float z, float w);
  float m_data[4];
};
てな具合にしたのですが
m_data[4]の初期化で困ってしまったということでした。

やっぱり配列はどうしようもないようですね。
あきらめて80,82さんのようにコンストラクタの{}中に書きます。
ありがとうございました。
0086デフォルトの名無しさんNGNG
つうか、配列でそんな書き方できるほうが危ないんだよ。
もうすこし勉強しないとわからんかもしれんが。
0087デフォルトの名無しさんNGNG
最近、vectorやlistを独自の使ってるのを見ると、
素直にSTL使ってくれって思うぜー。
メモリは先に必要な分だけ確保しておけば問題ないぜー。
0088デフォルトの名無しさんNGNG
初期化列の中に、初期化する変数書く利点ってなんだ?
配列は初期化できないし…?
0089デフォルトの名無しさんNGNG
利点というよりそこに書かなきゃならない場合があるだけです。
逆に言えば初期化列に記述できないものはそもそも初期化列
で初期化する必要がないという事。
つまり今回の例は「ここに書きたくない」なんてゴネてないで素直に
{}に書けつーことです。
0090デフォルトの名無しさんNGNG
デバッグ用に内部データがデバッガで見やすくかつ鬼のように
チェックの厳しいSTLの実装ってどこかにない?
0091デフォルトの名無しさんNGNG
>>87
キミ、ちょっとズレてるよ。
0092デフォルトの名無しさんNGNG
>>89 利点というよりそこに書かなきゃならない場合
ってのはどういう場合なのん?
0093だめだこりゃNGNG
デフォルト以外で初期化したい基底クラスや
デフォルトコンストラクタを持たないオブジェクト、
参照やconstオブジェクト、
効率のためデフォルトの初期化を行ないたくない場合とか
その他いろいろあるっしょ
0094わざわざすまんのおNGNG
{ } 内では、できない初期化があるってことなのか…。
0095デフォルトの名無しさんNGNG
配列自体を病める方に一票。
0096デフォルトの名無しさんNGNG
Cでは
struct ta sub()
{
struct ta a;
return a;
}
は禁じ手ですが(autoのstructを返すため)
C++では
CString xxxxx()
という関数がいっぱいあるのはなぜでしょう?
C++ではクラスのリターン値は保証されるのですか?
0097デフォルトの名無しさんNGNG
>>96
C++でもauto領域のリターンは御法度だ
ソースはみたか?
CString xxxx()のなかでauto変数領域返してるか?
0098デフォルトの名無しさんNGNG
御法度じゃないぞ。代入コンストラクタって言葉知ってるか?
0099デフォルトの名無しさんNGNG
returnで代入コンストラクタが働くって意味かい?
010098じゃないけどNGNG
>returnで代入コンストラクタが働くって意味かい?

そうよ。

AnyClass obj;
obj = anyFunc(なんかの引数);

とかで、anyFuncがAnyClassのautoオブジェクトをreturnしてたら、
1.AnyClass::AnyClass(const AnyClass&)でリターン用臨時オブジェクトが作られる。
2.AnyClass::operator=(const AnyClass&)で臨時オブジェクトがobjへコピーされる。
3.臨時オブジェクト消滅
てなことが舞台裏で行われるのです。

処理系の実装によっては、もちょっと最適化されるかも知れんけど。
0101100NGNG
でも、96みたいなのも近頃のCでは
御法度じゃなかったんじゃない?

struct ta* func() {
 struct ta taObj;
 return &ta
}

は、おもくそまずいけど。
■ このスレッドは過去ログ倉庫に格納されています