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


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

C++相談室 part38
251 名前:デフォルトの名無しさん :04/12/09 20:13:21
たかが宣伝のためのリップサービスをまともに受け取っている馬鹿がいる。
RubyはPerlと全く関係がない。作者自身がそれを明言している。

252 名前:デフォルトの名無しさん :04/12/09 20:57:20
ここが C++ スレだということを忘れそうになる惨状だな……

253 名前:マイク ◆yrBrqfF1Ew :04/12/09 21:57:19
>>240
使い分ける必要はないな。
好きな言語を作る自由があるから沢山言語があるだけだ。

254 名前:デフォルトの名無しさん :04/12/09 23:57:14
Rubyが大好きだということはわかったから、連投はやめれ

255 名前:デフォルトの名無しさん :04/12/10 00:02:17
C++がRubyよりはるかに劣った存在であるということもご理解いただけましたか?

256 名前:デフォルトの名無しさん :04/12/10 00:10:56
Ruby使ってるとキチガイになるということがよく分かった。

257 名前:デフォルトの名無しさん :04/12/10 00:17:45
matz氏がイカレポンチであると再認識した

258 名前:デフォルトの名無しさん :04/12/10 00:52:42
JISX3014が閲覧可能。日本語版のANSI/ISO14882:2003のようなもんだな。
http://www.jisc.go.jp/app/pager?id=120287

259 名前:デフォルトの名無しさん :04/12/10 00:54:31
げっ、こいつ一丁前にreferrer見てやがる。
トップページから、JIS検索→X3014とやって見てくれ。
http://www.jisc.go.jp/

260 名前:デフォルトの名無しさん :04/12/10 01:07:32
JISのPDFは画像データだから検索が出来ないんだよな…

261 名前:デフォルトの名無しさん :04/12/10 01:08:23
>>260
できないね。糞だわ。でもタダだし一応取っておいて損はない鴨。

262 名前:デフォルトの名無しさん :04/12/10 05:30:46
その点ドキュメントの充実しているRubyとは違うね。

263 名前:デフォルトの名無しさん :04/12/10 09:40:01
質問です。

何らかのタイプ設定をenumでセットするクラスがあるとすると、通常はこういう構成になると思います。

class Hoge{
public:
  enum TYPE {A,B,C};
  Set(TYPE type);
private:
  TYPE type_;
};

Hoge hoge; hoge.Set(Hoge::A); hoge.Set(Hoge::B); hoge.Set(Hoge::C);

Setを呼び出すたびにHoge::という修飾が必要なのがわずらわしいので、
以下のように名前空間を利用できないだろうかと考えています。
なお、名前空間名は必ずクラス名をすべて大文字にしたもの、で統一するつもりです。

namespace HOGE { enum TYPE {A,B,C}; }
class Hoge{
public:
  Set(HOGE::TYPE type);
private:
  HOGE::TYPE type_;
};

using namespace HOGE; Hoge hoge; hoge.Set(A); hoge.Set(B); hoge.Set(C);

クラス利用者がusingディレクティブによって必要に応じて冗長な修飾を
削れるため、後者のほうが、優れた手法だと思っています。
なにか見落としている欠点などありますでしょうか?

264 名前:デフォルトの名無しさん :04/12/10 11:02:15
>>263
他の同じようなクラスで、enum TYPE {A, B, C};のようなことができない。
例えば、class Hageでも同じようなenumがあったとして、
名前空間を使わなければhoge.Set(Hoge::A) と hage.Set(Hage::A) で使い分けられる。
名前がぶつからないようにHageの方ではAを使わないようにするくらいなら、
初めからenumをclass内に閉じ込める必要ないと思う。

265 名前:デフォルトの名無しさん :04/12/10 11:06:03
class Hoge{
public:
    SetHogeA();
    SetHogeB();
    SetHogeC();
};
にしとけば利用者の手間は一番減る

266 名前:デフォルトの名無しさん :04/12/10 11:14:27
>>264
>名前空間を使わなければhoge.Set(Hoge::A) と hage.Set(Hage::A) で使い分けられる。
名前空間を使っても使い分けられるよ


267 名前:デフォルトの名無しさん :04/12/10 11:44:32
template<class Foo>
class Hoge {...}
という場合、Hoge は「テンプレート クラス」ですが、
Foo はなんと呼べばよいでしょうか?

268 名前:デフォルトの名無しさん :04/12/10 11:51:17
>>267
テンプレート引数。
実際に渡される実引数と区別するなら仮引数。
intなどの非型引数と区別するなら型引数。

ちなみに、Hogeは規格中の言葉の「クラステンプレート」のほうをお勧めしたい。

269 名前:263 :04/12/10 11:56:30
>>264
すでに>>266さんが指摘されてますが、名前空間でもその点は問題ありません。
ちなみにEfffective C++の28項に解説してあります。

>>265
なるほど、つまりこうですね。

class Hoge{
public:
  void SetTypeA(void){Set(A);}
  void SetTypeB(void){Set(B);}
  void SetTypeC(void){Set(C);}
protected:
  enum TYPE {A,B,C};
  Set(TYPE type);
private:
  TYPE type_;
};

インラインだから余計なコストもおそらくないし、全部クラス内に収まってるし、
enumの範囲チェックも不要になるしで、どうもこれがベストの手法に思えます。
ありがとうございました。

>>267
ついでの横レスですが、
×テンプレートクラス
○クラステンプレート
だったはずですよ。

270 名前:デフォルトの名無しさん :04/12/10 13:27:02
>>258
前まで売ってたやつですか?
次回からテンプレ追加ですね。しかし混んでいるのか落とせねぇ

271 名前:デフォルトの名無しさん :04/12/10 13:35:55
常に定数しか引数にしないのか?

272 名前:デフォルトの名無しさん :04/12/10 13:37:40
float型やdouble型に対する
% 演算子的な標準関数または手法ってあるんでしょうか?

なければ作るまでですが、自分で変なの拵えるよりはと。

273 名前:デフォルトの名無しさん :04/12/10 13:40:48
fmod

274 名前:デフォルトの名無しさん :04/12/10 13:42:45
>>273
即レスありがとうございました。助かりました。

275 名前:267 :04/12/10 14:00:02
>>268 >>269 ありがとうございます。
クラス テンプレート、テンプレート引数、ですか。

あともう一つ呼び名が分からないのですが、
クラス テンプレートのテンプレート引数として指定するクラスの
シグニチャのことを何と呼ぶのでしょうか?

たとえば、
template<class Junk, class Food>
class JunkFood {...};

となっていて、Junk と Food には、
ある種のプロトタイプのメンバ関数が必ず必要とします。
このような場合、私はダミークラスを定義しているのですが、

// 実装のないシグニチャだけのクラス
class JunkTempl {
void Weight(void);
double Value(void);
};

このような JunkTempl を一般になんと呼ぶのでしょうか?

276 名前:デフォルトの名無しさん :04/12/10 14:03:07
インターフェースクラス

277 名前:デフォルトの名無しさん :04/12/10 14:05:01
クラスインターフェースか(´・ω・`)
しかも微妙に違ってるorz

278 名前:ネムー :04/12/10 15:36:26
forループの中に、計算データを保存するプログラムを書いて、
10ループ毎に計算データを保存するというような事はできるんでしょうか?

ファイル名をループ毎に自動で指定させる事ができなくて困っています。
bccを使っています。
わかる方教えてください。よろしくお願いします。

279 名前:デフォルトの名無しさん :04/12/10 15:37:56
>>278
std::stringstream

280 名前:デフォルトの名無しさん :04/12/10 15:41:19
>>278
単なる一例ですが。

#include <iostream>
#include <sstream>
#include <string>

int main()
{
for (int i = 0; i < 100; i++)
if ((i % 10) == 0) {
std::string s;
std::stringstream str(s);

str << "filename" << i / 10;
std::cout << str.str() << std::endl;
}
}

281 名前:デフォルトの名無しさん :04/12/10 21:10:37
>>261
思いっきりナメられてるな
OCR 書ける香具師はこんなの見ねえってさw

282 名前:デフォルトの名無しさん :04/12/11 00:53:02
ウインドウモードの時、指定した画面サイズ(W,H)から周りの枠線やタイトルバーを除いた幅と高さはどうやって求めればいいのですか?


283 名前:デフォルトの名無しさん :04/12/11 01:01:01
スレ違い

284 名前:282 :04/12/11 01:56:40
ん?C++スレの質問ですよね?
間違っていないと思うんですが、一体どこで質問しろとorz

285 名前:デフォルトの名無しさん :04/12/11 02:00:04
ウィンドウ(GUI)が出てくる時点で標準C++の規格外。
WindowsならAPIスレなりMFCスレに逝くべし。

286 名前:デフォルトの名無しさん :04/12/11 02:01:17
>>284
このスレは機種に依存しない話題だけをメインに扱っている。
多分Win32APIかどこかで聞いた方がいい。

287 名前:デフォルトの名無しさん :04/12/11 02:06:51
どこが適切な場所かわからないなら環境依存OKスレで聞いとけ。

288 名前:デフォルトの名無しさん :04/12/11 02:11:44
それを言うならこっちだろ
http://pc5.2ch.net/test/read.cgi/tech/1100963189/

289 名前:282 :04/12/11 02:16:38
そうなんですか、知らなかった・・・ソウイウダイジナコトハテンプレニイレテテクダサイヨorz
VBでは領域を調べることができるのでC(++)でもできるのかと思ってました。
>>288
なんかこれもスレ違いな気がするけど行ってきます(´`)>

290 名前:デフォルトの名無しさん :04/12/11 02:20:27
iteratorを扱う関数って、NULLチェックとend()チェックしないとダメなの?
void f(T::iterator i) { 
  if (i && i->ptr) { 
    x = i->ptr->data; 
  } 

もっと簡単にできる?


291 名前:デフォルトの名無しさん :04/12/11 02:21:27
C++はマイクロソフトの商品名じゃねぇぞ。アフォ。

292 名前:デフォルトの名無しさん :04/12/11 02:22:20
まちがえた。
void f(T::iterator i) { 
  if (i && i != c.end() {
    x = i->data; 
  } 



293 名前:デフォルトの名無しさん :04/12/11 02:29:36
このスレでたまに初心者を煽ってる人いるんだが、
本来、C++プログラマってあんまり劣等感に満ち溢れた奴って少ないだろ?
会社などでも比較的優秀な人材をC/C++に配属するしさ。

でありながら、>>291のように誹謗の機会をうかがう哀れな負け組がこのスレにくるのは何故だろう・・・?
会社の研修でC/C++をやらされたが会社側に事実上のダメ出しされたために屈折してしまった馬鹿が
Cプログラマを装ってスレを荒らしているのではないか?

私の知ってるCプログラマは、皆、温厚で忍耐強いがなぁ。
私は、短気なCプログラマに出会ったことがない。

294 名前:デフォルトの名無しさん :04/12/11 02:30:41
iteratorの有効性なんぞ呼び出し側に保証させとけ

295 名前:デフォルトの名無しさん :04/12/11 02:35:13
Dプログラマだから

296 名前:デフォルトの名無しさん :04/12/11 02:40:12
Dプログラマは所詮お遊び。仕事には使えない。

297 名前:270 :04/12/11 02:45:29
クッキー切ってたorz

298 名前:デフォルトの名無しさん :04/12/11 02:45:57
GNU次第

299 名前:デフォルトの名無しさん :04/12/11 08:59:34
>>293
>私の知ってるCプログラマは、皆、温厚で忍耐強いがなぁ。

お前はそいつらの何を知ってる?全部を知り尽くしてるのか?
表で温厚で忍耐強くがんばってる分、抑圧されたストレスも他の人より多いだろう。

300 名前:デフォルトの名無しさん :04/12/11 09:05:18
つうかそもそも >>282 のことぐらいググるなり、MSDN検索するなりして自分で調べろ、と思うんだが。

301 名前:デフォルトの名無しさん :04/12/11 14:36:39
>>299
> 表で温厚で忍耐強くがんばってる分、抑圧されたストレスも他の人より多いだろう。
お前はそいつらの何を知ってる?全部を知り尽くしてるのか?

302 名前:デフォルトの名無しさん :04/12/11 15:55:18
ostringstream o("aaa");

o << "bbb";
cout << o.str() << endl;

これを実行するとbbbとしか表示されないのですが
正しい挙動ですか?
aaabbbと表示されるのを期待していたのですが。

303 名前:デフォルトの名無しさん :04/12/11 16:02:37
>>258
これローカルに落とせないの?

304 名前:デフォルトの名無しさん :04/12/11 16:18:18
>>302
std::ostringstreamのコンストラクタは std:string を引数に取る。

従って、

std::ostringstrem o("aaa"); は、
std::ostingstream(std::string("ooo")); と同じ。

以降はこの一時stringオブジェクトに対して操作が行われる。
そして、最初の出力を実行した時、書き込みポインタはバッファの
先頭にあるため、"aaa"が"bbb"で上書きされる。

もし期待通りの結果を得たければ、先に o.seekp(3); としておかなければならない。

305 名前:デフォルトの名無しさん :04/12/11 16:19:43
>>303
大きな声では言えないが、Temporary Internet Filesの中にあるはず。
これ以上は自分で考えろ。

306 名前:デフォルトの名無しさん :04/12/11 16:29:15
>>304
ありがとうございました。
o.seekp(3);を挟んだらaaabbbと表示されました。

本にo << "aaa" << "bbb";を、>>303のように書くこともできる
と書いてあったので困惑してました。

307 名前:デフォルトの名無しさん :04/12/11 16:33:47
>>306
ちなみに、それ、何て本?

308 名前:デフォルトの名無しさん :04/12/11 16:36:08
>>307
プログラミング言語C++第3版です

309 名前:デフォルトの名無しさん :04/12/11 16:37:03
>>304
std::stringstreamが取るのはconst std::string&だろ?

310 名前:デフォルトの名無しさん :04/12/11 16:41:57
つか日本語訳なんていらんだろ

311 名前:デフォルトの名無しさん :04/12/11 16:43:45
>>308
何章かな?
>>309
確かにそうだね。という事は バッファの中身をいじっても元の std::stringは
不変である事を保証しているのかな?謎だ・・・・

312 名前:デフォルトの名無しさん :04/12/11 16:47:54
スマソ。>>304には間違いがありました。

std::stringstreamは独自の内部バッファを持ち、コンストラクタに取った
std::stringの中身は内部バッファにコピーされるんでした。だから
const std::string& なんだね。

しかし、書き込み/読み取りポインタがバッファの先頭にある事は変わり
ないので、書き込んだり読み取ったりすると、先頭から行われるのは
変わらない。

313 名前:デフォルトの名無しさん :04/12/11 16:49:22
>>311
21.5.3の文字列ストリームの732ページ
>>280で知って、使ってみようとちょっと読んだだけなので
自分が間違ってるかも。

314 名前:デフォルトの名無しさん :04/12/11 16:51:14
>>313
今読んでみたが、>>306のような事は書いてない。
ま、文字列ストリームは普通のファイルストリームと似たような感覚で
扱えばいいんじゃない?

315 名前:デフォルトの名無しさん :04/12/11 17:02:23
今日本語訳の方ではなく、元の方のerrataを見たら
ostringstream o("aaa",ios_base::ate);
こんな風に直されてました。

316 名前:デフォルトの名無しさん :04/12/11 17:05:41
>>315
それなら分かる。std::ios_base::ateは、ファイルを開いた後にファイルの最後に
移動するオープンモードフラグだから。

317 名前:デフォルトの名無しさん :04/12/11 17:11:17
>>299,301
Cプログラマに外向的な性格の人は少ないでしょ。
ストレスを他者への攻撃に転化するタイプは少ないように思う。
ただし、あくまで人数が多い少ないの話であって2chを訪れる人の中には、
Cプログラマの適性がないにもかかわらず、
Cをやってるorやらされてる、迷惑な人が少ないながらもいるんだろう。

C/C++は古い言語ということもあって新しい言語よりも理不尽。
その理不尽さに耐えるだけの適性がないと、辛いわな。

318 名前:デフォルトの名無しさん :04/12/11 17:33:41
>>303,305
>大きな声では言えないが、Temporary Internet Filesの中にあるはず。
>これ以上は自分で考えろ。
大きな声で言えないも何もkonquerorだと開くか保存するかを聞いて来るのだけど
これってローカルに入れちゃダメなの?


319 名前:デフォルトの名無しさん :04/12/11 17:50:31
言語で性格がくくれると思っている人は、星座占いとか好きそうだな

320 名前:318 :04/12/11 18:04:50
>>319
私は、星座占いや血液型占いは全く信じないし、
TVの朝のニュース番組で占いが出てくると即、チャンネルを変える。
朝のバタバタした時間帯に占いを流すTV局が増えたのは実に情けないことだと思っている。
非科学的な分野が市民権を得ていることが情けない。

公共の電波は落書き帖じゃねーんだ。そういうことは毒電波専門チャンネルで流せ、な?(AA略)
と、心の中でツッコミを入れている次第である。

321 名前:デフォルトの名無しさん :04/12/11 18:16:50
このコードを強引にコンパイルする方法はありますか?

struct Object
{
    static void static_hoge() {};
};
void Hoge()
{
    Object.static_hoge(); // この2行は、
    Object object; // 一切変更できない
}

例えば、
typedef Object* ObjectPtr;
const Object& Object = *((ObjectPtr)0);
をグローバル宣言することでstatic_funcの呼び出しは解決しますが、
型名と変数名が衝突してしまいます。

目的はパズル的な事なので意味はありません。

322 名前:デフォルトの名無しさん :04/12/11 18:19:32
よくわからん。出直せ。

323 名前:デフォルトの名無しさん :04/12/11 18:27:05
>>332
Object::static_hoge();
ではなく
Object.static_hoge();
でアクセスできないかという意味です

324 名前:デフォルトの名無しさん :04/12/11 19:08:21
txtファイルに文字をうって
そのあと、そのファイルに文字を追加入力するには
どうすればいいのでしょう?
読み込んだ配列に配列を足すでは無理みたいで

325 名前:デフォルトの名無しさん :04/12/11 19:20:43
>>323
staticメンバ変数はインスタンス無しで呼び出せるが、後者の書式は
インスタンスを必要とするので、何でもいいからObject型のオブジェクトを
作成すればいいのでは。

326 名前:デフォルトの名無しさん :04/12/11 19:33:39
>>325
Object.static_hoge();の部分は変更できませんので、
インスタンス名がObjectでないといけません。
そうするとObject objectの部分で型名と衝突し、
通常はコンパイルエラーが出ると思います。

また、適当なインスタンスを作成するよりは、
325の通りNULL参照を使う方が低コストかと考えました。

327 名前:デフォルトの名無しさん :04/12/11 19:41:25
つまり、JavaなりDelなりからC++に移って
記法が気に入らないから、合わせる方法はないか探しているということですね。

328 名前:デフォルトの名無しさん :04/12/11 19:53:56
>>327
そんなところです。
気に入らないわけではありませんが
同じコードが動けば楽かと思いまして。

329 名前:デフォルトの名無しさん :04/12/11 20:03:00
無理なものは無理

330 名前:デフォルトの名無しさん :04/12/11 20:05:38
プリプロセッサでも通せ

331 名前:デフォルトの名無しさん :04/12/11 20:34:21
namespaceで囲えばいいんでは?

namespace Hoge {
 struct Object {
  static void func() { cout << "Nurupo" << endl; }
 };
}

typedef Hoge::Object *ObjectPtr;
const Hoge::Object& Object = *((ObjectPtr)0);

Object.func();

332 名前:デフォルトの名無しさん :04/12/11 20:55:30
>>331
この2行をクリアしたいのですが、無理ではないでしょうか
Object.func();
Object obj;

スレ違いな気もしますので、これ以上はやめておきます。
失礼しました。

333 名前:デフォルトの名無しさん :04/12/11 21:22:07
郷に入れば郷に従え

334 名前:デフォルトの名無しさん :04/12/11 21:29:03
>>332
cppで。

#define Object instance
Object.func();
#undef Object
#define Objec className
Object obj;

335 名前:デフォルトの名無しさん :04/12/12 11:58:12
インデックス値が、小さい方から大きい方へ順番に入っている
配列やリストを指す言葉ってありますか?大きい方から小さい方でも構いません。

336 名前:335 :04/12/12 12:00:25
これじゃ意味不明だ。
ええとインデックス値というのは、ユーザ定義の序列みたいなものでお願いします。

どうでも良いといえば良いのですが、こういう概念を一言で表せると考えやすいので…。

337 名前:デフォルトの名無しさん :04/12/12 12:03:38
もしかして昇順、降順のことか?

338 名前:デフォルトの名無しさん :04/12/12 12:31:06
>>337
ありがとうございます
昇順リスト、昇順配列と呼ぶことにします

339 名前:303 :04/12/12 14:30:21
>>305
いや、ここで聞く前にそこ探したんだけど
イメージが見つからなかったのよ… とほほ

340 名前:デフォルトの名無しさん :04/12/12 14:50:26
>>339
Cygwinでも入れてfindで探すとか。

341 名前:デフォルトの名無しさん :04/12/12 14:54:37
Operaで開こうとすると「保存しますか?」と出て保存できるのは内緒だ

342 名前:デフォルトの名無しさん :04/12/12 15:12:24
C99のときは再インストール後、Acrobat Readerをインストールする前にそこへ行ってきて、
お馴染み、ファイルのダウンロードのダイアログから堂々と保存しました。

今回はTemporary 〜 から引っぱってきたけどね。

343 名前:デフォルトの名無しさん :04/12/12 15:19:19
>>339
画面にPDF開いた状態で探さないと閉じたら消されるとかかもしれん。
画面に出したまま探してみ。拡張子PDFで。

344 名前:デフォルトの名無しさん :04/12/12 16:07:40
>>339
C:\Documents and Settings\XXXXXXX\Local Settings\Temp\
にPDFのtmpファイルがあったのでリネームでOKだったxp。

345 名前:339 :04/12/12 17:05:37
>>340-344
みんなアリガト

ExplorerだとTemporary Internet Filesの下のContent.IE5とかが見えなかったんだけど
Cygwinでfind . -name '*.pdf'したら一発で見つかったよ

これローカルに落としてもAcrobatのメニューが使えないのね…

346 名前:デフォルトの名無しさん :04/12/12 17:27:31
>>345
画像データだから。
それからExplorerだと隠しフォルダ属性を取らないと見つからないかもね。

347 名前:デフォルトの名無しさん :04/12/12 18:21:14
コンテナからeraseするときは、iteratorを後置インクリメントすると良いと習ったのですが

for (iterator = container.begin(); it != container.end();){
    if (条件が合えば){
        container.erase( iterator++ );
//     iterator = container.erase( iterator );
    }
    else {
        ++iterator;
    }
}

これだとcontainerがvectorなどだと、最後尾のコンテナを削除したとき
エラーが出てしまいます(コメントアウトした方のやり方だと大丈夫)。
私が習ったやり方はあまり良い物では無いのでしょうか。

348 名前:デフォルトの名無しさん :04/12/12 18:26:45
>>347
Effective STL 嫁
削除系関数はイテレータを無効化するので
container.erase( iterator )
では iterator が無効化されてしまう

349 名前:デフォルトの名無しさん :04/12/12 18:27:40
>>347
>私が習ったやり方はあまり良い物では無いのでしょうか。
その通り。

350 名前:348 :04/12/12 18:28:31
あ、スルーしてくり

351 名前:デフォルトの名無しさん :04/12/12 18:29:28
>>347
オマエ、もしかして早合点のクセないか?
そんなことを教えるわけがなさそう

352 名前:デフォルトの名無しさん :04/12/12 18:31:09
>>348-349
listとかだと上手くいくので、私が何か勘違いしているのかと不安でした。
今後はコメントアウトした方で行きます。Effective STLも求めてみます。
レスありがとうございました。

353 名前:デフォルトの名無しさん :04/12/12 18:41:17
>>352
「習った」とあるが、本当にそう教わったのなら教えた香具師が馬鹿。
教えた香具師が信頼できるのなら教わった藻前が早合点している。

354 名前:デフォルトの名無しさん :04/12/12 18:49:41
標準シーケンスコンテナではeraseの戻り値、
標準連想コンテナではのようにするってことじゃないの?

355 名前:デフォルトの名無しさん :04/12/12 22:02:51
基本的なことなんですけど、文字色はどうやったらかえれますか、
できたら教えてください。

356 名前:デフォルトの名無しさん :04/12/12 22:04:00
>>355
ちっとも基本的なことじゃないから安心しろ。
http://www.kumei.ne.jp/c_lang/intro/no_58.htm

357 名前:デフォルトの名無しさん :04/12/12 22:04:25
できないので教えられない

358 名前:デフォルトの名無しさん :04/12/12 22:04:52
なるほど、ありがとうございます

359 名前:デフォルトの名無しさん :04/12/13 00:03:23
wmpの視覚エフェクトを自分で作っているのですが、
現在再生中のファイル名と
再生した経過時間を取得するにはどうすればいいでしょうか。。

板違いだと思うのですが、どこで聞いてよいか分からなくて、、、
どなたかご教授ください。

360 名前:デフォルトの名無しさん :04/12/13 00:50:00
http://pc5.2ch.net/test/read.cgi/tech/1101393155/

361 名前:359 :04/12/13 00:57:53
誘導ありがとうございます。

362 名前:デフォルトの名無しさん :04/12/13 11:27:29
以下のようなコード(ただしhoge_tはPODではない)で、クラスA,Bの
コンストラクタ起動時は変数a,bのコンストラクタ起動前なのに
a,bへのポインタを使っていますが、これはC++の規格的にOKですか?

#include<iostream>
class Base {
protected:
  hoge_t a b, *ptr;
  Base( hoge_t *p ) : a(), b(), ptr( p )
  { a= ...; b= ...; } //aとbの初期化処理
public:
  const hoge_t get(void) { return *ptr; }
};
class A : public Base {
public:
  A(void) : Base( &a ) {}
};
class B : public Base {
public:
  B(void) : Base( &b ) {}
};
int main(void){
  A a;
  B b;
  std::cout<< a.get()<< "\n";
  std::cout<< b.get()<< "\n";
  return 0;
}


363 名前:デフォルトの名無しさん :04/12/13 21:25:44
フラグを使うときにintなら
int f_hoge=0;
f_hoge = 1 - f_hoge;
みたいに出来ますが、
このフラグをboolでやるとすると
どのようになりますか?

364 名前:デフォルトの名無しさん :04/12/13 21:30:55
>>363
bool fHoge = false;
fHoge = !fHoge;

365 名前:デフォルトの名無しさん :04/12/13 21:32:04
>>362
hoge_tってどこから出てきた?

366 名前:デフォルトの名無しさん :04/12/13 22:15:46
>>362
それは結局「以下が可能か?」という問いに帰着されるような気がする
struct hoge_t {};
struct Base {
hoge_t a, *ptr;
Base() : ptr( &a ), a() {}
};

gccだと362は(typoを適当に直して)-Wallでも警告なしでコンパイルされるのに対して
上の例は警告が出る
規格だとどうなんでしょうね?


367 名前:デフォルトの名無しさん :04/12/13 22:22:07
>>362
struct hoge_t {};
class Base {
protected:
hoge_t a, b, *ptr;
Base() : a(), b(), ptr(0) {}
};
class A : public Base {
public:
A(void) : Base() {ptr = &a;}
};
class B : public Base {
public:
B(void) : Base() {ptr = &b;}
};
だと規格上確実だと思うけどダメかい?


368 名前:デフォルトの名無しさん :04/12/13 22:32:59
>>366
派生クラスの構築は、基底クラスのコンストラクタが呼び出されてから
メンバ、派生クラスの順に初期化されるから大丈夫じゃね?

gcc3.4.2で-Wallにしてみたが警告は出ない。

369 名前:デフォルトの名無しさん :04/12/13 22:35:56
>>367
あーそっか。aとbがまだ初期化されてないうちに使うとまずいね。

370 名前:デフォルトの名無しさん :04/12/14 01:43:18
皆さん回答ありがとうございます。
>365
hoge_tは実際にはテンプレートを使ったクラスです。
>366
そのコードでは、aへのポインタを得るタイミングが>362より若干遅い気がします。
>367
最初はそのコードと同様にしてたのですが、それだと
・ptrをNULLで初期化してから派生クラスでもう一度設定しなおすという回りく
 どい処理になる
・派生クラスでptrの設定をしなくてもコンパイルできてしまう(実行時まで派生
 クラスでのptr設定忘れに気が付けない)
ので>362でコードを書いて、Win2KPro,cygwin1.5.9,gcc3.3.1という環境でコン
パイルは通るのですが、未初期化の変数へのポインタを使うことがC++の規格と
して正しいのか気になって質問しました。
私はなんとなくCの不完全型へのポインタと似た感じを受けるので規格違反して
いないと思っています。


371 名前:362 :04/12/14 01:44:10
失礼しました。>370は私の書き込みです。

372 名前:デフォルトの名無しさん :04/12/14 01:51:48
>>370
未初期化の変数へのポインタが使えないと、自己参照型クラスは
作れなくなるぞ。

373 名前:デフォルトの名無しさん :04/12/14 01:56:34
>>370
もし hoge_t::operator&() があると、ctor の前にこれ呼ばれる?

374 名前:デフォルトの名無しさん :04/12/14 02:00:01
>373
それは完全にundefined behavior

375 名前:デフォルトの名無しさん :04/12/14 13:56:45
C++はC99と後方互換が無いんですか?

376 名前:デフォルトの名無しさん :04/12/14 14:02:22
>>375
後方互換の話ならC99スレを立ててそこで議論してくれ。
もちろん後方互換ではないけど。

377 名前:デフォルトの名無しさん :04/12/14 14:34:52
後方互換とはなんだと調べようとしたらIMEのやつ広報5巻って出してくる。
ワラッテサキヘススメン。

378 名前:デフォルトの名無しさん :04/12/14 18:22:11
% [ttt.cpp] %%%%%%%%%
#include <stdio.h>
class SampClass {
public:
SampClass();
~SampClass();
private:
void memFunc000(void);
};
typedef struct tagSampStruct {
struct {
SampClass aaa;
};
} SampStruct;
int
main(int argc, char **argv)
{
printf("Hello\n");
}
%%%%%%%%%%
というコードをgccでコンパイルすると、
> ttt.cpp:14: error: member SampClass tagSampStruct::<anonymous struct>::aaa'
> with constructor not allowed in anonymous aggregate
> ttt.cpp:14: error: member SampClass tagSampStruct::<anonymous struct>::aaa'
> with destructor not allowed in anonymous aggregate
というエラーが発生しますが、VC++ではエラーが発生しません。
VC++でも同様のエラー(ワーニングでも可)を発生させたいのですが
そのようなことは可能でしょうか?
ご教示おねがいいたします。


379 名前:デフォルトの名無しさん :04/12/14 20:06:08
教えて下さい!
参照って何 具体的な使用例とか、詳しいサンプルとかほしいなぁ
お勧めのホームページとか、あったら教えて欲しいし
お願いしますね

380 名前:デフォルトの名無しさん :04/12/14 20:09:14
>>379
詳しくはC++Primerをお読みください。

381 名前:デフォルトの名無しさん :04/12/14 20:10:45
>>378
警告レベルをW4にすると
warning C4201: 非標準の拡張機能が使用されています : 無名の構造体または共用体です。
と出てくれる

382 名前:デフォルトの名無しさん :04/12/14 20:15:52
>>380
ありがとうございます。
でも ごめんなさい・・・C++Primerって何処にあるんですか???


383 名前:デフォルトの名無しさん :04/12/14 20:16:22
本屋

384 名前:デフォルトの名無しさん :04/12/14 20:18:49
本屋さんですか?(泣)
C++Primerって本なんですか?困ったな

385 名前:デフォルトの名無しさん :04/12/14 20:26:08
>>384
初心者にありがちなのですが、初心者だから初めはWEBページでちょっと勉強してから、
というような人が多いようです。
しかし、誰か得体もしれぬ人が作ったようなWEBページは多くの場合、説明が不適切・
不親切であったり、まとまりにかけていたり、そうでなかったとしてもごく一部の
話題しか取り扱わなかったりして、とても読みにくいものです。
また、解かりやすい解説を捜し当てるのにかかる手間がかかるでしょう。
もし、許されるならば書籍を購入された方がはるかに有意義だと思いますよ。

386 名前:デフォルトの名無しさん :04/12/14 20:27:40
>>385
> また、解かりやすい解説を捜し当てるのにかかる手間がかかるでしょう。
訂正:また、解かりやすい解説を探し当てるのにわりと手間がかかるでしょう。

387 名前:デフォルトの名無しさん :04/12/14 21:26:44
C++Primerってヘンーナ日本語訳しているよね。
デリファレンスとか、インデクスとか。

388 名前:デフォルトの名無しさん :04/12/14 22:05:02
一見親切にも見えるWebページは情報が不正確だったり
最悪うその垂れ流しだったり、うのみにしてはいけない。
その判断が自分で出来ないなら書籍を買う方が良い。
ただし、書籍にも糞本はいっぱいあるから気を付けれ。

389 名前:デフォルトの名無しさん :04/12/14 22:17:13
糞本の代表
ttp://www.amazon.co.jp/exec/obidos/ASIN/4839912025/qid=1103030113/sr=1-43/ref=sr_1_2_43/249-3354889-3141955

390 名前:デフォルトの名無しさん :04/12/14 22:26:59
レビューがすごいな

391 名前:デフォルトの名無しさん :04/12/14 22:28:53
>>379
まずは、禿本だな
それでわからんかったとこを方々調べて解読

俺自身、そうやって憶えた
当時の禿本は初版だったが・・・

392 名前:デフォルトの名無しさん :04/12/14 22:30:39
>>389
俺もだまされたうちの一人

393 名前:デフォルトの名無しさん :04/12/14 23:23:58
>>389 にくらべればこっちの方が100倍マシ
ttp://www.amazon.co.jp/exec/obidos/ASIN/4798008532/


394 名前:デフォルトの名無しさん :04/12/14 23:39:26
>>389
レビュー禿ワラタ

395 名前:デフォルトの名無しさん :04/12/14 23:40:21
立ち読みで判りそうなことばかり・・・ アフォかこいつら

396 名前:デフォルトの名無しさん :04/12/14 23:52:14
>>395
買わなくてもコメント出来るから君もすれば?

397 名前:デフォルトの名無しさん :04/12/15 00:25:45
構造体って必要ですか?
全部クラスに統一した方がスッキリすると思うんだけど。

398 名前:デフォルトの名無しさん :04/12/15 00:30:30
>>397
そもそもC++の構造体はクラスと大差ない。

399 名前:デフォルトの名無しさん :04/12/15 00:34:12
>>398
っていうかデフォルトの可視性以外全部一緒

400 名前:デフォルトの名無しさん :04/12/15 00:39:47
つーか、classのデフォルトもpublicでいいだろ。特に基底クラス

401 名前:デフォルトの名無しさん :04/12/15 00:39:51
>>399
機能としてはそうですよね。
言語仕様を無駄に煩雑にしてる気がするんですが、
クラスを使わず構造体を使う方が適切なケースってあります?

402 名前:デフォルトの名無しさん :04/12/15 00:40:56
Cからの遺産

403 名前:デフォルトの名無しさん :04/12/15 00:42:35
POD使いたい時

404 名前:デフォルトの名無しさん :04/12/15 00:46:43
>>400
だよな。デフォルトがprivateだからついついメンバ変数を先に書いちゃったりする。
普通に考えたらインターフェースであるpublicメンバ変数が上に来てるほうが良いってことは明らかなのに。

405 名前:404 :04/12/15 00:48:19
>publicメンバ変数
publicメンバ関数


406 名前:デフォルトの名無しさん :04/12/15 00:48:49
C++FAQには短いプログラムを書くときにこの方が便利だからと
書いてあったが、やっぱ public が上にある方がいいよな

407 名前:デフォルトの名無しさん :04/12/15 01:01:19
>>406
その場合structで書けばいい。
関数オブジェクトはよくstructで書く。

408 名前:デフォルトの名無しさん :04/12/15 01:03:11
>>406
class いらねーよな
テンプレには typename だし

409 名前:デフォルトの名無しさん :04/12/15 02:29:05
C++自体がいらない

410 名前:デフォルトの名無しさん :04/12/15 02:41:20
>>409
んなこたぁーない。

411 名前:デフォルトの名無しさん :04/12/15 03:05:42
構造体がアラインされてないとパフォーマンスが大きく低下するって聞いたのですが、何故こうなるんですか?

412 名前:デフォルトの名無しさん :04/12/15 03:10:08
>>411
CPUによる。CPUによってはアラインされていないとバスエラーを起こして
そもそも動かないものもある。

413 名前:デフォルトの名無しさん :04/12/15 03:55:11
32bitのデータを32bit境界から開始しておけばそのまま32bitで取り出せるが
8bit境界で適当に開始されていると24bit+8bitとか16bit+16bitとか分離して
読み込んだあと結合しないといけないから。

414 名前:デフォルトの名無しさん :04/12/15 09:05:10
>>413
器用で、寧ろ余計なお世話なCPUだな。普通のCPUはそんなことしない。

415 名前:デフォルトの名無しさん :04/12/15 09:32:15
>>414
かつて "普通" だった CPU はしっかりやっていたが・・・

416 名前:デフォルトの名無しさん :04/12/15 09:49:53
余計なお世話というより、互換性のためにしょうがなくやってるって感じか。

417 名前:デフォルトの名無しさん :04/12/15 10:03:50
組込み系だといまだにそれが普通なんじゃないの?


418 名前:デフォルトの名無しさん :04/12/15 10:58:01
alignmentがいい加減でもパフォーマンスが落ちるか落ちないか
っていうのはRAM側の問題じゃないの?

419 名前:デフォルトの名無しさん :04/12/15 11:05:35
>>418
DSPなんかだと、RAMというよりコアの問題だと思う。
C++の話題じゃないけど(w

420 名前:デフォルトの名無しさん :04/12/15 11:12:08
>>418
dynamic phase alignment をサポートしてるかどうかってことでいいの?
スレ違いだけど >>411 の疑問は解消しなければ

421 名前:デフォルトの名無しさん :04/12/15 11:15:02
RAMとは関係ないんじゃないの?
メモリ空間にマッピングされるのってRAMだけとは
限らないわけだし。(例えばレジスタとか)

422 名前:デフォルトの名無しさん :04/12/15 11:21:22
構造体のメンバーへのアクセスってメモリの先頭からのオフセットだよね?
mallocとかnewとかで確保した領域にアクセスする場合でも
最適化でレジスタに読まれてから処理されてるん?
アセンブラ出力させて調べてみよう・・・orz


423 名前:デフォルトの名無しさん :04/12/15 11:22:20
>>422
質問の意味がわからないけど、レジスタに入れないとなにもできないと思う……

424 名前:デフォルトの名無しさん :04/12/15 11:27:11
>>423
そうか?

425 名前:デフォルトの名無しさん :04/12/15 11:40:04
>>424
俺もわからん。解説してくれ。

426 名前:423 :04/12/15 11:59:34
アホなこと言った?だったらゴメン。
レジスタ使わないでできることと言ったら、DMAくらいしか思いつかない……。

427 名前:デフォルトの名無しさん :04/12/15 12:18:25
x86系なら、一応メモリに直接演算出来るし
比較程度だったら、レジスタに読み出さないでやってるかも。
速度的には不利になる場合も多いけど。

でも、メモリに対して演算できても、
その結果を読み出して使う段では、普通はレジスタにロードするね。


関係ないけど、google翻訳(日→英)で、デストラクタを訳すと
Death Tractor (死のトラクター)になるらしい。
D言語スレで見た。

428 名前:デフォルトの名無しさん :04/12/15 14:11:13
むしろExcite翻訳がかなり正確にム用語を訳せて驚いた

429 名前:デフォルトの名無しさん :04/12/15 18:03:37
>>422
アーキテクチャに夜。
32bitと64bitでも違うことあるし。

430 名前:デフォルトの名無しさん :04/12/15 18:41:42
1+2+3,1+2-3,1-2-3,1*2-3,・・・・・・のように符号を変えていって値を
求めたいのですが、

char fugou[4]={'+','-','*','/'};
for(a=0; a<=2; a++){
cout<<1<<fugou[a]<<2<<fugou[a]<<3<<endl;
}

COUTからどのようにして答えを出せばいいのでしょうか?


431 名前:デフォルトの名無しさん :04/12/15 19:33:53
すっごい初歩的な事かもしれないんですが、いくら書籍&サイトを
探しても載ってなかったので質問です。

メンバにint mIntを持つクラスAがあったとして

A a;
int n = a; //int n = a.mInt;

というような代入をする演算子をオーバーロードする事は出来ますか?
既出だったらすみません。




432 名前:デフォルトの名無しさん :04/12/15 19:35:13
>>430
その宿題は演算子の優先順位も考慮しないといけないんじゃないのかな?


433 名前:デフォルトの名無しさん :04/12/15 19:42:00
>>431
intへのキャストをオーバーロードすればいいんでない?

434 名前:デフォルトの名無しさん :04/12/15 20:00:01
>>433
なるほど!!!!!
ありがとうございます!!!!
あ、キャストをオーバーロードした時って何か弊害ありますかねぇ?

435 名前:デフォルトの名無しさん :04/12/15 20:04:30
import java.awt.Graphics;
import java.applet.*;
import java.awt.Image;

public class Test extends Applet {
Image im[] = new Image[4];

public void init() {
im[0] = getImage(getDocumentBase(), "a.gif");
im[1] = getImage(getDocumentBase(), "b.gif");
im[2] = getImage(getDocumentBase(), "c.gif");
im[3] = getImage(getDocumentBase(), "d.gif");
}

public void paint(Graphics g) {
double x = Math.PI * 0;
double y = 200 - Math.sin(x);
for (int i=0; i<4; i++){
g.drawImage(im[i], 100 * x, y, this);
x += Math.PI * 1/4 ;
}
}
}

という画像をsinカーブ上に並べる プログラムを作成したのですが、コンパイルすると、

436 名前:デフォルトの名無しさん :04/12/15 20:04:50
シンボルを解決できません。
シンボル:メソッド drawImage (java.awt.Image,double,double,Test)
場所 : java.awt.Graphics の クラス
   g.drawImage(im[i],100 * x,y,this);
    ^
エラー1個

というエラーがでてしまいます。どこがおかしいのでしょうか?
ttp://pc5.2ch.net/test/read.cgi/tech/1100559011/859-861
でも聞いたのですが直りません。お願いします。




437 名前:デフォルトの名無しさん :04/12/15 20:06:25
>>434
不用意にprivateメンバの保護を剥がすような(ポインタを返すような)事をしなければ大丈夫

438 名前:デフォルトの名無しさん :04/12/15 20:07:10
>>435>>436
Java厨はスレ違いだから他へ逝け。

439 名前:デフォルトの名無しさん :04/12/15 20:09:35
標準偏差ってどう求めればいいの?

440 名前:デフォルトの名無しさん :04/12/15 20:16:39
>>439
分散の平方根でいいのでは?


441 名前:デフォルトの名無しさん :04/12/15 20:16:56
ぐぐれ

442 名前:デフォルトの名無しさん :04/12/15 20:17:39
>>439

平均値を出して、各値と平均値の差を二乗し、その和を取り、要素数-1で割り、平方根を取る

443 名前:デフォルトの名無しさん :04/12/15 20:25:39
>>437
ありがとうございました。早速使ってみます!

444 名前:デフォルトの名無しさん :04/12/15 20:26:35
> 要素数-1で割り

どっから出た

445 名前:デフォルトの名無しさん :04/12/15 20:30:01
>>444
高卒?


446 名前:デフォルトの名無しさん :04/12/15 20:33:46
>>444
1/nでもいいんだけど、n-1にしておくと
無作為にm個選んだ場合の分散の期待値が
全体の分散と一致するんだよ

447 名前:デフォルトの名無しさん :04/12/15 20:48:24
439です
どうもありがとう
エクセルのような関数ってないですか

448 名前:デフォルトの名無しさん :04/12/15 20:53:38
>>447
stdev及びstdevp
helpをみると446の話が出てくるはず


449 名前:デフォルトの名無しさん :04/12/15 20:54:38
>>447
>エクセルのような関数
なのね
間違ったorz


450 名前:デフォルトの名無しさん :04/12/15 20:58:28
>>447
gslとか


451 名前:デフォルトの名無しさん :04/12/15 21:00:27
gslはライブラリの名前です
ttp://www.gnu.org/software/gsl/

標準ではないと思う


452 名前:デフォルトの名無しさん :04/12/15 21:02:22
ていうかそれぐらい自作しる

453 名前:デフォルトの名無しさん :04/12/16 12:34:05
447です。
gsl 英語が読めないので自作します
ありがとうございます。



454 名前:デフォルトの名無しさん :04/12/16 13:31:26
template <class T, int A> T aaa()
{
return A + aaa<T, A - 1>();
}

template <class T> T aaa<T, 1>()
{
return 1;
}

エラーが出てコンパイル出来ないのですが
どこが間違えているのでしょうか?

455 名前:デフォルトの名無しさん :04/12/16 13:56:20
>>454
ModernC++Designにも書いてある通り、
関数テンプレートはメンバ/非メンバ問わず部分的な特殊化ができない。
(コンパイラはオーバーロードなのか特殊化なのか判別ができない)
オーバーロードを使って解決することも出来るけど、
その程度ならコンパイル時定数として保持するのが吉。

456 名前:デフォルトの名無しさん :04/12/16 14:02:54
>>455
ありがとうございます。
これは試しに書いてみただけなので困ることはないんですけど
すっきりしました。

457 名前:デフォルトの名無しさん :04/12/16 15:30:52
>>454
関数テンプレートの部分特殊化をエミュレートする方法として
クラステンプレート + 静的関数ってのがあるので,参考までに.

template<class T, int A>
class aaa
{
static T invoke(){ return A + aaa<T, A - 1>::invoke(); }
};

template<class T>
class aaa<T, 1>
{
static T invoke(){ return 1; }
};

aaa<int, 10>::invoke();


458 名前:デフォルトの名無しさん :04/12/16 17:53:25
標準入力の入力バッファをクリアする方法ってあるでしょうか?
scanf() するときに、以前に入力されたものが入力バッファに入っていると、
使いにくいプログラムになるので、
scanf() する前に入力バッファをクリアしたいのです。

459 名前:デフォルトの名無しさん :04/12/16 18:06:44
>>458
std::cin.readsome()ってのがあったような。
OSのバッファには効かないけど。

460 名前:デフォルトの名無しさん :04/12/16 18:10:50
>>458
while (getchar() != EOF); では駄目かな

461 名前:デフォルトの名無しさん :04/12/16 18:52:19
それだと、入力にウェイトがかかって無限ループになるだけ。

462 名前:デフォルトの名無しさん :04/12/16 19:36:33
直接のC++の相談じゃないんだけど、
C++でコンパイルして、MS−DOSで結果でた、そのウインドウを
そのウインドウ自体のまま画像にするのってどうしたらいいんでしょう??

463 名前:デフォルトの名無しさん :04/12/16 19:37:35
>>458
fgets()でめいっぱい読み込んでからsscanf()するのは、そういう問題が
起きないようにするためだ。

但しfgets()で指定した文字数よりも余計に入れられると、これもだめだ
けどね。

464 名前:デフォルトの名無しさん :04/12/16 19:53:10
>>462
デジカメで撮る。

465 名前:デフォルトの名無しさん :04/12/16 19:59:56
>>462
Alt + PrintScreen

466 名前:デフォルトの名無しさん :04/12/16 20:19:06
>>465
ありがとう。
でも、できないみたいけど・・・?
できてるとしたら、画像ってどこに配置されてる?

467 名前:デフォルトの名無しさん :04/12/16 20:20:15
>466
板違い。PC初心者板へ池

468 名前:デフォルトの名無しさん :04/12/16 20:23:25
>>466
ペイント開いて、Ctrl+V

469 名前:デフォルトの名無しさん :04/12/16 20:24:02
>>466
クリップボード

470 名前:デフォルトの名無しさん :04/12/16 22:14:14
>>462
つーか、何で画像にしたいの?

471 名前:デフォルトの名無しさん :04/12/17 01:20:12
>>462
foo.exe > foo.txt

これで済むんじゃないのん?

472 名前:デフォルトの名無しさん :04/12/17 02:21:45
Javaできる、C#できるって人がC++始めたいのに最適な書籍はありませんか?
その前にC覚えろって話しですか?

473 名前:デフォルトの名無しさん :04/12/17 03:24:10
その前に先ず日本語だろ。

474 名前:デフォルトの名無しさん :04/12/17 03:30:07
>>473
オマエガナー

475 名前:デフォルトの名無しさん :04/12/17 03:41:51
>>472
C++Primer

476 名前:デフォルトの名無しさん :04/12/17 11:09:28
タスク教えて

477 名前:デフォルトの名無しさん :04/12/17 11:44:08
>>476
どの?


478 名前:デフォルトの名無しさん :04/12/17 13:34:02
ゲイは澪タスク

479 名前:デフォルトの名無しさん :04/12/17 15:05:58
局所静的オブジェクトって最初に通る時に一度だけ初期化されるんですよね。これって
どうやってるんですか? 素直に考えてフラグを持って通るたびに条件分岐?
それとも最初に通った時に自分自身を書き換えるような事をしてるんでしょうか。

480 名前:デフォルトの名無しさん :04/12/17 15:08:13
>>479
もちろん実装依存だが、普通は毎回テストしてるはず。

481 名前:デフォルトの名無しさん :04/12/17 15:28:37
>>479-480
「最初に通る時に一度だけ初期化」っていうのはそういう意味じゃなくて、
「実行ファイルのロード時に局所変数領域にイミディエイト値もロードされる」
ってこと。


482 名前:デフォルトの名無しさん :04/12/17 15:31:50
局所変数領域がなんで最初に確保されるんだ?っていう突っ込みもあろうが、
それはコンパイラが提供するスコープ範囲の機能を実現する都合だけであって、
静的である以上はいつ確保しても同じ。


483 名前:デフォルトの名無しさん :04/12/17 15:34:08
>481-482
オブジェクトと変数は違うと思うけど・・・


484 名前:デフォルトの名無しさん :04/12/17 15:48:53
当然だとは思うけど

class Hage {・・・};
void hoge() { static Hage hage; }

hogeを複数スレッドから同時に呼び出した場合、hogeの初期化を同期なんてしてくれませんよね?

485 名前:484 :04/12/17 15:49:33
hogeじゃなくてhageの初期化でした。

486 名前:デフォルトの名無しさん :04/12/17 15:50:44
static だからインスタンスは1個
同期も糞もないと思うが

487 名前:デフォルトの名無しさん :04/12/17 15:55:20
staticメンバはmain()関数の実行を開始する前に既に初期化を終えているんだっけ?

488 名前:デフォルトの名無しさん :04/12/17 16:11:45
>>486
関数内のstatic変数は最初に実行されたときに初期化されると規格で決まってるらしい。

489 名前:デフォルトの名無しさん :04/12/17 17:00:31
>>487
通常のローカル変数同様、変数宣言の字面上の位置で初期化される。
例えば int f(int a) { static b = a; return b; } があった場合、
b には初回呼び出し時の引数が代入され、以後ずっと変化しない。

>>486
一個だからこそ同期うんぬんという話が出てくるように思えるが・・・

490 名前:デフォルトの名無しさん :04/12/17 17:04:38
int f(int a) { static const b = a; return b; }
これなら大丈夫

491 名前:デフォルトの名無しさん :04/12/17 20:13:54
もちろん実装依存だとは思うけど

VC++,bcc,gccの3つは
初期化処理が必要な、関数内のstaticデータ
int f() { static int n = atoi("123"); return n; }
は、単純にフラグを使って
実行されるたびに初期化されたかを判定していて
同期処理は無しでした。

492 名前:デフォルトの名無しさん :04/12/17 22:40:50
C++ で行列クラスを作っていて、転置行列を返す関数を実装したいと思っています。
その場合、

class Matrix {
  ...
  Matrix Transpose(void) const;
};

のような設計で問題ないでしょうか?
たとえば、

Matrix a;
Matrix b = a.Transpose()

とした場合、Matrix オブジェクトは一度しか生成されていない (それが b)
ということが保証されるでしょうか?


493 名前:デフォルトの名無しさん :04/12/17 22:48:20
いんにゃ
普通はコピーコンストラクタでコピーされる

設計は問題ないと思うけどね

494 名前:デフォルトの名無しさん :04/12/17 22:49:08
敢えて言うなら返値はconst Matrixの方がいいと思う

495 名前:デフォルトの名無しさん :04/12/17 22:50:32
>>493
そうですか。
やはり無駄なコピーを抑えたければ、
void Transpose(Matrix* m) const;
みたいにしないといけませんか。

>>494
え?その必要はないと思いますけど。。。

496 名前:デフォルトの名無しさん :04/12/17 22:52:48
>>494
参照でもないのに何で const ?

497 名前:デフォルトの名無しさん :04/12/17 22:54:04
一時オブジェクトへの代入を禁止するため?

498 名前:デフォルトの名無しさん :04/12/17 22:57:48
何も考えてないんじゃ?

499 名前:デフォルトの名無しさん :04/12/17 22:58:35
C++ にこんな仕様があると便利かも。
仮にキーワード noncopy を導入して

class Matrix {
  noncopy Matrix Transpose(void)
  {
    noncopy Matrix m;
    ... m を転置行列としてセットアップ ...
    return m;
  }
};

と記述すると、戻り値の Matrix が引数の最後にポインタとして
渡されたかのように処理される。
そのポインタを受け取るのが、実装における noncopy 宣言された変数。

500 名前:デフォルトの名無しさん :04/12/17 23:02:33
>>493
実際は大抵最適化でコピーしないようになるし、規格だってそういう動作にしても良いと書いてあるはず。


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