C++相談室 part60 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
08/01/11 18:43:34
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

2:デフォルトの名無しさん
08/01/11 18:44:27
■基本■
[C++ FAQ]
 URLリンク(www.parashift.com)
 URLリンク(www.bohyoh.com) (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 URLリンク(www.cppreference.com) (英語)
 URLリンク(www.cppll.jp) (↑の日本語訳だけど最新は反映しない)
[禿 Stroustrup]
 URLリンク(public.research.att.com)
[C++ International Standard]
 URLリンク(www.iso.org)
[JTC1/SC22/WG21 - C++]
 URLリンク(www.open-std.org)
  ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
[JIS X3014]
 URLリンク(www.jisc.go.jp)
  ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。

3:デフォルトの名無しさん
08/01/11 18:44:42
■Books(Templateまわり)■
Effective STL
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
Modern C++ Design
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
C++ Templates
 URLリンク(www.amazon.com)
C++ Template Metaprogramming
 URLリンク(www.amazon.com)

4:デフォルトの名無しさん
08/01/11 18:44:58
■Libraries■
[Boost]
 Boost URLリンク(www.boost.org)
 (日本語) URLリンク(www.kmonos.net)
 (日本語) URLリンク(shinh.skr.jp)
[標準ライブラリ]
 SGI-STL URLリンク(www.sgi.com)
 STLport URLリンク(stlport.sourceforge.net)
 GNU libstdc++ URLリンク(gcc.gnu.org)
 Apache STDCXX URLリンク(incubator.apache.org)
 STLFilt URLリンク(www.bdsoft.com)
 (日本語) URLリンク(www005.upp.so-net.ne.jp)
 (日本語) URLリンク(www.wakhok.ac.jp)
[Loki]
 URLリンク(sourceforge.net)
 LokiPort-MSVC6sp5 URLリンク(fara.cs.uni-potsdam.de)

5:デフォルトの名無しさん
08/01/11 18:45:19
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。


6:デフォルトの名無しさん
08/01/11 18:45:37
前スレ

C++相談室 part59
スレリンク(tech板)

7:デフォルトの名無しさん
08/01/11 19:00:39
復活か?

8:デフォルトの名無しさん
08/01/11 19:10:02
Prototype パターンに関する質問
派生させた、インスタンスの消滅(delete)は何処でやったらいい?
基底のデスクトラクタは、Effective C++ 新訂3版、宜しく
virtualで宣言してるんだけど?


9:デフォルトの名無しさん
08/01/11 19:12:26
C++ Primer 4/E 買った奴いる?
内容はどうだった?

10:デフォルトの名無しさん
08/01/11 19:15:00
>>8
俺はstd::auto_ptrに突っ込んでいるが。

11:デフォルトの名無しさん
08/01/11 19:53:48
>>8です
とりあえず
std::auto_ptr
boost::shared_ptr
は、なしで宜しくオナガイシマス

12:デフォルトの名無しさん
08/01/11 20:02:58
同等のクラスを作れ

13:デフォルトの名無しさん
08/01/11 20:14:00
>>12
kuwasiku

14:デフォルトの名無しさん
08/01/11 20:18:29
おもっくそ真面目に作りたきゃ Modern C++ Design でも読めばいいが、
適当でいいなら適当なソース読め。

15:デフォルトの名無しさん
08/01/11 20:20:26
>>Modern C++ Designは持ってるが、読破できん
>>適当でいいなら適当なソース読め。
どこにある?


16:デフォルトの名無しさん
08/01/11 20:41:09
boostなら落としてこい。
auto_ptrならコンパイラが持ってるかも知れん。検索しろ。
開発環境書かなきゃディレクトリなんてわかるか。

17:デフォルトの名無しさん
08/01/11 20:50:05
>>11
std::tr1::shared_ptrという抜け穴w

18:デフォルトの名無しさん
08/01/11 20:54:22
Loki のやつを使うという手も

19:デフォルトの名無しさん
08/01/11 21:08:13
>>8だが
LokiはModern C++ Designに載ってるライブラリだろうが
なもん判るか、ぼけ
ってゆうか、予想はしてたが、Prototype パターンで、派生させた、
インスタンスを消滅させるのって、やっかいなんだな

20:デフォルトの名無しさん
08/01/11 21:15:18
読めと言ってる訳じゃねー

21:デフォルトの名無しさん
08/01/11 21:28:03
最大50桁の数字を2つ入力して
その和と積と差を求めるプログラムを作りたいんだけど、
50桁も入力できない!!!
20桁もできない

どうすれば入力できますか?

22:デフォルトの名無しさん
08/01/11 21:29:37
>>19
べつにPrototypeに限らん。
生成パターンで生成させたオブジェクトは皆同じ。
元々JavaとかC#に向いた手法だよな。

23:デフォルトの名無しさん
08/01/11 21:30:31
多倍長演算でググれ

24:デフォルトの名無しさん
08/01/11 21:32:05
>>21
入力を文字列として読み取り、ひと桁ずつを配列に入れる。
あとはお前が筆算をやる要領でひと桁ずつ下の桁から加算する。
10を超えたら次の桁(=次の配列)に桁上げする。

単純だけど、こんなんでも一応実現できる。


25:デフォルトの名無しさん
08/01/11 21:41:12
>>21
マルチ
今宿題スレに行ってるな

26:デフォルトの名無しさん
08/01/11 21:48:00
>>19
>>22
個人的な意見だが、ポインタ使って、ヒープにメモリ確保するのって
後始末が煩雑だから、嫌なんだよね、静的にインスタンスが、作れないものかな・・・



27:デフォルトの名無しさん
08/01/11 22:16:52
>>25
宿題スレ行きました
出来れば助けてください!笑

>>29
ありがとうございます!!(ノ_・。)

28:デフォルトの名無しさん
08/01/11 22:34:59
↑上の
29じゃなくて
>>24
のまちがいでした。。
あと、できればプログラム詳しく教えてほしいんですが(ノ_・。)
配列にいれて足していくってどうやればいいですか???

>>23
ぐぐります!!

29:デフォルトの名無しさん
08/01/11 23:12:53
>>28
マルチしてるのでどっちか取り下げないか?
助けてやろうにもどっちで助ければいい?

30:デフォルトの名無しさん
08/01/11 23:20:49
じゃあ向こうのスレでお願いします!!

31:デフォルトの名無しさん
08/01/11 23:23:23
マルチごめんなさい(ノ_・。)

32:デフォルトの名無しさん
08/01/12 11:05:00
More Effective C++ 新訂3版のテクニックという章に
class NLComponent
{
  virtual NLComponent * clone() const = 0 ; // クローンメソッド
};
基底クラスに、純仮想関数を宣言して、派生クラスでインスタンスを生成する方法が
載っているんだけど、一例で、ディスク上に保存されている、オブジェクトを
std::istream strを引数にとるコンストラクタで渡してやってるんだけど
これって、なんかおかしい気がする、理由は、コンストラクタで例外が起きたらどうなるんだ?
どう思うよモマイラ

33:デフォルトの名無しさん
08/01/12 11:15:58
>>32より
32の質問は却下します、スマン

34:デフォルトの名無しさん
08/01/12 17:50:36
>>33
おいおい、自分で書いておいて却下するなよ。

35:デフォルトの名無しさん
08/01/13 23:53:36
VC++ 2005を使っています。
テキストファイルから文字列を読み込んでいるのですが、CStdioFileなどを使った読み込みですと、1行ずつ読み込むしかありません。
これを、1行ではなく指定の区切り文字まで読み込む、というのをやりたいのです。

具体的に言うと、「。」がくるまで読み込みをやりたいと思っています。

今日は晴れです。明日も晴れです。

という文章を読み込む場合、最初の読み込み時では
今日は晴れです。
が読み込まれ、次の読み込みで
明日も晴れです。
が読み込まれるようにしたいと考えています。

何か標準のライブラリでこのようなものはないでしょうか? よろしくお願いします。

36:デフォルトの名無しさん
08/01/14 00:14:40
1文字ずつ読み込んで、望みの区切り文字列が現れたところで止める。

37:デフォルトの名無しさん
08/01/14 00:35:49
>>35
getline(basic_istreamのメンバもグローバル関数のほうも)では、
\nに代わって区切る文字を指定できる。

ただし、元が改行文字を取り除く仕様なので、
当然指定した区切り文字は削除される。

std::wifstream is("hoge.txt");
is.imbue(std::locale("japanese"));

std::wstring s1, s2;

std::getline(is, s1, L'。');
std::getline(is, s2, L'。');

//s1 == L"今日は晴れです"
//s2 == L"明日も晴れです"

38:35
08/01/14 01:58:54
>>37
どうも、ありがとうございます。それを使ってみたいと思います。

39:デフォルトの名無しさん
08/01/14 21:44:28
Emacs にも Visual C++ の IntelliSense のような
入力支援機能を実現する Emacs Lisp プログラムが
用意されているのでしょうか?

単純なキーワード色づけは今も使っているのですが,
もっと詳細な情報を得たいと思っています.

40:デフォルトの名無しさん
08/01/14 23:51:44
C++及びオブジェクト指向初学者です(C++入門本一読程度) 。いくつかの
クラスオブジェクト(CObjxx)を任意数包含する クラス(CTestxx)を複数生成
したいと考えています。
class CObjA {...}; // 既存クラス(修正不可)
・・・
class CObjD {...}; // 既存クラス(修正不可)
class CTestA {
private:
CObjA m_objA;
CObjB m_objB;
};
class CTestB {
private:
CObjB m_objB;
CObjC m_objC;
};
・・・
class CTestF {
private:
CObjA m_objA;
CObjC m_objC;
};
int main()
{
CTestA testA;
・・・
}
現在、このような実装で検討していますが、この方法だと各CTestxx毎に
CObjxxに対するアクセサを 用意してあげる必要があり、かつ似たような
巨大なクラスCTestxxが出来上がってしまい、 スマートな実装ではない気が
しています。。。 上記のようなケースは どのように実装するのが適切なのでしょうか。
ご教授をお願いします。

41:デフォルトの名無しさん
08/01/14 23:51:44
んー、それは言語系スレじゃなくてツール系スレに行くべきかな。

42:デフォルトの名無しさん
08/01/14 23:56:00
>>41>>39へのレス

>>40
抽象度が高すぎてなんともいえないな…。
CTestXXはラッパークラスなんかね?
それとも唯のコンテナか…エスパーに任せる。

43:デフォルトの名無しさん
08/01/14 23:58:18
>>40
各Obj毎のアクセサクラス作って多重継承してみたら?
class CObjAAccessors {
public: objA用アクセサ;
protected: CObjA m_objA;
};
class CObjBAccessors {
public: objB用アクセサ;
protected CObjB m_objB;
};
class CObjCAccessors {
public: objC用アクセサ;
protected: CObjC m_objC;
};
class CTestA: public CObjAAccessors, public CObjBAccessors{};
class CTestB: public CObjBAccessors, public CObjCAccessors{};
...
class CTestF: public CObjAAccessors, public CObjCAccessors{};

44:デフォルトの名無しさん
08/01/15 00:02:24
>>39
ある。無論標準装備ではない。

45:デフォルトの名無しさん
08/01/15 00:25:29
ある基底クラスと派生クラス群があって
格派生クラス群は固有タイプのパラメータ(intやdouble[2]とか)を持っているとする

開始関数Begin()を呼ぶ前にそれぞれ独自のパラメータを
SetParameter(ParameterType[], int paramSize)で渡したい

たとえば
Derive1::PARAM param1[] = {3}; // int
Derive2::PARAM param2[] = {0.9, 0.8}; // double[2]
Derive1->SetParameter(param1, 1);
Derive2->SetParameter(param2, 2);
Derive1->Begin();
Derive2->Begin();

という感じ

現在これをテンプレートで実現してて

(続く)

46:デフォルトの名無しさん
08/01/15 00:29:32
class Base{
void** param_;
virtual bool Begin() = 0;
public:
Base() : param_(NULL){}
template <class T> bool CreateParameter(T[], int);
template <class T> void DeleteParameter();
template <class T> T GetParameter(int) const;
};
template <class T> bool Base::CreateParameter(T param[], int n) {
if(param_) return false;
param_ = reinterpret_cast<void**>(new T*[n]);
for(int i=0; i<n; i++) param_[i] = new T(param[i]);
return true;
}
template <class T> void Base::DeleteParameter(){
delete[] reinterpret_cast<T**>(param_);
param_ = NULL;
}
template <class T> T Base::GetParameter(int n) const{
return *(static_cast<T*>(param_[n]));
}

(続く)

47:40
08/01/15 00:55:05
早々のご回答ありがとうございます。

>>42
初学ゆえ説明足らずで申し訳ありません。
CTestxxはCObjxxの機能を有するという形で実装したいと考えています。
CObjxxとCTestxxの間にラッパクラスを挟むべきか、それともよりよい
実装方法があるのか、そもそもCObjxxは包含すべきものなのか、
というところを悩んでいます。なんかうまく説明できなくてすみません。。。

>>43
なるほど。この方法だとCTestxxはCObjxxの機能を有しつつ、必要な部分だけを
公開できそうです。貴重なご意見ありがとうございます。

48:デフォルトの名無しさん
08/01/15 02:16:35
gccでSJISファイルのコンパイルでうまくいかないので、ご教授いただけたらと思います。

> cat a.c
#include "stdio.h"
#define AAA(a) BBB(#a)

void BBB(char *str) {
printf("%s\n", str);
}

int main() {
AAA(あ"い");
BBB("あ\"い\"");
}

> gcc --input-charset=cp932 --exec-charset=cp932 a.c
> a.out
あ"磚
あ"い"

AAAの方とBBBの方で両方同じ結果が得られそうなのですが、
AAAの方でうまくいっていないのを解決したいと思っています。

ここでは標準出力していますが、内部文字コードはSJISのまま解決したいと思っています。
よろしくお願いいたします。

49:デフォルトの名無しさん
08/01/15 08:34:52
>>41 >>44
THX
ちょ,名前だけでもw
といってもすれ違いの気もするから Emacs スレに行きます

50:デフォルトの名無しさん
08/01/15 22:27:52
>>48
--input-charsetじゃなくて-finput-charsetだった希ガス
つーかすれ違い

51:48
08/01/15 23:53:54
>>50
ありがとうございます。
--input-charsetは-finput-charに展開されていたと思うので確か同じことだと思います。
GCCスレに同じ質問投げてきます。失礼しました。

52:デフォルトの名無しさん
08/01/16 16:52:57
下記のようにboost::arrayで代入演算子が定義されている型Tの2次元配列を
で作りたいのですが、BOOST_PPとtemlateで一般化できないでしょうか?
自分でも考えたのですが脳みそが沸騰しそうでした。

struct Row : public boost::array<T, XSIZE>
{
Row(T x0, T x1,..., T xXSIZE_minus1) : boost::array<T, XSIZE>()
{at(0) = x00; at(1) = x01;... at(XSIZE - 1) = xXSIZE_minus1;
};

const boost::array<Row, YSIZE> plane = {
Row(xx, xx, ... , xx),
...
Row(xx, xx, ... , xx)
};

53:52
08/01/16 16:56:53
追記
const boost::array<Row, YSIZE> plane
は手書きで初期化します。一般化したいのはRowだけです

54:デフォルトの名無しさん
08/01/17 16:57:59
教えてください
Borland社のフリーのコンパイラを使用してるのですが
#defineをmakefileでのコンパイラ時に宣言するときはどのような記述がいるのでしょうか?

55:デフォルトの名無しさん
08/01/17 17:08:05
>>54
-D名前
-D名前=文字列

56:デフォルトの名無しさん
08/01/17 17:10:49
>>55
無事できました、ありがとうございます

57:デフォルトの名無しさん
08/01/17 17:56:37
>>54-56
ほのぼのした.

58:デフォルトの名無しさん
08/01/17 23:25:38
さてさて初心者が通りますよ。
今日から勉強しようと今、Visual C++ 2008 Express Editionをインストール中。

ここまでOKです。

59:デフォルトの名無しさん
08/01/17 23:27:07
>>58
帰ってよし

60:デフォルトの名無しさん
08/01/18 01:44:30
>>58
お前すごいな! VC2008をインスコしたのか
おれは、コンピラーすらインスコしてないよ
コンピラーぐらい、OSにおまけで付けて欲しいよな

61:デフォルトの名無しさん
08/01/18 03:00:22
最近の,NET Frameworkインストール済みなWindowsだと
C#とかVB.NETのコンピラーがおまけで付いていますよ、と。

62:デフォルトの名無しさん
08/01/18 10:03:24
金毘羅ー

63:デフォルトの名無しさん
08/01/18 10:21:21
emacsでc++するためのリンクを集めているのですが
URLリンク(d.hatena.ne.jp)
他にも何か有用なサイトをご存じの方
お教えいただけると幸せです


64:デフォルトの名無しさん
08/01/18 14:16:25
スレリンク(unix板)

65:デフォルトの名無しさん
08/01/19 18:29:00
C++好きですか?

66:デフォルトの名無しさん
08/01/19 19:33:18
Cのスーパーセットらしい  →普通
クラスを使えると便利 →やや好き
難解な文法というか落とし穴にハマる →嫌いになる(この辺で多言語に浮気)
テンプレートがわかってくる →再び好きになる
STLに感動する →好きになる
bind1stとかvalarrayに不満がでてくる →再びちょっと嫌いになる
boostがわかってくる →また好きになる


67:デフォルトの名無しさん
08/01/19 20:03:21
TMPができるようになる
 →何でもいいので何か自作のライブラリを作りたくなる

boostに追記/修正したくなる
 →何かを作る事よりもC++を書くこと自体が楽しくなる

既存のコンパイラに嫌気を射し
C++コンパイラを自分で作りたくなる
 →ちょっと飽きてくる

巨大なプログラムを作成中に過去に自分の書いたコードが読めなくなる
 →PCを窓から投げ捨てたくなる

68:引っ越してきました
08/01/19 20:17:46
VCスレからC++の問題ということで
追い出されて来ました。

クラスの中で+演算子を定義したいのですが、
newして、それをreturnの中で使いたいときに
deleteできないで困っています。
どうしたらよいでしょうか。

・簡単に言えば文字列の足し算です
・当方初心者です

friend Mojiretsu operator+=(const Mojiretsu& moji1, const Mojiretsu& moji2) {    // +演算子
  int tmp_nagasa = moji1.nagasa + moji2.nagasa ;
  char* tmp_moji = new char[tmp_nagasa+1];
  mojicpy(tmp_moji,moji1.s);
  mojicat(tmp_moji,moji2.s);
  return Mojiretsu(tmp_moji);
}

やりたいことはわかってもらえるとは思うのですが、
もっと楽にできるよとかもあったら教えてください。


69:デフォルトの名無しさん
08/01/19 20:23:50
いろいろとおかしいなw

70:デフォルトの名無しさん
08/01/19 20:24:06
Mojiretsu mojiretsu(tmp_moji);
delete[] tmp_moji;
return mojiretsu;

でどう?

71:デフォルトの名無しさん
08/01/19 20:44:36
>>68
newしないでMojiretuを定義してそれをreturnすれば?
Effective C++でもnewはするなと書いてあったぞ。

72:68
08/01/19 20:45:00
>>70
どうもです。
なるほど、コンストラクタを呼び出す、と。
実験の結果、ちゃんと動いています。
(まあ、もとのやつでも動いているようには
見えるのですが)


73:68
08/01/19 20:46:44
>>71
どうもです。
少々時間ください。初心者のため
理解するのに時間がかかりますので。

74:デフォルトの名無しさん
08/01/19 20:51:27
例外安全・・・についてはまだ触れない方がいいか
混乱しそうだし

75:デフォルトの名無しさん
08/01/19 20:52:05
>>68
なんぜ+=なのに、moji1がconstなんだ?

Mojiretsu s1("abc"), s2("def");
s1 += s2;

これでs1 == "abcdef"にならないとおかしいだろ。

76:68
08/01/19 20:55:56
訂正です。

ごめんなさい。
+=でなく、+です。

77:68
08/01/19 20:58:58
>>71
やっぱりわかりません。
もう少しヒントください。

あと、Effective C++のどの辺でしょうか。
そのうち読もうと買ってはあります。

78:68
08/01/19 21:00:50
>>74
とらいすろーきゃっち、でしょうか。
だいぶあとということでお願いします。


79:68
08/01/19 21:07:19
>>71

どこが分からないかというと、
Mojiretuを定義するには、
(コンストラクタに)文字列(char*)を
渡す必要がありますが、その文字列自体、
strcatした後のものにしなければならず、
どうどうめぐりのようで
よく分からないのです。
勘違い、ご指摘くださいませ。


80:デフォルトの名無しさん
08/01/19 21:08:26
>>77
誰がdeleteの責任持つの?って言う事。
それとEffective C++は
URLリンク(www.amazon.co.jp)
%E3%82%A2%E3%82%B9%E3%82%AD%E3%83%BC%E3%82%A2%E3%82%B8%E3%82%BD%E3%83%B3%E3%82%A6%E3
%82%A7%E3%82%B9%E3%83%AC%E3%82%A4%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%E2%80%95Ascii-Addison-programming/dp/4756118089

81:デフォルトの名無しさん
08/01/19 21:09:09
deleteは関数内で済ませてしまった方がいいだろう

82:デフォルトの名無しさん
08/01/19 21:12:07
Effective C++持っているなら演算子の話を是非、
と思ったらMoreのほうだった……、22。

operator +よりもoperator +=を実装しろ。

そして、operator +はこうする。
Mojiretsu operator +(const Mojiretsu& lhs, const Mojiretsu& rhs)
{
  Mojiretsu tmp(lhs);
  return tmp += rhs;
}

83:68
08/01/19 21:16:53
>>82
どうもです。
実はMoreも持っています。
また実験してみます。
(時間がかかります)

84:デフォルトの名無しさん
08/01/19 21:22:53
std::vector使え

85:68
08/01/19 22:00:52
>>82
ありがとうございました!
動きました!
+=を先に定義するというのは
頭いいですねえ。


86:デフォルトの名無しさん
08/01/19 22:12:44
頭がいいっつうか、定石だな。

87:68
08/01/19 22:20:59
>>86
そういうものなんですね。
>>82
「More」の22の最初のページの一番下に
「単独演算子がfriendである必要はまったくない」と
あり82でもfriendがついてませんが、friendにしないと、
lhsが"rerere"のような場合に私のではコンパイルエラーに
なったのですが、まだ何かおかしいということでしょうか。

88:デフォルトの名無しさん
08/01/19 22:24:53
>>87
publicなコピーコンストラクタはあるか。
+=もメンバならやはりpublicになっている?

82のは、private/protectedなメンバに全く触っていないから
friendにする必要がないという仕掛け。

89:68
08/01/19 22:32:41
>>88
たびたびありがとうございますです。
コピーコンストラクタも+=も+もその他すべての
メンバ関数はpublicになっているのですが。。。

90:68
08/01/19 22:37:36
あ、もしかして、+は82そのままではなく、
privateメンバを触っていますがそのせいでしょうか。

Mojiretsu operator+(const Mojiretsu& str1, const Mojiretsu& str2) { // +演算子
    String tmp_moji(str1.s);  //←コンストラクタにはクラスの文字列部を渡してます
    tmp_moji += str2;
    return tmp_moji;
}


91:68
08/01/19 22:57:13
friendがないと、
error C2804: binary 'operator +' に引数が多すぎます。
error C2333: 'Mojiretsu::operator +' : 関数宣言のエラーです。関数の本体は無視されます
っていうのも出たため、実験しましたが、
どの+でもエラーになってます。。。
friendつけている限りまったくwarningさえも出ないのですが。

すいません、時間切れです、明日の夕方、また来ます。

92:デフォルトの名無しさん
08/01/19 23:19:33
>>91
来なくていいよ
もっと勉強してから来い

93:デフォルトの名無しさん
08/01/19 23:26:25
>>91
迷惑です。もう荒らさないで下さい。

94:68
08/01/20 00:23:56
大変おじゃまいたしました。
自己解決いたしました。
(error C2804でググって英文を読みました。
確かに読んでいる本ではコード上ちゃんと
なっていますがはっきりと言葉では
書いてないんですよねー、、、)

>>88
や、その他の方々、重ね重ねありがとうございました。
大変勉強になりました。

95:デフォルトの名無しさん
08/01/20 00:48:41
>>94
とりあえず次回のためには自己解決の意味を覚えとけ。

96:デフォルトの名無しさん
08/01/20 02:31:03
でもクラス定義内でfriend関数を定義できるのは盲点だったと思っている。

97:デフォルトの名無しさん
08/01/20 09:50:57
>>96
最初から知っていた俺がいる。
ただ、ADLでしかlookupできないというのは盲点だったと思っている。

98:デフォルトの名無しさん
08/01/20 11:39:38
URLリンク(slashdot.jp)
終わってるスキルtop10にCが入ってる
c++と区別してcなのか、それともc++込みで終わってるのか

99:デフォルトの名無しさん
08/01/20 12:12:16
>>98
そいつバカですね。Cが終わってるなら、C++では重過ぎて
実装できない組み込み機器はどうなるのか?

100:デフォルトの名無しさん
08/01/20 12:31:48
アセンブラはリストされてないから大丈夫じゃないか?

101:デフォルトの名無しさん
08/01/20 12:59:28
古いネタの揚げ足とってどうすんだよwww

102:デフォルトの名無しさん
08/01/20 18:24:19
>>98
> c++と区別してcなのか、それともc++込みで終わってるのか
スラドのくだらない雑談はいいから元の記事嫁よ
って元の記事もかなりくだらないな

103:デフォルトの名無しさん
08/01/20 23:04:17
C++のコーディング方法について質問です。
皆さんは、コーディング中にコメントアウトを使うでしょうか?
以前、仲間内でコメントアウトの是非で議論になりました。
私の知人はコメントアウトを使用する派で、私は使用しない派です。
皆さんは、コメントアウトの是非についてどう思うかお聞かせください。
なお、開発はVC++6.0、2003、2005などで行っています。

ちなみに、私がコメントアウトを否定する理由は
1.ソースが汚くなるから。
2.バックアップなら、zipか何かにまとめてプロジェクトごとバックアップしておいた方が良いから。
の二点です。

よろしくお願いします。

104:デフォルトの名無しさん
08/01/20 23:38:02
コーディングスタイルはスレ違い。

コーディングスタイルにこだわるスレ
スレリンク(tech板)

105:デフォルトの名無しさん
08/01/21 06:53:46
(コメントがしきい値以下です。)

106:デフォルトの名無しさん
08/01/21 20:38:50
C++は難しすぎ 難易度:2
スレリンク(tech板)

107:デフォルトの名無しさん
08/01/22 17:37:57
英語圏向けblogでd.hatenaみたいにシンタックスハイライトできるblogないでしょうか?

108:デフォルトの名無しさん
08/01/22 17:45:39
スレタイ嫁

109:デフォルトの名無しさん
08/01/22 23:33:33
C++で作ればいーじゃない。

110:デフォルトの名無しさん
08/01/23 02:43:19
std::cerrやstd::wcerrの<<オペレータが例外を投げるケースは存在するのでしょうか?
これらをcatch文の中で使っても安全なのでしょうか?

111:デフォルトの名無しさん
08/01/23 08:49:57
>>110
標準ができる前に既にI/Oライブラリは存在していて、後方互換性
のためデフォルトではストリームは例外を投げない仕様だと思った。
exceptionメンバー関数を使ってストリームの各種状態を例外ハンドリング
に変えることは可能。

112:111
08/01/23 08:50:46
ユーザー定義型についてはoperator<<,>>で何をやるかによると思うけど。

113:110
08/01/23 14:51:51
>>111
basic_ios::exceptionsの存在に初めて気付きました。
おかげですっきりいたしました。
ありがとうございます。

114:デフォルトの名無しさん
08/01/23 16:24:22
C++ で new されたオブジェクト(o)とクラス(CLS)が与えられたときに、
そのオブジェクトが CLS クラスのオブジェクトか判定するには
どうすればできますか?

115:デフォルトの名無しさん
08/01/23 16:28:43
>>114
typeid演算子

116:デフォルトの名無しさん
08/01/23 16:34:33
クラスをCLSと表すあたり、COMのCLSIDじゃないかとエスパーしてみる。

117:デフォルトの名無しさん
08/01/23 17:11:05
>>115
thx

>>116
組込みですよ。

118:デフォルトの名無しさん
08/01/23 18:01:08
直接dynamic_castで済むこともあるけどな。

119:デフォルトの名無しさん
08/01/23 18:30:52
ただ、dynamic_cast と typeid は意味がちゃうよね。
dynamic_cast はキャスト可能な全ての型で判定が成功するけど、
typeid は(& とトップレベルの const 以外は)厳密に型が一致しないとダメ。
どっちの方がいいというのではなくて目的ごとに使い分けることになるから、
>>114 がどっちの判定がやりたいかによるね。

120:デフォルトの名無しさん
08/01/23 18:40:58
dynamic_castは多相型のポインタとリファレンスにしか適用できないし。

121:デフォルトの名無しさん
08/01/23 19:05:22
そうなるとそもそも仮想関数をうまく使えば
dynamic_castも要らないだろというところまで話を広げたくなるね。

122:デフォルトの名無しさん
08/01/23 19:28:59
今は typeid で分岐するのが流行りなんだぜ?

123:デフォルトの名無しさん
08/01/23 19:50:25
dynamic_cast じゃなくて typeid が必要になる状況ってあんま想像つかない。
どういう時に使うんだ?

124:デフォルトの名無しさん
08/01/23 21:03:45
デバッグ用途とかコードジェネレータとか

125:デフォルトの名無しさん
08/01/23 22:35:54
参照への参照
int& &

この表記はC++03では認められていませんが、C++0xではint&と等価なものとして
仕様が改定されることは決定済みなのでしょうか?

126:デフォルトの名無しさん
08/01/23 22:52:58
ドラフトには入ってたと思うよ

127:デフォルトの名無しさん
08/01/23 22:53:45
ただし、テンプレート引数が参照な時だけだっけ?

&& を素で書くと右辺値参照だったはず。

128:デフォルトの名無しさん
08/01/23 23:52:55
>>126
>>127
そうですか。テンプレートパラメータが既に参照の場合、
参照引数を渡すとT& &となりエラーとなるため、これを
回避することだけを目的としてるのかもしれないですね。
type functionを書くのも面倒なので是非改定
してもらいたいです。もしかすると今でもBoostでは便利
なものがあるかもしれませんが。

右辺値参照はC++03では認められていなくて、C++0xでは
正当になる予定ですよね?

129:デフォルトの名無しさん
08/01/24 00:15:13
あれ? 離して書くと大丈夫だったかもしれん。
うろ覚えだからドラフト読んでくり。

130:デフォルトの名無しさん
08/01/24 00:24:22
>>129
確認してみます。

131:デフォルトの名無しさん
08/01/24 00:34:53
参照への参照なんて使うことあるの?

132:デフォルトの名無しさん
08/01/24 00:47:44
>>131
テンプレートでこねこねしていると、うっかり参照への参照という型が生まれることがある。
そんなもの、現状ではコンパイルエラーだが、125に書いてある通り0xだと、
Tへの参照への参照型は、単にTへの参照型として扱われるようになる。

133:デフォルトの名無しさん
08/01/24 01:00:12
&  &     -> &
&  &&   -> &
&&  &   -> &
&&  && -> &&

134:デフォルトの名無しさん
08/01/24 01:01:32
>>132
thx うっかり、ってことは積極的に作るものじゃないって事でOK?

135:デフォルトの名無しさん
08/01/24 01:19:02
URLリンク(www.open-std.org)

URLリンク(www.open-std.org)

このあたりかな。あまり理解できなかった。
改定理由はテンプレートパラメータの問題としてだけでなく、
右辺値参照との絡みもあるみたいだ。かな?

136:デフォルトの名無しさん
08/01/24 01:35:59
&&& はwell-formedなのか気になる

137:デフォルトの名無しさん
08/01/24 01:39:01
ill

138:デフォルトの名無しさん
08/01/24 01:58:45
>>135
template<typename T1, typename T2, typename T3>
void f(T!&& x, T2&& y, T3&& y);
例えば、こんな関数にboost::refで一部の引数だけ左辺値参照にすることができる。
そんなことできて何が嬉しいって、例えばBoost.BindやBoost.Lambdaの関数呼出。

これは& &→&というより、&& &→&の説明になっているけど。

139:デフォルトの名無しさん
08/01/24 13:40:10
別に boost::ref などを使わなくても,
普通に左辺値を引数にすれば左辺値参照として bind されるのでは?

140:デフォルトの名無しさん
08/01/25 01:22:36
くわしく

141:デフォルトの名無しさん
08/01/25 02:32:53
以下抜粋
1. lvalues can bind to an rvalue reference.

2.
struct A {};

void h(const A&);
void h(A&&);

void g(const A&);
void g(A&&);

void f(A&& a)
{
g(a); // calls g(const A&)
h(a); // calls h(const A&)
}

Although an rvalue can bind to the "a" parameter of f(), once bound, a is now treated as an lvalue.

>>139の言うとおりのような気がする。

142:デフォルトの名無しさん
08/01/25 13:02:29
そもそもboost::refをなくすための&&ですやん

143:デフォルトの名無しさん
08/01/25 13:17:13
いや、&&はmove semanticsのためでしょ。
boost::refはoutパラメータとして使うためにあるんだと思ってる。

144:139
08/01/25 13:52:28
以下 C++0x の話で現行の言語規格とは一切関係ないです.スレ違いですいません.

>>141
あ,いえ,自分が>>139で指摘したかったのはたとえば

template<typename T>
void f(T &&x);

があったときに, f を左辺値で呼び出すと T が左辺値参照型で specialize されて
f のパラメタの型が左辺値参照型になる,つまり

int i;
f(i);    // T = int & として f が specialization される.
        // 結果 f のパラメタの型が & && -> & の decay を受けて int & と同等になる
f(42); // T = int として f が specialization される.
        // 結果 f のパラメタの型が右辺値参照型 int && になる

ということです.これによって f の引数が非 const 左辺値でも const 左辺値でも右辺値でも
問題なく受けられるようになるということを指摘したかったんです.

で,上記の仕様 (引数が左辺値か右辺値かで
テンプレートパラメタ T が参照型かそうでないかの違いが生じる) から,
f の実装内部において f が左辺値で呼ばれたのか右辺値で呼ばれたのかの識別も可能となります.

この 右辺値参照・参照型の decay ルール・関数テンプレートにおける引数推論規則 の組み合わせで
the forwarding problem が完全に解けるというのが現在の提案の骨子だったかと思います.

145:139
08/01/25 13:54:25
あと,実際には>>141さんが指摘しているように
名前が付いた右辺値参照は左辺値として扱われるので,
右辺値として渡された f の引数を f の内部で引き続き右辺値として扱うには
明示的に右辺値参照に変換してやらないといけないです.
で,このために std::forward という補助的な関数テンプレートも提案されています.

template<typename T>
T &&forward(typename identity<T>::type &&x){return x;}

template<typename T>
void f(T &&x)
{
  g(forward<T>(x)); // f が右辺値で呼ばれている場合, T が非参照型になっているので
                         // forward の戻り値型が右辺値参照型になり,右辺値として g に渡される.
                         // f が左辺値で呼ばれている場合, T が参照型になっているので
                         // forward の戻り値型が左辺値参照型になり,左辺値として g に渡される.
}

146:デフォルトの名無しさん
08/01/25 15:50:00
>>143
boost::refについて、これ嘘だった。


147:デフォルトの名無しさん
08/01/25 16:25:54
まったく話についてけないんだが。
何が左辺値で何が右辺値なんだかもうわけわからん
右辺値で呼ぶってどういうこと?

148:デフォルトの名無しさん
08/01/25 16:44:11
template <class T>
struct identity
{
typedef T type;
};

template <class T>
inline
T&&
forward(typename identity<T>::type&& t)
{
return t;
}


149:デフォルトの名無しさん
08/01/25 16:49:21
>>144
f(i); // T = int & として f が specialization される.

T が int & にdeductionされるのって、パラメータが右辺値参照
のときのみのルールですよね?

150:デフォルトの名無しさん
08/01/25 16:52:33
Let us first consider the rvalue reference type, T &&, in more detail in
the context of the C++ type system. What if T is itself a reference
type? Template libraries have been known to create reference to
reference types via typedefs or type manipulations. According to the
proposed resolution to Core Defect Report 106 , ordinary references obey
the equality T cv1 & cv2 & == T cv12 &, where cv12 is the union of cv1
and cv2. A similar reasoning can be applied to collapse two rvalue
references into one: T cv1 && cv2 && == T cv12 &&.

こいう文書で出てくるcv1やcv2やcv12の数字は何を意味してるんですか?


151:デフォルトの名無しさん
08/01/25 17:25:21
区別するため便宜的に番号を振っているだけ。
例えばcv1 = const, cv2 = volatileなら、
vc12 = const volatileだよという話をしたいがためのもの。

152:デフォルトの名無しさん
08/01/25 18:57:19
>>151
なるほど。unionは合成の意味ですね。てっきりキーワードもunionかと
思ってしまいました。

153:デフォルトの名無しさん
08/01/25 19:59:08
すいません.>>145で示した forward の定義は
正確には>>148さんの書いたとおりです.

>>147
>何が左辺値で何が右辺値なんだかもうわけわからん
戻り値の型が左辺値参照型でない関数の呼び出し構文(の結果)が右辺値で,
それ以外は全て左辺値,という理解である程度通用するかと思います.

>>149
全部把握しているわけではないので推測になりますが,恐らくそうだと思います.
後方互換性の観点から考えても,
パラメタが右辺値参照型以外の場合は従来どおりの deduction になるかと.

154:デフォルトの名無しさん
08/01/25 21:19:46
システムの構造体の定義をXML形式で出力したいんだけど、上手い方法があったら教えてださい。
ある構造体は中にも構造体を保持していて、その構造体は別ファイルで定義してるとか、
ifdefやら二重に定義されてるマクロやらで手動でやろうとするともうワケワカメです





155:デフォルトの名無しさん
08/01/25 21:46:14
>>153
The next step is to modify the argument deduction to retain information
about the "rvalueness" of the argument: when deducing against a template
parameter of the form A1 &&, deduce A1 as a reference type when the
argument is an lvalue, and a non-reference type otherwise. According to
our T cv1 & cv2 && == T cv12 & rule, this effectively means that the
type of the argument will be A1 & when the argument is an lvalue, and A1
&& otherwise.

どうやら右辺値参照パラメータに対する特別なdeduction ruleみたいですね。

156:デフォルトの名無しさん
08/01/25 23:08:28
独自ネームスペースを持つ外部ライブラリを幾つか利用して大きなプログラムを書くようになったら

#include "hoge1.h"
……
#include "hogeN.h"
#include "mylib1.h"
……
#include "mylibN.h"
#include <lib1.h>
……
#include <libN.h>

namespace current_namespace {

using ns1::hoge1;
……
using ns1::hogeN;
……
using nsN::hoge1;
……
using nsN::hogeN;
……

な感じで各ファイルの先頭が埋め尽くされるようになりました。
皆さん、どのように解決しているのでしょうか?

157:デフォルトの名無しさん
08/01/25 23:51:26
全てのヘッダを include するヘッダを作って、ソースコードの先頭で
#include "all.h"
とする。


158:デフォルトの名無しさん
08/01/25 23:53:59
リコンパイルで半泣きコースだな

159:デフォルトの名無しさん
08/01/26 00:11:45
リコンパイルで半泣きといえば、いろんな本で冗長インクルードガードが嫌われてるのは何でよ?
VC++2005の #pragma once を使ってる場合ですら200ファイルほどのプロジェクトでリビルド時間が半減したんだけど。


160:デフォルトの名無しさん
08/01/26 00:27:07
>>157
using もヘッダん中ですんのか?

161:デフォルトの名無しさん
08/01/26 00:29:14
precompiled headerになるようにしときゃいいだろ。

162:デフォルトの名無しさん
08/01/26 00:48:04
>>159
よく分からんけど、

#pragma once

よりも、

#ifndef XXXXXXX
#define XXXXXXX

////

#endif

の方がビルド時間が短くなるの?

163:くお
08/01/26 00:49:00
c++でエクセル用のアドインを作るやり方を教えてください。
よろしくお願いします。

164:デフォルトの名無しさん
08/01/26 00:59:44
>>162
#ifndef XXXXXXX
#define XXXXXXX
#include "myhoge.h"
#endif XXXXXXX

とやって include 行を読み飛ばす方法。
myhoge.h にアクセスする必要がない、展開後のファイルサイズが小さくなる、等の理由でビルド時間が短くなることが多い。


165:デフォルトの名無しさん
08/01/26 01:00:16
くおーっ!

166:デフォルトの名無しさん
08/01/26 01:01:52
>>157
all.h に含まれるヘッダのどれか一つでも更新されると all.h を含むファイルが全てコンパイルされる罠。
all.h をプリコンパイルヘッダにしたところで防げません。

167:デフォルトの名無しさん
08/01/26 01:08:25
批判もいいけど先に解決策を示そうぜ。

168:デフォルトの名無しさん
08/01/26 01:11:42
>>164
なるほど。それだとすると、159の
>リコンパイルで半泣きといえば、いろんな本で冗長インクルードガードが嫌われてるのは何でよ?
の理由は、ヘッダファイル使用時にやることが増えるから。かな?

いや、そっちの方が早いってのなら、合理的な理由じゃないとは思うけど
多分159に対する答えは、そんなところだと思う。

169:デフォルトの名無しさん
08/01/26 01:12:55
URLリンク(en.wikipedia.org)

170:デフォルトの名無しさん
08/01/26 01:39:56
初歩的な質問で申し訳ないのですが、ヘッダファイルの中で行う以下のような
0クリアは問題ないですか?sizeof(this)は正しく計算されます?

class HOGE
{
int a,b,c;
char str[128];

void init(void)
{
memset( this, 0, sizeof(this) );
};
};

171:デフォルトの名無しさん
08/01/26 01:41:18
>>170
やってみりゃいいじゃん

172:デフォルトの名無しさん
08/01/26 01:44:07
いえ、できれば構文的に正しいのか知りたいのですが…
テストのクラスで成功しても、他のクラスでは失敗するかもしれないので。

173:デフォルトの名無しさん
08/01/26 02:03:15
>>172
コンパイルが通れば、構文的には正しい。
というのは置いといて、
メンバ変数をクリアしたければ、sizeof(*this)とすべき。
そして重要なのは、その方法が使えるのはPOD型だけ。
例えばHOGEに仮想関数を追加すると、動かなくなる。

174:デフォルトの名無しさん
08/01/26 02:03:42
構文って意味分かってんのかいな…。

175:デフォルトの名無しさん
08/01/26 03:01:40
>>173
詳しく有難うございます。納得できました。

>>174
「構文」は間違いでした。>>173のような事を表したかったのですが、
そういう場合は何と呼ぶべきですかね…

176:デフォルトの名無しさん
08/01/26 03:20:13
>>175
つか、何がしたいの?

177:デフォルトの名無しさん
08/01/26 04:53:51
今タイピングのアルゴリズムでゲーム中に「し」を「si」と「shi」のどちらでも受け付けるとような操作を考えています。
現段階では文字列クラスを用意して双方向リンクリストを使って分岐を操作して居るんですが、どうしてもコードが複雑になってしまいます。
もう少し簡単なアルゴリズムや便利なSTLなどがあったら教えてください。
文字列クラス
class characterData
{
private:
wchar_t ch; // 単語を構成する文字
Databace* follow; // この文字に続く文字へのポインタ
Databace* other; // 分岐文字へのポインタ
Databace* rear; // この文字の前の文字へのポインタ
public:
Databace(); Databace(wchar_t, Databace*, Databace*, Databace*, unsigned char); ~Databace();
// 変数の値を設定する関数群
void setFollow(Databace*); void setOther(Databace*); void setRear(Databace*); void setCh(wchar_t); void setLevel(unsigned char);
// 変数の値を返す関数群
wchar_t getCh() const; Databace* getFollow() const; Databace* getRear() const; Databace* getOther() const;
};
文字列を作るクラス
class createString
{
private:
Databace* end; // 文字列の最後の文字へのポインタ
Databace* div; // 分岐文字がある場合のみendと違う場所を指す
void add(const int n, ...); // n個の文字を追加する
public:
CStrManage(); ~CStrManage();
// elementをローマ字に変換しbaseの後ろに追加する
bool convert(const wchar_t* element, Databace* base);
};


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5004日前に更新/95 KB
担当:undef