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

C++相談室 part83

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2010/08/04(水) 18:34:23
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part82
http://pc12.2ch.net/test/read.cgi/tech/1275477613/
0002デフォルトの名無しさん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)に対応。
0003デフォルトの名無しさん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
0004デフォルトの名無しさん2010/08/04(水) 18:37:04
■Books■
amazon.com C,C++関連書籍
 http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/

The C++ Programming Language
 http://www.amazon.com/exec/obidos/ASIN/0201700735/
 http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
 http://www.amazon.com/exec/obidos/ASIN/0201824701/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
 http://www.amazon.com/exec/obidos/ASIN/0201379260/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
 http://www.amazon.com/exec/obidos/ASIN/0201924889/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
 http://www.amazon.com/exec/obidos/ASIN/020163371X/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
 http://www.amazon.com/exec/obidos/ASIN/0201615622/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
 http://www.amazon.com/exec/obidos/ASIN/020170434X/
Exceptional C++ Style
 http://www.amazon.com/exec/obidos/ASIN/0201760428/
0005デフォルトの名無しさん2010/08/04(水) 18:38:36
■Books(Templateまわり)■
Effective STL
 http://www.amazon.com/exec/obidos/ASIN/0201749629/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
 http://www.amazon.com/exec/obidos/ASIN/0201704315/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
 http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
 http://www.amazon.com/exec/obidos/ASIN/0321227255/


■長いソースを貼るときはここへ。■
 http://codepad.org/
0006デフォルトの名無しさん2010/08/04(水) 18:55:43
STLつかうと一気に実行ファイルサイズが10倍に?!

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

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

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

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0007デフォルトの名無しさん2010/08/05(木) 00:46:27
std::tr1::regex_replaceで文字列を置換して
置換した箇所を取得する方法を教えてください。
0008デフォルトの名無しさん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;
}
0009デフォルトの名無しさん2010/08/05(木) 08:35:44
>>8 *source type is not polymorphic*
0010デフォルトの名無しさん2010/08/05(木) 08:40:55
>>9
ありがとうございます。解決しました。
virtual int Foo() const;
にすれば良いようです。
0011デフォルトの名無しさん2010/08/06(金) 09:16:06
何かしらの仮想関数をもたないとdynamic_castに必要なv-tableを持てないからエラーを吐く

Baseクラスが派生されること前提にしてるならデストラクタをvirtualすればいいと思う
というかするべきだと思う
0012デフォルトの名無しさん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しなければならず
効率が悪く感じました。もっと良い実装案はないでしょうか?
0013デフォルトの名無しさん2010/08/06(金) 11:41:04
queueじゃなくlistを使って
使った要素を毎回先頭につなぎなおす
0014デフォルトの名無しさん2010/08/06(金) 12:05:45
>>12
std::list< item > map;
std::map< key, list::iterator > map;

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

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

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

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

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

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

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

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

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

それよりマイクロソフトのwindows.hにあるマクロ類が、
ネームスペースで解決不能なので困る。
0049デフォルトの名無しさん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 と呼びます。


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

> あとからまとめてつけれませんか?
なにを無茶おっしゃいますか
0051デフォルトの名無しさん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 の中身も変わってしまうのは何故なんだぜ?
0052デフォルトの名無しさん2010/08/14(土) 22:12:55
>>51
index operator +( const index & left, const index & right ) {
  index t = left;
  return (t += right );
}

でいいんじゃない?
0053デフォルトの名無しさん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.
0054デフォルトの名無しさん2010/08/14(土) 22:24:50
>>52
いや、こうならないように回避する方法はいくらでもあるけど
このコードでこういう結果になる理由が知りたいんだよね

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

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

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

index( left )

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

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

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

>>61
>>66
質問の意味を汲み取っていただいてありがとうございます
0069デフォルトの名無しさん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



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

なんか言えよお前。

0070デフォルトの名無しさん2010/08/14(土) 23:36:18
>>67
なんか
0071デフォルトの名無しさん2010/08/15(日) 00:03:21
藁
0072512010/08/15(日) 00:41:01
ごめんなさい
最初に↓のコードを書き込んでから質問すればよかったですね
0073512010/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;
}
0074512010/08/15(日) 00:42:29
↑のクラス定義のコードなら意図した通りの動作をするのに
何故 enum の演算子のオーバーライドの時はそうならないのか疑問だったもので
ユーザー定義型の enum ならクラスのように一時インスタンスが作られるのだろうと
思い込んでました^^
0075デフォルトの名無しさん2010/08/15(日) 02:01:26
enumとclassは全然違うから
もっと勉強した方がいいよ
0076デフォルトの名無しさん2010/08/15(日) 09:26:39
>>51のコードが不正なのは一時変数をint&で拘束できないからだろ
何で誰も気づかないんだよ。
0077デフォルトの名無しさん2010/08/15(日) 09:39:17
>>76
おお、それはかの有名なVC独自仕様ってやつじゃないですか。
0078デフォルトの名無しさん2010/08/15(日) 16:37:04
一時変数が作られるからb自体は変更されないよな?
っていう話なんだからそこは別にいいんじゃないの
0079デフォルトの名無しさん2010/08/15(日) 21:44:21
一時的にメンバ変数を増やしたい場合ってどうするのがよいだろうか
クラスstaticなmapにthisポインタとデータをマッピングして代用してるんだけどあんましスマートじゃない気がする
0080デフォルトの名無しさん2010/08/15(日) 22:53:44
ポインタでデータ持てば?
0081デフォルトの名無しさん2010/08/15(日) 23:13:13
namespaceがすごく長い場合それを置き換えるにはどうしたらいいですか?
ただしusingは使わないものとします。

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

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

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

extern "C" foo_bar(x)

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

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

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

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

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

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

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

#昔は(win32は今でも)構造体はポインタで渡していたからなあ
0112デフォルトの名無しさん2010/08/19(木) 20:42:37
せめてPOD型でぐぐれよ
0113デフォルトの名無しさん2010/08/19(木) 20:49:05
>>112
すると、>>111 は POD 型ではないのですが、それでも、
container.push_back(struct-non-POD);
とすれば、non-POD がまるままコピーされるようなんです。(http://codepad.org/L7bt2ZlW)
そんなものだ、といわれれば、それまでなんですけれども。
うーむ。
0114デフォルトの名無しさん2010/08/19(木) 21:04:20
コンパイラが勝手にコピーコンストラクタ作ってるだけだろ
0115デフォルトの名無しさん2010/08/19(木) 21:28:59
何が駄目なの
0116デフォルトの名無しさん2010/08/19(木) 21:38:05
>>111
listがPODじゃ無いから違うだろう
0117デフォルトの名無しさん2010/08/19(木) 22:58:54
>>109
push_backの定義は
 void push_back( const T& val );
だから引数に関しては参照渡しになっている。
コピーコンストラクタが実行されるのはコンテナに入れるとき。
0118デフォルトの名無しさん2010/08/20(金) 01:01:22
>>113
そんなものです。(コピー)コンストラクタについて理解した方が良い。
0119デフォルトの名無しさん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を必要となりまったく意味がありません。
0120デフォルトの名無しさん2010/08/20(金) 04:44:11
なんか>>99は
Accelerated C++に進む前に、基本をちゃんとやっとけってレベルだったんだな
0121デフォルトの名無しさん2010/08/20(金) 06:21:58
>>119
たぶん素材(ソースとかコンパイル方法とかの情報)全部出してもお前には無理っぽいから
面倒なので無視することにした
0122デフォルトの名無しさん2010/08/20(金) 07:11:10
>>121
そうですか・・・残念です。
0123デフォルトの名無しさん2010/08/20(金) 07:54:41
もう一度同じ質問繰り返すつもりなら
頼むから別人に成り済ましてくれ
0124デフォルトの名無しさん2010/08/20(金) 09:04:03
面倒なので無視することにした(キリッ
0125デフォルトの名無しさん2010/08/20(金) 09:21:25
>>121
答えられないなら無理すんなよw
0126デフォルトの名無しさん2010/08/20(金) 12:13:18
自己解決しました。
0127デフォルトの名無しさん2010/08/20(金) 14:34:30
自家発電しました。
0128デフォルトの名無しさん2010/08/20(金) 23:59:09
てstしました
0129デフォルトの名無しさん2010/08/22(日) 14:24:15
I do a test!
0130デフォルトの名無しさん2010/08/22(日) 19:26:39
I wanna do.
0131デフォルトの名無しさん2010/08/22(日) 19:39:07
But I can't do.
0132デフォルトの名無しさん2010/08/22(日) 19:42:36
Because...
0133デフォルトの名無しさん2010/08/22(日) 19:52:55
I'm a virgin!
0134デフォルトの名無しさん2010/08/22(日) 19:55:23
She went to a bargain.
0135デフォルトの名無しさん2010/08/22(日) 21:01:18
I'm a pick at you.
0136デフォルトの名無しさん2010/08/22(日) 21:01:58
C++の入門勉強を終えたんですが
C++の公開されてるライブラリって少なくないですかね?

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

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


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


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

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

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

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

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

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

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

ココはど素人の集まりかよ
0172デフォルトの名無しさん2010/08/24(火) 18:14:08
>>170
> とりあえずオーバーライドがどんな機能なのかもう一度勉強してこい
機能というか、用語の定義を、でしょ。
隠蔽とごっちゃになっている人が多いんだろう。
確か・・・polymorphicに使える点以外では振る舞いは同じだよな?
0173デフォルトの名無しさん2010/08/24(火) 18:18:29
>>172
いや機能を理解してればごっちゃにならないから
振る舞いが一緒とか寝言は寝ていえってレベル
0174デフォルトの名無しさん2010/08/24(火) 18:22:22
>>172
馬鹿でしょお前、マジで。
0175デフォルトの名無しさん2010/08/24(火) 19:27:40
俺は他人よりも理解しているの法則発動
0176デフォルトの名無しさん2010/08/24(火) 21:17:21
お前らど素人だろどうせ
0177デフォルトの名無しさん2010/08/24(火) 21:53:18
結局答えは?隠蔽でいいの?
0178デフォルトの名無しさん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
になるんですけどなんで違うんですか。
0179デフォルトの名無しさん2010/08/24(火) 22:05:30
>>178
初期化してないからゴミがはいってるんじゃね。
0180デフォルトの名無しさん2010/08/24(火) 22:09:54
>>153
すでに>>155, >>162で答えられてるけど 隠ぺい(hide)

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



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

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

このことを理解できてない奴が多いだけ
0193デフォルトの名無しさん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()が呼ばれる
}
0194デフォルトの名無しさん2010/08/25(水) 14:10:22
オーバーロードと隠蔽がごっちゃになってる人は多そう
01951912010/08/25(水) 14:13:55
>>193
ありがとうございます。

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

> 定義だよ

ああ、そりゃ悪かった

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

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

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

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


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

俺ホモだけど
0238デフォルトの名無しさん2010/08/25(水) 22:48:53
知るかそんなやつ
0239デフォルトの名無しさん2010/08/25(水) 22:57:06
魔道書の人、ここみてんのか。
0240デフォルトの名無しさん2010/08/25(水) 23:35:45
俺が確認したかぎり、こことC++0xスレとBoostスレを見ていると思われる。
今C++0xの本を執筆しようとしてなんとかと言ってたようだが詳細はしらね
0241デフォルトの名無しさん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 云々(実装の詳細の話)を
持ち出す必要もないし(ここまでの残念な流れを見れば明らかなように)不適切。
0242デフォルトの名無しさん2010/08/26(木) 02:25:10
みんな何と戦っているんだ
0243デフォルトの名無しさん2010/08/26(木) 02:44:21
自分とのたたかいだよ(キリッ
0244デフォルトの名無しさん2010/08/26(木) 02:44:22
>>237
>Derived classの非virtualなメンバー関数に対し、同名のBase classの非virtualなメンバー関数がある場合、
>それは単に、名前を隠しているだけである。
これDerived classは非virtualかどうかって関係無いよね?
0245デフォルトの名無しさん2010/08/26(木) 10:29:51
C++でソケット通信を行いたいのですが、いい日本語のリファレンスをご存じないですか?
0246デフォルトの名無しさん2010/08/26(木) 10:50:02
ttp://wisdom.sakura.ne.jp/system/winapi/winsock/index.html
ttp://www.geekpage.jp/programming/winsock/
こことか
0247デフォルトの名無しさん2010/08/26(木) 15:08:28
入れるデータの数の上限が無いハッシュテーブルってどうやって作るんですか?
0248デフォルトの名無しさん2010/08/26(木) 15:20:35
>>247
データ数に上限のない普通のテーブルなら作れるのか?
話はそれからだ
0249デフォルトの名無しさん2010/08/26(木) 16:07:34
テーブルという名前のデータ構造は存在しませんが何か?
0250デフォルトの名無しさん2010/08/26(木) 16:22:06
>>249
普通のテーブルというのはハッシュ化してないテーブルという意味だよ。
日本語にすると表とか配列のこと。

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

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

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

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

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

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

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

●宮崎牛口蹄疫蔓延

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

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

void func(/* lambdaを引数にとる関数の書き方を教えてください */);
0277デフォルトの名無しさん2010/08/28(土) 23:09:23
>>276
template<typename T> で T とか、 std::function<void ()> とか。
0278デフォルトの名無しさん2010/08/28(土) 23:16:08
struct A
{
  int a;
  int b;
  int c;
  int d;
};
こんな感じの構造体をクラスのメンバ変数にした場合、
0で埋めるコスト安い方法ってなんですか。memset以外で。
0279デフォルトの名無しさん2010/08/28(土) 23:18:29
>>278 member = A()
0280デフォルトの名無しさん2010/08/28(土) 23:18:45
A a = {0};
0281デフォルトの名無しさん2010/08/28(土) 23:24:08
>>279
それでできる?
0282デフォルトの名無しさん2010/08/28(土) 23:24:44
>>280
メンバ変数で
0283デフォルトの名無しさん2010/08/28(土) 23:24:57
>>280でいいじゃんw
0284デフォルトの名無しさん2010/08/28(土) 23:27:34
>>277
勉強させていただきました。ありがとうございます。
これは便利だなあ。
0285デフォルトの名無しさん2010/08/28(土) 23:28:45
いまどきメタテンできないとかやばいよね
0286デフォルトの名無しさん2010/08/28(土) 23:38:17
>>279
これだとどういう理由でメンバが0で埋まるんですか?
0287別人2010/08/28(土) 23:40:36
デバッグモードでビルドしたから
0288デフォルトの名無しさん2010/08/29(日) 00:05:08
VS2010のリリースビルドでも0で埋まります。何故ですか。
0289デフォルトの名無しさん2010/08/29(日) 00:15:02
PODの明示的コンストラクタ呼び出しは0初期化と決まっているから。
02902872010/08/29(日) 00:28:49
>>287は間違いだたゴメン。>>289が正解。
0291デフォルトの名無しさん2010/08/29(日) 00:37:23
サンクス!
0292デフォルトの名無しさん2010/08/29(日) 14:33:39
PODが0で初期化されるのってコンパイラ依存じゃなくて、仕様できまったんだっけ?
0293デフォルトの名無しさん2010/08/29(日) 16:10:48
知りたきゃ自分で調べて勝手に納得してな
0294デフォルトの名無しさん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最終草案とはちょっと違います)
0295デフォルトの名無しさん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のとおり
0296デフォルトの名無しさん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ファイルに出力したいのですがどうすればよいでしょうか?
0297デフォルトの名無しさん2010/08/30(月) 14:15:39
>>296マルチすんなこのカス
0298デフォルトの名無しさん2010/08/30(月) 14:19:32
すみません。
もう1つの方はC言語で、こちらがC++だったので2つの書き込みをしてしまいました。
申し訳ありません。
本当はこちらに質問したかったです。
0299デフォルトの名無しさん2010/08/30(月) 14:23:30
>>298
いや、boostにも同じ質問しているだろ。
他に移動するときは断り書きをしたうえで、質問のポイントを再検討してから質問するのが道理。

で、あんたは何が判らないんだ? 素直にくだスレにでも行った方が無難なようだが。
0300デフォルトの名無しさん2010/08/30(月) 14:32:14
すみませんでした。
今は標準出力なのですがこれをtsvファイルに出力したいと思っています。
私が分からないのはこの1点です。
0301デフォルトの名無しさん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";
}
0302デフォルトの名無しさん2010/08/30(月) 14:39:29
>>300
最初からそう聞けばいいのに。
0303デフォルトの名無しさん2010/08/30(月) 14:41:17
ありがとうございます。今実行しましたが1行しか出力されていません。
どうすれば全行出力されますか?
<実行>
a e d
q d r
r u t
したいのですが、
a e d
しか表示されませんでした。
0304デフォルトの名無しさん2010/08/30(月) 15:29:27
ofs << endl;
0305デフォルトの名無しさん2010/08/30(月) 15:31:51
301を訂正します。
<実行>
a e d
q d r
r u t
したいのですが、
最後の1行の
r u t
しか表示されませんでした。
全行表示するにはどうすれば良いでしょうか?
0306デフォルトの名無しさん2010/08/30(月) 15:41:14
先ほどの段階でofs << endl;は入れていましたが最後の1行しか表示されないです。
0307デフォルトの名無しさん2010/08/30(月) 15:42:31
>>296 のcoutをofstreamに置き換えて、出力結果が違うってあるの?
それとも最初からバグってる?
0308デフォルトの名無しさん2010/08/30(月) 15:48:07
改行コードが違うんじゃね
0309デフォルトの名無しさん2010/08/30(月) 15:53:44
c++filtの逆をする、つまり、g++名 -> C名をしてくれるプログラムはありますか?
0310デフォルトの名無しさん2010/08/30(月) 16:08:46
初心者なもので309さんがおっしゃっていることが分かりません。
307さんのおっしゃる通りcoutをofstreamに置き換えてしましたが出力結果が違います。
0311デフォルトの名無しさん2010/08/30(月) 16:12:34
一行ごとにファイルを開いちゃってまずいことになってると予想
0312デフォルトの名無しさん2010/08/30(月) 16:13:13
>>310
>308
0313デフォルトの名無しさん2010/08/30(月) 16:28:19
>>311
ああ、それかもね。
ループのなかにofstream ofs("data.tsv"); を入れちゃってる。
03143092010/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が出てくるプログラム」です。
0315デフォルトの名無しさん2010/08/30(月) 16:49:32
311さんと313さん、ご指摘ありがとうございます。
しかし、ループの中にはいれていません。
0316デフォルトの名無しさん2010/08/30(月) 17:10:14
>>315
>308
0317デフォルトの名無しさん2010/08/30(月) 17:11:12
>>314
つ[gcc]
03183092010/08/30(月) 17:35:58
>>317
それはわかりますし……そうですね。
0319デフォルトの名無しさん2010/08/30(月) 17:42:55
>>315
何度か他人が指摘しているけど \r はあっても \n が無い
とそういう状況になるはず

そんなにわからないならコードをちゃんと出せって
情報小出しにされても皆わからん
0320デフォルトの名無しさん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ファイルの方を標準出力の結果と同じにしたいです。
0321デフォルトの名無しさん2010/08/30(月) 18:06:24
ファイルを上書きしてるだけじゃないの?
0322デフォルトの名無しさん2010/08/30(月) 18:07:43
>>320
>308
その"test.tsv"をどっかにアップロードして味噌。
0323デフォルトの名無しさん2010/08/30(月) 18:08:00
これがプログラムです(キリ
0324デフォルトの名無しさん2010/08/30(月) 18:09:46
あーなるほど、ReadFromCsvLine()を毎行呼んでいるのか。
だとしたら、最初の行を処理する前に定義して、ReadFromCsvLine()にはofsの参照を渡せばいいや。
0325デフォルトの名無しさん2010/08/30(月) 18:10:07
>>323
どうかした?
0326デフォルトの名無しさん2010/08/30(月) 18:10:55
追記じゃなくて上書きしてるよなぁwwww
0327デフォルトの名無しさん2010/08/30(月) 18:14:43
>>325
>323は断片のみの提示に対して不満を訴えているものと思われる。
0328デフォルトの名無しさん2010/08/30(月) 18:14:49
>>325
死ねばいいよ
0329デフォルトの名無しさん2010/08/30(月) 18:15:04
みなさんありがとうございます。
どなたか変更後のプログラムを載せていただけないでしょうか?
0330デフォルトの名無しさん2010/08/30(月) 18:16:22
マルチすんなぼけ
0331デフォルトの名無しさん2010/08/30(月) 18:24:22
std::ofstream ofs( "test.tsv", std::ios::out | std::ios::app );

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

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

絶対嘘。
プログラムの基本分かってないだろ。
0335デフォルトの名無しさん2010/08/30(月) 18:36:56
結局>>311,313だったわけか
forか関数呼出かの違いで
0336デフォルトの名無しさん2010/08/30(月) 18:43:56
   |:::::::::::::::::   ____________    :::::::::|
手  |::::::::::::: ,. '":::::::::::::::::::::::::`ヽ.  ::::::::| 頭  ど
遅  |:::::  /::::::::く:::::::╋::::::::>:::::::::\  :::| で.   こ
れ  |:::: 〈:::::::::;:::--- 、─ァ -- 、:;:::::::::〉 :::| す   が
で. .|:::::  ,〉'"      `'´     `ヽ!  :| か  悪
す  |:::: /   /  ハ  ハ ヽ ヽ 、  ',  |  ゜  い
ね. |:::: i  ,'  /!__i_, !' ! ,_ハ__ハ ',  ! ',    ん
  ゜/::  ノ.! ! /,ィ-ァ!、! レ',ィ-=!、! i ハ  〉    で
´\|::  〈 ノ Yレヘ''ゞ-'     ゞ-''/レ' ン ∠、    す
::::    〈 ハ  !ハ."  ______  "ハ ハ !   !    か
::     ノ、 `ァ'_」>、._`ー' ,,.イ/イ、ノ    ヽ.  ?
     / `ァ''´ ',   ヽ干´ン::::::::::::`ヽ.   `''ー─
    ! ヽ/   ,y ヽ、. .,!':::::::::.y::::::::::::',
    〉r〈_,.-、7-、  Y十::::.::::::i::::::::::::::〉
:    レ^iY⌒ヽ,イ'ヽ-! .|::::::::::::::;ハr、::::Y
::      '! ,ィ〈 `y'´`ヽ!::::::::::::/´⌒'/'
:::      Y´ヽ、)-'、___ノ、::::::::/   /
0337デフォルトの名無しさん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 /::::::::::::!  / || .!   /:::::::::/  -‐、∨\
 ,..:::{__ == !::::::::::::::!ノ // ヽ /:::::::::::{   ィヽソ|:::::::|
0338デフォルトの名無しさん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 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  ̄ ̄ ̄ (ヽ   |_  \ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄∧ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 :::::::::::::::::::||\  | / /:::::::::| ̄ ̄ ̄ ̄ ̄ ̄ ̄   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 :::::::::::::::::::||::::|  |\___):::::::::::::| 夏休みだからねぇ…
 :::::::::::::::::::||:::(  \:::::::::::::::::::::| せめて宿題終わってからにしてほしいよ…
 :::::::::::::(   )\_):::::::::::::::::::|
                  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
0339デフォルトの名無しさん2010/08/30(月) 18:49:35
キモ
0340デフォルトの名無しさん2010/08/30(月) 19:04:33
>>334
質問の仕方も分かってないような気がする
0341デフォルトの名無しさん2010/08/30(月) 19:42:13
すみません。
char[10] に入れている 0〜99の乱数10個をできるだけ小さなバイト数に纏めてしまいたいのですが、
int型の変数に数字とした4組並べて置く程度しか思いつかず、これじゃ変わらないじゃないか、と。orz
何か良い圧縮〜展開する方法は無いでしょうか・・?
0342デフォルトの名無しさん2010/08/30(月) 19:45:27
いくらなんでも圧縮対象が小さすぎ
0343デフォルトの名無しさん2010/08/30(月) 19:56:45
0〜99 に限られてるなら
少なくとも 100/256 で 約 39% までは圧縮可能
とりあえず bit 幅縮めることを検討してみ
0344デフォルトの名無しさん2010/08/30(月) 19:59:00
駄スレにマジレスありがとう
0345デフォルトの名無しさん2010/08/30(月) 19:59:07
>>341
おすすめはしないが
7bitで0-99の値を表せるのでビットフィールドを使いつつアライメントと詰めるようにように設定すれば削れるんじゃないかな

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

あたりまえだが
0352デフォルトの名無しさん2010/08/30(月) 20:44:08
たとえば最短で1バイトに出来るけど最悪で10バイト超えてしまうような圧縮方法でもよくて
平均で10バイト未満に出来る(66ビット以下に出来る)っていうことですね
03533412010/08/30(月) 21:04:24
>>342-352
少し難しい話でハッキリと理解できないものがありますが、
7bitずつ並べてしまえば圧縮できるのですね・・ありがとうございました。
0354デフォルトの名無しさん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数は導き出せる

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

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

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

  };
}

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

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

> typenameじゃないん?

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

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

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

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

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

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

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

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

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

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

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

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

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

Test foo()
{
  return Test();
}

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

これって問題ない?
それとも寿命切れ?
0420デフォルトの名無しさん2010/09/02(木) 19:15:04
int main() {
return main();
}
0421デフォルトの名無しさん2010/09/02(木) 19:31:14
>>419
問題ない
0422デフォルトの名無しさん2010/09/02(木) 19:35:57
寿命切れ
0423デフォルトの名無しさん2010/09/02(木) 19:58:25
問題ないがダサい
0424デフォルトの名無しさん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]とアクセスしていますが、
もしかしてこれより速い方法ってあったりします?やはりこれが最速ですか?
04254242010/09/02(木) 20:48:01
すみません、
array[0] = new int[M]; // 誤
array[0] = new int[N*M]; // 正
です。
04264242010/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
0427デフォルトの名無しさん2010/09/02(木) 21:03:15
int *array;
array = new int[N*M];
必要な時にarray[i*M+j]とアクセス
0428デフォルトの名無しさん2010/09/02(木) 21:10:35
newだから動的とかそういう問題じゃないと思うんだ
0429デフォルトの名無しさん2010/09/02(木) 21:22:40
ん?
NとMがコンパイル時に決定していないという意味だろ
それを動的というのか遅延評価というのかは知らんが
0430デフォルトの名無しさん2010/09/02(木) 21:23:48
そもそもnewは遅いからmalloc使うべき
0431デフォルトの名無しさん2010/09/02(木) 21:42:28
そこはそこまで高速化をする価値のある部分なのか?
0432デフォルトの名無しさん2010/09/02(木) 21:44:42
>>429
動的でいいんじゃね
0433デフォルトの名無しさん2010/09/02(木) 21:47:23
>>427
意外とそっちが最速かもな
一番コンパイラの最適化の恩恵受けられそう
0434デフォルトの名無しさん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;
}
0435デフォルトの名無しさん2010/09/02(木) 22:05:31
>>423
どう書くとダサくない?
コピーコンストラクタでコピー?
0436デフォルトの名無しさん2010/09/02(木) 22:12:30
419 の情報だけでは何とも言えないが
たとえば引数ってわけにはいかないのか?
04373622010/09/03(金) 02:03:21
亀スマソ
レスThanksです!

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

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

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

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

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

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

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

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

同じ要件の処理であれば、十分に最適化されていることを前提として、差が出る理由が無い。
この点で >>430 が何を根拠に「newは遅い」と言ってるのかわからない。
0472デフォルトの名無しさん2010/09/04(土) 21:50:26
そもそも>>424は確保済みの配列へのアクセス速度の話だよね
0473デフォルトの名無しさん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にはコンストラクタが追加出来ないとして。
0474デフォルトの名無しさん2010/09/05(日) 01:54:36
Foo foo[ 100 ]={0};
0475デフォルトの名無しさん2010/09/05(日) 05:44:16
>>473 boost::value_initialized<Foo> foo[ 100 ];
0476デフォルトの名無しさん2010/09/06(月) 14:09:40
>>474
> Foo foo[ 100 ]={0};

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

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


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

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

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

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

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

おそらくこれがもっとも直感的な方法かと思いますがC++が持つクラスの機能等を使って
より洗練された拡張性のあるプログラムにすることは可能でしょうか?
プロ級のみなさんでしたらどういうプログラム構造にするか教えて頂けないでしょうか?
0484デフォルトの名無しさん2010/09/06(月) 20:07:25
それひとつしか返せなくね?いいの?
0485デフォルトの名無しさん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 ? : <- データを全表示させているつもりだが、全然表示されない。

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

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

ですよね(´・ω・`)

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

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

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

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


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

のようにvector型の配列を返すメソッドにし、最後にそれらのANDを取るというのがスマートな方法ということでしょうか?
0499デフォルトの名無しさん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にも対応させた方がスマートだろうけど。
0500デフォルトの名無しさん2010/09/07(火) 01:24:02
>>473-478
C++0x だとデフォルトコンストラクタしかないクラスが 0 で初期化できるの?
0501デフォルトの名無しさん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 };

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

その 11 以上ってのは本当に「定数」か?
他の何かから演繹される数値ではないのか?
0504デフォルトの名無しさん2010/09/07(火) 13:47:46
enum{
X_CARROT,
X_SANDAL,
…
X_11,
X_12,
…
ってことか?頑張って手動で入力するしかないんじゃ無いだろうか
0505デフォルトの名無しさん2010/09/07(火) 14:18:05
例;
//1から10の場合
T a =ONE
T b=TWO
11以上の場合
T c=11
T d=12
0506デフォルトの名無しさん2010/09/07(火) 14:19:03
typedef enum _tag_XXX : int {
a,
b,
c = 8,
d,
e,
}XXX;

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

0514デフォルトの名無しさん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
}
こんな感じ?
警告は無理じゃね
0515デフォルトの名無しさん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で再コンパイルしてもらう必要がありますよね。

こういった事態を防ぐ、何か上手い方法はありますでしょうか。
0516デフォルトの名無しさん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 でした!)、強引に必要なデータをねじ込む
05175162010/09/07(火) 19:13:26
ごめん。 良く読んだらDLL作る方が不特定多数なのか。 じゃあ a の案はナシで。
代わりに
e) 構造体の最後に新しいメンバを追加するだけなら前の部分は変わらないので、新しく増えたメンバは単に無視する
05185152010/09/07(火) 20:02:54
>>516-517
いやはや、5案も挙げていただき恐縮です。

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

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

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

お付き合いいただき、ありがとうございました。
0519デフォルトの名無しさん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に渡す型毎のプレディケートとするつもりです。

以上よろしくお願い致します。
0520デフォルトの名無しさん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でも読め。
0521デフォルトの名無しさん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;
}
05225192010/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;
}
05235192010/09/08(水) 00:03:42
見返してみたら、せっかく作ってくださった
foo使っていなかったりと結構おかしいことになってますね。
うーむ。
05245192010/09/08(水) 00:33:05
それと、>>520の「コンパイル時の条件分岐」という言葉をググって
http://codepad.org/HU57E14p
を書いてみましたが、これもコンパイルが通りません。

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

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

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

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

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

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



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

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

int e = (int)(a * b);
0543デフォルトの名無しさん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
これが同じ結果にならないのが不思議で・・・。
これって実は全然違うキャストなんでしょうか?

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

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

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

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

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

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

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

という感じのクラスが真っ先に思いつきましたが、それ以外に
05534832010/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、日付以外にたとえばメール欄で検索をかけたくなったときとか容易に
拡張できます。

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

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

それはおかしいだろ。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

検索は一レス単位で行うので検索のメソッドもResクラスに入れるのが常套かと思いまして・・・
0634デフォルトの名無しさん2010/09/09(木) 22:27:38
レス単位で行われるのは検索じゃなくて
条件にあってるかどうかの判定だろ?
06354832010/09/09(木) 22:32:47
>>634
はい、そういうことになります。
0636デフォルトの名無しさん2010/09/09(木) 23:11:26
くだらない質問かもしれませんが
あるクラスについて、基本的にある型の変数のみをメンバ変数に持ち
メンバ関数にはその型に関連が強い関数や元の型の痒いところに手がとどくような関数を入れる
例)CHWND h = hWnd; if( h.IsWindow() ) return;
 CTCHAR str1="abc",str2="abc"; str1 += str2;
このようなたぐいのクラスには何か名前がついてますか?
0637デフォルトの名無しさん2010/09/09(木) 23:35:37
>>636
プリミティブ型をオブジェクトとして扱うためのラッパークラスみたいなやつのこと?
0638デフォルトの名無しさん2010/09/09(木) 23:47:00
>>637
ラッパークラスぐぐってみましたがまさにこれですね
ラッパークラスというのは耳にしたことはあるのですがこれがそうだったんだ
どうもありがとうございます
0639デフォルトの名無しさん2010/09/09(木) 23:49:18
俺だったらアダプタにするかな
0640デフォルトの名無しさん2010/09/10(金) 00:13:45
>>633
Resは検索される方なんだから、引数のIDや名前、日付と一致するか等々を
返す関数を持たせておけばいいじゃん。
検索する関数はコンテナクラスに入れるのが普通だと思うけどな。
0641デフォルトの名無しさん2010/09/10(金) 11:04:16
個々のResとやらが検索関数持っててもどう実装する気なのかな
他の Res の事なんか知らないはずなのに
ちゃんと考えてるんだろうか…
0642デフォルトの名無しさん2010/09/10(金) 16:31:42
javascriptのようなスクリプト言語をつくってしまい、
その言語で複雑な条件の検索をできるようにする。
0643デフォルトの名無しさん2010/09/10(金) 16:46:59
組み込みDB使ったほうが早いだろw
06444832010/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用のレスクラス、日付用のレスクラスを用意するべきか、
悩みどころです・・・
0645デフォルトの名無しさん2010/09/10(金) 21:59:27
>>644
>643じゃないけどSQLiteでも使ったら? 好きなだけ検索方法を試せるよw
0646デフォルトの名無しさん2010/09/10(金) 22:09:20
res.match_body()
res.match_date_between()
...
0647デフォルトの名無しさん2010/09/11(土) 01:23:40
ダブルディスパッチ,衝突判定でググって
上位にくるページのサンプルコードをg++(version4.4.3)で
コンパイルしたところ,呼び出した関数がprotectedだって
コンパイラに怒られました.なんで?
0648デフォルトの名無しさん2010/09/11(土) 01:27:53
>>647 きっと呼び出した関数がprotectedだからだ。そうにちがいない。
0649デフォルトの名無しさん2010/09/11(土) 02:45:10
なんで最低でもそのページのURLを書かないんだろう?イミフ
0650デフォルトの名無しさん2010/09/11(土) 03:08:14
protectedだからな
0651デフォルトの名無しさん2010/09/11(土) 03:50:31
protected は中途半端。
方針としては中途半端。
「見えちゃ嫌だけどちょっとは見えたほうが」
そんなの微妙すぎ。
06526472010/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 );}
}
0653デフォルトの名無しさん2010/09/11(土) 08:32:22
>>652
URLも書いちゃいけないようなところを参考にするなよ、馬鹿。
0654デフォルトの名無しさん2010/09/11(土) 09:48:40
>>652
VC++ でも protected の挙動が違うようなことは聞いたことがないなぁ。
たぶん確認せずに載せてるんだろう。

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

糞の役にも立たない自説を披露する前にこの辺を指摘してやれよ
0656デフォルトの名無しさん2010/09/11(土) 10:26:48
>>655
最初の other->Action( this ) までで問題は明らかなんで、その先は読んでなかった。
あらためて読み直してそこや他もいくつかおかしい気がしたけど、やっぱりどうでもいい。
0657デフォルトの名無しさん2010/09/11(土) 11:03:08
>>651,655
指摘された箇所と親クラスのprotectedをpublicにしたら,
それらしく動きました.ありがとうございました.
0658デフォルトの名無しさん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
0659デフォルトの名無しさん2010/09/11(土) 13:14:10
>しかし、インターネット掲示板を中心に、荒らし誘導目的の「晒し」や
>誹謗中傷が少なからずウェブで行われているなど、
>「インターネットの知を豊かにする」というウェブの理念自体が
>一部で形骸化している現実がある。そのような背景から、
>いわゆる「悪意のあるリンク」はモラル面から批判されることがある。
0660デフォルトの名無しさん2010/09/11(土) 14:16:48
直リン禁止論とはまた懐かしいネタが出てきたなw
0661デフォルトの名無しさん2010/09/11(土) 15:51:48
アルゴリズムの実行速度を測るにはどうやってやりますか?
0662デフォルトの名無しさん2010/09/11(土) 15:58:01
>>661
アルゴリズムだけ入れ替えて実測する
プロファイラ走らす
0663デフォルトの名無しさん2010/09/11(土) 16:05:55
>>661
アルゴリズムに癖があるなら、その癖を突くデータを用意したりする。いいほうと悪いほうと汎用なほうと。
0664デフォルトの名無しさん2010/09/11(土) 16:07:20
そういうことじゃなくて
測るためのコードを教えてください。
0665デフォルトの名無しさん2010/09/11(土) 16:25:19
絶対にいやです
0666デフォルトの名無しさん2010/09/11(土) 16:26:39
>>664
C++では測定する関数が無いから出来ないと思った。
Javaならできる確か・・・
0667デフォルトの名無しさん2010/09/11(土) 16:28:38
>>664
クラスにしても20行くらいだぜ?簡単だろ?
0668デフォルトの名無しさん2010/09/11(土) 16:43:22
偉そうな小出し質問は嫌なもんだな

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

コンストラクタとデストラクタ以外を protected にせずに
インターフェース以外は private にすると再利用性の高いクラスが出来上がるんだぜ
protected なメンバーをもつクラスを書くやつは間抜けに見えるんだぜ
0688デフォルトの名無しさん2010/09/11(土) 22:00:43
>>687
privateだと派生先では使えなくなるわけだが、再利用性が高いってどういうことだろう。
派生先で元のprivateの機能を使いたくなった場合はどうすりゃいいんだ?
0689デフォルトの名無しさん2010/09/11(土) 22:03:51
privateの機能を使おうとすんなよ
0690デフォルトの名無しさん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;
};
0691デフォルトの名無しさん2010/09/11(土) 22:09:30
>>689
いや、protectedは使わずpublic意外は全部privateにしろって話だろ。
要するにprivateな部分は派生先で全部実装し直せってことか。
ちょっと機能を変えたいって場合は、派生なんかしないで元を直せって話なのかな。
0692デフォルトの名無しさん2010/09/11(土) 22:18:48
>>690
class Aが抽象クラスになっちゃってインスタンス化できないんだけど、それはいいのか。
利点がよくわかんね、俺protectedでいーや。
0693デフォルトの名無しさん2010/09/11(土) 22:19:25
コンストラクタ以外は全部virtual
public以外は全部protected
privateは禁止
だろ常考
0694デフォルトの名無しさん2010/09/11(土) 22:30:08
まあ頭がおかしいんならそれでいいのかもね
0695デフォルトの名無しさん2010/09/11(土) 22:37:21
友達の事忘れてない?
0696デフォルトの名無しさん2010/09/11(土) 23:26:29
->*がオーバーロードできるのに.*がだめなのはなんか深い理由があるの?
0697デフォルトの名無しさん2010/09/11(土) 23:29:00
そもそも.*でオーバーロードが必要になる状況がありえないだろう。
0698デフォルトの名無しさん2010/09/11(土) 23:29:59
>>697ごめん間違えたは、何言ってんだオレは。
つーか、.*でもオーバーロードはできんだろ。
06996872010/09/11(土) 23:30:01
protected なメンバーが必要な場合とは
派生先が派生元の機能を使うとき

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

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

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

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


そもそも「派生元のprivateの機能」という考え自体も少しおかしい。
private であればそれは機能ではない。
0701デフォルトの名無しさん2010/09/12(日) 02:23:36
オブジェクト指向とコンポーネント指向をごっちゃにした極論にしか見えない。
0702デフォルトの名無しさん2010/09/12(日) 02:31:36
protected なんて使う奴は実装継承を平気でするような奴なので危ない。
0703デフォルトの名無しさん2010/09/12(日) 02:47:51
CRTPやそのたもろもろ継承前提のクラスなんていくらでもあるだろ
07046872010/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;
};
0705デフォルトの名無しさん2010/09/12(日) 03:12:27
>>700の話で、なるほどと思ったんだけど、>>704の話は意味不明だな。
クラスツリーを分割するってどんな状況だよ、根本的に設計ミスだろそれ。
そこまでするなら派生なんか不要で、抽象クラスだけ使えってことになるだろう。
07066872010/09/12(日) 03:51:07
>>705
まぁ>>704がすべてじゃなくて、そんなことも簡単にできるほど再利用性が高いってことね
それに設計ミスなんてよくあることでしょ
最初は分割不可能な機能群だと思っていたものが
良く考えてみると全く直行してることに気づくなんて、しょっちゅうあるんじゃない?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Pointクラスを持つWindowクラスは、Point型変数の具体的な操作であるMove関数を提供するべき?
それともSetterを提供するべき?
.NETのライブラリではプロパティが多用されていることがあったので、どういう指針で決めたらいいか悩んでます。
言語側でプロパティのサポートがあるかないかという環境の違いなんでしょうか。
0816デフォルトの名無しさん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; }
};

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

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

class Kaibutsu
{
Hoge hoge;
};

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

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

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

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

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

0848デフォルトの名無しさん2010/09/13(月) 21:38:54
>>847
海外のコーダーが書いたものについて言ってるんだが
0849デフォルトの名無しさん2010/09/13(月) 21:46:19
リアリティって重要だよね
で、具体的にどのオプソプロジェクト?
0850デフォルトの名無しさん2010/09/13(月) 22:18:31
>>845
RoRみてみろ
0851デフォルトの名無しさん2010/09/13(月) 22:44:42
単純なget/setはクラスの内部状態を公に晒してるだけだから、極力なくせと言ってるわけ。
便利だから使いたいとかそんなレベルの話ではない
0852デフォルトの名無しさん2010/09/13(月) 22:45:56
く
ど
い
0853デフォルトの名無しさん2010/09/13(月) 22:47:07
なんで同じ話するわけ
0854デフォルトの名無しさん2010/09/13(月) 22:49:45
ごめんね当たり前の話だったね
0855デフォルトの名無しさん2010/09/13(月) 23:00:53
>>851
なんでアクセッサがpublic前提なんだよおまえは。
0856デフォルトの名無しさん2010/09/13(月) 23:02:57
privateなら良いんじゃない
0857デフォルトの名無しさん2010/09/13(月) 23:03:09
>>851
>>855
何度目だwww
0858デフォルトの名無しさん2010/09/13(月) 23:04:28
winnyはC++でwindowsネイティブで作られていましたが、
マルチプラットフォームにするためにqtやgtkを使って作られていたら

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

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

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


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


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

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

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

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

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

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

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

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

implementation body;

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

出来ますがなにか?
0915デフォルトの名無しさん2010/09/14(火) 12:40:10
>>914
できてねーよカス
0916デフォルトの名無しさん2010/09/14(火) 12:42:09
できてますよ
0917デフォルトの名無しさん2010/09/14(火) 12:44:46
うん 出来てるし 本にも乗ってる。
0918デフォルトの名無しさん2010/09/14(火) 12:45:07
それじゃ新しいテンプレートクラスの実体化なしで実装切り替えらんねーだろカス
クラス数の爆発を抑えるためのbridgeパターンだろうが
真逆の方向に行ってどうすんだハゲ
0919デフォルトの名無しさん2010/09/14(火) 12:46:54
実装と定義の分離が目的じゃなかったっけ?
0920デフォルトの名無しさん2010/09/14(火) 12:58:36
Impが10パターンあったらAbs<Imp>を継承したクラスを1つ作ろうと思っただけで同じようなクラス定義を10回も書かないといけないとか面倒すぎる
0921デフォルトの名無しさん2010/09/14(火) 13:03:13
Abs<Impl , int>にするとか
Abs2<Impl>を作るとかの発想は無いの?
0922デフォルトの名無しさん2010/09/14(火) 13:05:14
継承先に継承もとの実装を預けるなんて設計がまともな設計だと思ってるのか?
0923デフォルトの名無しさん2010/09/14(火) 13:06:31
テンプラにするとコピーも代入もできないじゃん
0924デフォルトの名無しさん2010/09/14(火) 13:06:40
テンプレートだらけになって切り替えるのがだるそう
0925デフォルトの名無しさん2010/09/14(火) 13:10:51
つーかそれブリッジじゃなくてポリシーだし
0926デフォルトの名無しさん2010/09/14(火) 13:23:15
未だにテンプレートについていけない親父臭が漂ってるなwww
0927デフォルトの名無しさん2010/09/14(火) 13:24:22
え?テンプレートをちゃんと知ってるからこの場では否定的な意見がでるんだろ
0928デフォルトの名無しさん2010/09/14(火) 13:33:57
>>909
できない
0929デフォルトの名無しさん2010/09/14(火) 15:03:51
>>909
できる
09308582010/09/14(火) 20:37:17
>>860
ありがとう
0931デフォルトの名無しさん2010/09/14(火) 21:31:05
できない
0932デフォルトの名無しさん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;
};

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

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

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

既にあるクラスの再利用なんだし、むしろそれが継承の醍醐味な気がするが。
0968デフォルトの名無しさん2010/09/16(木) 23:39:00
>>967
いえ、自分まだ素人でして↑のレスを読んでると
そういうCの関数用のstruct、つまりクラスとか想定されてないところに
勝手にC++の付属物をくっつけるのがなんだか怖くなってきて
0969デフォルトの名無しさん2010/09/16(木) 23:44:49
童貞みたいな発言だな
0970デフォルトの名無しさん2010/09/16(木) 23:49:23
>>968
それがextern "C"とかで宣言されている外部の関数とかとやりとりするための
structなら、しないほうがいいかもね。
継承ではなくて、別のクラスにくるんで使う方がいい場合もある。
指針としては、dynamicキャストを使わないで(staticキャストはOK)、書ける間は
そんなに気にしなくていいんじゃないかな。
09719512010/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);
0972デフォルトの名無しさん2010/09/17(金) 00:06:34
>>970
>extern "C"とかdynamic_cast
聞いたことはありますがまだ実際に使ったことはないですね
普通に正式っぽいのでよかったです
問題にぶち当たったらまた再考してみます、俺みたいなヘタレにどうもありがとうございました
0973デフォルトの名無しさん2010/09/17(金) 00:24:20
>>972
相当な初心者だったのか。
道はめっちゃ険しいけど、まあまあ楽しいし、頑張ってくれ。
0974デフォルトの名無しさん2010/09/17(金) 00:25:52
>>970
dynamicキャストを使うなんて、C++のクラスだろうが何だろうが、逃げです。
デスマーチへの近道です。

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

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

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

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

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