[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 05/30 19:11 / Filesize : 249 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.48【環境依存OK】



1 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 01:18:41 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.47【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1200464091/
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm


501 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 09:11:10 ]
>>500
36! は 371993326789901217467999448150835200000000 であって、
2^64 = 18446744073709551616 を大幅に越えている。

二項係数の値を求めたいのであれば、
パスカルの三角形を使って足し算だけで求めると良い。

502 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 10:43:24 ]
>>501
ありがとうございます。扱える数字をオーバーしちゃってるんですね
パスカルの定理調べてみたけどよく分からない…
高校の時の数学の教科書引っ張り出してきます

503 名前:デフォルトの名無しさん [2008/02/12(火) 12:50:57 ]
>>497
COMの知識があれば使えるかも。

504 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 13:16:35 ]
perlembed ?
俺には無理そうだが君なら!

505 名前:デフォルトの名無しさん [2008/02/12(火) 16:04:32 ]
クラス内でchar *filename;というメンバ変数を持っているのですが、
コンストラクタ内で、
filename = "memo.txt";
とかやると、
warning: deprecated conversion from string constant to 'char*'
と言われます。static_cast<char *>("memo.txt")としても同じでした。
このワーニングが出ないような書き方はないでしょうか?



506 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 16:09:15 ]
>>505
char *filename → const char *filename

507 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 16:14:45 ]
>>484
言われた通り実行すると、確かにコマンドプロンプトは表示されたままで止まりました。
原因は分かりませんが、しばらくはこれでやってみたいと思います。

もし、どなたか原因が分かる方がいれば教えてください。

508 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 16:26:28 ]
>>507
原因ったって、そのプログラムが一瞬で終了するからだろう。
"test\n" を出力したあと、すぐに return してるじゃないか。
プログラムが終了したら窓は消える。

509 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 16:30:51 ]
>>508
今まではreturn 0を入れると「終了するには何かキーを押してください」と言う表示がでてたんですが、
急にでなくなって困っています。
getchar();を入れた場合は止まりますが、キー入力待ちにはなりませんでした。

言っていることが聞かれている事とちがったらすいません。



510 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 16:42:18 ]
>今まではreturn 0を入れると「終了するには何かキーを押してください」と言う表示がでてたんですが、
そりゃぁ、IDEから起動してたからだろ。

511 名前:デフォルトの名無しさん [2008/02/12(火) 17:57:15 ]
#include <iostream>
using namespace std;
namespace HW {
class test {
public:
test();
virtual ~test();
};
test::test() {
cout << "FFF" << endl;
}
};
int main()
{
return 0;
}
これをコンパイルできません。 どうしてですか?

/tmp/ccsyUc0A.o: In function `HW::test::test()':
samp174.cpp:(.text+0x12d): undefined reference to `vtable for HW::test'
/tmp/ccsyUc0A.o: In function `HW::test::test()':
samp174.cpp:(.text+0x163): undefined reference to `vtable for HW::test'
collect2: ld returned 1 exit status



512 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 18:15:43 ]
>>511
デストラクタの宣言があるのに実体がないから。
ついでに言えば、コンストラクタの後にイリーガルなセミコロンがある。

513 名前:デフォルトの名無しさん [2008/02/12(火) 18:19:13 ]
VS2005のC++でDXUT,STL使って開発してるのですが、
class A{
std::string m_name;
public:
void func(std::string str){
m_name = str;
}
}
このコードがデバッグでは何の問題もなく動くのですが、
リリースにするとfuncを呼び出してm_nameに代入した時にthisポインタが0x000001を指し、
バッファオーバーランで落ちてしまいます。
何かご存知の方が居ればどうかご教授ください。

514 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 18:22:49 ]
コンストラクタの後のセミコロンはネームスペースの終わりのとこだべ。
なくてもいいけど。
で、デストラクタはオブジェクトを作ってないから呼ばれないので、通所は無くてもいいが
virtual の場合は別。

515 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 18:24:58 ]
それだけじゃ判らんから、気になったことだけ。
・なんでstd::stringを値渡ししているの?
・そのAの実体はどこにあるの?

516 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 18:32:17 ]
>>511
namespaceの終わりにセミコロンは不要。
仮想関数には定義が必要。定義が無いと仮想関数テーブル
(そのメッセージでいうvtable)のエントリーを作れない。
仮想でなければ呼ばれなければ必ずしも定義は必要ない。

517 名前:デフォルトの名無しさん [2008/02/12(火) 18:40:03 ]
>>514
セミコロンは付け忘れました、
まだ継承は知らないのでなんとも。。
>>515
値渡しでうまく動いてたので特に意味なく使ってました、
ためしにfunc(string *str) に変えてみたら見事に動きました。。。
なぜこういう結果になるのかよくわかりません。。。
すばやい解答ありがとうございました。

518 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 18:42:07 ]
>>517
どうでもいいが、>514は>512宛てだ。
ついでに言えば、ポインタ渡しじゃなくて参照渡しにするだろ。常考

519 名前:デフォルトの名無しさん [2008/02/12(火) 18:49:20 ]
>>518
勘違いしました、、
なぜデバッグだと動いていたのか、と
値渡しだとだめなのかを知りたいのですが。。



520 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 18:54:58 ]
>>519
>515

521 名前:デフォルトの名無しさん [2008/02/12(火) 19:06:43 ]
>>520
というか良く見たらDebugモードになってまして、
Releaseだとやっぱりオーバーランしてましたorz
だめだめだ。。。
class A{
string m_str;
public:
func(string str){
m_str=str; ←
};
};

class X{
public:
func(string str){
A hoge;
hoge.func(str)
};
};

DWORD WINAPI doloop(LPVOID lpParam){
x.func("test"); ←xはグローバル変数になってます
};

最初はこんな感じです。。

522 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:11:48 ]
>>513
mainもないのが、問題なく動くのか……最近のC++は凄いな

523 名前:513 mailto:sage [2008/02/12(火) 19:13:15 ]
>>520
Releaseでビルドプロパティの最適化を無効にしたらReleaseでも大丈夫でした。

524 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:14:50 ]
>>521
問題が再現する最小のテストコードを作って
検証してから質問してくれ

525 名前:513 mailto:sage [2008/02/12(火) 19:15:45 ]
>>522
mainからdoloopをスレッドで動かしてます。。
簡略化しすぎました。。
DWORD WINAPI doloop(LPVOID lpParam){
while(!bMainLoopExit)
{
EnterCriticalSection(&cs);
x.func("test");
LeaveCriticalSection(&cs);
}
ExitThread(NULL);
}

526 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:16:01 ]
class A{
std::string m_name;
public:
void func(std::string str){
m_name = str;
}
}

int main(int, char**)
{
A test;
std::string str = "abc";
test.func(str);
}


//
これでも落ちるか?

527 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:16:44 ]
>>525
まて、複数のスレッドからグローバル変数にアクセスしてるのか?

528 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:18:51 ]
このあと、衝撃の新事実が!

529 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:21:42 ]
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));


D3DPRESENT_PARAMETERS d3dpp = {0};

結果に違いはありますか?



530 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:23:24 ]
STL使っておいてExitThreadってのも相当ヤバイ匂いがするけどな

531 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:27:49 ]
そもそも〜Thread系の関数って使いどころあるのかね?


532 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:27:50 ]
うむ、少なくともA::funcが問題って訳じゃなさそうだよね。
ってか、なんで値渡し……?

533 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:36:24 ]
構造体のメンバに、名前と番号両方からアクセスしたいとおもっています。
typedef struct particle{
double data[3][3];
typedef data[][0] position[];
typedef data[][1] verosity[];
typedef data[][2] angle[];
/* ようするに、data[][]に、position[]……という名前でもアクセスしたい */
/* data[][]のままで、loopを回して全部に値を流し込む、ということもしたいので、二重配列も残したい*/
}PARTICLE;

当然のようにエラーなのですが、こういうばあいどのように記述すればいいのでしょうか。

534 名前:513 mailto:sage [2008/02/12(火) 19:38:00 ]
>>526
mainの中身を >>521のX::funcにあたる場所に入れて実行してみましたがだめみたいです。
>>527
そうです。。
>>530
書かなくてもいいけど明示的に書いても良いって書いてあったので書いてあります。

クリティカルセクションで排他処理した気分になって
親が実体持ってるクラスを使ってます。。

535 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:44:25 ]
2chcity.myminicity.com/env

環境優先的に修復を。たぶんこの項目が一番減る。
NEJITUのように少し公園を先行させてもいいかもしれん。

ランク   国名     .... 街名           人口   (増減)   前日
--- 1   US1       .LUELand          314897 (. +528)  314369
--- 2   US2       .GoonTown       ......187254 (. +490)  186764
--- 3   US3       .CreateMyCity Forum  105044 (. +804)  104240
--- 4   Slovenia1    Staregate          100076 (+1393)   .98683
--- 5   Poland1     #debian.pl        .... .90733 (. +618)   .90115
--- 6   Germany1   isnichwahr.de        .89782 (. +224)   .89558
--- 7   Japan1    ...2ch_city         .... .69147 (+1870)   .67277
--- 8   Germany2   deluxebits          .59250 (. +279)   .58971
--- 9   France1    .FanaZ            . .56613 (+1377)   .55236
--- 10 . Germany3   upOTia           . .54802 (. +130)   .54672


20位までのランクは下記URLご参照ください
mmc.from.tv/world.html

536 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:49:09 ]
宣伝するのはいいけど、糞重いページだと注意書きしろよ。

537 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:53:41 ]
>>533
typedef union particle{
double data[3][3];
struct {
double position[3];
double verosity[3];
double angle[3];
} named;
}PARTICLE;

538 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:59:41 ]
例外を投げるときどういう型で投げるのが一般的なんでしょうか?

エラーメッセージ?
エラーコード?
それともクラスで投げて型判別?
どういう形がスマートでしょうか

539 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 20:03:05 ]
CAtlException



540 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 20:20:13 ]
>537
ありがとうございます
// strtest.c
#include <stdio.h>

typedef union particle{
double data[3][3];
struct {
double position[3];
double verosity[3];
double angle[3];
} named;
}PARTICLE;

int main(void){
PARTICLE pt;
pt.data[0][0] = 10;
printf("%lf\n",pt.named.position[0]);
return 0;
}

>gcc strtest.c
>./a.out
10.00000

所望の動作が得られました。

541 名前:513 mailto:sage [2008/02/12(火) 20:42:48 ]
答えてくださった方々ありがとうございました。

542 名前:460 mailto:sage [2008/02/12(火) 21:10:50 ]
>>471

なるほど。そこの部分と、>>460では省略した速度のvをintからfloatにしたらなんとなくうまくいきそうな感じになってきました。
ありがとうございます。

543 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 21:18:08 ]
Cの基本的なこと(繰り返しや条件分岐、演算子、ポインタ、構造体)をやってからC++(visual C++)をやろうと思ってるんですが他にCで勉強してた方がいいことってありますか?

544 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 21:35:53 ]
STLとATLで、
std::stack<CAutoPtr<Hoge>> hoges;
hoges.push(CAutoPtr(new Hoge()));
hoges.top()->func();
とすると、Hogeの実体がすでに破棄されているみたいでエラーが出ます。
std::stack<CAutoPtr<Hoge>> hoges;
hoges.push(CAutoPtr(new Hoge()));
hoge.top().Attach(new Hoge());
hoges.top()->func();
とすれば動きます。

どうして上のだと捨てられているですか?

545 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 21:52:39 ]
すまぽい

546 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 21:54:00 ]
CAutoPtrってSTLのコンテナに突っ込んで平気だったっけ。実装的に。

547 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 22:03:06 ]
auto_ptrと一緒じゃないか?

hoge.top().Attach(new Hoge());
で新たなアドレス突っ込んでるから動くだけで。

548 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 22:13:30 ]
>>529
D3DPRESENT_PARAMETERSがPOD型なら無い

549 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 22:13:52 ]
CAutoPtrが原因だね。



550 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 22:14:39 ]
CAutoPtr専用のコンテナがあったはず

551 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 22:16:31 ]
>>548
そいつたぶん釣りか荒らしかただのバカだよ…。

552 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 22:16:54 ]
それかCSharedPtr

553 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 22:24:25 ]
>>534
スレッド中でWindowsAPIのみ使うならCreateThread, ExitThreadでいいよ。
でもCランタイム使うなら_beginthread, _endthread使わないとダメだぜ。
あと、ExitThread等でスレッド終わらせると、スコープ抜けずにスレッドが終わる。
C++使うなら、ローカル変数のデストラクタ呼ばれなくなるからやめた方がいい。

554 名前:460 mailto:sage [2008/02/12(火) 22:48:42 ]
すみません、やっぱり無理でした。

( after - before )の部分をtimeに置き換える。     ・・・・ 正常に動作。
(ただし、事前に float time = 0.1; を宣言しておく。)

( after - before )の部分を数字の0.1に置き換える。  ・・・・ 正常に動作。

( after - before )の部分をtimeに置き換える。      ・・・・ おかしい
(ただし、事前に DWORD time = 0.1; を宣言しておく。)


ここから考えるにDWORD型が悪さをしていると思うんですが、
( after - before )の部分を( float )( after - before )に置き換える。 ・・・・ おかしい

何か特殊な変換をしなければいけないんでしょうか?

555 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 22:52:40 ]
>DWORD time = 0.1;
DWORDが何のtypedefか分かってる?

556 名前:デフォルトの名無しさん [2008/02/12(火) 23:19:54 ]
すみません質問です。
下記のようなコードでBar::fugaを初期化する方法が
よくわからないのですが、教えていただけませんでしょうか?
この場合はやはり引数空っぽのコンストラクタを作るほかに手はないのでしょうか?

class Foo{
 public:
 Foo( int hoge ){ ... }
};

class Bar{
 public:
 Foo fuga[ 3 ];
 Bar( void ) : ???? { ... }
};

557 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 23:22:46 ]
>>554
おかしいというときは、after - beforeやtimeの値が0になっているときじゃないか?

558 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 23:34:52 ]
timeGetTimeが何を返す関数なのか理解しないで使っているに1ガバス。

559 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 23:42:03 ]
戻り値で
return *(hoge + (sizeof(piyo) + 2);
みたいに書くのって非推奨なんでしょうか?*は無くてもいいんだけれども



560 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 23:52:53 ]
ケースバイケース。
つか、それだけじゃ分からん。

561 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 23:55:35 ]
>>559
まあ、非推奨だろうね。








コンパイルできないし。

562 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 23:57:36 ]
>>559
*があるとないじゃ内容が変わるが?括弧の数が合わないのはtypoでいいよね?
個人的には、あんま複雑になるようならローカルに落として欲しいけど、これくらいなら許容範囲。
ってか、ポインタを+2するだけならreturn hoge + 2;でもいいんでねぇの?


563 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 23:58:57 ]
>>559
何がいいたいのかさっぱり分からない。

564 名前:460 mailto:sage [2008/02/13(水) 00:45:52 ]
うあああああああああ!できました!
>>555
整数型って分かってたつもりなのに小数いれてました!
あと、>>557で言われたとおりにtimeの値調べてたら、
ウィンドウ生成時に
before = timeGetTime();
そして計算時にも
before = timeGetTime();
ってやって、afterに何も入ってないような状態になってたような感じでした!
今度こそ解決しました!ありがとうございます!

565 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 00:53:15 ]
そもそもさ、めちゃめちゃな計算結果って具体的にどんなんよ

566 名前:460 mailto:sage [2008/02/13(水) 01:11:10 ]
3Dのモデルを動かしてて、チェックするまでは数字の表示の仕方がよく分からなくて数字に出してなかったんですが、
とりあえず物体のy座標しかいじってないのにカメラの位置が変わってました。

567 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 01:53:03 ]
一時的でなくそこからずっと指定の型で宣言したみたいに扱う方法ってないですか?
例えばchar型で宣言したのを一々(int)とかしなくてもずっとint型として扱う
みたいな感じで

568 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 02:02:10 ]
>>567
言いたいことがわからない。キャストを毎回するのが面倒ってことか?
ずっとintならはじめからintにしとけばいいんでねぇの?

569 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 02:08:09 ]
>>567
union{
char a;
int b;
};
ちょっと違うかもしれんが



570 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 02:08:59 ]
>567
#define char int
なにが起きても責任とらないよ。

571 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 02:26:22 ]
>>568-470
ごめん_beginthreadが引数としてvoid*しか渡せないからそれをchar*として扱える
ようにしたかったんです
関数内でchar *xxx=(char *)xxxとすることで解決しました。ご迷惑おかけしました

572 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 02:27:27 ]
>>568-470
ごめん_beginthreadが引数としてvoid*しか渡せないからそれをchar*として扱える
ようにしたかったんです
関数内でchar *xxx=(char *)xxxとすることで解決しました。ご迷惑おかけしました

573 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 02:28:44 ]
「charとint」と「void*とchar*」はだいぶ事情が違うだろ・・・

574 名前:デフォルトの名無しさん [2008/02/13(水) 06:39:24 ]
>>514
>>516
ありがとうございます。なるほど、仮想関数は定義が必須なのですね。
あと、純粋仮想関数は定義が必要ないけど、デストラクタの純粋仮想関数の場合は
やはり定義が必要になる、というのは正しいですか?


575 名前:デフォルトの名無しさん [2008/02/13(水) 08:56:43 ]
質問です。
マルチスレッドプログラムを作った事がないためわからないです。
スレッドAで作ったデータをスレッドBに渡すには普通どうやって渡すのでしょうか?以前お遊びで作った時、グローバル変数を使って渡したのですがデータが化けちゃったんですね。。

【作りたいもの】
ダイアログベースのターミナルソフト。
・シリアルデータ受信スレッドでデータを受けて表示用(windowsのメッセージループ待ちをしてる)に送りたい

【開発環境】
VC。MFCはつかいません。猫でもわかるレベル

576 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 09:45:29 ]
AはBの作成者、じゃないのね?
グローバルデータが化けた理由がわかれば解決すると思うよ。

577 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 09:49:28 ]
同時に書き込んだんじゃね?
もしくは書き込んでない(初期化してない)のに取得したか

578 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 09:58:22 ]
どうせ排他してないだけなんだろうな

579 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 10:00:48 ]
>>575
多分GUIスレッドにはPostMessage()でブン投げてるんだろうが、
GUIスレッドがPostされたメッセージをメッセージキューから読み取るまでの間に
受信スレッド側からの再Postが発生し得るから、その場合グローバル変数では
当然上書きされてしまうだろ。

Post側は毎回malloc()等でメッセージ用の領域を確保して、受け側で
メッセージを処理したらfree()するように汁。



580 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 10:57:14 ]
C++の一時オブジェクトについて質問します。gcc 3.2.1です。
下記のようなコードで"taking address of temporary"のWARNINGが出ますが、
この場合は無視しちゃってもいいですか?いいですよね?

#include <stdio.h>

class CTmp
{
public:
int x,y;
CTmp(int a,int b):x(a),y(b){};
};

int Foo(CTmp* pTmp)
{
if(pTmp) return pTmp->x + pTmp->y;
return 0;
}

int main(int argc,char** argv)
{
int result=Foo(&CTmp(1,2));
printf("%d\n",result);
return 0;
}


581 名前:580 mailto:sage [2008/02/13(水) 11:16:23 ]
こうするのがスマートかな。
スマートさ以外で>>580のまずい点あったら教えてください。

#include <stdio.h>

class CTmp
{
public:
int x,y;
CTmp(int a,int b):x(a),y(b){};
};

int Foo(const CTmp &Tmp)
{
return Tmp.x + Tmp.y;
}

int main(int argc,char** argv)
{
int result=Foo(CTmp(1,2));
printf("%d\n",result);
return 0;
}


582 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 11:58:15 ]
スマートというかそれが普通じゃね。

583 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 12:01:25 ]
>>580
標準 C++ ではエラーになるはず。 gcc のバグっぽいな。
gcc.gnu.org/bugzilla/show_bug.cgi?id=21386
(だいぶ古いけど CONFIRM されてない。)

584 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 12:02:19 ]
んじゃ、列挙。
・ポインタである必要が内のにポインタを使うな
・どうしても使いたいならconst修飾しろ
・そもそもデータメンバは公開するな
・クラスに依存する関数ならメンバにしろ

585 名前:デフォルトの名無しさん [2008/02/13(水) 12:15:31 ]
下記のように、fstreamの参照に、ifstreamを渡したいのですが、できません。
そこで、fstream *fsというようにポインタにしてやってるのですが、参照で
やる方法はないでしょうか

void func(fstream &fs)
{
return;
}
int main()
{
ifstream ifs;
ifs.open("ttt");
func(ifs);


586 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 12:19:49 ]
return文で計算したりって避けてたけど結構普通にやるもんなんだな

587 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 12:20:57 ]
>>585
fstream は読み書き両用。読み取り専用の ifstream を渡せないのはあたりまえ。
なんで ifstream& にしないの?

588 名前:580 mailto:sage [2008/02/13(水) 12:26:17 ]
>>582-583
レスありがとうございます。
まあ動くけど将来にわたって安全とは言い難い、
ってかやはり>>581推奨ってとこですかね。

>>584
あくまでサンプルなんで御容赦ください。
でもお気遣い感謝します。

589 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 12:46:25 ]
まずい点あったら教えてくれと書いてるのに
まずい点を指摘したら言い訳ってどーなんだ



590 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 12:46:29 ]
>>585
ファイルストリームのクラス階層を確認してみるべき。
fstreamとifstreamは継承階層の中で関係が全く無い。


591 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 12:53:03 ]
>>589
いや、質問の主眼が"taking address of temporary"のWARNINGでしたので。
その他は瑣末なことと手を抜いてしまいました。
とりあえずお詫びまで。

592 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 12:56:48 ]
まあありゃ誰がどう見てもただの揚げ足取りだな

593 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 13:03:19 ]
>>585
ちょっとややこしいけど、そのコードには、一般によくある勘違いにかすっている
君独自の勘違いがある。

まず、ifstreamはistreamを継承してる。fstreamは、iostreamを継承してる。
そのiostreamが、istreamとostreamを継承してるから、つまり両者に共通する近い祖先はistream。
iostreamはistreamの子だけど、fstreamはifstreamの子ではない。これが一般に良くある勘違い。

で、君はこれを踏まえて、fstreamにifstreamを渡すという、更なる勘違いをしてる。
読み書き両用クラス「が」読み取り専用クラス「の」子であるのは明白なわけで、つまり君は、
このセンスがまだ身についていないか、あるいは、普通に渡すだけでダウンキャストが可能になるという、
C++の仕様に対する勘違いをしていることになる。

594 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 13:19:14 ]
std::cinをstd::ifstreamに渡しても問題なかですか?

595 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 13:36:47 ]
std::istreamじゃイヤなのか? なぜ f が必要?

596 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 13:47:04 ]
>>593
そんなくどい説明必要ない。
クラス階層見れば一発で分かる。
他人の勘違いまでも決め付けるなんて教えたがりも甚だしい。


597 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 14:10:16 ]
>>596
現実に「クラス階層見てない」人なんだし、
他に可能性が無い状況は決めつけとは言わないよ。
変な理屈で変なスイッチ入っちゃった人に絡まれるのってやだなぁ。

598 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 15:23:56 ]
using namespace std;
は何かヘッダをincludeした後じゃないとだめなの?

599 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 15:28:19 ]
書くだけならお好きにどうぞ



600 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 15:39:47 ]
VCで先に書くとstdと認識してくれないのですが







[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<249KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef