トップページ⇒tech
1001コメント302KB

C++相談室 part34

■ このスレッドは過去ログ倉庫に格納されています
0001v(^・^)vNGNG
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いッス。

過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0083デフォルトの名無しさんNGNG
>>80
そうか?アセンブラ知っていればCは楽勝。とくにポインタでつまづくことがない。
0084デフォルトの名無しさんNGNG
>アセンブラ知っていればCは楽勝

そうかなぁぁぁぁ?
0085デフォルトの名無しさんNGNG
>>84
アセンブラ理解できるセンスがあればCは理解できそうな気がする。
C++はまた別のセンスが必要だけど。
0086デフォルトの名無しさんNGNG
センスってなんだ。
勉強すりゃ誰でもできるわ。
0087デフォルトの名無しさんNGNG
>>86 は世間知らず。
困ったことに勉強しても出来ない奴はごまんといます。
0088デフォルトの名無しさんNGNG
>>85
センスというか相性だね。C++やり始めたらあまりの難しさに根をあげてしまう香具師は
いくらでもいる。反対にそんなに難しく感じずあっさりと身につけてしまう香具師もいる。
>>86
考え方が甘い
0089デフォルトの名無しさんNGNG
センスが要求されるのはある程度より深いところの話で、普通に使うだけならちゃんとした学習すれば誰にでも出来る。
0090デフォルトの名無しさんNGNG
できない人間はセンスだとか抽象的な表現を使う法則。
0091デフォルトの名無しさんNGNG
>>86>>89
君はどうも努力万能主義だね。君の考え方に従えば、100人いれば100人が
努力すれば全員東大に合格して、エリートコースを歩めるという風に読める。

で、君は無事に東大を卒業してエリートコースを歩いているかね?それとも
ただの妄想ですか?ププ
0092デフォルトの名無しさんNGNG
>>91
そんなに難しいことかい?
0093デフォルトの名無しさんNGNG
>>92
東大卒ですか?
0094デフォルトの名無しさんNGNG
>>91
努力すれば誰でも東大に受かるなんて風には、とても読めませんが。
0095デフォルトの名無しさんNGNG
>>91
F1は誰にでも乗りこなせるものじゃないが、運転免許程度なら取れん奴のほうが珍しいだろ。
0096デフォルトの名無しさんNGNG
C++は神に選ばれたものだけが使えるエリート専用言語なんだよ
0097デフォルトの名無しさんNGNG
>>94>>95
同一人物ですか。東大とは拡大解釈しすぎかもしれんが、だからと言って君は
C++を舐めすぎ。エピステーメーみたいになれるんかよ?
009894NGNG
>>97
同一人物じゃないし、C++を舐めてはいない。
妄想もたいがいにな。
0099デフォルトの名無しさんNGNG
ちゅうか>>86はアセンブラの事かと思てたが
0100デフォルトの名無しさんNGNG
>>98
妄想はお前の方。逃げるなよ。誰も脳無しのお前を責めたりしないから。
010194NGNG
>>100
へぇ。俺はどんな妄想したんだ?
0102デフォルトの名無しさんNGNG
マ板でやれよ
0103デフォルトの名無しさんNGNG
まぁ、夏だからな
010494NGNG
あぁ、ヘンな奴の相手してしまった。
0105デフォルトの名無しさんNGNG
100は逃げました
0106デフォルトの名無しさんNGNG
>>101
同一人物なのにそうでないと言い逃れするとはチキンな野郎だ。
嘘つきは相手をしても無駄なエネルギーを使うだけなので放置。
0107デフォルトの名無しさんNGNG
そこまでC++を使えることが特別なことだと思わないとアイデンティティ保てない>>91=>>97=>>100=>>106って可哀相だな。同情する。
010894NGNG
OK。95には悪いが、俺=95ってことでこの話題終了。
0109デフォルトの名無しさんNGNG































0110デフォルトの名無しさんNGNG































0111デフォルトの名無しさんNGNG
夏満開
0112デフォルトの名無しさんNGNG
ぁぁデムパに構いたい
0113デフォルトの名無しさんNGNG
嘘つきは、泥棒の始まり。
0114デフォルトの名無しさんNGNG
2chの電波は単なる子供の場合が多いから、もっと優しくしてやれよ。
0115デフォルトの名無しさんNGNG































0116デフォルトの名無しさんNGNG
char_traits<T>::copyとchar_traits<T>::moveってどうちがうんですか?
どっちもバッファのオーバーラップが許されないとあるのですが、
だったらmoveの意義が無い気がするのですが。
0117デフォルトの名無しさんNGNG
>>116
氏ね。そうすれば悩まなくて済む。
0118デフォルトの名無しさんNGNG
>>114
お前自身が子供のようにな。
0119デフォルトの名無しさんNGNG
ttp://tmp4.2ch.net/test/read.cgi/download/1091536277/515
すいません、この人を引き取ってもらえませんか?
0120デフォルトの名無しさんNGNG
男割だ
0121デフォルトの名無しさんNGNG
>>119
明らかにスレ違いだハゲ
0122デフォルトの名無しさんNGNG
>>116
moveは重なってても大丈夫のはず。
何の記述を見たのですか?
0123デフォルトの名無しさんNGNG
>>82 日本語の勉強も必要なんすかぁ〜 了解です!
Cと日本語がんばります! ありがとうございました。
0124デフォルトの名無しさんNGNG
>>122
VC6に付いてるMSDNには許されないと書いてあるな。
0125デフォルトの名無しさんNGNG
>>124
オンライン版(英語)を見た。→ttp://msdn.microsoft.com/library/en-us/vclang98/html/STRING2_CHAR_TRAITSCCMOVE.asp
"The source and destination may overlap." と書いてある。
日本語訳が間違ってるのかな?
0126デフォルトの名無しさんNGNG
>>116
オーバーラップがないのが確実なら
オーバーラップが許されないほうを使うほうが速い。それだけ
0127デフォルトの名無しさんNGNG
>>126
なにいってんだ
0128126NGNG
>>127
なんか変だった
ttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vcstdlib/html/vclrf_string_chartraitsmove.asp
ttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vcstdlib/html/vclrf_string_chartraitscopy.asp
copyはsequences must not overlap
moveはpossibly overlapping sequence.
0129デフォルトの名無しさんNGNG
VC6 MSDNの和訳ミスということで。
0130デフォルトの名無しさんNGNG
こんな程度、訳せないようじゃあ、他のところも全く信用できないな。
0131デフォルトの名無しさんNGNG
まあ、原文が間違ってるところもあるし。
0132デフォルトの名無しさんNGNG
ファイルサイズを取得するにはどうすればいいのですか?
今はifstreamでファイルをオープンして最後までなめる処理を
してるんですがあまりにもナンセンスなんで・・・

string strLogFileName = "hogehoge.txt";
ifstream in;
in.open(strLogFileName.c_str(), ios::in);
if (in.is_open())
{
 // サイズを見る
 uint nCount = 0;
 char c;
 while (!in.eof())
 {
  in.get(c);
  nCount++;
 }
}
in.close();
cout << nCount << endl;
0133132NGNG
あ、最後の出力のとこがnCountのスコープはずれてましたね。
0134デフォルトの名無しさんNGNG
std::ifstream i(strLogFileName.c_str(), std::ios::binary);
if (i.is_open()) {
i.unsetf(std::ios::skipws);
std::istreambuf_iterator<char> it(i);
size_t s = std::distance(it, std::istreambuf_iterator<char>());
}
0135デフォルトの名無しさんNGNG
スコープ外したらコンパイルエラー(ry
0136デフォルトの名無しさんNGNG
せめて読むんじゃなくてseekしようよ。
で、普通はANSI標準じゃないけど
POSIX標準なstat/fstatを使うんじゃないかなあ。
0137デフォルトの名無しさんNGNG
>>132
C++の標準にファイルサイズという概念はない。環境依存。
0138デフォルトの名無しさんNGNG
>>136
fstreamではseekは推奨できないんじゃないか。
0139デフォルトの名無しさんNGNG
>>134
i.unsetf(std::ios::skipws);は必要無いんじゃないか?
0140デフォルトの名無しさんNGNG
>>137
概念は無くともファイルが存在すれば、
その格納データ量という意味で意味づけはできるんじゃない?
0141デフォルトの名無しさんNGNG
ファイルサイズ。
fseek()で終端に位置づけてftell()で位置を取得で終わりじゃん。
テキスト、バイナリの区別は必要かもしれないが、
その辺は調べてちょ。
0142デフォルトの名無しさんNGNG
boost使えば簡単じゃん。
次期標準だろ。
0143デフォルトの名無しさんNGNG
プゲラ
0144デフォルトの名無しさんNGNG
boost::filesystemにファイルサイズはない。
0145デフォルトの名無しさんNGNG
本当にファイルサイズが必要なのか?
たとえばifstreamを使って読み込むなら、
スペースのスキップや改行コードの変更によって
読み出せるデータ量が変わってくるんだから
132のように一文字ずつ数えるしかないんじゃ?
0146デフォルトの名無しさんNGNG
バイナリモードでfopenしてfseek,ftellじゃ駄目なの?
0147デフォルトの名無しさんNGNG
ファイルサイズ・・・。
定番の釣りだな。アフォクサ。POSIXで答えでてるじゃん。
0148デフォルトの名無しさんNGNG
アフォクサいのに釣られてるよ、この馬鹿。
0149デフォルトの名無しさんNGNG
たまに見かける、「iostream系だけで解決したい厨」。
iostreamだけ使えとは誰も言っていないにも拘らず、定期的に湧く。
0150デフォルトの名無しさんNGNG
147が釣りに見える
0151デフォルトの名無しさんNGNG
>>141>>146で答えが出てるのにね。
0152デフォルトの名無しさんNGNG
みんな、お盆休みは有効に使おうよ。
0153デフォルトの名無しさんNGNG
class A{
// 省略
};
class B{
// 省略
};
class C : public A, public B{
// 省略
};

ポリモフィズムの事なんですが、
A* a = new C;
は、期待どおりの動作をし、
B* b = new C;
は、期待している動作をしてくれない、
(つまり、多重継承の場合、ポリモフィズムにできるのは1つ目に継承したクラスへのポインタだけ)
というような事を、以前、本かサイトで見た(読んだ)ような気がするのですが、
調べなおしてみても、どうもそのような事が書いてある部分を見つけられず、
以前見た(読んだ)と思っているのは、ただの勘違いのような気がしてきました。
B* b = new C;は可能か不可能か教えてください。

更に、
class D{
// 省略
};
class E : public C, public D{
// 省略
};
C* c = new E;
これは可能でしょうか?
お願いします。
0154デフォルトの名無しさんNGNG
>>153

>B* b = new C;は可能か不可能か教えてください。
可能。

>C* c = new E;
>これは可能でしょうか?
可能。

やってみてから聞け。
0155デフォルトの名無しさんNGNG
なんで試さないんだろう・・・
0156153NGNG
>>154>>155
コンパイルが通るかは試しましたが、ちゃんと動作するかどうかとなると、
規格では駄目でも、たまたま動いちゃったりするかもと思ったからです。

どうもありがとうございました。
0157デフォルトの名無しさんNGNG
そもそも「ポリモルフィズム」の話題じゃないような気がします。
これは継承と、基底クラスのポインタへの代入というだけでは?
0158デフォルトの名無しさんNGNG
>>153
「期待どおりの動作」が何を指して言ってるのか分からないので
C++言語的には正当な行為だとしか言い様がない。

まあ
C* c = new E;
こんな事してたらおおよそ期待通りの動作はしないだろうけど。
0159デフォルトの名無しさんNGNG
規格で駄目なら普通はしない。
趣味のプログラミングなら話は別。
0160153NGNG
>>157>>158
申し訳ないです。
言われてみれば、153に書いた例では、単に基底クラスへのポインタに代入ができるかどうかしか問題にしていませんね。
良い例が思いつかず、クラスの中身を全部省略してしまいましたが、
基底クラスには仮想関数が宣言してあって、継承したクラスを「基底クラスへのポインタ」に代入し、
仮想関数を「基底クラスへのポインタ」から呼び出す事ができるかどうか。
また、基底クラスに仮想関数がない場合でも、継承したクラスを「基底クラスのポインタ」に代入すれば、
基底クラスに含まれるメンバ関数とメンバ変数(publicであれば)を「基底クラスへのポインタから」操作できるかどうかなどの事が聞きたかったです。

もっと具体的(実践的)に、現在、知りたかった事は、インターフェース・クラスは、一番最初に継承されていなければいけない物なのかどうかです。
0161デフォルトの名無しさんNGNG
>>141>>146で答えが出てるのにね。
0162デフォルトの名無しさんNGNG
↑↑↑
誤爆スマソ
0163デフォルトの名無しさんNGNG
>>151で出てるのにね。
0164デフォルトの名無しさんNGNG
あらら...orz
0165デフォルトの名無しさんNGNG
ファイルサイズの話は決着付いたの?
0166デフォルトの名無しさんNGNG
>>144
CVSにはもう追加されてます。
次のリリースからつかえるでしょう。
0167デフォルトの名無しさんNGNG
>>160
> 仮想関数を「基底クラスへのポインタ」から呼び出す事ができるかどうか。
できる。というか、仕様書読め。

> また、基底クラスに仮想関数がない場合でも、継承したクラスを「基底クラスのポインタ」に代入すれば、
その用途のためには、規定クラスに純粋仮想関数(実態はないが型の定義だけしてある)を
定義しておく必要がある。

> もっと具体的(実践的)に、現在、知りたかった事は、インターフェース・クラスは、一番最初に継承されていなければいけない物なのかどうかです。
別に。
0168デフォルトの名無しさんNGNG
>>160
それも自分でコード書いてみればすぐに分かる事じゃない?
少なくとも返事を待つよりは早く結果がでるぞ。

呼び出される関数について、オーバーライドはインスタンスの型によって決まり、
オーバーロードは呼び出し時のポインタの型によって決まる。
0169デフォルトの名無しさんNGNG
>>160
> 仮想関数を「基底クラスへのポインタ」から呼び出す事ができるかどうか。

悪いけどこんな基本的なこと人に聞く人にC++は向いてないよ。
0170デフォルトの名無しさんNGNG
>>165
POSIXで確定だよ。

今調べてみたが、フリーのVC++ToolKitにも
ちゃんとstat.hヘッダーが含まれていた。
今はファイルサイズに限定した議論になっているけど、
実用から見るとタイムスタンプ・属性などの情報もいずれ必要になってくるだろうし。
ANSI標準でのファイルサイズ取得に固執する行為は、初心者呼ばわりされるだけ。
0171デフォルトの名無しさんNGNG
以下のパターンAとパターンBの違いについて教えて下さい。
パターンAとBの違いは、Baseクラスの関数にvirtual指定があるか、ないかです。

■パターンA

class Base {
virtual void Func(); // 仮想関数
}

class Deliver {
void Func();
}

■パターンB

class Base {
void Func(); // 仮想関数
}

class Deliver {
void Func();
}
0172デフォルトの名無しさんNGNG
>>171
質問に真摯に答えると、vtableが出来るからsizeofの値が違う。
できれば質問の意図を教えて欲しい。
0173デフォルトの名無しさんNGNG
>>171
違いって見たまんまだろ
パターンBのBase::Func()は仮想関数じゃないだけ

もしかしてDeliverはBaseから派生させたかったのか?

>>172
171に対してそれは無理な相談だ
0174デフォルトの名無しさんNGNG
>>173
確かに。ワロタ。
0175デフォルトの名無しさんNGNG
真剣にレス付けようと思っていたが、
先にリロードして正解だった。
>173がシンプルに説明をしてくれている。
後はBase::Funk()が仮想関数でないということは、どういうことかを
考えればよい。
つまり仮想関数であることにより期待される動作(これは勉強するべし)
を数え上げれば、それがすなわち2つのパターンの違いである。
0176デフォルトの名無しさんNGNG
好意的に解釈すると、
Base* a = new Deliver;
a->Func();
したときにBaseとDeliverどっちのFunc()が呼ばれるかを書いて欲しいんだろうな。
0177>>171NGNG
>>176
あ、そういうことです。

と、いうことは、

パターンAの場合は、基底クラスが呼ばれて、
Bの場合は、派生クラスが呼ばれるということでいいんでしょうか?
0178デフォルトの名無しさんNGNG
なんで自分で試してから発言しないのかを教えてくれないか?
0179デフォルトの名無しさんNGNG
>177
だから仮想関数とは何かを勉強しなよ。
>176が好意的に書いてくれた丁寧なレスの内容なんて、
本読むなりサイトの記述をチェックすればすぐにわかること。
調べたけどわからなかったからここで聞いているんですなんて
いうのは却下だよ。それは自分の無能さを公に宣言するような
ものだからな。
0180デフォルトの名無しさんNGNG
あるメンバ関数からしか呼ばない関数も
そのクラスのprivateメソッドとするべきかどうかで迷ってます。

クラス宣言が見づらくなるという、つまらない理由で
単なるstatic関数としてのみ扱うのは横暴でしょうか
0181デフォルトの名無しさんNGNG
>>180
意味がわかりません。
もっと詳しく、読んで理解できる日本語で説明するか、コードで語ってください。
0182デフォルトの名無しさんNGNG
>>180
*.cppにstaticで書いてるってことね。
関数内で関数定義が出来ればいいんだろうけど、出来ないんだよね。
そういう場合、俺はstructのoperator()で擬似的に関数内関数にしてる。
■ このスレッドは過去ログ倉庫に格納されています