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


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

C++相談室 part38
751 名前:デフォルトの名無しさん :04/12/31 11:49:33
cout << "string" << cin;
string foo;
cout << foo << cin;

752 名前:デフォルトの名無しさん :04/12/31 11:55:38
Rubyの方が100倍美しく10倍効率的。

753 名前:デフォルトの名無しさん :04/12/31 12:43:10
<<,>>演算子は、可変引数をもつ関数解決のための別アプローチだろ。

754 名前:デフォルトの名無しさん :04/12/31 14:39:38
>>752
そして10倍以上遅い

755 名前:デフォルトの名無しさん :05/01/01 04:24:09
cinってなんて読むのですか?

756 名前:デフォルトの名無しさん :05/01/01 04:39:23
シーイン

757 名前:デフォルトの名無しさん :05/01/01 09:37:47
input 〜 from console

758 名前:デフォルトの名無しさん :05/01/01 13:29:34
昔、cout を コート と読んでいたのは秘密だ

759 名前:デフォルトの名無しさん :05/01/01 14:09:39
こうとな・・・・・・質素で上品な。けばけばしくなく上品な。「若いのにえらいこうとなもん着たはりますなあ。」

760 名前:デフォルトの名無しさん :05/01/01 14:11:52
>>754
OCamlだったらSTLばりばり使ったC++より速いよ

761 名前:デフォルトの名無しさん :05/01/01 15:09:57
>>760
速度有利なものと速度不利なものを比較して何が言いたいんだ?

762 名前:デフォルトの名無しさん :05/01/01 15:12:44
質問です。
classのメンバーに別のクラスを含んだんですが
その別のクラスのメソッドを、包括するクラスのメソッドとしても
実行できるようにしたいんですが
別クラスhoge
void test(void);

包括クラスage
void (*test)();

test=this->test;

としたのですが
メンバー関数は呼び出すかそのアドレスをとらなければならないと言われます。
どうすればいいでしょう。

763 名前:デフォルトの名無しさん :05/01/01 15:14:59
class hoge {
public:
 void test() {}
};

class age {
 hoge _hoge;
public:
 void test() { _hoge.test(); }
};

764 名前:デフォルトの名無しさん :05/01/01 15:16:37
>>762
メンバ関数ポインタとか調べてみれ

765 名前:デフォルトの名無しさん :05/01/01 15:23:09
>>763,764
ありがとうございます。
勉強します。

766 名前:デフォルトの名無しさん :05/01/01 16:23:17
>>760
そもそもC++で作ったプログラムの実行速度なんて同じハードウェア環境下でも
処理系やコンパイルオプションによって雲泥の差があるんだから
その手の情報のほとんどは全然あてにならん。

767 名前:デフォルトの名無しさん :05/01/01 17:03:12
Java だと toString メソッドを出来るだけ書けっていわれますが、これってC++にも当てはまりますか?

768 名前:デフォルトの名無しさん :05/01/01 17:46:31
>>767
当てはまらない。
JavaはObjectクラスがtoStringを持ってるからオーバーライドすべきなの。
C++ならシステムがクラス名を必要とするときだけ同等のことをすれば良い。

769 名前:デフォルトの名無しさん :05/01/01 19:55:06
>>761
速度有利なものと速度不利なものを比較しないと勝てないくらい実行速度に差があるって事だろ?
そもそもRubyとC++では土俵が違うし、それを無理やり比較して勝とうとするのは・・人はそれを厨と呼b・・(ry
言語間の違いを理解して目的に応じて使い分けるのが賢いやり方だろう。
(勿論、それだけで全てをこなすエキスパートの技術は素晴らしいと思うがな)

まぁ、どの程度実行速度に差があるのかは検証した事ないし
>>766の言う様に状況に寄って結果も変動するからねぇ

770 名前:デフォルトの名無しさん :05/01/01 20:06:34
要求を聞いた時点から言語の選択を誤り更に修正できない香具師は痛い

771 名前:デフォルトの名無しさん :05/01/01 22:28:13
>>757
cout は char* out じゃないか?

772 名前:771 :05/01/01 22:29:25
×cout/out
○cin/in

773 名前:デフォルトの名無しさん :05/01/01 22:40:40
>>771-772
そんなばかな

774 名前:デフォルトの名無しさん :05/01/01 23:59:00
const_reverse_iterator を const_iterator に変換するにはどうすればいいの?
とりあえずvectorの場合で。

775 名前:デフォルトの名無しさん :05/01/02 00:26:27
.base()

776 名前:デフォルトの名無しさん :05/01/02 00:27:47
advance と distance を使う

777 名前:デフォルトの名無しさん :05/01/02 00:29:01
>>775
おぉ、サンクスコ。


778 名前:デフォルトの名無しさん :05/01/02 00:30:12
>>776
あぁ、そういうのもあったね。忘れてた...
iterator使い鳴れないもんで..

779 名前:デフォルトの名無しさん :05/01/02 00:49:21
もひとつお願い。
vectorのある位置を指すiteratorってどうやって表すのがスマート?
vector<int> v;
const_iterator f(int idx) { return v.begin() + idx; }
だとちょっとカッコ悪かなと...

780 名前:デフォルトの名無しさん :05/01/02 00:53:00
>779
それでいいんでない?
vectorのイテレータはランダムアクセスイテレータなんだから
わざわざadvanceを使ったりすることもないべ。

781 名前:デフォルトの名無しさん :05/01/02 00:57:03
&v[idx]から変換できないのかなと思って...
だめ?

782 名前:デフォルトの名無しさん :05/01/02 01:22:26
漏れは統一目的でadvance使った方がいいと思うけど

783 名前:デフォルトの名無しさん :05/01/02 01:23:00
std::vector<T>(ただしT != bool)に限っては、その保持するデータのメモリ
上のレイアウトが配列と同じでなければならないという訂正が規格に入った
から、v.begin() + (&v[idx] - &v[0])で間違いではないだろう。iteratorと
ポインタの同一視は一般的にはあまりよくないだろうが。

784 名前:783 :05/01/02 01:24:23
ん?何か俺頓珍漢なことを言ってるな。忘れてくれ。

785 名前:デフォルトの名無しさん :05/01/02 01:27:12
>>782
ちなみに、advance()使った場合はどう書けばいいの?
const_iterator i;
advance(i, idx);
return i;
とか?
return &v[idx];
くらいに簡単にしたいんだけど...

786 名前:デフォルトの名無しさん :05/01/02 01:34:41
小数の下の0の除去。例えば
0.0012300
これを
0.00123
にする場合、みなさんならどういう方法でやりますか?

787 名前:デフォルトの名無しさん :05/01/02 01:44:33
string str="0.0012300";
double num;
num = lexical_cast<double>(str);
str = lexical_cast<string>(num);
cout << str << endl;

788 名前:デフォルトの名無しさん :05/01/02 01:57:43
boostライブラリ?

789 名前:デフォルトの名無しさん :05/01/02 02:05:13
boost::lexcal_cast<>が楽だろうねぇ。

790 名前:デフォルトの名無しさん :05/01/02 03:00:35
boost知らなかった。
標準関数やsprintfでは0の除去は用意されていないんですね。

791 名前:デフォルトの名無しさん :05/01/02 03:19:15
boost使うと「文字列の末尾から'0'を取り除く」と直接書くこともでける
string s = "0.0012300";
trim_right_if(s, _1 == '0');

792 名前:デフォルトの名無しさん :05/01/02 03:32:19
is_any_of("0")じゃないの?

793 名前:791 :05/01/02 03:33:40
is_any_ofの存在を忘れてマスタ orz

794 名前:デフォルトの名無しさん :05/01/02 03:42:02
誰か知識を貸してください!

#ifndef __INITIALIZATION
#define __INITIALIZATION
#include "main.h"
void initialization(MAIN_DATA*data);
#endif

をコンパイルすると
e:###initialization.h(6): error C2065: 'MAIN_DATA' : 定義されていない識別子です。
e:###initialization.h(6): error C2065: 'data' : 定義されていない識別子です。
e:###initialization.h(6): error C2182: 'initialization' : 'void' 型が不適切に使用されています。
となりました。
ソースの方は↓でコンパイルは通ります。
void initialization(MAIN_DATA*data)
{
......
}

main.hの中には
typedef struct_MAIN_DATA
{
......
}MAIN_DATA;
としています。

助けてエロイ人。


795 名前:デフォルトの名無しさん :05/01/02 03:47:39
struct_MAIN_DATA
   ↑なんだこの_は

796 名前:デフォルトの名無しさん :05/01/02 03:50:02
>>795
タブが消えたんでないの

797 名前:795 :05/01/02 03:50:56
なる

798 名前:デフォルトの名無しさん :05/01/02 04:07:54
>>785 boost::prior(v.begin(),idx)

799 名前:デフォルトの名無しさん :05/01/02 04:22:52
next じゃないの?

800 名前:798 :05/01/02 05:01:30
まちがえちゃった。

801 名前:デフォルトの名無しさん :05/01/02 05:02:37
>>794
根本的な問題の解決方法じゃないが
void initialization(struct MAIN_DATA*data);
としてみそ。

802 名前:デフォルトの名無しさん :05/01/02 06:01:25
>>801
やってみましたが再定義されていますとのことorz
レスさんくすです^^

803 名前:デフォルトの名無しさん :05/01/02 09:37:57
>>794
main.h の最終行は改行しているか?

804 名前:デフォルトの名無しさん :05/01/02 09:43:06
802
typedef int int;

805 名前:デフォルトの名無しさん :05/01/02 09:50:43
typedef struct→糞 _MAIN_DATA MAIN_DATA

806 名前:デフォルトの名無しさん :05/01/02 09:55:28
#ifdef __cplusplusplus
#else
#endpg

807 名前:デフォルトの名無しさん :05/01/02 16:11:21
よくoperatorで戻り型にconstつけて、かつoperator関数にもconstつける
けど、戻り型にconstつけるとoperator関数にconstつけなきゃいけないのは
なぜなんでしょうか?

808 名前:807 :05/01/02 16:15:11
operatorの呼び出し元のオブジェクトをconstな型として扱わないと
constな戻り型で返せないからですかね?

809 名前:デフォルトの名無しさん :05/01/02 16:59:22
>operatorの呼び出し元のオブジェクトをconstな型として扱わないと
>constな戻り型で返せないからですかね?

はい.ただしデータメンバへの参照を直接返す場合とかの話ですけどね.

810 名前:デフォルトの名無しさん :05/01/02 17:09:35
struct{
static int a;
int b;
}xx;

本体はstaticではなく、一部のメンバだけstaticって有り?無し?

811 名前:デフォルトの名無しさん :05/01/02 17:11:54
もちろん、あり。

812 名前:807 :05/01/02 17:15:06
>809
なるほど!!ありがとうございます!
const abcclass operator*(const abcclass &ob)const;
~~~~~ ~~~~~
(1) (2)

(1):戻し型の指定であって、呼び出し元とは関係ない
(2):呼び出し元のオブジェクトを(一時的に)const扱いにする
っていうイメージですかね。

813 名前:807 :05/01/02 17:16:16
あ、半角スペース無視されるんだった。
すいません、(1)ははじめのconstで、(2)は最後のconstです。

814 名前:デフォルトの名無しさん :05/01/02 17:44:34
>>812
その通りですけれど,そのoperator*の戻り値は一時オブジェクトなので
(1)のconstはあっても無くてもコンパイルは通りますよ.
(このconstを付けるか付けないかはこれはこれでよく議論の火種になりますけど)


815 名前:807 :05/01/02 18:17:02
>814
そうなんですかー。
gccではテンポラリなオブジェクトはなぜかconst扱いになってしまうので
(VCは呼び出し元依存だった気がします)、あってもなくても同じかと
思っていたのですが、議論されるまでのものだったんですかー。

816 名前:デフォルトの名無しさん :05/01/02 20:59:18
組込型同様左辺値にはならないように互換性をとる
テンプレートの実体化を邪魔して冗長なのでやめれ

こんなとこか


817 名前:デフォルトの名無しさん :05/01/02 21:03:13
ってかoperatorをconstにするのは当たり前だろ
constテンポラリが呼び出すかもしれないし

>>807は基本からやりなおせ

818 名前:デフォルトの名無しさん :05/01/02 21:35:59
>>803

改行はしていますよ。
あぁぁぁぁぁ・・・全然すすまない〜><

819 名前:デフォルトの名無しさん :05/01/02 21:37:47
typedef struct_MAIN_DATA
ナニコレ?

820 名前:デフォルトの名無しさん :05/01/02 21:38:35
てかそもそもC++ならtypedefいらないし。

821 名前:デフォルトの名無しさん :05/01/02 21:42:21
入門書を買ったのですが、途中まで親切なのに
AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_
#pragma once
が突然出てきて、解説が無くて困ってます
何か良い本ないですか?

822 名前:デフォルトの名無しさん :05/01/02 21:43:10
その解説書はVC++の本なのでC++の本じゃ無いです。
違う本を買ってね。

823 名前:デフォルトの名無しさん :05/01/03 00:11:51
まさか年賀状に、

「新年あけましておめでとうございます」

なんて書いちゃった人いませんよね。


824 名前:デフォルトの名無しさん :05/01/03 00:18:49
>>823
書きましたがなにか。

825 名前:デフォルトの名無しさん :05/01/03 00:25:56
重複表現ってやつ?
俺は「新年おめでとうございます」って書いたけど

826 名前:デフォルトの名無しさん :05/01/03 00:42:18
「新年」がどうなってめでたいのか書かないとだめ。
「新年」つまり「新しい年」がめでたいのではなくて、「新年」が「あけた」事がめでたい。
「新年」自体は「あけた」という意味が付随していないから、
「新年あけましておめでとうございます。」
は全く問題ないと思う。


827 名前:デフォルトの名無しさん :05/01/03 00:45:32
「新年」に「あけた」が付随してるんじゃなくて
「あけた」に「新年が」が付随してるからダメだ、と
年賀状の書き方とかに載ってるよ

828 名前:デフォルトの名無しさん :05/01/03 00:52:19
gooの辞書によると

あ・ける 0 【明ける/空ける/開ける】
(動カ下一)[文]カ下二 あ・く
(2)時間が経過して次の新しい年・日や季節が始まる。主語を示すことはない。《明》

とのこと。主語を示しちゃいかんそうな。

829 名前:デフォルトの名無しさん :05/01/03 00:52:48
http://www.nengasyotyuu.com/nenga/nbashic/

なるほどね。OK.

830 名前:デフォルトの名無しさん :05/01/03 00:56:29
placement-newじゃないですが
void* buf = (void*)new char[sizeof(HOGE)];
Hoge* hoge = (HOGE*)buf;
hoge->hoge(); // コンストラクタ呼び出し
hoge->~hoge(); // デストラクタ呼び出し

これって大丈夫ですか?
delete hoge とかやるとデストラクタ呼び出してくれるんでしょうか。

831 名前:デフォルトの名無しさん :05/01/03 01:10:01
そいつぁやばいでしょ

832 名前:デフォルトの名無しさん :05/01/03 01:26:12
>>830
ちゃんと placement-new 使え。

833 名前:デフォルトの名無しさん :05/01/03 16:51:51
謹賀新年

 本年もご指導ご鞭撻のほどよろしくお願い申し上げます

                     2005年1月
                         ぬるぽ

834 名前:デフォルトの名無しさん :05/01/03 17:05:45
ガっ

835 名前:デフォルトの名無しさん :05/01/03 18:42:43
class NullPointerException : public std::logic_error {

836 名前:デフォルトの名無しさん :05/01/03 19:32:43
ぬるぽってlogic_errorとは限らないんじゃ・・・

837 名前:デフォルトの名無しさん :05/01/03 19:35:31
struct NullPointerException : public 2ch::nurupo {
 const char* what() { return "ガッ!"; }
};

838 名前:デフォルトの名無しさん :05/01/03 20:40:11
継承したときのコンストラクタの書き方で質問です。
親クラスParentと、そこから派生したChildがあったとして、
ChildのコンストラクタでParentのコンストラクタも呼びたい時、

Child::Child():Parent(){}
と書くのと、
Child::Child(){
    Parent::Parent();
}
と書くのでは何が違うのでしょうか。


839 名前:デフォルトの名無しさん :05/01/03 20:46:48
class NullPointerException : public ぬるぽ {
    NullPointerException(const std::string& what) throw(ぬるぽ) : ぬるぽ(0) {}
};

なぜこれが標準でないのか小一時間問いつめたい

840 名前:デフォルトの名無しさん :05/01/03 21:03:53
>>838
前者は親コンストラクタ->派生コンストラクタと呼ばれるが
後者は親デフォルトコンストラクタ->派生コンストラクタ->親コンストラクタと呼ばれる。
つーか後者みたいな呼び方っていいんだっけ?

841 名前:デフォルトの名無しさん :05/01/03 21:05:20
コンストラクタ内でthisが絡む事はやっちゃいけないんじゃなかった?

842 名前:デフォルトの名無しさん :05/01/03 21:08:18
>838 後者はコンパイラによって暗黙的に次のようなコードになる。

843 名前:デフォルトの名無しさん :05/01/03 21:09:24
// 途中で送信しちまったorz
Child::Child() : Parent() {
    Parent::Parent();
}

だから、親クラスのコンストラクタを2回呼び出していることになる。

844 名前:デフォルトの名無しさん :05/01/03 21:11:20
貴様らにイイ事を教えてやろう。いや、お前らにとってはバッドニュースになるかな?ククク…。
昨日の練習で俺はボクシングを完全に理解した。なにせボクシングビデオの技はもう全て使いこなせるからな。
ジャブからパリングまで完璧だ。
連れに受けてもらったが全然俺のパンチがかわせない。
スパーリングって奴だな。
もちろん連れの撃つ素人パンチは全然当たらない。
今の俺はプロレヴェルに達してる。

845 名前:デフォルトの名無しさん :05/01/03 21:11:51
>>838
前者の形でしか呼べませんです。
後者は Parent クラスの一時オブジェクト(this の異なる他人)を作ってるだけだよ。


846 名前:デフォルトの名無しさん :05/01/03 21:14:52
>>844
SUGEEEEEEEEEEEEWEWWEEEE!!!!!!!

847 名前:デフォルトの名無しさん :05/01/03 21:15:33
>840-843
No

・・・って答えかかれちゃった

848 名前:838 :05/01/03 21:16:22
なるほど分かりました。
親クラスのコンストラクタは、普通の関数のように呼び出してはいけないんですね。
ありがとうございました。

849 名前:デフォルトの名無しさん :05/01/04 04:23:58
#define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } }

というマクロはもしinline関数に直すとすると

inline void safe_delete(void* ptr)
{
delete ptr;
ptr = NULL;
}

これでいいのでしょうか?
NULLポインタはdeleteしても問題ないそうなのでif文は省略しました。

850 名前:デフォルトの名無しさん :05/01/04 04:27:11
>>849
駄目。
駄目だからこそマクロが未だに存在する。

851 名前:デフォルトの名無しさん :05/01/04 04:31:16
>>849
template <class T>
inline void safe_delete(T*& p)
{ delete p; p = 0; }

これで無問題

852 名前:デフォルトの名無しさん :05/01/04 04:31:45
>>850
即答ありがとうございます。
素直にマクロ使うことにします。

853 名前:デフォルトの名無しさん :05/01/04 04:33:48
俺なら>>851を使うかな…

854 名前:デフォルトの名無しさん :05/01/04 04:38:45
>>851
テンプレートを使うことは考えましたが、ポインタへの参照を使うとは盲点でした。
修行が足りませんですね。回答ありがとうございました。

855 名前:デフォルトの名無しさん :05/01/04 04:41:56
SAFE_DELETRマクロとの互換性を考えないなら
template <class T>
inline void safe_delete(T** p)
{ delete *p; *p = 0; }

int* hoge = new int;
safe_delete(&hoge);
でもいいんだけどね

あと
>ptr = NULL;
はローカル変数を変えてるだけだから意味ないよ

856 名前:デフォルトの名無しさん :05/01/04 04:47:19
これは初歩的なミスを…
逝って来ます。

857 名前:デフォルトの名無しさん :05/01/04 06:16:40
namespaceごとにフォルダを作ってそこにソースを格納した方がいいのでしょうか?
例えば
namespace foo 内にかかれたライブラリ(のソース)は /foo に、
namespace bar 内にかかれたライブラリ(のソース)は /bar に配置、といった具合です。

858 名前:デフォルトの名無しさん :05/01/04 08:45:14
type_infoのコピーコンストラクタや代入演算子が
private属性に制限されている理由を教えてください。
よろしくお願いします。

859 名前:デフォルトの名無しさん :05/01/04 08:52:27
>>858
代入などがしたければ type_info へのポインタを使えば十分だから。

860 名前:デフォルトの名無しさん :05/01/04 08:53:21
> safe_delete
std::auto_ptr 使え。

861 名前:デフォルトの名無しさん :05/01/04 09:08:50
>>857 良い心がけだと思う。

862 名前:デフォルトの名無しさん :05/01/04 11:00:54
>>858
理由はない。設計者がヘボだっただけだ。

863 名前:デフォルトの名無しさん :05/01/04 13:26:28
>>862
(;´Д`)

864 名前:デフォルトの名無しさん :05/01/04 14:01:24
>>858
太陽が黄色かったから


865 名前:デフォルトの名無しさん :05/01/06 03:18:44
こいつは見逃せないぜ。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1683.html

866 名前:デフォルトの名無しさん :05/01/06 03:32:05
微妙に今更感も漂うけどね。

867 名前:デフォルトの名無しさん :05/01/07 23:30:42
std::ofstream fd( "hoge" );
に文字列を書き出します。
fd << "hoge\n"と
fd<< "hoge" << std::endl;
を比較すると(試したのはもう少し複雑ですが\nをstd::endlに置き換えると)
1.6倍くらい遅くなりました。こういうものなのでしょうか?なんか対策はないですか?
環境は、IntelC++のver.8です。


868 名前:デフォルトの名無しさん :05/01/07 23:38:45
>>867
それはendlにはバッファのフラッシュの機能が含まれているからです。
よって"hoge\n"だけでは表示されない場合があります。逆に言えば、
何度も改行を行う場合には'\n'の出力によって行い、最後にcout << flush;
とした方が、バッファのフラッシュを一度しか行わず、一般的に処理が
高速になります。

869 名前:デフォルトの名無しさん :05/01/08 00:04:57
>>868 早速のお返事有難うございました。
しかし、cのFILEよりもc++のofstreamはかなり遅いですね。
test-cpp.cpp
#include <fstream>
int main( void ) {
std::ofstream fd( "hoge" );
for ( std::size_t i( 0 ); i < 10000000; ++i ) {
fd << "hoge\n";
}
return 0;
}

test-c.cpp
#include <stdio.h>
#include <stdlib.h>
int main( void ) {
FILE *fd( fopen( "hoge", "w" ) );
for ( unsigned int i( 0 ); i < 10000000; ++i ) {
fprintf(fd, "hoge\n" );
}
return 0;
}

をコンパイルして速度を比較してもFILE*の方が2倍近く速度が出ました…

870 名前:デフォルトの名無しさん :05/01/08 00:06:09
まあ使い分けろってこった

871 名前:デフォルトの名無しさん :05/01/08 02:07:18
>>869
STLportのファイル入出力はかなり速いぞ。

872 名前:デフォルトの名無しさん :05/01/08 07:15:15
>>869
cygwin gcc 3.3.3 で /dev/null に対してテストしてみた。
c : cpp = 3 : 4
くらいだった。

2、3段関数呼び出しがはさまったていどじゃ、
こんなに差は出ないよな?
具体的なオーバーヘッドって、なんだろう。

873 名前:デフォルトの名無しさん :05/01/08 12:17:13
拡張性、柔軟性を高めてるんだから、その分遅くなるのもしょうがない。

void load(FILE *fp);
こんな関数ではファイル、stdinくらいしか渡せないが

void load(istream &is);
この関数にはファイルもstdinも文字列ストリームも(自作すれば)TCPストリームでも、
istreamを継承したものならなんでも渡せる。


柔軟性なんかいらない、スピードだけが欲しい、というのならfopen使っとけ。

874 名前:デフォルトの名無しさん :05/01/08 12:40:54
>>872
最適化してその結果?
つーか、gccだと単純なfprintf()はfputs()呼ぶからなぁ。

875 名前:デフォルトの名無しさん :05/01/08 13:22:10
std::cout << "hoge\n";でもいっぺんデバッガで追ってみれば遅くて当然と納得できるだろ。

876 名前:デフォルトの名無しさん :05/01/08 18:03:52
Metrowerks CodeWarrior for Windows v8.3
c:cpp = 6453:7297

877 名前:デフォルトの名無しさん :05/01/08 22:07:44
参考までに、
minGW, VC7で iostream VS FILE* 試してみたけど
バイナリ入出力では誤差ぐらいしか違わんかった。


878 名前:デフォルトの名無しさん :05/01/08 22:24:55
>>877
じゃあ、問題は iostream の方じゃなくて、string の側にあるってことか。
まあ、string は機能性重視のクラスだしね。

879 名前:デフォルトの名無しさん :05/01/09 01:56:46
stringの実装は大きく違うからねぇ
VC6と7.xでも確か変わらなかったっけ?
短文用のバッファが導入されたとか

880 名前:デフォルトの名無しさん :05/01/09 02:01:47
std::string って copy-on-write?

881 名前:デフォルトの名無しさん :05/01/09 02:03:08
実装次第。VC++7.1付属のものはCOWじゃない。

882 名前:デフォルトの名無しさん :05/01/09 03:28:14
VC6 に string::clear がなかったのには驚いた
おかげで全部 string::erase に書き換え…

883 名前:デフォルトの名無しさん :05/01/09 03:41:30
VC6だったらstlport使うから無問題だろ

884 名前:デフォルトの名無しさん :05/01/09 03:42:17
まあ、10年近く前のコンパイラだし。許したれ。
C++のISO標準もまだできてない頃だったと思うし。

885 名前:デフォルトの名無しさん :05/01/09 04:03:08
ようするにC++じゃないってことだろ?
さっさと2003に乗り換えなさい

886 名前:デフォルトの名無しさん :05/01/09 04:11:09
とりあえずコンパイラをVCTKのに。

887 名前:デフォルトの名無しさん :05/01/10 14:56:06
fstream にてファイルのステータス等を調べるにはどうしたらよいでしょうか?

ちょっくら調べたのですが Cでいうところの fstatのようなのが見つからないです。

888 名前:デフォルトの名無しさん :05/01/10 14:57:48
fstatって標準関数じゃないような…?

889 名前:887 :05/01/10 15:15:06
標準関数では
_stat
_stat64
_stati64
_wstat
_wstat64
_wstati64
_fstat
_fstat64
_fstati64
とかいっぱいあるのはわかっているのですが、あくまでもC標準関数なので・・

fstreamクラスのメソッドとしては実装されていないんでしょうか?

こんな感じで使えないのかな、と思いまして・・・

fstream testfile(c:\hoge.data);

stat_t file_info;

testfile.stat(&file_info);



890 名前:887 :05/01/10 15:16:16
>fstream testfile(c:\hoge.data); ×
fstream testfile("c:\hoge.data");

ないのであればfstatにしておきます〜

891 名前:デフォルトの名無しさん :05/01/10 15:20:16
Cの標準関数じゃないって

892 名前:887 :05/01/10 15:22:44
え?そうなんですか?
よくわかってなくてすいません;;

893 名前:デフォルトの名無しさん :05/01/10 15:28:13
Cの標準関数じゃないから、C++の標準関数にも入ってない

894 名前:887 :05/01/10 15:38:48
あ〜そういえばPOSIXでしたね・・・

895 名前:デフォルトの名無しさん :05/01/10 16:22:17
「そういえば」って、おまえ・・・

896 名前:デフォルトの名無しさん :05/01/10 16:51:25
久しぶりに痛い香具師を見たな。

897 名前:デフォルトの名無しさん :05/01/10 17:32:00
>>889
標準関数かどうか確認できる資料くらい揃えとけ
http://www.jsa.or.jp

C++ は ISO/IEC14882 もしくは JIS X3014
C は ISO/IEC9899 もしくは JIS X3010

898 名前:デフォルトの名無しさん :05/01/10 20:39:59
>>897
なんか有料になってるな

899 名前:デフォルトの名無しさん :05/01/10 20:43:02
失敬閲覧可能なのはこっちか
http://www.jisc.go.jp/

900 名前:デフォルトの名無しさん :05/01/10 20:49:32
<boost/regex.hpp>
をインクルードした状態で
fopen とか memset とか使うと
「オーバロード関数の呼び出しが解決できません」
と出るんだけど、回避策を知ってる人いませんか?

901 名前:900 :05/01/10 20:51:57
ごめん、自己解決しました
::fopen
とか書くと解決できるみたいです
なんかめんどいけど・・・

902 名前:デフォルトの名無しさん :05/01/10 21:14:31
>>901
× ::fopen

#include <cstdio>
#include <cstring>

std::fopen
std::memset

903 名前:デフォルトの名無しさん :05/01/11 01:01:01
ttp://jp.thespoke.net/MessageBoard/MessageBoard_ViewThread.aspx?postid=486

あの似顔絵ウィザードも含めて、HomeStyle+ って
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.NET Framework で書かれてるんですね。。。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
逆アセンブルしてみたら気づきました・・・・。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ああいうのを作品に組み込むのも面白いかも(笑)

MSの製品を逆汗するような奴をMSはMVPに選んでいるんです。MSは逆汗を認めていると

904 名前:デフォルトの名無しさん :05/01/11 13:57:42
001.hに
#define TATE 10があって、
int intarray[TATE];のような形で利用してるんですが、

001.cppにも
#define TATE 10があってそれを使っているんですよ。

どちらか片方から 10 という定数を消す方法は無いですか?
ちょっと変えたいときに*.cppと*.h両方変えるのが面倒なんです。

VC++6とBCCを使用してます。

905 名前:デフォルトの名無しさん :05/01/11 14:43:58
>>904
001.cppで001.hを#includeしちゃだめなのか?

906 名前:904 :05/01/11 15:00:22
>905
001.hを#includeすれば001.cppに書く必要は無いんですね。
目から鱗が垂直離陸。

907 名前:904 :05/01/11 15:00:57
途中で送信してしまいました。ありがとうございました。

908 名前:デフォルトの名無しさん :05/01/12 02:32:29
垂直離陸いいなw

909 名前:デフォルトの名無しさん :05/01/12 21:52:35
#ifndef TAKE
#define TAKE 10
〜〜〜〜〜
#endif

こんな方法もある

910 名前:デフォルトの名無しさん :05/01/12 22:17:01
>>909
インクルードガードかよっ!

911 名前:デフォルトの名無しさん :05/01/12 23:12:51
それを書くなら
#ifndef TATE
#define TATE 10
#endif
だな。

912 名前:デフォルトの名無しさん :05/01/13 00:26:22
>>909
っつーか、そもそも ANSI C++ の規格上、同じマクロを二回定義しても問題ないぞ。
値が違う (#define TATE 10 と #define TATE 5 とか) のはダメだが。

913 名前:デフォルトの名無しさん :05/01/13 02:51:03
#define TATE
だけでいいんじゃね?値なんてどうでも良いし。

914 名前:デフォルトの名無しさん :05/01/13 02:51:25
ageちまった。スマソ

915 名前:デフォルトの名無しさん :05/01/13 08:07:36
質問読めよ池沼

916 名前:デフォルトの名無しさん :05/01/13 16:43:44
インクルガードじゃねーのか。スマソ

917 名前:デフォルトの名無しさん :05/01/15 01:12:51
最近スレが閑散としてますね

918 名前:デフォルトの名無しさん :05/01/15 02:55:00
下ネタかよ...orz

919 名前:デフォルトの名無しさん :05/01/15 12:37:51
参照渡しって結局ポインタを渡すからコストはポインタ渡しと変わらないんでしょうか?
それともインライン展開のことを考えるとポインタたどらなくていい参照渡しの方がいいんでしょうか?

920 名前:デフォルトの名無しさん :05/01/15 13:12:07
参照もポインタ辿るよ

921 名前:デフォルトの名無しさん :05/01/15 13:55:40
¬¬

922 名前:デフォルトの名無しさん :05/01/15 14:11:57
スレ違いで申し訳ないのだが、お尋ねしたいことがあります。
一番初めに学ぶべき言語はなんですか?(HTML除く)

923 名前:デフォルトの名無しさん :05/01/15 14:15:11
>>922
もう来なくて結構ですから。
すれ違いですから。
いけませんから。

924 名前:デフォルトの名無しさん :05/01/15 14:18:42
最初に学ぶべきなのは日本語。
次は英語。

925 名前:デフォルトの名無しさん :05/01/15 14:19:13
>>922
ニホンゴワカリマスカ?

926 名前:デフォルトの名無しさん :05/01/15 14:34:19
な、何だ!この青汁みたいな色のスレッドは!

927 名前:デフォルトの名無しさん :05/01/15 14:36:09
>>922
俺はだまされないぞ。
お前は埋め厨だろう?そうだろう?そうだといえ!

928 名前:デフォルトの名無しさん :05/01/16 01:46:25
ちょいと質問。
complexのようなtemplate classで、座標値をあらわすようなものはないだろか。
complexでも悪くないのだけれど、公開メンバx,yがあるようなのがいいなぁと。
いやまぁ、標準ならそれを使うし、boostならそれをパクるし、そうでないなら自作するのだけれど。


929 名前:デフォルトの名無しさん :05/01/16 01:48:43
>>928
pair

930 名前:デフォルトの名無しさん :05/01/16 01:53:07
>>929
first, secondをx, yの代わりに使うのか?

931 名前:デフォルトの名無しさん :05/01/16 01:54:09
>>928
boost::tuples::tuple


932 名前:デフォルトの名無しさん :05/01/16 01:57:45
>>930
そういう事になるな。3次元への拡張性はないけれど。

933 名前:デフォルトの名無しさん :05/01/16 02:18:24
>>929-932
レス感謝。
tupleを持ち出すのもpairを使うのもI/Fがオーバスペックな気がするので
complexの実装見ながらもう少し考えてみる。

934 名前:デフォルトの名無しさん :05/01/16 10:01:43
>>932
pair<x, pair<y,z> >

935 名前:デフォルトの名無しさん :05/01/16 11:24:51
>>934
w


936 名前:928=933 :05/01/16 14:31:26
要求仕様見ながら実装してたらなんだかMFCのCPointのようになって来た悪寒。
あっちは整数だったと思ったけど。


937 名前:デフォルトの名無しさん :05/01/16 16:10:45
class TestA{
public:
TestA() {
a = new int;
}
~TestA() {
delete a;
}
int *a;
};
class TestB : public TestA{
public:
TestB() {
b = new int;
}
TestB(const TestB& B) {
b = new int;
*b = *B.b;
}
~TestB() {
delete b;
}
int *b;
};
main() {
TestB a;
TestB b = a;
}

というプログラムで何故コピーコンストラクタでTestAクラスのメンバのaに別のアドレスを割り当てなくても大丈夫なのでしょうか?
C言語なら俺に聞け!スレでスレ違いと言われたのでこちらに来ました

938 名前:デフォルトの名無しさん :05/01/16 16:14:32
大丈夫じゃないだろ
main()
{
TestB *a = new TestB();
a->a = 100;
TestB b = *a;
delete a;
cout << b.a << endl;
}
ってやってみ

939 名前:デフォルトの名無しさん :05/01/16 16:25:42
>>937
TestB b = a;
ではTestAのデフォルトコンストラクタ->TestBのコピーコンストラクタと呼ばれるから
TestA::a自体は有効なアドレスを示してる。
アドレスが指してる先の値はコピーされてないけどな。

940 名前:デフォルトの名無しさん :05/01/16 16:27:29
なるほど
ありがとうございました

941 名前:デフォルトの名無しさん :05/01/16 16:32:47
デストラクタが必要なクラスは必ずコピーコンストラクタと代入演算子が必要
http://c2.com/cgi/wiki?RuleOfTheBigThree

942 名前:デフォルトの名無しさん :05/01/18 03:51:28
あるソフトのプラグイン用のDLLを作成しているのですが
いままでC言語(C++ではない)形式で作っていました。

複雑になってきたので、処理の一部をC++で書き換えたところ
うまく関数をエクスポートできなくなってしまいました。

インターフェイス部分のみCで、内部の処理をC++で書きたい場合は
どのようにすればいいのでしょう?


943 名前:デフォルトの名無しさん :05/01/18 06:10:22
extern "C"のことを聞いてるのか?
それともどういったかんじで関数を処理すればいいのかという話か?

944 名前:デフォルトの名無しさん :05/01/18 07:08:53
942です

いままでaaa.cですべてまかなっている状態だったのを
内部の処理のほとんどの部分を新規にbbb.cppに作り直して
aaa.cとbbb.cppの二つのファイルにし
エクスポートする関数はいままでと同じ書式のままaaa.cに残したいのですが
aaa.cからbbb.cppのクラスを呼ぶことができません
C言語とC++との混在している状態でコンパイルするのは不可能ですか?

945 名前:デフォルトの名無しさん :05/01/18 08:23:31
>>944
そりゃ、aaa.c はC言語だから、クラスは使えないね。
そんなときは extern "C" 使ってくっつける。

// bbb.h
#if !defined(__cpluplus)
extern "C" {
#endif

int bbb_xxxx( int a , int b );

#if !defined(__cpluplus)
}// extern "C"
#endif

// bbb.cpp
#include "bbb.h"
class bbb {...};
int xxxx( int a , int b )
{
 bbb b( a );
 return b.xxx( b );
}

// aaa.c
#include "bbb.h"


946 名前:デフォルトの名無しさん :05/01/18 20:22:19
942です
externで検索していろいろ調べてみました

CとC++ではリンゲージというものが違うようですね
extern "C"を指定してエクスポートすることで
あえてaaa.cのほうは使う必要がなくなったので
bbb.cppのほうからextern "C"にてエクスポートすることにしました。

大変参考になりました。ありがとうございます


947 名前:デフォルトの名無しさん :05/01/19 00:05:44
ビャーン先生がD&Eの前書きでこてこてなjava批判してたねぇ

948 名前:デフォルトの名無しさん :05/01/21 00:25:19
まだ読んでないんだけどどんな批判なの?

949 名前:デフォルトの名無しさん :05/01/21 00:30:28
ツルピカ

950 名前:デフォルトの名無しさん :05/01/22 17:03:44
C++にもスレッド入らないかな?

951 名前:デフォルトの名無しさん :05/01/22 17:38:26
もしかしてタスクスケジューラを C++ で書いてる例か?

952 名前:デフォルトの名無しさん :05/01/22 18:08:48
class BASE{
public:
  virtual void out(int n = 0){ 〜; }
  virtual void out(void){ 〜; }
};

class A1 : public BASE{
public:
  void out(void){ 〜; }
};

int main()
{
  A1 a;
  a.out();
  a.out(2);  // ←コンパイルエラー

  return 0;
}


これってなんでコンパイル通んないんでしょう?
MSVC .NET使ってます。

953 名前:デフォルトの名無しさん :05/01/22 18:13:29
>>952
通らない。
http://www.fides.dti.ne.jp/%7Eoka-t/cpplab-hide-overload.html

あと、引数のない関数を定義するのに void って書くの気持ち悪いからやめれ。
あと、デフォルト引数とオーバーロードを一緒に使うのやめれ。

954 名前:デフォルトの名無しさん :05/01/22 18:14:27
out(void)がBASE::(int)を隠しているから
隠すなら private に明示的に using する
隠したくないなら public に using する
はっきり汁!

955 名前:デフォルトの名無しさん :05/01/22 18:18:42
>>952
名前解決の順序が、引数型によらず

1. まず最も内側のスコープ内 (この場合だと A クラス内部) で探す
2. 見つからなかったら、一つ外のスコープ (この場合だと BASE) で探す

でリストアップしてきて、その中から引数型が合うものを選択するため。
そうなってる理由はともかく a.out(2) で BASE::out(int)を呼び出したければ
class A1 の定義中で using BASE::out; しとけば OK。

あと BASE::out() は BASE::out(int n = 0) と BASE::out(void) どちらを呼んで
欲しいのか意図が謎。なおした方が良いと思うぞ。

956 名前:デフォルトの名無しさん :05/01/22 18:27:19
>あと、引数のない関数を定義するのに void って書くの気持ち悪いからやめれ。
エー

957 名前:952 :05/01/22 18:36:27
>>953-955
ほんとありがとうございます。よーく分かりました。

>デフォ引数
色々実験してる内に付けてしまったもので、投稿前に消し忘れてました。スマソ
あいまいになる!って突っ込まれるなあと思ってました。。。
何はともあれ、明快な解答ありがとうございました!

958 名前:デフォルトの名無しさん :05/01/22 18:52:39
>>956
エー、じゃない。おまいはCプログラマか。

959 名前:デフォルトの名無しさん :05/01/22 19:07:38
extern "C" のときは書いてる >(void)

960 名前:デフォルトの名無しさん :05/01/22 20:28:54
>>950
そんなあなたにboost::thread

961 名前:デフォルトの名無しさん :05/01/22 20:33:36
>>960
使ってるけど全然だめぽ
おとなしく言語仕様に取り入れてほしい

でも時期標準のリストにはスレッドのスの字も無かったっけ…orz

962 名前:デフォルトの名無しさん :05/01/22 20:36:29
極力機種依存を避けてる以上無理だろねぇ

963 名前:デフォルトの名無しさん :05/01/22 21:02:10
実装レベルをいくつかに分けるとか、
モジュールに分けたりとかして、
実装がサポートする範囲を選べるようにできないかなぁ……

やっぱ無理かなぁ……

964 名前:デフォルトの名無しさん :05/01/22 21:07:43
せめて synchronized, wait, notify, notifyAll, join だけでもサポートして欲しい

965 名前:デフォルトの名無しさん :05/01/22 21:09:52
おとなしくjava使えよハゲの下僕ども

966 名前:デフォルトの名無しさん :05/01/22 21:13:41
>>961
何がダメなん?

967 名前:デフォルトの名無しさん :05/01/22 22:12:58
>>961
無理だろうな。D&E でも Bjarne が「並列処理を必要とするアプリケーションは
多いが、そのための唯一の支配的な方式はない」と断言してる。

C++ の用途は数値計算からオフィススイート、データベースエンジン、OS、
ゲームまで幅広い。特定のプログラミングスタイルや、目的に特化した機能は
現状の C++ の利点を殺すことになるから、まず入らん。

968 名前:デフォルトの名無しさん :05/01/22 23:04:09
>>963
実装レベルを分けるってのはいいね。
EC++の逆ね。やって欲しいな。

969 名前:デフォルトの名無しさん :05/01/23 00:33:47
質問なんですけど、

class MyString {
string *pstr;
public:
MyString(const MyString ©) {
pstr = new string;
*pstr = *copy.pstr; // ←この部分
}
string *GetString() const { return pstr; }
}

*pstr = *copy.pstr;
この記述はなんでコンパイルエラーにならないんですか?
*pstr = *copy.GetString();
じゃなきゃだめだと思うんですが。
ちなみにコンパイラは BCC5.5 です。

970 名前:デフォルトの名無しさん :05/01/23 00:37:14
>>969
クラスの定義内では自分自身と同じ型の変数はprivateでも丸見えだよ。

971 名前:デフォルトの名無しさん :05/01/23 00:40:15
C++的にOKだからココンパイルエラーにならないんだよ坊や

972 名前:デフォルトの名無しさん :05/01/23 00:50:09
落ち着け坊や

973 名前:969 :05/01/23 00:54:17
( ・∀・)つ〃∩ ヘェー
どうもありがとうございました

974 名前:デフォルトの名無しさん :05/01/23 00:54:36
privateの仕様:
「メンバへのアクセスが制限され、
そのクラスのメンバ関数とフレンド以外はアクセスできなくなる。」


【クラス】とは書かれているが、【インスタンス】とは書かれていない。
詐欺的表現にも見えるが、所詮、騙される方が悪い。

975 名前:デフォルトの名無しさん :05/01/23 01:00:06
なぜ C++ は以下のように浮動乗数点数の定数を定義できない仕様にしたのでしょうか?
struct X {
static const int i = 100; // OK
static const float pi = 3.1416f; // error
};


976 名前:デフォルトの名無しさん :05/01/23 01:02:44
むしろprotectedのときに引っかかるんだな。
基底クラスのprotectedメンバに触れるのは
自分自身と同じ型を参照しているときだけってのに
気が付かないで基底グラス型を参照しながら、
「protectedメンバに触れねぇぞ、なんじゃこらぁ!」

977 名前:デフォルトの名無しさん :05/01/23 01:13:02
>>975
質問がおかしい。static constな整数型のみクラスボディで初期化可能なのであって、
それ以外の静的データメンバはクラスボディの外側で初期化しなければならない。

だからstatic const intが特別な例外なのだ。

978 名前:デフォルトの名無しさん :05/01/23 01:17:50
>>975
「なぜ Bjarne は」もしくは「なぜ WG21 は」じゃないか?

979 名前:デフォルトの名無しさん :05/01/23 01:26:15
昔はFPUがなかったりして浮動小数点の処理がいちいち関数だったりしたからじゃないか?

980 名前:デフォルトの名無しさん :05/01/23 01:32:49
不動小数点数がコンパイル時定数である必要性が無いからかな

struct X {
static const int i = 100; // OK
static const float pi;
};

const float X::pi = 3.14f; //OK

これでいいだろ。:

981 名前:デフォルトの名無しさん :05/01/23 02:11:05
>>980
ヘッダで定義できないのは嫌じゃないか?

982 名前:デフォルトの名無しさん :05/01/23 02:19:20
ヘッダとでバラバラに書くのが鬱陶しいよな
C++ FAQ ではヘッダに書けるもんはヘッダに書けばいいって書いてたけど

983 名前:デフォルトの名無しさん :05/01/23 02:59:33
float pi() {return 3.1416f;}

984 名前:デフォルトの名無しさん :05/01/23 03:02:24
>>981
定数を返す関数を淫乱にすればいい

985 名前:デフォルトの名無しさん :05/01/23 03:02:33
数値を見てそれと分かるんだから
#define PI 3.1415f

986 名前:デフォルトの名無しさん :05/01/23 03:06:54
>>985
float 限定やだ
それがたとえ long double 限定でも同じこと

987 名前:sage :05/01/23 03:39:32
Task.hで
class Task{
...
}

Task.cppで定義する
んでもって
Enemy.hで
#include "Task.h"
  class Enemy:public Task{←ここでエラー
...
}

"型名が必要" とエラーになってしまします。
どういうことでしょうか?ご助力お願いします。
BccとBccdev使ってます。


988 名前:デフォルトの名無しさん :05/01/23 03:43:36
>>987
class Task {
...
}; ←このセミコロンを忘れているというオチじゃないよね?

989 名前:デフォルトの名無しさん :05/01/23 03:44:17
そろそろ次スレの季節なの?

990 名前:987 :05/01/23 03:53:40
すいません、大丈夫です・・・
書くの忘れてました

991 名前:デフォルトの名無しさん :05/01/23 04:20:57
>>990
俺の所ではエラーでないぞ。ソース全部晒してみろ。

992 名前:デフォルトの名無しさん :05/01/23 05:05:18
次スレのタイトルはスレが乱立しないように
C++相談室(STL含む) part39
でよろしく


993 名前:デフォルトの名無しさん :05/01/23 10:07:20
>>975
enumとの互換性を保つ為に、クラスボディで整数型のみ初期化可能にした

994 名前:デフォルトの名無しさん :05/01/23 10:33:05
C++相談室(STL,template含む) part39

995 名前:デフォルトの名無しさん :05/01/23 10:40:25
STLつかうと一気に実行ファイルサイズが10倍に?!

996 名前:デフォルトの名無しさん :05/01/23 10:44:32
>>992
STL含むって言うけどさ>>1
「テンプレートライブラリ(STL含む)に関する質問は専用の別スレにお願いッス。」
って書いてあるのはどうする?

templateスレの次スレのスレタイにSTLを入れてもらう方がいいんじゃないか?

997 名前:デフォルトの名無しさん :05/01/23 11:05:55
そのうち関数スレとかクラススレとか・・・・ もうアフォかとヴァカかと

998 名前:デフォルトの名無しさん :05/01/23 13:17:23
>>997
はぁ?お前が馬鹿でアホだろ。C++より長いCでもそんなスレできてねーだろタコ。




と煽ったからって自分で糞すれ立てたりするなよ。馬鹿は困るねぇ。

999 名前:デフォルトの名無しさん :05/01/23 13:18:34
999

1000 名前:デフォルトの名無しさん :05/01/23 13:19:12
rubyyyyyyyyyyyyyyyyyyyy!!!!!!!!!!!


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