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

C++相談室 part11

■ このスレッドは過去ログ倉庫に格納されています
0001v(^・^)vNGNG
文法が汚くてもいいから、懐の広い言語を望むあなた。そんな
あなたにぴったりの言語、C++。
(´∀`).。o(関連URLは>>2-5の辺り)
0232デフォルトの名無しさんNGNG
>>231
BYTEならいいですか?typedefで見せ掛けだけですが・・・


ofstreamでバイナリで開いてもバイナリで書き込んでくれませんが
こんなにファイルサイズが勿体無い仕様にしたのは何故でしょう?
0233デフォルトの名無しさんNGNG
>>232
?
0234デフォルトの名無しさんNGNG
>>233
ofstream fout("aaa.a",ios::out|ios::trunc|ios::binary);
fout<<0x12345678<<'\n';
fout.close();
とやってもファイルには
305419896
と書かれるのですが・・・
0235デフォルトの名無しさんNGNG
文字列はstringだってママンから習わなかったの?
0236デフォルトの名無しさんNGNG
いやバイナリで開いてるんだから数値を直接入れてくれてもいいのかなと
0237デフォルトの名無しさんNGNG
neta ha sine
0238デフォルトの名無しさんNGNG
>>234
どういう結果を期待してたの?
0239234NGNG
バイナリで 78 56 34 12 0a ってなればいいかなと0aは'\n'でし
0240234NGNG
>>239
ああ0a取れないか・・・馬鹿でした
0241234NGNG
でも
fin>>iで
iのサイズとれば値を取得できるような・・・
0242234NGNG
連続カキコすいません

テンプレート関数内でTのサイズ計れなかったですか?
計れるのならばバイナリで直接数値をぶち込んでも問題はないかと

時間なのでもうすぐ帰ります
0243デフォルトの名無しさんNGNG
>>232
> typedefで見せ掛けだけですが・・・
身分詐証、それがイカンのよ。
0244デフォルトの名無しさんNGNG
>>236
>いやバイナリで開いてるんだから数値を直接入れてくれてもいいのかなと
ネタとしか思えん…
0245デフォルトの名無しさんNGNG
「バイナリを使えば何でもできる」
そう純粋に信じていた無垢な時代が、漏れたちにだって……なかったなあ
0246デフォルトの名無しさんNGNG
XMLなんて文字ばっかり
0247デフォルトの名無しさんNGNG
釣れた釣れた

ってそろそろ来るんだろうな・・・。
0248デフォルトの名無しさんNGNG
C++でpimplイディオムを利用すると自分が敗者になったような錯覚を覚えます。
どうしたらいいでしょうか?
0249デフォルトの名無しさんNGNG
漢なら全部テンプレートにしろ。
cppファイル1つにhファイルが2000、とかの状況に萌えろ。
0250デフォルトの名無しさんNGNG
>>248
C++ 廃業する。
0251デフォルトの名無しさんNGNG
>248
pimpl をただの構造体として使っているとか?
メンバ関数も持たせて、処理を移譲するようにしてやると少しは
オブジェクト指向らしくなると思う。
オレは昔は純粋仮想関数からなるインタフェースクラスを継承することに
美を感じていたが、最近では多態が不要なところでそれをやるのは
ダサいと思うようになってきた。そういうところは、pimpl を使って
処理を移譲するほうが美しい。
0252デフォルトの名無しさんNGNG
>>251
ただの構造体隠蔽として使う方がまだ美しいと感じる。

ガワと中身という違う物を実装しているとはいえ、
見てくれ(インターフェイス)が同一な物を2度作らなきゃならんのがダサいと思う。

>最近では多態が不要なところでそれをやるのは

同一の理由により、インターフェイス継承もやりたくない。
0253デフォルトの名無しさんNGNG
pimplなんて使うのはダサい!!!
男は黙ってコンパイルせい!!
Pentium 166MHzで!!!
0254デフォルトの名無しさんNGNG
構造体ってなんだっけ?

・・・・あ、structureのことか。
日本語キモくって最近使って無かった(w
0255デフォルトの名無しさんNGNG
>>254
大和言葉を使いなさい
0256デフォルトの名無しさんNGNG
>>254
国賊め!!!
北朝鮮に拉致されてしまえ!!!
0257デフォルトの名無しさんNGNG
仮想でない関数はクラスの外で宣言できるようになっていれば、
データ構造だのprivate関数だのを外に晒す必要も無くなるだろうに。
あとメンバtypedefやメンバconstの類も。
operator newがあれば前方宣言だけでインスタンスまで作れる。
0258デフォルトの名無しさんNGNG
>>257
そのかわり間接参照が一回増えるのが嫌…っつー時代に設計された言語だ。
そこを責めてくれるな。
0259デフォルトの名無しさんNGNG
C++処理系には前処理だけを行なうスイッチが用意されている。

Visual C++の場合

cl /GX /P smp1.cpp -/Pスイッチで前処理だけしてsmp1.iファイルを作る


というふうに本に書いてあったのですが,意味がわからないのですが・・・



あと,cstdioとかは,ネームスペース名は,std;ではなくてどういうのになるんでしょうか?
0260デフォルトの名無しさんNGNG
std::ostream に NULL 終端ではない char[] を指定文字数分だけ出力したいのですが、スマートな方法はありますでしょうか?

考えた方法は
1.バッファを確保し strncpy 後に NULL を追加して <<(ostream&, char*)
  うまくいくだろうけどバッファの動的確保のコストが気になる。
2.ループで指定文字数まで <<(ostream&, char)
  うまくいくだろうけど効率悪すぎ
3.std::setw
  指定文字数より長い場合には何もしてくれない
4.同期化された静的バッファにコピー後に <<(ostream&, char*)
  バッファ長より長い文字列の場合に結局ループしながら書き出さなければならない & 同期化のコストもちょっと気になる。


何か良い方法はないでしょうか?
0261デフォルトの名無しさんNGNG
>>260
ない
0262デフォルトの名無しさんNGNG
>>261
そんな冷たい事言わずに…
「ない」って言い切るくらい凄腕な方なら、私が考えた例よりも
効率の良い方法とかもいくつか思い浮かんだりするでしょう?
トレードオフの問題も絡めて、私の愚考よりも少しでもいい方法とかあったら
教えてください、よろしくお願いします。
0263260NGNG
260=262です。よろしくお願いします。
0264デフォルトの名無しさんNGNG
>>258
スタック上にインスタンス作ったり、operator newが無かったりする時は、
クラスの定義が必要、となっていれば、別にオーバーヘッドは無いだろ。
0265デフォルトの名無しさんNGNG
>>260
単純に
basic_ostream::write( const char_type *, streamsize )
でダメなのか?
0266デフォルトの名無しさんNGNG
int n;


cout << (cin >> n) << endl;

なんか変な数値が出るんだけども,cin関数の戻り値が表示されてるってこと?
0267デフォルトの名無しさんNGNG
>>262
効率の良い方法を求めてるわけ?
答えは簡単。
ostreamを捨ててどっかからファイルクラスを拾ってくる。
これ、最強。
0268デフォルトの名無しさんNGNG
>>266
MSDNより

cin
extern istream cin;
このオブジェクトは、標準入力からバイト ストリームを抽出します。オブジェクトが生成されると、cintie() を呼び出し、&cout を返します。
0269デフォルトの名無しさんNGNG
struct A
{
};

struct B
{
 friend void func(A& a)
 {
 }
};

struct C
{
 friend void func(A& a)
 {
 }
};

void test()
{
 A a;
 func(a);
}

これってエラーにならんのね(VC)
0270デフォルトの名無しさんNGNG
funcはクラス外で宣言されたものとみなされるから、かな?
0271デフォルトの名無しさんNGNG
>>270
struct B と C のどっちのfuncを呼んだのだろう?と思って
舌のようなコードにしたら、Bが呼ばれてた。

struct B
{
 friend void func(A& a)
 {
  printf("struct B\n");
 }
};

struct C
{
 friend void func(A& a)
 {
  printf("struct C\n");
 }
};

…Cのほうは?
0272デフォルトの名無しさんNGNG
class と struct の違いって何よ?
0273デフォルトの名無しさんNGNG
>>272
デフォルトのメンバがprivateかpublicか。
0274デフォルトの名無しさんNGNG
>>273
+キーワードの違い
0275デフォルトの名無しさんNGNG
>>272
structはprivateなメンバがないクラスを記述するのに使うとよい。
0276デフォルトの名無しさんNGNG
>>264
operataor new というか、ファクトリを前クラスに定義しろって話か?

できそうな気はするが、多重定義や名前空間に絡んで、予期せぬ名前解決された
ときにリンクするまで(あるいは実行時エラーが出るまで)トラブルが判明しないとい
う嫌なバグを作り込みそうな気がする。
0277デフォルトの名無しさんNGNG
>>271
VCがヴァカなだけでは?
0278デフォルトの名無しさんNGNG
VC以外はどう?
0279デフォルトの名無しさんNGNG
bcc, gcc共にコンパイルできず。
funcがすでに定義されてると。
0280 ◆JAPH9PWA NGNG
>>266
iostreamはストリームの状態を表す為にoperator void*()とoperator!()をオーバーロードしてるんだよ。
std::cout << (cin >> n) << std::endl;
この場合、istream::operator>>(istream&, T)は第一引数を参照で返すから、
(cin >> n)はcinそのものを返す、と。
で、そのあとcinを出力する為にistream::operator void*()を呼び出す為、
一見不可解な値が表示されるというわけ。
0281デフォルトの名無しさんNGNG
こまったもんだ
0282266NGNG
>>280
くっ,全然わからない・・・
C++勉強し始めて,7日目だけどいつ頃になったらわかるようになるかな?
0283デフォルトの名無しさんNGNG
最初から頭を突っ込むところじゃないと思うけど・・・
0284デフォルトの名無しさんNGNG
>>282
あきらめろ、おまえには無理だ。
0285デフォルトの名無しさんNGNG
>>282
最初は誰でもわからない、特にC++はCとは違って体系的な学習が
不可欠だ。

取り敢えず入門書1冊読破せよ。
0286デフォルトの名無しさんNGNG
>>285
はるひこさんのビギナー編ファイル入出力意外全部読みました
C++やると,C言語に戻りたくないですね
0287デフォルトの名無しさんNGNG
>>286
読むだけではなく、手間を厭わず打ち込んで試してみた?
そういう一見無駄な努力が、実はとても役に立つのだ。
0288デフォルトの名無しさんNGNG
>>287
すごくうちまくったよ
とはいわないけど,50回くらいは,

cout << "a=" << a << '\n';
進化
cout << "a=" << a << endl;

とか打ちましたよ

まーもっと打てよぼけとか言われそうですけど

C++覚えると,就職有利になりますかね?
c/c++募集ってとこにいきたいんですけど,C言語だけしか覚えていないんですよね
0289デフォルトの名無しさんNGNG
>>288
晴彦はどうかと思うが…。
まあ次は何かアプリ作ってみなさいってこった
0290デフォルトの名無しさんNGNG
>>288
あとは using namespace std; を外して、std::を識別子の前に付ける
ようにすればよい。

就職は、ほとんど会社に入ってから覚えさせられる事が多いので、
まずは自分でバグ取りできるだけの力をつけるようにする。そうすれ
ば進歩が速い。
0291デフォルトの名無しさんNGNG
>>290
クラス内でusing namespace std;とかする分には
問題ないんじゃ?
0292デフォルトの名無しさんNGNG
あと関数内で。
0293デフォルトの名無しさんNGNG
C#やるようになって、C++のヘッダと実装を分ける書き方がなんと美しかったことかと気づかされた。
かといってC++の#includeはいやだ・・・う〜〜む・・・
0294デフォルトの名無しさんNGNG
>>288
> C++覚えると,就職有利になりますかね?
C++ 使う職場なら、もちろん有利になる。
0295デフォルトの名無しさんNGNG
VC++.NETで
std::ios::noreplace
がないんだけど。
他に変わる物もみたらないのですが、どうすればよいのでしょうか?

0296デフォルトの名無しさんNGNG
>>295
http://www.microsoft.com/japan/developer/library/vccore/_core_differences_in_iostream_implementation.htm
古いiostreamを使うのが一番手っ取り早いかと。
0297デフォルトの名無しさんNGNG
>>293
ヘッダなんて無駄なだけだろ
0298295NGNG
>>296
ありがとうございます。
古いバージョン使うのあまり気が進まないです。(将来使えなくなりそうなので)
先にファイルOPENして確認するとかしかないか...。
0299デフォルトの名無しさんNGNG
>>297
分けないとネストが深くなりすぎてみにくくなる。
まぁ、オレもC/C++の#includeはちょっと好きじゃないけど。
C++なんてnamespaceがあるんだからヘッダのネストとかで悩ませられるのはどうかと思う。
0300デフォルトの名無しさんNGNG
ヘッダは無駄と思う。設計ミスって引数変えたり名前変えたりしたときにヘッダもいじらにゃならんし。
そもそも2度同じこと(プロトタイプ宣言とか)を書かないといけないのがスマートじゃない…。Cは仕方無いとして、
C++はなんでヘッダがあるんだろう…?

0301デフォルトの名無しさんNGNG
>300
テンプレートライブラリのため
0302デフォルトの名無しさんNGNG
Cというなの言語は今はありません。死に耐えました。
ただC++によってそのコードは今生かされているだけなのです。
0303300NGNG
>>301
いや、分かってるよ。
分かってるんだけど、もっと別の(ヘッダファイルを使う以外の)スマートなアプローチは無かったんかい、と。
0304デフォルトの名無しさんNGNG
>>303
なら、ヘッダに全部書けよ。
0305デフォルトの名無しさんNGNG
C++で 比較の結果が0/1であることは保証されてますか?
0306デフォルトの名無しさんNGNG
age
0307デバックの名無しさんNGNG
乱数はどうやって、発生できるんですか?
0308デフォルトの名無しさんNGNG
>>307
ランダムマスターでも使え。
http://www2.toshiba.co.jp/efort/market/rmaster/index_j.htm
0309デフォルトの名無しさんNGNG
発生器を使って。
0310デフォルトの名無しさんNGNG
「乱数発生法」でぐぐれば一杯出てくる。
http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&oe=UTF-8&q=%E4%B9%B1%E6%95%B0%E7%99%BA%E7%94%9F%E6%B3%95
0311デバックの名無しさんNGNG
>308
C++でやりたいんです。
0312デフォルトの名無しさんNGNG
Mersenne Twisterは?
http://www.emit.jp/mt/mt.html
0313デフォルトの名無しさんNGNG
boost/random
http://www.boost.org/libs/random/index.html
0314デフォルトの名無しさんNGNG
>>305
ある意味、保証されているが、そういう認識の仕方は少し問題だと思う。
0315デフォルトの名無しさんNGNG
>>314
どういう事ですか?
Cで比較演算の真偽値が0/非0と言うのは理解してますが、
C++だと0/1が保証されているという記事を読んだので、どうなのだろうと。
0316デフォルトの名無しさんNGNG
>>315
厳密にはC++で比較演算の結果はbool型のtrue/falseを返す。
これを整数に変換すると1/0になるという認識が正しい。
0317デフォルトの名無しさんNGNG
組み込みの比較演算子は保証されてるけど演算子がオーバーロード
されてる場合もあるからなあ。。
0318デフォルトの名無しさんNGNG
>>316-317
なるほど。
サンクスコです
0319デフォルトの名無しさんNGNG
std::fstreamの質問です

std::ofstream TestFile("./test.txt");
として
TestFile << "test message...";
とやった場合、メッセージの部分は
fstreamの内部にあるバッファへ溜め込まれているだけ
という認識でいいんでしょうか?
TestFile.flush()するまでファイルアクセスは無いですよね?

fstreamのソースみてもわけわからないです・・・
0320デフォルトの名無しさんNGNG
やってみてファイルを見てみましょう
0321デフォルトの名無しさんNGNG
>>319
そんなもん実装依存だよ
flushすれば確実に吐き出されることが保証されているだけ
0322デフォルトの名無しさんNGNG
>>319
バッファが一杯になると自動的にフラッシュされる。
0323デフォルトの名無しさんNGNG
逆に、flushしないで溜め込んでおいたバッファの内容を
参照できるような関数ってあるんでしょうか?

例えばTestFile.c_str()みたいな・・・
0324デフォルトの名無しさんNGNG
>>323
rdbuf()
0325デフォルトの名無しさんNGNG
>323
検索したらゾロゾロ出てきました
ありがとう
0326デフォルトの名無しさんNGNG
>324のミス・・・
0327デフォルトの名無しさんNGNG
rdbuf()の面白い使い方。ファイルの内容をたった一行で
全表示する。

#include <iostream>
#include <fstream>

int main()
{
std::fstream ifs("rdbuf.cpp");

std::cout << ifs.rdbuf();
}
0328デフォルトの名無しさんNGNG
>>327
それも実装依存。
0329デフォルトの名無しさんNGNG
>>328
327です。
ソースきぼん。
俺のソースはC++標準ライブラリ、P603、§13.9。
0330デフォルトの名無しさんNGNG
おっとっと間違いハケーン。std::fstream→std::ifstreamにしてください
0331デフォルトの名無しさんNGNG
標準ストリームに関する質問です

std::endl std::ends std::flush の実体ってどこで宣言(定義)されてるんでしょうか?
ヘッダファイル群にGREPしたところ、ヤツらの型が
basic_ostream& (*pf)(basic_ostream&)で受け取れるとこまではわかったんですけど
受け取ってからどうやって振り分けたものか悩んでおります


ストリームのラッパークラスなんて初心者が手を出すような領域じゃ無いのかな・・・
■ このスレッドは過去ログ倉庫に格納されています