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

C++相談室 part41

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/07/01(金) 13:09:21
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いします。
IDE(VC++など)などの使い方の質問もその開発環境のスレに
お願いします。

前スレ part40
http://pc8.2ch.net/test/read.cgi/tech/1113408957/

過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0002デフォルトの名無しさん2005/07/01(金) 13:11:03
急速にスレの質が低下してまいりました
0003デフォルトの名無しさん2005/07/01(金) 13:11:44
1 http://mimizun.mine.nu:81/2chlog/tech/piza.2ch.net/tech/kako/980/980175292.html
2 http://pc.2ch.net/tech/kako/996/996640937.html
3 http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
4 http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
5 http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
6 http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
7 http://pc.2ch.net/tech/kako/1021/10217/1021787032.html
8 http://pc3.2ch.net/tech/kako/1025/10250/1025010364.html
9 http://pc3.2ch.net/tech/kako/1027/10273/1027347982.html
10 http://pc3.2ch.net/tech/kako/1029/10293/1029315669.html
11 http://pc3.2ch.net/tech/kako/1032/10323/1032345774.html
12 http://pc3.2ch.net/tech/kako/1035/10350/1035005882.html
13 http://pc3.2ch.net/tech/kako/1038/10380/1038031395.html
14 http://pc5.2ch.net/tech/kako/1041/10413/1041328679.html
15 http://pc5.2ch.net/tech/kako/1043/10436/1043605481.html
0004デフォルトの名無しさん2005/07/01(金) 13:12:27
16 http://pc5.2ch.net/tech/kako/1045/10457/1045746245.html
17 http://pc5.2ch.net/tech/kako/1047/10475/1047560042.html
18 http://pc5.2ch.net/tech/kako/1050/10501/1050177746.html
19 http://pc5.2ch.net/tech/kako/1052/10526/1052625846.html
20 http://pc5.2ch.net/tech/kako/1055/10551/1055162298.html
21 http://pc5.2ch.net/tech/kako/1057/10575/1057580107.html
22 http://pc5.2ch.net/tech/kako/1060/10603/1060361082.html
23 http://pc5.2ch.net/tech/kako/1062/10626/1062690663.html
24 http://pc5.2ch.net/tech/kako/1066/10665/1066546387.html
25 http://pc5.2ch.net/tech/kako/1067/10679/1067949669.html
26 http://pc5.2ch.net/test/read.cgi/tech/1070164402/ (迷子)
27 http://pc5.2ch.net/test/read.cgi/tech/1074454641/ (迷子)
28 http://pc5.2ch.net/test/read.cgi/tech/1077985164/
29 http://pc5.2ch.net/test/read.cgi/tech/1082047479/
30 http://pc5.2ch.net/test/read.cgi/tech/1084030770/
0005デフォルトの名無しさん2005/07/01(金) 13:13:18
31 http://pc5.2ch.net/test/read.cgi/tech/1086185282/
32 http://pc5.2ch.net/test/read.cgi/tech/1088236078/
33 http://pc5.2ch.net/test/read.cgi/tech/1090180012/
34 http://pc5.2ch.net/test/read.cgi/tech/1092018643/
35 http://pc5.2ch.net/test/read.cgi/tech/1093958200/
36 http://pc5.2ch.net/test/read.cgi/tech/1096304546/
37 http://pc5.2ch.net/test/read.cgi/tech/1098543578/
38 http://pc5.2ch.net/test/read.cgi/tech/1101473340/
0006デフォルトの名無しさん2005/07/01(金) 13:14:16
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq-lite/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****

[禿 Stroustrup]
 http://www.research.att.com/~bs/
[C++ International Standard]
 http://www.kuzbass.ru/docs/isocpp/
 http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf
 http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=38110&ICS1=35&ICS2=60&ICS3=
[JTC1/SC22/WG21 - C++]
 http://www.open-std.org/jtc1/sc22/wg21

[C/C++ Users Journal]
 http://www.cuj.com/
[cppll (ML)]
 http://www.trickpalace.net/cppll/ (日本語)
0007デフォルトの名無しさん2005/07/01(金) 13:41:51
■Books■
amazon.com C,C++関連書籍
 http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/

The C++ Programming Language
 http://www.amazon.com/exec/obidos/ASIN/0201700735/
 http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
 http://www.amazon.com/exec/obidos/ASIN/0201824701/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
 http://www.amazon.com/exec/obidos/ASIN/0201379260/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
 http://www.amazon.com/exec/obidos/ASIN/0201924889/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
 http://www.amazon.com/exec/obidos/ASIN/020163371X/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
 http://www.amazon.com/exec/obidos/ASIN/0201615622/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
 http://www.amazon.com/exec/obidos/ASIN/020170434X/
Exceptional C++ Style
 http://www.amazon.com/exec/obidos/ASIN/0201760428/
0008デフォルトの名無しさん2005/07/01(金) 14:02:54
■Books(Templateまわり)■
Effective STL
 http://www.amazon.com/exec/obidos/ASIN/0201749629/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
 http://www.amazon.com/exec/obidos/ASIN/0201704315/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
 http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
 http://www.amazon.com/exec/obidos/ASIN/0321227255/
0009デフォルトの名無しさん2005/07/01(金) 14:05:50
■Libraries■
[Boost]
 Boost http://www.boost.org/
 (日本語) http://www.kmonos.net/alang/boost/
 (日本語) http://shinh.skr.jp/boost/
[STL]
 STLport http://www.stlport.org/
 SGI-STL http://www.sgi.com/tech/stl/
 STLFilt http://www.bdsoft.com/tools/stlfilt.html
 (日本語) http://www005.upp.so-net.ne.jp/episteme/html/stlprog/
 (日本語) http://www.wakhok.ac.jp/~sumi/stl/
[Loki]
 http://www.moderncppdesign.com/
 LokiPort-MSVC7 http://www.geocities.com/rani_sharoni/LokiPort.html
 LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
0010デフォルトの名無しさん2005/07/01(金) 14:10:19
■Libraries■
[他]
 ACE http://www.cs.wustl.edu/~schmidt/
 Blitz++ http://www.oonumerics.org/blitz/
 flex++ Bison++ http://www.idiom.com/free-compilers/TOOL/BNF-15.html
[他ライブラリリンク集]
 http://www.trumphurst.com/cpplibs/cpplibs.phtml
 (日本語) http://www.kmonos.net/alang/cpp/lib.html
0011デフォルトの名無しさん2005/07/01(金) 14:13:31
■関連スレ■
【C++】template 統合スレ -- Part6
http://pc5.2ch.net/test/read.cgi/tech/1101384692/
C/C++の宿題を片付けます 46代目
http://pc8.2ch.net/test/read.cgi/tech/1119514274/
C/C++でのWindowsPrograming議論スレ(質問お断り)
http://pc8.2ch.net/test/read.cgi/tech/1049790146/
managed C++ やろうぜ!!
http://pc5.2ch.net/test/read.cgi/tech/1014486422/
ATL/WTL Part3
http://pc5.2ch.net/test/read.cgi/tech/1095442366/
0012デフォルトの名無しさん2005/07/01(金) 14:16:52
STLつかうと一気に実行ファイルサイズが10倍に?!
0013デフォルトの名無しさん2005/07/01(金) 14:35:27
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
0014デフォルトの名無しさん2005/07/01(金) 14:39:23
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
0015デフォルトの名無しさん2005/07/01(金) 14:42:01
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
0016デフォルトの名無しさん2005/07/01(金) 14:54:28
#include <stdafx.h>

後氏ね。
0017デフォルトの名無しさん2005/07/01(金) 14:57:05
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
001812005/07/01(金) 15:00:10
前スレ
http://pc8.2ch.net/test/read.cgi/tech/1113408957/21

>21 名前:デフォルトの名無しさん[sage] 投稿日:2005/04/14(木) 03:47:02
>>>1
>実は part41 にしないといけなかったのかもしれない。
>ttp://pc8.2ch.net/test/read.cgi/tech/1106527792/41-42


ごめん、見落としてたor2
0019デフォルトの名無しさん2005/07/01(金) 15:11:36
>>1-18
乙
0020デフォルトの名無しさん2005/07/01(金) 15:17:01
back_inserterってエロくない?
0021デフォルトの名無しさん2005/07/01(金) 15:27:21
>>20
std::copy(penis.begin(), penis.end(), std:back_inserter(vulva));

複数の男のチンポを受け入れる女のマンコ(;´Д`)ハァハァ
0022デフォルトの名無しさん2005/07/01(金) 16:19:22
前スレ>>992
VisualC++7.1ではそのまま通りました。
0023前スレ>>9922005/07/01(金) 16:51:31
よく考え直したら、次のコードで良さそうです:
template <typename lhs, typename rhs>
struct is_equal {
  enum { type = false };
};
template <typename T>
struct is_equal<T, T> {
  enum { type = true };
};
レスしてくださった人ありがとうございました。
0024デフォルトの名無しさん2005/07/01(金) 16:58:09
>>23
enumにしなくてもstatic const boolでいいだろうに。
0025前スレ9512005/07/01(金) 21:43:47
一応書いておく。

次スレは「C++相談室 part43」です。
                ~~
0026デフォルトの名無しさん2005/07/01(金) 22:26:55
ふと思ったんだけど、なんでstd::mapにはat()相当のメンバがないんだろうか。
0027デフォルトの名無しさん2005/07/01(金) 22:47:06
>26
find() がそれに相当するんじゃまいか?
0028262005/07/01(金) 22:59:23
>>27
いや、そうじゃなくて要素がないときに例外を投げるようなものがないということ。
それにatやout_of_rangeという名前がmapとは多少肌が合わなくても他のコンテナに合わせるということはないのかと思った。
0029デフォルトの名無しさん2005/07/01(金) 23:53:23
初心者なのですが
文字型を整数型に変換するにはどうしたらいいでしょうか?
atoiは文字列じゃないと使えないようなのですが。
0030デフォルトの名無しさん2005/07/01(金) 23:58:04
>>26,28
map に at ?
要素が無ければ out_of_range ?
多少とかじゃなくて、激しくキモイよ。
0031デフォルトの名無しさん2005/07/01(金) 23:58:05
>>29
char c = '9';
とかなら
int n = c - '0';
がらくだな。
0032デフォルトの名無しさん2005/07/01(金) 23:58:44
>>30
operator[]があるぐらいならat()があってもイイんじゃないの
ってことジャマイカ
0033292005/07/02(土) 00:04:19
>>31
即レスありがとうございます
早速そのあたり教科書で調べてみます。
0034デフォルトの名無しさん2005/07/02(土) 00:11:02
getcharって連続しては使えないんですか?
0035デフォルトの名無しさん2005/07/02(土) 00:12:42
>>34
意味がわかりませんが
c = getchar();
c = getchar();
と書いても何も問題はありませんよ?
0036342005/07/02(土) 00:22:49
>>35
そうなんですか?すいませんちょっともっかいやり直してみます。
0037デフォルトの名無しさん2005/07/02(土) 09:50:14
>>33
教科書より文字コード表見た方がいいと思うぞ
0038デフォルトの名無しさん2005/07/02(土) 12:01:56
getchar()って使ったことないな。
C++標準関数ではないし、一文字だけ入力したいということがない。
>>35のように連続して使うなら、それは文字列として扱った方がいい悪寒:
std::string str;
std::cin >> str;
おっと、こうするとstrに4TBとか入れられてプログラムが落ちるから
C++は危険なんだっけ!
0039デフォルトの名無しさん2005/07/02(土) 12:06:17
>>38
getcharは<cstdio>のC++標準の関数だけど。
0040デフォルトの名無しさん2005/07/02(土) 12:30:05
>>38
> おっと、こうするとstrに4TBとか入れられてプログラムが落ちるから

どんなに大きな入力がきても、
str.max_size() まで読み出すか、
最悪 bad_alloc が飛んでくるだけだよ。
それで困るんなら setw(100) とか挟んどけ。
0041デフォルトの名無しさん2005/07/02(土) 12:48:52
>>39
C標準ライブラリは、参照によって提供されているだけで、
C++標準ライブラリの一部ではないんじゃなかったっけ違ったっけ。
嘘言ってそう、あとで調べ直す(ρ_;)

>>40
スマンちょっとすねてみただけだ・・・
0042デフォルトの名無しさん2005/07/02(土) 17:53:54
俺が昔試した実装だと、
getchar()やgetc()みたいなものを使って
一文字入力する場合stdioとiostreamでは話にならないレベルの速度差が
あったけどな。
stdioのが10倍程度速かった。ただしマルチスレッドでない場合だが。
0043デフォルトの名無しさん2005/07/02(土) 23:10:31
nが素数かどうか判定するプログラムってどうやればいいのでしょうか?
0044デフォルトの名無しさん2005/07/02(土) 23:13:21
>>43 「素数」「判定」あたりでぐぐるといいよ。
0045デフォルトの名無しさん2005/07/02(土) 23:14:55
>>43
#include <vector>
std::vector<bool> sieve_of_eratosthenes(int upper) {
    std::vector<bool> integers(upper + 1, true);
    integers[0] = integers[1] = false;
    for (int i = 2; i <= upper / 2; ++i) {
        int notprime = i;
        while ((notprime += i) <= upper) integers[notprime] = false;
    }
    return integers;
}
bool is_prime(int n){return sieve_of_eratosthenes(n)[n];}
0046デフォルトの名無しさん2005/07/03(日) 03:10:10

いまあるデータの一群を対象に特定の操作(ファイルへの書き込みや読み出しなど)したいとします。

そこでそのデータの集まりをCDataというクラスにします。
今後のメンテナンスを考えるとデータメンバを追加するときに集成するのはこのクラスだけにしたいです。
さらにread/writeというメソッドを追加しファイルへの読み書きができるようにします。
しかし、このCDataのあるインスタンスだけが、read/writeを使えるようにしたいです。
(つまりコードのいたるところで好き勝手にwriteされると言うことを防ぎたい。)
さらにそのread/writeができるインスタンスはデータを読み込んだら他のCDataクラスのインスタンスに
メンバをバイナリコピーしたいとします。つまり、
CDataRW foo1; //こいつはread/writeできる。
CData foo2;

foo1.read();
foo2 = foo1;
foo2.read(); //←ダメ。コンパイルエラーが望ましい
foo1 = foo2;

としたい分けです。よいクラス設計やデザインパターンなどありますでしょうか?
0047デフォルトの名無しさん2005/07/03(日) 03:17:14
(1) RW 出来るクラス
(2) Rだけ出来るクラス
(3)どっちも出来ないクラス

の3つが作りたいって事か?
0048デフォルトの名無しさん2005/07/03(日) 06:05:45
>>46の例なら、CDataを派生したCDataRWでread()を実装すればいい。
つーか、>>47ならCData→CDataR→CDataRWでそれぞれread()とwrite()か。
0049デフォルトの名無しさん2005/07/03(日) 06:42:48
ご回答ありがとうございます。

そうですよね。結局そういう方法で作りこんでます。
何を嫌がっていたかと言うと、CDataで変数を追加するとCDataRWのread/writeにも同様に修正が必要なことです。
でもそれしかないかなぁ。
最初考えたのがCDataにread/writeを実装して、CDataRWはpublicに派生、CDataNoRWクラスはprotected派生
とやってみたんだけど、それだと
CDataRW foo1;
CDataNoRW foo2;
foo2 = foo1;がダメだったです。コピーコンストラクタを書くと、結局CDataが持っている全メンバの知識が必要になるし。

0050デフォルトの名無しさん2005/07/03(日) 07:03:18
CData {
protected:
 void read_impl() {}
};
CDataRW: public CData {
public:
 void read() { CData::read_impl(); }
};
みたいなのは駄目?

あと、コピーコンストラクタは
全メンバを知らなくても
内部でthis->CData::operator =(*other)みたいにすることも出来るけど。
0051デフォルトの名無しさん2005/07/03(日) 07:04:59
継承が無理ならこんな感じで、クラス内の関数に
最低でもなにもしないwrite()とread()があるとして

template<typename T>
class CDataOpen {
T & impl;
bool writable;
public:
CDataOpen(const T& d,bool b=false) : impl(d) ,writable(b){}
size_t operator()(){return b ? impl.write() : impl.read();}
};

func(){
CDataOpen<CDataRW> Write(fool,true);
CDataOpen<CDataR> Read(fool);
CDataOpen<CDataRW> Read2(fool2);

while(...){
...処理内で使いまわす

Read2();
Read();
Write();
}
}
0052デフォルトの名無しさん2005/07/03(日) 07:47:58
ありがとうございます。

>this->CData::operator =(*other)
こういうコピーもありましたか。

const CDataRW & CDataRW ::operator=(const CData & o)
{
 this->CData::operator=(o)
 return *this;
}
って感じでしょうか?
ちなみにprotectedで派生させたCDataNoRWがあるとした場合、
CDataRW drw;
CDataNoRW dnrw;
drw = dnrw; //コピー
dnrw = drw; //逆のコピー
だとすると
const CDataRW & CDataRW ::operator=(const CDataNoRW & o)
const CDataNoRW & CDataNoRW ::operator=(const CDataRW & o)
が居るのでしょうか?
const CDataRW & CDataRW ::operator=(const CDataNoRW & o)
{
 this->CData::operator=(o)
 return *this;
}
としてみたところ、
error C2243: '型キャスト' : 'const CDataNoRW *__w64 ' から 'const CData &' の変換は存在しますが、アクセスできません。
となってしまいました。CDataNoRWをいったんCDataにしたいですね。。ポインタだったらdynamic_castが通用するのかも知れないな。。
と言うわけで、このパラダイムをC++の世界ではどう扱うのかに興味が移ってきました。
(製造は簡単な>>48さんの方式を取りたいと思います。)

0053デフォルトの名無しさん2005/07/03(日) 08:37:59
その形式でダウンキャストが必要になる、というのは、
つまり引数側(代入式の右辺側)が派生クラスということでしょ?
だったらそれこそ何もしなければ代入できると思うけど。

もちろん、データメンバを追加していた場合には
スライシングの問題が起きるけどね。
(逆に、Base::operator =() を利用する時は、追加したメンバを初期化する必要がある)
0054デフォルトの名無しさん2005/07/03(日) 08:43:01
>>48
いや、こうだろ。
   CData
  ↓   ↓
CDataR CDataW
  ↓   ↓
 CDataRW
0055522005/07/03(日) 09:41:48
よく分らなくなってきました。勉強して出直します。
0056482005/07/03(日) 12:48:03
>>54
>>47にCDataWがないので省略しただけですが何か。
0057デフォルトの名無しさん2005/07/03(日) 15:32:12
プログラミングは全くの素人ですが、
諸事情でC++使えるようになりたいんです。
毎日勉強したら何日くらいでマスター出来ますか?
個人差あるのはわかってますけど、だいたいの目安を教えてください。
0058デフォルトの名無しさん2005/07/03(日) 15:39:01
>>57 まずは「マスター」するとはどういうことか示してもらおうか。
0059デフォルトの名無しさん2005/07/03(日) 15:39:10
>>57
そんな無意味な質問をすることから推測するに、一年くらいやれば
糞設計のメモリリークしまくりオブジェクト指向とは無縁の糞コードを量産できるようになります。
0060デフォルトの名無しさん2005/07/03(日) 15:59:41
C++(VisualStudio6.0)で書かれたソースをC++.NETで開き、文法上のエラーを解消し、
ビルドしたところ、以下のメッセージが出てしまいました。

error LNK2001: 外部シンボル ""char * __cdecl fgets(char *,int,struct _iobuf *)" (?fgets@@$$J0YAPADPADHPAU_iobuf@@@Z)" は未解決です。

該当するソースはこのようになっています。

FILE *fstream;// ファイルディスクリプタ
char tLine[256];// 一行読み込み用
if( fgets( tLine, 128, fstream ) == NULL ){
 if( ferror( fstream ) ){// 一行読み出しエラー
  break;
 }
 break;// EOFに達した
}

その他,atoi、strstrなど、Cランタイムライブラリ関数(?)関連のものは
みな外部シンボルが未解決と出るんですが…何か参照設定が足りないのでしょうか?
ご教授いただければ思います。
0061デフォルトの名無しさん2005/07/03(日) 16:11:12
>>60
http://pc8.2ch.net/test/read.cgi/tech/1118781438/

ちょっと前までスレのテンプレに書くコンパイラ専用スレ集として
「コンパイラスレ」があったとおもうんだが、なんで無くなったんだ?
0062デフォルトの名無しさん2005/07/03(日) 16:20:13
>>61
スレチガ失礼しました。誘導ありがとうございます。
0063デフォルトの名無しさん2005/07/03(日) 17:01:10
すみません。初心者なんですが「コマンドラインから引数を受け取る」ってどうすればいいんでしょうか?
0064デフォルトの名無しさん2005/07/03(日) 17:07:32
>>63
int main(int argc, char* argv[])とすればargvに入る。
詳細はググれ。
0065デフォルトの名無しさん2005/07/03(日) 18:53:23
どうでもいいけど、
>char tLine[256];// 一行読み込み用
>if( fgets( tLine, 128, fstream ) == NULL ){
これはひどいな。
0066デフォルトの名無しさん2005/07/03(日) 19:45:21
>>65
なら書くな
0067デフォルトの名無しさん2005/07/03(日) 23:56:01
>>63
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
for (int i (0); i < argc; ++ i)
cout << argv [i] << endl;
return 0;
}
0068デフォルトの名無しさん2005/07/04(月) 01:31:24
適当で悪いけどこれ↓ってobjectCには何が入るの?

struct structA{ ... }strA
class classB{ ... }

classB *objectC = (strA*)
0069デフォルトの名無しさん2005/07/04(月) 01:50:03
ぜんぜん意味分らん
0070デフォルトの名無しさん2005/07/04(月) 03:03:10
>>60
目を覆いたくなるコードだな…
バッファが256なのに128読み込み
それにfstreamはstd::fstreamと混同しそうで怖いな
漏れはCはサッパリだが、Cだとbreakつかいまくりなの?

>>68
structAでoperator classB()とかをオーバーロードしてあるのかな
0071デフォルトの名無しさん2005/07/04(月) 03:42:58
>>70
breakつかってもif文から脱出できるわけではないから、あれは
外側にループがあるんだろう

>>68
「適当」じゃなくて「ちゃんと」書けよ
classB *objectC = &strA;
の間違いか?
0072デフォルトの名無しさん2005/07/04(月) 11:44:38
>>68
「コンパイルエラー」
0073デフォルトの名無しさん2005/07/04(月) 14:14:02
>60
それはVC++の質問じゃなくて
標準C++固有の質問なんでしょうか。
0074デフォルトの名無しさん2005/07/04(月) 16:23:09
>>73
むしろC++ですらなく、Cの質問の悪寒。

void f(ifstream& fin) {
 string line;
 while (getline(fin, line)) {
  // ...
 }
};
0075デフォルトの名無しさん2005/07/04(月) 16:56:20
くだらない事のですが相談にのって下さい、悩んでいます

同じclass Interfaceを基底クラスに持つ、class Fooとclass Baaがあり、
クライアント側はInterface型のリストとしてFooとBaaを所持すると言う、ありがちな関係があります。

さて、FooとBaaのデータを、ファイルに保存する必要があります。
人に読んでもらう事が前提のフォーマットです。
ここではたと迷ってしまいました。

Baa BaaDataA BaaDataB ...
Foo FooDataA FooDataB ...
Baa BaaDataA BaaDataA ...
といった感じの、先頭にタイプIDみたいのがあるフォーマットならば
いかにもオブジェクト指向っぽく扱えて楽なので、これで行こうと思っていました。

ところが世間のファイルフォーマットを観ると
Foo
 FooDataA FooDataB ...
Baa
 BaaDataA BaaDataB ...
 BaaDataA BaaDataB ...
こんな風に、FooならFooでまとめて記述しているフォーマットが多く
確かに見た目はこちらの方がスマートですし、データ量も少なく、ベストな気がします。

ところが後者を実装するとなると、Interface型のリストしか無い以上
小細工が必要になり、あまり嬉しくありません。

どちらが良いか、なんでもいいのでアドバイス頂けると幸いです。
0076デフォルトの名無しさん2005/07/04(月) 17:11:26
1行1レコードなら、map<string, vector<string> >にいったんシリアライズし
["Foo"]と["Baa"]について順次書き出す
読むときはまとまっていた方が嬉しいが、Interafceの生成順は保持しなくてもいいの?
0077752005/07/04(月) 17:22:05
はい、序列を表に出すようなデータではないので順番は全く構いません。
さすがに1行では無理なのですが(例が悪くて申し訳ないス)、
なるほどmapを使ってstringの代わりにオブジェクト自体を持たせれば…

おかげでスマートな実装が見えてきました
> 読むときはまとまっていた方が嬉しいが
にも後押しされました。ありがとうございました。
0078デフォルトの名無しさん2005/07/04(月) 18:26:50
>>77
stringの代わりにオブジェクト自体、はあんまりかも。ポリモフィズムの意味が薄れるから。
class Interfaceに純粋仮想関数 serialize() を用意し、
その返値を pair<string, string>とかにして、各派生クラスで:
pair<string, string> serialize() {
 string str = ...;
 return make_pair("Foo", str); // strは"FooDataA FooDataB ..."
};

template <typename T, typename S>
void serialize(T first, T last, S& container) {
 while (first != last) {
  pair<string, string> data = (*first++)->serialize();
  container[data.first].push_back(data.second);
 }
};

vector<Interface*> interfaces;
map<string, vector<string> > serial_map;
serialize(interfaces.begin(), interfaces.end(), serial_map);

もっといい書き方がありそう
0079デフォルトの名無しさん2005/07/04(月) 19:46:16
>>78
うっかり、multimapにpair<string, Interface*>を持たせてソートし
Interfaceに持たせたsaveData()=0を一気に使わせるようなのを考えてました。

お手本ありがとうございます。書き方も含め勉強になります。
0080デフォルトの名無しさん2005/07/04(月) 20:53:48
>>75
の例では断然上を取るがな、俺は。
下の良さってのは、領域が節約できることだけだ。
上の例はgrepやawkのようなツールでも扱いやすいし、
セーブやロードも単純化できる。
008176,782005/07/05(火) 13:41:51
>>80
もしwindowsでいえばコマンドプロンプトのアイコンを見たことがあるユーザを対象にするなら
Foo FooDataA FooDataB...
形式を選んだ方がいいかもしれない。
出力をソートすればidごとにまとまるし、grepで必要なidのだけ見れる。
ログを「加工」する部分は外部ツールですべきだとも思う。

でも、各種ツールを使うスキルを要求するのは難しいし(というより不可能)
ログがそのまま人間にとって読みやすくないと見てすらもらえない(ρ_;)
だから、
Foo:
\tFoo1:
\t\tFooData1A FooData1B
\t\tFooData1C FooData1D
\tFoo2:
\t\tFooData2A FooData2B
Baa:
\tBaa1:
とか、見やすく、プログラムからも扱えるような形式のがいいかなと。
xmlではき出せばいいのかな。そこまでするものなのかな。
0082デフォルトの名無しさん2005/07/06(水) 15:37:58
class C1 {
// 省略
}

class C2 {
template <class T>
void F(T t = C1());
}

template <class T>
void C2::F(T t) {
// 省略
}

というコードで、
C2 c2;
c2.F(C1());
だと問題なくコンパイルされるんですが、
C2 c2;
c2.F();
だと「could not deduce template argument for 'C1'」というエラーが出ました。
デフォルト引数でテンプレートを推論する事はできないのでしょうか?
0083デフォルトの名無しさん2005/07/06(水) 15:54:33
>>82
コンパイラの立場で質問。
c2.F();と書いた場合に、
引き数のない関数の呼び出しとディフォルト引き数つきの関数の呼び出しの区別はどうすればいい?
0084822005/07/06(水) 16:22:57
>>83
c::F(T t)はオーバーロードされてないんですが、呼び出しの区別に困るとはどういうことでしょう?
0085デフォルトの名無しさん2005/07/06(水) 20:32:29
>引き数のない関数の呼び出しとディフォルト引き数つきの関数の呼び出しの区別はどうすればいい?

区別のしようがないからエラーにしていいんじゃなかったっけ?
0086デフォルトの名無しさん2005/07/06(水) 22:26:41
デフォルト引数の中身を評価するのは、オーバーロード解決後なんじゃない?
0087デフォルトの名無しさん2005/07/07(木) 01:01:07
>>82
14.8.2.4 -17-
"A template type-parameter cannot be deduced from the type of a function default argument."

ttp://www.kuzbass.ru/docs/isocpp/template.html#temp.deduct.type
0088デフォルトの名無しさん2005/07/07(木) 01:03:31
c2.F<C1>();
これならさすがに通るな。

俺もメンバテンプレートをいまいち理解できてねーな。
0089822005/07/07(木) 10:02:13
>>86
オーバーロードを解決するのに関数の実体化が必要だけど、デフォルト引数の評価はこの時点ではできないため、
テンプレート引数が不明で関数の実体化ができない、みたいな感じなんでしょうか。

>>87
デフォルト引数では無理ですか。


皆様ありがとうございました。
0090デフォルトの名無しさん2005/07/07(木) 10:49:52
>>89
まぁ、デフォルト引き数は何かと問題になるから引き数の違いでコンストラクタを複数作るほうが無難だね。
しかも、>82の例だとそれがデフォルトコンストラクタになるのだから尚更。
#逆に、デフォルトコンストラクタを作りたくないとなると話は別だが。
0091デフォルトの名無しさん2005/07/08(金) 13:48:03
std::list の関数って何故全てが安定的になっているんですか?
今リストの勉強してるので気になります。
0092デフォルトの名無しさん2005/07/08(金) 15:01:28
class CPOINT {
public:
CPOINT(int x, int y) : x_(x), y_(y) {}
int x_, y_;
};

struct SPOINT {
int x_, y_;
};

void F1(CPOINT cp) {
...
}
void F2(SPOINT sp) {
...
}

CPOINT cp(0, 0); // OK
SPOINT sp = {0, 0}; // OK
F1(CPOINT(0,0)); // OK
F2(SPOINT(0,0)); // エラー
F2(SPOINT({0,0})); // エラー
F2(SPOINT() = {0,0}); // エラー
F2(SPOINT{0,0}); // エラー
F2({0,0}); // エラー

コンストラクタが定義されていないと、
初期化した一時オブジェクトを作ることができないのでしょうか?
SPOINT sp = {0, 0};
これがOKなだけに、なんか納得できない・・・。
0093デフォルトの名無しさん2005/07/08(金) 16:53:39
>>92
当たり前じゃん・・・・
それから、

SPOINT sp = {0, 0};

これはC++とは関係なく、Cでも出来る、構造体の初期化にすぎない。
0094デフォルトの名無しさん2005/07/08(金) 17:09:42
C99には複合リテラルがあるが果たしてC++で使い物になるかどうか。
0095デフォルトの名無しさん2005/07/08(金) 18:04:36
寧ろ、Cとの互換性のために残されたって気もする。
0096デフォルトの名無しさん2005/07/09(土) 00:28:38
>>92
class CPOINT
{
  int x_, y_;
};
F1(CPOINT(0,0));
↑これも通らないと納得いかないのか?

初心者の「納得行かない」はただ単に理解してないだけだよな
0097デフォルトの名無しさん2005/07/09(土) 00:35:41
>>91
意味がわからない。
「安定的」でないほうが自然な関数を例に挙げてもらえるとわかるかも。
0098デフォルトの名無しさん2005/07/09(土) 02:11:34
質問させてください。

二次元配列(4x4)に、変数を含む値を代入しようとしています。

{X,0,0,0},{0,X,0,0},{0,0,X,0},{0,0,0,X}

のような形です。ここで、Xは宣言の段階では決定していないので、
Xが決定した後に値を代入したい と思っています。
宣言時以外の時に、まとめて代入はできないのでしょうか?
初心者丸出しですが、どなたか教えてください・・・・
0099デフォルトの名無しさん2005/07/09(土) 02:16:08
>>98
二次元配列を二つ用意し、一つは
1,0,0,0,
0,1,0,0,
0,0,1,0,
0,0,0,1,
で初期化しておく。
その後Xが確定したときにもう一つの方に
for (int i = 0; ...) {for (int j = 0; ...) {theArray[i][j] = X * fixedArray[i][j];}}
とでもしてコピーすればいい。
#つーか、std::copy()か。
0100デフォルトの名無しさん2005/07/09(土) 02:21:11
ゼロ梅しといて
for (int i = 0; i < 4; ++i)
  a[i][i] = X;
でいいだろ
0101デフォルトの名無しさん2005/07/09(土) 03:18:33
>>98
{} は初期化の構文なので定義のときしか使えない。

C99でC言語に導入されたコンパウンドリテラルなら {} を使った値を「代入」で使える。
でもこれは標準C++には無い機能だ。

おとなしく要素ごとに代入するコードを書いてしまうのがいいよ。
■ このスレッドは過去ログ倉庫に格納されています