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


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

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

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

過去スレ、関連スレ、関連リンクなどは >>2-20 あたり

2 名前:デフォルトの名無しさん :2005/07/01(金) 13:11:03
急速にスレの質が低下してまいりました

3 名前:デフォルトの名無しさん :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

4 名前:デフォルトの名無しさん :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/

5 名前:デフォルトの名無しさん :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/

6 名前:デフォルトの名無しさん :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/ (日本語)


7 名前:デフォルトの名無しさん :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/

8 名前:デフォルトの名無しさん :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/

9 名前:デフォルトの名無しさん :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


10 名前:デフォルトの名無しさん :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


11 名前:デフォルトの名無しさん :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/


12 名前:デフォルトの名無しさん :2005/07/01(金) 14:16:52
STLつかうと一気に実行ファイルサイズが10倍に?!

13 名前:デフォルトの名無しさん :2005/07/01(金) 14:35:27
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。


14 名前:デフォルトの名無しさん :2005/07/01(金) 14:39:23
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

15 名前:デフォルトの名無しさん :2005/07/01(金) 14:42:01
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?


16 名前:デフォルトの名無しさん :2005/07/01(金) 14:54:28
#include <stdafx.h>

後氏ね。

17 名前:デフォルトの名無しさん :2005/07/01(金) 14:57:05
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

18 名前:1 :2005/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

19 名前:デフォルトの名無しさん :2005/07/01(金) 15:11:36
>>1-18


20 名前:デフォルトの名無しさん :2005/07/01(金) 15:17:01
back_inserterってエロくない?

21 名前:デフォルトの名無しさん :2005/07/01(金) 15:27:21
>>20
std::copy(penis.begin(), penis.end(), std:back_inserter(vulva));

複数の男のチンポを受け入れる女のマンコ(;´Д`)ハァハァ

22 名前:デフォルトの名無しさん :2005/07/01(金) 16:19:22
前スレ>>992
VisualC++7.1ではそのまま通りました。

23 名前:前スレ>>992 :2005/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 };
};
レスしてくださった人ありがとうございました。


24 名前:デフォルトの名無しさん :2005/07/01(金) 16:58:09
>>23
enumにしなくてもstatic const boolでいいだろうに。

25 名前:前スレ951 :2005/07/01(金) 21:43:47
一応書いておく。

次スレは「C++相談室 part43」です。
                ~~

26 名前:デフォルトの名無しさん :2005/07/01(金) 22:26:55
ふと思ったんだけど、なんでstd::mapにはat()相当のメンバがないんだろうか。

27 名前:デフォルトの名無しさん :2005/07/01(金) 22:47:06
>26
find() がそれに相当するんじゃまいか?

28 名前:26 :2005/07/01(金) 22:59:23
>>27
いや、そうじゃなくて要素がないときに例外を投げるようなものがないということ。
それにatやout_of_rangeという名前がmapとは多少肌が合わなくても他のコンテナに合わせるということはないのかと思った。

29 名前:デフォルトの名無しさん :2005/07/01(金) 23:53:23
初心者なのですが
文字型を整数型に変換するにはどうしたらいいでしょうか?
atoiは文字列じゃないと使えないようなのですが。

30 名前:デフォルトの名無しさん :2005/07/01(金) 23:58:04
>>26,28
map に at ?
要素が無ければ out_of_range ?
多少とかじゃなくて、激しくキモイよ。

31 名前:デフォルトの名無しさん :2005/07/01(金) 23:58:05
>>29
char c = '9';
とかなら
int n = c - '0';
がらくだな。

32 名前:デフォルトの名無しさん :2005/07/01(金) 23:58:44
>>30
operator[]があるぐらいならat()があってもイイんじゃないの
ってことジャマイカ

33 名前:29 :2005/07/02(土) 00:04:19
>>31
即レスありがとうございます
早速そのあたり教科書で調べてみます。

34 名前:デフォルトの名無しさん :2005/07/02(土) 00:11:02
getcharって連続しては使えないんですか?

35 名前:デフォルトの名無しさん :2005/07/02(土) 00:12:42
>>34
意味がわかりませんが
c = getchar();
c = getchar();
と書いても何も問題はありませんよ?

36 名前:34 :2005/07/02(土) 00:22:49
>>35
そうなんですか?すいませんちょっともっかいやり直してみます。

37 名前:デフォルトの名無しさん :2005/07/02(土) 09:50:14
>>33
教科書より文字コード表見た方がいいと思うぞ

38 名前:デフォルトの名無しさん :2005/07/02(土) 12:01:56
getchar()って使ったことないな。
C++標準関数ではないし、一文字だけ入力したいということがない。
>>35のように連続して使うなら、それは文字列として扱った方がいい悪寒:
std::string str;
std::cin >> str;
おっと、こうするとstrに4TBとか入れられてプログラムが落ちるから
C++は危険なんだっけ!


39 名前:デフォルトの名無しさん :2005/07/02(土) 12:06:17
>>38
getcharは<cstdio>のC++標準の関数だけど。

40 名前:デフォルトの名無しさん :2005/07/02(土) 12:30:05
>>38
> おっと、こうするとstrに4TBとか入れられてプログラムが落ちるから

どんなに大きな入力がきても、
str.max_size() まで読み出すか、
最悪 bad_alloc が飛んでくるだけだよ。
それで困るんなら setw(100) とか挟んどけ。

41 名前:デフォルトの名無しさん :2005/07/02(土) 12:48:52
>>39
C標準ライブラリは、参照によって提供されているだけで、
C++標準ライブラリの一部ではないんじゃなかったっけ違ったっけ。
嘘言ってそう、あとで調べ直す(ρ_;)

>>40
スマンちょっとすねてみただけだ・・・

42 名前:デフォルトの名無しさん :2005/07/02(土) 17:53:54
俺が昔試した実装だと、
getchar()やgetc()みたいなものを使って
一文字入力する場合stdioとiostreamでは話にならないレベルの速度差が
あったけどな。
stdioのが10倍程度速かった。ただしマルチスレッドでない場合だが。

43 名前:デフォルトの名無しさん :2005/07/02(土) 23:10:31
nが素数かどうか判定するプログラムってどうやればいいのでしょうか?

44 名前:デフォルトの名無しさん :2005/07/02(土) 23:13:21
>>43 「素数」「判定」あたりでぐぐるといいよ。

45 名前:デフォルトの名無しさん :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];}

46 名前:デフォルトの名無しさん :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;

としたい分けです。よいクラス設計やデザインパターンなどありますでしょうか?


47 名前:デフォルトの名無しさん :2005/07/03(日) 03:17:14
(1) RW 出来るクラス
(2) Rだけ出来るクラス
(3)どっちも出来ないクラス

の3つが作りたいって事か?

48 名前:デフォルトの名無しさん :2005/07/03(日) 06:05:45
>>46の例なら、CDataを派生したCDataRWでread()を実装すればいい。
つーか、>>47ならCData→CDataR→CDataRWでそれぞれread()とwrite()か。

49 名前:デフォルトの名無しさん :2005/07/03(日) 06:42:48
ご回答ありがとうございます。

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



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

あと、コピーコンストラクタは
全メンバを知らなくても
内部でthis->CData::operator =(*other)みたいにすることも出来るけど。

51 名前:デフォルトの名無しさん :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();
}
}

52 名前:デフォルトの名無しさん :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さんの方式を取りたいと思います。)



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

もちろん、データメンバを追加していた場合には
スライシングの問題が起きるけどね。
(逆に、Base::operator =() を利用する時は、追加したメンバを初期化する必要がある)

54 名前:デフォルトの名無しさん :2005/07/03(日) 08:43:01
>>48
いや、こうだろ。
   CData
  ↓   ↓
CDataR CDataW
  ↓   ↓
 CDataRW

55 名前:52 :2005/07/03(日) 09:41:48
よく分らなくなってきました。勉強して出直します。


56 名前:48 :2005/07/03(日) 12:48:03
>>54
>>47にCDataWがないので省略しただけですが何か。

57 名前:デフォルトの名無しさん :2005/07/03(日) 15:32:12
プログラミングは全くの素人ですが、
諸事情でC++使えるようになりたいんです。
毎日勉強したら何日くらいでマスター出来ますか?
個人差あるのはわかってますけど、だいたいの目安を教えてください。

58 名前:デフォルトの名無しさん :2005/07/03(日) 15:39:01
>>57 まずは「マスター」するとはどういうことか示してもらおうか。

59 名前:デフォルトの名無しさん :2005/07/03(日) 15:39:10
>>57
そんな無意味な質問をすることから推測するに、一年くらいやれば
糞設計のメモリリークしまくりオブジェクト指向とは無縁の糞コードを量産できるようになります。

60 名前:デフォルトの名無しさん :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ランタイムライブラリ関数(?)関連のものは
みな外部シンボルが未解決と出るんですが…何か参照設定が足りないのでしょうか?
ご教授いただければ思います。

61 名前:デフォルトの名無しさん :2005/07/03(日) 16:11:12
>>60
http://pc8.2ch.net/test/read.cgi/tech/1118781438/

ちょっと前までスレのテンプレに書くコンパイラ専用スレ集として
「コンパイラスレ」があったとおもうんだが、なんで無くなったんだ?

62 名前:デフォルトの名無しさん :2005/07/03(日) 16:20:13
>>61
スレチガ失礼しました。誘導ありがとうございます。

63 名前:デフォルトの名無しさん :2005/07/03(日) 17:01:10
すみません。初心者なんですが「コマンドラインから引数を受け取る」ってどうすればいいんでしょうか?

64 名前:デフォルトの名無しさん :2005/07/03(日) 17:07:32
>>63
int main(int argc, char* argv[])とすればargvに入る。
詳細はググれ。

65 名前:デフォルトの名無しさん :2005/07/03(日) 18:53:23
どうでもいいけど、
>char tLine[256];// 一行読み込み用
>if( fgets( tLine, 128, fstream ) == NULL ){
これはひどいな。

66 名前:デフォルトの名無しさん :2005/07/03(日) 19:45:21
>>65
なら書くな

67 名前:デフォルトの名無しさん :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;
}


68 名前:デフォルトの名無しさん :2005/07/04(月) 01:31:24
適当で悪いけどこれ↓ってobjectCには何が入るの?

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

classB *objectC = (strA*)

69 名前:デフォルトの名無しさん :2005/07/04(月) 01:50:03
ぜんぜん意味分らん

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

>>68
structAでoperator classB()とかをオーバーロードしてあるのかな


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

>>68
「適当」じゃなくて「ちゃんと」書けよ
classB *objectC = &strA;
の間違いか?


72 名前:デフォルトの名無しさん :2005/07/04(月) 11:44:38
>>68
「コンパイルエラー」

73 名前:デフォルトの名無しさん :2005/07/04(月) 14:14:02
>60
それはVC++の質問じゃなくて
標準C++固有の質問なんでしょうか。

74 名前:デフォルトの名無しさん :2005/07/04(月) 16:23:09
>>73
むしろC++ですらなく、Cの質問の悪寒。

void f(ifstream& fin) {
 string line;
 while (getline(fin, line)) {
  // ...
 }
};


75 名前:デフォルトの名無しさん :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型のリストしか無い以上
小細工が必要になり、あまり嬉しくありません。

どちらが良いか、なんでもいいのでアドバイス頂けると幸いです。

76 名前:デフォルトの名無しさん :2005/07/04(月) 17:11:26
1行1レコードなら、map<string, vector<string> >にいったんシリアライズし
["Foo"]と["Baa"]について順次書き出す
読むときはまとまっていた方が嬉しいが、Interafceの生成順は保持しなくてもいいの?


77 名前:75 :2005/07/04(月) 17:22:05
はい、序列を表に出すようなデータではないので順番は全く構いません。
さすがに1行では無理なのですが(例が悪くて申し訳ないス)、
なるほどmapを使ってstringの代わりにオブジェクト自体を持たせれば…

おかげでスマートな実装が見えてきました
> 読むときはまとまっていた方が嬉しいが
にも後押しされました。ありがとうございました。

78 名前:デフォルトの名無しさん :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);

もっといい書き方がありそう


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

お手本ありがとうございます。書き方も含め勉強になります。

80 名前:デフォルトの名無しさん :2005/07/04(月) 20:53:48
>>75
の例では断然上を取るがな、俺は。
下の良さってのは、領域が節約できることだけだ。
上の例はgrepやawkのようなツールでも扱いやすいし、
セーブやロードも単純化できる。


81 名前:76,78 :2005/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ではき出せばいいのかな。そこまでするものなのかな。


82 名前:デフォルトの名無しさん :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'」というエラーが出ました。
デフォルト引数でテンプレートを推論する事はできないのでしょうか?


83 名前:デフォルトの名無しさん :2005/07/06(水) 15:54:33
>>82
コンパイラの立場で質問。
c2.F();と書いた場合に、
引き数のない関数の呼び出しとディフォルト引き数つきの関数の呼び出しの区別はどうすればいい?

84 名前:82 :2005/07/06(水) 16:22:57
>>83
c::F(T t)はオーバーロードされてないんですが、呼び出しの区別に困るとはどういうことでしょう?

85 名前:デフォルトの名無しさん :2005/07/06(水) 20:32:29
>引き数のない関数の呼び出しとディフォルト引き数つきの関数の呼び出しの区別はどうすればいい?

区別のしようがないからエラーにしていいんじゃなかったっけ?

86 名前:デフォルトの名無しさん :2005/07/06(水) 22:26:41
デフォルト引数の中身を評価するのは、オーバーロード解決後なんじゃない?

87 名前:デフォルトの名無しさん :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

88 名前:デフォルトの名無しさん :2005/07/07(木) 01:03:31
c2.F<C1>();
これならさすがに通るな。

俺もメンバテンプレートをいまいち理解できてねーな。

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

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


皆様ありがとうございました。

90 名前:デフォルトの名無しさん :2005/07/07(木) 10:49:52
>>89
まぁ、デフォルト引き数は何かと問題になるから引き数の違いでコンストラクタを複数作るほうが無難だね。
しかも、>82の例だとそれがデフォルトコンストラクタになるのだから尚更。
#逆に、デフォルトコンストラクタを作りたくないとなると話は別だが。

91 名前:デフォルトの名無しさん :2005/07/08(金) 13:48:03
std::list の関数って何故全てが安定的になっているんですか?
今リストの勉強してるので気になります。

92 名前:デフォルトの名無しさん :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なだけに、なんか納得できない・・・。

93 名前:デフォルトの名無しさん :2005/07/08(金) 16:53:39
>>92
当たり前じゃん・・・・
それから、

SPOINT sp = {0, 0};

これはC++とは関係なく、Cでも出来る、構造体の初期化にすぎない。

94 名前:デフォルトの名無しさん :2005/07/08(金) 17:09:42
C99には複合リテラルがあるが果たしてC++で使い物になるかどうか。

95 名前:デフォルトの名無しさん :2005/07/08(金) 18:04:36
寧ろ、Cとの互換性のために残されたって気もする。

96 名前:デフォルトの名無しさん :2005/07/09(土) 00:28:38
>>92
class CPOINT
{
  int x_, y_;
};
F1(CPOINT(0,0));
↑これも通らないと納得いかないのか?

初心者の「納得行かない」はただ単に理解してないだけだよな

97 名前:デフォルトの名無しさん :2005/07/09(土) 00:35:41
>>91
意味がわからない。
「安定的」でないほうが自然な関数を例に挙げてもらえるとわかるかも。

98 名前:デフォルトの名無しさん :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が決定した後に値を代入したい と思っています。
宣言時以外の時に、まとめて代入はできないのでしょうか?
初心者丸出しですが、どなたか教えてください・・・・


99 名前:デフォルトの名無しさん :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()か。

100 名前:デフォルトの名無しさん :2005/07/09(土) 02:21:11
ゼロ梅しといて
for (int i = 0; i < 4; ++i)
  a[i][i] = X;
でいいだろ

101 名前:デフォルトの名無しさん :2005/07/09(土) 03:18:33
>>98
{} は初期化の構文なので定義のときしか使えない。

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

おとなしく要素ごとに代入するコードを書いてしまうのがいいよ。

102 名前:デフォルトの名無しさん :2005/07/09(土) 10:21:28
ところで98が宣言はブロックの先頭に限らないことを知らないという可能性はないのか?

103 名前:98 :2005/07/09(土) 14:25:20
レスありがとうございます

>>99
なるほど、そういわれてみればそれもアリですね

>>100
いや、全部埋めるわけではないので・・・

>>101
なるほど、やはり初期化の構文なのですね

>>102
大丈夫です。それは知ってます。
というか、今はその方法で乗り切ってます。

for文の中でXを決定し、それに沿った形で行列を定義する
プログラムなのですが、1回1回forの中で変数を作るのも
ちょっと気持ちが悪かったので、forの外で作った変数を
繰り返し利用できないかな と思った次第です。

104 名前:デフォルトの名無しさん :2005/07/09(土) 14:59:11
>>97
ソートとか

105 名前:デフォルトの名無しさん :2005/07/09(土) 16:34:04
>>103
パフォーマンス上の問題でも無い限り、メンテナンス上の問題を優先する意味で
変数はなるべく狭いスコープで定義(および初期化)することをお勧めする。

106 名前:92 :2005/07/09(土) 16:52:36
>>93
Cには一時オブジェクトがなかったから、
{}による初期化は宣言時の初期化用にしか作られていないということですかね。

>>96
それは
CPOINT cp(0,0);

F1(CPOINT(0,0));
も通らないという意味で、92で納得いかないと思ったこととは違います。
メンバ変数を順に初期化するコンストラクタをコンパイラが書いてくれたら便利だとは思いますけど。


レスありがとうございました。

107 名前:デフォルトの名無しさん :2005/07/09(土) 17:34:47
ほらやっぱりクラスと構造体の違いを理解してないだけじゃん
勉強しろ

108 名前:デフォルトの名無しさん :2005/07/09(土) 17:40:51
>>107
は?「クラスと構造体の違い」って、デフォルトのアクセス指定だけだろ?何を勉強しろって?

109 名前:デフォルトの名無しさん :2005/07/09(土) 17:45:31
そうそう。
俺は構造体にもよくコンストラクタをつける。

110 名前:デフォルトの名無しさん :2005/07/09(土) 18:08:30
このスレ質落ちすぎ。

111 名前:デフォルトの名無しさん :2005/07/09(土) 19:22:05
低下してまいりました。スレの質が。急速に。

112 名前:デフォルトの名無しさん :2005/07/09(土) 19:57:40
>>108
>何を勉強しろって?
オブジェクト指向。自分一人でC++だけ触ってりゃいい人は楽でいいですね。

113 名前:デフォルトの名無しさん :2005/07/09(土) 20:12:14
設計上の概念と言語要素をごっちゃにするなよ…
class{をstruct{private:に書き換えたところで何も変わらんだろ。

114 名前:デフォルトの名無しさん :2005/07/09(土) 20:19:21
設計上の概念が違うのに実装上では同じように書けなきゃおかしいと?
違う概念なんだから実装が違ってあたりまえだと思うのは普通じゃないのか。

115 名前:デフォルトの名無しさん :2005/07/09(土) 20:28:34
>>112
煽られたからってテキトーなこと言ってんじゃねーよ。
>92の質問は些細な言語仕様についてのもので、オブジェクト指向の概念とは関係ないだろ。

116 名前:デフォルトの名無しさん :2005/07/09(土) 20:46:42
>>114
それは曲解だ。
異なる設計上の概念が同じ言語要素に対応することが「あっても良い」と
言っている。

117 名前:デフォルトの名無しさん :2005/07/09(土) 21:12:46
>>112
ワロタ

118 名前:デフォルトの名無しさん :2005/07/09(土) 21:32:59
コンストラクタがあると{}で初期化できないって
やっぱ規格で決まってんのかなあ

119 名前:デフォルトの名無しさん :2005/07/10(日) 00:49:43
>>115
オブジェクト指向の為に導入されたクラスの記述方法に
オブジェクト指向の概念は必要ないと?素晴らしい支離滅裂ぶりですね。

120 名前:デフォルトの名無しさん :2005/07/10(日) 00:51:48
あと断っておきますけど構造体にコンストラクタのようなものが書けるようになったのは
オブジェクト指向におけるクラスにコンストラクタという概念があったからですよ。
逆もなきゃおかしいなんて無茶な事言わないで下さい。あくまで構造体が拡張されたんです。

121 名前:デフォルトの名無しさん :2005/07/10(日) 02:07:26
つまりデフォルトのアクセス指定だけが構造体とクラスの違いなわけですね ;-)

122 名前:デフォルトの名無しさん :2005/07/10(日) 06:11:14
>>119-120
あんた>107>112の人だよな?
煽られたからってテ(以下略)

たとえばC99のコンパウンドリテラルが使えれば>>92の問題は解決するわけだが、
C++にそれが存在しない理由は、オブジェクト指向の為ではない。
同様に、たとえば>>106の言う「メンバ変数を順に初期化するコンストラクタ」を
C++コンパイラが自動生成してくれない理由も、オブジェクト指向の為ではない。

つまり>92がオブジェクト指向を学んでも
「なぜC++ではこのような記述ができないのだろう」
という疑問の答えがそこに見出せるとは思わない。

あとな、C++スレで「クラス」といえば class で宣言されるアレで、
「構造体」といえば struct で宣言されるアレだと思うに決まってるだろ。
それとは別に自分で定義した意味があるんなら、
区別できるような呼び方にして、その意味をちゃんと説明しないとうまく伝わらないよ。

123 名前:デフォルトの名無しさん :2005/07/10(日) 10:05:35
「構造体とクラスの違い」の意味するところだけど、
みんなどれのことを言ってるの? 俺混乱してきた('A`)

A. structキーワードを使ったときとclassキーワードを使ったときの違い

B. 「構造体」という概念と「クラス」と言う概念の違い

C. その他

124 名前:デフォルトの名無しさん :2005/07/10(日) 12:14:26
煽りあってる奴全員がそのへんごっちゃにして書いてるからダラダラ続くんだろ。
int* p;の時の*(p+1)とp[1]が違うか同じかっていう議論に置き換えてみたらどうよ

125 名前:デフォルトの名無しさん :2005/07/10(日) 12:17:30
ふつうのブラジャーとフロントホックブラの違いも、アクセス権の違い
ということでよろしいでしょうか?


126 名前:デフォルトの名無しさん :2005/07/10(日) 12:34:54
「ふつうのブラジャーとフロントホックブラの違い」の意味するところだけど、
みんなどれのことを言ってるの? 俺混乱してきた('A`)

A. 着け方の違い

B. はずし方の違い

C. その他

127 名前:デフォルトの名無しさん :2005/07/10(日) 12:36:13
D. 脱がし方の違い

128 名前:デフォルトの名無しさん :2005/07/10(日) 12:39:12
童貞の戸惑い方の違い

129 名前:デフォルトの名無しさん :2005/07/10(日) 14:06:01
いやいや、外し方一つとっても両手で外すか片手で外すか、或いは口で外すかの違いがあるぞ。

130 名前:デフォルトの名無しさん :2005/07/10(日) 15:11:34
>口で外す
なんだかキモイ

131 名前:デフォルトの名無しさん :2005/07/10(日) 18:42:17
ぶらじゃーってきもちいいよね。癖になるぅ〜。

132 名前:デフォルトの名無しさん :2005/07/10(日) 19:12:59
質問です。
template<> Complex absolute<Complex>(Complex c) {return Complex(c.getAbs(), 0));}
の template<> Complex absolute<Complex> とは何なんでしょうか?
普通テンプレートの宣言は template<typename T> T absolute(T t){ ......... return t }
だと思うのですが。よろしくお願いします。

133 名前:デフォルトの名無しさん :2005/07/10(日) 19:17:18
>>132
クラス自体がテンプレート宣言を持たないメンバテンプレート。

134 名前:デフォルトの名無しさん :2005/07/10(日) 19:33:50
>>132
特殊化

135 名前:デフォルトの名無しさん :2005/07/10(日) 19:33:54
>>132 明示的特殊化の宣言。

136 名前:132 :2005/07/10(日) 20:04:08
なるほど、特殊化というのですか。
汎用的なテンプレートを特定の型用に定義しなおす場合に使うということですね。

参考になりました。thx

137 名前:デフォルトの名無しさん :2005/07/11(月) 17:42:09
もしかして配列へのconst参照は存在しない?(VC++7.1)
#include<iostream>
#include<typeinfo>
int main()
{
typedef char (&ref_array)[100];
typedef const char (&cref_array1)[100];
typedef const ref_array cref_array2;
typedef ref_array const cref_array3;

std::cout << typeid(ref_array).name() << std::endl; //char [100]
std::cout << typeid(cref_array1).name() << std::endl; //char const [100]
std::cout << typeid(cref_array2).name() << std::endl; //char [100]
std::cout << typeid(cref_array3).name() << std::endl; //char [100]

char a[100];
ref_array ref = a; ref[0]='A'; std::cout << ref[0] << std::endl; //A
//cref_array1 cref1 = a;cref1[0]='A'; std::cout << cref1[0] << std::endl;//compile-error
//cref_array1 cref1 = a;(const_cast<ref_array>(cref1))[0]='A'; std::cout << cref1[0] << std::endl;//damage-error(dangerous)
cref_array1 cref1 = a;(const_cast<char*>(&cref1[0]))[0]='A'; std::cout << cref1[0] << std::endl;//A
cref_array2 cref2 = a;cref2[0]='A'; std::cout << cref2[0] << std::endl;//A
cref_array3 cref3 = a;cref3[0]='A'; std::cout << cref3[0] << std::endl;//A
}



138 名前:デフォルトの名無しさん :2005/07/11(月) 17:47:52
>>137
そもそもtypeidで参照型は取得できないんじゃないの?

139 名前:デフォルトの名無しさん :2005/07/11(月) 17:57:05
クラスをネストするとき、内側のクラスから外側のオブジェクトにアクセスするのは
どうやるんでしょうか。

class outside {
 int x;
 class inside {
  void func() { x = 0; }; // x is not a member of outside::inside
 };
};
xをoutside::xにしたり、friend class outside;つけたりしましたがダメっぽいですよ。


140 名前:デフォルトの名無しさん :2005/07/11(月) 18:19:05
class outside {
 int x;
 class inside {
  void func(outside *o) { o->x = 0; };
 };
};

とか

class outside {
 int x;
 class inside {
outside * const o_;
inside(outside *o) : o_(o) {}
  void func() { o_->x = 0; };
 };
};

とかってこと?


141 名前:デフォルトの名無しさん :2005/07/11(月) 18:24:33
つーか、目的にも拠るがoutsideを継承するかoutsideのmenmberとしてinsideを持つかじゃないのかねぇ。

142 名前:デフォルトの名無しさん :2005/07/11(月) 18:29:06
外側クラスのポインタを取らないとアクセスできないのかな。
それはつまり、表記上ネストして書けるだけで、
実際には別のクラスと考えた方がいいのかな。

Nested Class Member Access
http://gcc.gnu.org/ml/gcc/2004-09/msg00158.html

c++0xだと、内側クラスに全アクセス権が付与されるみたいだけど。


143 名前:デフォルトの名無しさん :2005/07/11(月) 18:32:04
insideのインスタンスを作るのに、別にoutsideのインスタンスは要らないのだから、
何か渡されないとアクセスしようがないではまいか。

144 名前:デフォルトの名無しさん :2005/07/11(月) 22:12:22
>>139
何故それでアクセスできると思ったの?
javaかなんかと混同してない?


145 名前:デフォルトの名無しさん :2005/07/12(火) 00:00:35
>>139
>xをoutside::xにしたり、friend class outside;つけたりしましたがダメっぽいですよ。

friend class inside; だが。

146 名前:デフォルトの名無しさん :2005/07/12(火) 00:39:30
>>137
なんで存在しないと思うの?

typedef char array[100];
typedef array const& cref_array;

この cref_array では>>137の言う「配列へのconst参照」とは違うのか?

147 名前:デフォルトの名無しさん :2005/07/12(火) 06:06:37
次期C++で取り入れられる予定のtypeofは、リフレクションのような感じか。

148 名前:137 :2005/07/12(火) 07:13:45
>>146

typedef char array[100];
typedef array const& cref_array4;
//cref_array4 cref4 = a;(const_cast<ref_array>(cref4))[0]='A'; std::cout << cref4[0] << std::endl;//crash

const_castでクラッシュしたからそう思った。(勘違いなのかバグなのか)


149 名前:デフォルトの名無しさん :2005/07/12(火) 09:05:55
>>148
#include <iostream>
int main()
{
typedef char array[100];
typedef char (&ref_array)[100];
typedef array const& cref_array4;
char a[100];
cref_array4 cref4 = a;(const_cast<ref_array>(cref4))[0]='A'; std::cout << cref4[0] << std::endl;//crash
return 0;
}

ふつうに 'A' が表示されて終了したよ。(cygwin g++ 3.4.4)
なんで const_cast してるのかもよくわからんな。

150 名前:デフォルトの名無しさん :2005/07/12(火) 14:36:01


151 名前:デフォルトの名無しさん :2005/07/12(火) 20:48:20
>>148
VC7.1でやってみたがクラッシュしなかった

152 名前:デフォルトの名無しさん :2005/07/12(火) 21:40:11
>>148
VC7.1でやってみたがクラッシュした。

153 名前:デフォルトの名無しさん :2005/07/12(火) 21:42:38
>>148
やってないけどクラッシュした

154 名前:デフォルトの名無しさん :2005/07/12(火) 22:04:37
>>151 は勘違い

155 名前:デフォルトの名無しさん :2005/07/12(火) 22:22:13
int main()
{
 char a[100] = {0};
 static_cast<char (&)[100]>(a)[0] = 'A';
}
これでも落ちた

156 名前:デフォルトの名無しさん :2005/07/12(火) 22:25:06
template <class T>
char (&foo(T& t)) [100]
{
 return t;
}

int main()
{
 char a[100] = {0};
 //static_cast<char (&)[100]>(a)[0] = 'A';
 foo(a)[0] = 'A';
}

これだと落ちない

157 名前:デフォルトの名無しさん :2005/07/12(火) 22:37:44
VCで155のコードを実行すると0x00000000を読もうとしたと出るが、
aを初期化しないでやると0xccccccccを読もうとして落ちる。
余計に参照剥がしをしているみたいだ。

158 名前:デフォルトの名無しさん :2005/07/12(火) 23:02:00
バグか。まあいいやもうすぐ2005出るから。

159 名前:デフォルトの名無しさん :2005/07/13(水) 00:09:15
禿しくフケたな・・・ www.research.att.com/~bs

160 名前:デフォルトの名無しさん :2005/07/13(水) 00:23:56
'A';
↑毒男に見えた・・


161 名前:デフォルトの名無しさん :2005/07/13(水) 00:28:39
艶がダライアスの WAVE みたい

162 名前:デフォルトの名無しさん :2005/07/15(金) 13:06:37
質問です。

std::string から const char* に変換するときに c_str() メソッド
を使う必要がありますが、なんとか省略する方法はないかと悩んでます。
別に省略しなくても処理の上で不都合はないんですが、
一々書くのめんどいよな、というのが理由です。

で、自分なりに方法を考えてみてるんですが、

1)std::string に operator const char*() を実装する
←ビルドする環境全てに手を加えないといけない。移植性が低下する。

2)std::stringを派生させて、そのなかで operator const char*() を実装する。
←無理。std::stringのデストラクタがvirtualで宣言されてないから
(Effective C++ 14項)

3)std::stringクラスの実装をコピペしてクラス名を変えて
その中で operator const char*()を実装する。文字列処理には
そのクラスを使う。
←gccのライブラリに付いてる<string>は、GPLで配布されてるから
ソース非公開のプログラムには使えない。ソース非公開な
プログラムで改変利用OKな実装があれば解決。

4)std::string代替クラスを自力で作って、operator const char*() を実装する。
文字列処理にはそのクラスを使う。
←自力で処理を実装しなくても std::string() に処理を委譲するとか
すれば、デバッグの必要も無い。

他に方法が無いなら 4) で行こうかなと思ってます。
スマートな解決法があれば教えてください。

163 名前:デフォルトの名無しさん :2005/07/15(金) 13:33:33
>>162
漏れなら単に .c_str() を一々付けて使うけど、それがどうしても嫌なら

class cstring : public std::string {
public:
 あれこれコンストラクタを定義
 operator const char*() { return c_str(); }
};

で済ませる。このケースで virtual dtor なんかいらない。

164 名前:デフォルトの名無しさん :2005/07/15(金) 13:39:58
>>162
おいらはstd::stringをprivate継承して
usingでメンバーファンクションをエクスポートかな
operator const char*()はc_strを使う


165 名前:& ◆oEOWZNRqwk :2005/07/15(金) 15:35:59
>>163
あ、それで良かったんですか。
派生するときには無条件にデストラクタをvirtualにしないと
いけないような気がしてました。今Effective C++読み直してみたら、
「子クラスのメンバが解放されないことがあるからデストラクタ
をvirtualにすること」って書いてたので、どうやらこのケースだと
問題なさそう。これで逝きます。Thx

>>164
using云々がちょっと分からない。privateにする必要も無い気が…
でも返事ありがd


166 名前:デフォルトの名無しさん :2005/07/15(金) 16:23:59
private なら std::string* s = new mystring; って出来ないから delete s; が安全ってことじゃない?
using はただ private メンバを持ってきてるだけだと思うけど

167 名前:デフォルトの名無しさん :2005/07/15(金) 16:26:10
あーでもこの場合private継承しなくともコンポジットでいけるから
確かにprivateにする必要ないかもね。漏れもよく分からん。

168 名前:デフォルトの名無しさん :2005/07/15(金) 17:21:55
>>167
using の方が全ての転送関数を書くよりもほんの少し楽。
おれはコンポジション派だが。

169 名前:デフォルトの名無しさん :2005/07/15(金) 17:26:55
趣味でC++/WinAPIで組んでて、UNICODE使うのにも踏み切れず、
std::string で1バイトずつ2バイト文字かどうか判別しながら使ってるんだけど、
こんな場合例えば std::string::find() とかの2バイト文字対応版みたいなのはどう作るべきかな。

グローバルとか適当なネームスペース内にただの関数として作るとか、
継承して作るとか考えてみたけど、find(str, "hoge") は str.find("hoge") って書きたいし、
普段使うときは std::string で使いたいから、継承するのもコピーしたりのコストがかかるし。
何かしら我慢するしか無いんだろうか…。

170 名前:デフォルトの名無しさん :2005/07/15(金) 17:37:20
>>169
そういうのはchar_traitsを自分で書けばいい。そしてtypedefする。
class my_char_traits {};
typedef std::basic_string<char, my_char_traits> mbstring;
あるいはstd::char_traits<unsigned char>を特殊化してもいいかもしれない。

171 名前:164 :2005/07/15(金) 18:28:55
>>168
>using の方が全ての転送関数を書くよりもほんの少し楽。
意図してたのはこれです

>>165
class my_string: private std::string {
typedef std::string Base_;
public:
my_string (const char *p): Base_ (p) {}
operator const char*() {return c_str ();}
using Base_::size;
};
こんな感じで必要なメンバ関数をエクスポートしていくと引数
返値の型をいちいち写す必要がないのでちょっと楽かと思います
ちなみにおいらもc_str派


172 名前:デフォルトの名無しさん :2005/07/15(金) 18:34:07
C++ロケールはグローバルロケールを汚染しない?


173 名前:デフォルトの名無しさん :2005/07/15(金) 18:34:27
>>162
俺の場合、c_str()を呼ぶのは関数の引数に渡す場合が1番多いから、
5) 必要になるたびに関数をオーバーロードする。
自作の関数でなければ自分の名前空間に入れて、usingせずに使っている。
namespace hoge
{
  inline BOOL TextOutW(HDC hdc, int nXStart, int nYStart, const std::wstring& str)
  {
    return ::TextOutW(hdc, nXStart, nYStart, str.c_str(), static_cast<int>(str.length()));
  }
}

174 名前:デフォルトの名無しさん :2005/07/15(金) 18:39:08
>>162
Exceptional C++のitem39に全く同じ質問があるな

175 名前:デフォルトの名無しさん :2005/07/15(金) 20:33:07
>>173
.c_str()を書く手間を省きたいだけで、関数ごとにそれだけ書くのは耐え難いんじゃないか?

実際には、レガシーなポインタを受けるような関数を使うときは、
何らかの理由で自分でラッパを書くことが多いから、オーバーロードは手間でないのかもしれないが。

// 例えば>>173のコードだと、HDCをメンバ変数に保存するようなファンクタを書くなどで
// 結果的にオーバーロード自体を行う必要があり、ついでにラッパの引数はstringで受けるように
// 書けばよい、など。


176 名前:デフォルトの名無しさん :2005/07/15(金) 22:55:01
なんでchar*への変換オペレータを提供してないか考えれば
c_str()を書く手間など

177 名前:デフォルトの名無しさん :2005/07/15(金) 23:17:43
>>176
そうだな

178 名前:デフォルトの名無しさん :2005/07/16(土) 00:34:34
実験で使う器具名、その製造会社・型番・製造番号を入力し
それを器具名でexitと入力されたらそこで終了というプログラムを作りたいのですが
どうやって終了させれば分かりません。
どなたか教えてもらえないでしょうか?

char data[4][20];
while(data[0] != "exit"){
printf("器具名を入力してください(exitで終了)->");
scanf("%s",data[0]);
printf("製造会社を入力してください->");
scanf("%s",data[1]);
printf("型番を入力してください)->");
scanf("%s",data[2]);
printf("製造番号を入力してください->");
scanf("%s",data[3]);
printf("\n");
}

179 名前:デフォルトの名無しさん :2005/07/16(土) 00:36:34
とてもC++には見えんのでstrcmpあたりかな。

180 名前:178 :2005/07/16(土) 00:37:33
すみません。日本語むちゃくちゃでした。

実験で使う器具名、その製造会社・型番・製造番号を入力し
それをループさせてexitと入力されたらそこで終了というプログラムを作りたいのですが
どうやって終了させればいいのか分かりません。
どなたか教えてもらえないでしょうか?

181 名前:デフォルトの名無しさん :2005/07/16(土) 00:41:29
>>180
スレタイを百回声に出して読め。
それでも分からなかったら回線切って首吊って氏ね。

182 名前:デフォルトの名無しさん :2005/07/16(土) 00:47:30
>>181
分からなかったから回線切ります。マジで。
なんかもうどうでもよくなってきたよ…。あーなんでこんなに働かなきゃいけないんだろ…。

183 名前:デフォルトの名無しさん :2005/07/16(土) 00:48:55
仕事でそれかよ。
お前の人生テラヤバスw

184 名前:デフォルトの名無しさん :2005/07/16(土) 00:54:42
人間と一緒にいるのが嫌になったんだお
逝ってきますね

185 名前:デフォルトの名無しさん :2005/07/16(土) 00:55:46
おー、逝ってらっしゃい。

186 名前:デフォルトの名無しさん :2005/07/16(土) 00:59:03
ここもネタスレになったか・・・

187 名前:デフォルトの名無しさん :2005/07/16(土) 07:46:44
>>181
何でだよ、178 のプログラムは ISO/IEC14882 で明白に認められているれっきとした C++ プログラムたりうるぞ
おまえこそ規格票を百回声に出して読め、それでわからなかったら回線切って首吊って氏ね

188 名前:デフォルトの名無しさん :2005/07/16(土) 10:43:53
またこのゴネ方か。

189 名前:デフォルトの名無しさん :2005/07/16(土) 10:47:15
>>187
> 何でだよ
printf/scanfはC++では用いられないことが多く、178は<cstdio>をインクルードしたようではない。
となるとCだと想像される。

190 名前:デフォルトの名無しさん :2005/07/16(土) 10:57:08
stringstreamが使いづらいのでCString::FormatやAnsiString::sprintf使うような人がいることも忘れないでください

191 名前:デフォルトの名無しさん :2005/07/16(土) 10:57:48
>printf/scanfはC++では用いられないことが多く、

ソース


>178は<cstdio>をインクルードしたようではない。

ソース


>となるとCだと想像される。

あ、ソースか

192 名前:デフォルトの名無しさん :2005/07/16(土) 11:00:39
ほとんどアッパーコンパチに近いんだから何だってありだが、
まぁ他にC言語のスレはたくさんあるんだから、あえてこのスレを選ぶなら
C++の質問のほうがふさわしい。

193 名前:デフォルトの名無しさん :2005/07/16(土) 11:05:41
だから「C++」とは何かをはっきりさせなさいよ
ISO/IEC14882 が定義する範囲じゃないんですか

194 名前:デフォルトの名無しさん :2005/07/16(土) 11:09:54
俺も、このコードは「Cのソース」だと思うが
俺自身もC++でstdioを使いまくることもあり、「向こう行け」とは言えないのも事実。
そして何より、最近はCとC++の区別をつけずに
いきなりC++から入る人も多いため、どこまでがCの範囲かわかっていない人も多い。

が、それでもやっぱり「C++スレ」向きじゃないと思う。

195 名前:デフォルトの名無しさん :2005/07/16(土) 11:24:08
まあ、迷ったら↓がおすすめと言うことで

【初心者歓迎】C/C++室 Ver.19【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1119793525/

196 名前:デフォルトの名無しさん :2005/07/16(土) 11:26:52
>>193
なにを持って「このスレでのC++」の意味合いとするの?
 ・住人の多数決の多いほう?
 ・このスレの >>1 の意見?
 ・part1の >>1 の意見?
君が常識的に考えてそう思うのならそれで良いのでは?

197 名前:デフォルトの名無しさん :2005/07/16(土) 12:01:44
printf, scanf は C++ でもあるだろうけど、C の一部
でもあるんだからCスレでやるのが一番なんじゃないの?
C++ 固有が少しでも入ってたらここでやるってのでいいんじゃない?

198 名前:デフォルトの名無しさん :2005/07/16(土) 12:52:56
今回は181が馬鹿なのと
かといって178が擁護するほど意欲が湧く質問じゃなかったというだけの話

199 名前:169 :2005/07/16(土) 13:49:34
>170
d。なるほど、そんな手もあるのか。
よく考えたら find(str, "hoge") がダメで「std::string」を使う上にコピーがダメとなれば、
参照を持つクラス作って hoge(str).find("hoge") くらいしか書きようが無いな。
とりあえず char_traits とか試してみる。

200 名前:デフォルトの名無しさん :2005/07/16(土) 14:12:35
>>197
>>194 の指摘はふまえた上での発言か

C++ と被る言語は C だけではない
どの言語とも被らないことの証明は悪魔の証明

ここよりも妥当なスレがあると主張する者に
そのスレの具体的なアドレスを示して誘導する挙証責任があり、
かつ誘導された者がこのスレでも話せることを別スレで話すかどうかは任意

201 名前:デフォルトの名無しさん :2005/07/16(土) 16:05:50
ジャヴァに似てるっすね

202 名前:デフォルトの名無しさん :2005/07/16(土) 16:43:22
>>201
作者の風貌も最近似てきた


203 名前:デフォルトの名無しさん :2005/07/16(土) 18:35:47
はーーーっはっは
所詮はできそこないの言語よ

204 名前:デフォルトの名無しさん :2005/07/16(土) 20:21:29
>>203
お前は所詮できそこないの人間だけどな。

205 名前:デフォルトの名無しさん :2005/07/16(土) 21:32:52
別にC++でコンパイルできようと、Cスレがあるんだから、
そっちが適当ならそっちへ行くべき。なんだっけか、
「特別法は一般法に優先する」みたいな。

206 名前:デフォルトの名無しさん :2005/07/16(土) 21:45:07
てかC標準までここで扱ってたら
Cスレ要らないじゃん

207 名前:デフォルトの名無しさん :2005/07/16(土) 22:00:02
>>205
>>200

208 名前:デフォルトの名無しさん :2005/07/16(土) 22:29:21
帰れ

209 名前:デフォルトの名無しさん :2005/07/16(土) 23:33:10
なぁ、

210 名前:デフォルトの名無しさん :2005/07/16(土) 23:35:02
public:やprotected:にstaticメンバがあるのはわかる。
private:なところにstaticメンバを作るのってどういう意味があるんだ?
そのprivate:のstatic でかつ、constをつけた場合とそうでない場合の意味を教えてくれ。

211 名前:デフォルトの名無しさん :2005/07/16(土) 23:57:26
・Singleton
・他に見られたくない定数

212 名前:デフォルトの名無しさん :2005/07/17(日) 00:13:30
>>210
アクセス指定と、 static にするかしないかは関係ないだろ。

213 名前:デフォルトの名無しさん :2005/07/17(日) 00:37:44
privateのstaticなんて何に使うんだよ、って意味じゃなくて?

214 名前:デフォルトの名無しさん :2005/07/17(日) 00:41:40
>>213
private を使う場面と、 static を使う場面が重なれば private の static になる。それだけだろ。
組み合わせたから特別な意味になるわけじゃない。
さらに const も同様。 >210 は何かを誤解してるんじゃないかと思う。

215 名前:デフォルトの名無しさん :2005/07/17(日) 04:21:50
>>211
あーそっか!
シングルトンがあったな!そーいや、アレはprivateなstaticだっけな

>>213
そうそう

>>212,>>214
おめーら馬鹿だなぁ、>>211を見習えよ

216 名前:デフォルトの名無しさん :2005/07/17(日) 04:46:58
外部に晒したくないけどクラス内で共有したい情報なんていくらでもあるだろ
やはり>>210はstaticメンバが何なのかまるでわかってないに一票

217 名前:デフォルトの名無しさん :2005/07/17(日) 04:56:33
>>216
オブジェクトを生成しなくても利用できるメンバだろ?
static変数に限って言えば、存在範囲が限定されないオブジェクト。

218 名前:デフォルトの名無しさん :2005/07/17(日) 04:59:24
privateでstaticってのはわかるよ、そりゃ分かる。
どんなときに使うのか、シングルトンみたいな具体例を示してくれってことだ。
オレにいくら、そもそもstaticとは何か、なんて言っても無駄だ。

219 名前:デフォルトの名無しさん :2005/07/17(日) 05:01:37
あーっていうか、もう解決してんだけどさ。
>>211の時点で。
スマートポインタとかそんなとこだろ。

220 名前:デフォルトの名無しさん :2005/07/17(日) 07:16:31
例えば
class MyString {
 static char null;
 const char *data;
public:
 MyString(const char *s): data(&null) {
  if (s && *s) {
   data = new ...;
   ...
  }
 }
};
みたいなのとか、いくらでもありそうな気がするけど。

221 名前:デフォルトの名無しさん :2005/07/17(日) 09:48:46
で、>>210 はなんでこんなに偉そうなんだ?

222 名前:デフォルトの名無しさん :2005/07/17(日) 09:49:19
>>221
ヒント:学歴

223 名前:デフォルトの名無しさん :2005/07/17(日) 12:28:04
ム板は回答者にエスパー能力が必要とされるからな。

224 名前:デフォルトの名無しさん :2005/07/17(日) 12:56:10
回答者のレベルが低い場合もあるにはあるが、
>public:やprotected:にstaticメンバがあるのはわかる。
の一行が意味無いっつーか余計で全体の文がワケ分からなくなってる。

225 名前:デフォルトの名無しさん :2005/07/17(日) 13:20:53
クラス属性って何ですか?

226 名前:デフォルトの名無しさん :2005/07/17(日) 14:08:47
>>225
クラスの属性です

227 名前:デフォルトの名無しさん :2005/07/17(日) 14:28:23
3年B組の属性はどんな感じでしょうか?

228 名前:デフォルトの名無しさん :2005/07/17(日) 14:30:00
熱血:
友情:

229 名前:デフォルトの名無しさん :2005/07/17(日) 14:34:29
背徳:
憎悪:

230 名前:デフォルトの名無しさん :2005/07/17(日) 20:44:05
C++初心者なんですが…。
ファイルの一覧を取得したくて下記のfindfirstを使ったのですが引数の*filespecって絶対パスでなければ使用不可能なんでしょうか。
MSDNには「ターゲット ファイルの指定 (ワイルドカードも使えます)」なんて書いてあるんですが、
ためしに相対パスを使用したらEINVAL(Invalid argument)が返ってきちゃいました。
みなさんは相対パスで指定したいときってどうされていますか?
そもそも相対パスなんか使わずに、まず絶対パスを取得して、その後findfirstを使用するのが一般的なんでしょうか。
ご教授ください。


long _findfirst( char *filespec、struct _finddata_t *fileinfo );

231 名前:デフォルトの名無しさん :2005/07/17(日) 20:57:17
>>230
それはC++標準の関数ではないから、こっちの方が適切と思われる。
Win32API質問箱 Build33
http://pc8.2ch.net/test/read.cgi/tech/1120153520/

232 名前:デフォルトの名無しさん :2005/07/17(日) 21:05:33
>>230
あくまで C++ の範疇での回答だが・・・

その「相対パス」とやらを、画面に表示してみてはどうだろう
文字列を渡す関数でトラブったときの常套手段で、ものすごく初歩的なミスにがっかりできたりする

233 名前:デフォルトの名無しさん :2005/07/17(日) 21:57:55
誘導&アドバイスありがとうございます。
ちなみに相対パスをコンソールに出力したところ
"..\\Work"
と想定どおりのパスが表示されました。
もちろんディレクトリ未存在ってことはないんですが。。。。
ちなみに絶対パスでは動作確認できました。

234 名前:デフォルトの名無しさん :2005/07/17(日) 21:59:09
>"..\\Work"
これは想定どおりなのか…?

235 名前:デフォルトの名無しさん :2005/07/17(日) 22:02:42
ATL では DLL か EXE を出力しますが OCX はだめなのでしょうか?

236 名前:デフォルトの名無しさん :2005/07/17(日) 22:06:08
何を 言って るんだか 分か りません

237 名前:デフォルトの名無しさん :2005/07/17(日) 22:24:03
Windowsでの質問なんですけど。
Unicodeでの1文字の表現でどうすれば良いんでしょうか?

asciiだと以下のような感じの場合unicodeだとどうすればよいのか

char hoge = 'a';

WCHAR hoge = 「ここがわかりません」



238 名前:デフォルトの名無しさん :2005/07/17(日) 22:27:34
>>237
そういう場面でリテラルなんか使うかよ

239 名前:デフォルトの名無しさん :2005/07/17(日) 22:29:27
>>237
WCHAR hoge = L'a';


240 名前:デフォルトの名無しさん :2005/07/17(日) 22:31:15
char:きゃー
wchar:うきゃー
俺詠み

241 名前:デフォルトの名無しさん :2005/07/17(日) 22:31:24
>>239
ああ、それで理解するのですか。
どもでし。

242 名前:デフォルトの名無しさん :2005/07/17(日) 22:32:02
>>240
かわいいな。
セルJr.のようだ

243 名前:デフォルトの名無しさん :2005/07/17(日) 22:37:42
ヒント:サイバイマン

244 名前:デフォルトの名無しさん :2005/07/17(日) 22:43:47
>>237
少なくともC99とかだと\u表記が使えるみたいだな
ソースのエンコーディングを限定していいのなら、
L"あああ"
とか書ける。この辺はコンパイラ依存。

多国語対応が必要 & \u表記が使えないんなら、
wchar_t c = 0x2359;
とか
wchar_t s[] = { 0x1234, 0x2345, 0 };
とか書かざるを得ないだろ

245 名前:デフォルトの名無しさん :2005/07/17(日) 22:55:39
>>244
\uはC++にも存在する。

246 名前:デフォルトの名無しさん :2005/07/18(月) 03:14:54
16bit のフルアダーをビット演算だけで作る方法を教えて下さい。m(_ _)m

247 名前:デフォルトの名無しさん :2005/07/18(月) 11:36:14
よくわからんがこんなか?

unsigned short
fadd_bit(unsigned short x, const unsigned short b) {
  if (x & b) {
    x = fadd_bit(x, b<<1);
    x &= ~b;
  } else {
    x |= b;
  }
  return x;
}
unsigned short
fadd(unsigned short x, unsigned short y)
{
  while (y) {
    unsigned short yy = y&~(y-1);
    y ^= yy;
    x = fadd_bit(x, yy);
  }
  return x;
}



248 名前:デフォルトの名無しさん :2005/07/18(月) 13:12:05
テストしてないが全ビットいっぺんにやってみた
typedef unsigned short T;
T fadd(T a, T b)
{
 while (b) {
  T carry = a & b;
  a = (a | b) ^ carry;
 b = carry << 1;
 }
 return a;
}


249 名前:デフォルトの名無しさん :2005/07/18(月) 13:14:58
おまえら、アレだ。
C++で名前空間と例外をうまく使わないと
糞プログラムだぞ。

250 名前:デフォルトの名無しさん :2005/07/18(月) 13:20:11
>>247 thx です。

でもyとyyのところがよくわららナイッす。

while (y) {
unsigned short yy = y&~(y-1);
y ^= yy;



for (unsigned short bit = 1; bit!=0; bit <<= 1) {
yy = y & bit;

と等価と考えていいですか?


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