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


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

C++相談室 part21
501 名前:デフォルトの名無しさん :03/07/25 10:23
質問です。
下のコードで、メモリは正常に解放されるのでしょうか?

int* np;
np = new int;
void* vp = np;
delete vp;


502 名前:デフォルトの名無しさん :03/07/25 10:46
>>501
そのコードがうまくいったとして、
void*をdeleteすんのはまずいだろ

503 名前:デフォルトの名無しさん :03/07/25 13:37
>>501
メモリは正常に解放されることが多いと思うが、未定義かな。
あと、デストラクタがある場合はデストラクタが呼ばれなくなってしまう。
delete をオーバーライドしてた時も、それが正常に呼ばれなくなってしまう。
ってところか。
まぁ、兎に角そんなことはすんな、と。

何をしたいのか分からんが、
テンプレートを使ったら良さそうなことを
したがってるような気がする。

504 名前:デフォルトの名無しさん :03/07/25 14:40
オーバーロードだった。不覚。

505 名前:デフォルトの名無しさん :03/07/25 15:16
>>593
レスありがとうございます。
動的に確保したいろいろな型のメモリアドレスを
リストかなんかで 持って置いて、あとで全ていっぺんに
解放できるかどうかためしていました。
void*で デストラクタが呼ばれないんじゃ使いもんにならないですね。


506 名前:デフォルトの名無しさん :03/07/25 15:19
待てよ?
POD 型だけなら大丈夫なのか?
デストラクタないし。
規格じゃどうなってる?

507 名前:デフォルトの名無しさん :03/07/25 15:38
>505
素直にスマートポインタを使ったほうがいいかと

508 名前:デフォルトの名無しさん :03/07/25 18:18
X (int i = 0) : m_i(i) { }
これってどういう意味?

509 名前:デフォルトの名無しさん :03/07/25 18:20
アハァ?

510 名前:デフォルトの名無しさん :03/07/25 18:25
ゴメソ全部書かないとわからんわな
struct X
{
X (int i = 0) : m_i(i) { }
int get() const { return m_i; }
int m_i;
};
で、どういう意味?

511 名前:デフォルトの名無しさん :03/07/25 18:25
クラスXのintを引数にとるコンストラクタで、メンバm_iをiで初期化します。
引数を指定しなかった場合iは0になります。

512 名前:デフォルトの名無しさん :03/07/25 18:29
>>511
510じゃないが、そういう意味なのか。わかりにくいな・・・
X (int i = 0){m_i=i } これじゃだめなのか

513 名前:デフォルトの名無しさん :03/07/25 18:29
m_iがクラスだったらどうすんだよ。

514 名前:デフォルトの名無しさん :03/07/25 18:35
>>512
初期化リスト( コロンから { まで )で書かれたものは初期化になるが
コンストラクタの関数ブロック内( { から } まで )に書かれたものは
普通のコードとして処理され、代入文は初期化ではなく代入になる。

int相手なら違いは無いが、メンバ変数がクラスインスタンスならこの違いが
いろいろ問題になることがある

515 名前:512 :03/07/25 18:38
あ、なるほど。
intと書いてあったからintでしか考えていなかった。


516 名前:デフォルトの名無しさん :03/07/25 21:00
>>512
あと、m_i が const だとこの構文が必須。

517 名前:デフォルトの名無しさん :03/07/25 21:44
教えてください。
当方、solaris環境でプログラムを作っております。
すると作ったプログラムが、動かすマシンによって動作が異なるのです。
具体的には、Blade100なら問題なく動きますが、Ultra2だとたまーに
Bus Errorにてあぼーんです。
OSはSolaris8ですが、両マシンともリビジョンは同じ。環境も同じ。
違うのはOBPのバージョンくらいでしょうか。
プログラムはマルチスレッドとDBアクセスを実装してます。
なにか、ここが怪しいみたいなことありませんか?

518 名前:デフォルトの名無しさん :03/07/25 21:45
>>517
core拾ってデバッグしなはれ

519 名前:517 :03/07/25 21:50
>>518
core吐かないのでしゅ

520 名前:デフォルトの名無しさん :03/07/25 22:27
>なにか、ここが怪しいみたいなことありませんか?
おまいのプログラム

521 名前:デフォルトの名無しさん :03/07/25 22:35
>>519
ulimitみたいなのはないのか?

522 名前:デフォルトの名無しさん :03/07/25 22:37
BusErrorってコア吐かないんだ。へぇー

523 名前:デフォルトの名無しさん :03/07/25 22:54
>>522
意外だろ?w

524 名前:  :03/07/25 22:58
「たまーに」の頻度によるけど、core が得られない場合には strace しとくと
原因究明の手助けになることがありますよ。Solaris だと truss? ってのかな。


525 名前:デフォルトの名無しさん :03/07/25 23:22
ここは最高♪

http://www3.free-city.net/home/akipon/page001.html

526 名前:デフォルトの名無しさん :03/07/26 08:29
>>511
structとして宣言してるのに、クラスとして扱えるんですか?
構造体ってメンバ関数なんて搭載できたっけ?

527 名前:デフォルトの名無しさん :03/07/26 08:33
>>526
classとstructの違いはデフォルトのアクセス指定子だけ。
(class=private, struct=public)

528 名前:デフォルトの名無しさん :03/07/26 09:36
>>527
細かい事言うと、
template<class A> ...
はできるけど
template<struct A> ...
はできないという違いもある。

529 名前:デフォルトの名無しさん :03/07/26 09:43
template<ほげほげ> のほげほげに
class 〜 と typename 〜 両方を使えるようにしたのはどういう意図があるのかな?
教えて偉い人。

530 名前:デフォルトの名無しさん :03/07/26 09:46
最初は class しかなかったけど、
class じゃないものにも class を使うのもなんだってんで
後から typedef を仕様に加えた、ってんだったと思う。

細かい事言うと、
テンプレート引数にクラステンプレートを使う場合には
class しか使えない。

例)
template<template<typename T> class C> ....     // OK!
template<template<typename T> typename C> ...  // Illegal!

531 名前:デフォルトの名無しさん :03/07/26 09:47
typedef じゃなくて typename だって。

532 名前:デフォルトの名無しさん :03/07/27 02:37
> テンプレート引数にクラステンプレートを使う場合には
> class しか使えない。

こっちは、classじゃないものは型テンプレートにできないからそのまんま、
ってことなんだろうなあ。……と思ったけど、もし将来的にtypedefテンプレートが
規格に入ったら、typenameも使えるようになったりするのだろうかね。

template<typename T> typedef T size255array[255];
template<template<class> class> TCls {};
TCls<size255array> ...;

533 名前:デフォルトの名無しさん :03/07/27 22:02
3つほど。

cstdioヘッダはstdio.hをstd名前空間に移したもの。っていう認識でいいんですかね?

標準 C++ ライブラリには、Cの標準ライブラリも含まれるんですか?

それで、C++ソースでcstdioを(っていうかCの関数ライブラリを)利用することは
なんの格好悪さも無い。という認識でいいんですかね?

534 名前:デフォルトの名無しさん :03/07/27 22:02
>なんの格好悪さも無い
とは言えんけど別にいいんじゃないかな。

535 名前:デフォルトの名無しさん :03/07/27 22:12
>>527
字も違うよ!!!

536 名前:デフォルトの名無しさん :03/07/27 22:16
vector <vector <CEnmMissile*> > m_pEnmMissile0;
クラスのメンバとしてこの様に宣言したら、警告がでたんですけど。
何がいけないんでしょうか?

537 名前:デフォルトの名無しさん :03/07/27 22:17
>>536
コレだけの情報じゃ和歌欄

538 名前:536 :03/07/27 22:26
警告の内容はこれです。

d:\program files\microsoft visual studio\vc98\include\vector(39) : warning C4786:
'std::vector<std::vector<CEnmMissile *,std::allocator<CEnmMissile *> >,std::allocator<std::vector<CEnmMissile *,std::allocator<CEnmMissile *> > > >::vector<std::vector

<CEnmMissile *,std::allocator<CEnmMissile *> >,std::allocator<std::vector<CEnmMissile *,std::allocator<CEnmMissile *> > > >' :
デバッグ情報で識別子が 255 文字に切り捨てられました。

d:\program files\microsoft visual studio\vc98\include\vector(60) : warning C4786:
'std::vector<std::vector<CEnmMissile *,std::allocator<CEnmMissile *> >,std::allocator<std::vector<CEnmMissile *,std::allocator<CEnmMissile *> > > >::~vector<std::vecto

r<CEnmMissile *,std::allocator<CEnmMissile *> >,std::allocator<std::vector<CEnmMissile *,std::allocator<CEnmMissile *> > > >' :
デバッグ情報で識別子が 255 文字に切り捨てられました。

539 名前:デフォルトの名無しさん :03/07/27 22:29
ああいつものやつね

540 名前:デフォルトの名無しさん :03/07/27 22:39
>>536
お前プログラマ向いてないよ。今すぐそのソース消してやめちまえ。
普通warning C4786でドキュメント見るか検索するだろ。

541 名前:536 :03/07/27 22:50
>>540
原因がわかりました。ありがとう。

542 名前:デフォルトの名無しさん :03/07/27 23:31
>>533
>なんの格好悪さも無い
格好悪いけどどうしようもない時はある。
(プログラムの終了処理をメッセージ出力しながらデバッグしている時は
std::cout などがもうデストラクトされてて printf 系を使うしかなかったりする)

あくまで補助、あくまで利便と互換性の為。

543 名前:デフォルトの名無しさん :03/07/28 01:00
BorlnadC++5.5で以下のようなコードをコンパイルすると
「push_backに一時変数を使っている」というような警告が出ます。
しかし、これは警告の方がおかしいのではないでしょうか?
仮想関数を持たないクラスなら、こんな警告はでません。
それとも、なんか勘違いしてるでしょうか。どなたかお願いします。

#include <iostream>
#include <vector>
using namespace std;
class Hoge{
public:
virtual void func() const = 0;
};
class SubHoge : public Hoge{
void func() const{};
};
int main(){
vector<Hoge*> v;
v.push_back(new SubHoge());
}

544 名前:デフォルトの名無しさん :03/07/28 01:22
push_back の引数の型は const T& だから、
テンポラリオブジェクトを渡すことは規格では可能
(例えば const int& に 4 とかを渡して構わない)。
この規格がいつ追加されたか分からないけど、
BC++ がこの規格に対応してないってことだけは確かみたいだね。

545 名前:デフォルトの名無しさん :03/07/28 01:50
警告だから対応してはいるだろ

546 名前:デフォルトの名無しさん :03/07/28 02:06
うーん。拡張機能として扱われてるのかな。
BC++ 5.5 は古いからなぁ。

547 名前:デフォルトの名無しさん :03/07/28 02:17
言い訳必死。

548 名前:デフォルトの名無しさん :03/07/28 02:23
一時変数を渡してるからじゃなくて(それはできる)、
暗黙に一時変数が作られてるっていう警告だよ。確か。

549 名前:デフォルトの名無しさん :03/07/28 21:36
>>548
>暗黙に一時変数が作られてるっていう警告だよ。確か。
よくわからんのだが、それは悪いことなの?

550 名前:デフォルトの名無しさん :03/07/28 21:53
>暗黙に一時変数が作られてるっていう
関数の値返しでは普通の方法。
通常bcc32でその警告は非const参照で一時変数を
参照する(標準規格外の利用)時に出るんだが
なぜそのプログラムでも出るのか不明

551 名前:デフォルトの名無しさん :03/07/28 21:53
コンパイラがしっかりしてれば問題ないはず。
これに警告を出すというのがちょいと気になるところではあるけど...
多分対応してくれてると思う。

552 名前:デフォルトの名無しさん :03/07/28 22:45
push_backにnew SubHogeの参照じゃなく、そのコピーの参照を渡してるみたいだナー
cl(VC7)もそう。gcc2.95はコピーを作らなかった。

553 名前:デフォルトの名無しさん :03/07/29 00:45
new SubHogeの結果はポインタだからコピーで問題ないのでは?良く分からんのだけど。

554 名前:デフォルトの名無しさん :03/07/29 00:55
いまさらだけど、>>543のプログラムをbcc32やったら、警告でますた。
不思議でつ。

555 名前:デフォルトの名無しさん :03/07/29 01:01
SubHoge* から Hoge* への変換で一時オブジェクトが発生。

556 名前:デフォルトの名無しさん :03/07/29 01:12
>>555
ビンゴ!
あんたは偉い!

しかし、文法的には、それでも間違いではないよねえ。
なんで警告出すんだろ。

557 名前:デフォルトの名無しさん :03/07/29 01:17
>>552
今、近くに環境がないんだけど、clでやるとうじゃうじゃ警告が出るのに、
IDEでやるとうそのように警告0になるってことない?
俺はSTLがらみでよく経験したような気がするんだが。

558 名前:デフォルトの名無しさん :03/07/29 01:23
>>555>>556
ふーん。そうなんだ。キャストじゃなくてポインタの一時オブジェクトなのか。・・・うーん。

559 名前:デフォルトの名無しさん :03/07/29 01:38
>>556
コンパイラが古いからじゃね?

560 名前:デフォルトの名無しさん :03/07/29 02:10
> これは,参照変数またはパラメータが,ユーザーの期待するものではなく,
> 一時変数を参照していることを意味する警告です。 ←BCBのヘルプ

おまいが渡したと思った変数の参照は、実は渡されて無いぞ!ってことかな。
仮に受け取った関数側でconst外してNULLとか代入しても(そんなことしないだろうけど)、
それはコピーだからコピー元は変更されてないぞと。

561 名前:デフォルトの名無しさん :03/07/29 05:10
コピー元はどうせ単なる値であって変数じゃないから
それで問題ないんだけどね。

562 名前:デフォルトの名無しさん :03/07/29 06:46
小4くらいのとき、マンコが穴だなんて思いもしなかった。
が、年の離れた兄貴のいる加戸は
「ヤッターマンコーヒーライター」
などという言葉を知っているいわば勇者的存在であった。
で、穴があることを知った俺たちだが、どうしてもそれが信じられない。
で、むしろ逆にガキであることを利用して調べようと思った。
ターゲットは音楽の教師である。美人だった。今にして思えば
20歳くらいだったのではないだろうか。短大出てすぐだったように思う。
実行はいたって単純。ガキ特有のカンチョーというあれである。
あれを前に突き刺すというのだ。
ガキなら許されるであろうという勝手な発想だが、
たしかにマンコすら知らない奴がほとんどだったからナイスな判断だったろう。
で、実行は加戸だった。
加戸はなんの躊躇もなくやった。
思い切り。
思い切ってやっちゃいかんだろ、と思った。なぜにおまえはフルパワーなのだ、と。
音楽教師は泣いた。20歳前後という年齢を考えればギャグでもきつい。
ガキからすれば大人だったのだが、今思うと娘だ。
むしろ、処女だった可能性すらある。すまん先生。
が、加戸も泣いていた。
両手人差し指骨折だった。第2関節より下で折れていた。
もろに刺さったんだと感心した。やはり勇者だ。
しかも、救急隊員に、マンコに指が刺さって折れましたと泣きながら事情を説明していた。
あの姿も相当かっこよかった   

563 名前:デフォルトの名無しさん :03/07/29 12:02
変数渡しても一時オブジェクト作られるけどね

564 名前:デフォルトの名無しさん :03/07/29 13:59
仮引数のことけ?

565 名前:デフォルトの名無しさん :03/07/29 14:09
SubHoge* a;
v.push_back(a);
としても、aの参照じゃなくて、aのコピーの参照が渡されるって話。

566 名前:デフォルトの名無しさん :03/07/29 14:35
別にコピーなんて作られんと思うが。

567 名前:デフォルトの名無しさん :03/07/29 15:10
作られてるよ

568 名前:デフォルトの名無しさん :03/07/29 16:00
SubHogeのコピーじゃなくてSubHoge*のコピーな。

569 名前:デフォルトの名無しさん :03/07/29 16:05
まあ、そいういうことが起こってるってのを頭の隅に入れておけばいいんじゃない >>543

570 名前:デフォルトの名無しさん :03/07/29 16:27
あ、やっと分かった。
コピーされるわ。

571 名前:デフォルトの名無しさん :03/07/29 18:53
コピーされるのは当然だが
なぜその警告が出るのかが分からない

572 名前:デフォルトの名無しさん :03/07/29 18:53
>>571
俺も

573 名前:デフォルトの名無しさん :03/07/29 19:02
当然なのか。gccはされないけど。

574 名前:デフォルトの名無しさん :03/07/29 19:13
gccは最適化か知らんが時々変わったことをするからな
rvalueをconst参照する時は一時変数が作られることになっている

575 名前:デフォルトの名無しさん :03/07/29 19:14
言葉のアヤかもしれんが、(だったらすまん)
>>565
>aの参照じゃなくて、aのコピーの参照が渡されるって話。
は、少し変だと思う。
SubHoge*であるaが直接、参照Hoge*&が渡されるか、
Hoge*にキャストされたものが渡されるんだよね。
(正直よくわからんのだが。)
キャストで内部的にコピーを作ることがあるのかもしれないが、
絶対コピーされるということはないんでは?


576 名前:575 :03/07/29 19:15
×参照Hoge*&が
○参照Hoge*&に

鬱。

577 名前:デフォルトの名無しさん :03/07/29 19:21
>>575
コンパイラ依存の挙動をここで語るべきではないと。

a = b;
のような代入ですらコンパイラによっては最適化で消滅してしまうのだから何も言えなくなってしまう。

578 名前:デフォルトの名無しさん :03/07/29 19:32
>>574
そうなんだ。ごめん。ちゅうことは、処理系依存じゃなくて規格で決まってるのか。
それじゃ確かに警告はおかしいね。

579 名前:575 :03/07/29 22:46
>>577
まあ、つまり、俺も
>コンパイラ依存の挙動をここで語るべきではないと。
と言いたかったんだが。
それで、「コピーされる」は規格にはないのでは?と。
(これは>>578と同じ趣旨かな?)

なんか難しくなりすぎたな。
>>543はどっか逝っちゃったか?

580 名前:543 :03/07/29 23:45
543です。みなさんありがとうございます。
でも、びびってちびりそうです。
>>543で書いた「仮想関数を持たないクラスなら」って大嘘でした。
継承関係がある場合、同じ症状がでるようです。すみません。
それと、VC7(コマンドではなく)でやったら、警告は出ないという
話を友人から聞きました。未確認ですが。

もうROMになります。

581 名前:デフォルトの名無しさん :03/07/30 00:13
例外を使わずに、失敗し得るオブジェクトの生成を行う方法にはどんなものがあるでしょうか?
さしあたって、Embedded C++ です。泣けます。

582 名前:デフォルトの名無しさん :03/07/30 00:15
くだらんレスですまんが、
>泣けます。
しみじみ。

ということで、誰か助けてやってくれ。

583 名前:581 :03/07/30 00:23
>>582
ありがとう。

Embedded C++ って、破綻してるような気がしてきた。
コンストラクタの失敗を伝える唯一の手段を削っておいて、
代替手段はどうするつもりなんだろう。

584 名前:デフォルトの名無しさん :03/07/30 00:32
class PossiblyFail {
 ...
public:
 static PossiblyFail* Create() {
  PossiblyFail* p = new PossiblyFail;
  if( FAILED == p->Init() ) { delete p; return 0; }
  return p;
 }
};

か、あるいは

class ShippaiSurukamo {
 ...
public:
 ShippaiSurukamo() {
  ...
  m_bSuccessFully_Constructed = 異常なし?true:false;
 }
 operator bool() const {
  return m_bSuccessFully_Constructed;
 }
}

として if( ShippaiSurukamo obj ) { ... } else { /*エラー処理*/ } か、
じゃないか?よくある手としては。

585 名前:デフォルトの名無しさん :03/07/30 00:56
>>580
C++のテンプレはよくは知らんので勘違いだったらすまんが、
引数渡しの方法がどうこうとか、push_back(arg)が引数の更に
コピーを登録しているとかなんて問題じゃなくて、543のコードは
実際不味いだろ。

 v.push_back(new Hoge());

の v.push_back()の引数にオブジェクトそのものじゃなくて、newで
生成したオブジェクトへのポインタを渡しているが、メイン側では
そのポインタをどの変数でも受けてないだろ。

コンパイラはポインタを渡している関数の素性や、その先でちゃ
んとpop、delete しているか迄は関知しないから、プログラム的に
は、参照が残るがどうか分からない行方不明候補のオブジェクト
が生成された事になる。

(要は、 new Hoge(); ってのを単体でやっているのと同じ状態)

だから、「本当にいいんかい、ワレ? テメェ、この関数はちゃんと
先で責任取っているんだろうな?」ってワーニング出しているんだよ。
ワーニング吐く吐かないは、単なるワーニングレベルオプションの
設定の違いかと思われ。

586 名前:デフォルトの名無しさん :03/07/30 00:59
>>585
その理屈だと new Hoge(); と書いたら同じ警告が出ることになるのかね?

587 名前:デフォルトの名無しさん :03/07/30 01:03
>>585
> ポインタをどの変数でも受けてないだろ。
vが受け取ってるだろ

588 名前:デフォルトの名無しさん :03/07/30 01:43
もっともらしくデタラメぶっこくなや

589 名前:デフォルトの名無しさん :03/07/30 07:14
>>585
申し訳ないが、でたらめかと。

590 名前:デフォルトの名無しさん :03/07/30 09:30
>>585
ん?これでたらめじゃない?

591 名前:デフォルトの名無しさん :03/07/30 10:33
>>585
おっとこいつぁでたらめだ。

592 名前:hina ◆IqUyIbTXck :03/07/30 18:00
sprintfのバグ発見してしまいました。
__int64型の数字を%dで二つ入力すると二つ目の数が0になります。
char buf[32];
__int64 iTest1 = 30000, iTest2 = 20000;
sprintf(buf, "%d\t%d\t\n", iTest1, iTest2);

ちなみに環境はVC++.NET

593 名前:hina ◆IqUyIbTXck :03/07/30 18:00
age

594 名前:デフォルトの名無しさん :03/07/30 18:08
>>592
intが4バイトなら当然かと。
一番目の%dでiTest1の4バイト分をintとして表示し、二番目の%dで残りの4バイト分をintとして表示するんだから。

595 名前:デフォルトの名無しさん :03/07/30 18:08
%d指定しといて何言ってんの
sprintf(buf, "%I64d, %I64d", iTest1, iTest2);

596 名前:594 :03/07/30 18:12
「表示」はしてないか。

597 名前:hina :03/07/30 18:15
やはりそうだったんですか。
釣りではないんですが、intの他にdoubleぐらいしか指定できなかったもので・・。
この場合はdoubleを指定すればいいんでしょうか

598 名前:デフォルトの名無しさん :03/07/30 18:15
いるよね、592みたいな奴。
自分でミスっといてコンパイラやライブラリのせいにする奴。

599 名前:デフォルトの名無しさん :03/07/30 18:17
>>597
はぁ?変換指定子のことか?
それなら595が%I64dと書いているだろ。__int64も含め移植性は低いが。

600 名前:hina :03/07/30 18:19
>>599
あっすみません。
しかし、VSのヘルプにはI64なんて載ってないよ(;´Д`)

601 名前:デフォルトの名無しさん :03/07/30 18:22
>>600
バージョンは?
VS.NETのヘルプには書いてあります。

602 名前:hina :03/07/30 18:26
printf 関数の型フィールド文字
↑ここみてました

603 名前:デフォルトの名無しさん :03/07/30 18:28
コンパイラのせいにした挙句ヘルプにも載ってないとほざく

604 名前:デフォルトの名無しさん :03/07/30 20:08
* printf 関数と wprintf 関数の書式指定フィールド
http://www.microsoft.com/japan/msdn/library/ja/vclib/html/_crt_format_specification_fields_.2d_.printf_and_wprintf_functions.asp?frame=true

605 名前:デフォルトの名無しさん :03/07/30 20:37
C++でクラス(仮にAとします)のstaticメンバの初期化は
Aのグローバルなインスタンスのコンストラクタよりも先に呼ばれることは
保証されているんでしょうか?↓こんな感じです。

class A{
  static int m_val;
public:
  A(){/*m_valを参照するようなコンストラクタ。m_valが初期化されている必要あり。*/}
};

int A::m_val = 0;//スタティックメンバの初期化

A a;//グローバルインスタンス

int main()
{
  //処理
}

一応、上のコードでテストしたらうまくいっているようなのですが、本当にいつでもうまく行くか
よく分かりません。
教えてくださいスゴイ人!


606 名前:デフォルトの名無しさん :03/07/30 21:00
>>543

#define STRICT
#include <windows.h>
#include <vector>

class nurupo : public IUnknown
{
public:
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID, void **);
ULONG STDMETHODCALLTYPE AddRef();
ULONG STDMETHODCALLTYPE Release();
};

std::vector<IUnknown*> mona;

HRESULT fucktory()
{
mona.push_back(new nurupo);
return S_OK; // ( ´_ゝ`)< ふーん
}


607 名前:デフォルトの名無しさん :03/07/30 23:26
>>605
グローバル変数&関数外のスタティック変数は忘れれ。
仕様としてあるだけでどっちも使い物にならん。
スタティック関数を使ってシングルトンにしな。

608 名前:デフォルトの名無しさん :03/07/30 23:38
シングルトンをマルチスレッド対応するのは
結局どうするのが正しい(安全)んだろ?


609 名前:デフォルトの名無しさん :03/07/30 23:40
アクセスしない

610 名前:デフォルトの名無しさん :03/07/30 23:41
>>608
インスタンス生成でちゃんとロックしとけばええんでないの?

611 名前:581 :03/07/31 00:03
>>584
ありがとう。

コンストラクタの失敗に関する問題を中心に話し合った結果、
Embedded C++ しか使えないのであれば、むしろ C のほうがマシという結論に至りました。

ぐぐって見つけた↓のような個人的な見解は的を得ていると思う。
「彼らは『実装するのが難しい』という判断に基づいて勝手な制限を提唱している」
ttp://gcc.gnu.org/ml/gcc/1998-12/msg00984.htmlより、意訳)

仕様を決めたのは誰だろうと見てみれば、これ、日本の企業が主導してたんだな・・・

612 名前:デフォルトの名無しさん :03/07/31 00:03
CPUクロック周波数と、メモリ搭載量、システムリソースの残量、IPアドレスの取得をしたいのですが、どうすればいいでつか?

613 名前:デフォルトの名無しさん :03/07/31 00:09
>>612
環境に依存するのでココで聞いても無駄

614 名前:デフォルトの名無しさん :03/07/31 00:22
×的を得る
○的を射る
○当を得る

615 名前:デフォルトの名無しさん :03/07/31 00:25
>>611
Embedded C++ とやらがどんなもんかはよー分からんが、
C でできることは C++ でできるんだから
わざわざ C にすることはないんじゃないの?

616 名前:デフォルトの名無しさん :03/07/31 00:26
>>614
> 文例
> この作品に対する彼の批評は的を得たものとはとうてい言いがたい.
> I really must say that his criticism of this work is wide of the mark.
> New College Japanese-English Dictionary, 4th edition (C) Kenkyusha Ltd. 1933,1995,1998

時代の流れです

617 名前:デフォルトの名無しさん :03/07/31 00:29
第4版でそれか...。

618 名前:デフォルトの名無しさん :03/07/31 00:43
>>616
その辞書だけだろ。

619 名前:581 :03/07/31 00:48
>>614
あぃ、すんません。
>>615
基本的には、C++のフル仕様から以下のものを削除したものになります。
mutable・例外・実行時型情報・template・namespace・
多重継承・仮想継承・C++スタイルキャスト・
wchat_t・long double・ファイル操作・ロケール

C++プログラムとして相当中途半端なソースにならざるを得ないのです。
特に痛いのは、例外・templateですね。
これが有るのと無いのとでは根本的なソースの書き方が違ってしまいます。

うーん、それでも、たしかにC++のほうがいい場合も十分多くありますねぇ。

620 名前:デフォルトの名無しさん :03/07/31 00:54
>>611
なんだか悲惨そうな話ですね。

組み込み系ってよく知らないんですが、
普通のC++を使うという選択もあるんですか?
>>611を見ただけで、EC++嫌って気がしてきたので。

621 名前:デフォルトの名無しさん :03/07/31 01:18
>>619
C から削られた機能がないなら EC++ でいいんじゃない?
C++ として中途半端だろうが、C より組みにくいってことはないやろ。
参照、inline 関数、クラス、bool 。
これがあれば EC++ にも十分アドバンテージあるんじゃない?

例外は昔ながらの goto + bool でいい。
どうしようもなく面倒になる場合は exit してしまったんでいいし。
template はマクロを駆使するか、使わないでなんとかするか、
どうしようもない場合は自前でソースをコンバートするか。

昔は「template は将来のために予約されています」とかヘルプに書いてあったもんじゃー。
Turbo C++ 1.0 ...懐かしい。

622 名前:605 :03/07/31 02:00
>>607-610 サンクス

とりあえず、グローバル変数はやめにして実装し直すことにします。

623 名前:デフォルトの名無しさん :03/07/31 09:40
弓道をイメージすれば、「的を得る」のおかしさは自明。

624 名前:デフォルトの名無しさん :03/07/31 11:47
あんた、よくクドイって言われるだろ。

625 名前:デフォルトの名無しさん :03/07/31 12:25
>>624
涙目ですね。
でもそれだけ悔しい思いをすればもう間違いませんよね?

626 名前:デフォルトの名無しさん :03/07/31 14:21
え?弓道って優勝者への景品として的が持ち帰れるのとちごたん?

627 名前:デフォルトの名無しさん :03/07/31 14:38
このスレはいつから会社でウザがられてるウンチクおやじの
ストレス発散場になりましたか?

628 名前:デフォルトの名無しさん :03/07/31 20:02
一般常識レベルの日本語能力もないんじゃなあ。
「的を射る」は就職試験とかでも頻出してるのに。

629 名前:デフォルトの名無しさん :03/07/31 20:23
みなさんC++の基礎を覚えるのにどれくらいかかりました?
SDKやMFCじゃなくて初心者本で良くあるdos窓のプログラムです。

630 名前:デフォルトの名無しさん :03/07/31 20:31
operatorから仮想関数が呼べるようになるまで3ヶ月だったかな...
TCPLの初版で。

631 名前:デフォルトの名無しさん :03/07/31 20:34
>>623-628
オマエラこのスレ的にゼンゼン的を得ない発言だな
言葉として知っていても意味を知らない馬鹿ドモハケーン

>>629
基礎がいったいドコまでを指すのかわかんね



632 名前:デフォルトの名無しさん :03/07/31 21:32
exportが実装できるぐらいまでが基礎とか(無茶)

633 名前:デフォルトの名無しさん :03/07/31 21:57
的を得るはあるよ。意味は「射る」とは別だけどね。

634 名前:デフォルトの名無しさん :03/07/31 22:12
get a target

635 名前:デフォルトの名無しさん :03/07/31 22:17
肉壷げっちゅ〜

636 名前:デフォルトの名無しさん :03/07/31 22:23
バグを得る

637 名前:デフォルトの名無しさん :03/07/31 22:32
的を得るは的を射るや当を得るの間違いから生まれたという説が多いが、俺はそうは思わない。
というのも、的を得るからは的を射るとは異なったニュアンスを受けるからだ。
的を射るは要点をずばり突いているという感じだが、的を得るは要点を正しく把握したうえで発言しているという印象を受ける。
つまり誤用ではなく、異なった意味を持つ造語だ。
この場合の「得る」は要領を得るの「得る」と共通するものがあると思う。

638 名前:デフォルトの名無しさん :03/07/31 22:34
必死だな

639 名前:デフォルトの名無しさん :03/07/31 22:47
「的を得る」は弓道から派生してきてないよ。
「景品をならべておき、それを鉄砲で撃ち、当たったら景品をお持ち帰り」
の、テキ屋からきている。
 この、「鉄砲のタマを当てようとする景品」は「的」に他ならず、
「景品にタマが当たったら、お持ち帰り」なのだから、それは
「的を得る」と表すより他にない。
 意味としては、「UFOキャッチャーで品物を巧くGetできて
うれしいね」という状態を表す。

640 名前:デフォルトの名無しさん :03/07/31 23:09
>>639
的を射ると同じ意味で使ってるのはおかしいと言ってるんだYO!!
つーかそろそろスレ違いだからやめようぜ。言葉は進化する厨が出てくるし。

641 名前:デフォルトの名無しさん :03/07/31 23:31
>>639
UFOキャッチャーに的は有りません。

642 名前:デフォルトの名無しさん :03/07/31 23:39
>640
同じ意味で使っているとどうして分かる?
>641
あるわけねーだろが。比喩なんだからよ。

643 名前:デフォルトの名無しさん :03/07/31 23:39
>>641
ならラッキーショットだ。

644 名前:デフォルトの名無しさん :03/07/31 23:40
>>640
>つーかそろそろスレ違いだからやめようぜ。言葉は進化する厨が出てくるし。

そろそろじゃねーよ馬鹿、てめー自分が再燃さしといて何抜かしてやがる、死ねキチガイ

645 名前:640 :03/07/31 23:44
>>644
正直すまんかった。

んじゃやめよう(´・ω・`)ションボリック

646 名前:デフォルトの名無しさん :03/07/31 23:45
頭が悪い奴はすぐキレる

647 名前:デフォルトの名無しさん :03/08/01 00:45
おまいらC++の話してくださいよ

648 名前:581 :03/08/01 00:46
>>621
たしかに言語機能の面だけで比較すればC++に移行するほうがいいです。
でも、現在の環境に特有のデメリット・導入コスト(ここらへんは詳しく説明するつもりはありません)
をあわせて天秤にかけた結果、Cのままでいくことになったわけです。

そして、みなさま、ごめんなさいでした。

649 名前:デフォルトの名無しさん :03/08/01 00:51
ぶっちゃけtemplateがなかったらC++は廃れてた気がするよ。

650 名前:デフォルトの名無しさん :03/08/01 00:54
>>648
まぁ、そういうことならしゃーないわな。

651 名前:デフォルトの名無しさん :03/08/01 01:05
>>649
同意。もしtemplateが無かったら俺はC++を支持してない。
JavaやC#の方を支持してるだろうな。

ただ、Cよりかは遥かにマシ。

652 名前:デフォルトの名無しさん :03/08/01 01:21
C++ と Java/C# は
ネイティブコンパイラがメインか否かという大きな違いがあるので、
一概に比べることはできんと思うが、
純粋な言語仕様的にというなら分かる気もする。
C# は魅力的なところも多いけど、
template(generic)が無かったのには落胆した。
generic を追加するという話は聞いたことあるけど、どうなることやら...。

653 名前:スカトロ初心者 :03/08/01 01:25
C++について最近勉強を始めたごくごく初心者です。
今ひとつポインタについて理解することができません。
そこで、動的オブジェクトの割り当てとその開放について質問させてください。

int *t;
t = new int;*t=1;
t = new int;*t=2;
t = new int;*t=3;

上記のようにして動的オブジェクトを3回割り当てた場合、
ポインタtは一番最後のアドレス(値3が格納されたメモリ)のみ記憶しています。
この状態で、
質問1:
値1や値2の格納されたメモリエリアに簡単にアクセスする方法はありますか?
(言い換えれば、値1や値2のポインタを取得する方法はありますか?)
質問2:
delete t;では値3の格納されたエリアしか開放できません。
値1や値2の格納されたメモリを開放する簡単な方法はありますか?
質問3:
ポインタを使ったポピュラーなデータ構造として「リンクリスト」がありますが、
このデータ構造は上記のプログラムと本質的に同じ部分があると思われます。
つまり、リストの各要素を格納しているメモリエリアに固有の識別名が与えられていません。
(例えば、配列なら、a[0],a[1],a[2]・・・のように、それぞれのメモリエリアの識別ができます)
リストのn番目の要素のポインタや値を簡単に取得する方法はありますか?
また、リスト全体を簡単にdeleteする方法はありますか?

これらの質問の真意は、
確保したメモリについてプログラマはどこまで責任を持たなければならないのか?ということです。
質問2が不可能だとすると、このようなプログラムは「書いても文法上エラーにはならない」が、
やがてはメモリ不足でエラーを起こす「書いてはいけない」プログラムだということになりますよね?
よろしくお願いします。m(__)m

654 名前:デフォルトの名無しさん :03/08/01 01:29
>>653
メモリリークという言葉を知っている?

655 名前:デフォルトの名無しさん :03/08/01 01:29
回答1:ない
回答2:ない
回答3:ない

656 名前:デフォルトの名無しさん :03/08/01 01:32
>>653
std::vectorを使いなさい

657 名前:スカトロ初心者 :03/08/01 01:32
>>654
えぇ、意味は知っています。
要するに、これはメモリリークを起こすプログラム例だということですね?
こういうプログラムは書いちゃいけない、と。

>>655
ひゃっほう。
ってことは、リンクリストを削除する場合、
ここの要素をひとつずつたどりながらdeleteしていくしかないわけですか・・・かっふん。

658 名前:スカトロ初心者 :03/08/01 01:36
>>656
現在はまだ初心者なのでその言葉の意味がわかりませんが、
頭の隅にとどめておきます。ありがとうございました。m(__)m

659 名前:デフォルトの名無しさん :03/08/01 01:36
>>653
名前が...まぁいいけど。

回答1:
ない。1 や 2 の格納されたアドレスを保持していた変数 t は
新しいアドレスで書き換えられてしまったので、
1 や 2 の格納されたアドレスにアクセスする手段は失われてしまった。
アクセスしたいなら、そのアドレスを保持するポインタ変数を作るべし。

回答2:
ない。従って、1 や 2 の格納されたメモリエリアはプログラム終了まで永遠に開放されない。
これをメモリリークといって、厄介なバグのうちの1つである。
少量なら気づかないが、ずっとプログラムを実行しておくと溜まり溜まって
メモリを圧迫してしまうなんてこともある。
バグがあることに気づきにくいってところが厄介なわけね。

回答3:
n 番目の要素を得るには、順番に n 回辿っていかなくてはならない。
リスト全体を delete するには、普通に巡回して delete していけばいい。

回答4:(最後の話に対して)
プログラマはきちんとメモリを管理しなくてはならない。
それが面倒な場合、スマートポインタというのを使うことができる。
標準では auto_ptr 、別のライブラリには boost::shared_ptr とかある。
これでも使用法に注意する必要があって、
完全に気にしなくて良いという状態にはならない。

660 名前:デフォルトの名無しさん :03/08/01 01:37
一般的な双方向リンクリストならstd::listを使え。

661 名前:デフォルトの名無しさん :03/08/01 01:40
C++はCほどじゃないがメモリに関する注意(リークだけじゃなく)は怠るなってことだな。

662 名前:デフォルトの名無しさん :03/08/01 01:41
回答2は、「ある」だよ。ガベコレ使えばいいんでないか。
簡単かどうかは、ま、何ともいえないけどサ、、

663 名前:スカトロ初心者 :03/08/01 01:44
>>659
詳細にありがとうございます。

BASICから入ったせいでしょうか、
そもそも値の保持されている領域になんの名前もついていないことが
今ひとつしっくりこなくて・・・。
回答4に関してはまだ理解できませんが、覚えておきます。
深夜にどうもありがとうございました。

>>660
はい、これも記憶しておきます。
ありがとうございました。

664 名前:デフォルトの名無しさん :03/08/01 01:46
>>662
よく見ろ。
> この状態で、


665 名前:デフォルトの名無しさん :03/08/01 01:47
std::vector    動的配列
std::list      双方向リスト
std::deque    .双方向キュー。配列とリストを融合したようなもの(要素の追加が楽な配列のようなもの)
std::queue    キュー(std::priority_queue というのもある)
std::stack    .スタック
std::set      高速探索可能なコンテナ(std::multiset というのもある)
std::map     .連想配列(std::multimap というのもある)
std::hash_set  ハッシュ表+set
std::hash_map .ハッシュ表+map

666 名前:デフォルトの名無しさん :03/08/01 01:47
ガベコレはふつー、newを乗っ取る。

667 名前:デフォルトの名無しさん :03/08/01 02:05
>>666
よく見ろ。
> 簡単な方法

668 名前:デフォルトの名無しさん :03/08/01 02:10
>>649
うむ

669 名前:デフォルトの名無しさん :03/08/01 02:34
こんなコードを見ました。
enum col{red, black, white};
int a[3];
a[red] = 0;
a[black] = 0;
a[while] = 0;
これはまちがってないのでしょうか。
それならどういう意味なのでしょうか。

670 名前:デフォルトの名無しさん :03/08/01 02:37
a[0] = 0;
a[1] = 0;
a[2] = 0;

671 名前:デフォルトの名無しさん :03/08/01 02:40
>>670
教科書でenumの定義を見ました。
確かにそんな感じですが、ほんとうにいいんでしょうか?
なんかenumと整数は違うとも書いてあるんです。

672 名前:デフォルトの名無しさん :03/08/01 02:44
心配なら
enum col{red=0, black=1, white=2};
とすればいい

673 名前:デフォルトの名無しさん :03/08/01 02:44
>>671
enum の普通の使い方だけど。

enum col{ red, black, white, col_size };
int a[col_size];
a[red] = 0;
a[black] = 0;
a[white] = 0;

のように、サイズを enum で定義するテクニックもある。
まぁ、列挙子としては不正な値を1つ増やしてしまうというデメリットもあるけど。

674 名前:669 == 671 :03/08/01 02:49
>>670 >>672 >>673
なんとなく、なっとくいきました。
ありがとうございます。

675 名前:デフォルトの名無しさん :03/08/01 02:53
>>674
その調子でガンガレ。

676 名前:デフォルトの名無しさん :03/08/01 03:08
いつもこうしちゃう、小心なオレ
enum col{red=0, black, white};

677 名前:デフォルトの名無しさん :03/08/01 03:29
>>676
兄貴と呼ばせてください。

678 名前:デフォルトの名無しさん :03/08/01 03:32
>>653
struct IntList{
  int i;
  IntList * prev;
  IntList * next;
};
IntList * pstart=new IntList;
pstart->i=0;
pstart->next=NULL
pstart->prev=NULL;
pstart->next=new IntList;
pstart->next->prev=pstart;
pstart->next->next=NULL;
pstart->i=1;
pstart->next->next=new IntList;
pstart->next->next->prev=pstart->next;
pstart->next->next->next=NULL;
pstart->next->next->i=2;
for(IntList p=pstart;p!=NULL;p=p->next){
  std::cout << p->i << std::endl;
}{
  IntList p;
  for(p=pstart;p!=NULL;p=p->next){
    delete p->prev;
  }
  delete p;
}
手抜きだがこんな感じでポインタ使わないと簡単には実現できないようなものを作ってみるとポインタの理解が深まるかもね
使うだけならstd::listを使うけど
追記:bad_allocとかの例外を考えると素直にスマートポインター使いましょう。


679 名前:デフォルトの名無しさん :03/08/01 04:11
配列を関数に渡すだけでポインタ使うんだけどね。

680 名前:デフォルトの名無しさん :03/08/01 04:24
参照で渡せる

681 名前:デフォルトの名無しさん :03/08/01 04:57
>>680
固定長か vector ならね...。

682 名前:デフォルトの名無しさん :03/08/01 05:03
可変長の配列などC++にはない。

683 名前:デフォルトの名無しさん :03/08/01 05:16
>>682
渡せる配列のサイズが固定という意味で言ったのだが...。

684 名前:デフォルトの名無しさん :03/08/01 05:27
可変固定とは別に静的に対する動的な配列はnew構文の中だけに
存在するが、配列長が実行時に決まる場合、可変な型が存在しない以上
これをポインタ以外で受け取る方法はない。
結局、サイズが固定でない配列はない。

685 名前:デフォルトの名無しさん :03/08/01 06:05
new int[10]はint(&)[10]を返して、参照(又はポインタ先)に
限って動的型を許すのは出来ないのかね。
int (&a)[n]=new int[n];//動的配列への参照
int *a=new int[n];//標準変換によって合法
それで配列でないnewも参照を返す方がエレガントだ。
int &i=new int;
int *p=&new int;

686 名前:デフォルトの名無しさん :03/08/01 06:35
見た目は綺麗だけど、多分不便。

687 名前:デフォルトの名無しさん :03/08/01 07:14
>>681
#include <iostream>
template <int size>
void func(int (&buf)[size]){
    for(int i=0;i<size;i++){
        std::cout << buf[i] << std::endl;
    }
}
int main(){
    int buf[]={0,1,2,3,4,5,6,7,8,9};
    func(buf);
    return 0;
}
templateスレだと既出っぽ


688 名前:デフォルトの名無しさん :03/08/01 10:28
まあ、同じことだが、

void func (int buf, int size) {
for (int i = 0; i < size; ++i) {
std::cout << buf[i] << std::endl;
}
}

template <int size>
void func(int (&buf)[size]){
func(buf, size);
}


689 名前:デフォルトの名無しさん :03/08/01 10:32
>>688
どうせなら template のほうには inline の指定をしとけ。

690 名前:デフォルトの名無しさん :03/08/01 11:06
stringをincludeしていないのにstrlenが使えるんですがなぜなんでしょうか?
やさしいC++という本にはインクルードしなければいけないと書いてありました。
環境はVC.NET2003です。

691 名前:デフォルトの名無しさん :03/08/01 11:09
>>690
Cとしてコンパイルしているだろう?

692 名前:デフォルトの名無しさん :03/08/01 11:54
>>689
そういう話をしているんじゃないだろ。

693 名前:デフォルトの名無しさん :03/08/01 12:12
>>692
だから「どうせなら」からレスが始まってるんだろ。

694 名前:690 :03/08/01 13:20
ソースファイルの拡張子はcppなのでC++だとおもいますが、、
Cとしてコンパイルとはどういうことでしょうか?

695 名前:デフォルトの名無しさん :03/08/01 13:33
>>693
>>688等はinlineぐらい知ってるだろ。
今回の話に関係ないから敢えて言及していないんだろうが。
それを何が偉そうに「しとけ」だ。
ようやく自分の知識が生かせると思って意気揚揚とレスしたのか。おめでてーな。

696 名前:デフォルトの名無しさん :03/08/01 13:43
>>694
C++としてコンパイルしてても、別のヘッダ経由で間接的にインクルードしてるかも

697 名前:デフォルトの名無しさん :03/08/01 14:00
>>690
cstringかstring.hをインクルードしているから

698 名前:デフォルトの名無しさん :03/08/01 17:22
>>695
なにこの人キレてんの?

699 名前:690=694 :03/08/01 17:33
プロジェクトのフォルダの中にはcppファイルが一つと
空のコンソロールプロジェクトを作成した時に自動で作られたファイルだけです。
*.hのファイルはありません。
インクルードしているのはiostreamだけです。
#include <iostream>
using namespace std;
でこの後にmain()関数を書いています。

700 名前:デフォルトの名無しさん :03/08/01 17:34
C++で\nとendlはどう使い分けるんですか?

701 名前:デフォルトの名無しさん :03/08/01 17:39
>>700
endl は改行+フラッシュ。


702 名前:デフォルトの名無しさん :03/08/01 17:45
>>699
じゃあiostreamが中でインクルードしてるんだろ

703 名前:デフォルトの名無しさん :03/08/01 19:10
コンストラクターで変数(char* name )を(Null、1Byte)初期化したい。
この場合
A::A()
:name( 0 )
{

}
で良いのでしょうか?



704 名前:デフォルトの名無しさん :03/08/01 19:47
>>703
1byteってのが謎だ

705 名前:デフォルトの名無しさん :03/08/01 20:00
>コンストラクターで変数(char* name )を(Null、1Byte)初期化したい
失礼しましたNullをセットするときになんとなく
口癖でNULL1Byte(=(Null、1Byte))と言ってしまうので。


706 名前:デフォルトの名無しさん :03/08/01 20:10
>>705
やっぱり意味わからんが。
NULLポインタは1バイトということはないはずだが。
null文字1バイトを指すポインタということなら 0 ではなく "" と書かねばいかんが
まさかそういう話?

707 名前:デフォルトの名無しさん :03/08/01 20:16
このスレは703の口癖NULL1Byte(=(Null、1Byte))をはやらすスレに
なりますた。

一応突っ込んどくが…
ポインタは1バイトじゃないぞ。
ついでに1バイトのNULLは '\x00'。

708 名前:デフォルトの名無しさん :03/08/01 20:24
>>707
NULLと大文字で書いた場合はポインタ。
'\0'はヌル文字であって、ポインタではないわけだが

709 名前:デフォルトの名無しさん :03/08/01 20:33
>>708
707の言うNULL(ラテン語)と708の言うNULL(識別子)がかみ合ってないだけと思う。

710 名前:デフォルトの名無しさん :03/08/01 20:36
>>708はCプログラマ。プ

711 名前:デフォルトの名無しさん :03/08/01 20:45
>>708
NULLも\0も0だろ

712 名前:( ● ´ ー ` ● ) :03/08/01 20:55
707必(ry

713 名前:デフォルトの名無しさん :03/08/01 20:58
> ポインタは1バイトじゃないぞ。

そうなの?

714 名前:デフォルトの名無しさん :03/08/01 21:00
>>713はJava厨もしくはDel厨、C#厨による
スレが荒れることを狙ったネタレスです。放置してください。

715 名前:デフォルトの名無しさん :03/08/01 22:00
クラスのメンバ変数をコンストラクタで初期化する方法で質問です。

例えば

Hoge::Hoge(int a, int b)
{
aa = a;
bb = b;
}

これを、

Hoge::Hoge(int a, int b)
:aa(a), bb(b)
{}

この様に書けると聞いたんですけど、

Hoge::Hoge(int a, int b)
{
rect.ra = a;
rect.rb = b;
}

この様に構造体を初期化したいときはどうすれば良いんでしょうか?


716 名前:デフォルトの名無しさん :03/08/01 22:07
Hoge::Hoge(int a, int b) : rect(a, b) {}

717 名前:715 :03/08/01 22:25
>>716
レスありがとうございます。

そのやり方でやってみたんですけど、(構造体のメンバの数が4個なので、引数を4個渡しました)
こんなエラーがでてしまいました。

error C2661: 'tagRECT::tagRECT' : 4 個の引数を持つオーバーロードされた関数はありません。

何でだろう?

718 名前:デフォルトの名無しさん :03/08/01 22:34
NULL(ポインタ)とNUL('\0')は区別しよう。

719 名前:デフォルトの名無しさん :03/08/01 22:41
>>718
脳内語を他人に強制するなよ

720 名前:デフォルトの名無しさん :03/08/01 22:47
>>717
tagRECT構造体に4 個の引数を持つオーバーロードされたコンストラクタがないからだろ。
もしVC++でRECT構造体使ってるならCRectクラスに変更すれ。

721 名前:デフォルトの名無しさん :03/08/01 22:55
>719
NUL SOH STX ETX EOT ENQ ACK BEL BS HT NL VT FF CR SO SI
DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US

NULは使わなくてもBS,CR,LF,ESCなら使ったことあるだろ。


722 名前:デフォルトの名無しさん :03/08/01 22:56
NULはNULLの略語じゃん

723 名前:デフォルトの名無しさん :03/08/01 22:59
用語辞典にも載っている用例を脳内といわれても、困るんだが、、
http://www.atmarkit.co.jp/icd/root/67/130299067.html
>また、文字コード場合はNULと表記される

724 名前:デフォルトの名無しさん :03/08/01 23:01
MSDNは'\0'のことを普通にNULLと呼んでるぞ
まったく不毛だからその辺でやめとけ

725 名前:715 :03/08/01 23:02
>>720
解りましたありがとうございました。

726 名前:デフォルトの名無しさん :03/08/01 23:09
だめぢゃん。MSDN

727 名前:デフォルトの名無しさん :03/08/01 23:13
NUL is a null character っていうのならOKだけど。
小文字のnullは一般名詞。


728 名前:デフォルトの名無しさん :03/08/01 23:18
>724
普通に NULL と呼んでいないと思うぞ。
terminating null character というときの null は NULL じゃない。


729 名前:デフォルトの名無しさん :03/08/01 23:18
>>724
よくみろ。NULLじゃなくてNULL文字だ。

730 名前:デフォルトの名無しさん :03/08/01 23:19
さすがじゃん。MSDN

731 名前:デフォルトの名無しさん :03/08/01 23:20
>>714
いやまじで聞いているんだが。
1バイトなんて環境は滅多にないだろうが、規格でもそう決まっているのかと。

732 名前:デフォルトの名無しさん :03/08/01 23:23
>>714は知ったかぶりをしたアフォです。放置してください。

733 名前:デフォルトの名無しさん :03/08/01 23:29
NULLポインタはポインタだ。
NULL文字は文字だ。

さてなぜNULLはポインタであると断言できよう。

734 名前:デフォルトの名無しさん :03/08/01 23:32
>>733
ガッ

735 名前:デフォルトの名無しさん :03/08/01 23:32
NULLという定数は整数
NULLポインタはポインタ(当たり前だが)

736 名前:デフォルトの名無しさん :03/08/01 23:33
Cでは、
#define NULL (void*)0
だったから、Cの文脈では明らかにポインタだった。
C++では
#define NULL 0
となったが、
char *p = (void*)0;
がエラーになるから (void*)0 を 0 にしただけで、
気持ちの上ではCのNULLとなんら変わるところはない。

CのNULLがポインタである以上C++のNULLもポインタである。


737 名前:デフォルトの名無しさん :03/08/01 23:34
>>687
固定長の関数を関数テンプレートでいくつも作ってるだけじゃん。
inline ならともかく、inline じゃなかったら無駄に関数が大量に作られる可能性があるぜ。

>>695
ということを言いたいんだと思われ。

738 名前:デフォルトの名無しさん :03/08/01 23:36
>>736はCプログラマ。プ

739 名前:デフォルトの名無しさん :03/08/01 23:36
for(int i=NULL;i<10;i++)

740 名前:デフォルトの名無しさん :03/08/01 23:38
>>738
ウワァァァン

741 名前:デフォルトの名無しさん :03/08/01 23:38
void foo(char*);
void foo(int);
void foo(char);

foo(NULL);

NULLはint


742 名前:デフォルトの名無しさん :03/08/01 23:39
>>731
JIS X3010 5.2.4.2.1
および
JIS X3010 6.3.4
を参照されたし

規格票を所有すべきであると進言する

743 名前:デフォルトの名無しさん :03/08/01 23:40
NULLは単にマクロを意味する大文字なだけで、元のnullはゼロという意味で、C++ではNULLが0なのだから。

str[end] = NULL;
とするのも、意味論的に間違いではないと思う。

俺はしないけどさ。


ってゆーか
>>741それ悲惨すぎるw

744 名前:742 :03/08/01 23:40
ISO/IEC14882
だった

逝ってきます

745 名前:デフォルトの名無しさん :03/08/01 23:41
>>742
JISか。CみたいにPDFを落とせるかもしれないから探してみよう。

746 名前:745 :03/08/01 23:42
JISの3010ってCじゃん ウワァァァン

747 名前:デフォルトの名無しさん :03/08/01 23:52
なんだこのぬるぬるしたスレは!

748 名前:デフォルトの名無しさん :03/08/01 23:58
>>747
ガッ

749 名前:デフォルトの名無しさん :03/08/01 23:59
>>747>>747>>747
ガッガッガッ

750 名前:714 :03/08/02 00:37
案の定荒れますた。


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