C++相談室 part83

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part82
http://pc12.2ch.net/test/read.cgi/tech/1275477613/
2デフォルトの名無しさん:2010/08/04(水) 18:35:04
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq-lite/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 http://www.cppreference.com/ (英語)
 http://www.cppreference.com/wiki/jp/ (↑の日本語訳だけどまだ未完)
[禿 Stroustrup]
 http://www.research.att.com/~bs/
[C++ International Standard]
 http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110
[JTC1/SC22/WG21 - C++]
 http://www.open-std.org/jtc1/sc22/wg21/
  ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
[JIS X3014]
 http://www.jisc.go.jp/app/pager?id=15868
  ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
3デフォルトの名無しさん:2010/08/04(水) 18:35:52
■Libraries■
[Boost]
 Boost http://www.boost.org/
 (日本語) http://www.kmonos.net/alang/boost/
 (日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
 SGI-STL http://www.sgi.com/tech/stl/
 STLport http://stlport.sourceforge.net/
 GNU libstdc++ http://gcc.gnu.org/libstdc++/
 Apache C++ Standard Library (STDCXX) http://stdcxx.apache.org/
 STLFilt http://www.bdsoft.com/tools/stlfilt.html
 (日本語) http://episteme.wankuma.com/stlprog/ (※1999年発行注意)
[Loki]
 http://sourceforge.net/projects/loki-lib/
 LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
4デフォルトの名無しさん:2010/08/04(水) 18:37:04
5デフォルトの名無しさん:2010/08/04(水) 18:38:36
6デフォルトの名無しさん:2010/08/04(水) 18:55:43
STLつかうと一気に実行ファイルサイズが10倍に?!

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

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

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

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
7デフォルトの名無しさん:2010/08/05(木) 00:46:27
std::tr1::regex_replaceで文字列を置換して
置換した箇所を取得する方法を教えてください。
8デフォルトの名無しさん:2010/08/05(木) 08:31:51
次のコードをGCCでコンパイルしようとすると、
aho.cxx:12: error: cannot dynamic_cast ‘this’ (of type ‘const class Base* const’) to type ‘const class Derived* const’ (source type is not polymorphic)
と出ます。基底クラス内で、thisをアップキャストすることは不可能でしょうか。

実際にはDerived1やDerived2のような継承クラスがいくつかあり、Baseは抽象クラスです。
Base::Foo()は、どのクラスに継承されたかを調べるメソッドです。
Fooをそれぞれのクラスでオーバーライドするべき、というのは理解した上での質問です。

class Derived;

class Base {
public:
 int Foo() const;
};

class Derived : public Base {
};

int Base::Foo() const {
 const Derived* const p = dynamic_cast<const Derived* const>(this);
 if(p){
  return 1;
 }

 return 0;
}
9デフォルトの名無しさん:2010/08/05(木) 08:35:44
>>8 *source type is not polymorphic*
10デフォルトの名無しさん:2010/08/05(木) 08:40:55
>>9
ありがとうございます。解決しました。
virtual int Foo() const;
にすれば良いようです。
11デフォルトの名無しさん:2010/08/06(金) 09:16:06
何かしらの仮想関数をもたないとdynamic_castに必要なv-tableを持てないからエラーを吐く

Baseクラスが派生されること前提にしてるならデストラクタをvirtualすればいいと思う
というかするべきだと思う
12デフォルトの名無しさん:2010/08/06(金) 10:36:59
ある計算結果Aがあります。
Aを再利用する為に、キー値を使って
std::mapに入れて管理したいと思います。

Aがmapにあれば更新され、無ければ追加されます。

Aは複数あるので、そのまま使っていくとmapのサイズが
無尽蔵に大きくなってしまいます。

そこで、mapのサイズに上限を設けて、上限を超えたら
古いAから削除する実装にしたいと思います。

std::map< key, item > map;
std:dequeue< map::iterator > queue;

こういう実装を考えたのですが、Aが追加ではなく更新された場合、
queueの中ほどに入っているiteratorを削除して、おけつにpushしなければならず
効率が悪く感じました。もっと良い実装案はないでしょうか?
13デフォルトの名無しさん:2010/08/06(金) 11:41:04
queueじゃなくlistを使って
使った要素を毎回先頭につなぎなおす
14デフォルトの名無しさん:2010/08/06(金) 12:05:45
>>12
std::list< item > map;
std::map< key, list::iterator > map;

これでいいんじゃね?
15デフォルトの名無しさん:2010/08/06(金) 18:55:08
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。

アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。

                  京都大学霊長類研究所
16デフォルトの名無しさん:2010/08/07(土) 14:47:47
foo::bar
foo:bar
の違いってなんでしたでしょうか
17デフォルトの名無しさん:2010/08/07(土) 14:58:59
foo:bar

bit field だっけ
あんまり使わんな
18デフォルトの名無しさん:2010/08/07(土) 15:16:11
goto foo;
19デフォルトの名無しさん:2010/08/07(土) 16:54:46
てすと
20デフォルトの名無しさん:2010/08/07(土) 17:16:55
>>7
無理なんじゃないでしょうか。
regex_searchでなんとかするしかなさそう。
21デフォルトの名無しさん:2010/08/10(火) 05:53:49
mallocの戻り値はvoid *ですが、これをキャストするには
括弧よりもstatic_castの方がいいよね?
22デフォルトの名無しさん:2010/08/10(火) 07:13:07
なんでmalloc使うの?
23デフォルトの名無しさん:2010/08/10(火) 16:49:45
3次元ベクトルの計算したいだけの場合って
std:vectorをわざわざつかわないで単純に配列そのまま使うのがいいの?
24デフォルトの名無しさん:2010/08/10(火) 17:15:57
>>23
お好きにどうぞ。
固定長の配列にstd::vectorを使うのは余計なコストが掛かりますが、
可変長になったときにも融通が利きます。
が、ベクタ演算とstd::vectorを混乱したまま理解していないかちょっと心配。
2521:2010/08/10(火) 19:46:27
>>22
C言語の関数を使っているから
他のスレでそう進められたから
26デフォルトの名無しさん:2010/08/10(火) 22:08:15
今のCPUはリターンスタックを何レベルか内部に内蔵してるし投機実行するから
CALL/RETでのコストなんてわずかなもんだしパイプラインも途切れないよ

x86が条件付きCALL命令を持ってないのは今から考えるととても幸いしている
27デフォルトの名無しさん:2010/08/11(水) 02:06:03
>>26 いきなり何の話だ?
28デフォルトの名無しさん:2010/08/11(水) 09:20:48
>>26
なんでCISCの話してんの?
あんたは化石か?
29デフォルトの名無しさん:2010/08/11(水) 13:04:52
std:vectorだと要素の3番目にアクセスするのに1番目2番目3番目とnextポインターたどることになるんじゃないの?
配列ならそんなことない
30デフォルトの名無しさん:2010/08/11(水) 13:07:01
馬鹿なの?死ぬの?
31デフォルトの名無しさん:2010/08/11(水) 13:07:44
節子、それ std::list や。
32デフォルトの名無しさん:2010/08/11(水) 14:05:04
std:deque は便利
33デフォルトの名無しさん:2010/08/11(水) 14:23:54
>>29
std::vectorは[]演算子で直接3番目にアクセスできるし、イテレーターでも+=で3番目に直接飛べるし
34デフォルトの名無しさん:2010/08/11(水) 14:24:02
STLのぺぇじ がなくなってる
35デフォルトの名無しさん:2010/08/11(水) 14:56:09
てst
36デフォルトの名無しさん:2010/08/11(水) 16:05:03
>>29
std::listじゃあるまいし、std::vectorはランダムアクセス可能。
実装にもよるが、大概 operator[]なら配列と変わらんぞ
3736:2010/08/11(水) 16:06:18
ちが
>>33
3836:2010/08/11(水) 16:07:27
36は一人で混乱しています
29あてでよかった…
39デフォルトの名無しさん:2010/08/11(水) 19:48:25
俺の胸でも見て落ち着け
40デフォルトの名無しさん:2010/08/11(水) 20:08:07
>>34
えぴすてーめーのページなら移転しているよ。
ttp://episteme.wankuma.com/stlprog/index.html
あーでも、wankumaがまた落ちているような希ガス。
41デフォルトの名無しさん:2010/08/12(木) 14:24:56
>>40のリンクを開いて

「AT&TのBjarne StroustrupがC++をこの世に送り出しました。」

この世を去ったかと思った。
42デフォルトの名無しさん:2010/08/12(木) 14:58:29
禿ぱねぇな
43デフォルトの名無しさん:2010/08/14(土) 00:49:10
空のクラスのsizeofの結果が1になるんですが
なんで1byteなんですか?
44デフォルトの名無しさん:2010/08/14(土) 01:51:01
>>43
§9.3
3 Complete objects and member subobjects of class type shall have nonzero size.

つまりクラスのサイズは最低1なければならない。これは別クラスかどうかアドレスで区別
出来るように設けられた規則である。当然空のクラスもサイズは最低1になる。
45デフォルトの名無しさん:2010/08/14(土) 13:50:04
ネームスペースをつけずに作ってあとで後悔することってありますか?
あとからまとめてつけれませんか?
46デフォルトの名無しさん:2010/08/14(土) 14:02:00
なんのための名前空間だよwww
47デフォルトの名無しさん:2010/08/14(土) 14:18:13
ネームスペースを付けないことの方が有り得ない
48デフォルトの名無しさん:2010/08/14(土) 14:45:06
社内限定のプロジェクトやライブラリでは後悔することないねぇ。
10年前はきちんとやってたけど5年くらい前から馬鹿らしくなって手を抜いてる。
社内でネームスペース付けてる奴自体少数派だし、困ったという話は聞かない。

しかし外販用やフリーで配布するライブラリなら最初から付けておかないと後悔すると思う。
boostがネームスペース使ってなかったら死ぬと思う。

それよりマイクロソフトのwindows.hにあるマクロ類が、
ネームスペースで解決不能なので困る。
49デフォルトの名無しさん:2010/08/14(土) 20:39:28
>>43
C++ Glossary
ttp://www.kmonos.net/alang/cpp/glossary.html

> EBO (Empty Base Optimization)
> 空の基底クラスの最適化。
> メンバ変数を一個も持たない、空のクラス、というものが出来ることがあります。
> しかし空のクラスであっても、アドレスは一意に決めなくてはならないので、
> sizeof( EmptyClass ) は 0 にはなりません。 EmptyClass arr[100];
> assert( &arr[0] != &arr[1] ); // アドレスは違ってて欲しい単独で使う時にはこの無駄は仕方のないところですが、
> 例えばこの空クラスから他のクラスを派生するときは、EmptyClass の分のサイズは 0 にして、派生クラスのメンバ変数の分だけを確保する、
> という最適化が可能です。 C++の規格で許されているこの最適化のことを、Empty Base Optimization と呼びます。


50デフォルトの名無しさん:2010/08/14(土) 21:17:04
>>45
> ネームスペースをつけずに作ってあとで後悔することってありますか?
グローバルじゃなければ最低限のマナーを守っていると
考えていいと思う。
グローバル名前空間に放り投げるのは思いやりがないよ。

> あとからまとめてつけれませんか?
なにを無茶おっしゃいますか
51デフォルトの名無しさん:2010/08/14(土) 22:05:41
コンパイラは Visual C++ 2008 を使用
以下のコードを実行させると。。。


enum index {
  first,
  second,
  third,
  end_of_index
};

index & operator +=( index & dst, const index & src ) {
  reinterpret_cast< int & >( dst ) += src;
  assert( ( first <= dst ) && ( dst < end_of_index ) );
  return ( dst );
}

index operator +( const index & left, const index & right ) {
  return ( index( left ) += right );
}


int main( int argc, char * argv[] )
{
  index a, b = first, c = second;

  a = b + c;
}


b の中身も変わってしまうのは何故なんだぜ?
52デフォルトの名無しさん:2010/08/14(土) 22:12:55
>>51
index operator +( const index & left, const index & right ) {
  index t = left;
  return (t += right );
}

でいいんじゃない?
53デフォルトの名無しさん:2010/08/14(土) 22:12:57
>>51
コンパイルエラーのコードだからじゃね?


g++とComeau C/C++では普通に通らなかったよ?

"ComeauTest.c"
error: no operator "+=" matches these operands
operand types are: index += const index
return ( index( left ) += right );
^

1 error detected in the compilation of "ComeauTest.c".

In strict mode, with -tused, Compile failed
Hit the Back Button to review your code and compile options.
Compiled with C++0x extensions enabled.
54デフォルトの名無しさん:2010/08/14(土) 22:24:50
>>52
いや、こうならないように回避する方法はいくらでもあるけど
このコードでこういう結果になる理由が知りたいんだよね

>>53
Visual C++ 2008 では error も worning も一切出ずにビルドできるんだよね
っていうかこのコードってどっか間違ってる?
5553:2010/08/14(土) 22:28:59
>>54
俺がはったエラーメッセージを読まねぇのか読めねぇのかしらんが
ちょいと自分で考えておくんなさいまし。

g++でもComeau C/C++でも通らないんだからそのコードは誤り。
とくにstrictのComeau C/C++で通らないって事は
ほぼ間違いなく、誤りがあるってこと。

そして誤りがあるコードは未定義の動作。
5651:2010/08/14(土) 22:45:56
名前欄にレス番入れるの忘れてました^^

index( left )

のところで index の一時変数が作られて operator += に渡されて
っていう動作を期待してたんだけど、正規の C++ の仕様ではないのかな?
Visual C++ 2008 のデバックモードでステップで追っていくと
期待したような動作をしてるんだけど b の値が変わるんで何故なのかなと思ったもんでね
57デフォルトの名無しさん:2010/08/14(土) 22:48:30
index型にキャストされてconstが取れるから変わっちゃうんじゃね?
5851:2010/08/14(土) 22:58:10
キャストになっちゃうわけかな?
index( left ) ではクラスのように一時的なインスタンスは作られないってことかね
59デフォルトの名無しさん:2010/08/14(土) 23:01:23
>>54
回避する方法が思いつくなら原因もわかるだろ。
みれば一発じゃん。
60デフォルトの名無しさん:2010/08/14(土) 23:02:28
演算子が += である必要はあるのか?
61デフォルトの名無しさん:2010/08/14(土) 23:04:43
必要性じゃなくて動作を聞いてるんだろが
6251:2010/08/14(土) 23:06:14
まぁしかしこのコードが通ってしまう Visual C++ 2008 の方に問題があるよね?
特にこのコードが必要なわけじゃなくてどこまで変則的なコードが通るものか今いろいろ試しててね
その中で見つけたヤツなのよ
63デフォルトの名無しさん:2010/08/14(土) 23:07:18
C++型のキャストでなく
C型のキャストの存在する悪がここに見参。
64デフォルトの名無しさん:2010/08/14(土) 23:08:50
>>61
お前の都合なんか知ったことかよ。
65デフォルトの名無しさん:2010/08/14(土) 23:10:03
>>52が答えを示していた件について

・・・何だっけ?
コンパイラはそう言う最適化をして良いだとかなんだとかあったよな。
6665:2010/08/14(土) 23:11:08
>>64
いや一応質問すれで、質問の本題が
動作の理由の話をしているわけだから、
>>60の答えはおかしいだろ、国語の授業としても。
67デフォルトの名無しさん:2010/08/14(土) 23:23:22
>>45
ところでこいつマルチポストだった。
せっかく応えた俺の誠意を踏みにじりやがって。

なんか言えよお前。
6851:2010/08/14(土) 23:24:27
>>63
ああそうか
C型のキャストが適用されてるわけか
それで const 属性が外れてしまうと。。。
やっぱり enum じゃクラスのように一時インスタンスは作られないんだね

>>61
>>66
質問の意味を汲み取っていただいてありがとうございます
69デフォルトの名無しさん:2010/08/14(土) 23:35:54
>>45
      ,,.----、
      i | |  |   _____
     / | |  |  /   ヽ
    /  / |  |  |  ^o^ | <ネームスペースをつけずに作ってあとで後悔することってありますか?
   /  / 人ヽ、 !ー!\_/ヽ、
  / /ノ,,,,,,ヽ、ヾ .|ヾ ゞ / !ヽ`ヽ- 、
 / //、   `,ヽ .| ヾ  /ヾ ヾ  `ー-- 、
/ //  `  '´  ,ヽ||´~~ヽ ヽ、, '"´``.、   .ヽ
| ((ー‐  ●  ---.||" ,, i   i;;;;" ゛;;;;i    |
|  ヾ、 ,. ´,  、   ||  ,/   |ll!!!^!!!lllノ   .ノ
ヾ  i lヾ  i  ヾ ,/ |""  ,,  'ヽ ,,, /    |
 |  l l;;;;;`;,,,, ゞ-‐´/ ,,|  ゞ`ヾ     ヾ    |

   / ̄\
  |     | <お前は マルチポスト です
   \_/
   _| |_

ttp://hibari.2ch.net/test/read.cgi/tech/1280950209/66
ttp://hibari.2ch.net/test/read.cgi/tech/1280914463/45



せっかく応えた俺の誠意を踏みにじりやがって。

なんか言えよお前。

70デフォルトの名無しさん:2010/08/14(土) 23:36:18
>>67
なんか
71デフォルトの名無しさん:2010/08/15(日) 00:03:21
7251:2010/08/15(日) 00:41:01
ごめんなさい
最初に↓のコードを書き込んでから質問すればよかったですね
7351:2010/08/15(日) 00:41:42
class index
{
public:
  enum hoge { first, second, third, end_of_index };

  index() {}

  index( hoge src ) : num( src ) {
    assert( ( first <= num ) && ( num < end_of_index ) );
  }

  index & operator +=( const index & src ) {
    num += src.num;
    assert( ( first, <= num ) && ( num < end_of_index ) );
    return ( * this );
  }

private:
  int num;
};

index operator +( const index & left, const index & right ) {
  return ( index( left ) += right );
}

int main( int argc, char * argv[] )
{
  index a, b = index::first, c = index::second;

  a = b + c;
}
7451:2010/08/15(日) 00:42:29
↑のクラス定義のコードなら意図した通りの動作をするのに
何故 enum の演算子のオーバーライドの時はそうならないのか疑問だったもので
ユーザー定義型の enum ならクラスのように一時インスタンスが作られるのだろうと
思い込んでました^^
75デフォルトの名無しさん:2010/08/15(日) 02:01:26
enumとclassは全然違うから
もっと勉強した方がいいよ
76デフォルトの名無しさん:2010/08/15(日) 09:26:39
>>51のコードが不正なのは一時変数をint&で拘束できないからだろ
何で誰も気づかないんだよ。
77デフォルトの名無しさん:2010/08/15(日) 09:39:17
>>76
おお、それはかの有名なVC独自仕様ってやつじゃないですか。
78デフォルトの名無しさん:2010/08/15(日) 16:37:04
一時変数が作られるからb自体は変更されないよな?
っていう話なんだからそこは別にいいんじゃないの
79デフォルトの名無しさん:2010/08/15(日) 21:44:21
一時的にメンバ変数を増やしたい場合ってどうするのがよいだろうか
クラスstaticなmapにthisポインタとデータをマッピングして代用してるんだけどあんましスマートじゃない気がする
80デフォルトの名無しさん:2010/08/15(日) 22:53:44
ポインタでデータ持てば?
81デフォルトの名無しさん:2010/08/15(日) 23:13:13
namespaceがすごく長い場合それを置き換えるにはどうしたらいいですか?
ただしusingは使わないものとします。

namespace ThisIsALongNamespaceName
{
// うんたんうんたん
}
82デフォルトの名無しさん:2010/08/15(日) 23:17:20
#define ThisIsALongNamespaceName UNKO
83デフォルトの名無しさん:2010/08/15(日) 23:19:53
namespace Test = ThisIsALongNamespaceName;
84デフォルトの名無しさん:2010/08/15(日) 23:25:39
>>82
残念

>>83
正解
85デフォルトの名無しさん:2010/08/17(火) 18:17:06
privateメンバ関数が増殖してきてうざいからヘッダから分離したいんだけどなんかいい方法はないだろうか?
86デフォルトの名無しさん:2010/08/17(火) 18:42:02
設計を見直す
87デフォルトの名無しさん:2010/08/17(火) 18:46:04
うざいという直感でなく
やろうとしていることとクラス化している範囲が
無理なく対応しているかを見るべき

これでいいんだ!
という場合もある
88デフォルトの名無しさん:2010/08/17(火) 23:18:05
よかった探しをしよう
89デフォルトの名無しさん:2010/08/17(火) 23:56:41
参照渡しと値渡しってどっちを優先したような設計がいいの?
90デフォルトの名無しさん:2010/08/18(水) 00:00:36
>>89
const参照渡しと値渡しは速いほうにすれば問題ない。
91デフォルトの名無しさん:2010/08/18(水) 06:44:04
>>89
ユーザ定義型はconst参照渡し、組み込み型は値渡し
92デフォルトの名無しさん:2010/08/18(水) 17:47:13
c++の
foo.bar(x)

extern "C"
するときの名前のつけかたの慣習みたいなものはないのでしょうか?

extern "C" foo_bar(x)

とかでしょうか
93デフォルトの名無しさん:2010/08/18(水) 19:15:31
extern "C" foobar(x)
94デフォルトの名無しさん:2010/08/18(水) 20:56:44
>>92
処理系によってちがう。
95デフォルトの名無しさん:2010/08/18(水) 20:59:53
>>92
仮に「慣習」があってもその処理系限り
あきらめろ
96デフォルトの名無しさん:2010/08/18(水) 21:02:13
てか、メンバ関数をextern "C"ってできるのか。
97デフォルトの名無しさん:2010/08/18(水) 21:05:00
extern "C"ってCの関数をC++で使うときに使うものじゃなかったっけ?
98デフォルトの名無しさん:2010/08/19(木) 01:50:35
名前マングリングをCと同じ方法でやるという意味
99デフォルトの名無しさん:2010/08/19(木) 11:41:14
herbert schildt の本の後、accdlerated c++ で勉強中の身です。

http://codepad.org/8gr5sRPs

struct Data d;
push_back(d)
では、Data のコピーコンストラクターが呼ばれていると考えていいのでしょうか?
これをキャッチしたいのですが、どう書けばいいのでしょうか?
100デフォルトの名無しさん:2010/08/19(木) 13:42:52
>>99
POD型だから本当に呼ばれてるかって言われると微妙なんだけど

一応呼ばれてると言えなくもない
検出するにはコピーコンストラクタを書けばいいだろう
キャッチしたいってのはコピーコンストラクタが呼ばれてるのを確認したいってことだよな?
101デフォルトの名無しさん:2010/08/19(木) 14:10:57
いや微妙も何も無いんだから呼ばれてなんていないよな
push_back()での追加はオブジェクトのコピーがされるって言いたかっただけで
102デフォルトの名無しさん:2010/08/19(木) 16:09:47
POD型のコピーコンストラクタはコンパイラ自動生成の
メモリコピーになるんだから、それが呼ばれているよ
103デフォルトの名無しさん:2010/08/19(木) 17:53:54
goto
って関数をまたでジャンプできないのでしょうか
104デフォルトの名無しさん:2010/08/19(木) 17:58:26
無理
もしできたとしたら地獄だろうな
105デフォルトの名無しさん:2010/08/19(木) 18:08:54
> もしできたとしたら地獄だろうな

と、ひたすら逃げ回っていたのが構造化プログラミング
ちゃんと秩序を作れば悪くはないというのがアクセス制御や例外処理

もっとも goto という綴りは使っていないが
106デフォルトの名無しさん:2010/08/19(木) 18:11:22
goto hell

setjmpとlongjmpでだとできるらしいけど
10799:2010/08/19(木) 18:16:19
>>100, >>101, >>102
つまり、push_back() では新しくオブジェクトが生成されて、コピーが行われいる、ということですね。
それがわかれば、納得です。c 上がりの身としてはちょっと抵抗がありますが。
コメントありがとうございました。
108air:2010/08/19(木) 18:16:43
csvを出力する際は、やはりifstreamやofstreamを使うのが無難ですよね?
109デフォルトの名無しさん:2010/08/19(木) 18:42:19
>>107
Cでも構造体を引数で渡すと同じようにコピーされるじゃん。
110デフォルトの名無しさん:2010/08/19(木) 19:42:44
構造体じゃなくてもコピーだわな。値渡し=コピー。
11199:2010/08/19(木) 20:34:44
>>102
次のような構造体も POD型といえるのでしょうか?
struct data {
list<int> l;
}

http://codepad.org/L7bt2ZlW
うーむ。

#昔は(win32は今でも)構造体はポインタで渡していたからなあ
112デフォルトの名無しさん:2010/08/19(木) 20:42:37
せめてPOD型でぐぐれよ
113デフォルトの名無しさん:2010/08/19(木) 20:49:05
>>112
すると、>>111 は POD 型ではないのですが、それでも、
container.push_back(struct-non-POD);
とすれば、non-POD がまるままコピーされるようなんです。(http://codepad.org/L7bt2ZlW)
そんなものだ、といわれれば、それまでなんですけれども。
うーむ。
114デフォルトの名無しさん:2010/08/19(木) 21:04:20
コンパイラが勝手にコピーコンストラクタ作ってるだけだろ
115デフォルトの名無しさん:2010/08/19(木) 21:28:59
何が駄目なの
116デフォルトの名無しさん:2010/08/19(木) 21:38:05
>>111
listがPODじゃ無いから違うだろう
117デフォルトの名無しさん:2010/08/19(木) 22:58:54
>>109
push_backの定義は
 void push_back( const T& val );
だから引数に関しては参照渡しになっている。
コピーコンストラクタが実行されるのはコンテナに入れるとき。
118デフォルトの名無しさん:2010/08/20(金) 01:01:22
>>113
そんなものです。(コピー)コンストラクタについて理解した方が良い。
119デフォルトの名無しさん:2010/08/20(金) 03:18:09
C++で作ったDLLからMYSQLに接続したいと思い、
MYSQL Connecter C 6.0.2というのとMYSQL Connecter C++ 1.0.5というのが見つかったのですが、
ぐぐってもWin32コンソールアプリケーションからDLLを使った例しかでてきません。
http://ameblo.jp/nana-2007-july/entry-10086686152.html
ここに書いてある事を参考に試してみたのですが、DLLからDLLを呼び出せないのか、
そのDLLを利用したアプリケーションが関数を使おうとすると吹っ飛びます。
MYSQL Connector Cの方はスタティックライブラリが存在しないみたいなので、
スタティックライブラリを利用して今現在のDLLに結合?してしまいたいのですが
DLLからスタティックライブラリすることって可能でしょうか?
それかヘッダとソースコードだけでMYSQLに接続できるようなライブラリがあれば
それを使いたいのですが、そのようなものはあるでしょうか?

C++版の方はスタティックライブラリはあるのですが、
http://forums.mysql.com/read.php?167,240030,240030#msg-240030
この人同じエラーがでて、フォーラムでも問題が解決していません。
また
http://blog.ulf-wendel.de/?p=215
こちらを参考に、試しにWin32コンソールアプリケーションで作成してみると、
スタティックライブラリを利用してるのに、libmylib.dllを必要となりまったく意味がありません。
120デフォルトの名無しさん:2010/08/20(金) 04:44:11
なんか>>99
Accelerated C++に進む前に、基本をちゃんとやっとけってレベルだったんだな
121デフォルトの名無しさん:2010/08/20(金) 06:21:58
>>119
たぶん素材(ソースとかコンパイル方法とかの情報)全部出してもお前には無理っぽいから
面倒なので無視することにした
122デフォルトの名無しさん:2010/08/20(金) 07:11:10
>>121
そうですか・・・残念です。
123デフォルトの名無しさん:2010/08/20(金) 07:54:41
もう一度同じ質問繰り返すつもりなら
頼むから別人に成り済ましてくれ
124デフォルトの名無しさん:2010/08/20(金) 09:04:03
面倒なので無視することにした(キリッ
125デフォルトの名無しさん:2010/08/20(金) 09:21:25
>>121
答えられないなら無理すんなよw
126デフォルトの名無しさん:2010/08/20(金) 12:13:18
自己解決しました。
127デフォルトの名無しさん:2010/08/20(金) 14:34:30
自家発電しました。
128デフォルトの名無しさん:2010/08/20(金) 23:59:09
てstしました
129デフォルトの名無しさん:2010/08/22(日) 14:24:15
I do a test!
130デフォルトの名無しさん:2010/08/22(日) 19:26:39
I wanna do.
131デフォルトの名無しさん:2010/08/22(日) 19:39:07
But I can't do.
132デフォルトの名無しさん:2010/08/22(日) 19:42:36
Because...
133デフォルトの名無しさん:2010/08/22(日) 19:52:55
I'm a virgin!
134デフォルトの名無しさん:2010/08/22(日) 19:55:23
She went to a bargain.
135デフォルトの名無しさん:2010/08/22(日) 21:01:18
I'm a pick at you.
136デフォルトの名無しさん:2010/08/22(日) 21:01:58
C++の入門勉強を終えたんですが
C++の公開されてるライブラリって少なくないですかね?

Windows開発でも屍のMFC/ATLぐらいしかなくメインはWinAPIか魔術DirectXですし
MacはObjectiveCですし
UNIX/LinuxはCメインですし
パット思い浮かぶのはQtぐらいしかないんですが

C++のライブラリってあんまりないもんなんですか?
業務とかで自分たちでCの関数をラッパーして作るのが主流?
137デフォルトの名無しさん:2010/08/22(日) 21:04:00
boostでもしゃぶってろ
138デフォルトの名無しさん:2010/08/22(日) 21:09:36
Boostは汎用的すぐるだろ
そうじゃなくてもっと専門に特価したネットワークライブラリ(上級層 HTTP/SMTP)とか画像処理とか
サウンド処理とかあってもいいんじゃないかと。
139デフォルトの名無しさん:2010/08/22(日) 21:10:16
>>136すげえな、もうC++の勉強おわったんかよw
ならもうくんなよなwww
140デフォルトの名無しさん:2010/08/22(日) 21:14:12
>>136
それだけ知っててなぜ無駄口をたたいているヒマがある?
どれでもいいからがっぷり四つに組んでみろ
歩兵用の兵器って認識ねえならやめとけ
141デフォルトの名無しさん:2010/08/22(日) 21:23:36


          ____
       / \  /\ C++は歩兵用の兵器キリッ
.     / (ー)  (ー)\
    /   ⌒(__人__)⌒ \
    |      |r┬-|    |
     \     `ー'´   /
    ノ            \
  /´               ヽ
 |    l              \
 ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、.
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))


          ____
        /_ノ  ヽ、_\
 ミ ミ ミ  o゚((●)) ((●))゚o      ミ ミ ミ
/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\   /⌒)⌒)⌒)
| / / /     |r┬-|    | (⌒)/ / / //  だっておwwwwwwwwwwwwww
| :::::::::::(⌒)    | |  |   /  ゝ  :::::::::::/
|     ノ     | |  |   \  /  )  /
ヽ    /     `ー'´      ヽ /    /     バ
 |    |   l||l 从人 l||l      l||l 从人 l||l  バ   ン
 ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、    ン
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))
142デフォルトの名無しさん:2010/08/22(日) 21:31:05
ここれははずかしい!
143デフォルトの名無しさん:2010/08/22(日) 21:36:10
別にどこもおかしくねーぞ?
144デフォルトの名無しさん:2010/08/22(日) 21:52:08
>>136
Qt4
145デフォルトの名無しさん:2010/08/22(日) 22:55:33
C++は原爆
146デフォルトの名無しさん:2010/08/23(月) 12:19:47
C++ の大きな利点って膨大な C のライブラリを使える事だと思う。
いつも使うならラッパー書いても良いけど別に書く必要も無い。
「C++で公開されてるライブラリって少ない」ってC++使う大きな理由に気づいてないような

この前 Magick++使ったけど,これは C++専用 API もあるね(いろいろな言語
のAPIあるけど)

C++ネイティブのAPIが少ないと感じるとしたらそこまで需要が無い場合が多い
からじゃないかな
fftw3 とかC++で使ったけど普通に使えて特にラッパー書こうという気もおきなかった
147デフォルトの名無しさん:2010/08/23(月) 12:26:48
>>146
fftwはplanを作る段階で全てを決定しておく必要があるから余り問題にはならないね。
私はラッパこそ作らないけど、fftwを使うクラスを作ってデストラクタでplanの破棄をするように気をつけてるよ。
GUI系のようにプロパティが沢山あって途中で(変えられる|変えたい)場合はラッパ作っておくと楽だけど。
148air:2010/08/23(月) 14:08:44
CSVファイルを出力するという課題が出ました。
そこで疑問が出たのですが解決していただきたいです。
・出力先はどこになるのか?
・今回用いるCSVファイルは容量が大きく開くことができません。
 出力することにより開けるようになるのでしょうか?
149デフォルトの名無しさん:2010/08/23(月) 14:17:47
>>148
日本語でおk
150デフォルトの名無しさん:2010/08/23(月) 14:26:10
課題をそのまま貼るしかない。
151デフォルトの名無しさん:2010/08/23(月) 14:27:25
宿題スレにな
152デフォルトの名無しさん:2010/08/23(月) 14:32:52
>>148
・出力したい場所は自分できめる。
・出力したら何MBになったのか書く。
153デフォルトの名無しさん:2010/08/24(火) 05:23:31
継承クラスで
virtualでない(オーバーライドできない)関数を
同じ名前で定義するコトって、何か名前がありますか?

単純にクラスの型によってオーバーロードっぽい動作をするだけですが…

class CBase {
virtual void func1(){}
         void func2(){}
};
class CSub {
void func1(){} // ←オーバーライド
void func2(){} // ←?
};
154153:2010/08/24(火) 05:24:47
コード間違えました

class CBase { 
virtual void func1(){} 
         void func2(){} 
}; 
class CSub : public CBase { 
void func1(){} // ←オーバーライド 
void func2(){} // ←? 
}; 
155デフォルトの名無しさん:2010/08/24(火) 05:49:01
hide
156デフォルトの名無しさん:2010/08/24(火) 07:32:55
>>153
virtualじゃなくてもオーバーライドは出来る
157デフォルトの名無しさん:2010/08/24(火) 09:06:17
オーバーライドではなくハイディングまたは上書き
158デフォルトの名無しさん:2010/08/24(火) 09:14:40
上書きってoverrideの和訳だと思ってた
159デフォルトの名無しさん:2010/08/24(火) 09:23:01
上書きは over write だ
160デフォルトの名無しさん:2010/08/24(火) 09:24:04
virtual でなくてもオーバーライドでしょ
161デフォルトの名無しさん:2010/08/24(火) 09:27:17
>>159
規格上の用語として
162デフォルトの名無しさん:2010/08/24(火) 10:36:44
ISO C++でのoverrideはJISでは上書きと訳されてるな。
ちなみにhideは隠ぺい。
163デフォルトの名無しさん:2010/08/24(火) 10:46:08
まあ翻訳なんて
英語→日本語→英語
で完全に元の文になる訳じゃなし
164デフォルトの名無しさん:2010/08/24(火) 14:31:28
>>156
> virtualじゃなくてもオーバーライドは出来る
俺もそうだと思っていたが、規格の上ではそうじゃないらしい。
165デフォルトの名無しさん:2010/08/24(火) 14:45:50
virtual じゃないものをオーバーライドすると文字通り上書きだがポリモーフィズムが機能しない
virtual なものをオーバーライドするとポリモーフィズム動作してくれる
ってことで内科医
166デフォルトの名無しさん:2010/08/24(火) 14:48:22
俺も virtual でなくても override と呼ぶ(ただ,すべきではないだけ)と思ってた
けど調べたら違うみたいね
Meyers は redefine と書いてるし「再定義」位が良いのかな
167デフォルトの名無しさん:2010/08/24(火) 14:53:58
オーバーロードのことだと思ってた
168デフォルトの名無しさん:2010/08/24(火) 16:18:14
初学者としてはオーバーライドとオーバーロードの意味がものすごい勢いでごっちゃになる
169デフォルトの名無しさん:2010/08/24(火) 17:40:36
>>165
いや、そもそも
> virtual じゃないものをオーバーライドする
ということができない。
polymorphism以外の点ではまるでそっくりな記法と結果を期待できるが、
規格の上ではそれをoverrideと呼ばないってこと。

俺は以前はpolymorphismが機能しないoverrideと
機能するoverrideがあるのかと思っていたが、
そうじゃなかった、overrideという用語の定義自体に
すでにvirtualな物にたいして使いpolymorphismが機能することが
前提になっていた。
170デフォルトの名無しさん:2010/08/24(火) 18:04:15
とりあえずオーバーライドがどんな機能なのかもう一度勉強してこい
171デフォルトの名無しさん:2010/08/24(火) 18:10:15
仮想関数にしないとオーバーライドできないなんて超常識だろ

ココはど素人の集まりかよ
172デフォルトの名無しさん:2010/08/24(火) 18:14:08
>>170
> とりあえずオーバーライドがどんな機能なのかもう一度勉強してこい
機能というか、用語の定義を、でしょ。
隠蔽とごっちゃになっている人が多いんだろう。
確か・・・polymorphicに使える点以外では振る舞いは同じだよな?
173デフォルトの名無しさん:2010/08/24(火) 18:18:29
>>172
いや機能を理解してればごっちゃにならないから
振る舞いが一緒とか寝言は寝ていえってレベル
174デフォルトの名無しさん:2010/08/24(火) 18:22:22
>>172
馬鹿でしょお前、マジで。
175デフォルトの名無しさん:2010/08/24(火) 19:27:40
俺は他人よりも理解しているの法則発動
176デフォルトの名無しさん:2010/08/24(火) 21:17:21
お前らど素人だろどうせ
177デフォルトの名無しさん:2010/08/24(火) 21:53:18
結局答えは?隠蔽でいいの?
178デフォルトの名無しさん:2010/08/24(火) 21:58:37
struct A
{
    int a;
};
void Print( A& a ){ printf( "%d\n", a.a ); }

A a;
Print( a );
Print( A() );
ってやると結果が
2008736204
0
になるんですけどなんで違うんですか。
179デフォルトの名無しさん:2010/08/24(火) 22:05:30
>>178
初期化してないからゴミがはいってるんじゃね。
180デフォルトの名無しさん:2010/08/24(火) 22:09:54
>>153
すでに>>155, >>162で答えられてるけど 隠ぺい(hide)

JIS X3014 23ページより...
3.3.7 名前は,入れ子になった宣言領域 又は 派生クラスの中で,それと同じ名前を明示的に宣言する
と 隠ぺい(hide) することができる (10.2 参照)。
181デフォルトの名無しさん:2010/08/24(火) 22:11:45
オーバーライドでも隠蔽されるけどな
182デフォルトの名無しさん:2010/08/24(火) 22:17:33
>>178
そもそも最後のはコンパイルエラー
183デフォルトの名無しさん:2010/08/24(火) 22:53:38
またVC++か
184172:2010/08/24(火) 22:55:45
>>173
具体的に俺のレスで誤っている所を一つでも指摘してみろ。
できないだろどうせ。
だって誤りはないんだもの。
185153:2010/08/24(火) 23:35:10
>>155,162
ありがとうございました!
なんて言ったらいいのかわからずもやもやしていたので、すっきりしました!!
>>180
定義されているところまでありがとうございます!!



>>155-177
思ってもみない方向に議論が…ι
186デフォルトの名無しさん:2010/08/24(火) 23:49:12
>>178
上は未初期化で↓はデフォコン初期化なんじゃね
下でも何もしないコンストラクタ書くと同じ結果になった
187デフォルトの名無しさん:2010/08/25(水) 00:25:54
A a();
Print( a );
Print( A() );
188デフォルトの名無しさん:2010/08/25(水) 00:41:22
>>184
>隠蔽とごっちゃになっている人が多いんだろう。
>確か・・・polymorphicに使える点以外では振る舞いは同じだよな?
スマソ、隠蔽とオーバーライドを比べてるのかと早とちりした。
189デフォルトの名無しさん:2010/08/25(水) 01:22:03
>>188
隠蔽とオーバーライドを比べてるとしか読めないんだけど、
ほんとは何と何の「振る舞いが同じ」って言ってんの?
190デフォルトの名無しさん:2010/08/25(水) 02:26:11
次はきっとPODと非PODの混同にぶち当たるんだな
191デフォルトの名無しさん:2010/08/25(水) 13:26:26
分からない私にだれか分かりやすく教えてください。

というか実際 分かってないで使っているのが
案外私以外にもいるって知ってちょっと安心。
192デフォルトの名無しさん:2010/08/25(水) 13:31:13
「仮想関数でないとオーバーライドはできない」

このことを理解できてない奴が多いだけ
193デフォルトの名無しさん:2010/08/25(水) 13:52:41
>>191
まとめるとこうですの
class A
{
public:
virtual ~A();
virtual void override();
void overload();
};

class B :public A
{
public:
virtual void override(); //virtualはなくても同じ
void overload();
};

void hoge()
{
B b;
A& a=b;
a.override(); //B::override()が呼ばれる
a.overload(); //A::overload()がよばれる
b.override(); //B::override()が呼ばれる
b.overload(); //B::overload()が呼ばれる
}
194デフォルトの名無しさん:2010/08/25(水) 14:10:22
オーバーロードと隠蔽がごっちゃになってる人は多そう
195191:2010/08/25(水) 14:13:55
>>193
ありがとうございます。

> void overload();
は、オーバーロードと呼ぶのですか?
それとも隠蔽と呼ぶのですか??
オーバーロードとは
class X
{
public:
void overload(int);
void overload(char);
void overload(const X&);
> };
こういう物だと思っておりましたが。
196デフォルトの名無しさん:2010/08/25(水) 14:14:17
いまだにオーバーロードとライドが、どっちがどっちだったかゴッチャになる。
197193:2010/08/25(水) 14:20:15
>>195
すまん、それは隠蔽だった
198デフォルトの名無しさん:2010/08/25(水) 14:45:44
これはひどい
199デフォルトの名無しさん:2010/08/25(水) 14:58:06
>>193
何を訳のわからんことを書いてるんだ
お前が他人に教えるなんて100年早いわ
200デフォルトの名無しさん:2010/08/25(水) 15:01:12
↓オーバーロードとオーバーライドと迷い猫オーバーランとオーバードライブの違いを説明してくれ
201デフォルトの名無しさん:2010/08/25(水) 15:03:43
>>184
お前も黙れ、>>172 は間違っている
関数テーブルが変わってくるので、当然振る舞いも変わる

つかこの辺のことをわかってないくせいに、よくも他人のことをああだだこうだ言えるよな
知らなかったしても、少しは調べてから発言しろよ
202デフォルトの名無しさん:2010/08/25(水) 15:21:24
>>192
> 「仮想関数でないとオーバーライドはできない」

これは本当?
規格にはそんなこと書いてないと思うんだけど。どこに書いてあるの?
「仮想関数を使うとオーバーライドできる」というようなことは書いてあるけど。
見落としてるのかな。
まあ、「オーバーライド」という言葉は仮想関数に関するときしか使わないというのには同意するけど。

>>195
>> void overload();
>は、オーバーロードと呼ぶのですか?
>それとも隠蔽と呼ぶのですか??

別にその関数宣言自体を「隠ぺい」(名詞)と呼ぶ訳じゃないでしょ。
「関数B::overloadは関数A::overloadを隠ぺいする」と表現する。
「関数B::overloadは関数A::overloadの隠ぺいである」とは普通言わないんじゃない?

なんか一連の議論を見てると言葉の使い方が気持ち悪くて仕方ないんだよね。
203デフォルトの名無しさん:2010/08/25(水) 15:24:28
>>196
オーバーロード→王→覆う→世界を覆う共通認識→共通→共通の名前
オーバーライド→井戸→土地に付属→代々継承される→継承
204デフォルトの名無しさん:2010/08/25(水) 15:46:19
>>202
>これは本当?
オーバーライドは仮想関数テーブルにある関数へのポインタを書き換えるということだよ。
上書きするからオーバーライド。

仮想関数でなければテーブル自体が存在しないんだよ。
存在しない物をのをどうやってオーバーライドするというんだ。
お前は何をオーバーライドするつもりなんだ。

別の場所に新たに作成されるのがオーバーライドのはずがない。


>同意するけど。
お前の同意などいらん。あほか。
205デフォルトの名無しさん:2010/08/25(水) 15:48:12
オーバーハイドですね!
206デフォルトの名無しさん:2010/08/25(水) 15:52:03
>>202
あと隠蔽の意味全然わかってないな。
隠蔽というのは別々に存在している状態で、手前の奴が後ろの物を隠した状態のことだよ。
手前にあるから後ろが見えないだけ。だから工夫すればアクセスも可能。

対して上書きは元の物が上書きされて消失した状態。
207デフォルトの名無しさん:2010/08/25(水) 16:03:44
オーバーライドしても同じ工夫でアクセスできるんじゃね?
どんな工夫か知らないけど
208デフォルトの名無しさん:2010/08/25(水) 16:10:14
>>207
ヘー君が使ってるメモリは上書きしても前のデータが読めるんだ。
そりゃ凄いな。
209デフォルトの名無しさん:2010/08/25(水) 16:13:38
で、どんな工夫でアクセスすんの?
210202:2010/08/25(水) 16:20:37
>>204
いや、だからあなたの言うオーバーライドという言葉の定義はどこで仕入れた知識なのかを聞いているんだけど。
規格上は残念ながらあなたの言うようには定義されていないんだよ。
「オーバーライド」という単独の言葉がどこまでの範囲を指すかは、かなり曖昧に見える。
たとえばコンパイラ内のシンボルテーブルの上書き、
という意味で使ってはいけない理由を示してもらえないと、>>192
嘘だったことになるんだけど。

仮想関数の仕組みは百も承知。

>>192
>「仮想関数でないとオーバーライドはできない」
これは「仮想関数でないと(仮想関数テーブル内のポインタを)オーバーライドできない」の省略だったってこと?

>>206
隠ぺいって規格の3.3.7に書かれている名前の隠ぺいのことだよね?
なんで分かってないと思うのか分からん。
211デフォルトの名無しさん:2010/08/25(水) 16:37:12
>>210
>たとえばコンパイラ内のシンボルテーブルの上書き、
>という意味で使ってはいけない理由を示してもらえないと、

おいおい「シンボルテーブルの上書き」ってw
サブクラスに同名関数があるとこういうことが起こると思ってるの?
もちろんこんなことは起こらないよね。

要するに上書きされる物が無いのにオーバーライドとは言わないだろ。
逆に聞きたいが、お前は何が上書きされると思ってるんだ。
212デフォルトの名無しさん:2010/08/25(水) 16:39:29
>>209
仮想関数だったものは上書きされてるからアクセスできない。

仮想関数でなければ、例えばキャストすればアクセスできる。
213デフォルトの名無しさん:2010/08/25(水) 16:47:12
>>212
例えばa.A::override();とかは駄目なの?
214202:2010/08/25(水) 17:00:07
>>211
やれやれ、本当に何を聞かれているのか分かっていないんだな。
まあいいや。
×「仮想関数でないとオーバーライドはできない」
○「仮想関数は自分自身や基底クラスの同じ名前で同じ仮引数並びを持つメンバ関数をオーバーライドする」

ということで。
215デフォルトの名無しさん:2010/08/25(水) 17:02:20
>>210
C++ 英語版 wiki に overrided が使用されている。
もちろん Virtual member functions とセット。
引用元が
Stroustrup, Bjarne (2000). The C++ Programming Language
となっている。この人は C++ の開発者。
この本が C++ の発信源なんだよ。
現状の世の中のC++の情報もこれに反することは書いてないはずだけどね。

けど、こういう厳密な定義を持ち出さずとも、
上書きされる物がないのに、上書きというのはおかしいだろう。
仮想関数の基本動作が理解できていればわかるはずだけどね。
216デフォルトの名無しさん:2010/08/25(水) 17:06:00
スコープが違うのにオーバーロードって?
217デフォルトの名無しさん:2010/08/25(水) 17:07:06
>>214
違う。

◎「仮想関数でないとオーバーライドはできない」
仮想関数でないと関数テーブルが作成されないので、オーバーライドを実現するすべがない

?「仮想関数は自分自身や基底クラスの同じ名前で同じ仮引数並びを持つメンバ関数をオーバーライドする」
日本語になってない。仮想関数はオーバーライドされる方でしょ。
218デフォルトの名無しさん:2010/08/25(水) 17:17:47
202さんは何が上書き(オーバーライド)されると考えているのでしょうか?

それとも上書きされるものがなくても、オーバーライドと言っても構わないという考え?いうはおかしくないという考えなんでしょうか?
219デフォルトの名無しさん:2010/08/25(水) 17:17:54
>>217
いいから、規格書の10.3を読めよ。
仮想関数が仮想関数を上書きするんだよ。

だいたいオーバーライドってのはオブジェクト指向プログラミングの
メソッドオーバーライディングのことを指しているんであって、
仮想関数テーブルの上書きはまた別な話だろう。
220デフォルトの名無しさん:2010/08/25(水) 17:40:40
>>219
お前こそ読み直せよ!!!
仮想関数は上書きされる方と書いてあるぞ。お前の読解力は問題ありすぎだわ。

お前は、
>簡便性のため、すべての仮想関数は、自分自身を上書きするものとする。
という一文の意味を取り違えて解釈してるだけじゃんwwwwwwwwwwwww
「簡便性のため」や「自分自身」という意味を考えろよ。

仮想関数をオーバーライドするときに、オーバーライドする方は仮想関数である必要ないだろ。
一体どのレベルから理解できてないんだ????
221デフォルトの名無しさん:2010/08/25(水) 17:44:04
>>219
>メソッドオーバーライディングのことを指しているんであって、
>仮想関数テーブルの上書きはまた別な話だろう。

C++ではメソッドオーバーライディングを実現する唯一の方法が
仮想関数テーブルの上書きでしょう。お前が別の話だと妄想してるだけ。
222デフォルトの名無しさん:2010/08/25(水) 17:47:18
>>220
いや、よく読んでよ。
> Derived::vfは,(virtualと宣言されていなくても)仮想となり, Base::vfを上書きする。
とかかれてるでしょ?
上書きされる方も当然仮想関数だし、上書きする方も当然仮想関数なんだよ。

ところで何で終始そんなにカッカしてるの?
223デフォルトの名無しさん:2010/08/25(水) 17:48:55
>>221
「別の話」と書いたのは不適切だったかもね。
「単に実装の詳細の話」とすべきだったかな。
224デフォルトの名無しさん:2010/08/25(水) 17:57:14
> C++ではメソッドオーバーライディングを実現する唯一の方法が
> 仮想関数テーブルの上書きでしょう。
なんて言っちゃうところも無知をさらけ出しているよね。
225デフォルトの名無しさん:2010/08/25(水) 18:05:24
>>222
>上書きされる方も当然仮想関数だし、上書きする方も当然仮想関数なんだよ。

違う。対象が仮想関数だから、仮想関数となる(変化する)ということ。
上書きする方は仮想関数である必要はない。
これはvtableに格納されるんだから、動作的にはこれでいい。

何れにしても、オーバーロードする方は仮想関数である必要はない。
226デフォルトの名無しさん:2010/08/25(水) 18:09:10
>>224
そう思うのは、お前がオーバーライドを
オーバーロードや隠蔽と混同している証拠だね。

隠蔽なら他の方法があるけど、オーバーライドは vtable を使った方法しかない。
227デフォルトの名無しさん:2010/08/25(水) 18:10:16
>>225
>何れにしても、オーバーロードする方は仮想関数である必要はない。

何れにしても、オーバーライドする方は仮想関数である必要はない。
の間違いだわ。
228デフォルトの名無しさん:2010/08/25(水) 18:14:34
とりあえず名前がオーバーライド(ロードか?)されまくってるからユニークなものにしてよ
229デフォルトの名無しさん:2010/08/25(水) 18:18:29
>>226
実装と規格の話題がごっちゃになってるよ
そろそろ整理した方がいいんじゃね
230デフォルトの名無しさん:2010/08/25(水) 18:37:06
>>229
俺は実装、規格に共通したことしか言ってない。

「仮想関数でないとオーバーライドはできない」
C++ の実装、規格ともにそう。
C++の開発者がそう規定しており、自身の本にもそう書いてある。
世の中のC++書籍やまともなサイトでもそう記述されている。

202の馬鹿が彼方此方かき集めて支離滅裂なことを言ってるだけ。
231デフォルトの名無しさん:2010/08/25(水) 18:44:07
>>230
規格ってvtableについても書いてあるの?
232デフォルトの名無しさん:2010/08/25(水) 18:46:00
オーバーライドできるのが仮想関数で
仮想関数でないとオーバーライドできない

これ循環証明だろ
233デフォルトの名無しさん:2010/08/25(水) 19:04:59
>>232
証明?

定義だよ。C++ の開発者がそう定義して、
C++の普及に伴い世の中浸透して、規格化もされているし、当然実装もそうなっている。
世の中の書籍にもそう書いてあるし、ネットで調べてももちろん同じ結果。

本当に 「仮想関数でないとオーバーライドはできない」 を否定したいのなら、
反例を一つ上げるだけの話だよ。それすらできないんだから。

要するに初心者がオーバーロードや隠蔽とごっちゃにしてるだけの話なんだよ。
234デフォルトの名無しさん:2010/08/25(水) 19:17:17
>>233

> 定義だよ

ああ、そりゃ悪かった

C++ の開発者ってパゲのことか?
言い出しっぺではあるが今そのタイトルで呼ぶと色んな人に失礼だと思うよ
規格の話をしているなら、実装や書籍やネットを持ち出す必要はないね

仮想関数に近いことは他の手段でもできるんだが
おたくさんが規格と用語にこだわるようなので今は言わないでおく
235デフォルトの名無しさん:2010/08/25(水) 19:44:53
>>234
規格だけの話はしていない。

>規格の話をしているなら、実装や書籍やネットを持ち出す必要はないね
規格だけでなく、実装、書籍、ネット全てがそういう認識と言うこと。
そももC++の規格なんて、C++が実装されて、世の中に普及して、書籍も沢山でたその後だよ。
規格なんかよりずーっと前からオーバーライドはプログラマーの共通認識なわけ。

規格書読んでC++の習得する奴なんかいないだろう。初心者なんだから規格を気にする前に、
書籍とかネットでの共通認識を素直に取りこめばいいんだよ。固定観念持ちすぎなんだよ。


>仮想関数に近いことは他の手段でもできるんだが
>おたくさんが規格と用語にこだわるようなので今は言わないでおく
こういう捻くれた解釈はやめなさい。違うものは違うんだよ。隠蔽は隠蔽でしかない。
自分の感覚を世の中に合わせる努力も必要だよ。
236デフォルトの名無しさん:2010/08/25(水) 20:15:05
>>233
「オーバーライドならば仮想関数である」

「仮想関数でないならばオーバーライドではない」
と言い換えてるだけなんだぜ
237デフォルトの名無しさん:2010/08/25(水) 22:28:25
ttp://cpplover.blogspot.com/
例のあの人がまとめてくれてるぜ
きっとお前らが情けないからだな。

俺ホモだけど
238デフォルトの名無しさん:2010/08/25(水) 22:48:53
知るかそんなやつ
239デフォルトの名無しさん:2010/08/25(水) 22:57:06
魔道書の人、ここみてんのか。
240デフォルトの名無しさん:2010/08/25(水) 23:35:45
俺が確認したかぎり、こことC++0xスレとBoostスレを見ていると思われる。
今C++0xの本を執筆しようとしてなんとかと言ってたようだが詳細はしらね
241デフォルトの名無しさん:2010/08/26(木) 01:31:37
最新のドラフト N3092 の 10.3 p2 より
> If a virtual member function vf is declared in a class Base and in a
> class Derived, derived directly or indirectly from Base, a member
> function vf with the same name, parameter-type-list (8.3.5),
> cv-qualification, and refqualifier (or absence of same) as Base::vf is
> declared, then Derived::vf is also virtual (whether or not it is so
> declared) and it /overrides/ Base::vf.
上記 /overrides/ は、これが用語の定義であることを示す斜体表記になって
いる。( 1.3 p2 )

日本語によるまとめ。
http://cpplover.blogspot.com/2010/08/overloadoverridehiding.html

上記により、「仮想関数でないとオーバーライドはできない」は本当。
ただしこれが本当であることを示すのに vtable 云々(実装の詳細の話)を
持ち出す必要もないし(ここまでの残念な流れを見れば明らかなように)不適切。
242デフォルトの名無しさん:2010/08/26(木) 02:25:10
みんな何と戦っているんだ
243デフォルトの名無しさん:2010/08/26(木) 02:44:21
自分とのたたかいだよ(キリッ
244デフォルトの名無しさん:2010/08/26(木) 02:44:22
>>237
>Derived classの非virtualなメンバー関数に対し、同名のBase classの非virtualなメンバー関数がある場合、
>それは単に、名前を隠しているだけである。
これDerived classは非virtualかどうかって関係無いよね?
245デフォルトの名無しさん:2010/08/26(木) 10:29:51
C++でソケット通信を行いたいのですが、いい日本語のリファレンスをご存じないですか?
246デフォルトの名無しさん:2010/08/26(木) 10:50:02
247デフォルトの名無しさん:2010/08/26(木) 15:08:28
入れるデータの数の上限が無いハッシュテーブルってどうやって作るんですか?
248デフォルトの名無しさん:2010/08/26(木) 15:20:35
>>247
データ数に上限のない普通のテーブルなら作れるのか?
話はそれからだ
249デフォルトの名無しさん:2010/08/26(木) 16:07:34
テーブルという名前のデータ構造は存在しませんが何か?
250デフォルトの名無しさん:2010/08/26(木) 16:22:06
>>249
普通のテーブルというのはハッシュ化してないテーブルという意味だよ。
日本語にすると表とか配列のこと。

可変長の配列を作る方法がわからないのか、
それともハッシュ化するところで躓いてるのかがわからんのだよ。
251デフォルトの名無しさん:2010/08/26(木) 16:23:52
可変長の配列を作る方法が分かったとしても
サイズが変わるとハッシュ関数も変わっちゃうから
出来ないのは当たり前じゃないですか。
252デフォルトの名無しさん:2010/08/26(木) 16:39:13
>>251
縦方向の話じゃなくて、横。。。って言っても伝わらないか。

ハッシュ関数が同じ値を返してくる場合があるよね、
それをどう処理するのがハッシュテーブルを作る上で大変なところ。
ハッシュ値が重複したものに対しての受け皿は可変になるよね。
扱えるデーター数が無制限ということなんだから、この部分も無制限にする必要があるでしょ。

それとも、ハッシュ値が重複しても知らないよって話?上書きでOK?
それなら固定長の配列用意して、適当な index を返すハッシュ関数作ればいいだけ。
ハッシュ関数の作り方がわからないってことか?
253デフォルトの名無しさん:2010/08/26(木) 16:42:29
そんな回りくどい書き方しないで外部ハッシュ法を使うの
一言ですむことじゃないですか。
なぜそうしないんですか?
ちなみに他のスレで解決したのでもういいです。
有難うございました。
254デフォルトの名無しさん:2010/08/26(木) 16:48:02
>>253
それは失礼したね。
どのレベルで質問してるのかがこっちには分からなかったのだよ。
とりあえず、解決できてよかったね。
255デフォルトの名無しさん:2010/08/26(木) 23:11:55
>>253
> ちなみに他のスレで解決したのでもういいです。
なんでそんなマルチポスト野郎が偉そうなんだろうか。
256デフォルトの名無しさん:2010/08/27(金) 01:08:17
人格の問題でしょ
257デフォルトの名無しさん:2010/08/27(金) 13:08:19
そういう病気なんでしょ
258デフォルトの名無しさん:2010/08/27(金) 19:38:24
>>253
> ちなみに他のスレで解決したのでもういいです。
この決めぜりふカッコイイな、ガイキチ。
259デフォルトの名無しさん:2010/08/27(金) 19:47:08
芽殖孤虫 - Wikipedia
ttp://ja.wikipedia.org/wiki/%E8%8A%BD%E6%AE%96%E5%AD%A4%E8%99%AB
予後
現在のところ、芽殖孤虫に感染した患者を救命できたという報告はない。

うぎゃああああああ
260デフォルトの名無しさん:2010/08/27(金) 21:57:12
なんか大変だったみたいすね
261デフォルトの名無しさん:2010/08/28(土) 01:36:59
>>253は朝鮮人みたいなやっちゃな

「かつて、本田技研の創業者、本田宗一郎氏が技術支援の為に、台湾と韓国へ
技術支援に行きました。暫くして、台湾から、「日本と同じものが作れるようになりました。
是非見に来てください!」と連絡が入りました。そして暫くして韓国からも連絡が。「日本と
同じものが作れるようになりました。もう来なくてもいいです。」
そして韓国は本田とのライセンス契約を一方的に解消し、エンジンからデザインまで全くの
コピー品を”韓国ブランド”として販売を始めました。

本田宗一郎氏は大変失望してこう話したそうです ”韓国とは絶対に関わるな”」

>>253とは絶対に関わるな
262デフォルトの名無しさん:2010/08/28(土) 03:41:09
>>253を叩くよりも>>254の大人の対応を見習おうぜ
263デフォルトの名無しさん:2010/08/28(土) 03:48:57
●宮崎牛精子盗難

●宮崎牛口蹄疫蔓延

●宮崎牛全滅
いまココ
●韓国牛輸入
264デフォルトの名無しさん:2010/08/28(土) 07:56:12
265デフォルトの名無しさん:2010/08/28(土) 08:48:17
UDON
266デフォルトの名無しさん:2010/08/28(土) 20:19:23
すみません。int型の4〜6桁の整数から
下3桁を抽出するにはどうするのが良いでしょうか?

現状、整数型変数に÷1000した値を入れ、それを1000倍して
差し引いて生成しているのですが、もっとシンプルにできるのでしょうか?
267デフォルトの名無しさん:2010/08/28(土) 20:24:02
% 剰余演算子
268デフォルトの名無しさん:2010/08/28(土) 20:24:19
>>266
%
基本的な演算子ぐら知っとけ
269デフォルトの名無しさん:2010/08/28(土) 20:31:32
>>267-268
ありがとうございました・・orz
270デフォルトの名無しさん:2010/08/28(土) 20:32:52
>>266
それでいい
%は構文糖衣
271デフォルトの名無しさん:2010/08/28(土) 20:36:10
>>270
構文糖って、どのへんがどのように?
272デフォルトの名無しさん:2010/08/28(土) 20:41:08
シンタックスシュガーて言葉を最近知ってつかいたくてしかたない。
273デフォルトの名無しさん:2010/08/28(土) 21:21:16
% が >>266 の構文糖衣になる処理系って有り得るのだろうか。
普通、÷ 1000 した時点で剰余も求まるよな。
なのに乗算と減算を追加する処理系って果たして存在するのかどうか。
274デフォルトの名無しさん:2010/08/28(土) 21:25:03
くだらない。
275デフォルトの名無しさん:2010/08/28(土) 22:50:46
>>266 は情報JAXA
276デフォルトの名無しさん:2010/08/28(土) 23:08:07
auto lambda = [] () {};

void func(/* lambdaを引数にとる関数の書き方を教えてください */);
277デフォルトの名無しさん:2010/08/28(土) 23:09:23
>>276
template<typename T> で T とか、 std::function<void ()> とか。
278デフォルトの名無しさん:2010/08/28(土) 23:16:08
struct A
{
  int a;
  int b;
  int c;
  int d;
};
こんな感じの構造体をクラスのメンバ変数にした場合、
0で埋めるコスト安い方法ってなんですか。memset以外で。
279デフォルトの名無しさん:2010/08/28(土) 23:18:29
>>278 member = A()
280デフォルトの名無しさん:2010/08/28(土) 23:18:45
A a = {0};
281デフォルトの名無しさん:2010/08/28(土) 23:24:08
>>279
それでできる?
282デフォルトの名無しさん:2010/08/28(土) 23:24:44
>>280
メンバ変数で
283デフォルトの名無しさん:2010/08/28(土) 23:24:57
>>280でいいじゃんw
284デフォルトの名無しさん:2010/08/28(土) 23:27:34
>>277
勉強させていただきました。ありがとうございます。
これは便利だなあ。
285デフォルトの名無しさん:2010/08/28(土) 23:28:45
いまどきメタテンできないとかやばいよね
286デフォルトの名無しさん:2010/08/28(土) 23:38:17
>>279
これだとどういう理由でメンバが0で埋まるんですか?
287別人:2010/08/28(土) 23:40:36
デバッグモードでビルドしたから
288デフォルトの名無しさん:2010/08/29(日) 00:05:08
VS2010のリリースビルドでも0で埋まります。何故ですか。
289デフォルトの名無しさん:2010/08/29(日) 00:15:02
PODの明示的コンストラクタ呼び出しは0初期化と決まっているから。
290287:2010/08/29(日) 00:28:49
>>287は間違いだたゴメン。>>289が正解。
291デフォルトの名無しさん:2010/08/29(日) 00:37:23
サンクス!
292デフォルトの名無しさん:2010/08/29(日) 14:33:39
PODが0で初期化されるのってコンパイラ依存じゃなくて、仕様できまったんだっけ?
293デフォルトの名無しさん:2010/08/29(日) 16:10:48
知りたきゃ自分で調べて勝手に納得してな
294デフォルトの名無しさん:2010/08/29(日) 17:39:51
>>292
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3126.pdf

8.5.1 Aggregates の 第7節
7 If there are fewer initializer-clauses in the list than there are members in the aggregate, then each member
not explicitly initialized shall be value-initialized (8.5).

8.5 Initializers の 第7節
7 To value-initialize an object of type T means:
...省略...
— if T is a (possibly cv-qualified) non-union class type without a user-provided constructor, then the object
is zero-initialized and, if T’s implicitly-declared default constructor is non-trivial, that constructor is
called.

8.5 Initializers の 第5節
5 To zero-initialize an object or reference of type T means:
...省略...
— if T is a (possibly cv-qualified) non-union class type, each non-static data member and each base-class
subobject is zero-initialized;

8.5 Initializers の 第5節
5 To zero-initialize an object or reference of type T means:
— if T is a scalar type (3.9), the object is set to the value 0 (zero), taken as an integral constant expression,
converted to T;

ってことで仕様で決まってます
上のPDFは0xのものだけど引用部分は03規格とだいたい同じです(03最終草案とはちょっと違います)
295デフォルトの名無しさん:2010/08/29(日) 17:53:05
>>279 質問の元はこっちかw

5.2.3 Explicit type conversion の 第2節
2 The expression T(), where T is a simple-type-specifier or typename-specifier for a non-array complete object
type or the (possibly cv-qualified) void type, creates an rvalue a prvalue of the specified type, which is
value-initialized (8.5; no initialization is done for the void() case).

value-initialized から先は>>294のとおり
296デフォルトの名無しさん:2010/08/30(月) 14:14:13
boost::tokenizer< escaped_list_separator_sjis > tok( csvLine );
for(boost::tokenizer<escaped_list_separator_sjis >::iterator p=tok.begin(); p!=tok.end();++p){

cout << *p + "\t";
}
cout << endl;
これを出力すると
a e d
q d r
r u t
になります。
これをタブ区切りでtsvファイルに出力したいのですがどうすればよいでしょうか?
297デフォルトの名無しさん:2010/08/30(月) 14:15:39
>>296マルチすんなこのカス
298デフォルトの名無しさん:2010/08/30(月) 14:19:32
すみません。
もう1つの方はC言語で、こちらがC++だったので2つの書き込みをしてしまいました。
申し訳ありません。
本当はこちらに質問したかったです。
299デフォルトの名無しさん:2010/08/30(月) 14:23:30
>>298
いや、boostにも同じ質問しているだろ。
他に移動するときは断り書きをしたうえで、質問のポイントを再検討してから質問するのが道理。

で、あんたは何が判らないんだ? 素直にくだスレにでも行った方が無難なようだが。
300デフォルトの名無しさん:2010/08/30(月) 14:32:14
すみませんでした。
今は標準出力なのですがこれをtsvファイルに出力したいと思っています。
私が分からないのはこの1点です。
301デフォルトの名無しさん:2010/08/30(月) 14:37:17
>>296
#include <fstream>


ofstream ofs("data.tsv");

boost::tokenizer< escaped_list_separator_sjis > tok( csvLine );
for(boost::tokenizer<escaped_list_separator_sjis >::iterator p=tok.begin(); p!=tok.end();++p){
ofs << *p + "\t";
}
302デフォルトの名無しさん:2010/08/30(月) 14:39:29
>>300
最初からそう聞けばいいのに。
303デフォルトの名無しさん:2010/08/30(月) 14:41:17
ありがとうございます。今実行しましたが1行しか出力されていません。
どうすれば全行出力されますか?
<実行>
a e d
q d r
r u t
したいのですが、
a e d
しか表示されませんでした。
304デフォルトの名無しさん:2010/08/30(月) 15:29:27
ofs << endl;
305デフォルトの名無しさん:2010/08/30(月) 15:31:51
301を訂正します。
<実行>
a e d
q d r
r u t
したいのですが、
最後の1行の
r u t
しか表示されませんでした。
全行表示するにはどうすれば良いでしょうか?
306デフォルトの名無しさん:2010/08/30(月) 15:41:14
先ほどの段階でofs << endl;は入れていましたが最後の1行しか表示されないです。
307デフォルトの名無しさん:2010/08/30(月) 15:42:31
>>296 のcoutをofstreamに置き換えて、出力結果が違うってあるの?
それとも最初からバグってる?
308デフォルトの名無しさん:2010/08/30(月) 15:48:07
改行コードが違うんじゃね
309デフォルトの名無しさん:2010/08/30(月) 15:53:44
c++filtの逆をする、つまり、g++名 -> C名をしてくれるプログラムはありますか?
310デフォルトの名無しさん:2010/08/30(月) 16:08:46
初心者なもので309さんがおっしゃっていることが分かりません。
307さんのおっしゃる通りcoutをofstreamに置き換えてしましたが出力結果が違います。
311デフォルトの名無しさん:2010/08/30(月) 16:12:34
一行ごとにファイルを開いちゃってまずいことになってると予想
312デフォルトの名無しさん:2010/08/30(月) 16:13:13
>>310
>308
313デフォルトの名無しさん:2010/08/30(月) 16:28:19
>>311
ああ、それかもね。
ループのなかにofstream ofs("data.tsv"); を入れちゃってる。
314309:2010/08/30(月) 16:37:14
>>310
tsvファイルとは関係のない話です。唐突でした。

f.c: void f(int) {}をg++ -c f.cしたのち、nm f.oすると、
00000000 T _Z1fi
と表示されます。ここで、c++filt _Z1fiすると、
f(int)
と表示されます。

あるかと尋ねたのは、この逆の動作をする、「f(int)を入れると_Z1fiが出てくるプログラム」です。
315デフォルトの名無しさん:2010/08/30(月) 16:49:32
311さんと313さん、ご指摘ありがとうございます。
しかし、ループの中にはいれていません。
316デフォルトの名無しさん:2010/08/30(月) 17:10:14
>>315
>308
317デフォルトの名無しさん:2010/08/30(月) 17:11:12
>>314
つ[gcc]
318309:2010/08/30(月) 17:35:58
>>317
それはわかりますし……そうですね。
319デフォルトの名無しさん:2010/08/30(月) 17:42:55
>>315
何度か他人が指摘しているけど \r はあっても \n が無い
とそういう状況になるはず

そんなにわからないならコードをちゃんと出せって
情報小出しにされても皆わからん
320デフォルトの名無しさん:2010/08/30(月) 18:01:38
319さん申し訳ありません。
これがプログラムです。
void A::ReadFromCsvLine( const std::string& csvLine )
{
ofstream ofs("test.tsv");
boost::tokenizer< escaped_list_separator_sjis > tok( csvLine );
for(boost::tokenizer<escaped_list_separator_sjis >::iterator p=tok.begin(); p!=tok.end();++p){
ofs << *p + "\t" ;
cout << *p + "\t";

}
ofs << endl;
cout << endl;
ofs.close ();
これで実行すると、
標準出力の方は
a e d
q d r
r u t
のようになり、tcvファイルの方は
r u t
となります。
私はtcvファイルの方を標準出力の結果と同じにしたいです。
321デフォルトの名無しさん:2010/08/30(月) 18:06:24
ファイルを上書きしてるだけじゃないの?
322デフォルトの名無しさん:2010/08/30(月) 18:07:43
>>320
>308
その"test.tsv"をどっかにアップロードして味噌。
323デフォルトの名無しさん:2010/08/30(月) 18:08:00
これがプログラムです(キリ
324デフォルトの名無しさん:2010/08/30(月) 18:09:46
あーなるほど、ReadFromCsvLine()を毎行呼んでいるのか。
だとしたら、最初の行を処理する前に定義して、ReadFromCsvLine()にはofsの参照を渡せばいいや。
325デフォルトの名無しさん:2010/08/30(月) 18:10:07
>>323
どうかした?
326デフォルトの名無しさん:2010/08/30(月) 18:10:55
追記じゃなくて上書きしてるよなぁwwww
327デフォルトの名無しさん:2010/08/30(月) 18:14:43
>>325
>323は断片のみの提示に対して不満を訴えているものと思われる。
328デフォルトの名無しさん:2010/08/30(月) 18:14:49
>>325
死ねばいいよ
329デフォルトの名無しさん:2010/08/30(月) 18:15:04
みなさんありがとうございます。
どなたか変更後のプログラムを載せていただけないでしょうか?
330デフォルトの名無しさん:2010/08/30(月) 18:16:22
マルチすんなぼけ
331デフォルトの名無しさん:2010/08/30(月) 18:24:22
std::ofstream ofs( "test.tsv", std::ios::out | std::ios::app );

とりあえずこうすればいいんじゃないかな
これはこれで後で困りそうだけど
332デフォルトの名無しさん:2010/08/30(月) 18:26:30
2回動かしたら行が2倍になりました。

ってかw
333デフォルトの名無しさん:2010/08/30(月) 18:26:30
>>327
ならそう書けばいいのにね
使い方的に全然適当じゃないし
334デフォルトの名無しさん:2010/08/30(月) 18:31:17
> 私が分からないのはこの1点です。

絶対嘘。
プログラムの基本分かってないだろ。
335デフォルトの名無しさん:2010/08/30(月) 18:36:56
結局>>311,313だったわけか
forか関数呼出かの違いで
336デフォルトの名無しさん:2010/08/30(月) 18:43:56
   |:::::::::::::::::   ____________    :::::::::|
手  |::::::::::::: ,. '":::::::::::::::::::::::::`ヽ.  ::::::::| 頭  ど
遅  |:::::  /::::::::く:::::::╋::::::::>:::::::::\  :::| で.   こ
れ  |:::: 〈:::::::::;:::--- 、─ァ -- 、:;:::::::::〉 :::| す   が
で. .|:::::  ,〉'"      `'´     `ヽ!  :| か  悪
す  |:::: /   /  ハ  ハ ヽ ヽ 、  ',  |  ゜  い
ね. |:::: i  ,'  /!__i_, !' ! ,_ハ__ハ ',  ! ',    ん
  ゜/::  ノ.! ! /,ィ-ァ!、! レ',ィ-=!、! i ハ  〉    で
´\|::  〈 ノ Yレヘ''ゞ-'     ゞ-''/レ' ン ∠、    す
::::    〈 ハ  !ハ."  ______  "ハ ハ !   !    か
::     ノ、 `ァ'_」>、._`ー' ,,.イ/イ、ノ    ヽ.  ?
     / `ァ''´ ',   ヽ干´ン::::::::::::`ヽ.   `''ー─
    ! ヽ/   ,y ヽ、. .,!':::::::::.y::::::::::::',
    〉r〈_,.-、7-、  Y十::::.::::::i::::::::::::::〉
:    レ^iY⌒ヽ,イ'ヽ-! .|::::::::::::::;ハr、::::Y
::      '! ,ィ〈 `y'´`ヽ!::::::::::::/´⌒'/'
:::      Y´ヽ、)-'、___ノ、::::::::/   /
337デフォルトの名無しさん:2010/08/30(月) 18:44:43
         ,   '   ̄ '   '  ,
       , '           、   ` ,
     /              !     \
    /            /   i 、     ' ,
   /     / /     /    ト ヽ     ',
   ,'     / /   /  イi     } \ !    ,  i
  ,'     i i /   イ  / i     |  ', !    i .|
  |     |//  / //_/  |    / | _ ! !    i |
  |     !/-// / / ̄ /,   イ /  ̄ i !ト   ! |
  | .i    !'//  レ__、/イ /!/-_ =-、V i   i/     
  ! i    レ' /ィ=ヽ ` レ    ' /:て}ヽ 1   ! _ -, -──‐-、
   ', i    ! イ、|{:し::リ       弋=ソ ヾイ   |/ /: : : : : : : : : \.    | _|_   |_L   /
   ' !    i   ` = '          ̄  / ! /  ' ___: : : : : : : : : :ヽ   | _|    ̄|  _ノ  (  
    !    !           、     i i/   /:::::::::::::, '' ゙̄ヽ: : : : : '..  レ(__ノ\  |     \ 
    ',、    !       __    "/'´    |:::::::::::::::{::::::::::::::}: : : : : :|
     i!、 、  ト、     /  ヽ r‐'了        |:::::::::::::: 、::::::::::ノ: : : : : :| ____     |
      !ヽ\ !ヽ 、   、_  ノ|::::::|        ∨:::::::: '´ ̄: : : : : : : :/  /ヽ, l     ̄|7/ヽ
       \\! >! '  , ̄ , '_::::\__    \'´ : : : : : : : : : : /  /ヽ/ .| ̄    ./|    |
         ノ::::! く    _ , !' |::\>N、 l¨'''¬ー- 、 _____, '´      /  |___i. ′|  ▽ヽ,
       ィ:::::::::!   >< '   /:::::::::/ .二\
   , /o /::::::::::::!  / || .!   /:::::::::/  -‐、∨\
 ,..:::{__ == !::::::::::::::!ノ // ヽ /:::::::::::{   ィヽソ|:::::::|
338デフォルトの名無しさん:2010/08/30(月) 18:45:28
______________________
|
| 最近、スレッド荒れてるね…
|
|_____  ________________
       ∨
 三三三三三三三三[BAR   KUMAR]三三三三三三三三三三三
 _i^i__i^i_                  i^i ._i^i_ __, -―- 、___ _i^i_
 |*||*| ∩___∩    i^i _i^i_  | | |@ll|(_/,,,,   ,,,,   ヽ_) |@|
 |≡||≡|| ノ       ヽ  ([])|;□;|.(≡)|_| |●  ●   | |_|
 . 二二/  ●   ● | 二二( (二二二二 彡(_●_ )   ミ二二二
     |     ( _●_)  ミ    ) )    i二i__/` ''∪''  / ヽ
    彡、   |∪|  ノ ,Gノ'フ=  ___(___ノ_/i  ` ー '"  iヽ |
     /     ヽノ  ヽ / /     | !       |       | | l
 ..──|ヽ ヽ___i二i ヽ./─;==i─Y────────(⌒)─
 ____.ヽ\____)ノ   └-┘ ┴             ̄
      |       i ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  ̄ ̄ ̄ (ヽ   |_  \ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄∧ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 :::::::::::::::::::||\  | / /:::::::::| ̄ ̄ ̄ ̄ ̄ ̄ ̄   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 :::::::::::::::::::||::::|  |\___):::::::::::::| 夏休みだからねぇ…
 :::::::::::::::::::||:::(  \:::::::::::::::::::::| せめて宿題終わってからにしてほしいよ…
 :::::::::::::(   )\_):::::::::::::::::::|
                  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
339デフォルトの名無しさん:2010/08/30(月) 18:49:35
キモ
340デフォルトの名無しさん:2010/08/30(月) 19:04:33
>>334
質問の仕方も分かってないような気がする
341デフォルトの名無しさん:2010/08/30(月) 19:42:13
すみません。
char[10] に入れている 0〜99の乱数10個をできるだけ小さなバイト数に纏めてしまいたいのですが、
int型の変数に数字とした4組並べて置く程度しか思いつかず、これじゃ変わらないじゃないか、と。orz
何か良い圧縮〜展開する方法は無いでしょうか・・?
342デフォルトの名無しさん:2010/08/30(月) 19:45:27
いくらなんでも圧縮対象が小さすぎ
343デフォルトの名無しさん:2010/08/30(月) 19:56:45
0〜99 に限られてるなら
少なくとも 100/256 で 約 39% までは圧縮可能
とりあえず bit 幅縮めることを検討してみ
344デフォルトの名無しさん:2010/08/30(月) 19:59:00
駄スレにマジレスありがとう
345デフォルトの名無しさん:2010/08/30(月) 19:59:07
>>341
おすすめはしないが
7bitで0-99の値を表せるのでビットフィールドを使いつつアライメントと詰めるようにように設定すれば削れるんじゃないかな

これでも冗長性はあるので情報理論的にはまだ削れるらしいんだが
346デフォルトの名無しさん:2010/08/30(月) 20:02:21
>>345 だと
80bit -> 70bit だからまだかなり無駄があるね
347デフォルトの名無しさん:2010/08/30(月) 20:07:54
100^10 < (2^8)^8 なので 64bit (8byte) までで表せる
348デフォルトの名無しさん:2010/08/30(月) 20:11:36
>>347
100^10 = 10^20 > (2^8)^8 = 2^64 = 1.84467441 × 10^19じゃね?
普通に格納したら67ビット必要だろ?
349デフォルトの名無しさん:2010/08/30(月) 20:30:37
>>348
ありゃ
計算間違えたか
でも理論的には 67bit 未満も可能なんでしょう?
350デフォルトの名無しさん:2010/08/30(月) 20:35:05
>>348 ってことは実質72ビット必要になるから >>345 で充分なんだな
351デフォルトの名無しさん:2010/08/30(月) 20:40:04
>>349
どのパターンでも格納するという条件ならで67未満は不可能
(いや、符号理論の定義で行けば66.なんとかバイトまで削れるってことになりはするが)
ある0-99の10個の並びというものを突っ込むのであれば圧縮できる場合がある

あたりまえだが
352デフォルトの名無しさん:2010/08/30(月) 20:44:08
たとえば最短で1バイトに出来るけど最悪で10バイト超えてしまうような圧縮方法でもよくて
平均で10バイト未満に出来る(66ビット以下に出来る)っていうことですね
353341:2010/08/30(月) 21:04:24
>>342-352
少し難しい話でハッキリと理解できないものがありますが、
7bitずつ並べてしまえば圧縮できるのですね・・ありがとうございました。
354デフォルトの名無しさん:2010/08/30(月) 22:07:43
64(2**6) < 10**1(100**1) < 128(2**7)
8192(2**13) < 10000(100**2) < 16384(2**14)
524288(2**19) < 1000000(100**3) < 1048576(2**20)
数字3つを記録するのに21bitは多く,20bitもあれば十分であることがわかる
あとは100**10のときの上界と下界を求めれば必要なbit数は導き出せる

355デフォルトの名無しさん:2010/08/30(月) 22:09:03
1行目の「10**1(100**1)」は「100(100**1)」の間違いな
356デフォルトの名無しさん:2010/08/30(月) 22:15:22
int a[ 10 ] = { 0 };

int a[ 10 ] = {};
って書くのは正式な仕様ですか?
357デフォルトの名無しさん:2010/08/30(月) 23:32:40
C++ではそうだよ
358デフォルトの名無しさん:2010/08/30(月) 23:36:12
int a[0];
という配列は定義できますか?
359デフォルトの名無しさん:2010/08/31(火) 00:37:22
できないです
360デフォルトの名無しさん:2010/08/31(火) 00:42:45
★絶★対★無★理★
361デフォルトの名無しさん:2010/08/31(火) 00:53:18
>>354
それがその上のほうで出てる66とか67だよ
362デフォルトの名無しさん:2010/09/01(水) 00:40:21
ヘッダインクルードだけで使えるとか、
そんなに重くない(1MBもいかない)のをリンクするだけで使えて、

JavaScriptやLispなどの文法で
最低限、条件分岐と、四則演算と、簡易な文字列制御と
(C++アプリ側での定義済みの)関数の呼び出しができる、(欲張りか)
インタプリタ的なプラグインを実装できるという

都合のよいライブラリをオススメを教えてください…
363デフォルトの名無しさん:2010/09/01(水) 00:42:27
Luaとか?
364デフォルトの名無しさん:2010/09/01(水) 10:24:01
もうD言語でいいんでない?
365デフォルトの名無しさん:2010/09/01(水) 10:45:59
Qtとかどうか
366デフォルトの名無しさん:2010/09/01(水) 15:17:48
>>358
定義出来ないことを利用して
static_assertを書くことができるよね。
367デフォルトの名無しさん:2010/09/01(水) 15:21:38
>>362
boost.pythonオヌヌメ
368デフォルトの名無しさん:2010/09/01(水) 15:53:49
>>367
Boost.Pythonは確かにすごい。
369デフォルトの名無しさん:2010/09/01(水) 22:27:08
struct C::B;
struct A
{
  C::B* b;
};
namespace C
{
  struct B
  {

  };
}

これ通らないんですが、解決する方法ありますか?
370デフォルトの名無しさん:2010/09/01(水) 22:29:20
なめsぱせ C{stるctB;}
stるct A{C::B*b;}
なめsぱせC{stるctB{};}
371デフォルトの名無しさん:2010/09/01(水) 22:33:05
>>370
どんなセンスのなさだよ
372デフォルトの名無しさん:2010/09/01(水) 22:33:28
テンキュウ
373デフォルトの名無しさん:2010/09/01(水) 22:55:13
派生クラスのポインタから、基底クラス名を取得するにはどうすればよいのでしょうか。
374デフォルトの名無しさん:2010/09/01(水) 22:57:32
無理
375デフォルトの名無しさん:2010/09/01(水) 23:16:13
>>369
typenameじゃないん?
376デフォルトの名無しさん:2010/09/01(水) 23:30:05
>>373
typeof
377デフォルトの名無しさん:2010/09/02(木) 00:06:36

> 派生クラスのポインタから、基底クラス名を取得するにはどうすればよいのでしょうか。

> typenameじゃないん?

C++スレにいるとは思えないな
378デフォルトの名無しさん:2010/09/02(木) 00:11:23
クロスキャストで困ってるんじゃないかな
379デフォルトの名無しさん:2010/09/02(木) 00:28:19
>>373
C++にはリフレクション機能ないでしょ
380デフォルトの名無しさん:2010/09/02(木) 00:29:24
基底クラスのクラス変数に基底クラス名を持たせる
>>373こうですか?わかりません><
381デフォルトの名無しさん:2010/09/02(木) 00:29:53
>>373
objective-cならいける
382デフォルトの名無しさん:2010/09/02(木) 00:32:52
普通に考えて基底クラスの型を得るメタ関数教えろってことだろ。なんでいちいち曲解するかね
383デフォルトの名無しさん:2010/09/02(木) 00:52:45
is_a
384デフォルトの名無しさん:2010/09/02(木) 00:53:36
>>382
お前の頭がおかしい。断定するな。
多くの人がそう思うならそれは曲解じゃない。

質問者もそうは思っていないかもしれない。
なぜ断定できる?え?なぜ?
お前=質問者じゃないと断定は不可能だ。
385デフォルトの名無しさん:2010/09/02(木) 01:00:39
なぜってそれが普通だからだよ
質問者はそうは思っていないかもしれないけどな
386デフォルトの名無しさん:2010/09/02(木) 01:12:15
クラスのオブジェクトを返す関数はやめるべきですか?

例えば、文字列 std::string を返す関数は、何も考えないで書くと、
std::string hoge() { return "hoge"; }
になると思うんですが、
void hoge(std::string &dst) { dst = "hoge"; }
という感じで返してるソースを見かけました。
後者の方が効率的なんですかね
387デフォルトの名無しさん:2010/09/02(木) 01:16:04
最近のコンパイラならムーブされるから気にしなくていいよ
388デフォルトの名無しさん:2010/09/02(木) 01:25:17
>>385
> なぜってそれが普通だからだよ
普通も何も、お前一人がそう思っていて、
他の人がそうレスしていないんだから、
少なくとも曲解というお前の指摘は的外れだろう?
そうは思わないか?
389デフォルトの名無しさん:2010/09/02(木) 05:32:35
>std::string hoge() { return "hoge"; }

なんども無駄なコピーされるね
390デフォルトの名無しさん:2010/09/02(木) 08:10:35
「普通」を根拠にする技術者は信用できない。
たいていは「俺は」と言うべきところの多数派工作。
391デフォルトの名無しさん:2010/09/02(木) 08:11:47
>>386
前者は必ず新しい領域の確保が必要。
後者は確保済みの領域をそのまま使える。

小さなループ内で繰り返し呼び出すのなら、
後者のほうが効率が良くなる可能性が高い。
392デフォルトの名無しさん:2010/09/02(木) 08:37:11
>>390
それは技術者に限った話じゃないな
393デフォルトの名無しさん:2010/09/02(木) 09:45:31
const char * const を返した方がマシなんじゃ
394デフォルトの名無しさん:2010/09/02(木) 10:31:17
>>388
他の人ってどのみち数人じゃないか
そもそも同意レスが大量に付くレスが『普通』なの?
ついでに言うと俺は>>382じゃない
だから俺一人がそう思っていると思っているのはお前の思い込み
395デフォルトの名無しさん:2010/09/02(木) 10:32:57
>>393
後ろの const が?
396デフォルトの名無しさん:2010/09/02(木) 10:43:53
397デフォルトの名無しさん:2010/09/02(木) 10:48:26
>>396
いやそうじゃなくてな
398デフォルトの名無しさん:2010/09/02(木) 10:49:38
それはconst int を返すような無意味さではと
399デフォルトの名無しさん:2010/09/02(木) 10:54:22
そもそも元質は文字列リテラルに限定した話をしたいのだろうか。
400デフォルトの名無しさん:2010/09/02(木) 11:14:48
だからムーブされるから気にスンナつってんだろ
参照渡しとかどんだけ全時代のコンパイラつかってんだよ
401デフォルトの名無しさん:2010/09/02(木) 12:14:26
>>400
すまん、ムーブされるってなんだい?
用語の説明頼む・・・。

アセンブラではmovは単なる値のコピーなので、
ついついコピーと変換されてしまう。
402デフォルトの名無しさん:2010/09/02(木) 12:17:59
>>401
unique_ptr と勘違いしてるんじゃまいか
403デフォルトの名無しさん:2010/09/02(木) 12:27:51
>>401
説明はめんどうだ
ムーブセマンティクスでぐぐれアホ
404デフォルトの名無しさん:2010/09/02(木) 12:33:53
0xでの話だろ
スレタイ読めますか?
405デフォルトの名無しさん:2010/09/02(木) 12:41:38
>>404
は?スレタイのどこにC++03限定って書いてあるの?
ここはC++全般に関するスレなんで0xも余裕でありだよ
406デフォルトの名無しさん:2010/09/02(木) 12:46:49
ほう、そんな合理的なことができるようになってるのか
これならstaticの呪縛から開放されてstd::string返り値とかもやり放題だな
407デフォルトの名無しさん:2010/09/02(木) 12:51:34
>>386くらいなら0xじゃなくてもコンパイラが最適化してくれそうだけど
408デフォルトの名無しさん:2010/09/02(木) 12:55:01
386すげーな
409デフォルトの名無しさん:2010/09/02(木) 13:09:21
>>386のコードじゃムーブセマンティクスは使えないんじゃ・・・
410デフォルトの名無しさん:2010/09/02(木) 13:13:51
>staticの呪縛から開放されて

ひょっとして
const string & func() { static string s; /*〜*/; return s; }
みたいなことしてそうでこわい
411デフォルトの名無しさん:2010/09/02(木) 13:31:00
>>410
一般的な代入と同じように記述できる、staticを使う方法と同じくらい
容易でよりスマートな方法があれば別だけどまだ俺には見つからないからね
412デフォルトの名無しさん:2010/09/02(木) 14:16:18
>>409
使えるよ。つーか必要なのは string の内部だよ。
既にそう実装されてる処理系もあるよ。VS2010とかね。
413デフォルトの名無しさん:2010/09/02(木) 14:40:33
すみません、初心者質問なのですが、
サーバーでリクエストを待って動かすようなプログラムを
1PCで4〜5個同時稼動させたいと思っているのですが、

1つの実行ファイルに処理を纏めるのと
複数の実行ファイルに分けそれらを同時稼動させるのとでは
どちらの方が開発・動作(安定性)的に良いのでしょうか?

そもそもUNIX・LINUXは複数同時稼動できたり、適しているのでしょうか。
複数に分けた方がマルチコアCPUを活用できるという話はガセでしょうか?
些細な情報、ご指摘、何でも構いませんのでご助言頂けますと幸いです。
414デフォルトの名無しさん:2010/09/02(木) 15:04:13
>>413
* Unix/Linux(それ以外マルチタスクOSでも)複数プロセスは同時に走らせられる

* cpu/コアが複数であれば同時稼働スレッドを増やした方が有効活用できる
(そうでないと1つのコアだけしか実質動かない)

* 単純に分けて走らせる(たとえば同じのパラメタ変えるとか)だけで良いの
ならその方が楽で普通効率も良い(人的にもコンピューターにもマルチスレッ
ドのプログラミングのオーバーヘッドが無い).マルチスレッドプログラミ
ングの経験が無いならなおさら.
415デフォルトの名無しさん:2010/09/02(木) 15:15:58
久々に着たのにまた荒れまくってるなw
相変わらず低レベルな人間が多い。

俺は無駄な書き込みして逃げよ。
416デフォルトの名無しさん:2010/09/02(木) 16:19:49
>>414
日本語が不自由ですか?
417413:2010/09/02(木) 16:52:23
>>414
マルチスレッドプログラミングの経験・・無いですので
単純に分けて走らせる事にします。
そこそこ無駄なオーバーヘッド(?)というのか同じ内容をメモリに溜め込む
形になりますが、他のコアが利用できないなんて事より、格段にマシでしょうから。

解りやすいご回答、ありがとうございます。方向性が定まりました。
418デフォルトの名無しさん:2010/09/02(木) 18:11:57
>>416 何か問題あるなら具体的に指摘してくれ
419デフォルトの名無しさん:2010/09/02(木) 19:06:51
struct Test { };

Test foo()
{
  return Test();
}

void bar()
{
  const Test& t = foo();
  /* t を使った処理 */
}

これって問題ない?
それとも寿命切れ?
420デフォルトの名無しさん:2010/09/02(木) 19:15:04
int main() {
return main();
}
421デフォルトの名無しさん:2010/09/02(木) 19:31:14
>>419
問題ない
422デフォルトの名無しさん:2010/09/02(木) 19:35:57
寿命切れ
423デフォルトの名無しさん:2010/09/02(木) 19:58:25
問題ないがダサい
424デフォルトの名無しさん:2010/09/02(木) 20:46:06
多次元配列(のようなもの)を動的に確保することを考えているのですが、
極力配列変数の書き込み/読み出しに費やす計算時間を小さくしたいです。

今のところ領域を
int** array;
array = new int*[N];
array[0] = new int[M];
for(int i=0;i<N;i++) array[i] = array[0] + i*N;
と確保してそれから必要な時にarray[i][j]とアクセスしていますが、
もしかしてこれより速い方法ってあったりします?やはりこれが最速ですか?
425424:2010/09/02(木) 20:48:01
すみません、
array[0] = new int[M]; // 誤
array[0] = new int[N*M]; // 正
です。
426424:2010/09/02(木) 20:50:31
for(int i=0;i<N;i++) array[i] = array[0] + i*N; // 誤
for(int i=0;i<N;i++) array[i] = array[0] + i*M; // 正

スレ消費して済みませんorz
427デフォルトの名無しさん:2010/09/02(木) 21:03:15
int *array;
array = new int[N*M];
必要な時にarray[i*M+j]とアクセス
428デフォルトの名無しさん:2010/09/02(木) 21:10:35
newだから動的とかそういう問題じゃないと思うんだ
429デフォルトの名無しさん:2010/09/02(木) 21:22:40
ん?
NとMがコンパイル時に決定していないという意味だろ
それを動的というのか遅延評価というのかは知らんが
430デフォルトの名無しさん:2010/09/02(木) 21:23:48
そもそもnewは遅いからmalloc使うべき
431デフォルトの名無しさん:2010/09/02(木) 21:42:28
そこはそこまで高速化をする価値のある部分なのか?
432デフォルトの名無しさん:2010/09/02(木) 21:44:42
>>429
動的でいいんじゃね
433デフォルトの名無しさん:2010/09/02(木) 21:47:23
>>427
意外とそっちが最速かもな
一番コンパイラの最適化の恩恵受けられそう
434デフォルトの名無しさん:2010/09/02(木) 21:48:29
namespace ps3
{
 namespace pad
 {
  class Pad;
 }
 namespace sound
 {
  class Sound;
 }
 namespace draw
 {
  class Draw;
 }
}

名前空間使うときは上と下どっちがいいですか?

namespace ps3
{
 class Pad;
 class Sound;
 class Draw;
}
435デフォルトの名無しさん:2010/09/02(木) 22:05:31
>>423
どう書くとダサくない?
コピーコンストラクタでコピー?
436デフォルトの名無しさん:2010/09/02(木) 22:12:30
419 の情報だけでは何とも言えないが
たとえば引数ってわけにはいかないのか?
437362:2010/09/03(金) 02:03:21
亀スマソ
レスThanksです!

>>363
そうそうこんなの!
手軽でいいっスね!!

>>364,365
DとかQtは違うような…

>>367,368
おっと、そんなものが…
438デフォルトの名無しさん:2010/09/03(金) 02:47:20
boostの中の人は本当に変態さんだな

まあそもそも(ちょっと違うけど)言語をこねくりまわしてる段階の俺には言語を作るというのが意味不明だ
439デフォルトの名無しさん:2010/09/03(金) 04:39:56
>>437
QtにはQtScriptっていうECMAscriptの実装があるんだよ
440デフォルトの名無しさん:2010/09/03(金) 13:49:19
配置newで使われてる領域か使われてない領域か判断する方法って
vectorみたいにこっからここまでっていう目印をつける
オブジェクト1つに対してフラグになるものも余分にひとつどこかに用意する
ほかになんかいい方法ありますか?
441デフォルトの名無しさん:2010/09/03(金) 15:05:15
>>440
死ね
442デフォルトの名無しさん:2010/09/03(金) 15:56:23
>>440
くたばれ屑
埃でも食ってろ
443デフォルトの名無しさん:2010/09/03(金) 15:58:31
>>442
てめーは巣に帰れ
444440:2010/09/03(金) 16:01:28
>>441,442
すいません。息が臭い人には訊いてませんのでお引取りください
445デフォルトの名無しさん:2010/09/03(金) 16:17:18
>>444
すいません。息が臭い人には訊いてませんのでお引取りください
446デフォルトの名無しさん:2010/09/03(金) 16:20:46
たぶん何割か自演
447デフォルトの名無しさん:2010/09/03(金) 22:25:53
ここまで俺の自演
448デフォルトの名無しさん:2010/09/04(土) 02:14:09
>>400
ムーブがあっても >>391 の差は残るだろ。
449デフォルトの名無しさん:2010/09/04(土) 02:16:09
>>430 どこの糞コンパイラでそんなことになってんの?
450デフォルトの名無しさん:2010/09/04(土) 02:54:48
後者は確保済みの領域をそのまま使うっていうのは、stringのインスタンスの話で、リテラルのほうじゃないんですよね?
451デフォルトの名無しさん:2010/09/04(土) 02:55:48
>>449
mallocよりも遅くないnewを搭載したコンパイラがほしいです。
452デフォルトの名無しさん:2010/09/04(土) 03:43:20
>>451
確保にかかる時間を clock() で計ってみた。
http://codepad.org/22ViLVxO

Cygwin g++
g++ (GCC) 4.3.4 20090804 (release) 1
----
malloc: 1408
operator new: 1454
malloc: 1463
operator new: 1204
malloc: 1155
operator new: 1331
----

Visual Studio 2008 Express Edition
----
malloc: 361
operator new: 233
malloc: 313
operator new: 312
malloc: 357
operator new: 420
----

誤差程度の違いしか見られない。
453デフォルトの名無しさん:2010/09/04(土) 04:41:26
>>452
わざわざ測定した意味が分からない。
newがmallocよりも速くなることはないことぐらいすぐに分かるでしょう?
454デフォルトの名無しさん:2010/09/04(土) 05:03:29
誤差程度だろ
いちいち細かい奴だな
将来禿るぞ
455デフォルトの名無しさん:2010/09/04(土) 05:17:02
>>453
どういう理屈?
new が malloc() を呼び出すという実装を決め付けて言ってないか?
しかも関数呼び出しですごいオーバーヘッドが発生すると思ってる?
456デフォルトの名無しさん:2010/09/04(土) 07:21:59
お前の処理系はデフォルトコンストラクタを呼ばない糞か
457デフォルトの名無しさん:2010/09/04(土) 07:48:28
コンストラクタがあるクラスを malloc() で確保して「new より速い(キリッ)」とか言っちゃうわけ?
458デフォルトの名無しさん:2010/09/04(土) 09:22:14
>>457
> newがmallocよりも速くなることはないことぐらいすぐに分かるでしょう?
何を恥ずかしいことを
459デフォルトの名無しさん:2010/09/04(土) 10:49:05
newなんてオーバーロードすりゃいいじゃんね
460デフォルトの名無しさん:2010/09/04(土) 10:53:03
意味合い的にはオーバーライドっぽくもなるな
461デフォルトの名無しさん:2010/09/04(土) 14:31:52
>>440
質問は "メモリプールの使われてる領域と使われてない領域を判別する方法を知りたい" だよね?
ないんじゃないかなー
前者のほう(に基本的には似てるfree listって手法)が広く使われてると思うよ
462デフォルトの名無しさん:2010/09/04(土) 14:36:20
struct B
{
 static void test(){}
};

void (*func)() = B::test;
func();

void (*func)() = &B::test;
func();

これどっちも同じ結果になるんですけどどちらが正しいのですか?
463デフォルトの名無しさん:2010/09/04(土) 14:42:54
>>462
どっちでも正しいから気にするな
464デフォルトの名無しさん:2010/09/04(土) 14:49:42
少なくともvcでは下じゃないとエラー(警告だっけ)がでないっけ
465デフォルトの名無しさん:2010/09/04(土) 14:55:44
VS2008じゃどっちでも平気だな。
466デフォルトの名無しさん:2010/09/04(土) 14:57:05
そもそもどっちもエラーになる理由が無い
467デフォルトの名無しさん:2010/09/04(土) 15:30:00
VS2010でもどっちでも平気だな
468デフォルトの名無しさん:2010/09/04(土) 18:31:56
/Za /Wallでも出ないな
469デフォルトの名無しさん:2010/09/04(土) 18:54:13
ごめんなさい
staticで全然違ったようです
470デフォルトの名無しさん:2010/09/04(土) 21:34:48
>>455
mallocとnewのヒープ確保処理の内容って同じじゃないの?
471デフォルトの名無しさん:2010/09/04(土) 21:39:27
>>470
確保できない場合の動作以外はほとんど同じ要件なので根っこは同じ可能性が高いけど、
同じとは限らない。

同じ要件の処理であれば、十分に最適化されていることを前提として、差が出る理由が無い。
この点で >>430 が何を根拠に「newは遅い」と言ってるのかわからない。
472デフォルトの名無しさん:2010/09/04(土) 21:50:26
そもそも>>424は確保済みの配列へのアクセス速度の話だよね
473デフォルトの名無しさん:2010/09/05(日) 01:09:41
struct Boo
{
Boo() : b( 111 ){}
int b;
};
struct Foo
{
Boo boo;
int f;
};
Foo foo[ 100 ];

fooの全要素のFoo::fが0、Boo::bが111になるような初期化方法はありますか?
Fooにはコンストラクタが追加出来ないとして。
474デフォルトの名無しさん:2010/09/05(日) 01:54:36
Foo foo[ 100 ]={0};
475デフォルトの名無しさん:2010/09/05(日) 05:44:16
>>473 boost::value_initialized<Foo> foo[ 100 ];
476デフォルトの名無しさん:2010/09/06(月) 14:09:40
>>474
> Foo foo[ 100 ]={0};

| こいつ最高にアホ       |   同意
\                   \
  ̄ ̄ ̄ ̄V ̄ ̄ ̄ ̄ ̄       ̄ ̄ ̄ ̄ ̄V ̄ ̄ ̄ ̄ ̄ ̄
           ∩_
          〈〈〈〈 ヽ         /  ̄ ̄ ̄ ̄ \
          〈⊃  }         /、          ヽ
  / ____ヽ|__|        |ヘ |―-、       |
  | | /, −、, -、l !    !        q -´ 二 ヽ      |
  | _| -|  ・|< || |  /         ノ_/ー  |     |
 (6  _ー っ-´、} /           \     |     /
  \ ヽ_  ̄ ̄ノノ/              O=====|
/ __  ヽノ /              /         |
(_|__)   /             /    /      |

477デフォルトの名無しさん:2010/09/06(月) 14:15:20
>>476
0x 知らないのか・・・
478476:2010/09/06(月) 14:36:44
>>477
0xならおkなのか。


| 俺が最高にアホだった     |   同意
\                   \
  ̄ ̄ ̄ ̄V ̄ ̄ ̄ ̄ ̄       ̄ ̄ ̄ ̄ ̄V ̄ ̄ ̄ ̄ ̄ ̄
           ∩_
          〈〈〈〈 ヽ         /  ̄ ̄ ̄ ̄ \
          〈⊃  }         /、          ヽ
  / ____ヽ|__|        |ヘ |―-、       |
  | | /, −、, -、l !    !        q -´ 二 ヽ      |
  | _| -|  ・|< || |  /         ノ_/ー  |     |
 (6  _ー っ-´、} /           \     |     /
  \ ヽ_  ̄ ̄ノノ/              O=====|
/ __  ヽノ /              /         |
(_|__)   /             /    /      |

479デフォルトの名無しさん:2010/09/06(月) 14:57:08
潔し
480デフォルトの名無しさん:2010/09/06(月) 17:46:50
はやく0xに完全に対応したコンパイラでねえかなあ
まあ規格自体が決まってなくてアレだけど
481デフォルトの名無しさん:2010/09/06(月) 17:55:51
いつも思うんだけどコンパイラって物凄くね?
業界が業界なら普通に数万〜数十万円するくらいの技術が詰まってね?
482デフォルトの名無しさん:2010/09/06(月) 18:02:47
実際に10万ぐらい支払っているわけだが。
まぁコンパイラだけでってわけでもないけどね。
483デフォルトの名無しさん:2010/09/06(月) 19:56:18
特定のスレから特定の検索語、日付、ID等で該当するレスを抽出するプログラムを作ろうとおもっています。

スレに対応するdatファイルを引数として受けるクラスを作成し、そのクラスの中で

uint SearchWord()
uint SearchDate()
uint SearchID()

といったメソッドを定義し、おのおののメソッドがスレを1番から1000番まで通しで検索、
その結果条件に該当するレスナンバーを返し、最後に全てのメソッドが返したレスナンバーの
ORを取れば全ての条件を満たすレスナンバーが抽出できるという算段です。

おそらくこれがもっとも直感的な方法かと思いますがC++が持つクラスの機能等を使って
より洗練された拡張性のあるプログラムにすることは可能でしょうか?
プロ級のみなさんでしたらどういうプログラム構造にするか教えて頂けないでしょうか?
484デフォルトの名無しさん:2010/09/06(月) 20:07:25
それひとつしか返せなくね?いいの?
485デフォルトの名無しさん:2010/09/06(月) 20:43:00
map と string を使った小プログラムを作りましたが、意図どおりに動作しません。
map.insert() でpair<string, string> のデータを追加しているのですが、 どうも map に追加されていないようです。
なにが悪いのでしょうか
http://codepad.org/FbsbG9pI

実行例
$./a.exe
Add, List, Quit? : A
name: test
tel: 123
Add, List, Quit ? :L
Add, List, quit ? : <- データを全表示させているつもりだが、全然表示されない。

お知恵をお貸しください。よろしくお願いいたします。
486デフォルトの名無しさん:2010/09/06(月) 21:03:04
>>485
mがdoのスコープの中で作って消してを繰り返している
からではないだろうか
487483:2010/09/06(月) 21:04:51
>>484
ああ、失礼orz

uintを返すのではなくクラスフィールドのuint型の配列に結果を反映させるメソッドと思ってください。
488485:2010/09/06(月) 21:11:42
>>486
map の宣言の位置を変えることで、意図どおりに動くようになりました。
なるほど、おっしゃるとおりでした。
簡単なテストプログラムで行き詰ってしまい、どうにもこうにも仕方がないところでした。
アドバイス感謝いたします。
489デフォルトの名無しさん:2010/09/06(月) 21:15:17
>>487
なんか微妙な設計。
490483:2010/09/06(月) 21:24:41
>>489
> なんか微妙な設計。

ですよね(´・ω・`)

そこでC++に精通されている皆さんはどう設計されるのか知りたかったもので・・・
491デフォルトの名無しさん:2010/09/06(月) 21:51:45
>>490
検索結果を内部にもってるってのがいやな感じ。

三つのメソッドを呼び出して、それぞれの結果を中にもってるって状態を持ちすぎのような。
492デフォルトの名無しさん:2010/09/06(月) 22:00:14
中に持つわけじゃなくて vector<uint> みたいにして返すなら自然じゃないかと俺は思う
重複する検索だけを考えるなら既に見つけたのは無視みたいこともできるけど
拡張性とか自由度考えるとそれでいいような気がする
(たとえば OR でも AND でも検索できるようにするとか)
493デフォルトの名無しさん:2010/09/06(月) 22:01:25
別スレッドで並列処理するならともかく
結果のコンテナは一つでよくね?
ORで全ての条件を満たすというののも不明だし。
494デフォルトの名無しさん:2010/09/06(月) 22:04:04
>>490
普通にコレクションなり、イテッレータなりを返すだけだと思うけど。
なんでこんな気持ち悪い実装にしなければと思ったのか、
そのあたりを明らかにしないと有意義な回答は得られないと思う。
495デフォルトの名無しさん:2010/09/06(月) 22:04:52
フィルターでふるい落とす方が複数条件の場合検索する数が減りそう
496デフォルトの名無しさん:2010/09/06(月) 22:35:35
イテレーター作るときってとりあえずSTLのルールに準拠するもんなんですか?
497デフォルトの名無しさん:2010/09/06(月) 22:44:57
イテレーターとかvector<uint>のほうが軽いけど、
2chのスレ程度なら、書き込みをばらして、それをコレクションとして扱って

Articles result = articles.searchWord(…).searchId(…).searchDate(…);

とかやっても十分動くとは思う。
(C++だとコレクションを返すとかやりにくいのかな?)


498483:2010/09/06(月) 22:59:02
vector<uint> SearchWord()
vector<uint> SearchDate()
vector<uint> SearchID()

のようにvector型の配列を返すメソッドにし、最後にそれらのANDを取るというのがスマートな方法ということでしょうか?
499デフォルトの名無しさん:2010/09/06(月) 23:52:49
こんなのは?

vector<レス> スレ;
list<レス*> 結果;
Set(スレ, &結果);//全部ポインタ埋める

list<レス*>::iterator last=remove_if(結果.begin(),結果.end(),PredWord);
last=remove_if(結果.begin(),last,PredDate);
last=remove_if(結果.begin(),last,PredID);
結果.erase( last,結果.end());

叙述関数を一つにまとめてORにも対応させた方がスマートだろうけど。
500デフォルトの名無しさん:2010/09/07(火) 01:24:02
>>473-478
C++0x だとデフォルトコンストラクタしかないクラスが 0 で初期化できるの?
501デフォルトの名無しさん:2010/09/07(火) 10:07:52
>>500
struct BasicStruct {
int x;
float y;
};

struct AltStruct {
AltStruct(int _x, float _y) : x(_x), y(_y) {}

private:
int x;
float y;
};

BasicStruct var1 = { 5, 3.2f };
AltStruct var2 = { 2, 4.3f };

とかが可能
配列はシラネ
502デフォルトの名無しさん:2010/09/07(火) 13:24:43
定数ってあるじゃないですか?
effective c++によると#defineよりenumやstaticを使えって
書いてあるじゃないですか?
例えば定数の1から10までを名前のある定数にして
11以上を数字そのものが定数の名前にするには
どうやるもんですか?
503デフォルトの名無しさん:2010/09/07(火) 13:42:26
>>502
#define は定数ではない
たとえば #define a b() で case a: はできない

その 11 以上ってのは本当に「定数」か?
他の何かから演繹される数値ではないのか?
504デフォルトの名無しさん:2010/09/07(火) 13:47:46
enum{
X_CARROT,
X_SANDAL,

X_11,
X_12,

ってことか?頑張って手動で入力するしかないんじゃ無いだろうか
505デフォルトの名無しさん:2010/09/07(火) 14:18:05
例;
//1から10の場合
T a =ONE
T b=TWO
11以上の場合
T c=11
T d=12
506デフォルトの名無しさん:2010/09/07(火) 14:19:03
typedef enum _tag_XXX : int {
a,
b,
c = 8,
d,
e,
}XXX;

こんなんじゃだめかいね?
507デフォルトの名無しさん:2010/09/07(火) 14:39:50
というか#defineではできるような口ぶりだが
それってどういうことだ?
508デフォルトの名無しさん:2010/09/07(火) 15:07:30
#defineをつかうなら
#define ONE 1
#define TWO 2
...
#define TEN 10
とやれば
11以上は普通に数字が使えるでしょ。
509デフォルトの名無しさん:2010/09/07(火) 15:11:24
もしかして
static int ONE=1;
static int TWO=2;
ってやればいいですか?
510デフォルトの名無しさん:2010/09/07(火) 15:11:27
enumやstatic constでも一緒
普通に数字が使えるよ
511デフォルトの名無しさん:2010/09/07(火) 15:13:22
あっそうなんですか。
ご迷惑おかけしました。
512デフォルトの名無しさん:2010/09/07(火) 15:26:40
static_assertのイディオムみたいに、コンパイル時プログラミングで独自の警告を出したいんですけど可能でしょうか?
たとえば
template <class X> void func(void);
が実体化したときに
Xが組み込み整数以外ならコンパイルエラー
Xが非負なら警告
みたいな感じでやりたいんですが
513デフォルトの名無しさん:2010/09/07(火) 15:49:12
Express Editionではエクセル読み書きできないのね。ガッカリ、、
さらにMFC付のstandardEdition買おうと思ったら売り切れてるし。
javaみたいに、そういうクラスって何処かに転がってない?

514デフォルトの名無しさん:2010/09/07(火) 18:56:00
>>512
template <class X> class Y { public: enum{ Z = -1 }; };
template <> class Y<int> { public: enum { Z = 1 }; };
template <class X> void fun(void) { typedef char dummy[Y<X>::Z]; };
int main() {
fun<int>(); // OK
fun<float>(); // error
}
こんな感じ?
警告は無理じゃね
515デフォルトの名無しさん:2010/09/07(火) 18:58:13
動的に(インポートライブラリ無しで))DLLの関数を呼び出す必要がありまして、その関数は
  dll_func( A* a );
という感じなんです。

Aというのは、クラスでもPODでも良いのですが、これはhoge.hに定義されています。
メインの方は、dll_funcを呼び出してAを渡すだけです。
DLLを作成するのは不特定多数です。

という状況なのですが、もし仮にhoge.hのAの定義を変える必要があった場合、
不特定多数のDLL製作者全員に、新しいhoge.hで再コンパイルしてもらう必要がありますよね。

こういった事態を防ぐ、何か上手い方法はありますでしょうか。
516デフォルトの名無しさん:2010/09/07(火) 19:05:48
>>515
a) stdio.h の FILE 構造体みたいに、DLL 側で構造体を確保・解放し、中身に触れてはいけないことにする
b) BITMAPINFOHEADER 構造体みたいに最初のメンバに構造体のサイズを入れさせ、受け取り側がどのバージョンのヘッダを使っているのか判断できるようにする
c) 元の dll_func と A はそのまま残して、 dll_funcEx と AEx を新しく定義する
d) A の定義は変えず、メンバの解釈を変えて (BOOL って書いてあるけど実は INT でした!)、強引に必要なデータをねじ込む
517516:2010/09/07(火) 19:13:26
ごめん。 良く読んだらDLL作る方が不特定多数なのか。 じゃあ a の案はナシで。
代わりに
e) 構造体の最後に新しいメンバを追加するだけなら前の部分は変わらないので、新しく増えたメンバは単に無視する
518515:2010/09/07(火) 20:02:54
>>516-517
いやはや、5案も挙げていただき恐縮です。

DLL側が変更無しでいけるという点で、e)案は魅力的ですねぇ。
結局、追加したAのデータには関係ないDLLにまで、再コンパイルを強いるのが辛いわけですから。

Aとして配列データなんかを渡さなければいけそうな…検討してみます。c)案も結果は似てますね。

d)はWinAPIにも良くある、予約してあるけど使用しないメンバみたいな感じですかね。
b)は安全対策という感じでしょうか。

お付き合いいただき、ありがとうございました。
519デフォルトの名無しさん:2010/09/07(火) 22:06:26
templateとtypeidに関連する質問です。

A + B - D →  A - B + D
  ` C - E         ` E
同じ機能を持つが引数の型が異なる2つの関数(左側のB, C)を
1つに(右側のB)まとめたいのです。

http://codepad.org/rc48PS6D
という形では、うまくいくのですが、
下記のように別の関数へ処理を渡すとコンパイルが通りません。
http://codepad.org/IqJI4gVf

実際には、この別の関数(右側のB)をstd::sortとするつもりでいます。
DとEはsortに渡す型毎のプレディケートとするつもりです。

以上よろしくお願い致します。
520デフォルトの名無しさん:2010/09/07(火) 22:15:27
そりゃお前、Tの型はコンパイル時に決まっているからだよ。
お前のやっているのは、以下と同じだ。


void sub1(const vector<int>& a) ;
void sub2(const vector<vector<int> >& a) ;


int main()
{
vector<int> s;
vector<vector<int> > d;

sub1(s) ;
sub1(d) ; // エラー
sub2(s) ; // エラー
sub2(d) ;
}

Tの型はコンパイル時に決まっているから、
vector<int>はvector< vector<int> >に変換できないし、その逆もできない。

お前の問題を解決するには、コンパイル時の条件分岐が必要だ。
C++ Template Metaprogrammingでも読め。
521デフォルトの名無しさん:2010/09/07(火) 23:40:47
>>519
こうしたいのか?

template <class T, typename Predicate>
void foo(T oh, Predicate predicate)
{
predicate(oh);
}

int main(void)
{
vector<int> bar1; bar1.push_back(8);
vector<vector<int> > bar2; bar2.push_back(bar1);

foo(bar1, sub1<int>);
foo(bar2, sub2<int>);

return 0;
}
522519:2010/09/08(水) 00:00:57
レスありがとうございます。そんな感じですね。
>>519のsort云々に合わせるとこうなります。
#残念なことにコンパイルは通りませんが。
sortに合うようにsub*は返り値を、boolにしてあります。

template <class T>
bool sub1(const vector<T>& a, const vector<T>& b)
....

template <class T>
bool sub2(const vector<vector<T> >& a, const vector<vector<T> >& b)
...

template <class T, typename Predicate>
bool foo(T oh, Predicate predicate)
{
return predicate(oh);
}
int main(void)
{
vector<int> bar1; bar1.push_back(8);
vector<vector<int> > bar2; bar2.push_back(bar1);
sort(bar1.begin(), bar1.end(), sub1<int>);
sort(bar2.begin(), bar2.end(), sub2<int>);
return 0;
}
523519:2010/09/08(水) 00:03:42
見返してみたら、せっかく作ってくださった
foo使っていなかったりと結構おかしいことになってますね。
うーむ。
524519:2010/09/08(水) 00:33:05
それと、>>520の「コンパイル時の条件分岐」という言葉をググって
http://codepad.org/HU57E14p
を書いてみましたが、これもコンパイルが通りません。

複数の型に対応した1つの関数を作りたいだけなのですけど、
結構難しいものですね。
525デフォルトの名無しさん:2010/09/08(水) 00:59:52
http://codepad.org/k6sizvoe
http://codepad.org/NjtHOvUp

こういうことじゃないの?
TMPとかちょっと行きすぎでしょ
526デフォルトの名無しさん:2010/09/08(水) 01:19:28
>>524
1度テンプレートの実体化を頭で追いかけて、仮引数の型と実引数の型を見比べてごらん。型が食い違ってるから
527519:2010/09/08(水) 07:00:52
>>525
そういうことですが、
http://codepad.org/NjtHOvUpの方ですが
sとd用の関数をそれぞれ作りたくないので、そこをtypeidでまとめようと思いました。
また、後出しになってしまって申し訳ありませんが、
27,28行目のように一度でどちらも処理することはなく、
一回の処理では片方だけが処理されるのを想定しています。

>>526
http://codepad.org/HU57E14pの40行目で
sub0に返り値が無いのに、subT::retTを返してしまっているのを
修正しました。まだ問題が残っているみたいです。

仕事いってきます。まずはご報告までに。
528デフォルトの名無しさん:2010/09/08(水) 07:07:59
そもそも何でtype_infoを静的な型の比較に使ってるんだよ。
テンプレートでやればいいだろうが。
529デフォルトの名無しさん:2010/09/08(水) 10:29:09
どうしてもこのコードだと動的に取得しなければならないと思い込んでた時代が俺にもありました

少し知識に毛が生えたら(少し工夫がいるものの)全く静的な問題でした
530デフォルトの名無しさん:2010/09/08(水) 11:23:52
>>512
Boost.MPLを勉強すれば簡単じゃね。
531デフォルトの名無しさん:2010/09/08(水) 11:24:39
>>512
ごめん警告は厳しい。
そういう意味の英語の型名を作ってコンパイラに表示させる様にするしかない。
532デフォルトの名無しさん:2010/09/08(水) 12:09:01
>>527
http://codepad.org/WzgvDtWb

こんな感じかな(エラーででてるけど、自分の環境でコンパイルしてくれれば通ると思う)
はっきりいって無駄が多いから素直にオーバーロード解決したほうがいいよ



ところで↑なんでコンパイルエラーになるかわかるひといる?
とくにおかしなことはしてないと思うし、VC++だと何の問題も無くコンパイルできるんだけど
selectが名前衝突してるらしいけどcstdioってグローバルにselect定義してんの?
533デフォルトの名無しさん:2010/09/08(水) 12:11:37
http://codepad.org/zgNamEbO

codepadのバグ…かな?
534デフォルトの名無しさん:2010/09/08(水) 15:06:51
doubleの演算って環境依存ですか?
それとも何か間違ってるのかな。

double a = 0.052;
double b = 1000;
int c = int(a * b); //VC=52 BC=51
a *= b;
int d = a; //両方52
535デフォルトの名無しさん:2010/09/08(水) 15:11:49
0.052が内部では2進数の近似値になってるから
536デフォルトの名無しさん:2010/09/08(水) 15:23:17
ってことは近似値の場合はコンパイラによって扱いが
違うってことですか。
一度doubleに入れれば同じ結果になるのに・・・。
気をつけます。
537デフォルトの名無しさん:2010/09/08(水) 15:59:55
doubleは普通64bitだけど、FPUのレジスタに乗っている間だけ80bitになり、
メモリ上に戻すと元の精度に戻るらしい。
>>534の挙動の違いはレジスタへの上げ下ろしのタイミングの違いじゃないかな。
538デフォルトの名無しさん:2010/09/08(水) 16:05:02
不動小数関係は実装依存だったと思う。
さらに言えば、IntelとAMDで微妙に計算結果が違う事があるとか、
FPU使った時とSSE2使った時とで微妙に違う事があるとか…
(VCではいくつかの関数はコンパイルオブションでFPUとSSE2を切り替えられたはず。他のコンパイラは知らない)
539デフォルトの名無しさん:2010/09/08(水) 16:31:05
不動と浮動では真逆だな
540デフォルトの名無しさん:2010/09/08(水) 16:35:21
>>525
わかってると思うけど一度 double に入れれば良いという問題じゃないからね
int casting を使ってる限りは切り捨て
四捨五入使えば一番近い整数になる
double は10桁精度があるといっても 51.9999999999 とかもありうるわけだから
そういうコーディングしていたら整数に精度は無い
541540:2010/09/08(水) 16:36:24
>>525>>536 アンカ間違った。済まん。
542デフォルトの名無しさん:2010/09/08(水) 17:08:33
int c = int(a * b); //VC=52 BC=51

int e = (int)(a * b);
543デフォルトの名無しさん:2010/09/08(水) 17:39:15
>>540
わかってたつもりでしたが、どうもわかって無いようでした。
確かにdouble に入れれば良いというのでは根本的な
解決にはなっていないとは思ってますが・・。

double a = 0.052;
double b = 1000;
double c = a * b;
int d = int(a * b); //VC=52 BC=51
int e = (int)(a * b); //VC=52 BC=51
int f = static_cast<int>(a * b); //VC=52 BC=51
int g = int(c); //両方52
int h = (int)(c); //両方52
int i = static_cast<int>(c); //両方52
int j = c; //両方52

doubleに精度や切捨ては知ってましたが
int e = (int)(a * b); //VC=52 BC=51
int h = (int)(c); //両方52
これが同じ結果にならないのが不思議で・・・。
これって実は全然違うキャストなんでしょうか?

544デフォルトの名無しさん:2010/09/08(水) 17:47:03
>>537、538
見逃してました。ありがとう。
なるほど・・。予想以上に少数を扱うのは難しいんですね・・。

545デフォルトの名無しさん:2010/09/08(水) 18:06:08
int e = (int)(double)(a * b);
546デフォルトの名無しさん:2010/09/08(水) 18:10:15
_control87(0x0200, 0x0300);
547デフォルトの名無しさん:2010/09/08(水) 18:20:25
>>545
int e = (int)(double)(a * b);
やっぱりBCだと51になるようでした。
>>546
これは・・初めて見ました。
標準ですか?
548デフォルトの名無しさん:2010/09/08(水) 18:28:56
int d = int(a * b); //VC=52 BC=51
int g = int(c); //両方52

これって何が違うんだ?
549デフォルトの名無しさん:2010/09/08(水) 19:03:19
>>548
レジスタ
550デフォルトの名無しさん:2010/09/08(水) 19:27:26
昔cppllに近い話が流れてたよ。
http://ml.tietew.jp/cppll/cppll/article/4275
551デフォルトの名無しさん:2010/09/08(水) 19:32:36
PCは小数苦手なんだよバカだからw
だから整数で扱って、後で10^nで割ってやるのが末吉
552483:2010/09/08(水) 20:02:00
>>483で2chの特定のスレ内を本文やIDや日付で検索をかけるプログラムに関して質問したものです。
あれからやや話を進めまして一レス単位で検索をかけていくにはどうしたらいいかということを思案しています。

基本方針は一レス全体の文字列

 名前<>mail<>登校日<>ID<>本文

ごとをオブジェクトとして保存するクラスを作成し、そのクラスの中に検索用のメソッドを用意しようと思っています。

class Res
{
・・・
bool SearchWord()
bool SeachID()
bool SeachDate()
}

という感じのクラスが真っ先に思いつきましたが、それ以外に
553483:2010/09/08(水) 20:02:44
>>552の続き)

class Res
{
・・・
virtual bool Search()
}
class Word : Res
{
bool Search()
}
class ID : Res
{
bool Search()
}
class Date : Res
{
bool Search()
}
という様に多態性を重視したクラスを設計するのも手かなと言う気がしてきました。
こうするとfor文で1レスから1000レスまでサーチをかける際、本文検索もID検索も日付検索も
同じ Seach() メソッドで行うことができるのですっきりとしたプログラムに仕上がります。
さらに本文、ID、日付以外にたとえばメール欄で検索をかけたくなったときとか容易に
拡張できます。

みなさんでしたらどう実装されますか?
554デフォルトの名無しさん:2010/09/08(水) 20:05:31
>>548
>>537(と暗黙的に>>456)が言ってるように、FPU上では80bit幅で計算されてる
VCしか持ってないから妄想で答えるけどBCCで前者をやると80bit幅のまま、FPUスタック上からfist命令か何かで直接整数に変換してるんじゃないかな
VCは一度(メモリの)スタックに書き出すようにしてるから結果は後者と同じになる

原因がこの場合、
BCCで使えるか知らないけど_control87関数で64bit幅で計算するようにFPUを設定しておけばこの違いはなくなるはずだよ
それかVC BCCともにコンパイラオプションでSSE使うようにするとか?
555デフォルトの名無しさん:2010/09/08(水) 20:18:17
>>552 >>553

それはおかしいだろ。

http://www.atmarkit.co.jp/im/carc/serial/object05/object05.html
↑このページの下のほうに集約の解説があるけど、このたとえなら、
ハンドルクラスやらエンジンクラスを継承して車クラスを作ってるような感じ。

おれならスレッドクラスを作って、それにレスクラスをもたせるよ。
556デフォルトの名無しさん:2010/09/08(水) 20:53:03
>>553
それじゃIDで検索したレスを日付でさらに検索したいとかするときわざわざResオブジェクトを
コピーしなきゃいけなくなるじゃないか
557デフォルトの名無しさん:2010/09/08(水) 21:00:13
レスクラスをコンテナに突っ込んでfind_ifのファンクタいじるかたちで実装しろ
558483:2010/09/08(水) 22:14:14
そうしますと>>552の様にレスクラスを作り、その中で各種検索をかけるメソッドを実装するという
方法が一番いいでしょうか?
559デフォルトの名無しさん:2010/09/08(水) 22:21:55
そういうことに悩むならC使ったら?
560デフォルトの名無しさん:2010/09/08(水) 22:22:38
memcpyだとそのままコピーになってしまいますが、
コピー元の開始位置を指定できる関数ってないでしょうか?
文字列にヌル文字が含まれてるのでsubstrが使えません。
561デフォルトの名無しさん:2010/09/08(水) 22:25:06
memcpy(dest, src + 5, size)みたいにすりゃいいんじゃね?
つーか、std::string使いなよ。
562デフォルトの名無しさん:2010/09/08(水) 22:27:48
>>561
ありがとうございます。それでなんとかなるんですね。
std::stringに代入するとたとえばaaaaa\0\0\0eeee\0のようなchar配列はaaaaaで切れてしまいませんか?
563デフォルトの名無しさん:2010/09/08(水) 22:43:28
切れない
564デフォルトの名無しさん:2010/09/08(水) 22:47:51
>>563
stringでいろいろ試してみますありがとうございます。
565デフォルトの名無しさん:2010/09/08(水) 22:52:45
仮想関数をインライン宣言してはいけないと聞いたのですが何故ですか?
何か悪いこと起こりますか?
566デフォルトの名無しさん:2010/09/08(水) 23:03:59
別に問題無いけど、仮想関数として使うときにはインライン展開はされないよ
567デフォルトの名無しさん:2010/09/09(木) 01:02:00
>>552
なんで Res のクラス内に検索入れるの?わかんない
Res の集合(vector とか)をベースにしたクラスならわかるけど
Res は既に日付持ってるんでしょ?
568デフォルトの名無しさん:2010/09/09(木) 01:18:51
>>501
それができたからって >>474 はコンパイル通らねーだろ。
569デフォルトの名無しさん:2010/09/09(木) 09:40:15
>>568
Foo のメンバ変数は一つなんだよ
コンパイラ通らないっていうけど、C++0x に準拠したもので試してるのか?
570デフォルトの名無しさん:2010/09/09(木) 10:17:38
>>569 メンバ変数は boo, f の二つだよ?
571デフォルトの名無しさん:2010/09/09(木) 11:52:26
>>569 >>473
C++0x なら Foo foo[ 100 ]={} でいいだろ。

>>474 のように 0 を書いちゃうと、 boo を 0 で初期化することになって、
Boo に int を受け取るコンストラクタが無いから、エラーになるだろう。
572デフォルトの名無しさん:2010/09/09(木) 13:47:32
>>571
>Boo に int を受け取るコンストラクタが無いから、エラーになるだろう。
C++0xの話だといってるのに・・・
573デフォルトの名無しさん:2010/09/09(木) 14:08:30
0xスレに移動したほうがいい話題じゃねえか?
574デフォルトの名無しさん:2010/09/09(木) 14:17:28
ちょっと今イテレータの勉強してて、全要素を巡回する基本的なイテレーターに対して
特定の条件を満たす要素を巡回するイテレーターを作りたいと思ってるんだけど
1:まったく別の新しい型としてイテレーター型を実装する
2:型消去を使って隠蔽する
3:アダプタをかませる
とりあえずこんな方法が思いつくけど、どれも一長一短でいまいち
1はコードが重複するしクライアントがイテレーターの型を意識しないといけない
2はクライアントは楽だけどメモリ、実行効率ともに若干劣る
3は1よりコード重複が少ないけれどクライアントが型を意識しなければならない点は同じ
なにかほかにいいアイデアはないですかね?
575デフォルトの名無しさん:2010/09/09(木) 14:51:04
>>572
C++0x勉強中だけど、どのコンパイラなら
Foo foo[ 100 ]={0};
がエラーにならないの?その場合配列はどのように初期化されるの?
手持ちのgcc 4.3.3では-std=gnu++0x指定しても当たり前のように
エラーになるけど。
576デフォルトの名無しさん:2010/09/09(木) 15:21:16
>>574
何がしたいのかか全然わからん

作るべきはコンテナじゃないのか?
577575:2010/09/09(木) 15:37:26
ごめん訂正。
×手持ちのgcc 4.3.3
○手持ちのgcc 4.4.3
578デフォルトの名無しさん:2010/09/09(木) 15:41:11
>>574
やりたいのは boost::filter_iterator みたいなもの?
579デフォルトの名無しさん:2010/09/09(木) 15:44:45
>>575
当たり前だ
その一行だけを書いて通るわけがない
エラーメッセージとか読めないのか
580575:2010/09/09(木) 15:50:46
>>579
その一行だけ書いてコンパイルするほどバカじゃないです。
コードは↓ですよ。

struct Boo
{
Boo() : b( 111 ){}
int b;
};
struct Foo
{
Boo boo;
int f;
};
Foo foo[ 100 ];
581デフォルトの名無しさん:2010/09/09(木) 15:51:20
gcc は 4.5 でも 0x の一部にしかサポートされてないよ
582575:2010/09/09(木) 15:52:32
上の
Foo foo[ 100 ];
↓変更
Foo foo[ 100 ]={0};
でエラーになります。
583575:2010/09/09(木) 15:53:51
>>581
関係するのは0xのどの規格ですか?
584デフォルトの名無しさん:2010/09/09(木) 15:56:58
>>582
全角が混じってるとエラーになるよ
585デフォルトの名無しさん:2010/09/09(木) 16:00:45
>>578
ググって見た感じそれっぽいすね(在るの知らなかった)
やりたいことはフィルターだけじゃないけど参考にしてみます
どうもでした

>>576
たとえば二分木なら幅優先で、深さ優先で巡回するイテレーター
あるいはノードを指定したらその子ノードのみ巡回するイテレーターとか
線形配列でも偶数値のみとか、1つおきにとか、逆順で、とかで巡回するイテレーター
同じコンテナのイテレーターといっても複数のバリエーションが考えられる場合があるわけでして
それらをひとつのインターフェースにまとめてかつ実行効率もそれなりに保ちたい方法は無いものかなと質問したんだけどはしょりすぎたかな…?
586デフォルトの名無しさん:2010/09/09(木) 16:07:22
>>579,584みたいなのとは仕事したくないなあ…
587デフォルトの名無しさん:2010/09/09(木) 16:12:17
>>584
全角ってどこにあるんだ?
588デフォルトの名無しさん:2010/09/09(木) 16:17:44
>>585
それって、現存のコンテナは使えないわけだから、
新しいコンテナを作るってことであって、そのコンテナをどう作るのかって問題だよね。
589デフォルトの名無しさん:2010/09/09(木) 16:19:43
>>585
reverse_iteratorみたいな感じにすれば?
590デフォルトの名無しさん:2010/09/09(木) 16:23:11
>>582
遊ばれてるのがわからないのか?

初心者としての質問なら、エラーメッセージの内容を貼るぐらいしろ。

でなく、0x の仕様に関する質問なら
ttp://hibari.2ch.net/test/read.cgi/tech/1275375522
へ逝け!
591デフォルトの名無しさん:2010/09/09(木) 16:36:43
>>588
そういうイテレーター作ったとしても、他のコンテナでは利用できないんだから、
イテレーターとしての存在価値はないでしょ。
イテレータは違う種類のコンテナに対しても同じように使えるからいいんだよ。

イテレータは今の物を使い、そういう動作をするコンテナを作ればよい話じゃないの?
592デフォルトの名無しさん:2010/09/09(木) 16:38:40
>>586
この時間に2chしてる奴とも仕事したくないw
593デフォルトの名無しさん:2010/09/09(木) 17:13:56
>>591はイテレータというものを根本的に勘違いしている気がする
594デフォルトの名無しさん:2010/09/09(木) 17:16:18
僕はすごくイテレーター
595デフォルトの名無しさん:2010/09/09(木) 17:30:20
>>593
vector であろうが map であろうが同じコードで使えるのが重要
専用のコンテナでしか使えないイテレーターなんかイラネーヨ
596デフォルトの名無しさん:2010/09/09(木) 17:35:00
>>595
やっぱりw
使い回しているのはイテレータではなくアルゴリズムだろ
597デフォルトの名無しさん:2010/09/09(木) 17:46:35
>>591
ひょっとして異なるコンテナのイテレーターも同じひとつのクラスなんだって勘違いしてない?
598デフォルトの名無しさん:2010/09/09(木) 17:46:49
>>596
アルゴリズム以前だよ。
どんなコンテナでも for 文で begin() と end() で回したりできるだろ。
イテレーターとはそういう物だよ。

君が抽象化の意味を理解できていなことはよくわかったぞ。
599デフォルトの名無しさん:2010/09/09(木) 17:50:10
>>597
同じクラスでなく、同じイテレーターとして抽象化されてることに意味がある。
違う種類のコンテナでも同じコードでアクセスできるってこと。

専用コンテナでしか使えないイテレータでは意味が無い。
イテレーターである必要もない。
600デフォルトの名無しさん:2010/09/09(木) 17:50:47
ポインタ互換のインターフェースを持ってるのはともかく
begin()、end()で両端を取るのはイテレーターそのものの性質じゃなくてSTLコンテナのポリシーだろ
601デフォルトの名無しさん:2010/09/09(木) 17:51:45
>>600
そのポリシーこそが抽象化だろ
602デフォルトの名無しさん:2010/09/09(木) 17:53:35
>>599
専用コンテナでしか使えないイテレーターってどれのこと?
そんな話題どこにも出てないと思うんだけど
603デフォルトの名無しさん:2010/09/09(木) 17:55:12
>>602
>>585 で作ろうとしてるイテレーター
604デフォルトの名無しさん:2010/09/09(木) 17:55:44
next()しかないテレータもありえるという話?
605デフォルトの名無しさん:2010/09/09(木) 17:56:13
>>601
そう抽象化だよ。ただしそれはコンテナの抽象化ね
イテレーターの抽象化ではない
今話してるのはイテレーターそのものについてなのよ
606デフォルトの名無しさん:2010/09/09(木) 17:57:31
>>603
違うしwww
607デフォルトの名無しさん:2010/09/09(木) 17:59:05
>>598
>>585が作りたいのもfor文で回したりできるやつだと思うぞ
608デフォルトの名無しさん:2010/09/09(木) 17:59:26
>>585は1つのコンテナに(列挙順の異なる)複数のイテレータを作る、と言ってるんだよな?
もちろん個々のイテレータはSTLのイテレータとしての要件を満たすように作るだろうし、
そうすれば各種アルゴリズムにも使える。
609デフォルトの名無しさん:2010/09/09(木) 17:59:38
>>604
そういうイテレータを作ることは可能だけど、
作ったところでそれをサポートするのは専用コンテナだけなわけで、
つまりイテレーターとしての価値はない。(イテレーターは抽象化されるのが前提)
イテレータである必要もない。
610デフォルトの名無しさん:2010/09/09(木) 18:01:22
イテレータをサポートするコンテナw
611デフォルトの名無しさん:2010/09/09(木) 18:04:45
>>607
>>608
けどそのイテレータを begin() では取得できないでしょ。
そのイテレータを返す専用メソッドが必要であり、
そのメソッドは vector には存在しない。

だからイテレータの種類を変えるのではなく、
同じ begin() で動作が変わるイテレータを返すコンテナを作ればいいと言ってるんだよ。
もちろんアルゴリズムでもそのまま使用できる。やりたいことはできるんだし、それが抽象化でしょ。
612デフォルトの名無しさん:2010/09/09(木) 18:08:09
>>605
イテレータはコンテナを抽象化するための物だよ
幾らイテレーター自身を抽象化しても、元の目的が果たせなければ、全然意味ないよ。
613デフォルトの名無しさん:2010/09/09(木) 18:09:32
>>611
begin()で取得できますよ。残念でしたね
614デフォルトの名無しさん:2010/09/09(木) 18:12:24
>>612
イテレータはコンテナに属している必要は無いよ。
std::istream_iteratorやboost::counting_iterator、boost::filter_iteratorなんかが例。

イテレータは値の列の抽象化ではあってもコンテナの抽象化ではない。
615デフォルトの名無しさん:2010/09/09(木) 18:14:35
>>611
rbegin
rend
についてどう思われますか?
これもイテレーターを返しますがbeginとendでないと認められないのでは?
616デフォルトの名無しさん:2010/09/09(木) 18:15:12
>>613
は?
begin() は従来のイテレーターが返ってくるだろ。
それとは別の動作をするイテレータが必要なんだろ。当然別メソッドになる。

そうではなく begin() で従来のイテレータを返すんなら、
それは新しいイテレータを作るという話でなく、
単に新しいコンテナを作るという話だろ。
617デフォルトの名無しさん:2010/09/09(木) 18:20:14
とりあえずイテレーターとコンテナを切り離して考えようぜ
こいつらセットになることが多いけど本質的には関係ないからね
618デフォルトの名無しさん:2010/09/09(木) 18:20:28
>>615
リバースイテレータ、コンストイテレータの類は異種のコンテナでも共通で使えるから意味がある

専用のコンテナでしかつかえない専用イテレータは本来のイテレータとは趣旨が変わってくる
イテレータである必要もない
619デフォルトの名無しさん:2010/09/09(木) 18:24:12
自前のコンテナにイテレータ2種類作りたいけどどうしたらいい?って話じゃなかったのか

とりあえず専用イテレータって表現やめてもらえますか
おそらく「専用に決まってんだろ」って人と「専用じゃ意味ないだろ」って人が出るんで
620デフォルトの名無しさん:2010/09/09(木) 18:25:41
>>618
専用のコンテナでしか使えない専用イテレーターってのがよくわからないんだけど
プライベートなイテレーターってこと?
ちょっと具体的に擬似コードでいいから示してくれないかな
621デフォルトの名無しさん:2010/09/09(木) 18:26:08
template <Contaner, Iter>
class xyz_iterator {
Contaner *contaner;
Iter iter;
...
};
622デフォルトの名無しさん:2010/09/09(木) 18:30:05
>>620
begin() で帰ってるイテレータとは別の種類のイテレータだから、
例えば nbegin() とかでしょ。

この nbeing() が他のコンテナには存在しないんだから、
それをサポートするコンテナは専用コンテナだってこと。
623デフォルトの名無しさん:2010/09/09(木) 18:33:54
>>622
そうだねnbeginはそのコンテナ専用かもしれないね
でもそのnbeginが返すイテレーターは別にそのコンテナ専用でもなんでもないよね
それで特定のコンテナ専用のイテレーターって何なの?
624デフォルトの名無しさん:2010/09/09(木) 18:34:07
>>619
元の質問は「その複数種類のイテレータを別な型にすべきか否か」だっけ。
動的にやれば同じ型にできるけど、オーバーヘッドがある。
例えばrbegin()とbegin()が同じ型のイテレータを返す、というやつ。
iteratorとreverse_iteratorみたいに探索の種類ごとに別々の型にしようとすると、
コンテナをどの順番で辿るかを型の中に書く必要があるけど、これは避けるべき?
という話だった。
625デフォルトの名無しさん:2010/09/09(木) 18:38:45
つーかbegin信者は組み込み配列はどうすんの?
array.begin()で先頭アドレス取れねーつうかコンパイルエラーだよね
ポインタはイテレーターでないという解釈でいいのかな?
626デフォルトの名無しさん:2010/09/09(木) 18:39:57
>>623
だからそのときにイテレータの種類を変えるのではなく、
begin() だけしか持たないコンテナを2種類用意(切り替えでも可)すればいいじゃん。

それがイテレータの思想でしょう。
627デフォルトの名無しさん:2010/09/09(木) 18:47:20
>>624
幅優先と深さ優先の例だと、最後の位置が変わるから
別な型にするしかないんじゃ無いだろうか
628デフォルトの名無しさん:2010/09/09(木) 18:51:16
>>626
せめてアダプタにしろ
それとイテレータの思想じゃねーよ
begin/endはSTLコンテナの思想だ
629デフォルトの名無しさん:2010/09/09(木) 18:57:00
よく考えたら最後は共通した無効なものをさせばいいのか
>>627は忘れてる下さい
630デフォルトの名無しさん:2010/09/09(木) 19:26:45
専用、専用うるさい人はコンテナから独立している counting iterator について
どういう見解を持っているのか知りたい。
631デフォルトの名無しさん:2010/09/09(木) 19:33:30
>>626 同意
標準は曖昧すぎなのです。
明日会社休んで1日企画書と睨めっこして
標準委員会への具体的な提案を考えたいと思います。
632デフォルトの名無しさん:2010/09/09(木) 20:11:04
同じ二次元のテーブル用に
even_row_iteratorとかodd_column_iteratorとか
diagonal_iteratorとかchecker_black_iteratorとか
empty_cell_iteratorとかtitle_iteratorとか
目的別に作って使い分けたりしないの?
633483:2010/09/09(木) 21:43:01
>>567
> なんで Res のクラス内に検索入れるの?わかんない

オブジェクト指向というのはそういうものかと思いまして(;´Д`)・・・

> Res の集合(vector とか)をベースにしたクラスならわかるけど

検索は一レス単位で行うので検索のメソッドもResクラスに入れるのが常套かと思いまして・・・
634デフォルトの名無しさん:2010/09/09(木) 22:27:38
レス単位で行われるのは検索じゃなくて
条件にあってるかどうかの判定だろ?
635483:2010/09/09(木) 22:32:47
>>634
はい、そういうことになります。
636デフォルトの名無しさん:2010/09/09(木) 23:11:26
くだらない質問かもしれませんが
あるクラスについて、基本的にある型の変数のみをメンバ変数に持ち
メンバ関数にはその型に関連が強い関数や元の型の痒いところに手がとどくような関数を入れる
例)CHWND h = hWnd; if( h.IsWindow() ) return;
 CTCHAR str1="abc",str2="abc"; str1 += str2;
このようなたぐいのクラスには何か名前がついてますか?
637デフォルトの名無しさん:2010/09/09(木) 23:35:37
>>636
プリミティブ型をオブジェクトとして扱うためのラッパークラスみたいなやつのこと?
638デフォルトの名無しさん:2010/09/09(木) 23:47:00
>>637
ラッパークラスぐぐってみましたがまさにこれですね
ラッパークラスというのは耳にしたことはあるのですがこれがそうだったんだ
どうもありがとうございます
639デフォルトの名無しさん:2010/09/09(木) 23:49:18
俺だったらアダプタにするかな
640デフォルトの名無しさん:2010/09/10(金) 00:13:45
>>633
Resは検索される方なんだから、引数のIDや名前、日付と一致するか等々を
返す関数を持たせておけばいいじゃん。
検索する関数はコンテナクラスに入れるのが普通だと思うけどな。
641デフォルトの名無しさん:2010/09/10(金) 11:04:16
個々のResとやらが検索関数持っててもどう実装する気なのかな
他の Res の事なんか知らないはずなのに
ちゃんと考えてるんだろうか…
642デフォルトの名無しさん:2010/09/10(金) 16:31:42
javascriptのようなスクリプト言語をつくってしまい、
その言語で複雑な条件の検索をできるようにする。
643デフォルトの名無しさん:2010/09/10(金) 16:46:59
組み込みDB使ったほうが早いだろw
644483:2010/09/10(金) 21:26:06
>>640
> Resは検索される方なんだから、引数のIDや名前、日付と一致するか等々を
> 返す関数を持たせておけばいいじゃん。

おっしゃるとおりです。そう実装しようと思っています。
こんな感じになりますか。

for(i=0; i<1000; i++)
res[i].SearchWord();

たとえば res[1] とは1レス目を格納したクラスオブジェクトです。
1レス目から1000レスまで検索かけて検索に合致したレス番を収集しようと思っています。

>>641
そうなんですよね・・・
どう実装するかが問題でして。
レスクラスに本文、ID、日付等を検索する専用のメソッドを用意するか、
あるいは本文用のレスクラス、ID用のレスクラス、日付用のレスクラスを用意するべきか、
悩みどころです・・・
645デフォルトの名無しさん:2010/09/10(金) 21:59:27
>>644
>643じゃないけどSQLiteでも使ったら? 好きなだけ検索方法を試せるよw
646デフォルトの名無しさん:2010/09/10(金) 22:09:20
res.match_body()
res.match_date_between()
...
647デフォルトの名無しさん:2010/09/11(土) 01:23:40
ダブルディスパッチ,衝突判定でググって
上位にくるページのサンプルコードをg++(version4.4.3)で
コンパイルしたところ,呼び出した関数がprotectedだって
コンパイラに怒られました.なんで?
648デフォルトの名無しさん:2010/09/11(土) 01:27:53
>>647 きっと呼び出した関数がprotectedだからだ。そうにちがいない。
649デフォルトの名無しさん:2010/09/11(土) 02:45:10
なんで最低でもそのページのURLを書かないんだろう?イミフ
650デフォルトの名無しさん:2010/09/11(土) 03:08:14
protectedだからな
651デフォルトの名無しさん:2010/09/11(土) 03:50:31
protected は中途半端。
方針としては中途半端。
「見えちゃ嫌だけどちょっとは見えたほうが」
そんなの微妙すぎ。
652647:2010/09/11(土) 07:30:06
>>648,650
エラー通りだと思うんですけど,サンプルじゃprotectedになってんです
>>649
勝手にURI載っけていいの?
申し訳程度に改変して載っけると下のコードです.
適当な予想だとvc++では動くとか,動作は未確認でサンプル載っけたとか
class Hoge {
public:
virtual void Dispatch( Hoge* other ) = 0;
protected:
virtual void Action( Hoge_A* other ) = 0;
virtual void Action( Hoge_B* other ) = 0;
};
class Hoge_A : public Hoge {
public:
virtual void Dispatch( Hoge* other ) {
other->Action( this );
}
protected:
virtual void Action( Hoge_A* other ) { Greet( other );}
virtual void Action( Hoge_B* other ) { Eating( other );}
}
class Hoge_B : Hoge {
public:
virtual void Dispatch( Hoge* other ) {
other->Action( this );
}
protected:
virtual void Action( Hoge_A* other ) { Dance( other );}
virtual void Action( Hoge_B* other ) { Greet( other );}
}
653デフォルトの名無しさん:2010/09/11(土) 08:32:22
>>652
URLも書いちゃいけないようなところを参考にするなよ、馬鹿。
654デフォルトの名無しさん:2010/09/11(土) 09:48:40
>>652
VC++ でも protected の挙動が違うようなことは聞いたことがないなぁ。
たぶん確認せずに載せてるんだろう。

まぁ >>651 ってことで、これにびっくりするようなら protected なんて使わなけりゃいいよ。
655デフォルトの名無しさん:2010/09/11(土) 10:19:57
> class Hoge_A : public Hoge {
> class Hoge_B : Hoge {

糞の役にも立たない自説を披露する前にこの辺を指摘してやれよ
656デフォルトの名無しさん:2010/09/11(土) 10:26:48
>>655
最初の other->Action( this ) までで問題は明らかなんで、その先は読んでなかった。
あらためて読み直してそこや他もいくつかおかしい気がしたけど、やっぱりどうでもいい。
657デフォルトの名無しさん:2010/09/11(土) 11:03:08
>>651,655
指摘された箇所と親クラスのprotectedをpublicにしたら,
それらしく動きました.ありがとうございました.
658デフォルトの名無しさん:2010/09/11(土) 11:52:30
>>652
URL掲載を禁止できるような権利はサイト作成者に発生しないよ。
http://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%B3%E3%82%AF%E3%83%95%E3%83%AA%E3%83%BC
659デフォルトの名無しさん:2010/09/11(土) 13:14:10
>しかし、インターネット掲示板を中心に、荒らし誘導目的の「晒し」や
>誹謗中傷が少なからずウェブで行われているなど、
>「インターネットの知を豊かにする」というウェブの理念自体が
>一部で形骸化している現実がある。そのような背景から、
>いわゆる「悪意のあるリンク」はモラル面から批判されることがある。
660デフォルトの名無しさん:2010/09/11(土) 14:16:48
直リン禁止論とはまた懐かしいネタが出てきたなw
661デフォルトの名無しさん:2010/09/11(土) 15:51:48
アルゴリズムの実行速度を測るにはどうやってやりますか?
662デフォルトの名無しさん:2010/09/11(土) 15:58:01
>>661
アルゴリズムだけ入れ替えて実測する
プロファイラ走らす
663デフォルトの名無しさん:2010/09/11(土) 16:05:55
>>661
アルゴリズムに癖があるなら、その癖を突くデータを用意したりする。いいほうと悪いほうと汎用なほうと。
664デフォルトの名無しさん:2010/09/11(土) 16:07:20
そういうことじゃなくて
測るためのコードを教えてください。
665デフォルトの名無しさん:2010/09/11(土) 16:25:19
絶対にいやです
666デフォルトの名無しさん:2010/09/11(土) 16:26:39
>>664
C++では測定する関数が無いから出来ないと思った。
Javaならできる確か・・・
667デフォルトの名無しさん:2010/09/11(土) 16:28:38
>>664
クラスにしても20行くらいだぜ?簡単だろ?
668デフォルトの名無しさん:2010/09/11(土) 16:43:22
偉そうな小出し質問は嫌なもんだな

C++でも関数あるでしょ - プラットフォーム依存性はあるが
669デフォルトの名無しさん:2010/09/11(土) 16:47:51
>>664
確かC++でも出来ると思ったけど思い出せない。
あまり本とかに出てこないから詳しい人なら分かるかも。
670デフォルトの名無しさん:2010/09/11(土) 16:51:00
機種依存以外だとclock()しかなくね?
671デフォルトの名無しさん:2010/09/11(土) 16:51:44
測るためのコードってアルゴリズムの前後で時間とるだけじゃん
672デフォルトの名無しさん:2010/09/11(土) 16:52:44
clock()以外にもあるだろ・・・・・
思い出せないが。
673デフォルトの名無しさん:2010/09/11(土) 17:08:09
データストラクチャーの大きさを測るにはどうしますか?
674670:2010/09/11(土) 17:08:21
すげーすげーかっこいいー!
675デフォルトの名無しさん:2010/09/11(土) 17:32:32
boost に時間測るためのライブラリある
676デフォルトの名無しさん:2010/09/11(土) 17:46:01
windowsだとQueryPerformanceCounterを使うのが多かった気がする
677デフォルトの名無しさん:2010/09/11(土) 18:01:23
嘘を嘘と見抜けない人には2chは向いていないと思う
678デフォルトの名無しさん:2010/09/11(土) 18:38:40
clock()もOS依存じゃないっけ? 
あれ。。。開発環境依存だっけな??
679デフォルトの名無しさん:2010/09/11(土) 18:51:36
0xになれば標準で時間関係も使えるね
680デフォルトの名無しさん:2010/09/11(土) 18:54:21
裏を返せば時計必須
681デフォルトの名無しさん:2010/09/11(土) 19:08:15
>>678
標準関数だろ。
682デフォルトの名無しさん:2010/09/11(土) 19:10:44
なんか上の方で>>253みたいな
カッコイイ決めぜりふを残したガイキチがいたけど、
まるで同一人物の様だ。
683デフォルトの名無しさん:2010/09/11(土) 19:34:39
皆さん秒が分かる時計持ってないんですね!
684デフォルトの名無しさん:2010/09/11(土) 19:49:32
スローライフって素敵だと思わない?
685デフォルトの名無しさん:2010/09/11(土) 19:59:42
>>668
それは俺も気になります
今は物理的(?)にfor内部に評価前関数自体が展開されるような自前マクロ作って使ってるんですが
なんだかウサン臭く思うので正式なのがあればそれを使いたい
686デフォルトの名無しさん:2010/09/11(土) 20:21:08
面倒だからprofなりgprof、XCodeならSharkとか使えばいいじゃん。
687デフォルトの名無しさん:2010/09/11(土) 21:53:42
教科書を書くだけの頭でっかちじゃない
現場のプロクラマーが主張するぜ

コンストラクタとデストラクタ以外を protected にせずに
インターフェース以外は private にすると再利用性の高いクラスが出来上がるんだぜ
protected なメンバーをもつクラスを書くやつは間抜けに見えるんだぜ
688デフォルトの名無しさん:2010/09/11(土) 22:00:43
>>687
privateだと派生先では使えなくなるわけだが、再利用性が高いってどういうことだろう。
派生先で元のprivateの機能を使いたくなった場合はどうすりゃいいんだ?
689デフォルトの名無しさん:2010/09/11(土) 22:03:51
privateの機能を使おうとすんなよ
690デフォルトの名無しさん:2010/09/11(土) 22:09:28
>>688
それがほんとうに必要なら派生元が派生先を使う、教える
必要で可能なら派生元を変える

class A {
void f() { g(); }
virtual void g() = 0;


int x;

void h() { h(x); }
virtual void i(int&) = 0;
};
691デフォルトの名無しさん:2010/09/11(土) 22:09:30
>>689
いや、protectedは使わずpublic意外は全部privateにしろって話だろ。
要するにprivateな部分は派生先で全部実装し直せってことか。
ちょっと機能を変えたいって場合は、派生なんかしないで元を直せって話なのかな。
692デフォルトの名無しさん:2010/09/11(土) 22:18:48
>>690
class Aが抽象クラスになっちゃってインスタンス化できないんだけど、それはいいのか。
利点がよくわかんね、俺protectedでいーや。
693デフォルトの名無しさん:2010/09/11(土) 22:19:25
コンストラクタ以外は全部virtual
public以外は全部protected
privateは禁止
だろ常考
694デフォルトの名無しさん:2010/09/11(土) 22:30:08
まあ頭がおかしいんならそれでいいのかもね
695デフォルトの名無しさん:2010/09/11(土) 22:37:21
友達の事忘れてない?
696デフォルトの名無しさん:2010/09/11(土) 23:26:29
->*がオーバーロードできるのに.*がだめなのはなんか深い理由があるの?
697デフォルトの名無しさん:2010/09/11(土) 23:29:00
そもそも.*でオーバーロードが必要になる状況がありえないだろう。
698デフォルトの名無しさん:2010/09/11(土) 23:29:59
>>697ごめん間違えたは、何言ってんだオレは。
つーか、.*でもオーバーロードはできんだろ。
699687:2010/09/11(土) 23:30:01
protected なメンバーが必要な場合とは
派生先が派生元の機能を使うとき

派生元を派生先から使われる機能の集合として考えるのではなく
派生元は派生先で特殊化される、振る舞いの雛形として機能させる

ここで最後に、「設計する」ではなく「機能させる」としたのが実務派のこだわり
可能ならば「機能する」ように設計を変えてしまうのも可ってこと

キャラをすっかり忘れてたので適宜「だぜ」を付けて読んでね
700デフォルトの名無しさん:2010/09/12(日) 02:08:45
>>688
派生元が持っているべき機能であれば、その機能をメンバ関数として提供する。
この場合、派生先だけに利用を制限する意味はほぼ無いので、 public でいい。

protected は「派生先だけに理由を制限する」わけだが、でっちあげでも何でも
派生クラスさえ作ってしまえば呼び出せてしまうので、カプセル化には寄与しない。


そもそも「派生元のprivateの機能」という考え自体も少しおかしい。
private であればそれは機能ではない。
701デフォルトの名無しさん:2010/09/12(日) 02:23:36
オブジェクト指向とコンポーネント指向をごっちゃにした極論にしか見えない。
702デフォルトの名無しさん:2010/09/12(日) 02:31:36
protected なんて使う奴は実装継承を平気でするような奴なので危ない。
703デフォルトの名無しさん:2010/09/12(日) 02:47:51
CRTPやそのたもろもろ継承前提のクラスなんていくらでもあるだろ
704687:2010/09/12(日) 03:02:48
派生先が派生元の機能を使用しなければ
そのクラスツリーはいつでも必要なときに簡単に分割できる

以下で、Aの派生クラスがAのprotectedなメンバーを参照していない場合は
f と x は派生先への影響をあまり考えることなく、カプセル化を妥協することなく、BとCに分割できる

class A {
int a, b;
public:
void f() { g(a); }
void x() { y(b); }

private:
virtual void g(int&) = 0;
virtual void y(int&) = 0;
};

class B {
int a;
public: void f() { g(a); }
private: virtual void g(int&) = 0;
};

class C {
int b;
public: void x() { y(b); }
private: virtual void y(int&) = 0;
};
705デフォルトの名無しさん:2010/09/12(日) 03:12:27
>>700の話で、なるほどと思ったんだけど、>>704の話は意味不明だな。
クラスツリーを分割するってどんな状況だよ、根本的に設計ミスだろそれ。
そこまでするなら派生なんか不要で、抽象クラスだけ使えってことになるだろう。
706687:2010/09/12(日) 03:51:07
>>705
まぁ>>704がすべてじゃなくて、そんなことも簡単にできるほど再利用性が高いってことね
それに設計ミスなんてよくあることでしょ
最初は分割不可能な機能群だと思っていたものが
良く考えてみると全く直行してることに気づくなんて、しょっちゅうあるんじゃない?

完璧になんてできないから、多くの場合に上手くいき、良い設計を導き勝ちなノウハウが重宝するんだ
707デフォルトの名無しさん:2010/09/12(日) 06:54:51
>>696
お禿さんの本に書いてあったよ。どんな理由かは忘れたけど。
708デフォルトの名無しさん:2010/09/12(日) 15:20:02
マイナス使わないから符号無し整数にすると計算が遅くなるとかないですか?
709デフォルトの名無しさん:2010/09/12(日) 15:24:05
>>708
ないです。
710デフォルトの名無しさん:2010/09/12(日) 15:24:14
ないです
711デフォルトの名無しさん:2010/09/12(日) 17:49:40
protectedは使わない派は要するに拡張はデコレーターパターンで行うべしって事でいいのかな?
基本てきに賛成だけど。
712デフォルトの名無しさん:2010/09/12(日) 17:54:15
protectedなんか使っても、派生クラスが基本クラスの挙動をhackできるようになるだけで
特に良い事なんて無いからなぁ。
713デフォルトの名無しさん:2010/09/12(日) 18:01:02
継承前提で作られたクラスではprotectedはけっこう便利でしょ
テンプレートライブラリ書く時には普通に使うし
714デフォルトの名無しさん:2010/09/12(日) 18:13:51
便利だけどスジが悪い人はすぐにクラスが爆発したり、
基底の挙動が把握せずに拡張するからバグの元ってことじゃない?

やっつけ仕事には便利だけど、基本デコレーターでいきたいなぁ。
715デフォルトの名無しさん:2010/09/12(日) 18:18:09
デコレーターって言葉使いたいだけちゃうんか
デコレーターは実行時の動的拡張のためのパターンだ
静的拡張ならただの継承でいいんだよ
716デフォルトの名無しさん:2010/09/12(日) 18:18:55
まあポリモしたいときはprotected使うよね
717デフォルトの名無しさん:2010/09/12(日) 18:25:59
protectedを使わないで静的な拡張を継承で行うサンプルをよろしく。
718デフォルトの名無しさん:2010/09/12(日) 18:30:18
protected変数禁止ってんならある程度賛成なんだがな
719デフォルトの名無しさん:2010/09/12(日) 18:30:42
class Hoge
{
void func();
};

class HogeEx : public Hoge
{
void func_ex();
};

拡張しましたよ
720デフォルトの名無しさん:2010/09/12(日) 18:31:59
むしろprotected使わないと拡張できないと思ってる>>717がこわい
721デフォルトの名無しさん:2010/09/12(日) 18:40:12
あーすまん、インターフェースに則った拡張でたのむ。
オーバーロードや新しいメソッドを継承先が作ったら抽象的にあつかえないでしょ。
722デフォルトの名無しさん:2010/09/12(日) 18:44:29
void func() {
Hoge::func();
}
723デフォルトの名無しさん:2010/09/12(日) 19:03:08
class Hoge
{
virtual void func();
};
class HogeEx : public Hoge
{
void func_ex();
void func() { func_ex(); }
};

つーか抽象的に扱えなくても拡張は拡張だろ
>>721の言ってることは意味不明
724デフォルトの名無しさん:2010/09/12(日) 19:08:59
class Hoge
{
private:
virtual void func();
};
class HogeEx : public Hoge
{
void func_ex();
void func() { func_ex(); }
};
725デフォルトの名無しさん:2010/09/12(日) 19:13:12
どうでもいいけどデコレーターパターンって破滅への予兆にしか見えない
726デフォルトの名無しさん:2010/09/12(日) 19:21:10
>>723-724
機能階層と実装階層が分離できてなくてクラスの数が爆発したり、
継承した分オーバーライドしたメソッドの挙動がつかみにくくなるとおもうんだけど。
727デフォルトの名無しさん:2010/09/12(日) 19:24:42
デコレーターはライブラリをhackしたい時ぐらいしか使わないような・・・
728デフォルトの名無しさん:2010/09/12(日) 19:24:55
>>726
つ MFC
729デフォルトの名無しさん:2010/09/12(日) 19:44:35
>>726
ではprotectedを使ったスマートな正解をどうぞ
730デフォルトの名無しさん:2010/09/12(日) 19:46:31
NVI
731デフォルトの名無しさん:2010/09/12(日) 19:56:52
>>726
べつに継承しなくても拡張すればクラスなり関数が増えるでしょ
それとvirtualにするってことはシンタックス的には派生クラスに何されても仕方ないって基底クラスが認めてるに等しいの
だから派生クラスの挙動を把握なんていちいちしてたら死んじゃうから何されてもいいように設計する
ま、完璧なコードなんて無いからしかたなくセマンティックス的に派生クラスを縛ってそこからもれなければ大丈夫なように基底を書くわけだけどね
732デフォルトの名無しさん:2010/09/12(日) 20:02:08
>>695
友達なんていねーんだよ。さっしてやれ。
733デフォルトの名無しさん:2010/09/12(日) 20:53:55
friend は protected 以上に厄介だと思う
734デフォルトの名無しさん:2010/09/12(日) 21:15:38
クラスの特性を生かしたクラスを上手に作れないorz
メンバが意味不明になっちゃうんだもん
735デフォルトの名無しさん:2010/09/12(日) 21:19:04
>>734
雪駄とかゲッ他で20個とかになるなら、機能分離したほうがいいと思う。
自分流だが、機能別に細かいクラスを作って、統括するクラスで細かいの全部使うっていうのは結構やるな。
736デフォルトの名無しさん:2010/09/12(日) 21:22:39
直交性を意識してメンバ関数(とその実装コード)を削るんだよ
そんで必要なら後でひとつにまとめたラッパークラスを作る
737デフォルトの名無しさん:2010/09/12(日) 21:25:50
雪駄とか下駄とかはデフォルトで省略可能になってれば良いんだよな
それに総ての規定クラスの共通の祖先がないのがC++の最大の欠点
738デフォルトの名無しさん:2010/09/12(日) 21:28:21
なんで欠点?
739734:2010/09/12(日) 21:28:29
どれをクラス化するかが難しいよね...
740デフォルトの名無しさん:2010/09/12(日) 21:28:58
overrideキーワードが欲しい
741デフォルトの名無しさん:2010/09/12(日) 21:39:57
>>740
0xでは属性ではキーワードじゃないがアトリビュートで追加される予定
742デフォルトの名無しさん:2010/09/12(日) 21:41:07
> 0xでは属性ではキーワードじゃないがアトリビュートで追加される予定
0xではキーワードじゃないがアトリビュートで追加される予定
743デフォルトの名無しさん:2010/09/12(日) 21:42:44
getter/setter が欲しいなんていうやつはクラスインターフェースを実装から逆に考えてるから危ない。
744デフォルトの名無しさん:2010/09/12(日) 21:46:00
C++はどこまで大きくなるのかな〜
745デフォルトの名無しさん:2010/09/12(日) 21:49:02
>>743
でも、C#のset、getみたいなのがあるとちょっと便利だよね〜って話でしょ。
templateで似たようなことは出来るけど、、、
746デフォルトの名無しさん:2010/09/12(日) 21:53:18
できても要らんオーバーヘッドがなぁ
747デフォルトの名無しさん:2010/09/12(日) 22:53:14
getとかsetが増えるのは設計が間違ってる兆候でしかないよ
748デフォルトの名無しさん:2010/09/12(日) 23:13:00
>>747
get、setはどこから参照されているかわからないと困るから窓口設けておきましょってことだろ。
749デフォルトの名無しさん:2010/09/12(日) 23:14:21
>>748
ゲッターセッターでラップしてもおんなじなんじゃないの。
750デフォルトの名無しさん:2010/09/12(日) 23:15:53
>>748
パブリックフィールド晒すよりはマシっていうだけ。
多少はget/setも必要になるが、大半のメソッドがget/setってのはどっか間違ってる
751デフォルトの名無しさん:2010/09/12(日) 23:18:39
誰もgetset増やすなんて言ってないけど
752デフォルトの名無しさん:2010/09/12(日) 23:22:36
増やさないならgetter/setterなんて別にいらない
どうしても必要な特定の部分に自分で書けば済む
753デフォルトの名無しさん:2010/09/12(日) 23:37:08
1つのフィールドに対してゲッターとセッターの両方がある場合はたいてい設計ミス
754デフォルトの名無しさん:2010/09/12(日) 23:39:17
極論過ぎてアホ臭い
755デフォルトの名無しさん:2010/09/12(日) 23:42:39
最近の設計本なら普通に書いてある程度の事だよ
756デフォルトの名無しさん:2010/09/13(月) 00:01:38
設計の天才は年寄りに偏る傾向にあるなんて話もあるが
ここ何年かでようやくC++の効果的な設計の仕方みたいなのが
熟達者たちによってまとめられてるんじゃないかなあ。
757デフォルトの名無しさん:2010/09/13(月) 00:04:18
理由:設計本に書いてあるから
758デフォルトの名無しさん:2010/09/13(月) 00:08:12
別に下駄と雪駄かきまくって安心するのは勝手だけど
そのうち新人に笑われるようになるから、勉強したほうがいいよ
759デフォルトの名無しさん:2010/09/13(月) 00:09:47
>>757
ゲッターとセッターが両方あるなら直接フィールドを公開するのと対してかわらん
・参照元(関数を呼び出しているところ)の確認
・フィールドのアドレスを隠す
ぐらいの効果しかないだろ
760デフォルトの名無しさん:2010/09/13(月) 00:10:48
誰もgetset増やすなんて言ってないけど
761デフォルトの名無しさん:2010/09/13(月) 00:13:46
>>759
関数かませれば後で実装を差し替えることができるでしょ
たとえば参照回数をカウントする機能とかもはじめから関数なら後で追加するのも簡単
762デフォルトの名無しさん:2010/09/13(月) 00:14:01
だいたい、あれだけpublic変数はダメと言われるのに
ゲッターとセッターかましただけでもう安心なんておかしな話だと思わない?
763デフォルトの名無しさん:2010/09/13(月) 00:15:08
座標を管理するクラスとかセッターとゲッター両方作る
764デフォルトの名無しさん:2010/09/13(月) 00:15:24
その理論でいくと、STLのコンテナはおかしいわけだな。
765デフォルトの名無しさん:2010/09/13(月) 00:20:04
STLのコンテナは格納したオブジェクトを勝手に変更したりするのか?しないだろ
766デフォルトの名無しさん:2010/09/13(月) 00:20:40
コピーコンストラクタの実装によっては
767デフォルトの名無しさん:2010/09/13(月) 00:21:45
あっそう
768デフォルトの名無しさん:2010/09/13(月) 00:22:08
>>764
だから「たいてい」って言ったんだよ
コレクションみたいな場合は別だよ
769デフォルトの名無しさん:2010/09/13(月) 00:24:05
どのレイヤーを想定してるのか知らんがデータクラスぐらい許容できんのか
770デフォルトの名無しさん:2010/09/13(月) 00:24:36
ほんとにデータだけならstructにするべき
なにか操作をもつべきでない
771デフォルトの名無しさん:2010/09/13(月) 00:24:51
>>769
だめです!設計本に書いてありますから!
772デフォルトの名無しさん:2010/09/13(月) 00:30:55
プログラマはほんまよく釣れるでぇ
773デフォルトの名無しさん:2010/09/13(月) 00:33:18
1つのデータを複数で操作しないといけないような設計はできるだけさけたい
だからpublic変数はやめろと良く言われているわけ。
そこにgetとset追加したら(もちろん後で変更しやすくなったり、バグが追いやすくなったりはするが)
設計としては根本的に何も解決してないことになる。
774デフォルトの名無しさん:2010/09/13(月) 00:36:41
>>773
なんで何回も同じこと言ってんの?
775デフォルトの名無しさん:2010/09/13(月) 00:38:04
わかってないようだったから
776デフォルトの名無しさん:2010/09/13(月) 00:43:13
それならば念のために書いておくが
struct { int x };
こんなのにget/setが必要かなんていう話はどうでもいい。
777デフォルトの名無しさん:2010/09/13(月) 00:48:45
要は

ちゃんとカプセル化して使う人が困らない様にする(上手な設計能力が必要)か、
いっそ変数まで全部publicにして使う人は内部動作も理解してね!って言うか。

どっちかがベスト
778デフォルトの名無しさん:2010/09/13(月) 01:24:51
rubyは?
779デフォルトの名無しさん:2010/09/13(月) 02:39:44
privateとかprotectedとかは甘え
780デフォルトの名無しさん:2010/09/13(月) 02:50:59
全部Public
781デフォルトの名無しさん:2010/09/13(月) 03:51:54
structでも使ってろ
782デフォルトの名無しさん:2010/09/13(月) 05:22:18
CとC++のキャストのうち、
中身の値が絶対に変更されることのないキャストって
reinterpret_castだけという認識でいいでしょうか?
783デフォルトの名無しさん:2010/09/13(月) 05:34:47
const_cast
784デフォルトの名無しさん:2010/09/13(月) 06:38:19
structはそれ自体インタフェースだからget/setはいらない
それはクラスにget/setがいらないって言うのとは全然別の話
やっぱりわかっていない
785デフォルトの名無しさん:2010/09/13(月) 06:48:26
そんな話じゃなくて
全部publicにするなら、デフォルトがpublicなclass であるstructでいいだろ
っていう単純な話だろう
786デフォルトの名無しさん:2010/09/13(月) 06:55:38
結果的には一緒だが、structをデフォルトpublicなclassとして認識するのはどうかと思うぞ
structはデータの所有者がclassと違って自分以外にどっか別にいるからgetsetがいらんてだけで
787デフォルトの名無しさん:2010/09/13(月) 07:37:09
>>761
設定しようとした値以外の、内部状態が変わるようなのは、
雪駄下駄とは言わない。雪駄下駄が必要になるのは、二つ
以上の変数や構造体をアトミックに変更する必要がある場合や、
変数の値が変更された事を通知する必要がある場合に限る。

そんなの普通は設計段階で分かるだろって事だ。
788デフォルトの名無しさん:2010/09/13(月) 07:57:26
getter関数の頭にgetってつける?
googleさんはgetは付けないらしい
setterにsetはつけるが
789デフォルトの名無しさん:2010/09/13(月) 09:17:38
>>787
>設定しようとした値以外の、内部状態が変わるようなのは、
こっちが駄目で、

>二つ以上の変数や構造体をアトミックに変更する
こっちはOKだって。

こいつセンスないわ。
790デフォルトの名無しさん:2010/09/13(月) 10:30:25
>>786
>結果的には一緒だが、structをデフォルトpublicなclassとして認識するのはどうかと思うぞ

認識もなにも,C++ってそういう言語じゃないの
791デフォルトの名無しさん:2010/09/13(月) 10:44:04
>>786
>結果的には一緒だが、structをデフォルトpublicなclassとして認識するのはどうかと思うぞ
逆にお前がやばいぞ
792デフォルトの名無しさん:2010/09/13(月) 10:44:20
>>786
なんで>>786はこんなに頭がカチンコチンなんだぜ?
793デフォルトの名無しさん:2010/09/13(月) 10:46:46
set、getはフィールドに必ずつけるけど、
ほとんどの場合はgetだけpublicかな。

setは特別な状態を設定するとき意外はpublicにならないとおもう。
794デフォルトの名無しさん:2010/09/13(月) 10:51:16
>>793
もうね、初級者が口挟まなくていいから。
795デフォルトの名無しさん:2010/09/13(月) 10:52:37
>>793
そういう場合もあるだろうけど、それはむしろ特殊なケースでしょ
796デフォルトの名無しさん:2010/09/13(月) 11:04:06
>>794
上級者はフィールドに直接アクセスしちゃうんですね!
カッコイイデスwww
797デフォルトの名無しさん:2010/09/13(月) 11:15:05
>>796
思ったとおりだ、全然技術論が交わせるような相手でなく、ただのど素人だわ。

まぁ age てる時点でそういう感じがしたけどな。
798デフォルトの名無しさん:2010/09/13(月) 11:37:47
>>796
なんでそうなるw
799デフォルトの名無しさん:2010/09/13(月) 11:52:28
>>797上級者ぶるのはいいからお前ならどうやってのよ。
800デフォルトの名無しさん:2010/09/13(月) 12:15:58
>>782 そんな保証は無い。
801デフォルトの名無しさん:2010/09/13(月) 12:32:45
横からだが

>>793
> set、getはフィールドに必ずつけるけど、

なんで必ず付けるのか?
必要なものだけに付ければ良いし、多くの場合はクラス内部の
データを加工したものが必要なだけ

データを投げ込む時も内部でどう保持しているかまで知る必要は無い

802デフォルトの名無しさん:2010/09/13(月) 12:45:08
読んで居て思うのですが?
Sourceを出させた方が速い様な気がします…
803デフォルトの名無しさん:2010/09/13(月) 12:46:44
>>802 何のソース?誤爆か?
804デフォルトの名無しさん:2010/09/13(月) 13:03:43
つーか、なんで疑問形?
805デフォルトの名無しさん:2010/09/13(月) 13:10:49
>>801
アクセッサを作るのはデバッグを楽にするためだよ。
そこにブレークしかければどこで使われているかわかる。

検索より確実。
806デフォルトの名無しさん:2010/09/13(月) 13:15:23
>>805
あぁ public で変数晒してるのに比べればマシだね。
でも、みんなそんなところの比較をしてるんじゃないんだ。
わかってもらえないだろうか?
807デフォルトの名無しさん:2010/09/13(月) 13:17:09
>>806
アクセッサを作ると何がまずいの?
説明よろしく。
808デフォルトの名無しさん:2010/09/13(月) 13:17:14
横からですまん。
アクセッサでラップしておくことの利点は理解してるつもりなんだけど、
Pointクラスを持つWindowクラスが、ウインドウの移動(Move関数)を提供するのか、位置を指定(Setter)することを提供するのか
という感じに、クラスによってはgetter,setterばかりになることもあると思うんだけども、その辺について聞きたい。
809デフォルトの名無しさん:2010/09/13(月) 13:24:45
>>805
デバッグ中に入れるのはわからんでも無いがそんなものを
デザインに入れればクラスのカプセル化や柔軟性は失われると思うが

まさかデバッグ中だけの話をしてるわけじゃないよね?
810デフォルトの名無しさん:2010/09/13(月) 13:29:00
>>809
アクセッサはpublicでないといけないルールでもあるのかよw
必要なものだけpublicにすればカプセルもこわれないだろ。

あとアクセッサで柔軟性云々は理解できなかった。
具体的な例をたのむ。
811デフォルトの名無しさん:2010/09/13(月) 13:52:41
>>808
Move関数を提供、でおしまいな気がするんだけど、なんでそれが
「getter,setterばかりになる」例になるの?
812デフォルトの名無しさん:2010/09/13(月) 13:55:35
>>807
アクセッサを作ることが問題なんじゃなくて、メンバ変数の存在に基づいてアクセッサを作ろうと
考えること、つまり実装の詳細に基づいてインターフェースを設計することに問題がある、という話。

多くの場合、そのような設計はカプセル化に反し、たとえばクラスの実装を変えるだけで
済むはずの変更がクラス利用者のコードにまで波及したりする可能性を高める。
813デフォルトの名無しさん:2010/09/13(月) 14:00:36
>>810
private なアクセッサって、アクセッサ使わなくてもアクセスできちゃうから、 >>805 のような
利点は得られないよね?
814デフォルトの名無しさん:2010/09/13(月) 14:04:40
CPUやその他環境にもよるがブレークしたいだけならアクセッサは必要ないし
815デフォルトの名無しさん:2010/09/13(月) 14:38:11
>>811 日本語になってなかったですね。

Pointクラスを持つWindowクラスは、Point型変数の具体的な操作であるMove関数を提供するべき?
それともSetterを提供するべき?
.NETのライブラリではプロパティが多用されていることがあったので、どういう指針で決めたらいいか悩んでます。
言語側でプロパティのサポートがあるかないかという環境の違いなんでしょうか。
816デフォルトの名無しさん:2010/09/13(月) 15:09:06
>>812
前半は同意だが後半はむしろ逆だよ
アクセサをはじめからおいておけばよほどのことが無い限りはクライアントに影響しないコードが書ける

class Hoge
{
int x;
public:
void Set(int xx) { x = xx; }
int Get(void) const { return x; }
};

class Hoge
{
Impl * pImpl;
public:
void Set(int xx) { pImpl->x = xx; }
int Get(void) const { return pImpl->x; }
};

身近な例だとこんな感じね
817デフォルトの名無しさん:2010/09/13(月) 15:09:29
>>810
public では無い場合にフィールドに必ず accessor が何故必要なの?
直接アクセスできるのに
つければ手間も増えるし class も煩雑になる

public にして他のもので使うことにすれば class 内の変更はしにくくなる
818デフォルトの名無しさん:2010/09/13(月) 16:48:52
struct Hoge
{
FugaFuga fugagaaa;
};

class Kaibutsu
{
Hoge hoge;
};

こういう状況でメンバのhogeを任意の値で初期化するにはどういうコンストラクタを書くんですか?
819デフォルトの名無しさん:2010/09/13(月) 16:54:13
まず Hoge のコンストラクタを書く
820デフォルトの名無しさん:2010/09/13(月) 17:15:14
>>1-819 こいつら全部ダメ。C++の初心者さんばっかり。
C++ではsetter,getterメソッドなんていりません。
C++では全てのメンバをpublicにしておいて、
必要なときにメンバを新しいclassにすればいいの!
暗黙の型変換と代入の定義でいいの!
821デフォルトの名無しさん:2010/09/13(月) 17:39:36
>>813
自分の中でどこからアクセスされるかものすごく明示的になっている時点で便利だとおもうけどね。
おれも以前はprivateについてはつくってなかったけど、いまはつくってるよ
822デフォルトの名無しさん:2010/09/13(月) 17:41:45
>>817アクセッサで煩雑とかどうかとw
823デフォルトの名無しさん:2010/09/13(月) 17:46:52
C++で優しい入門本紹介してください サイトも紹介してくれるとありがたいです
824デフォルトの名無しさん:2010/09/13(月) 17:47:44
ロベールでもよんどけば?
825デフォルトの名無しさん:2010/09/13(月) 18:06:23
>>821
フィールドに必ずつけるって書いてるよね >>793
フィールド一つ増やしたらまたアクセッサ付けるわけ?
ほとんど get は public ということは作ったフィールド減らしにくいよね
826デフォルトの名無しさん:2010/09/13(月) 18:08:27
減らせますよ
最悪ダミーにしてもいいし
827デフォルトの名無しさん:2010/09/13(月) 18:16:57
減らすの不可能では無いけど public にしたらその動作を変える
とそれを使ってる class やコード全てに影響及ぶ
よって、変えないかダミーにするとか

必要なくても全てに public な get を付けるのはそんなに賢いのかなぁ
828デフォルトの名無しさん:2010/09/13(月) 18:18:36
賢くないけど、君の言うように致命的なミスではない
829デフォルトの名無しさん:2010/09/13(月) 18:34:32
>>825
内部でしか使わないものはpublicなんかにしないよ、なにかんがえてんの。
外部で状態を参照したいものだけgetをpublicするんだよ。

なんでもpublicになんてしない。
830デフォルトの名無しさん:2010/09/13(月) 18:40:10
>>829
だから初心者が口を出すなとさっき怒られたんじゃないの?
831デフォルトの名無しさん:2010/09/13(月) 18:44:35
>>830
上級者はアクセッサごときでソースが煩雑になり管理できなくなるんですか?
832デフォルトの名無しさん:2010/09/13(月) 18:51:03
>>829
>>793
> set、getはフィールドに必ずつけるけど、
> ほとんどの場合はgetだけpublicかな。

って書いてるからほとんど get は public なんでしょ
833デフォルトの名無しさん:2010/09/13(月) 19:31:31
おれは必要なものだけpublicだとかいてるんだよ。
なんでアクセッサで煩雑になったり、拡張性が悪くなったりするんですかね?
834デフォルトの名無しさん:2010/09/13(月) 19:51:21
そういやC++でも今はみんなフィールドやメソッドとかいうんだよな
職場でメンバ変数、メンバ関数とかいうのオレだけだ
他人に強制したりしないが良くは思われてないかもな
もちろんC#やるときはそっちの用語使うんだが
835デフォルトの名無しさん:2010/09/13(月) 19:58:05
上級者ならいっぱいいっぱいでやっと完成しましたじゃ済まないんですよね。
アクセッサが増えたら設計ミスなので、
何としても回避しなければ上級者とは呼ばれないでしょう。
836デフォルトの名無しさん:2010/09/13(月) 20:00:16
>>834
アトリビュートとかメッセージとか言い出すよりマシ
837デフォルトの名無しさん:2010/09/13(月) 20:01:33
アクセッサの定義が分かりません。
エラー値チェックとか、ストレージの抽象化とか、遅延読み込みとか、
ちょっとでも雑務が入ったらアクセッサとは呼ばないのですか?
838デフォルトの名無しさん:2010/09/13(月) 20:07:05
雑務ができるようにアクセッサにするんですよね?
839デフォルトの名無しさん:2010/09/13(月) 20:08:47
その前に雑務を定義してください
840デフォルトの名無しさん:2010/09/13(月) 20:12:16
>>835
いまだにウォーターフォール式ですか、なんだ老害かよ。
841デフォルトの名無しさん:2010/09/13(月) 20:18:24
日本でアジャアルはキツイものがある。
842デフォルトの名無しさん:2010/09/13(月) 20:20:36
プロジェクトメンバーのレベルがそれなりに保証されてないと無理だからなぁ
843デフォルトの名無しさん:2010/09/13(月) 20:21:27
アジャイル orz
844デフォルトの名無しさん:2010/09/13(月) 20:46:33
アジャアルないアルよ
845デフォルトの名無しさん:2010/09/13(月) 21:31:25
フィールドに必ず set/get 付けるって open source のコード見てもそんなの無いと思うけど
ここで講釈してる人って公開されてるコードはレベル低すぎて話にならんって感じなのかな
リアリティ感じないが
846デフォルトの名無しさん:2010/09/13(月) 21:35:15
>>845

いきなり無い書いてんの、でなおせよ。
オレ様チャン知ってるオープンソースのコードは世界一ですか?
847デフォルトの名無しさん:2010/09/13(月) 21:36:42
>>845
単に日本のPG/SEの脳が足りないだけだろう。
海外では頭が良いやつがちゃんと報酬のもらえるPG/SEになっている。
日本は頭がお粗末なやつがろくに報酬のもらえないPG/SEになっている。

848デフォルトの名無しさん:2010/09/13(月) 21:38:54
>>847
海外のコーダーが書いたものについて言ってるんだが
849デフォルトの名無しさん:2010/09/13(月) 21:46:19
リアリティって重要だよね
で、具体的にどのオプソプロジェクト?
850デフォルトの名無しさん:2010/09/13(月) 22:18:31
>>845
RoRみてみろ
851デフォルトの名無しさん:2010/09/13(月) 22:44:42
単純なget/setはクラスの内部状態を公に晒してるだけだから、極力なくせと言ってるわけ。
便利だから使いたいとかそんなレベルの話ではない
852デフォルトの名無しさん:2010/09/13(月) 22:45:56


853デフォルトの名無しさん:2010/09/13(月) 22:47:07
なんで同じ話するわけ
854デフォルトの名無しさん:2010/09/13(月) 22:49:45
ごめんね当たり前の話だったね
855デフォルトの名無しさん:2010/09/13(月) 23:00:53
>>851
なんでアクセッサがpublic前提なんだよおまえは。
856デフォルトの名無しさん:2010/09/13(月) 23:02:57
privateなら良いんじゃない
857デフォルトの名無しさん:2010/09/13(月) 23:03:09
>>851
>>855
何度目だwww
858デフォルトの名無しさん:2010/09/13(月) 23:04:28
winnyはC++でwindowsネイティブで作られていましたが、
マルチプラットフォームにするためにqtやgtkを使って作られていたら

簡単にクラックやプロトコルの解析がされていましたか?
859デフォルトの名無しさん:2010/09/13(月) 23:05:32
>>850
ここってC++のスレなんだけど RoRって C++で書かれてるの?
860デフォルトの名無しさん:2010/09/13(月) 23:06:13
>>858
全然
861デフォルトの名無しさん:2010/09/13(月) 23:08:55
>>858
うんこ
862デフォルトの名無しさん:2010/09/13(月) 23:11:29
Javaのオプンソース物はかならずアクセッサついとるで。
863デフォルトの名無しさん:2010/09/13(月) 23:14:22
で?
864デフォルトの名無しさん:2010/09/13(月) 23:15:10
メジャーだから正しいってこともないと思うけどな、マイナーが正しいと言う気も無いが
865デフォルトの名無しさん:2010/09/13(月) 23:16:12
Javaのオプンソース物が設計ミスってるんだよ!言わせんな恥ずかしい。
866デフォルトの名無しさん:2010/09/13(月) 23:16:55
あっそ
867デフォルトの名無しさん:2010/09/13(月) 23:17:10
C++の設計本が正しいに決まってるだろ!
868デフォルトの名無しさん:2010/09/13(月) 23:17:18
隠蔽のメリットって内部の実装変えても外からは同じに見えるようにできることなのね。
ゲッタやセッタがたくさんあるとね実装が丸見えになって、内部の実装変えたときに動作が変わらないようにするのが大変なのよ
869デフォルトの名無しさん:2010/09/13(月) 23:19:11
皆で一つのフィールドいじくりまわしたらそら混乱すらーな
870デフォルトの名無しさん:2010/09/13(月) 23:21:07
それはアクセッサの問題じゃなくて設計自体の問題。
871デフォルトの名無しさん:2010/09/13(月) 23:23:36
要するにpublicフィールド使って混乱するのは設計問題って意味か
872デフォルトの名無しさん:2010/09/13(月) 23:26:33
全てはプラz、設定が悪いで説明できます
873デフォルトの名無しさん:2010/09/13(月) 23:28:29
設計がマズくなるのを防ぐためにクラスとかprivateとかいろんな機能があるわけで
874デフォルトの名無しさん:2010/09/13(月) 23:29:45
>>871
フィールド丸出しにしてるといろんな方法で操作できて統制ができなくなるんでデバッグ不能のバグの宝庫になる。
ゲッターやセッターがたくさんあると同じことだ
875デフォルトの名無しさん:2010/09/13(月) 23:43:14
あんま使ってないから知らんけど、Visual C++等のIDEにさ、
アクセサ必要になったらhoge.aを使ってるとこを
全部自動でhoge.geta()に変えてくれるような機能ってないの?
あればそれで解決じゃん
876デフォルトの名無しさん:2010/09/13(月) 23:44:50
>>874
いや、アクセッサがあるからいけないってわけじゃねえだろ。
フィールドを沢山抱えていたり、むやみにpublicにしている設計がわるいんだろ。

思い込みでアクセッサはダメとかかいてんじゃねえ。
877デフォルトの名無しさん:2010/09/13(月) 23:46:05
>>875
struct hoge{
__declspec(property(get=geta, put=seta)) type a;
};
878デフォルトの名無しさん:2010/09/13(月) 23:46:25
アクセッサがダメというよりは、
アクセッサが増えるのは設計に問題がある兆候って感じだな
879デフォルトの名無しさん:2010/09/13(月) 23:53:23
なんか猛烈に入り組んだ罵倒の試合になってるなぁ・・・。どうしてこうなった。
880デフォルトの名無しさん:2010/09/13(月) 23:54:21
機能が肥大化している兆候ってことだよね。
アクセッサが悪いわけじゃねえよな。
881デフォルトの名無しさん:2010/09/13(月) 23:58:01
いえ、アクセサが必要になった時点で設計ミスです。設計本に書いてあるんで。
882デフォルトの名無しさん:2010/09/13(月) 23:58:40
無理やりのアクセサ擁護か
883デフォルトの名無しさん:2010/09/13(月) 23:59:13
内部状態を晒すのが良くないのであって、機能の肥大化はまた別問題だろう
884デフォルトの名無しさん:2010/09/14(火) 00:01:20
>>877 これいいわ、素晴らしい
885デフォルトの名無しさん:2010/09/14(火) 00:05:19
>>881
本に書いてあったんだもん!じゃなくてよ。
それを理解したお前の言葉でその理由をちゃんと説明しろよ。

あとその本を晒せ。
886デフォルトの名無しさん:2010/09/14(火) 00:06:47
アクセッサ無しならもっとひどいことになるよね?
毎回引数でしていして受け渡し。。。
887デフォルトの名無しさん:2010/09/14(火) 00:13:11
単に内部状態晒して自由に弄らせてるアクセッサが良くないってだけでしょ
888デフォルトの名無しさん:2010/09/14(火) 00:18:23
「厳しめなオブジェクト指向の10箇条」
みたいなサイト(和訳だったか?)がちょっと前に貼られてたのだが思い出せない。
暇な人よろしかったら教えてください。
889デフォルトの名無しさん:2010/09/14(火) 00:20:50
>>888
なんだよ、自分の言葉で語れるほど理解して使いこなしてねえのかよw
890デフォルトの名無しさん:2010/09/14(火) 00:32:31
という糞な流れを変える程度には有意義なネタだったと思うのだが。
891デフォルトの名無しさん:2010/09/14(火) 00:36:31
もうちょっと釣り耐性付けようよ。


  |   |  | |   |    |  | |   |   |   || | |
  |   |  | レ  |    |  | |   |  J   || | |
  |   |  |     J    |  | |  し     || | |
  |   レ |      |  レ|       || J |
 J      し         |     |       ||   J
             |    し         J|
             J                レ
     /V\
    /◎;;;,;,,,,ヽ
 _ ム::::(l|l゚Д゚)| …うわぁ
ヽツ.(ノ::::::::::.:::::.:..|)
  ヾソ:::::::::::::::::.:ノ
   ` ー U'"U'


バカがC++でコード書いて会社が潰れようが
それはそいつを雇った会社が悪いわけであって、
ちゃんと「C++でOOPやると決めた時にはOOPらしい正しい設計できる」やつらは
むしろ他者は潰れてくれた方がいいじゃん。
892デフォルトの名無しさん:2010/09/14(火) 00:44:12
うぜーなマ板でやれ
893デフォルトの名無しさん:2010/09/14(火) 00:58:02
a
894デフォルトの名無しさん:2010/09/14(火) 01:07:41
>>888
思い出した。コレだ。でも今見るとインパクト薄いな。

OOコード養成ギブス
http://d.hatena.ne.jp/akkt/20080424/1209051266
895デフォルトの名無しさん:2010/09/14(火) 01:48:40
>>815
まず、 Windows クラスが Point を内部に持つかどうかという実装の詳細は関係ない。
そのうえで Move() 関数か、 setter か、どっちか呼び出し元のコードが自然になるほうを
選ぶといい。呼び出し元のコードがどうなるかに基づいて設計するのがポイント。

C# のプロパティはインターフェースを作る際の選択肢として、関数呼び出しの表記よりも
直感的な object.property = value というような表記を選べるようにしたのであって、内部に
そのようなデータを持っていることを前提としておらず、ここで非難されている、
実装を暴露するような getter/setter とは違う。その点で「言語側でプロパティのサポートが
あるかないかという環境の違い」という認識は間違ってないと思う。
896デフォルトの名無しさん:2010/09/14(火) 01:59:56
private なアクセッサなら大丈夫だとか言ってる人へ。
みんな「アクセッサ」といえば public なやつのことだと思ってます。
private は好きにしてくれたらいいです。
public な get/set がたくさんあることに問題を感じるのであれば、
ここでほかの人と意見の衝突はありません。
897デフォルトの名無しさん:2010/09/14(火) 02:31:24
>>895
だいぶ流れてたのにレスありがとう。

>そのようなデータ
というのは先ほどの例でいうとPointのことですよね?
Pointを内部に持つかということに関わっていたら実装を隠蔽できてないことになる、と。
898デフォルトの名無しさん:2010/09/14(火) 02:34:12
既存のコードに、
private:
 friend class Test;
 int hoge;

って定義してある場合、自前でTestクラスを作って、
hogeにアクセスするのはありなの?
899デフォルトの名無しさん:2010/09/14(火) 02:36:36
あり
900デフォルトの名無しさん:2010/09/14(火) 02:40:14
>>898
そうなってる場合はどっかに同じく「既存の」 class Test があるだろうから、
自前で Test クラスを作った場合、良くてコンパイルエラー、あるいはリンクエラー、
悪ければ ODR 違反による未定義動作でわけのわからない動作。
901デフォルトの名無しさん:2010/09/14(火) 07:47:55
stl の教科書でつまずいています。
http://codepad.org/1iSGL0Zv
set<class_name>::iterator::p

*p
はクラスを指すことにならないのでしょうか?
902901:2010/09/14(火) 07:50:54
書き直します。
stl の教科書でつまずいています。
http://codepad.org/1iSGL0Zv
set<class_name>::iterator p

*p
はclass_name のオブジェクトをあらわすことにならないのでしょうか?

903デフォルトの名無しさん:2010/09/14(火) 08:13:48
ostream &operator<<(ostream &s, state &o) {

ostream &operator<<(ostream &s, const state &o) {

setの中身が直接書き換えられるのはまずいから
904901:2010/09/14(火) 08:20:45
>>903
ありがとうございました。
905デフォルトの名無しさん:2010/09/14(火) 09:21:06
bridgeパターンのimplementation *body
はどこで初期化しますか?
初歩的な質問ですがおねがいします。
906デフォルトの名無しさん:2010/09/14(火) 12:02:49
Abstractionのコンストラクタで初期化する
あるいはAbstractionの切り替えメンバを用意する
907デフォルトの名無しさん:2010/09/14(火) 12:07:01
コンストラクタで初期化する場合
実装はきまりきってるから
ポインターにする意味なくないですか?
908デフォルトの名無しさん:2010/09/14(火) 12:12:05
引数やテンプレートでスイッチできるでしょ
909デフォルトの名無しさん:2010/09/14(火) 12:13:50
テンプレートならポインターじゃなくても
スイッチできるんじゃないんですか?
910デフォルトの名無しさん:2010/09/14(火) 12:25:50
できませんよ
911デフォルトの名無しさん:2010/09/14(火) 12:30:10
できるでしょ
912デフォルトの名無しさん:2010/09/14(火) 12:34:54

で き な い
913デフォルトの名無しさん:2010/09/14(火) 12:37:39
静的なストレージに配置newを使えばできます
914デフォルトの名無しさん:2010/09/14(火) 12:37:53
<template implementation >class Abstraction{

implementation body;

Abstraction():body(implementation())
{}

出来ますがなにか?
915デフォルトの名無しさん:2010/09/14(火) 12:40:10
>>914
できてねーよカス
916デフォルトの名無しさん:2010/09/14(火) 12:42:09
できてますよ
917デフォルトの名無しさん:2010/09/14(火) 12:44:46
うん 出来てるし 本にも乗ってる。
918デフォルトの名無しさん:2010/09/14(火) 12:45:07
それじゃ新しいテンプレートクラスの実体化なしで実装切り替えらんねーだろカス
クラス数の爆発を抑えるためのbridgeパターンだろうが
真逆の方向に行ってどうすんだハゲ
919デフォルトの名無しさん:2010/09/14(火) 12:46:54
実装と定義の分離が目的じゃなかったっけ?
920デフォルトの名無しさん:2010/09/14(火) 12:58:36
Impが10パターンあったらAbs<Imp>を継承したクラスを1つ作ろうと思っただけで同じようなクラス定義を10回も書かないといけないとか面倒すぎる
921デフォルトの名無しさん:2010/09/14(火) 13:03:13
Abs<Impl , int>にするとか
Abs2<Impl>を作るとかの発想は無いの?
922デフォルトの名無しさん:2010/09/14(火) 13:05:14
継承先に継承もとの実装を預けるなんて設計がまともな設計だと思ってるのか?
923デフォルトの名無しさん:2010/09/14(火) 13:06:31
テンプラにするとコピーも代入もできないじゃん
924デフォルトの名無しさん:2010/09/14(火) 13:06:40
テンプレートだらけになって切り替えるのがだるそう
925デフォルトの名無しさん:2010/09/14(火) 13:10:51
つーかそれブリッジじゃなくてポリシーだし
926デフォルトの名無しさん:2010/09/14(火) 13:23:15
未だにテンプレートについていけない親父臭が漂ってるなwww
927デフォルトの名無しさん:2010/09/14(火) 13:24:22
え?テンプレートをちゃんと知ってるからこの場では否定的な意見がでるんだろ
928デフォルトの名無しさん:2010/09/14(火) 13:33:57
>>909
できない
929デフォルトの名無しさん:2010/09/14(火) 15:03:51
>>909
できる
930858:2010/09/14(火) 20:37:17
>>860
ありがとう
931デフォルトの名無しさん:2010/09/14(火) 21:31:05
できない
932デフォルトの名無しさん:2010/09/15(水) 22:36:22
struct A
{
 A():a(),b(),c(){}
 int a, b, c;
};

struct A
{
 A():a(0),b(0),c(0){}
 int a, b, c;
};

どっちのコンストラクタがいいですか。
933デフォルトの名無しさん:2010/09/15(水) 22:47:14
>>932
お好きにどうぞ。
私の場合、0という値に意味がないなら前者ですね。
934デフォルトの名無しさん:2010/09/15(水) 22:48:20
structにコンストラクタは必要なんだろうか
935デフォルトの名無しさん:2010/09/15(水) 22:52:58
A a;
じゃなく
A a();
って常に書くならむしろ要らんな
936デフォルトの名無しさん:2010/09/15(水) 22:56:45
Cスタイルのほうが速そうなイメージがある
デフォルトコンストラクタとか作られないんじゃなかったっけ
937デフォルトの名無しさん:2010/09/15(水) 22:58:18
structはデータの集合以上の機能をもつべきでは無いのじゃないだろうか
コンストラクタも振る舞いといえばそうだ
938デフォルトの名無しさん:2010/09/15(水) 23:00:39
>>936
なんだよCスタイルって
939デフォルトの名無しさん:2010/09/15(水) 23:02:03
publicを書くのがめんどいからstructにしただけです。
940デフォルトの名無しさん:2010/09/15(水) 23:18:15
メンバも継承もpublicなことが多いからstructのほうがタイプ少ないことが多いんだよね
941デフォルトの名無しさん:2010/09/15(水) 23:23:04
酷い釣りだ
942デフォルトの名無しさん:2010/09/15(水) 23:26:57
え?
943デフォルトの名無しさん:2010/09/16(木) 00:02:53
>>935
後者は関数宣言。
944デフォルトの名無しさん:2010/09/16(木) 00:09:51
>>943
コンストラクタ消したらPODだろ
945デフォルトの名無しさん:2010/09/16(木) 00:11:54
946デフォルトの名無しさん:2010/09/16(木) 07:18:04
>>944
>935の後者はPODかどうかに関係なく関数宣言。
947デフォルトの名無しさん:2010/09/16(木) 10:55:17
struct はデフォルトがpublicなだけでclassと一緒らしいですが
classでもメンバを適当にすれば POD型になるんですか?
948デフォルトの名無しさん:2010/09/16(木) 11:08:46
はい
949デフォルトの名無しさん:2010/09/16(木) 11:09:11
ありがとうございます
950デフォルトの名無しさん:2010/09/16(木) 20:09:39
OSSのコードを読んでいると、メイン画面のGUIは手書きで
ダイアログはGUIビルダーを使っているというパターンが多いと思います

このメリットを教えてください
951デフォルトの名無しさん:2010/09/16(木) 20:14:04
>>947 classの時点でpodじゃない。podが何の略か
952デフォルトの名無しさん:2010/09/16(木) 20:18:46
>>951
なに訳の分からないことを
953デフォルトの名無しさん:2010/09/16(木) 20:19:32
>>951ちゃん恥ずかしい///
954951:2010/09/16(木) 20:26:27
仕様書読め
955デフォルトの名無しさん:2010/09/16(木) 20:30:17
perfect
object
domestic
956デフォルトの名無しさん:2010/09/16(木) 20:46:47
POD、PoDとは、

* Plain Old Documentation (POD) - Perl等のプログラムソース内に記述されたマニュアルの記述方法。
* Plain Old Data (POD) - C++において、Cの構造体との互換性を持つクラスのこと。
957デフォルトの名無しさん:2010/09/16(木) 20:48:52
内容があってるかじゃなくて
ソースにwikipediaってのはどうなのよ
958デフォルトの名無しさん:2010/09/16(木) 21:04:42
>>954
お前がな
959デフォルトの名無しさん:2010/09/16(木) 22:02:08
んで結局PODって何なの?
未だに定義を俺は理解できないんだけど。
だんだん理解しようとする気迫が薄れてきた。
960デフォルトの名無しさん:2010/09/16(木) 22:04:44
Pod pod = {0};
で初期化できるのがPOD
961デフォルトの名無しさん:2010/09/16(木) 22:11:09
ってことは別にメンバ関数もっててもPODなの?
962デフォルトの名無しさん:2010/09/16(木) 22:15:26
うーん、定義的にはvirtualなメンバ関数でなければ、PODになるかな。
個人的にはメンバ関数持ってるPODなんて勘弁してほしいが。
staticメンバならいいけれども。
963デフォルトの名無しさん:2010/09/16(木) 22:15:44
pod
964デフォルトの名無しさん:2010/09/16(木) 22:19:11
boostのシリアライズっぽいやつで暗号化にも対応してるの無いっすか?
965デフォルトの名無しさん:2010/09/16(木) 22:21:28
I am Pod
966デフォルトの名無しさん:2010/09/16(木) 23:00:48
C用のstructを継承して大小関係とか少し拡張するのってありですか
967デフォルトの名無しさん:2010/09/16(木) 23:20:42
>>966
全然おkじゃないのか?
何が聞きたいのか分からん。
それで設計がおかしくならないならいいんじゃん。

既にあるクラスの再利用なんだし、むしろそれが継承の醍醐味な気がするが。
968デフォルトの名無しさん:2010/09/16(木) 23:39:00
>>967
いえ、自分まだ素人でして↑のレスを読んでると
そういうCの関数用のstruct、つまりクラスとか想定されてないところに
勝手にC++の付属物をくっつけるのがなんだか怖くなってきて
969デフォルトの名無しさん:2010/09/16(木) 23:44:49
童貞みたいな発言だな
970デフォルトの名無しさん:2010/09/16(木) 23:49:23
>>968
それがextern "C"とかで宣言されている外部の関数とかとやりとりするための
structなら、しないほうがいいかもね。
継承ではなくて、別のクラスにくるんで使う方がいい場合もある。
指針としては、dynamicキャストを使わないで(staticキャストはOK)、書ける間は
そんなに気にしなくていいんじゃないかな。
971951:2010/09/16(木) 23:58:49
>>958 間違ってました、全publicならpodにできますね

void p(){puts("ごめんなしゃい");}
int ackermap(int m,int n,void(*f)()){
f();
if(m==0){return n+1;}
if(n==0){return ackermap(m-1,1,f);}
return ackermap(m-1,ackermap(m,n-1,f),f);
}
ackermap(4,4,p);
972デフォルトの名無しさん:2010/09/17(金) 00:06:34
>>970
>extern "C"とかdynamic_cast
聞いたことはありますがまだ実際に使ったことはないですね
普通に正式っぽいのでよかったです
問題にぶち当たったらまた再考してみます、俺みたいなヘタレにどうもありがとうございました
973デフォルトの名無しさん:2010/09/17(金) 00:24:20
>>972
相当な初心者だったのか。
道はめっちゃ険しいけど、まあまあ楽しいし、頑張ってくれ。
974デフォルトの名無しさん:2010/09/17(金) 00:25:52
>>970
dynamicキャストを使うなんて、C++のクラスだろうが何だろうが、逃げです。
デスマーチへの近道です。

しかし逃げだろうが納期からは逃げられないから
仕方なく最後の仕様変更の際には使うんです。

975デフォルトの名無しさん:2010/09/17(金) 00:28:37
>>974
そして、結局どつぼにはまる、と…w
やっぱり手抜きしないでstaticキャストしときゃよかった、と泣くことになるんだろう?w
976デフォルトの名無しさん:2010/09/17(金) 00:35:05
dynamic_cast がなかった頃にできたライブラリの地獄絵も
今に負けず劣らず凄惨を極める・・・今に負けず劣らず
977デフォルトの名無しさん:2010/09/17(金) 00:39:36
>>976
それは、dynamic_castが必要だよ、とコンパイラがいわないから、もっとひどいことに
なるんじゃなかったっけ?
978デフォルトの名無しさん:2010/09/17(金) 22:03:06
イテレーターを取得する関数はbeginとendにしろって言われたんですけど
そんなこと無いですよね?
979デフォルトの名無しさん:2010/09/17(金) 22:06:01
>>978
そうじゃなきゃいけないってことはないけど、
そんな感じの名前にする方が一般的

それに、一口にイテレータといってもだな…w
980デフォルトの名無しさん:2010/09/17(金) 22:10:50
>>978
そうしておけば、C++0x になったときに
range-based for が黙ってても使えるようになる。
981デフォルトの名無しさん:2010/09/17(金) 22:15:28
begin(c)とend(c)がオーバーロードされてればメンバのほうは何でもいいんじゃないの?
982デフォルトの名無しさん:2010/09/17(金) 22:16:26
>>978
STLと違う使い方を覚えろというのか
983デフォルトの名無しさん:2010/09/17(金) 22:16:30
range-based for ってかなり酷いものみたいだな。
984デフォルトの名無しさん:2010/09/17(金) 22:16:53
>>980
rangeを取得する一般的な関数名も欲しいな。
begin,endがあればrangeが取れるんだけど、rangeをイテレータに分解した後またrangeに組みな押されるのが無駄に感じるんだなあ
985デフォルトの名無しさん:2010/09/17(金) 22:18:25
>>983
お前がそう思うんならそうなんだろ
986デフォルトの名無しさん:2010/09/17(金) 22:19:03
>>982
rbegin
rend
lower_bound
upper_bound
find
find_if
STLでもすでにバリエーションいくつもあるしbegin/endにこだわること無いと思うよ
987デフォルトの名無しさん:2010/09/17(金) 22:21:22
>>986
お前どんだけアホなの
988デフォルトの名無しさん:2010/09/17(金) 22:24:20
>>987
別にあほでもないだろ。
そもそも、>>978の質問が抽象的にすぎるんだよw
989デフォルトの名無しさん:2010/09/17(金) 22:25:42
>>987
君がイテレータ取得メンバはbeginとend以外覚えたくない
つまりそれだけで十分だと考えてるようだからから
それは幻想だよって教えてあげたんじゃないか
990デフォルトの名無しさん:2010/09/17(金) 22:30:46
>>986
それらは全て機能が異なる。バリエーションではない。

たとえば、beginと同じ機能の、startとかfirstとかあったらバリエーションだろう。迷惑なは無しだけどな
991デフォルトの名無しさん:2010/09/17(金) 22:32:21
begin&endはプロジェクトの名前規約に違反することが多すぎて困る
992デフォルトの名無しさん:2010/09/17(金) 22:35:07
未だにあるんだろうね、「メソッド名は大文字で始めねばならない」とか規約作ってるところ…w
993デフォルトの名無しさん:2010/09/17(金) 22:38:11
動詞で始まるとかな

まあでもこれはセンス無い命名だと思う
誰が見ても最初は何かを始めて、何かを終わらせる関数
つまりイニシャライザとファイナライザに見えて不安になる
994デフォルトの名無しさん:2010/09/17(金) 22:39:56
最近gcc4.6にrange-based forが実装されたらしい。
995デフォルトの名無しさん:2010/09/17(金) 22:42:14
>>993
いや、でも、begin()はイニシャライザといってもいいし。
ま、end()はちょっとあれかなw
996デフォルトの名無しさん:2010/09/17(金) 22:44:27
head
tail
にしてほしかった
997デフォルトの名無しさん:2010/09/17(金) 22:46:46
>>996
ああ、確かにそっちの方がセンスいいかもしれねーな…
ただ、head()、tail()とかリンクドリストとかでよく使ってるからな…
998デフォルトの名無しさん:2010/09/17(金) 22:51:51
>>996
tailだと最後の要素を指すのか?非合理だね
999デフォルトの名無しさん:2010/09/17(金) 22:53:35
次ぎすれどうすんだ
1000デフォルトの名無しさん:2010/09/17(金) 23:01:50
tailでセンスいいとかw
盲信しろとは言わんがもう少し先人の苦労に敬意を払えよ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。