C++相談室 part98

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
最近勉強始めた超初心者なんだが
参考書のプログラム書いてコンパイル時に
エラーE2316 seftはostreamのメンバーではない関数ってエラーが出てしまった。
原因が自分で調べてもわからなかったんで
分かる人が居たら教えて欲しい。
以下ソース↓

//seft02.cpp
#include <iostream>
using namespace std;

int main()
{

int a = 10, b = 100;

cout << "16進数表示" << endl;
cout.seft(ios::hex, ios::basefield);
cout << "a = " << a << endl;
cout << "b = " << b << endl << endl;

return 0;
}
2デフォルトの名無しさん:2012/09/18(火) 22:37:42.68
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。

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

                  京都大学霊長類研究所
3デフォルトの名無しさん:2012/09/20(木) 01:14:50.74
柵(しがらみ)
4デフォルトの名無しさん:2012/09/20(木) 07:40:38.24
なんでスレ立ててんだよ
こっちでやれ そしてここは削除依頼しろ

C++相談室 part98
http://toro.2ch.net/test/read.cgi/tech/1345823164/
5デフォルトの名無しさん:2012/10/02(火) 12:43:40.65
で?
6片山博文MZボット ◆0lBZNi.Q7evd :2012/10/05(金) 17:11:21.25
>>1 setfの間違い。
7デフォルトの名無しさん:2012/10/09(火) 15:17:04.62
このスレはpart99という事にして再利用するか?
8デフォルトの名無しさん:2012/10/09(火) 17:55:54.85
えっと、次ここでいいのか?
======
初期化リストを返す関数って許されていますか?
下に貼るコードの動作がおかしくて困っています。
また、forward_listにすれば解決はしますが、
何度も呼ばれる場合、パフォーマンスは初期化リストの方がいいですよね?

#include <iostream>
#include <utility>
#include <initializer_list>

std::initializer_list<int> test(const std::pair<int,int>& e) {
//return {1,2,3}; //ok!
return {e.first,e.second,e.first}; //undefined?
}

int main()
{
for (auto i: test(std::make_pair(1,2))) {
std::cout << i << std::endl;
}
}
9デフォルトの名無しさん:2012/10/09(火) 17:58:26.82
ムリポ
10デフォルトの名無しさん:2012/10/09(火) 18:02:40.44
コンパイルは普通に通っちゃうんだけど・・・
11デフォルトの名無しさん:2012/10/09(火) 19:19:31.39
うん
12デフォルトの名無しさん:2012/10/09(火) 19:59:56.90
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part98
http://toro.2ch.net/test/read.cgi/tech/1347964922/
(従ってこのスレは実質part99となります)

姉妹スレ
【初心者歓迎】C/C++室 Ver.80【環境依存OK】
http://toro.2ch.net/test/read.cgi/tech/1348161305/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 http://ideone.com/
13デフォルトの名無しさん:2012/10/09(火) 20:00:23.94
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 http://en.cppreference.com/w/cpp (英語)
 http://ja.cppreference.com/w/cpp (↑の日本語訳だけどまだ未完)
[Stroustrup]
 http://www.stroustrup.com/
[C++ International Standard]
 http://www.iso.org/iso/iso_catalogue/catalogue_ics/catalogue_detail_ics.htm?csnumber=50372
[JTC1/SC22/WG21 - C++]
 http://www.open-std.org/jtc1/sc22/wg21/
  ここから規格の最新ドラフトがダウンロードできる。
[JIS X3014]
 http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3014
  ISO規格の日本語訳。JIS X3014:2003はISO/IEC 14882:2003 (E)に対応。
14デフォルトの名無しさん:2012/10/09(火) 20:00:40.96
15デフォルトの名無しさん:2012/10/09(火) 20:00:57.50
16デフォルトの名無しさん:2012/10/09(火) 20:01:45.65
■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
17デフォルトの名無しさん:2012/10/09(火) 20:02:14.68

STLつかうと一気に実行ファイルサイズが10倍に?!

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

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

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

#include <stdafx.h>
後死ね。

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

------------------------------------------------------------------

一応テンプラ書きました
18デフォルトの名無しさん:2012/10/09(火) 20:05:43.99
>>8
http://cpplover.blogspot.jp/2011/05/initializerlist.html

こんなのがあるからだめだろうね
規格票にはどう書いてあるか探してみるけど
19デフォルトの名無しさん:2012/10/09(火) 20:23:51.86
>>18
ありがとうございます。
しっかし委員会の人たちは本当に偉いな・・・。
何年も前から知ってるけどこれからも頑張ってほしい。
20デフォルトの名無しさん:2012/10/10(水) 10:57:08.46
Pimplイディオムの意義がよく分かりません

コンパイル時間を縮めるとあるのですが、どうにも理解出来なくて・・・
21デフォルトの名無しさん:2012/10/10(水) 12:30:55.50
パンプル
22デフォルトの名無しさん:2012/10/10(水) 12:32:19.98
インターフェースさえ決まっていれば中身を何度変更しようがコンパイルされるのは1つのcppだけで済む
23デフォルトの名無しさん:2012/10/10(水) 13:03:35.50
PImplで作ったオブジェクトをコピーすると普通の方法ではポインタが指す実体が一つしかないため
Deep Copyにならない

インターフェース内に代入演算子関数やコピーコンストラクタを書くと正常に動作するがそうすると
中身を変更する度に代入演算子やコピーコンストラクタも変更しなければならないため
PImplの意味が失われてしまう

コピーしない場合に限りPImplを使うか、コピーするための特別なスマポを作る必要がある
24デフォルトの名無しさん:2012/10/10(水) 15:01:13.98
pimpl_ptrとか一回作ればその問題は終わりだろ
素人でも1時間あればそれなりのものは作れる
25デフォルトの名無しさん:2012/10/10(水) 16:28:50.17
クラスでnewを使って
動的にインスタンス生成することの
メリットが分かりません
教えて下さい
26デフォルトの名無しさん:2012/10/10(水) 16:31:22.54
>>25
ばーか^^
27デフォルトの名無しさん:2012/10/10(水) 16:33:15.75
あっはっは
28デフォルトの名無しさん:2012/10/10(水) 18:44:15.40
>>25
メリットなんなない。
止めたほうがいい。
29デフォルトの名無しさん:2012/10/10(水) 21:09:39.72
>>20
1. コンパイル時間を縮める
2. private メンバをヘッダから隠せる

これが pimpl の意義

通常は private メンバを変更しただけで
そのヘッダをインクルードしている全ての .cpp が再コンパイルされる
private メンバなんて外部から見えないのだから、これは非常に不合理だと言える

pimpl を使えば private な実装が全て1つの .cpp 内に収まるので
private な実装を変更する限りにおいては1つの .cpp が再コンパイルされるだけで済む

また、private な実装を他から隠匿出来るという点が
商業的に役に立つ場合がある


ただ、pimpl 以外にも似たような事を行う方法はある
まずインタフェースだけのクラスを作って、
そのクラスを継承して実装し、その派生クラスの生成関数だけを外部に公開する、というもの


両者は1, 2の目的を満たしているという点でよく似ているけど、
生成したメモリを管理する責任の所在が異なるというのと、
あとはここから更に継承したいという場合に違いが出てくる
30デフォルトの名無しさん:2012/10/10(水) 22:47:52.39
>>29
> 通常は private メンバを変更しただけで
> そのヘッダをインクルードしている全ての .cpp が再コンパイルされる

private関係ねえぞ。
お前の書くソースは汚そうだ。
31デフォルトの名無しさん:2012/10/10(水) 22:50:08.83
pimplって何て発音するの?
32デフォルトの名無しさん:2012/10/10(水) 22:50:59.05
>>29
> 通常は private メンバを変更しただけで
> そのヘッダをインクルードしている全ての .cpp が再コンパイルされる

「再コンパイルされる」じゃねえぞ。
「しなければ問題が起きる」もしくは「実害の有無に関わらず、すべきである」のいずれかの問題だ。馬鹿が。
33デフォルトの名無しさん:2012/10/10(水) 22:51:39.57
>>31
ぽいんぽる
34デフォルトの名無しさん:2012/10/10(水) 23:15:12.62
今日はウソツキ村からの観光客がやけに多かったですね
35デフォルトの名無しさん:2012/10/10(水) 23:18:56.62
36デフォルトの名無しさん:2012/10/10(水) 23:20:44.61
>>31
http://translate.google.co.jp/#en/ja/pimpl

左の窓の下のスピーカーのアイコンクリックしてみ
37デフォルトの名無しさん:2012/10/10(水) 23:29:03.82
>>32
まともなプログラマなら「通常は」依存関係を元に
自動的に再コンパイルされるような環境でプログラムするので
「通常は」再コンパイルされる

理論的に再コンパイルしなくても実害がない場合もそりゃあるが(メンバ関数だけ増やした時とか)、
それでもまともな環境でプログラムしてりゃ通常は再コンパイルされる
38デフォルトの名無しさん:2012/10/10(水) 23:30:37.25
cppファイルあるのにprivateメンバなんて書くか普通?
普通に匿名名前空間に関数おけばいいだろ
39デフォルトの名無しさん:2012/10/10(水) 23:54:08.10
publicメンバにしか触れないじゃん
40デフォルトの名無しさん:2012/10/11(木) 00:05:14.51
>>39
こいつ最高にアホ
41デフォルトの名無しさん:2012/10/11(木) 00:06:51.78
メンバ変数への参照を渡すって事か
正直プログラムが読み辛くなるだけだぞ
42デフォルトの名無しさん:2012/10/11(木) 00:13:16.08
>>41
いっぺんやってみればわかるけど関数にしたほうがわかりやすい
引数で副作用を絞れるからバグも減るから良いことしかない
43デフォルトの名無しさん:2012/10/11(木) 00:38:45.61
>>37
再コンパイルされるなら何も問題ないんじゃない?
44デフォルトの名無しさん:2012/10/11(木) 01:49:11.69
>>25
・生成するインスタンスの数を実行時に決定できる
・インスタンスの寿命をより自由に制御できる
45デフォルトの名無しさん:2012/10/11(木) 06:49:02.39
全コンパイルに数時間かかるシステムの構築に関わればpimplのありがたみがわかるよ
46デフォルトの名無しさん:2012/10/11(木) 06:51:22.72
>>32
それは確かに問題だろうが、
今の論点とは関係ないだろ
47デフォルトの名無しさん:2012/10/11(木) 07:31:15.33
>>43
時間がかかる
48デフォルトの名無しさん:2012/10/11(木) 07:31:55.62
>>42
そんな変なプログラムは他の人が保守し辛い
49デフォルトの名無しさん:2012/10/11(木) 08:44:31.29
>>48
そういう実装を好む会社と仕事をしたことがあるが、
完全に C の思想になっていると感じた
50デフォルトの名無しさん:2012/10/11(木) 09:50:35.03
なんでもかんでも自分でやりたい奴って思考がCだよな
51デフォルトの名無しさん:2012/10/11(木) 09:52:55.22
>>50
確かに
Cはもう時代遅れになりかけている
それにもかかわらず高いシェアを未だに誇っているというのはCOBOLと同じで
老害が多いって事
52デフォルトの名無しさん:2012/10/11(木) 10:59:55.01
COBOLは保守が主なんだから老害なんていったらバチが当たるぞ
53デフォルトの名無しさん:2012/10/11(木) 11:04:36.12
保守してる奴は老害だろ
54デフォルトの名無しさん:2012/10/11(木) 12:05:59.72
なんじゃそりゃ。アホかいな。
55デフォルトの名無しさん:2012/10/11(木) 12:40:29.28
>>51
Cでなきゃ何でファームウエアやドライバを書くんだ
方言は当然ありとして
おまえら結局ファームエアもドライバも作りたくないって
仕事をえり好みしてるだけだろ

若いのがそんなていたらくであることが
今の製造業のピンチを招いたんだよ
56デフォルトの名無しさん:2012/10/11(木) 12:41:42.58
>>55
典型的な老害思考
C++で書いてもCと同じように書けば問題ない
57デフォルトの名無しさん:2012/10/11(木) 12:46:16.41
C++でかいたらでかくなるでしょ
58デフォルトの名無しさん:2012/10/11(木) 12:47:31.06
小さくて速いのがいいのだ
59デフォルトの名無しさん:2012/10/11(木) 12:49:38.71
>>57
Cの機能だけを使えばならねーよアホ
使った事ねーんだな
60デフォルトの名無しさん:2012/10/11(木) 12:51:40.95
>>58
かぶりものは?
61デフォルトの名無しさん:2012/10/11(木) 13:32:56.35
>>56
方言はありだと言っただろう
Cの流れを汲む言語をすべて含むという意味だ
おまえせいぜい片手できくくらいしか知らねえだろ

それから C++ の C にない機能をふんだんに使っても
ヘボがバカやらない限り問題なんか起きねえよ
要注意は例外と RTTI くらいだがコンパイラのマニュアルをよく読むこった
62デフォルトの名無しさん:2012/10/11(木) 13:34:57.28
>>61
それ論理的におかしなことになってるだろ
63デフォルトの名無しさん:2012/10/11(木) 13:39:10.13
>>50 「なんでもかんでも自分でやりたい奴って思考が(C++ではなく)Cだよな」
>>51 「確かに (C++と違って)Cはもう時代遅れになりかけている」「それにもかかわらず高いシェアを未だに誇っているというのはCOBOLと同じで老害が多いって事」
>>55 「Cでなきゃ何でファームウエアやドライバを書くんだ 方言は当然ありとして 」
>>56 「典型的な老害思考 C++で書いてもCと同じように書けば問題ない 」
>>61 「方言はありだと言っただろう Cの流れを汲む言語をすべて含むという意味だ (ゆえにC++はCに含む)」
64デフォルトの名無しさん:2012/10/11(木) 13:40:15.17
61は頭悪そう
65デフォルトの名無しさん:2012/10/11(木) 13:54:37.24
>>63
つまりアレか
C++ 独自の機能が C の何に相当するか見通せてないんだな
クロージャや intializer_list がおまえにとっては魔法の箱か
66デフォルトの名無しさん:2012/10/11(木) 14:03:46.17
>>65
何そのちぐはぐな反応は
67デフォルトの名無しさん:2012/10/11(木) 14:10:56.72
>>66
何だその荒唐無稽な反応は
68デフォルトの名無しさん:2012/10/11(木) 18:45:59.59
>>66
何だその焼肉定食な反応は
69デフォルトの名無しさん:2012/10/11(木) 20:14:59.88
>>57
C++で書くと大きくなる妄想乙
70デフォルトの名無しさん:2012/10/11(木) 20:55:56.43
実際でかくなるでしょ
71デフォルトの名無しさん:2012/10/11(木) 20:56:27.98
C++じゃだめだ
72デフォルトの名無しさん:2012/10/11(木) 20:57:45.95
おなじ機能で、C版とC++版をつくってるよ。いつもC++のほうがでかい
73デフォルトの名無しさん:2012/10/11(木) 21:00:51.40
コンパイラによるだろ
VCやgccはiostreamや例外を使わないとほとんど同じになっちゃうぞ
74デフォルトの名無しさん:2012/10/11(木) 21:08:36.00
増加分の具体的な明細に立ち入ったことないやつがテキトーほざいてるだけだよな
75デフォルトの名無しさん:2012/10/11(木) 22:24:39.39
例外処理は仕方ないとしても
IOstreamはライブラリとかじゃなく
別言語に移管し改めてitegrateすべき時期に来たと思うんだ
76デフォルトの名無しさん:2012/10/11(木) 22:27:23.16
自分一人で勝手にしてれば?
77デフォルトの名無しさん:2012/10/12(金) 00:00:08.10
>>72
そりゃSTLをたっぷり使うとか、大きくなるような書き方をしてるだけだ
78デフォルトの名無しさん:2012/10/12(金) 01:20:31.64
>>48
その程度で保守できなくなるなんてよほどの低脳なんだなぁ

class Type {
OtherType m;
void PrivateFunc();
public:
void Method();
};

void Type::PrivateFunc() { m.DoSomething(); }
void Type::Method() { PrivateFunc(); }

これを

class Type {
OtherType m;
public: void Method();
};

static void PrivateFunc(OtherType & m) { m.DoSomething(); }
void Type::Method() { PrivateFunc(m); }

こうすればコンパイルコストの削減、不要なメンバアクセスによる副作用の予防といった明らかなメリットがデメリットなしに見込める
たったそれだけの話なのに何がそんなに難しいんだろうか?
低IQの脳みそって本当にかわいそうだわ

79デフォルトの名無しさん:2012/10/12(金) 01:44:36.84
>>78
コンパイルコストごときを理由にそういう設計が振り回されるか
80デフォルトの名無しさん:2012/10/12(金) 01:46:46.23
>>79
逆に聞くがこれを否定する論理的な理由は?
81デフォルトの名無しさん:2012/10/12(金) 01:47:18.00
class Type {
OtherType m;
public: void Method() { m.DoSomething(); }
};

これでいい
82デフォルトの名無しさん:2012/10/12(金) 01:48:53.40
>>80
privateメソッドの仕様はクラスの仕様と不可分
クラス外で定義するのは危ないよな
83デフォルトの名無しさん:2012/10/12(金) 01:50:30.01
>>78
あなたの言ってるメリットは、実装以降どころかコンパイル以降の話。
それらの都合のためにオブジェクト指向を否定するかのごとく設計に犠牲を強いているようだ。
84デフォルトの名無しさん:2012/10/12(金) 01:56:45.12
>>82
危ないって?
匿名関数のどこが危ないの?
85デフォルトの名無しさん:2012/10/12(金) 01:58:13.95
>>83
C++はもともと純粋なオブジェクト指向言語じゃないですよ?
あなたのほうこそ自分の勝手な都合でC++の能力を犠牲にしていませんか?
86デフォルトの名無しさん:2012/10/12(金) 02:17:04.10
>>78
> static void PrivateFunc(OtherType & m) { m.DoSomething(); }

これが綺麗に見えるのは幻覚。
使っているprivateメンバー変数がたった一個だから。
このメンバーも使おう。さらにこれも、と追加していったとき、
privateの範囲内で当該クラスに閉じた世界の話になるはずなのに、
そのやり方していたら、そのクラスとクラス外の様々なstatic関数に広く影響を与えることになる。
そんな作り方してると内部仕様の変更に対する隠れた抵抗勢力になる。
そういうのでがんじがらめにしておくと、悪い方への変化はしやすいけど、良い方への変化はしにくくなる。
それは誰かを陥れるために使う戦略で、日常は使うな。
87デフォルトの名無しさん:2012/10/12(金) 02:19:03.43
>>78
君はその道を突き進めばいいと思うよ
俺はついていかないけど
でもそっちの世界の人達も頑張って欲しい
88デフォルトの名無しさん:2012/10/12(金) 03:59:30.89
>>86
ねえ君はアホなの?
短いレスでサンプルを示すためにあえて十分小さい例を出しただけなのに、それに噛み付いてくるなんて言葉遊び覚えたばかりの中学生みたいな反応で笑えるね
メンバーが増えれば増えるほど匿名関数のほうが有利になるんだけど?
増えたメンバーのうちその処理にひつようなメンバのみにアクセスを絞ることができるから
メンバ関数を直接書くより遥かに信頼性、安全性が高い
馬鹿はメンバ関数そのまま書いて無秩序にメンバにアクセスし整合性を保つ難易度を上げている

というかそもそも君はなにか勘違いしてるだろ
この匿名関数はそのクラスのプライベートメンバとして作られるのだから
クラスの内部仕様の変更でこの匿名関数に変更があってもクラスの外部には1バイトも影響しないんだが?
まずそこから理解することからはじめよう
なにごとも最初の一歩が肝心だよ
君は初心者かもしれないけどそこはちゃんと押さえておこう。いいね?
89デフォルトの名無しさん:2012/10/12(金) 05:57:25.74
>>88
ひとまとめにしてなんかの意味を持たせようというところにクラスの意義があり、それはprivateなメソッド(メンバ関数)とて同じことなのだが、
それをわざわざstaticな関数にばらし、クラスのメンバ変数の形にばらし、と要素にくだり細部フォーカスとするのは、それではなんのためのクラスか首をかしげるのだが?
privateなメソッドであっても、そのクラスがクラスの形を保っていることに意味があるんでは?

それともprivateな処理は、クラスというまとまりをばらしてしまうことの方がおおいのか?
static な関数の引数に、クラスのメンバ関数がずらずら並ぶのは、アクセスを明示する意味ではいいのだが、他にメリットがみえてこない
むしろ「まとまり」を欠いた散漫なコードにみえる
90デフォルトの名無しさん:2012/10/12(金) 14:27:48.59
コンパイルを速くするためだけにクラスをばらばらにする奴とは一緒に仕事したくないな
91デフォルトの名無しさん:2012/10/12(金) 14:32:17.15
>>78
それでコンパイルコスト削減になってると思うのがチャンチャラおかしい
92デフォルトの名無しさん:2012/10/12(金) 20:14:50.53
>>78
もう大人しくCでプログラム組んでろ
93デフォルトの名無しさん:2012/10/12(金) 20:44:04.42
今日もC++に助けられました。感謝。
コンパイラの性能、強い型、程よい暗黙の変換などがなければ、困難なデバッグを諦めていたことでしょう。
Javascriptのデバッグとか考えただけで身の毛もよだつ・・・
94デフォルトの名無しさん:2012/10/12(金) 20:52:14.91
プロファイラでお薦めありませんか?
struct A {
void func1();
void func2();
};
みたいなのがあったときに、単純にそれぞれにかかった合計時間が計測できればいいのですが・・・
95デフォルトの名無しさん:2012/10/12(金) 20:53:55.17
96デフォルトの名無しさん:2012/10/12(金) 22:12:35.95
>>78
典型的なCに染まった老害だろ
たまに現場にいるけどここ十数年ほどは干され傾向だろ
97デフォルトの名無しさん:2012/10/13(土) 00:13:31.87
>>89
教科書を開いてクラスをもういちど勉強したほうがいいよ
クラスの重要チェックポイントをいくつかあげるとすると
・公開されたプロパティと処理の一箇所への集中
・カプセル化による詳細の隠蔽
・継承とポリモーフィズム
なんだよね
要するに非公開であるべきクラスの実装の詳細がどうなってるのかなんてものはクラスの概念にはまったく必要ない話なんだよ
privateなメンバ関数であろうが外部の匿名関数だろうがその選択によってクラスとして正しいか正しくないかなんてのは変わらないんだ
だとしたらこの部分は純粋にその機能としての優位性で選ぶのが正しいIT技術者のあるべき姿だろう
君もここで、またひとつ勉強になったね

第二段落の質問への答えだが、プライベートな処理はまとまりをばらすことが非常に多いよ
それは当然だろう。クラスの公開機能を実装するためのサブ処理をメンバ関数や匿名関数で行うのだから
それがクラスの一部分だけを処理するのは当然の話だ
それと、君は『むしろ「まとまり」を欠いた散漫なコード』にみえるというが
目に見えないだけで不要な変数にも平気でアクセスでき、副作用を生み出しかねない状況のほうが
遥かにまとまりの無い不安定な状況であるということを自覚しようね
おそらくだが、君はいまだに、コードの「見た目」が気に入らないだけでその機能的な部分に美意識を持っていないように見受けられる
それは識別子を並べたときに不ぞろいだ、汚い、と感じ無駄なスペースやタブでこぎれいに並べようとする無意味で低俗な美意識と同じことだよ
そういうのは素人から中級者にありがちなことなのだが、しっかりと勉強し成長すればコードの見た目より機能的な合理性と美しさというものを理解し優先するようになる
君は今はまだその段階に無いが君もいずれ理解できるだろうから心配しなくてもいい

>>91
君のプロジェクトにある適当な良く使われているクラスをピックアップし
@新しいプライベートメンバ関数をヘッダに追加し、cppに実装を書く
A新しい匿名関数をcppに書く
場合に分けてリビルドしたときのコンパイルコストを実測してみなさい
それで判らないなら君は時計を見る能力を持っていないことになるので病院で診断を受けることをお勧めする
98デフォルトの名無しさん:2012/10/13(土) 00:28:49.55
>>97
だらだらと長くて美しくない文章を書く人ですね
99デフォルトの名無しさん:2012/10/13(土) 00:31:02.54
http://toro.open2ch.net/tech/
みんなこっち行こうず
IDあるほうがまだマシ
100デフォルトの名無しさん:2012/10/13(土) 00:34:45.81
>>99
ここにコードやアイデア書くと運営にパクられるよ
101デフォルトの名無しさん:2012/10/13(土) 00:37:58.72
ちょっと質問だけど、その cpp に記述する匿名関数には、
参照する可能性のあるすべての private なメンバ変数を引数として渡すの?

ちょうど最近、private な関数をヘッダに書かなくてもいい方法ないかなーって思ってたところなんで参考にしたい
メンバ変数が多くなったら大変そうに見える

また、その匿名関数から見ると、
渡された引数がメンバ変数かどうかが分からないから見難くなりそう。どのあたりどうなんだろう。
public なメンバ変数は this を渡してアクセス、private なメンバ変数は個別で引数として…
それならもう全部引数で渡すことにして、this を渡す必要なくね?ってなってまた迷いそう
102デフォルトの名無しさん:2012/10/13(土) 00:41:19.79
実はオブジェクト指向ってしっくりこないんです!
103デフォルトの名無しさん:2012/10/13(土) 01:30:43.65
>>101
なんか難しく考えすぎてないか?
普通にいつも通りに関数を書くだけだぞ?
違いは匿名か否かってだけ
104デフォルトの名無しさん:2012/10/13(土) 03:27:48.70
まあそこまで隠したいなら
COMインターフェイス的な
抽象クラス使った方がいいんじゃないの?
105デフォルトの名無しさん:2012/10/13(土) 08:31:40.73
>>103
その関数の中でprotectedメンバは呼べないがな
10689:2012/10/13(土) 10:38:41.06
>>97
すでに手元に一定のクラスライブラリがあって、それを上位クラスに組み込むとき、もともとあったクラスを全部書き直すの?
すべてのアプリケーションを一からフルスクラッチで書き起こすやりかたなの?
107デフォルトの名無しさん:2012/10/13(土) 10:49:42.62
匿名関数が必要だと思う時点でクラスが肥大化してる
108デフォルトの名無しさん:2012/10/13(土) 11:25:10.64
map<K,V>::insert

map<K,V>::emplace
の違いが分かりません。
後者はどういうときに優位性を発揮するのでしょうか?
109デフォルトの名無しさん:2012/10/13(土) 11:39:22.57
hoge
110デフォルトの名無しさん:2012/10/13(土) 11:44:48.70
>>108
文字通りemplaceしたいときに優位性を発揮するんだよ
emplaceの意味わかる?辞書で調べた?話はそこからだよ
111デフォルトの名無しさん:2012/10/13(土) 11:52:50.51
>>110
emplace=設置する
insert=挿入する

・・・違いがわからん(汗
112デフォルトの名無しさん:2012/10/13(土) 12:00:38.64
だから設置するってんなら設置するんだよ
設置したいときに挿入したら違うことしてることになるだろ
お前は尻コキしたいときに膣に入れるのか?
ちんちんを尻の上に設置するのとちんちんを挿入することの区別もつかないのか?
いやはやまったく、最近の若者の言語感覚の欠落はまことに嘆かわしいことだな
113デフォルトの名無しさん:2012/10/13(土) 12:08:57.16
insertはすでに要素があったら何もしない仕様じゃなかったっけ?
だからinsertしか使ったことなかった。
emplaceで要素があったらどうなるのですか?
要素がないときに効率良くなるのですか?
114デフォルトの名無しさん:2012/10/13(土) 12:21:34.45
合ってるか分からないけど、

std::map<std::string, int> m;

m.insert(std::make_pair("1", 2)); // pairの作成/コピー(ムーブ)/破棄が発生
m.emplace("1", 2); // emplaceの中で直接mapが保持するオブジェクトを作る

簡潔でパフォーマンス的にもよろしい?
115デフォルトの名無しさん:2012/10/13(土) 12:25:22.81
>>114
C++11ならinsertでもムーブが呼ばれて、パフォーマンスにほとんど違いがなさそうなんだけど・・・
116デフォルトの名無しさん:2012/10/13(土) 12:45:04.48
じゃあ簡潔なんだ。
117デフォルトの名無しさん:2012/10/13(土) 13:38:49.02
std::make_pairって書かなくて済む
118デフォルトの名無しさん:2012/10/13(土) 13:47:40.02
ムーブないクラスでもムーブと同等のパフォーマンスを出せるしコピーできなくても入れれる
119デフォルトの名無しさん:2012/10/13(土) 13:48:07.56
計ったら、ムーブコンストラクタにかかる時間がそのままinsertとemplaceの差になった。
メンバが多いと、それなりに差は出た。
120デフォルトの名無しさん:2012/10/13(土) 13:50:18.59
ムーブはmovableなクラスにしか機能しないしコピー・ムーブ共に不可のクラスをコンテナに入れられるとかあるんよ
121デフォルトの名無しさん:2012/10/13(土) 13:52:13.90
emplaceイケメン
122デフォルトの名無しさん:2012/10/13(土) 13:59:17.17
C#みたいにプロパティも仮想化できないの?
struct Interface { virtual int & Value() = 0; };
こういうことはできないこともないんだけどC#でブイブイ言わせてる身としては
どうしてもobj.Value() = 100;の()が美的感覚にかなわなくて許せないわけ
123デフォルトの名無しさん:2012/10/13(土) 14:13:02.82
C++的にはobj.Value(100);にすべき
124デフォルトの名無しさん:2012/10/13(土) 14:42:17.71
郷に入りては郷に従え
ttp://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.8.2.html にあげられているのと同じところを目指すのかい?
125デフォルトの名無しさん:2012/10/13(土) 14:51:18.38
emplaceに関する議論ありがとうございました。
特に計測して下さった方、助かりました。
126デフォルトの名無しさん:2012/10/13(土) 14:57:55.11
127デフォルトの名無しさん:2012/10/13(土) 15:13:19.31
>>122
美的感覚以前に
参照を返せる場合しか使えないぞそれ
setter を呼ぶクラスを返す手もあるけど
128デフォルトの名無しさん:2012/10/13(土) 15:42:52.28
std::chronoについて質問させてください。
duration_cast<seconds>(sec).count()
が返す型がドキュメントを見ると
constexpr rep count() const;
となっているのですが、これがstd::chrono::repというわけではないようです。
どういう意味ですか?

また、上のコードでdurationのcount()をするとただの整数になってしまうのですが、
"6.532 sec elapsed"みたいに結果を小数で表示したいとき
「millisecondsで取得してcountして1000.0で割る」みたいなことを手でやる必要があるのでしょうか?
129デフォルトの名無しさん:2012/10/13(土) 15:58:58.76
前半わかりにくいので簡単に書きます。
auto s = duration_cast<seconds>(sec).count();
をauto使わず明示的に型を書きたいです。どう書くのが正解ですか?
130デフォルトの名無しさん:2012/10/13(土) 16:11:23.84
int
131デフォルトの名無しさん:2012/10/13(土) 16:18:23.27
>>130
なるほど。考える前にやってみるべきでした。
しかしrepってどういう意味だったんだ・・・?
132デフォルトの名無しさん:2012/10/13(土) 17:35:01.19
>>131
> しかしrepってどういう意味だったんだ・・・?
representation(表現)、durationクラスの中で値を保持する型(値をrep型で表現する)。
durationの中の話だからstd::chrono::seconds::repとかで取得する。
repが実数型だったら1.5秒とか表現できるようになる。
133デフォルトの名無しさん:2012/10/14(日) 10:54:22.50
class ABC;
list<ABC*> ABCList;
ABC abc;
ABCList.push_back(abc);
ってあったときに
ABCList.erase(abc);
ってすれば消えてくれるし、詰めてくれる??
134デフォルトの名無しさん:2012/10/14(日) 10:57:15.57
>>133
コンパイルしてみ
多分エラー出るから
135デフォルトの名無しさん:2012/10/14(日) 10:57:44.64
消えてくれるしつめてくれるよ
136デフォルトの名無しさん:2012/10/14(日) 11:01:16.95
>>133
あ、些細なタイポなら気にしないよ
ただ、そのコードだと何が聞きたいのかポイントが判断できないんだ

137デフォルトの名無しさん:2012/10/14(日) 11:02:50.80
erase じゃなくて removeだった
138デフォルトの名無しさん:2012/10/14(日) 11:04:23.96
>>133
せめて

ABCList.push_back(&abc);

だろ

こういう用途にはboost::ptr_listを使わないとデストラクタ呼んでくれないぞ
既存のオブジェクトを渡した時はいいのかもしれないけどどちらにしろ後始末は
自分でしなければならない

ABCList.push_back(new ABC);

みたいな場合は確実にメモリリークを起こす

それかshared_ptrで包めばいいな
139デフォルトの名無しさん:2012/10/14(日) 11:04:33.24
>>136
えーと、listの中間の要素を削除したい
あとポインタだったからこうでした
ABCList.push_back(&abc);
140デフォルトの名無しさん:2012/10/14(日) 11:05:34.34
すいません、removeでした。要素は削除したいですが、ポインタ先は削除したくありません。
141デフォルトの名無しさん:2012/10/14(日) 11:06:58.37
>>140
であれば、問題ないよ
142デフォルトの名無しさん:2012/10/14(日) 11:08:03.91
>>140
ポインタ先を保持してるコンテナやポインタ変数が他に存在しないのなら、メモリリーク起こしてるぞ
よく考えてみ
143デフォルトの名無しさん:2012/10/14(日) 11:10:34.62
メモリリークを起こすかどうかはいま問題にしてない
今はリストから削除されるかどうかを聞いてるだけ
144デフォルトの名無しさん:2012/10/14(日) 11:11:13.82
>>142
大丈夫そうです。
ありがとうございました。
145デフォルトの名無しさん:2012/10/14(日) 11:12:11.66
std::remove自体は削除したい要素を後ろに集めるだけだからその時点ではメモリリークは
していない

しかしその後erase()したらメモリリークしてる
eraseする前に自分でデストラクタを呼び出してその後deleteするのなら分かるけど
悪い事は言わないからboost::ptr_list使っとけ
146デフォルトの名無しさん:2012/10/14(日) 11:14:45.97
std::listの話してるのにboost::ptr_listの話を始める馬鹿
147デフォルトの名無しさん:2012/10/14(日) 11:15:58.54
>std::remove自体は削除したい要素を後ろに集める
std::list::remove?
148デフォルトの名無しさん:2012/10/14(日) 11:20:59.05
ここまでメモリリークに対して無関心な奴が多いとは思わなかった
149デフォルトの名無しさん:2012/10/14(日) 11:22:21.46
所有じゃなくて利用したいだけなんだからいいんじゃね?
150デフォルトの名無しさん:2012/10/14(日) 11:22:31.12
いまどきリークしたらアウトなんてダサいつくりでやってんの?
151デフォルトの名無しさん:2012/10/14(日) 11:23:40.98
std::listはメンバ関数にlist::remove()を持っているな

これは多分splice()何かを内部的に使ってstd::remove()より効率的に削除するメンバ関数だろう
しかしポインタをコンテナに入れる時はいつも気をつけろよ
152デフォルトの名無しさん:2012/10/14(日) 11:24:23.47
>>148
お前の理解レベルが低いだけ
そこは論点じゃない
153デフォルトの名無しさん:2012/10/14(日) 11:25:25.03
小さいサンプルでリークが起きてる!とかアホかよ
154デフォルトの名無しさん:2012/10/14(日) 11:26:35.86
>>153
小さいサンプルでリークを起こす奴はそのまま大きなプログラムでもリークを起こす
155デフォルトの名無しさん:2012/10/14(日) 11:27:06.75
PGってこういう融通利かないって言うか空気読めないって言うか文脈読めないっていうかそういう頭固い人多いよね
156デフォルトの名無しさん:2012/10/14(日) 11:28:24.32
人格攻撃する前にバグ出すなよ
157デフォルトの名無しさん:2012/10/14(日) 11:29:41.42
悪いけど回りと意思疎通・協調できない屑はリーク起こすやつより危険なんで今すぐ消えてくれないかな?
158デフォルトの名無しさん:2012/10/14(日) 11:30:32.14
どうもスレ乱立荒らしが起きる前からこういうおかしな粘着がいるなあ
159デフォルトの名無しさん:2012/10/14(日) 11:31:21.58
>>157
意思疎通・協調すればバグ出してもいいってか?アホかお前
160デフォルトの名無しさん:2012/10/14(日) 11:31:36.42
別に多くはないよ、頭固い奴はそこらじゅうにいるし。

>>148 は、単にメモリリークしか突っ込めない奴がそこは議論の対象外と指摘されて、
ムキーってなってるだけでしょ。
161デフォルトの名無しさん:2012/10/14(日) 11:33:15.13
>>159
意思疎通・協調できるやつは、指摘すればバグ直してくれるし、
そのうちバグも出さなくなるから。
162デフォルトの名無しさん:2012/10/14(日) 11:33:19.60
>>159
そうだよ
意思疎通できるやつなら先輩が指導して修正できる
お前みたいな屑は修正効かないから使い物にならない
だから最近の企業は面接でそういうカスをはじいてるんだけど知らなかった?
就職するときは苦労するよお前さんいまから覚悟したほうがいい
163デフォルトの名無しさん:2012/10/14(日) 11:33:23.13
133なんですけど、
一応newは別の場所でやって別の場所で保管して、その場所からlistにポインタだけpush_backしてます。
これをremoveするとメモリリークになりますか?
164デフォルトの名無しさん:2012/10/14(日) 11:33:30.60
ああいうコードを見てすぐに「危険」を感じない奴はそのうち大きな失敗をしでかす
165デフォルトの名無しさん:2012/10/14(日) 11:34:27.66
>>163
newしたオブジェクトを指すポインタを他の場所で保存していればおk
166デフォルトの名無しさん:2012/10/14(日) 11:35:25.56
>>162
こういう「屑」とか「カス」って言葉を多用する奴は自分自身が「屑」であり「カス」だと
全く気づいてないんだよなあ
167デフォルトの名無しさん:2012/10/14(日) 11:36:40.43
>>164
そこからすでにズレてんだよなお前
リークしてるのなんてみんなわかってるけど、質問者の意図・論点に集中してしゃべってんの
お前はこんな簡単なことも判らないからコミュ障の屑って呼ばれてるんだけど自覚したほうがいいよ
168デフォルトの名無しさん:2012/10/14(日) 11:37:01.13
なにか、自分のコードが原因で荒れたのか・・・
>>165
ありがとうございます。
169デフォルトの名無しさん:2012/10/14(日) 11:37:29.78
>>167
お前もクズだな
よくわかった
170デフォルトの名無しさん:2012/10/14(日) 11:37:34.84
>>167
え!?
171デフォルトの名無しさん:2012/10/14(日) 11:39:40.68
人格攻撃する奴はこの板にいなかったろ
どうも最近この板おかしい
172デフォルトの名無しさん:2012/10/14(日) 11:40:09.71
これではっきりしたな
shared_ptrを使わないやつは最底辺のゴミ
173デフォルトの名無しさん:2012/10/14(日) 11:41:13.90
>>168
気にしない、気にしない
いつもの事だから
174デフォルトの名無しさん:2012/10/14(日) 11:41:43.01
>>162
そうやって人の手を煩わしているわけですね
分かりやすいなあ
お前多分会社の重荷になってるよ
リストラ候補に入れられてるな
175デフォルトの名無しさん:2012/10/14(日) 11:43:38.79
>>174
煩わせる?
笑わせんな教育は仕事していくうちでもっとも重要なファクターだ
そこをわずらわしいとかめんどくさがってる会社に未来は無いよ
ようするにおまえの未来もないってことな
176デフォルトの名無しさん:2012/10/14(日) 11:53:34.11
この馬鹿(>>150)、何言ってんだ?
177デフォルトの名無しさん:2012/10/14(日) 11:54:06.47
リークリークってアホか
オブジェクトの管理は別の場所でやってて
そこへの参照をstd::listに適宜入れて使いたいって話なのに
なんでstd::listでメモリ管理するという話になってんだよ
178デフォルトの名無しさん:2012/10/14(日) 11:55:11.14
「そもそもメモリーリーク起こすんじゃねこのコード」派と
「素直に質問に答えるだけでいいんだよハゲ」派が対立してるな……
179デフォルトの名無しさん:2012/10/14(日) 11:55:16.31
>>175
おまえさあ、ニートの癖によく言うよ
何が最も重要なファクターだよ

>>177
それは後出しじゃんけんで出てきた情報だろうが
最初は書いてなかったぞ
180デフォルトの名無しさん:2012/10/14(日) 11:56:01.73
>>179
要素の追加にnew使ってなかっただろwww
何見てんだよ
181デフォルトの名無しさん:2012/10/14(日) 11:56:41.75
>>178
簡単にまとめるとそういう事だな
「質問に答えるだけでいいんだよ」派が「おいそれリーク起こしてるぞ」派を
必要以上の汚い言葉で罵倒してるだけ
こいつらの方がよほどコミュ障なのに気づいてない構図
182デフォルトの名無しさん:2012/10/14(日) 11:58:14.36
>>181
>>133はそもそもリークなんて起こしてないだろ
newしてないんだから
>>138が勝手にnewしてリーク起こすって騒いでるだけ
183デフォルトの名無しさん:2012/10/14(日) 11:58:18.76
>>180
ああいうコードが単なるサンプルである事にも気付けないのか?
実際後からnewしてる情報が出てきただろ
184デフォルトの名無しさん:2012/10/14(日) 11:58:21.61
>>179
最初はnewしてメモリ確保してないけど…
185デフォルトの名無しさん:2012/10/14(日) 11:58:48.14
>>183
その情報と同時に別な所でメモリ管理してるって言ってるじゃんw
186デフォルトの名無しさん:2012/10/14(日) 11:59:02.72
頭が固いのは果たしてどちらでしょうねー
187デフォルトの名無しさん:2012/10/14(日) 11:59:39.95
>>185
お前頭悪すぎる
何を話してもワンテンポずれて遅れてる
188デフォルトの名無しさん:2012/10/14(日) 12:00:40.85
両派の会話に加わらないことがクールであると思ってる奴もいるよな
189デフォルトの名無しさん:2012/10/14(日) 12:01:52.90
>>188
俺はいつもそうだが
突然噛み付かれたので応酬しただけだ
なんなのこいつら
絶対社会人じゃないだろ
190デフォルトの名無しさん:2012/10/14(日) 12:04:31.75
>>187
スタックかメンバ変数で確保した形のサンプルに対して
boost::ptr_listを使わないとデストラクタ呼んでくれないぞと言っちゃう人は
さぞかし頭がいいんでちゅね
191デフォルトの名無しさん:2012/10/14(日) 12:06:05.41
>>190
おいいい加減に話の流れに付いてこいよ
粘着
192デフォルトの名無しさん:2012/10/14(日) 12:06:53.25
>>187
>何を話してもワンテンポずれて遅れてる

初めからあさっての方向の奴よりマシ (w

>>189
底辺ドカタだろ
193デフォルトの名無しさん:2012/10/14(日) 12:08:46.66
>>192
あさってじゃないんだが
いつもこういう場面でリークを後から起こすのを経験で知ってんだよ
後からポインタを保存してるって話が出てきたからそれは解決したけどな

ドカタ?お前スレ乱立荒らししてたap.seikyou.ne.jpの大学生だろ?
就職決まらなくて他人に当たり散らすな
194デフォルトの名無しさん:2012/10/14(日) 12:10:10.65
>>188
ポイントポイントで燃料投下派もいるけど、何か?
195デフォルトの名無しさん:2012/10/14(日) 12:11:03.72
ム板って柔軟性ないやつばっかで簡単に荒せるから楽しいわ
196デフォルトの名無しさん:2012/10/14(日) 12:11:54.92
あーやっぱり
こいつが荒らしてた犯人か
197デフォルトの名無しさん:2012/10/14(日) 12:13:20.31
早速荒らしスレ一つ立ってるしww
分かりやす過ぎる
ワンパターンなんだよお前
198デフォルトの名無しさん:2012/10/14(日) 12:14:27.27
ちっ、バレたか
199デフォルトの名無しさん:2012/10/14(日) 12:15:23.93
悔しいからと言って

スレ立てるまでもない質問はここで 121匹目
http://toro.2ch.net/test/read.cgi/tech/1346177196/

643 名前:デフォルトの名無しさん[sage] 投稿日:2012/10/14(日) 12:10:09.68
馬鹿には無理

こんな所まで当たり散らすなよ
お前社会に出れないわ
確信した
どうせそのうち凶悪犯罪でも起こすんだろうな
200デフォルトの名無しさん:2012/10/14(日) 12:20:29.70
沸点ひくいねぇ
プログラマってそんなストレスたまんの?
201デフォルトの名無しさん:2012/10/14(日) 12:39:22.77
>>193
> いつもこういう場面でリークを後から起こすのを経験で知ってんだよ

それを自分しか知らないと思い込んでるところが、あさってなんだよ (w
202デフォルトの名無しさん:2012/10/14(日) 12:40:39.32
そこそこ知識はあるようだけど就職決まらないでしょ?
その原因のすべてはお前自身にあるんで
203デフォルトの名無しさん:2012/10/14(日) 12:44:20.38
>>133
ま、shared_ptrを使う(ABCListの要素もABCのshared_ptrにする)のが一般的にbetter
ただしもちろんナマポよりは速度性能とかメモリ消費とかが劣化するから、
(特にマルチスレッド対応版shared_ptrは遅い恐れが大きい
それがボトルネックになるようなら、>133のコードでありかつ
オブジェクトの生成破棄を別のコンテナで管理する、とするのは十分有り得る
204デフォルトの名無しさん:2012/10/14(日) 12:52:57.31
ちゅーか、個々の要素ごとに(デストラ+領域開放)を繰り返し呼ぶとか場合によっては遅すぎて話にならないから
デストラだけ呼んだ後領域全体を一気に開放するとか、
そもそもデストラが要らない型にしていきなり領域全体を一気に開放するとか、
そういうアロケータ/デアロケータを設けることも分野によってはわりと普通
205デフォルトの名無しさん:2012/10/14(日) 12:55:20.57
分野とか関係なしに入門書レベルの基本テクニックだろ
206デフォルトの名無しさん:2012/10/14(日) 13:07:02.03
>>193, >>202
誰も言っていない就職をいきなり持ち出すところ見ると、相当苦労したんだな、可愛そうに。
同情してやるよ (w
207デフォルトの名無しさん:2012/10/14(日) 13:10:04.75
おれ13卒だけど今年はぬるゲーだったよ?
半月ぐらいで大手メーカー決まったしさすがにNNTはもういないでしょ
208デフォルトの名無しさん:2012/10/14(日) 19:05:29.02
×開放
○解放
209デフォルトの名無しさん:2012/10/14(日) 20:57:48.47
生協ネットって大学生しか入れないだろ
なんで大学生が荒らす必要あんの?
210デフォルトの名無しさん:2012/10/14(日) 21:51:39.80
>>209
そこにコミュニティがあるからだ
211デフォルトの名無しさん:2012/10/14(日) 21:59:19.48
荒らしには物を言う権利なし
212デフォルトの名無しさん:2012/10/14(日) 22:00:28.00
大学生という生き物は社会人が考えているより遥かに暇で狂気に満ちた生き物なのだ
彼らに社会人の常識は通用しない。そもそも休日が週3日以上あってもおかしく無い生き物と職業プログラマが理解しあえるはずが無い
213デフォルトの名無しさん:2012/10/14(日) 22:41:36.12
逆の意味でもまた然り。
深夜も灯りの絶えない、労働基準法が適用されない世界。
214デフォルトの名無しさん:2012/10/14(日) 22:44:50.56
だからと言って荒らしていい道理はどこにもない
人に迷惑を掛ける大学生は生きてる価値ないよ
215デフォルトの名無しさん:2012/10/14(日) 22:46:03.54
本当にそうだろうか
大学生はまだ未来があり価値がある可能性を持っている
だがプログラマに未来は無くあるのは暗闇だけだ
本当に生きている価値がないのはどちらだ
216デフォルトの名無しさん:2012/10/14(日) 22:48:41.41
ま、どちらにせよ、荒らしはイクナイ
217デフォルトの名無しさん:2012/10/14(日) 23:17:53.52
荒らす大学生に未来www価値wwww

犯罪者になって牢屋に入る未来だろが
218デフォルトの名無しさん:2012/10/14(日) 23:22:07.37
性格が悪いやつは案外出世する
この現実を君たちは幾度と無く見てきたはずだ
私も同じ立場の人間として君たちの悔しさは理解できる
だが世の中というものは不条理と理不尽の巨大な塊なのだ
219デフォルトの名無しさん:2012/10/14(日) 23:24:16.32
そうだな
実際、いいヤツは苦労するし、早死にしそうだよな
220デフォルトの名無しさん:2012/10/14(日) 23:30:40.28
反社会性人格障害の奴は早死するよ

http://merckmanual.jp/mmhe2j/sec07/ch105/ch105a.html

>反社会性人格の人は、アルコール依存、薬物依存、性的に逸脱した行動、乱交、投獄
>といった問題を起こしやすい傾向があります。仕事に失敗しがちで、住居を転々と変える
>ケースもよくみられます。多くの場合、反社会的な行動、薬物などの乱用、離婚、肉体的
>虐待などの家族歴があり、小児期に情操面での養育放棄(ネグレクト)や虐待を経験して
>いることもあります。反社会性人格の人は一般の人に比べて寿命が短い傾向があります。

こういうわけだ
221デフォルトの名無しさん:2012/10/14(日) 23:59:11.29
それは性格が悪いのとは違う
222デフォルトの名無しさん:2012/10/15(月) 00:02:46.66
>>221
激しく同意
223デフォルトの名無しさん:2012/10/15(月) 00:24:08.29
反社会性パーソナリティ障害は性格悪いぞ

宅間守とか酒鬼薔薇聖斗とか加藤智大が性格良いとでも?
224デフォルトの名無しさん:2012/10/15(月) 00:59:51.65
必要条件と十分条件て知ってるか?
225デフォルトの名無しさん:2012/10/15(月) 01:04:06.05
反社会性パーソナリティ障害が性格悪いのは十分条件
226デフォルトの名無しさん:2012/10/15(月) 01:04:25.89
いや必要十分条件だな
227デフォルトの名無しさん:2012/10/15(月) 01:07:20.94
>>226
お前は社会を知らなすぎ
228デフォルトの名無しさん:2012/10/15(月) 01:22:11.55
>>226
失格
229デフォルトの名無しさん:2012/10/15(月) 01:35:54.93
>>227>>228
自分の事が分かってないようだなuy
230デフォルトの名無しさん:2012/10/15(月) 04:43:17.74
>>229
評価者の「自分がどうであるか」が関係するのか?
231デフォルトの名無しさん:2012/10/15(月) 04:44:18.68
>>226
本当に「性格が悪い人は全て反社会性パーソナリティ障害である」と思ってるの?
232デフォルトの名無しさん:2012/10/15(月) 05:11:27.38
>>230
狂ってる奴の評価はデタラメであてにならない

>>231
それを書いたのは俺じゃないな

反社会性パーソナリティ障害→性格が悪い→犯罪者

は間違いないが

性格が悪い→反社会性パーソナリティ障害

とは限らない

他にも

自己愛性パーソナリティ障害
境界性パーソナリティ障害
妄想性パーソナリティ障害
精神病質パーソナリティ障害
といろいろある
233デフォルトの名無しさん:2012/10/15(月) 05:57:58.89
>>232
> それを書いたのは俺じゃないな

じゃあお前は関係ない。
「必要十分条件」などとほざく馬鹿に質問している。
234デフォルトの名無しさん:2012/10/15(月) 06:01:28.91
まとめると

性格悪い=反社会性パーソナリティ障害=狂っている=そいつの評論はデタラメ
235デフォルトの名無しさん:2012/10/15(月) 07:30:46.68
QZが変な奴を連れてきた‥‥
邪魔だかどっちももどっかいけ
236デフォルトの名無しさん:2012/10/15(月) 08:38:25.60
何、またQが来てるのか
237デフォルトの名無しさん:2012/10/15(月) 09:03:50.82
>>234
全然まとまってないなw

Qは自己愛性パーソナリティ障害で、Qが嫌われ者という事実は変わらない
238 ◆QZaw55cn4c :2012/10/15(月) 12:34:08.45
239デフォルトの名無しさん:2012/10/15(月) 14:12:24.66
>>226
必要十分条件ということは
反社会性パーソナリティ障害→性格が悪い
性格が悪い→反社会性パーソナリティ障害
の両方が成り立つということか
240デフォルトの名無しさん:2012/10/16(火) 11:28:56.17
いやいや、例外が1つでも合ったら必要十分条件は成り立たない。
そういうときは確率的必要十分条件が成り立つ。
241デフォルトの名無しさん:2012/10/16(火) 11:55:14.37
お前らC++の話をしろ
クズの戯言に付き合うな
242デフォルトの名無しさん:2012/10/16(火) 22:54:18.84
おいQ、そこに居るのは分かっている。
アールグレイ、ホットで。
243デフォルトの名無しさん:2012/10/17(水) 20:58:24.82
G++ 4.3.4 です

struct B {
vector<int> vec;
vector<int>::iterator f() { return vec.begin(); }
};
はコンパイル通るのに
template <class T>
struct A {
vector<T> vec;
vector<T>::iterator f() { return vec.begin(); }
};
は以下のエラーメッセージでコンパイルが通りません
error: type 'std::vector<_Tp, std::allocator<_CharT> >' is not deriv ed from type 'A<T>'

対処法をお教えください。よろしくお願いします。
244デフォルトの名無しさん:2012/10/17(水) 21:03:28.63
typename vector<T>::iterator f() { return vec.begin(); }
はどう?
245デフォルトの名無しさん:2012/10/17(水) 21:03:42.97
typenameつけろ
246デフォルトの名無しさん:2012/10/17(水) 21:07:36.91
まずエラーメッセージでぐぐれ
247デフォルトの名無しさん:2012/10/17(水) 21:13:20.35
>>244-246
ありがとうございます >>244 で通りました
型名であることをコンパイラに教えないといけなかったのですね
248デフォルトの名無しさん:2012/10/18(木) 02:22:14.69
http://book.mycom.co.jp/support/e1/RL_support/
このページの三目並べのプログラムを実行しようと、Mingwでfltkを導入し、Mingwでコンパイルして、exeファイルを製作したのですが、
出来たexeファイルを実行しようとしても、Visual C++ Runtime Library「This application has requested
the Runtime to terminate it an unusual way〜」というエラーメッセージが出てきて、ファイルが実行出来なくなってしまいます。

簡単なFltkのライブラリを含んだものをコンパイルしたexe.ファイルは実行出来たので、Fltkには原因はないみたいです。
Visual c++の再頒布パッケージをダウンロードしたり、管理者権限で実行しても同じ結果になりました。
一体、何が足りないんでしょうか?
書籍に書かれたコードなので、コードが間違っているとも思えません。
249デフォルトの名無しさん:2012/10/18(木) 06:42:10.88
>>248
つ 正誤表
250デフォルトの名無しさん:2012/10/18(木) 08:16:24.49
>>243
コンパイラを新しくしろ。
最近のエラーメッセージはずっとまとも。
251デフォルトの名無しさん:2012/10/18(木) 18:04:32.93
オーバーライドをしないように指定する継承ってできますか?

class IFoo {
public:
virtual void Func() = 0;
};

class FooBase : IFoo {
public:
void Func() { } // オーバーライドしたい
};

class FooEx : FooBase {
public:
void Func() { } // オーバーライドさせたくない
};
252デフォルトの名無しさん:2012/10/18(木) 18:31:34.96
関数名変えろよ
253デフォルトの名無しさん:2012/10/18(木) 18:47:33.81
>>251
11ならできる
254デフォルトの名無しさん:2012/10/18(木) 22:28:20.33
C++で質問なんですが。
最近プログラムの高速化について調べているのですが
最近のCPUはどんどん高速化していって、キャッシュサイズ等も増えてきているが
メモリはパスの互換性の問題等から速度は昔とあまり変わっていないので
速いプログラムを書くにはメモリとあまりやりとりせずにCPUのキャッシュに乗せるのが
有効とあったのですが、プログラムでCPUのキャッシュに乗せるというのがイメージできません。
コードで明示的にキャッシュに乗せる事は出来るのでしょうか?それとも、キャッシュにのるサイズのデータなら
自動的にキャッシュを使われるようになっているのでしょうか?
255デフォルトの名無しさん:2012/10/18(木) 22:31:36.73
>>254
コードとデータをキャッシュサイズより小さいものだけで回すように
256デフォルトの名無しさん:2012/10/18(木) 22:34:54.29
最も多く回るループを小さくして、コードが全部キャッシュに入りますように
257デフォルトの名無しさん:2012/10/18(木) 22:39:51.39
質問なんだけど詳しい人おしえて
ドライバの関数って普通はカーネル経由で呼ばれて、レジスタは気にする必要無いんじゃないの?
__interrupt__ってそのカーネルを書くときに使うやつじゃないの?
I/O用の関数をカーネルが持ってる場合はアセンブリ無くてもドライバ書けるんじゃないの?
258デフォルトの名無しさん:2012/10/18(木) 22:58:23.05
全部コンパイラさんがよきにはからってくれる
259デフォルトの名無しさん:2012/10/18(木) 23:13:48.22
こんな感じのconstついたり、つかなかったりを型で条件分けしたパターンがいくつも続く場合って
1つにまとめれないのでしょうか

template<typename T1, typename T2>
f(const T1 & t1,const T2 & t2
,typename boost::enable_if<boost::is_arithmetic<T1> >::type* = 0
,typename boost::enable_if<boost::is_arithmetic<T2> >::type* = 0
){...

template<typename T1, typename T2>
f(T1 & t1,const T2 & t2
,typename boost::disable_if<boost::is_arithmetic<T1> >::type* = 0
,typename boost::enable_if<boost::is_arithmetic<T2> >::type* = 0
){...
260デフォルトの名無しさん:2012/10/19(金) 01:30:51.11
内容による
261デフォルトの名無しさん:2012/10/19(金) 12:37:22.76
>>254
キャッシュ自体は原則的にCPUが勝手に制御するから意識する必要はない。
ターゲットCPUが決まっていて、それのインストラクションを使える開発環境ならば、
幾つかの関数呼び出しでキャッシュの制御ができる場合もあるが。

先ずは実測してみて欲しい。食わせるデータによってランダムアクセスになるか
シーケンシャルアクセスになるか切り替わるようなプログラムを用意し、
そのプログラムの処理時間を記録するとキャッシュの効果が見えるだろう。

で、後はSoAかAoSか、演算量が多くなってもシーケンシャルアクセスの方が速いか、
そもそもコード自体が最適化によってベクタ化されて速くならないか、などを検討していくことになる。
いずれにしても、C++一般の話からは外れてくるので後は最適化スレにでも。
262デフォルトの名無しさん:2012/10/19(金) 13:25:49.59
int* a,b int c,dがあります。
c,dはaとbの長さがあります
aとbの長さzとは*aをa[0] ,a[1],...と分解して
さらにa[0],[1],...を2進数列で分解してx_1,.......,x_32, y_1,...........
と分解したとき2進数列のz番目以下の値は定義されていることをいいます。
このときaのcまでの値後ろにbのdまでの値を付け加えたeを作りたいんですけど、
eに対してもまたfを付け加えてgを作ったりしなければなりません。
このときa,b,e,fのデータ構造を全て同じなものに書き換えて効率のよいものにしたいのですけど
どのようにしたらいいですか?
263デフォルトの名無しさん:2012/10/19(金) 13:30:06.03
boost::dynamic_bitset みたいな物を再発明したいん?
264デフォルトの名無しさん:2012/10/19(金) 13:31:57.09
日本語苦手でしたら英語で質問してもいいですよ
265デフォルトの名無しさん:2012/10/19(金) 13:52:34.24
どんな操作をどのように効率のよいものにしたいのか不明
266デフォルトの名無しさん:2012/10/19(金) 13:55:22.35
VC10 / VC11RCにて

std::wstring r1 = L"3445";

std::wcout << r1 << std::endl;

std::wregex wr2(L"(.)\1+");
std::wstring fmt2(L"x");
std::wstring r2 = std::regex_replace(r1,wr2,fmt2);

std::wcout << r2 << std::endl;

実行結果
3445
3445

任意の数字列にて、同じ数字が連続するものを"x"に置換したいのです。
この場合"3x5"になって欲しいんですが、何故マッチしないのでしょうか?
267デフォルトの名無しさん:2012/10/19(金) 14:03:45.22
\\1
268デフォルトの名無しさん:2012/10/20(土) 10:01:44.63
char a[20],b[20];
sscanf("deep/dir/tree/file.txt","%[^/]/%s.txt",a,b);
a="deep/dir/tree", b="file"にマッチさせたいのですが、
これだとはじめの/で止まってしまいます。できればscanfの範囲で解決策を教えて下さい。

もし無理な場合、
stringでfindを使えばよいことはすでにわかっています。
また、std::regexを使う方法は試していませんが興味があるのでぜひ提示してください。
269デフォルトの名無しさん:2012/10/20(土) 11:38:46.97
またコピペか
270デフォルトの名無しさん:2012/10/20(土) 12:42:10.01
コピペじゃないのに・・・
どうしてそう思った?
271デフォルトの名無しさん:2012/10/20(土) 13:04:50.39
君頭大丈夫?
272デフォルトの名無しさん:2012/10/20(土) 14:17:37.96
>興味があるのでぜひ提示してください
それくらい自分で調べろよ超絶低能役立たず。社会のガン細胞。C++と何の関係もないからまずどっかに消えてなくなれ。
273デフォルトの名無しさん:2012/10/20(土) 15:06:16.20
自分で調べろゴミ
274デフォルトの名無しさん:2012/10/20(土) 15:10:12.34

自分がゴミである事に気がついてないゴミ(笑)
275デフォルトの名無しさん:2012/10/20(土) 15:10:15.98
プログラミング10数年にして今さら dynamic_cast を知ったんだが、
何が便利(どう使えばいい)か教えてくれ。

キャストできないときに NULL が返るのは分かったが、
別に NULL チェックがしたいわけじゃないし、
キャストするときは大抵基底で判別してからやらない?

キャストしまくってポインタが返ってきたものだけ処理するとか…そんな書き方するのか…?
276デフォルトの名無しさん:2012/10/20(土) 15:13:28.16
ダウンキャストやクロスキャストが出来るかどうか調べる
277デフォルトの名無しさん:2012/10/20(土) 15:16:29.98
278デフォルトの名無しさん:2012/10/20(土) 15:37:04.49
名前空間を利用する場合、どうやって説明するのが正しいの?

namespace A{
}

「名前空間 A を宣言する」
と言って良いものか・・・
279デフォルトの名無しさん:2012/10/20(土) 15:49:50.13
消えろコピペ
280デフォルトの名無しさん:2012/10/20(土) 15:50:26.66
template <class T>
class P{
 private:
  double hoge;
public:
  double Hoge(){ return hoge;}
};

double F(P<double> a, P<double> b){
  return a.Hoge() + b.Hoge();
}

テンプレート型のクラスを引数に持ってくる際に型を固定したいのですが
以上のようにできるでしょうか
281デフォルトの名無しさん:2012/10/20(土) 17:58:36.56
正規表現勉強中なんですが、
ttp://en.cppreference.com/w/cpp/regex/match_results/operator_at
ここにある例を走らせるとsm[1]が空文字""になってしまいます。
仕様変わりました?
282デフォルトの名無しさん:2012/10/20(土) 19:07:41.93
>>280
意味があるのか不明だがそのコードは通る
283デフォルトの名無しさん:2012/10/20(土) 22:47:19.84
途中で書き込んでしまいましたすいません

引数ありのコンストラクタが引数無しのコンストラクタ呼ぶことって可能ですか?

class Test{
bool po;
public:
Test()
:po(NULL)
{
}
Test( int i )
{
// ここでTest()のやつをうごかしたい
}
};

191 名前:デフォルトの名無しさん[sage] 投稿日:2012/03/01(木) 15:19:07.74
class Test {
bool po;
public:
Test(void) { initialize(); }
Test(int i) { initialize(i); }
private:
void initialize(void) { po = false; }
void initialize(int i) {
// ここでinitialize()のやつをうごかす
}
};
284デフォルトの名無しさん:2012/10/20(土) 22:50:24.61
どこのコピペだ
285デフォルトの名無しさん:2012/10/20(土) 23:56:42.67
C++11なら可能
C++03なら無理なので191のやってるように初期化関数使え
286デフォルトの名無しさん:2012/10/21(日) 07:11:06.70
二つ以上のオブジェクトの本来の型に応じて処理を分けたいのだけどダブルディスパッチ以外に良い方法はないですか
(ちなみにダブルディスパッチでダメな理由は型のパターンが多すぎてインターフェースがすさまじく大きくなるからです)

void Func(IObject * p, IObject * q, IObject * r);
をコールしたら
*pの本来の型S、*qの本来の型T、*rの本来の型Uとして
void Func(S * p, T * q, U * r);
にディスパッチしてほしいです
287デフォルトの名無しさん:2012/10/21(日) 08:02:44.31
設計を見直したほうがいいのでは?
その方針だと型の数が増えると定義しなければならない
Funcの組み合わせの数が爆発的に増えてしまう
288デフォルトの名無しさん:2012/10/21(日) 10:13:16.92
基本的にディスパッチされた側がdynamic_castして
自分で戻すもんじゃない?
289デフォルトの名無しさん:2012/10/21(日) 11:56:49.43
質問
OpenGLだけど
const char* pVer = glGetString(GL_VERSION);
printf("version is %s¥n",pVer);
これだとOKで
printf("version is %s¥n",glGetString(GL_VERSION));
これだとダメだったんだが、もしかして返り値の寿命が関係してるの?
だとすると寿命はどう捉えるべき?
290デフォルトの名無しさん:2012/10/21(日) 12:09:06.35
どうしてストリングクラスのデストラクタにはバーチャルがついてないの?
291デフォルトの名無しさん:2012/10/21(日) 12:12:37.94
仮想関数テーブルのサイズをケチるため
292デフォルトの名無しさん:2012/10/21(日) 12:14:24.64
>>289
それでダメになるというのは仕様的にはあり得ない
そこまでの間にメモリ破壊でも起こしてるか、
コンパイラにバグがあるか、あるいはリビルドすると直るとか、そういうもの
293デフォルトの名無しさん:2012/10/21(日) 13:59:19.87
_beginthreadexで3つのスレッドを作る場合
_endthreadexでここのスレッドを判別するにはどうしたら良いのでしょうか?
294デフォルトの名無しさん:2012/10/21(日) 15:26:26.80
_endthreadexはスレッドの判別など必要なく、今のスレッドを終了させるが、
_endthreadexは絶対に呼んじゃダメ
デストラクタが呼ばれない
295デフォルトの名無しさん:2012/10/21(日) 15:50:11.78
_endthreadexを使うのと、_beginthreadexの戻り値で取得したハンドルをCloseHandleで消す方法ってどう違うの?
296デフォルトの名無しさん:2012/10/21(日) 16:15:46.41
>>281
にレスがつかなくて困ってたんだけど、もしかしてGCCの実装が未完成ってこと?
ttp://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html
完成してないどころか、間違った結果を返すものを公開するなよって感じなんだけど一体どうなってんだw
297デフォルトの名無しさん:2012/10/21(日) 16:22:44.12
while (cin >> input) {
(セグフォを起こす処理)
}

while (cin >> input) {
try {
(セグフォを起こす処理)
} catch (std::exception& e) {
std::cerr << input << std::endl;
}
}
に書き換えても、catchできてないしループが1回で止まってしまうのですが、
セグフォってcatchできないのでしょうか?
ちなみにセグフォを起こしているのはstd::vector::operator[]だと思います。
298デフォルトの名無しさん:2012/10/21(日) 16:57:02.42
最近なるべくconstを付けるように意識してるんですが、constなメンバを持つクラスの
operator =を書くときに困っています。
たとえば内部に持つバッファのサイズなどはコンストラクタで決まり、以後変更されないのでconstにしています。

が、そうするとconst_castでconstをはがさないと代入演算子が書けないわけで・・・
こういうときはどうするべきなのでしょう。

1.constではなくmutableにすべき
2.代入演算子を書くべきでない。使うときはコピーコンストラクタで済ませるべき
3.そもそもその程度の不変性ならconstにするな

アドバイスいただけると嬉しいです。
299デフォルトの名無しさん:2012/10/21(日) 16:59:42.51
PS3とか360に組み込めるフリーのGCってありますか?
300デフォルトの名無しさん:2012/10/21(日) 17:35:00.30
>>297
カーネルが発するSegmentation Faultに対応する
C++標準のexception classが存在しないもよう
ハンドラを通してC++の例外に変換してる例↓
http://www.ibm.com/developerworks/linux/library/l-cppexcep/index.html
301デフォルトの名無しさん:2012/10/21(日) 17:41:06.66
>>298
メンバ変数にconstは可能な限り付けない方がいい
どうしてもconstが必要なら代入不可であるべき
302デフォルトの名無しさん:2012/10/21(日) 17:42:29.59
C++でFortranのようにベクトル計算するにはどうすればいいんですか?
303デフォルトの名無しさん:2012/10/21(日) 17:46:25.37
forループがベクトル演算に最適化される事を期待
304デフォルトの名無しさん:2012/10/21(日) 17:53:43.70
期待つーか明示的に要求するんだが
305デフォルトの名無しさん:2012/10/21(日) 18:01:15.91
C++の仕様には明示的な要求などありません
306デフォルトの名無しさん:2012/10/21(日) 19:04:15.86
多数の要求は少数の要求に優先する。
307デフォルトの名無しさん:2012/10/21(日) 20:12:02.31
>>300
nanndatteee
ありがとうございます。仕方ない、おとなしくprintfデバッグします・・・。
whileの中は独立だから途中で止めたくないんだけどな・・・
308デフォルトの名無しさん:2012/10/21(日) 20:27:03.01
ほらFortranさんは設計的にベクトル演算とかをコンパイラに理解させやすいような感じだから
309デフォルトの名無しさん:2012/10/21(日) 20:50:20.55
boost::shared_ptrをvoid*に入れたいのですが、できますでしょうか?

フレームワークに設けられている便利に使っていいvoid*なんですが
&でアドレス取得して入れたら、うまく動作しませんでした。

&でアドレス取得する場合、参照カウントが増えなくて消えちゃうみたいです。

こういう時ってどう実装するものなのでしょう?。
310デフォルトの名無しさん:2012/10/21(日) 21:13:00.70
素直にどこかへコピーしとけよ
311デフォルトの名無しさん:2012/10/22(月) 13:10:09.17
>>307
printf()だとバッファリングされるから、fprintf(stderr, ...)の方がいいよ。
312デフォルトの名無しさん:2012/10/22(月) 15:19:23.24
簡単な数式を引数でとって結果を返す関数をテンプレートで書こうとしてます。
template<class II, class PD, class CT>
int sansuu(II pos, PD n, CT tr)
{
for (; 0 < n ; --n, ++pos)
{
---> ここの書き方 if( tr.eq(*pos, '0') )
{

}
}
return 0;
}

int main(int argc, char* argv[])
{
const char* p = "1+1";
ここの書き方 sansuu(p, strlen(p), char_traits<char>);
const wchar* wp = L"1+1";
sansuu(wp, strlen(wp), char_traits<wchar>);

インプットイテレータとサイズを引数にして、あとcharとwcharでも
使えるようにしたいんですがどうしたらいいのでしょうか
stringを見たらchar_traitsとかあったんですがよくわかりませんでした。
お願いします。
313雑魚シカ:2012/10/22(月) 15:50:12.92
template<class char_type, class length>
int sansuu(const char_type* pos, length n);
314デフォルトの名無しさん:2012/10/22(月) 17:26:24.79
ifstreamとgetlineで外部のファイルを1行ずつ読み込む処理を作りました。
しかしリリースモードで実行すると1行ずつ読み込めません。デバッグモードでは問題なく読み込めました。
原因が分かる人がいたら教えてください。 ちなみにvs2008を使っています。
315デフォルトの名無しさん:2012/10/22(月) 17:33:11.10
>>314
モードの違いに言及したいのなら、開発環境に依存した話なので該当スレへ。
どう読み込めないのか説明ができないのならエスパースレへ。
まさかと思うが、モードだとかデバッグ実行だとかでcwdが違うって落ちじゃないよな。
316デフォルトの名無しさん:2012/10/22(月) 17:51:39.56
317デフォルトの名無しさん:2012/10/22(月) 17:53:29.98
API上別にしないといけないってどういう事?
あるタイミングで i を使って、別のタイミングで d を使うって事?
使ったかどうか覚えておけばいいだけのような
318デフォルトの名無しさん:2012/10/22(月) 18:30:10.19
319デフォルトの名無しさん:2012/10/22(月) 18:31:14.90
320デフォルトの名無しさん:2012/10/22(月) 20:08:53.54
クラスについて質問です
クラス内にメンバ変数しかなかったら
newする度に変数の分だけメモリを消費するだろうと推測できるのですが
例えば、メンバ変数は2〜3個でも、メンバ関数が100個くらいある場合には
newする度にメモリの消費量が半端ない感じになってしまったりしますか?
クラスのメモリを確保した時の挙動がちょっと気になってしまいまして
詳しい方いらっしゃったら教えてくださいまし
321デフォルトの名無しさん:2012/10/22(月) 20:30:27.87
322デフォルトの名無しさん:2012/10/22(月) 23:39:55.72
struct IFoo { virtual func(void) = 0; };
struct IBar { virtual func(void) = 0; };

struct Baz : IFoo, IBar {
// ?
};

funcをインターフェースごとに明示的に違う内容でオーバーライドしたいのですがどうすればよいでしょうか?
323デフォルトの名無しさん:2012/10/22(月) 23:53:29.49
素直に関数名を分けろ
324デフォルトの名無しさん:2012/10/22(月) 23:56:48.04
多重継承は出来るだけ避けるべき
325デフォルトの名無しさん:2012/10/22(月) 23:58:50.56
>>322
struct FooImpl : IFoo { virtual func() { ...
struct BarImpl : IBar { virtual func() { ...

struct Baz : FooImpl, BarImpl { ...
326デフォルトの名無しさん:2012/10/23(火) 20:07:34.23
>>324
多重継承は楽しい。
327デフォルトの名無しさん:2012/10/23(火) 20:20:44.07
インターフェイスの多重継承なら許す
328デフォルトの名無しさん:2012/10/23(火) 21:06:28.60
インターフェイスは多重継承と同じとか言い出す輩登場
329デフォルトの名無しさん:2012/10/23(火) 21:13:10.27
実際大した違いはないだろ
330デフォルトの名無しさん:2012/10/23(火) 22:13:29.10
クラスのデータメンバをprivate(あるいはprotected)のまま、他のクラスから利用する方法ってありますか?
struct A { protected: int data; };
struct B { const A& a; B(const A& a): a(a) {} int func(){ return a.data+1; } }
みたいなことをしようとすると、Aのpublicメソッドとしてdataのゲッターを用意しないといけませんよね、
Aを継承すればdataを使えるけど、dataが2箇所に重複してしまう。(コピーつくらずに共有したい)。
331デフォルトの名無しさん:2012/10/23(火) 22:18:36.47
まるごと削除して設計からやり直すのが正解
332デフォルトの名無しさん:2012/10/23(火) 22:20:09.27
friend
333デフォルトの名無しさん:2012/10/23(火) 22:26:29.28
virtual継承すれば重複しないんじゃね
334デフォルトの名無しさん:2012/10/23(火) 23:22:11.99
ダイヤモンド継承するのか?そうでない継承なら重複してしまうってなにか勘違いしてないか
335デフォルトの名無しさん:2012/10/23(火) 23:30:31.18
A a(1);
a.data = 2;
B b(a);
b.func();//2
a.data = 3;
b.func();//3
//bはaのオブサーバ
みたいにしたい。
「オブサーバパターン使え」とかはなしで。
たしかに今はvirtual継承する設計になってるんだけど、
機能的には完全に独立な内容をもつ巨大なクラスになってしまっているから、
見たいデータだけ共有して機能を切り離したい。
それこそ設計を見なおしてる段階なので、あいまいな説明になってしまって申し訳ないです。
336デフォルトの名無しさん:2012/10/24(水) 07:22:54.95
関数ポインタにテンプレート関数のアドレスを入れるにはどうしたらいいですか
普通の関数だと
int (*kanp)();
int kan(int a);
kanp=kanで入るけどkanの部分をテンプレート関数にすると入らない
337デフォルトの名無しさん:2012/10/24(水) 07:25:05.76
f = kan<int>
338デフォルトの名無しさん:2012/10/24(水) 07:25:41.18
>>336
バカには無理。
339デフォルトの名無しさん:2012/10/24(水) 10:24:46.60
環境依存しない方法でインクルードガードが絶対に被らないようにする事は出来ますか?
340デフォルトの名無しさん:2012/10/24(水) 10:53:14.08
#pragma once
341デフォルトの名無しさん:2012/10/24(水) 11:00:36.71
>>337
kanp=kan<int>だめでした
int (*kanp)(int*)だと入ったんですけど()で入れたいです
342デフォルトの名無しさん:2012/10/24(水) 11:24:03.89
>>341
無理だろ
ttp://ideone.com/LFlHdR
関数ポインタにこだわらないならbindするという手もあるけどなぜそんなことをしたがるんだ
343デフォルトの名無しさん:2012/10/24(水) 13:22:09.88
そもそも関数ポインタなんて使ってる時点で
344デフォルトの名無しさん:2012/10/24(水) 20:58:10.22
変数.jpgというファイル名を変数.txtという名称に変更したいんですがどうすればよいでしょうか?
実際にはtxtファイルを用いるところをダイアルボックスでjpgを選択する形にしたいのですが
画像だとサムネイルがみえてわかりやすいので
345デフォルトの名無しさん:2012/10/24(水) 21:06:00.67
>>344
そんなことも自分で考えられないならソフトウェア製作業者にお金を払って作ってもらいなさい。
346デフォルトの名無しさん:2012/10/24(水) 21:21:02.20
>>345
ありがとうございます
おかげで解決しました
347デフォルトの名無しさん:2012/10/24(水) 21:21:50.34
いえいえ
348デフォルトの名無しさん:2012/10/27(土) 11:15:30.37
質問の1行目と2行目の関連がわからん
349デフォルトの名無しさん:2012/10/28(日) 12:02:08.81
以下の感じで8byte倍精度が並んだファイルを読み込みたいのですが、どうもこのままでは無理そうです。
operator++でTに対して何をやってるのかによりますが、8byteのunion型か何かを自分で作れば可能でしょうか?

#include <iostream>
#include <fstream>
#include <vector>

int main()
{
std::ifstream fin("dataset.dat",std::ios::binary);
std::istreambuf_iterator<double> bf(fin),eof;
std::vector<double> buf(fin,eof);
for (int i=0; i<10; ++i) {
std::cout << buf[i] << std::endl;
}
}
350デフォルトの名無しさん:2012/10/28(日) 12:15:48.46
std::istreambuf_iterator<double> なんて初めて見たぞ
351デフォルトの名無しさん:2012/10/28(日) 12:24:29.01
いや、もちろんコンパイル通らないよ。やりたいことは伝わってる?
doubleのところを適当なunion型かなにかにするの?という質問。
発想がそもそもズレてる可能性はある。
Cだとreinterpret_castで8byte読み込むところだがストリームでやりたいなと。
352デフォルトの名無しさん:2012/10/28(日) 13:35:38.73
>doubleのところを適当なunion型かなにかにするの?という質問。

それでいいよ
353デフォルトの名無しさん:2012/10/28(日) 17:36:10.56
>>352
うまくいかねぇ
#include <iostream>
#include <fstream>
union dbl {
char mem[8];
double d;
};
int main()
{
std::ifstream fin("dataset.dat",std::ios::binary);
std::istreambuf_iterator<dbl> buf(fin),eof;
}
354デフォルトの名無しさん:2012/10/28(日) 18:18:37.35
オペレータは
355デフォルトの名無しさん:2012/10/28(日) 19:16:33.87
istreambuf_iterator<charT>にしといて

union {double, char[8]} から8文字取り出して連続して書き込めよ
356デフォルトの名無しさん:2012/10/28(日) 19:37:20.73
http://ideone.com/1VVS0T

これでいいような気がするけど
何か問題あるかな
357デフォルトの名無しさん:2012/10/28(日) 20:22:28.23
エンディアン気にしなくて良いのかな
規格で入出力形式って一つに決められていたっけ
358デフォルトの名無しさん:2012/10/28(日) 20:50:39.97
for文で配列を線形探索して、該当しなかった時に分岐したい場合って
こんな感じでfor文外にフラグ置かないとできないですか?
http://codepad.org/1MOZpRNh

↓こんな感じで、「最後まで何も該当しなかったよ」というのを基本構文(if,for,whileなど)で再現したいです。
http://codepad.org/8D51w0WR

5時間ぐらい悩みました。
誰か本当に教えて下さい。
359デフォルトの名無しさん:2012/10/28(日) 20:56:46.84
int i:
for (;i<END;++i)
〜;
if (i!=END)
〜;
else
〜;
360デフォルトの名無しさん:2012/10/28(日) 21:08:33.85
>>357
シリアライズ用に使いたいならどっちかで統一した方がいいね
361デフォルトの名無しさん:2012/10/28(日) 21:44:28.51
>>356
う〜ん、そのまんまか・・・。
やっといてもらってアレだが、これだとfout.readするほうが明らかに楽ですよね。
何が嬉しいのか分からん。速いとか?

>>360
C系(規格ではない)とJava系で逆だった気がするが、ユーザーの責任にするしかないと思われ。
362デフォルトの名無しさん:2012/10/28(日) 22:13:12.66
>>361
istreambufを使うのはユーザー定義で自由なストリームを構築出来るという
自由度の高さがあるからです

欠点は1文字ずつしか入出力出来ないこと

速さはどうなんだろう
そんなに変わらないと思うけど
363デフォルトの名無しさん:2012/10/28(日) 22:17:49.02
>>362
ありがとう。ちょっと仕様でも読んで使い道考え直しますわ。
ライブラリのあまり使われない部品って、けっこう多いよね>C++
364デフォルトの名無しさん:2012/10/28(日) 23:30:40.44
std::istreambuf_iterator<CharType>
「CharTypeはcharまたはwchar_tである。・・・」
それ以上読むのやめたw
365デフォルトの名無しさん:2012/10/28(日) 23:38:17.50
>363
使ってはいけない部品も多い
366デフォルトの名無しさん:2012/10/30(火) 10:06:24.92
すみません。shared_ptrの参照カウンタについて教えてください。

shared_ptr<A> x(new A);
shared_ptr<A> y = x;
shared_ptr<A> z(new A); // @

cout<<x.use_count()<<endl; // 参照カウンタは2
cout<<y.use_count()<<endl; // 参照カウンタは2
cout<<z.use_count()<<endl; // 参照カウンタは1

z=x; // @で生成したオブジェクトが消滅

cout<<x.use_count()<<endl; // 参照カウンタは3
cout<<y.use_count()<<endl; // 参照カウンタは3
cout<<z.use_count()<<endl; // 参照カウンタは3

z=xで、どうしてyのカウンタまで3に変更されるのかが
よくわかりません。

裏側にカウンタクラスがあって実際はこれがオブジェクト
Aへの生ポインタと参照回数をカウントする変数をもって
いる。x,y,zはこの裏クラスを参照もしくは指している
という理解でよろしいでしょうか?
367デフォルトの名無しさん:2012/10/30(火) 10:17:22.26
はい
368デフォルトの名無しさん:2012/10/30(火) 10:40:25.57
>>367

ありがとうございます。



裏側にカウンタクラスがあって
   ↓
裏側にカウンタクラスのオブジェクトがあって

x,y,zはこの裏クラスを
   ↓
x,y,zはこの裏側にあるカウンタオブジェクトを
369デフォルトの名無しさん:2012/10/30(火) 11:19:28.87
shared_ptrの実装の解説はこのサイトが丁寧でわかりやすいと思った
http://d.hatena.ne.jp/setuna-kanata/20081125/1227620902
370デフォルトの名無しさん:2012/10/30(火) 12:33:53.17
>>369

おお、ありがとうございます。
371デフォルトの名無しさん:2012/10/30(火) 12:37:22.99
人 ありがたや ありがたや
372デフォルトの名無しさん:2012/11/02(金) 22:32:34.85
今コピーしているものをペーストせよ↓
373デフォルトの名無しさん:2012/11/08(木) 10:05:56.55
クラスの複数のメンバ関数内のみで参照する定数って、ソース内に
const int HOGE = 10;
などと書いてしまうべきですか?

それとも、ヘッダに
static const int HOGE;
と書いておいて、
const int クラス名::HOGE = 10;
と実体をソースに定義するべきですか?

Cの頃は関数内でのみ使用する定数は前者(しかも#define)でしたが、C++だとどうなるのでしょうか。
後者だと、クラスを使用する側には関係ないものをヘッダに書く必要が出てくるのですが。
374デフォルトの名無しさん:2012/11/08(木) 10:48:46.83
どっちでもいいよ
375デフォルトの名無しさん:2012/11/08(木) 12:18:15.90
>>373
private の enum か static
もしくは pimpl でヘッダにも残さない
376デフォルトの名無しさん:2012/11/08(木) 12:36:32.04
>>373
宣言と実態を分けて書くと、コンパイル時定数ではなくて、
変更できない変数になってしまって、
いろいろと不都合が出たよ。

ヘッダにstatic const intで書いた方が、何かと便利。
privateにしてしまえば、使う側には関係ない。
377デフォルトの名無しさん:2012/11/08(木) 14:57:32.54
>>374-376
やっぱりこの手のものはヘッダにprivateで書くものなんですか。

ソース内のみで使う定数が外から見えるところで宣言されているのが違和感があるのですが、
たしかにprivateメンバ変数やprivateメンバ関数も同じように外に見えていますし、
クラスはそういうものなんだと理解するようにします。
378デフォルトの名無しさん:2012/11/08(木) 15:46:38.08
>ソース内のみで使う定数が

ソースのグローバルに
static const int HOGE = 10;
379デフォルトの名無しさん:2012/11/08(木) 15:52:54.27
「クラスの複数のメンバ関数内のみ」がいつの間にか「ソース内のみ」に…
380デフォルトの名無しさん:2012/11/08(木) 16:00:45.03
>>378
これが最初に書いた前者の方法ですよね?

>>379
すいません、同じ意味です。
一つのソース内に書かれている関数は、通常は一つのクラスのメンバ関数のみなので。
381デフォルトの名無しさん:2012/11/08(木) 16:38:50.33
static かどうかはこのケースでは関係無いよね
382デフォルトの名無しさん:2012/11/08(木) 18:47:16.06
コンパイル時定数は自動的にstaticだし
そもそもstaticより無名名前空間を使うべきだな
383デフォルトの名無しさん:2012/11/08(木) 18:52:12.77
>クラスを使用する側には関係ないものをヘッダに書く必要が出てくるのですが。

.cppソースが無くてヘッダに全部実装書いてる有名ライブラリの立場は・・・
384デフォルトの名無しさん:2012/11/08(木) 18:53:02.81
detail名前空間とかいう泥臭い事やってるけどなー
385デフォルトの名無しさん:2012/11/08(木) 19:06:27.57
detailってそういうあれだったのか
386デフォルトの名無しさん:2012/11/08(木) 19:16:49.00
http://unkar.org/r/prog/1224812192
54 :仕様書無しさん:2009/06/13(土) 18:26:48
&nbsp;&nbsp;&nbsp;&nbsp;>>51
&nbsp;&nbsp;&nbsp;&nbsp;そのとおりっていうかそれが当然っていうか話題にする価値もないっていうか
&nbsp;&nbsp;&nbsp;&nbsp;まさか世の中にはstaticな関数までヘッダに書く奴がいるのかと戦慄してるんですが。

&nbsp;&nbsp;&nbsp;&nbsp;ところでc++のクラスでプライベートなメンバ/メソッドをクラス定義に一度に書かせる
&nbsp;&nbsp;&nbsp;&nbsp;のが諸悪の根源だわな。あれのせいでc++から学習する奴がヘッダの意味がわからず
&nbsp;&nbsp;&nbsp;&nbsp;混乱する。
&nbsp;&nbsp;&nbsp;&nbsp;パブリックなメンバは一箇所でしか定義できないが、プライベートメンバは既存クラスに
&nbsp;&nbsp;&nbsp;&nbsp;追加の形で定義してよい、とすればc時代のヘッダの意味を取り戻せるのだが。
&nbsp;&nbsp;&nbsp;&nbsp;コンパイラの実装めんどくさそうだけど。
387デフォルトの名無しさん:2012/11/08(木) 20:47:48.06
>>383
横レスだけど・・・なんのライブラリですか?
388デフォルトの名無しさん:2012/11/08(木) 21:19:14.10
boostに決まってんじゃん
389デフォルトの名無しさん:2012/11/08(木) 21:39:07.76
業務でそんな事する奴がいたらすぐ首だよ。
390デフォルトの名無しさん:2012/11/08(木) 22:58:29.23
テンプレートならそうするしかないだろ
391デフォルトの名無しさん:2012/11/08(木) 23:08:45.80
389無知過ぎワロタ
392デフォルトの名無しさん:2012/11/08(木) 23:55:56.96
betterCとしてしか使ってない人ならそんなもんでしょ
393デフォルトの名無しさん:2012/11/08(木) 23:56:34.74
ヘッダに実装を全部書いた方がコンパイルが速いとかいう記事無かったっけ
394デフォルトの名無しさん:2012/11/09(金) 01:23:41.34
それは一括でコンパイルするなら複数のソースをそれぞれコンパイルしてリンクするより
ただ一つのソースにまとめてコンパイルするほうが早いって話

ヘッダに実装を全部書くとそのやり方と相性がいい
395デフォルトの名無しさん:2012/11/09(金) 01:24:16.30
全部のcppを1個にすると超高速ビルドらしい
396デフォルトの名無しさん:2012/11/09(金) 01:30:37.47
>>395
それは分割されたソース全部再コンパイルするのに比べて、だろ。
ちょっと変更してビルドしなおすって状況ではちゃんと分かれてないと死ぬ。
397デフォルトの名無しさん:2012/11/09(金) 08:28:16.46
最近はボトルネック以外はスクリプトだから大差ない
398デフォルトの名無しさん:2012/11/15(木) 20:21:04.44
class Hoge {
 shared_ptr<const Piyo> GetPiyoA() const {
  const shared_ptr<cosnt Piyo> sp(this->spPiyo);
  assert(sp != NULL);
  return sp;
 }

 shared_ptr<const Piyo> GetPiyoB() const {
  assert(this->spPiyo != NULL);
  return this->spPiyo;
 }
 ...
};

GetPiyoAとGetPiyoB、ベターなのはどちらですか?
399デフォルトの名無しさん:2012/11/15(木) 20:23:19.18
後者でいいだろ
前者に何の意味があるんだ
400デフォルトの名無しさん:2012/11/15(木) 20:30:13.76
あ、this->spPiyoの宣言は
shared_ptr<Piyo> spPiyo;
です

assert(this->spPiyo != NULL); のspPiyo
return this->spPiyo; のspPiyo
spPiyoが保持する内容はassertなりの呼び出しで変えられないことが保障されているかという話です
401デフォルトの名無しさん:2012/11/15(木) 20:46:38.90
もう1つ質問があります

void ProcessHoge(const shared_ptr<const Hoge> & spHoge)
{
 // shared_ptr<const Piyo> spPiyo(spHoge->GetPiyo());
 // const Piyo * pPiyo(spPiyo.get());
 const Piyo * pPiyo(spHoge->GetPiyo().get());
 GlobalFunc();
 spHoge->ConstFunc();
 pPiyo->ConstFunc();
}

シングルスレッドにおいて、このようにspPiyoを作成せずに直接生ポを取得して使用することは問題になりますか?
402デフォルトの名無しさん:2012/11/15(木) 20:54:18.30
なぜ問題になると思ったんだ
403デフォルトの名無しさん:2012/11/15(木) 22:03:44.33
GlobalFunc()またはspHoge->ConstFunc()からspHoge->spPiyoを変更できるので、
spHoge->spPiyoがいつまで有効であるかどうか解からないからです
404デフォルトの名無しさん:2012/11/15(木) 22:38:21.64
>>398,>>401
キチガイは失せろ
hogeとか頭おかしいんじゃね
405デフォルトの名無しさん:2012/11/15(木) 22:41:48.07
>>401
最大の問題はHoge使ってる奴がプログラミングなんかに手を出したことです。
406デフォルトの名無しさん:2012/11/15(木) 22:47:15.43
頭おかしいかどうかは別として、hogeを覚える暇はあっても分からないことを検索する暇がないってのが不思議
407デフォルトの名無しさん:2012/11/15(木) 22:47:33.83
へえ
408デフォルトの名無しさん:2012/11/15(木) 22:51:52.24
haga 剥がすのか?
hagi 歯ぎしりしたいのか?
hagu ハグしたいのか?
hage ツルピカ
hago んんん何だ
higa キッコーマンか
higi 秘技炸裂
higu 秘具・・・て何だ具体的に
hige 恐れようが結局ただのおっさん
higo ラーメン3杯に繊月の染みいるパワー明日知らず
hoga 味玉に山芋オクラのB2パワー
hogi 締まった肉にホギホギくいつくハム喰い
hogo 何だと、もう誰も信じてはいない、だれがだれを守るんだよ、それが現実的に意味があることなのかよ、なあおい答えろよ,次第によってはぶっ殺すぞ
409デフォルトの名無しさん:2012/11/15(木) 22:52:09.94
hogepiyo
410デフォルトの名無しさん:2012/11/15(木) 22:53:53.51
>>403
hoge厨は迷惑だから消えろよ
411デフォルトの名無しさん:2012/11/15(木) 22:59:12.61
>401←なんでホゲ使ってる奴ってこういう救いようのないヴァカしかいないの?w

ホゲ使ってる奴=ヴァカの図式が今回も証明されたなw
412デフォルトの名無しさん:2012/11/15(木) 23:03:25.33
>>401
やってみれば分かるけどそれは問題にならない。




















って言ったら信じるんだろうなこの基地害。
本当に生きてる価値ないな。
法で人権が保護されてるってだけで、社会では価値なし。
413デフォルトの名無しさん:2012/11/15(木) 23:06:18.14
またこの流れか、>>398は荒らすためだけに書き込んでるのにアンチhoge厨釣られすぎ
hoge以外にも>>400みたいに後出しで情報出してるし、荒らし以外の何者でもない、スルーよろ
414デフォルトの名無しさん:2012/11/15(木) 23:09:56.37
int型の3つの変数をもつ構造体を定義し、
キーボード入力で値をそれぞれ与え、自作関数を用いてそれぞれの累積和を求めるプログラムが書きたいのですが、
自作関数が、その2つの構図体を引数として与え、1つの構造体を返すというものです。
全く手が出ません。
どうアプローチして良いかすら分からないので、1つ簡単な解答例をお願いします。
415デフォルトの名無しさん:2012/11/15(木) 23:42:42.18
>>414
まずその構造体を定義するプログラムを書いてみろ
416デフォルトの名無しさん:2012/11/15(木) 23:57:50.52
>>411
hogeは日本人のしかもごく一部しか使わない。
つまりhogeに慣れ親しんで当たり前のように使う奴は、
プログラムに関して日本語でしか検索しないことが多く(もしくは日本語のみでしか検索したことがない)、また、
普段学習等のために閲覧しているサイトもhogeを多用するようなサイトに偏っている。
これは学習の段階や検索能力そのものに問題があるということであり、
すなわち、プログラム以前の部分に問題のある馬鹿だということ。
馬鹿の中でも>>398のような最底辺。
417デフォルトの名無しさん:2012/11/16(金) 00:03:04.25
え、どういう流れかわからない
418デフォルトの名無しさん:2012/11/16(金) 00:09:47.16
>>415
struct number{
int x;
int y;
int z;
};

struct sum(struct score,struct score); //プロトタイプ宣言

main(){


こんな感じです。あってると思うが…
419デフォルトの名無しさん:2012/11/16(金) 00:12:14.80
連レスすまん。
引数の値が誤植だわ。× score  〇 number
420デフォルトの名無しさん:2012/11/16(金) 00:24:51.79
struct number {
 int x, y, z;
};

number sum(number&, number&); // プロトタイプ宣言

number sum(number& a, number& b)
{
 number output;
 output.x = a.x + b.x;
 output.y = a.y + b.y;
 output.z = a.z + b.z;

 return output;
}

void main () {
 number a = { 1, 2, 3 };
 number b = { 4, 5, 6 };
 number ans = sum(a, b);
 printf("%d, %d, %d\n", ans.x, ans.y, ans.z);
}
421デフォルトの名無しさん:2012/11/16(金) 01:09:15.14
自分のレベルですと以下のようなプログラムを書いています。
もちろんコンパイルは通っていません。色々なミスを含め指摘・訂正をお願いします。
struct number{
int x,y,z;
};

struct number sum(struct number,struct number);//プロトタイプ宣言

struct number sum(struct number,struct number){
struct number sum;
sum.x = ?;
sum.y = ?;
sum.z = ?;
return sum;
}
//↑の自作関数の部分で引数が、同じ構造体を2つ使う場合の引数の設定の仕方がよくわかりません。
//構造体を名前を入れるとダブってしまいます。
422デフォルトの名無しさん:2012/11/16(金) 01:11:27.50
忍法帖の制限により分割になってしまいました。
申し訳ございません。
main(){
struct number data;
struct number temp;
printf("x y z? ");
scanf("%d %d %d",&temp.x, &temp.y,&temp.z);
data = sumscores(data,temp);//←代入できないのかな?
printf("total: %d %d %d\n",data.x,data.y,data.z);
}
//↑のmain関数で、本当は入力が != EOFの限り繰り返しを行いたいです。
423デフォルトの名無しさん:2012/11/16(金) 01:21:51.50
Cの初心者スレで
424デフォルトの名無しさん:2012/11/16(金) 01:32:09.67
>>421
引数が構造体でない関数、例えばintを二つ受け取って合計を返す関数は書けるか?
書けるなら引数が構造体の場合でも同じようなもんだ
425デフォルトの名無しさん:2012/11/16(金) 02:00:06.60
どんな経験、学習をもとにエア障害物をセルフメイクする才能を得たのか
そっちのほうに興味があるわ
426デフォルトの名無しさん:2012/11/16(金) 04:47:22.01
>>401
質問があります、じゃねえだろクズ
お前にはhoge使う以前にやることがあるだろ






さっさと回線切れ
427 忍法帖【Lv=40,xxxPT】(1+0:5) :2012/11/16(金) 06:01:32.88
>>426
どーでも良い。
428デフォルトの名無しさん:2012/11/16(金) 10:45:43.61
hoge使わないとか情弱
429デフォルトの名無しさん:2012/11/16(金) 12:25:14.22
>>398
何がclass Hogeだよ。
頭おかしいだろお前。
お前リアルでも基地害扱いされてるよ、
基地害に面と向かって言うと面倒なことになるから言わないだけで、
陰では早く消えればいいのにって言われてるよ。
お前みたいな奴は居るだけで迷惑だからね。
430デフォルトの名無しさん:2012/11/16(金) 13:19:22.99
アンチhoge厨もいい加減ウザい
431デフォルトの名無しさん:2012/11/16(金) 14:06:35.59
ここに住みついているアンチhogeは厨というより明らかにキチガイ。人格障害。
432デフォルトの名無しさん:2012/11/16(金) 14:16:42.24
>>426

void ProcessFoo(const shared_ptr<const Foo> & spFoo)
{
 // shared_ptr<const Bar> spPiyo(spFoo->GetBar());
 // const Bar * pBar(spBar.get());
 const Bar * pBar(spFoo->GetBar().get());
 GlobalFunc();
 spFoo->ConstFunc();
 pBar->ConstFunc();
}

シングルスレッドにおいて、このようにspPiyoを作成せずに直接生ポを取得して使用することは問題になりますか?
433デフォルトの名無しさん:2012/11/16(金) 14:20:09.13
>>430-431
ヲッチャーじゃなくてまともな回答者ならNG入れとけ
hoge厨にもアンチもまともな書き込みは1つもしてないからNG入れて問題ない

コピペ用↓
Hoge
hoge
Huga
huga
Piyo
piyo
434デフォルトの名無しさん:2012/11/16(金) 14:55:59.63
この流れは荒らし(>>401)の思う壺だなwwwww
435デフォルトの名無しさん:2012/11/16(金) 16:02:15.04
hoge使ってる奴は馬鹿とかじゃなくて精神的な問題じゃねーの?

hogeを知っててもまともな神経してたら使わねーし.
436 ◆QZaw55cn4c :2012/11/16(金) 16:13:01.30
>>433
thx 登録完了です。
437デフォルトの名無しさん:2012/11/16(金) 16:40:43.67
436 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん

誰だこれ?
438デフォルトの名無しさん:2012/11/16(金) 17:26:29.06
>>437
【いんたーねっとくすぷろーら】で確認するといいよ
439デフォルトの名無しさん:2012/11/17(土) 09:54:14.58
アンチhoge厨あっちのスレからまた戻ってきたんだ
440デフォルトの名無しさん:2012/11/17(土) 12:12:26.68
専ブラ使ってるやつは情弱
441デフォルトの名無しさん:2012/11/19(月) 23:19:51.63
凄い奴は自分でC++コンパイラーを作ってるんだろうが
お前らはどこのC++コンパイラー使ってる?
442デフォルトの名無しさん:2012/11/20(火) 00:26:42.01
何?
VC++2010とか言ったら情弱扱いされる流れ?
443デフォルトの名無しさん:2012/11/20(火) 01:35:39.64
VC 作ってる… 孫請けだけどね ja じゃなくコアのとこ… なんて言うと、ネタ扱いしかされないだろ
444デフォルトの名無しさん:2012/11/20(火) 23:13:54.70
さすがにC++のコンパイラ作れるとはウソでも言えない
445デフォルトの名無しさん:2012/11/20(火) 23:48:28.13
いまのC++コンパイラを実際に開発しているのは日本の下下請け企業なんだろ
446デフォルトの名無しさん:2012/11/21(水) 00:32:07.38
パフォーマンス度外視ならなんとかなるんじゃね?
447デフォルトの名無しさん:2012/11/21(水) 00:36:51.17
京のC++コンパイラは酷すぎるとか聞いた
448デフォルトの名無しさん:2012/11/21(水) 00:43:07.48
と言っても使えるレベルのスパコン用のコンパイラ作れるのは日本企業だけなんだろ
このスレ住人にはCray、IBM、京...どれかのコンパイラ開発に参加しした奴意外といるんじゃないか
449デフォルトの名無しさん:2012/11/21(水) 01:04:55.66
C++パースする段階でくじける
C++コンパイラ作ってる企業はパーサーの部分はよそから買ってきたりしてるんだっけ?
450デフォルトの名無しさん:2012/11/21(水) 01:05:20.39
日立でIDE作ってたやつはさされてもおかしくないレベル
451デフォルトの名無しさん:2012/11/21(水) 01:15:07.47
ASPEN最高じゃん
452デフォルトの名無しさん:2012/11/21(水) 07:15:39.79
g++改造すりゃええねん
453デフォルトの名無しさん:2012/11/21(水) 07:33:26.49
パーサを毎回一から作るのか?
454デフォルトの名無しさん:2012/11/21(水) 08:27:07.74
再発明は文化の極みだよ
455デフォルトの名無しさん:2012/11/21(水) 08:28:23.15
今は書くことだけを考えて
456デフォルトの名無しさん:2012/11/21(水) 09:08:05.95
ASPEN懐かしい
457デフォルトの名無しさん:2012/11/21(水) 09:37:21.00
>>450 あれで1ライセンス10万超えとか、ねぇ・・・
458デフォルトの名無しさん:2012/11/21(水) 22:57:46.29
1インライン関数10万行超えとか、ねぇに見えた
459デフォルトの名無しさん:2012/11/22(木) 01:33:21.16
なにそのメガネが本体みたいなコード
460デフォルトの名無しさん:2012/11/22(木) 07:15:20.06
461デフォルトの名無しさん:2012/11/22(木) 10:40:01.15
大衆はこんなつまらない漫画に笑えるのかぁ・・・
漫画が売れるの理由がわかったよ。
462デフォルトの名無しさん:2012/11/22(木) 12:56:56.02
まあまあ、そう言うなよ
463デフォルトの名無しさん:2012/11/22(木) 23:20:32.82
「可変個引数テンプレート」についてですが、
関数の多重定義を使わずに、sizeof...(args)の値が0かそれ以上かで条件分岐するコードにはできないですか?
実装を一箇所にまとめておきたい、というニーズのためです。

template <typename T, typename... Ts>
void func(T x, Ts... xs) {
std::cout << x << std::endl;
if (sizeof...(xs)) func(xs);
}

みたいなイメージなんですが、これだと
コンパイル時にif判定されるわけじゃないので「func()がないよ」って怒られます。
464デフォルトの名無しさん:2012/11/22(木) 23:23:32.94
>>461
ちゃんと見てないけどたぶん笑わそうとした漫画じゃなくて、
平文でいい内容をわざわざ漫画にしたパターンじゃないの?
100字を超える文字列を連続で読めないのが大衆と思われる。
465デフォルトの名無しさん:2012/11/22(木) 23:30:32.73
2chのレスも3行超えたら読み飛ばすからなぁ
466デフォルトの名無しさん:2012/11/22(木) 23:47:52.20
>>463
そういったことはstatic_if検討中の次期C++にご期待ください
467デフォルトの名無しさん:2012/11/23(金) 00:04:29.59
>>466
サンクスです。たちどころにこういう答えが返ってくる場所があるってすばらしい。
C++11も、規格化されるまでは大丈夫かよ?
と思ってたけどけっこう受け入れられてるみたいだし、健全な発展をお祈りします。
468デフォルトの名無しさん:2012/11/23(金) 02:55:33.90
>>465
>>464みたいに安価込みで4行になったレスも読み飛ばしてるの?
469デフォルトの名無しさん:2012/11/23(金) 23:18:03.43
visual studio でc++ やってるけど

#include "stdafx.h"
#include "stdio.h"
#using <System.Dll>
#using <System.Data.Dll>
#using <System.Xml.Dll>
#include <string>

using namespace System;
using namespace System::Data;
using namespace System::Xml;
using namespace System::Collections;
using namespace System::Data::SqlClient;

int main(void)
{
String^ str;
String^ str200;

char* comp[100] ;
SqlConnection^ Conn = gcnew SqlConnection("Password=apple;User ID=sa;Initial Catalog=master200;Data Source=.\\sql2031");
Conn->Open();
int t;
str = "Select * FROM Customers";
SqlCommand^ sqlCmd = gcnew SqlCommand(str,Conn);//
SqlDataReader^ dr= sqlCmd->ExecuteReader ();
while( dr->Read() )
{   str200=dr["CompanyName"]->ToString();
comp[t] = (char*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(str200).ToPointer();
こっから 表示ができない。
printf("<TD><input type='text' name='comp' size='30' value='"+comp[t]+"' ></TD>" );
470デフォルトの名無しさん:2012/11/23(金) 23:20:00.50
システム ストリング から苦労して
char* 変換できたけど
どうやってstringf できるか教えてほしい。
471デフォルトの名無しさん:2012/11/23(金) 23:22:54.13
>>469-470
http://toro.2ch.net/test/read.cgi/tech/1268613679/
LANケーブルで首吊ればわかるよ
472デフォルトの名無しさん:2012/11/24(土) 01:57:33.58
>>463
普通の関数かいて分岐してその中からテンプレートなりよべば?
473デフォルトの名無しさん:2012/11/24(土) 09:57:15.77
空のfunc()を作ればいいだけじゃね
474デフォルトの名無しさん:2012/11/24(土) 10:00:40.73
こんな感じだ>>463
http://ideone.com/wCLFh3
475デフォルトの名無しさん:2012/11/24(土) 10:14:47.54
> 関数の多重定義を使わずに
476デフォルトの名無しさん:2012/11/24(土) 10:18:30.86
>>463は要するに func(T) を作りたくないってことだろ
func() を作ればいいという所まで頭が回ってるようには見えない
477デフォルトの名無しさん:2012/11/24(土) 11:15:54.57
> 「func()がないよ」って怒られます。
オーバーロード使えること知っててこのエラー・・・その先は言う必要ないですよね。
自分で考えてみてください。
478デフォルトの名無しさん:2012/11/24(土) 11:20:35.90
本人がコメントしない事にはどうしようもない
479デフォルトの名無しさん:2012/11/24(土) 12:21:13.48
今きた。すまん。

func()含めて多重定義したくなかったんです。
funcという名前を一箇所にまとめたかった。
多重定義というか再帰を空気のように使うと初心者が拒絶するかなぁ、と。
480デフォルトの名無しさん:2012/11/24(土) 12:23:20.35
タプルとか可変長引数を(コンパイル時)ループで回せるようにするべきだと思いませんか?
481デフォルトの名無しさん:2012/11/24(土) 12:28:46.31
無理じゃね?インライン展開すんの?
482デフォルトの名無しさん:2012/11/24(土) 12:32:52.07
static_ifに続き、static_forができるんですね、わかります
483デフォルトの名無しさん:2012/11/24(土) 12:42:16.89
あれ?あまり賛同が得られないな。
もうみんな複雑さにうんざりしてる感じ?
484デフォルトの名無しさん:2012/11/24(土) 12:48:37.04
出来るから必要ない
485デフォルトの名無しさん:2012/11/24(土) 12:52:35.00
再帰が一番すっきりする
486デフォルトの名無しさん:2012/11/24(土) 13:01:46.06
boost.fusion知らんの?fusionのinvokeとfor_eachは標準にあってもいいと思うけどな
487デフォルトの名無しさん:2012/11/24(土) 13:25:24.44
static_for みたいなので実装すると、
実体毎にループ処理が作られるのでちょっとキモい
488デフォルトの名無しさん:2012/11/25(日) 20:29:55.28
CPPのユニットテストを書くのに参考になるドキュメント無いですか?
489デフォルトの名無しさん:2012/11/25(日) 22:00:45.38
in-class static data member initialization
って未実装?
//g++ -std=c++11 a.cpp(バージョン4.7.2)
struct X {
static constexpr value = 1.0;
};
int main()
{
X x;
}
でリンカエラーになるのですが。
490デフォルトの名無しさん:2012/11/25(日) 22:24:23.38
>>489
完全なソースとエラーメッセージをコピペしましょう。
491デフォルトの名無しさん:2012/11/25(日) 22:26:31.74
型がねーぞ
492デフォルトの名無しさん:2012/11/25(日) 22:30:04.59
>>489
static constメンバをクラス内で初期化できるのは
int型だけだよ。
493デフォルトの名無しさん:2012/11/25(日) 22:39:05.83
りなっくすだとC++のコンパイルが面倒なんだけどなんでかね
WindowsのBCCならCでもC++でも同じコマンドでいけるのにね
りなっくすだと何かとても覚えきれないほどややこしかったよ
調べながらなんとかコンパイルできるようになったけど
次から手打ちできる気がしなかったからシェルスクリプトにしといたよ
あのシェルスクリプトなくしたら僕もうコンパイルできないよ
494デフォルトの名無しさん:2012/11/25(日) 22:39:44.64
すまん。
なんか再現に苦労してしまっている。もうちょっと待ってください。
495デフォルトの名無しさん:2012/11/25(日) 22:42:13.96
>>492
g++の場合double含めた数値型が使用できた気がする
496デフォルトの名無しさん:2012/11/25(日) 22:51:54.82
やっと再現できた。あまりに不可解なので、GCCのバグかも?
この機能はC++11の話です。>>492

struct X {
double value;
static constexpr double data = 1.0;
X(): value(-data) {}
};
int main()
{
X x;
}

これでリンカエラー。

X(): value(data) {}
に変えるか、あるいは
X x();
とすれば通る。
497デフォルトの名無しさん:2012/11/25(日) 22:55:07.23
(CLANG3.1)
clang++ -std=c++11 a.cpp
なら通るけど
(GCC4.7.2)
g++ -std=c++11 a.cpp
では通らない。
498デフォルトの名無しさん:2012/11/25(日) 23:37:41.71
あれ?
X x();
でコンパイルして実行したとき、X(): ... {}
は呼ばれてないな。誰が呼ばれたw
499デフォルトの名無しさん:2012/11/25(日) 23:40:33.01
X x(); 系は関数宣言とコンパイラが区別できなかった気がするが…
500デフォルトの名無しさん:2012/11/25(日) 23:41:36.78
>>499
どう修正すればいいの?
explicit X(): ... {}
にしてもダメだった。
501デフォルトの名無しさん:2012/11/25(日) 23:42:45.15
>>500
変数宣言を X x{}; にする。
502デフォルトの名無しさん:2012/11/25(日) 23:43:00.91
int main()
{
X x();
}
が関数宣言と思われるってこと?そんなのアリ?
503デフォルトの名無しさん:2012/11/25(日) 23:45:28.78
そんなのアリ、というか、よくあって「チッ またコレか」みたいなモンだと思ってたが…
504デフォルトの名無しさん:2012/11/25(日) 23:46:39.28
>>501
できた。

元のコード、
int main()
{
X x{};
}
としてください。

value(-data)でリンカエラー。
value(data)に変えると期待通りです。
505デフォルトの名無しさん:2012/11/25(日) 23:48:19.80
>>503
C++11から出てきた話?それとも元から注意すべきだった?
話の本筋とはズレてたけどありがとう。とりあえず助かった。
506デフォルトの名無しさん:2012/11/26(月) 00:05:15.08
>>505
昔から。昔のstd::list<std::map<T>> hoge; の>>がシフト演算子と解釈されてたのと同じようなもん。
こっちは本当に区別不能だからC++11じゃ{}っていうのがOKになって解決したけど。
507デフォルトの名無しさん:2012/11/26(月) 00:43:21.49
X x(); でおかしくなるのは誰もが通る道だと思ってたのだが
508デフォルトの名無しさん:2012/11/26(月) 02:00:38.26
本物のc++プログラマになるために突破しなければならない試練の一つだからな
509デフォルトの名無しさん:2012/11/26(月) 02:05:52.65
コンパイラが解釈に困ったらとりあえず宣言とみなされるトラップ
510デフォルトの名無しさん:2012/11/26(月) 02:16:01.02
コンパイラ「意味が一意に決定できないのでコンパイルはできません♪」
*「クソが」
511デフォルトの名無しさん:2012/11/26(月) 02:32:39.73
>>493 make はつかわんの?
512デフォルトの名無しさん:2012/11/26(月) 02:38:30.34
>>510
コンパイラ「仕様通りの実装だといつから錯覚していた」
マ「ぐぬぬ」
513デフォルトの名無しさん:2012/11/26(月) 07:21:44.64
X x(); はコンパイルできるぞ!
関数宣言と見なされるだけで
514デフォルトの名無しさん:2012/11/26(月) 08:18:33.97
515デフォルトの名無しさん:2012/11/26(月) 08:31:53.59
double arr[2];
に対して
reinterpret_cast<complex<double>>(arr);
的なことは可能ですか?
C++11なら逆は可能と仕様に書いてありますが、この場合は記述がないので無理なのでしょうか?
516デフォルトの名無しさん:2012/11/26(月) 09:56:22.73
>>496
data が ODR-use されてるけど定義が無い、ってことじゃないの?
constexpr double が ODR-use される条件は詳しく見てないけど。
517デフォルトの名無しさん:2012/11/26(月) 18:31:51.81
ShiftJISの文字列をUTF-8の文字列に変換したいのですが、
なるべく効率的な方法でやるとするとどういったものがあるのでしょうか
518デフォルトの名無しさん:2012/11/26(月) 18:44:28.82
icu当たり使えば
519デフォルトの名無しさん:2012/11/26(月) 19:09:57.77
>>507
そうだよな。はじめて出くわした時はなんでってなるがな
520デフォルトの名無しさん:2012/11/26(月) 20:00:18.75
>>517
あんな方法やこんな方法でできるけどお前には無理。
521デフォルトの名無しさん:2012/11/26(月) 23:52:57.11
()とか書くほど体力ないから X x(); なんてコード書いたことないから気付かなかったわー

ところで X(): value(data) {} に変えると通るのは何で?
522デフォルトの名無しさん:2012/11/27(火) 00:03:58.90
>>515
規格上は保障されないんだろうな
523デフォルトの名無しさん:2012/11/27(火) 00:40:20.31
>>515
reinterpret_cast<complex<double>*>(arr);
の間違いだよな

complex<double>としてあり得ない値というのがあるなら
安全性を保てないという意味でダメなのだと思う

例えば、実部が NaN で虚部が NaN でないとか、
complex<double>としてはあり得ない値になるんじゃないのかな? 多分
そして、そういう値を使って演算した結果は
complex<double>の考慮外の結果を引き起こす可能性はあると思う

そういうのを度外視して、ちゃんとした値が入っている事が保証されている状況であれば、
可能であると言ってもいいんじゃないかと思う
524デフォルトの名無しさん:2012/11/27(火) 07:26:19.25
でもcomplex<double>のコンストラクタでどんな値でも入れられるんじゃない?
引数チェックなんてしてるのか?
525デフォルトの名無しさん:2012/11/27(火) 08:53:06.87
単に規格レベルでは

struct X { int m; };
int i;
X *p = reinterpret_cast<X*>(&i);

みたいなのですらpが正当なXへのポインタである保障はないってだけだろ
526517:2012/11/27(火) 09:52:36.09
>>518
使ってみます。ありがとう。
527デフォルトの名無しさん:2012/11/27(火) 12:15:40.28
>>521
その点が未解決です。>>516がヒントなんだろうけど、そこまで詳しくないから。
ちなみにC++03のように、クラス外に改めてdataの宣言をすれば通ります。
528デフォルトの名無しさん:2012/11/27(火) 12:20:53.47
>>523
サンクス。やっぱ微妙だな。
>>524,525
想定している使い道は、
double arr[2*N];
//arrに色々書き込む
complex<double> half[N];
//arrをhalfにmove
って話です。
もしarrが動的に確保されててmove後にarrを破壊したら
halfはどうなっちゃうの?とか、よく分かっていないw
529デフォルトの名無しさん:2012/11/27(火) 13:41:08.19
スライシングは機能ですか?バグですか?
530デフォルトの名無しさん:2012/11/27(火) 14:29:11.43
valarrayなら機能
531デフォルトの名無しさん:2012/11/27(火) 14:29:28.29
機能です。
基底クラスに必要な情報以外は削ぎ落とせ、というプログラマ明確な意思表示に対する正当な動作です。
532デフォルトの名無しさん:2012/11/27(火) 19:34:08.57
>>528
その用途なら
complex<double> half[N];
double *arr = reinterpret_cast<double*>(half);
としてarrを配列として使うべきだろ
533デフォルトの名無しさん:2012/11/27(火) 20:37:31.18
gcc4.7のcomplexヘッダ見ててナゾったんだけど
どうしてこのプリプロセッサ条件で上手くいくん?

#ifdef __GXX_EXPERIMENTAL_CXX0X__
constexpr T real() { return _real; }

#else
T& real() { return _real; }
const T&real() const { return _real; }

#endif
534デフォルトの名無しさん:2012/11/27(火) 21:24:34.99
なにが?
上手くいくん?ってのは「ぼくのかんがえではうまくいかないはずなのにこれでいいんですか?」って意味だろうが
君の考えは君以外の誰も知らないんだからそれだけでは誰もまともに答えられない
535デフォルトの名無しさん:2012/11/27(火) 21:48:10.45
科学の進歩によって「どのように」は説明できるようになった。
だが、「なぜか」を説明するのは難しい。
536デフォルトの名無しさん:2012/11/27(火) 21:58:52.86
解からないのなら口挟まないで下さい
537デフォルトの名無しさん:2012/11/27(火) 22:11:35.07
>>523
いや、reinterpret_cast<double*>(&c) が well-formed である以上、
そのポインタを使っていかようにも値は書き換えられることになる
だからその点は問題ないはず

何かあるとすればcomplex<double>に
特別なアラインメントを要請する実装があった場合くらいか
538デフォルトの名無しさん:2012/11/27(火) 23:18:05.47
>533
GCC の仕様がそうなってるから。
-std=c++0x とかがオプションで与えられると __GXX_EXPERIMENTAL_CXX0X__ が定義される。
http://gcc.gnu.org/viewcvs/trunk/gcc/c-family/c-cppbuiltin.c?revision=188178&view=markup の 718 行目。
539デフォルトの名無しさん:2012/11/27(火) 23:27:08.35
>>533ってどこが疑問か分からないんだけどみんな分かってるの?
540デフォルトの名無しさん:2012/11/27(火) 23:35:13.81
右辺値参照があるなら、右辺値参照でしか束縛できなくした、てだけだろ
俺はむしろ #else 側の実装が気持ち悪くて、やるべきことをやってくれたと見ている
541デフォルトの名無しさん:2012/11/27(火) 23:50:40.54
>515
(双方が Standard-layout type へのポインタ型でかつアラインメントが許せば)
reinterpret_cast による異なる(オブジェクト)型へのポインタの変換は、
C++11 においては void* を経由する 2 回の static_cast と同じ結果になると
規定が変更された。
void* への変換結果はオブジェクトの先頭を指す(まま)、という規定は以前から存在するため、
結果として reinterpret_cast による異なるポインタ型への変換は、
A→B→A で元に戻した場合以外は unspecified から、同じアドレスを指したままの変換、へと
挙動が変更されたことになる。

ということで reinterpret_cast で片方向の変換が OK であれば逆方向の変換も仕様上 OK としていいと思う。
542デフォルトの名無しさん:2012/11/28(水) 00:10:15.26
double* から char* への reinterpret_cast は可能だし
char* から double* への reinterpret_cast も可能だけど
アクセス可能かどうかは環境依存だな
double がアラインメント揃ってないと死ぬ事もあるし
543デフォルトの名無しさん:2012/11/28(水) 00:10:17.55
static_castでのvoid*からの変換の結果は行って戻るT*->void*->T*場合以外は未規定のままじゃないか?
544デフォルトの名無しさん:2012/11/28(水) 13:15:54.47
>543
standard layout type とかアラインメントを置いとくとして。

void * からの変換については static_cast の項に書かれていてその通り(行って戻るT*->void*->T*場合のみ元に戻る)。
一方、void* への変換は pointer conversion の項に書かれていて先頭を指すと記述されている。

この両方(行って戻ると先頭を指す)を満たすためには、void* からの変換についても先頭を指したままである必要がある。
この解釈が認められない場合、標準の範囲内では例えば unsigned char* を char* に妥当に変換する手段が規定されていないことになる。
(あるいは適当な型へのポインタ型を char* に変換してバイト単位でアクセスできない、とか)
さすがにそれはないだろうし、DR658 の記述からみても妥当な解釈だと思うけど。

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#658
545デフォルトの名無しさん:2012/11/28(水) 21:53:34.64
難しい話になってるけど、当初の自分(質問者)の問いに対して現時点で納得している答えはこれ。
typedef double T;
std::complex<T> c(1.0,1.0);
std::array<T,2> a;
std::copy_n(reinterpret_cast<T(&)[2]>(c),2,&a[0]);
std::copy_n(&a[0],2,reinterpret_cast<T(&)[2]>(c));
これで大丈夫なのか?

対称に書けてよろしいけど、
std::vector<T> c;
とか
std::valarray<T> c;
(aじゃないよ!)に対して同じコードではコンパイルは通るけど実行時にぐちゃぐちゃ(可変長だから?)。
結局reinterpret_cast<T*>(...)が万能ってことだろうか・・・。
546デフォルトの名無しさん:2012/11/28(水) 22:04:23.75
どうも静的な構造std::complex<double>とかstd::array<double>については上でよくて、
動的なstd::vectorとかstd::valarrayでは&c[0]にコピーするしかなさそう。
547デフォルトの名無しさん:2012/11/28(水) 22:10:10.66
新たな質問ですが、
>>546
の判別ってtype_traitsのstd::is_xxx<...>でできる?
548デフォルトの名無しさん:2012/11/28(水) 22:15:00.48
std::extent<...>::value
が0か2かでいけるかも。
これよりいい方法あるかしら?
549デフォルトの名無しさん:2012/11/28(水) 23:48:09.71
>>545
いや、なにがしたいの?

typedef double T;
std::complex<T> c(1.0,1.0);
std::array<T,2> a;
std::copy(reinterpret_cast<T*>(c), reinterpret_cast<T*>(c) + 2, a.begin());
std::copy(a.begin(), a.end(), reinterpret_cast<T*>(c));

そしてどういう意味?
>(aじゃないよ!)
complexがcでただのT(double)の集合がaじゃないの?
550549:2012/11/29(木) 01:05:04.71
reinterpret_cast<T*>(&c)だな
551デフォルトの名無しさん:2012/11/29(木) 17:16:40.59
コンパイルエラーメッセージのことを書いても大丈夫です?
552デフォルトの名無しさん:2012/11/29(木) 17:20:11.74
初心者歓迎 環境依存OKのほうで書いてみたらいいんじゃないんです?
553デフォルトの名無しさん:2012/11/29(木) 18:45:56.11
おい池沼が来たじゃねえか
554デフォルトの名無しさん:2012/11/29(木) 21:58:35.34
検索してひっかかったのを貼るけど、
https://ideone.com/Pmldk
これどういうこと?未実装?
555デフォルトの名無しさん:2012/12/01(土) 01:44:12.90
テンプレートと参照を駆使して、関数が複数の値を返せるシステム作ったひゃっほーwwwwww boost::tuple なんてものがあった…
556デフォルトの名無しさん:2012/12/01(土) 01:52:03.89
自分らが考え付くことなんて大抵ほかの人がやってるよね
557デフォルトの名無しさん:2012/12/01(土) 07:22:42.47
STLのmapについて教えてください。VC++2008です。

error C2784: 'bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)' : テンプレート 引数を 'const std::_Tree<_Traits> &' に対して 'const std::string' から減少できませんでした

というエラーが出ています。
STL初心者です。

こんな風(↓)に使っています。たぶんconst char *とstd::stringの間で変換できないから?かなーと思うのですが、何分初心者なので。。

HANDLE _get_handle(const char * key)
{
   HANDLE hFile;
   std::map<std::string, HANDLE>::iterator it;
   if((it = gFileTable.find(key)) == gFileTable.end())
   {
      return INVALID_HANDLE_VALUE;
   }
   else
   {
      return (HANDLE)(it->second);
   }
}

適切な使い方をご教授いただけると助かります。

以上、よろしくお願い致します。
558557:2012/12/01(土) 07:25:46.38
済みません、解決しました。。
#include <string>が抜けてました。。。。。。。。。。。。。。。。
559デフォルトの名無しさん:2012/12/01(土) 07:47:10.11
>>556
まあでも車輪の再発明も、勉強という意味では悪くないよね・・・
560デフォルトの名無しさん:2012/12/01(土) 08:30:09.83
車輪を再発明した事のない奴は
設計能力が鍛えられてないんじゃないかと思う
561デフォルトの名無しさん:2012/12/01(土) 11:31:45.02
再発明はぜんぜんマシだろ。
下々にはコピペ業をいとなむコードモンキーという動物がおってだな・・・
562デフォルトの名無しさん:2012/12/01(土) 12:45:43.43
コマンドラインアプリの引数なんですが
Windowsでは/をUnixでは-を使うのがルールなんですか?
winで-使ったら怒られますか?
563デフォルトの名無しさん:2012/12/01(土) 12:47:43.92
どっちでも通るようにするのが通
564デフォルトの名無しさん:2012/12/01(土) 12:51:58.26
Unixから移植したアプリはそのまま-を使ってるのが多い
565デフォルトの名無しさん:2012/12/01(土) 13:12:00.07
どの OS にしてもディレクトリ指定がなかなか面倒 / とか \ とか
566 忍法帖【Lv=40,xxxPT】(2+0:5) :2012/12/01(土) 17:10:02.13
セパレーターで良いよ。
567デフォルトの名無しさん:2012/12/01(土) 18:15:52.03
>>562
ぶっちゃけCUIアプリケーションの利用者層はusage:みたいなの見て勝手に合わせて使ってくれるから無問題
568デフォルトの名無しさん:2012/12/03(月) 15:26:13.32
ATTRIBコマンド

D:\work>attrib /?
ファイル属性を表示または変更します。

ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] [[ドライブ:] [パス] ファイル名]
    [/S [/D]]

 +  属性を設定します。
 -  属性を解除します。
 R  読み取り専用属性。
 A  アーカイブ属性。
 S  システム ファイル属性。
 H  隠しファイル属性。
 /S 現在のディレクトリとすべてのサブフォルダの一致するファイルを
   処理します。
 /D フォルダも処理します。
569デフォルトの名無しさん:2012/12/03(月) 15:57:00.11
お前のWindows古すぎるだろう
570デフォルトの名無しさん:2012/12/03(月) 16:15:51.37
C:\>attrib /?
ファイル属性を表示または変更します。

ATTRIB [+R | -R] [+A | -A ] [+S | -S] [+H | -H] [+I | -I]
    [ドライブ:][パス][ファイル名] [/S [/D] [/L]]

 +  属性を設定します。
 -  属性を解除します。
 R  読み取り専用属性。
 A  アーカイブ属性。
 S  システム ファイル属性。
 H  隠しファイル属性。
 I  非インデックス対象ファイル属性。
 [ドライブ:][パス][ファイル名]
   attrib で処理するファイルを指定します。
 /S 現在のフォルダーとすべてのサブフォルダーの一致するファイルを
   処理します。
 /D フォルダーも処理します。
 /L Symbolic Link のターゲットに対する Symbolic Link
   の属性で動作します。
571デフォルトの名無しさん:2012/12/12(水) 00:20:01.77
VC++についての質問です
ライブラリを作成してるのですが、Gui用とコンソール用で分けた方がいいでしょうか?
それとも一括で管理してしまって良いでしょうか?
572デフォルトの名無しさん:2012/12/12(水) 07:25:45.60
コンソール用の用途でよく使うのであれば分けた方がいいと思うが
そうでもなければ一緒でいいんじゃない?
573デフォルトの名無しさん:2012/12/12(水) 07:44:18.26
そもそもGUI用とコンソール用で仕様が全く同じで依存するライブラリも同じなら分けることもないだろう。
574デフォルトの名無しさん:2012/12/12(水) 08:34:20.97
ありがとうございました
ライブラリ内で
#include <Windows.h>
しているのですが、コンソールアプリケーションを作るときは必要ないのでどうしようか迷って質問しました
Gui作るときに毎回2つリンクさせるのが面倒ですし、重複した場合修正するのが2度手間になるので一緒にすることにしました
575デフォルトの名無しさん:2012/12/12(水) 11:31:43.92
馬鹿じゃね?
>ライブラリ内で#include <Windows.h>しているのですが、コンソールアプリケーションを作るときは必要ない
この時点で仕様が違うんだから別々にするべきだろ。
ソースは一つでも複数のターゲットを生成することくらいプロジェクトの設定でどうにでもなるだろ。
576デフォルトの名無しさん:2012/12/12(水) 18:36:14.94
ローカル(メンバ関数内)に文字数作ったら入るたびにメモリを割り当てて、出るたびにメモリを解放してるのかな?
そのメンバ関数をたくさん呼び出すなら、メンバ変数にした方がいいでしょうか?
577デフォルトの名無しさん:2012/12/12(水) 18:42:15.86
>>575
ぁあ、プロジェクトの設定毎回しなくていい方法見つけた
ありがとう
578デフォルトの名無しさん:2012/12/12(水) 19:05:52.12
>>576
void Foo::foo()
{
 char *s = "baz";
}

みたいなの?だったら実行ファイルに格納されててsにポインタが入るだけ(文字列分の領域はかくほされない)だけど
579デフォルトの名無しさん:2012/12/12(水) 19:08:32.24
ありがとうございました
580デフォルトの名無しさん:2012/12/19(水) 16:23:17.95
struct BBB
{
typedef bool ( BBB::*func_type )();
func_type func;
int a;
int b;
};
BBB bbb = BBB();

これでbbbが0で初期化されません
メンバ関数ポインタが入っているとPODにはならないんでしょうか。
581デフォルトの名無しさん:2012/12/19(水) 16:26:36.20
構造体を継承?
582デフォルトの名無しさん:2012/12/19(水) 17:10:16.48
>>580
「BBB::」を消せばいいのでは?
583デフォルトの名無しさん:2012/12/19(水) 17:22:52.82
>>582
メンバ関数じゃないとだめなので
584デフォルトの名無しさん:2012/12/19(水) 18:16:12.20
>>580
グローバルの話?なら=BBB()をどけろ。そいつで未初期化の一時オブジェクトが用意されて0初期化済みのオブジェクトに代入されてるから。

ローカルの話だとしても、=BBB()で、新たに用意された未初期化の一時オブジェクトから代入されてるだけたから

だいたい、括弧をつけることで0初期化されるのは単体のnewの時だけだから。
ローカルなオブジェクトを作ったときに括弧を付けたって、コンパイラにプロトタイプ宣言と間違われて、エラー吐かれるだけだからな?


PODを想定してて、それを0初期化したいなら、素直に = {}付けとけ。={0,}でもいいけど
585デフォルトの名無しさん:2012/12/19(水) 18:22:34.57
お、おう・・・
586デフォルトの名無しさん:2012/12/19(水) 18:52:10.40
typedef bool ( *func_type )();
だと0で初期化されて
typedef bool ( BBB::*func_type )();
だとされないのは仕様ですか?
587デフォルトの名無しさん:2012/12/19(水) 20:03:28.10
コンパイラの仕様かバグ
588デフォルトの名無しさん:2012/12/19(水) 21:15:11.98
>>580
そのソースのとおりなら0初期化されるわけがない

BBB()はデフォルトコンストラクタの呼び出し
BBBにはユーザー定義のデフォルトコンストラクタがないので暗黙に次のように定義される BBB() {}
これはメンバ初期化子リストを持たないので各メンバはデフォルト初期化される
組み込み型のデフォルト初期化はなにもせず値は不定値になる

BBBを0初期化したければアグリゲートだから BBB bbb = {}; とする
589デフォルトの名無しさん:2012/12/19(水) 21:16:42.22
BBB bbb = BBB();
これで0になるってのは仕様で決まってないってことですか?
590デフォルトの名無しさん:2012/12/19(水) 21:44:28.70
はい
591デフォルトの名無しさん:2012/12/19(水) 22:21:16.82
規格書読めよ
JISのほうは該当部分に誤訳があるから注意
592デフォルトの名無しさん:2012/12/19(水) 22:38:29.40
strtok(StrBuff,NULL);
NULLで分割されているchar配列StrBuffを分解したいんですけど、メモリエラーが出ます。
どうすればいいですか?
593デフォルトの名無しさん:2012/12/19(水) 22:46:10.37
セパレータがNULLだとすると終端はどうやって判別するの?
594デフォルトの名無しさん:2012/12/19(水) 23:01:51.06
>>592
うろ覚えだけど当たればラッキー
strtok(strBuf, "??0");
595デフォルトの名無しさん:2012/12/19(水) 23:04:52.61
文字化けした?
strtok(strBuf, "\0");
596デフォルトの名無しさん:2012/12/20(木) 00:06:17.41
>>593
NULLが連続して入ります

>>595
ありがとう、できた!
597デフォルトの名無しさん:2012/12/20(木) 00:08:37.70
あ、違う、終端もNULLだと、
最初の分解した要素までが元々の文字列だからstrtok(NULL,NULL)ができない・・・
598デフォルトの名無しさん:2012/12/20(木) 00:36:56.59
\0 一文字で区切って、終端が \0 二つってんなら
普通に strlen で分割しろよ
599デフォルトの名無しさん:2012/12/20(木) 00:46:45.12
>>592-597
ヌルポインタ定数 NULL と ASCII コード 0 NUL '\0' とをごっちゃにするんじゃねぇ。
http://www.kouno.jp/home/c_faq/c5.html#9
600デフォルトの名無しさん:2012/12/20(木) 01:05:05.16
>>580
試してみたら問題ないみたいだけど、「0で初期化されません」って何を見て言ってるの?
http://ideone.com/EY723z

メンバへのポインタも POD かどうかの判定では他のポインタと区別されることは無いよ。
3.9 [basic.types] p9

> BBB bbb = BBB();
このコードで、ゼロ初期化された BBB 型の一時オブジェクトから bbb がコピー初期化
されることになる。

>>584,588,590 あたりでいろいろ書かれてるけど、たぶんおかしい。
BBB() はゼロ初期化された POD 型の一時オブジェクトを得る式として有効。
5.2.3 [expr.type.conv] p2 および 8.5 [dcl.init] p7
601デフォルトの名無しさん:2012/12/20(木) 01:37:09.77
まあideoneやcodepadはセキュリティのため使用可能なメモリをデフォルトで0クリアしてるような気がしたから
そのコードの実行結果を参考にしちゃいけないと思うけど、言ってることは>>600が正しいんじゃないかな
602デフォルトの名無しさん:2012/12/20(木) 11:05:05.41
>>600
VC2010で試したらbbb.a,bbb.b,bbb.funcがどれも不定の値でした
603デフォルトの名無しさん:2012/12/20(木) 15:19:29.27
>>599
よくわからないのですが、できた・・?
http://codepad.org/X8ffqtZJ
604 ◆QZaw55cn4c :2012/12/20(木) 19:12:20.11
>>599
区別する必要は皆無、区別するのはわかっていない証拠、全部「0」と書いて無問題。
http://www.kouno.jp/home/c_faq/c5.html#9
605デフォルトの名無しさん:2012/12/20(木) 20:30:12.24
あの・・スレ違いなんですが、ここの方なら知ってると思って・・・
よく置換対象を指定するときに使われる${ABC}の括弧部分ってなんていうんでしょうか?
何か名前があった気がするんですが思い出せなくて・・・お願いします。
606デフォルトの名無しさん:2012/12/20(木) 20:39:37.02
>>605
マクロス
607デフォルトの名無しさん:2012/12/20(木) 20:46:30.58
>>605
カーリーブラケット
608デフォルトの名無しさん:2012/12/20(木) 20:51:09.80
あ・・・えっと$も含めてです。${}これで何か呼び名があったような・・・
609デフォルトの名無しさん:2012/12/20(木) 21:54:42.68
ワンダーラーカーリービスケット
610デフォルトの名無しさん:2012/12/20(木) 23:53:37.94
だれか >>599>>604 につっこんでやれよ‥‥‥
611デフォルトの名無しさん:2012/12/20(木) 23:59:42.69
NULLが0と定義されるかどうかは環境依存なんだがな
Cみたいに((void*)0)で定義してはいけないけど、
0と定義してもいいし、ヌルポインタを表す特殊な値で定義しても構わない
実際g++では__nullと定義している
612デフォルトの名無しさん:2012/12/21(金) 00:11:38.36
>>602
その「試した」の中身を聞いてるんだよ。
どんなコードで、何を(標準出力に出したもの?デバッガの表示?)を見たのか、と。
613デフォルトの名無しさん:2012/12/21(金) 00:15:17.04
規格上は0で初期化されるはずだが、
規格違反があったら知らん
614デフォルトの名無しさん:2012/12/21(金) 02:19:04.59
構造体変数の代入ってマルチスレッドにおいて不可分に実行されるのでしょうか?

通常のint変数とかだと、ストア命令1つで済むので、他スレッドが割り込んでしまう余地はないと思いますが、
構造体変数の場合、各メンバの代入に複数回のストア命令発行が必要になるので、
他スレッドが割り込んでしまう余地ができてしまうのではないかと思うのですが・・・
615デフォルトの名無しさん:2012/12/21(金) 02:25:37.66
はいそうです
616デフォルトの名無しさん:2012/12/21(金) 03:36:36.79
>>614
>通常のint変数とかだと、ストア命令1つで済むので、他スレッドが割り込んでしまう余地はない
マルチコアの場合はそうともいえないのでは?
617デフォルトの名無しさん:2012/12/21(金) 04:45:37.51
>>610
香ばしすぎて俺には無理だったw
618デフォルトの名無しさん:2012/12/21(金) 07:08:36.15
>>614
>通常のint変数とかだと、ストア命令1つで済むので、他スレッドが割り込んでしまう余地はない
メモリバリアでググれ
619デフォルトの名無しさん:2012/12/21(金) 10:17:09.28
>>612
struct BBB
{
typedef bool ( BBB::*func_type )();// タスクの型名
func_type func;
};
int main()
{
BBB bbb = BBB();
printf( "%d\n", bbb.func );
return 0;
}
こうです。デバッガで見ても出力してもbbb.funcは不定値でした。
メンバ関数ポインタではなく普通の関数ポインタにすると0になります。
620デフォルトの名無しさん:2012/12/21(金) 11:22:36.25
コンパイラの仕様でしょ。
いずれにせよ期待値を保証したいなら明確に初期化するべき。
定義時の自動初期化は暗黙の動作ということも忘れずに。
621デフォルトの名無しさん:2012/12/21(金) 12:16:32.20
622デフォルトの名無しさん:2012/12/21(金) 20:52:26.84
やっぱりVCのせいですか?チクチョーーー!
623614:2012/12/21(金) 22:14:18.93
>>615
やはりそうでしたか・・・

>>616
例えば、スレッドAで更新した変数を、スレッドBで参照するとき、
更新前、更新後どちらを読んでも支障がないような処理の場合は問題ないと言えますよね?
例えば、スレッドAは常にフル回転していて、そのときどきの状態を表す変数を更新し、
スレッドBは適当なタイミングでその変数をサンプリングしてGUIに表示するというようなケースです。

構造体の場合で、それを構成する複数のメンバ変数の整合が取れている必要があるとき(座標値など)は、
あるメンバだけは更新後を、他のメンバは更新前を参照してしまうのでは、と心配になります。

>>618
ありがとうございます。
やはり明示的に命令してやらんといかんのですね・・・。

調べていると、C++11ではstd::atomicという便利そうなライブラリが追加されたみたいなので、
これを使ってみようと思います。
じつは、つい先日、汎用性は低いものの、同じような自作ライブラリを作ってましたが(汗)
624デフォルトの名無しさん:2012/12/21(金) 22:21:20.43
キャッシュが絡むとめんどくさいんだっけ
マルチスレッドはよくわからん
625デフォルトの名無しさん:2012/12/21(金) 22:43:51.53
VC++でatomic使えるの?
626デフォルトの名無しさん:2012/12/21(金) 22:45:13.96
使える
627デフォルトの名無しさん:2012/12/21(金) 23:20:46.30
g++ではまだだっけ?
628デフォルトの名無しさん:2012/12/22(土) 07:21:24.65
Japan++でもatomic使える?
629デフォルトの名無しさん:2012/12/22(土) 15:05:27.62
現在ハンドルでクラスを管理しているようなプログラムを書いているのですが
class Base
{
630デフォルトの名無しさん:2012/12/22(土) 15:07:29.51
};
631デフォルトの名無しさん:2012/12/22(土) 15:08:44.38
途中送信
class Base
{
...
public:
Base* getInstance(Handle handle);
}

class Drive : public Base
{
...
}

これでDriveを呼びだそうとすると
Drive* drive = reinterpret_cast<Drive*>(Drive::getInstance(handle));
となってしまって、reinterpret_castも使う上に若干助長な気がするんですが
何かもっとスマートな方法ってありますか?
632デフォルトの名無しさん:2012/12/22(土) 15:09:34.17
staticが抜けましたが脳内補完でオナシャス
633デフォルトの名無しさん:2012/12/22(土) 15:19:54.86
仮装関数使えば?
634デフォルトの名無しさん:2012/12/22(土) 15:50:27.46
BaseとDriveの関係っていうか使い方がわからないからなあ
635デフォルトの名無しさん:2012/12/22(土) 15:57:24.59
仮想関数は返り値のタイプは変えられないですよね?
BaseとDriveの使い方次第な話なんですかね?今の場合Baseは単にnewとdeleteを特定のメモリ
から取るアロケーター的なものですが

今思いついたのはtemplateにすれば多少見た目良くなるかなあと
636デフォルトの名無しさん:2012/12/22(土) 16:00:52.60
仮想関数じゃダメなの?
637デフォルトの名無しさん:2012/12/22(土) 16:05:19.56
error C2216: 'virtual' と 'static' は同時に使用できません。
638デフォルトの名無しさん:2012/12/22(土) 16:07:03.46
そこじゃないだろ…
Baseに必要な仮想関数を定義すればいいって話だろうが
639デフォルトの名無しさん:2012/12/22(土) 16:09:15.49
具体的にはどういうことですか?
640デフォルトの名無しさん:2012/12/22(土) 16:09:15.78
template <typename T>
struct Base{
static T* getInstance(Handle handle);
};

class Drive : public Base<Drive>

その使い方ならアップキャストしなくていいだろうからCRTPでいいよね
641デフォルトの名無しさん:2012/12/22(土) 16:13:11.52
>>640
うおお目からウロコです
CRTP,初めて知りました、やってみます
642デフォルトの名無しさん:2012/12/22(土) 16:22:15.57
Drive → Derive では?
643デフォルトの名無しさん:2012/12/22(土) 16:54:51.49
動詞の原形はおかしいので Derived あたりでは
644デフォルトの名無しさん:2012/12/22(土) 16:58:02.83
自動詞なので前置詞を付けるべき
645デフォルトの名無しさん:2012/12/22(土) 17:53:12.23
キャスト使うにしても static_cast だろ、この場合。
646デフォルトの名無しさん:2012/12/23(日) 02:46:09.10
何用なのか知らんが、嫌な予感しかしないな
647デフォルトの名無しさん:2012/12/23(日) 09:34:36.99
↑この人はもしかして中二病ってやつなんですかね?
648デフォルトの名無しさん:2012/12/23(日) 09:43:11.37
だが待ってほしい
IDE上でコードを叩く姿は十分に厨二らしいのではなかろうか
649デフォルトの名無しさん:2012/12/23(日) 13:38:27.72
質問です

#include <functional>

int (*func)(int, int, void*)
  ↑上の型に変換したい
int (CSample::*func)(int, int, void*)

std::function<int (int, int, void*)> にはstd::bindを使うことで変換できるのですが、
これを int (*func)(int, int, void*)型に変換するにはどういった処理をするとよいのでしょうか?
650デフォルトの名無しさん:2012/12/23(日) 13:41:34.70
CSampleのポインタを引数にすればいいだけだよ。
651デフォルトの名無しさん:2012/12/23(日) 13:50:14.24
>>649
足りなくなる引数 CSample* を静的変数あたりから引っ張ってくるラッパーをかませば可能だろう。
「よい」かどうかは知らない。
652デフォルトの名無しさん:2012/12/23(日) 13:51:42.23
>>650
int (*func)(int, int, void*)
これは引数として固定されているので、うまく変換したいんです・・・
653デフォルトの名無しさん:2012/12/23(日) 14:05:19.58
static CSample * p;

int func(int a, int b, void * q) {
p->func(a, b, q);
}
654デフォルトの名無しさん:2012/12/23(日) 17:38:55.48
>>652
それシグネチャ一致してないのは理解してるん?
暗黙のthisポインタを埋めないと、変換もクソもない
655デフォルトの名無しさん:2012/12/23(日) 17:45:27.86
>>649
どういう関数かは分からんが、
普通は void* に this ポインタが渡されるようにして、
static メンバ関数を func に渡して
その static メンバ関数内で
渡されてきた this ポインタを使って非 static メンバ関数を呼ぶ

class CSample {
 static int Func(int x, int y, void* self) {
  return static_cast<CSample*>(self)->Func(x, y);
 }
 int Func(int x, int y) {
  // ここで処理
 }
};
656649:2012/12/23(日) 19:09:51.23
やはりこういうケースではstatic関数経由で分岐させるしかないってことですかね・・・
657デフォルトの名無しさん:2012/12/23(日) 19:21:15.07
というかそれが鉄板
658デフォルトの名無しさん:2012/12/23(日) 21:57:13.07
>>624
キャッシュメモリに関しては、IA-32やIA-64のマルチコアCPUでは
<今のところは>コア間のキャッシュメモリの一貫性をハードウェアで自動的にとってくれるから
危険性は無く、プログラマは実行効率のみ気にしていれば良い
実験的に作られてたりしている48コアとかのやつはそうではないらしいが

それよかマルチコア構成ではキャッシュメモリよりもOoO(Out of Order実行)の影響が危険なのだが
VC++2005以降ならvolatileでおk
メモリフェンスをきちんとやってくれるようにvolatileの仕様変更がなされた
ttp://yamasa.hatenablog.jp/entry/20090720/1248089123
659デフォルトの名無しさん:2012/12/23(日) 22:04:03.02
説明してくれてありがたいんだけどよくわからん
わしこの仕事向いてないかも
660デフォルトの名無しさん:2012/12/23(日) 22:06:36.76
>>658
それはあくまでintだけでしょ?
661デフォルトの名無しさん:2012/12/23(日) 22:30:52.04
vlatileしといて
a&=~!(a&x);の結果が正しいかどうかなんか考察したく無いよ
662デフォルトの名無しさん:2012/12/23(日) 22:34:15.13
続きは環境依存スレで
663デフォルトの名無しさん:2012/12/26(水) 08:21:48.83
volatile ってどういう風に効くんですか?

「割り込み内で利用する変数に使う」みたいなこと書かれていたように思いますが
変数を確保したメモリー空間に対して排他制御するわけでもなく
勝手にスレッドセーフにしてくれるわけでもないですよね?

volatile char xxx[256];

とか意味あるのかな?と
664デフォルトの名無しさん:2012/12/26(水) 08:31:25.22
最適化で消えないようにするだけ
665デフォルトの名無しさん:2012/12/26(水) 08:38:36.10
プラプラはusingて使わない文化なの?
C#やった後だとすごい違和感あるんだが?
666デフォルトの名無しさん:2012/12/26(水) 09:16:11.07
>>663
>volatile ってどういう風に効くんですか?

組込み系で、特定のハードウェア端子をオン・オフするのに使う事もある。
667デフォルトの名無しさん:2012/12/26(水) 09:21:30.57
>>665
人それぞれだね。
使いすぎると全部グローバルになっちゃうからな。
668デフォルトの名無しさん:2012/12/26(水) 09:49:04.57
volatileはあまり使い物にならないよ
メモリバリアを作りたいのならmutexやクリティカルセクションなどOS呼び出ししないと変なバグに悩まされる
669デフォルトの名無しさん:2012/12/26(水) 12:23:31.26
>>665
C#のusingとC++のusingって意味がちがくね?
670デフォルトの名無しさん:2012/12/26(水) 12:33:13.49
規格で定められている範囲ではろくなことできねーから知らなくてもいい
671デフォルトの名無しさん:2012/12/26(水) 12:54:29.71
>>663
組み込みのプログラムなどで、メモリマップドI/O(アドレスにチップ信号が
出てくるようなメモリマップ)をアクセスする時なんかに使う。
ある変数に入っている値は、通常「演算しない限り不変である」と判断して
毎回読まないでレジスタ上の値を再利用するようにコンパイルされる。
これをやると、コンパイラが知らないところで値が書き換わるような構造は
対応できない。
そこで「この変数は毎回読まないと信用できませんよ」ということをコンパイラ
に教えてやるために使うキーワード。
ただし排他制御とは違う概念なので、マルチスレッドの変数ロックには別途
それ専用の仕組みを使う必要がある。
672デフォルトの名無しさん:2012/12/26(水) 19:06:10.59
C++11ならstd::mutexやstd::atomicが標準ライブラリに入っとるからそれを使えばよい。
まともなC++コンパイラ(gccとかclang)なら使えるはず。
673デフォルトの名無しさん:2012/12/26(水) 19:13:37.81
g++でatomicまともに使えたっけ?
674デフォルトの名無しさん:2012/12/30(日) 14:45:46.52
あああああああ
675デフォルトの名無しさん:2012/12/30(日) 15:05:20.85
どうした、当然?w
676デフォルトの名無しさん:2013/01/01(火) 08:28:43.46
C系の言語はPascalと違い、関数の定義の入れ子(ローカル関数の定義)は
できないと今の今まで思っていたわけですが、
C++でclassを介するとできてしまった↓
http://codepad.org/ohNwTXOF

これって何か落とし穴とか弊害とか無い?
(例えば、環境によっては別の大域関数シンボルと人知れず被ることがある、とか
677デフォルトの名無しさん:2013/01/01(火) 08:41:16.73
それ Pascal のローカル関数とは違うぞ。

※ Bar::frac( ) から main( ) のローカル変数にアクセスできない。

まあ、正しい構文だし、別に弊害はないと思う。
678デフォルトの名無しさん:2013/01/01(火) 08:45:29.60
>>676
>C系の言語はPascalと違い、関数の定義の入れ子(ローカル関数の定義)は
>できないと今の今まで思っていたわけですが、

Cでも、gccは可能。
>http://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html
6.4 Nested Functions
679デフォルトの名無しさん:2013/01/01(火) 11:13:00.16
>>676
C++11ではラムダを使ってローカル関数が作れるぞ
680デフォルトの名無しさん:2013/01/01(火) 17:59:02.53
>>671
変数のRAM上の内容と、レジスタにあるコピーの同期に関するキーワードなんですね

volatile 修飾すると、レジスタにコピーを残す最適化はできなくなって
毎回メモリ上の値を読まないといけないんですね

volatile は、最適化させないキーワードということでおk?
681デフォルトの名無しさん:2013/01/01(火) 19:17:24.10
× 最適化させない
○ 変数の値を毎回ロードする

レジスタ上にロードした変数の値を再利用しないのがvolatile
682デフォルトの名無しさん:2013/01/01(火) 19:40:43.93
命令の順番の入れ替えとかも抑制するんじゃなかったっけ?
683デフォルトの名無しさん:2013/01/01(火) 20:22:55.82
>>682
横だが
ReadとWriteの順番を入れ替えたら毎回ロードしたうちにならないんんジャマイカ、
684デフォルトの名無しさん:2013/01/01(火) 21:05:19.41
>>683
volatile int a = 0;
foo += 4;
a = 3;
bar += 5;

とあったとき、foo += 4; と bar += 5; の間のタイミングで必ず a = 3; が行われるとかそういう意味
最適化で
a = 3; foo += 4; bar += 5;
とか
foo += 4; bar += 5; a = 3;
とかのように命令が移動されることは無いよ、と

foo や bar も volatile の時は特に重要で、
(CPUのではなく、メモリマップドI/Oで操作される)レジスタの操作順が保証されないと困る
685デフォルトの名無しさん:2013/01/01(火) 21:18:04.39
>>684
でっていう

例えば生成コード上でa = 3がbar +=5の後ろに移動したとしたら、
ソースリスト上でa = 3; の次にあるread modify writeであるbar +=5; のロードが行われないってことになるジャン
これはvolatileな変数を「毎回ロードする」という約束に反する

つまり>681のvolatileの定義は、命令の順番入れかえの禁止も必要条件として要請するから>681だけでおk
686【補足】:2013/01/01(火) 21:23:01.82
ただし、アウトオブオーダー実行が絡むと、生成コード上の順序が
他のコアからは生成コード上の順序どおり実行されているように見えなかったりする
(自コアの読み書きの結果を自コアで参照する分には問題ない)
これがマルチコアではvolatileだけでは不足でメモリフェンスが必要な理由う
687デフォルトの名無しさん:2013/01/01(火) 21:34:37.57
>>685

別に順番が変わろうがロードする事に変わりないだろ?
688 【中吉】 【1331円】 :2013/01/01(火) 22:01:31.41
SS実装毎で演算結果が変わるのはマズイだろ
689デフォルトの名無しさん:2013/01/01(火) 22:02:23.86
>>687
ロードに対する副作用の存在を仮定するか否かの違いがある
volatile変数への操作は他のvolatile変数への副作用があるものとして扱われる
(故に「ソースリストに現れた位置で」「毎回」(←これら重要)ロードする必要がある)

…と書いて気づいたが、>684の説明は、もしvolatileなのがaだけで、fooとbarが普通の非volatile変数なのだとしたら
fooやbarに対する操作と、a=3;との順後の前後は最適化で普通に起きるから間違いということに
690デフォルトの名無しさん:2013/01/01(火) 22:07:25.30
そもそも論で申し訳ないのですが

>>684
> foo や bar も volatile の時は特に重要で、
> (CPUのではなく、メモリマップドI/Oで操作される)レジスタの操作順が保証されないと困る

a に読み書きする毎に、メモリからレジスタに毎回ロードすることと、
volatile ではない foo や bar への命令順序って、やはり重要なんでしょうか?

一見、関係なさそうな…
691デフォルトの名無しさん:2013/01/01(火) 22:08:38.38
そもそも論で申し訳ないのですが

>>684
> foo や bar も volatile の時は特に重要で、
> (CPUのではなく、メモリマップドI/Oで操作される)レジスタの操作順が保証されないと困る

a に読み書きする毎に、メモリからレジスタに毎回ロードすることと、
volatile ではない foo や bar への命令順序って、やはり重要なんでしょうか?

一見、関係なさそうな…
692デフォルトの名無しさん:2013/01/01(火) 22:11:58.57
>>688
コンパイラの使命はもちろんプログラムの意味を買えずにソースコードからオブジェクトコードに翻訳することだが、
副作用が存在する場合としない場合とで最適化の立ち位置が変わってきますよ
副作用が存在する場合に副作用の存在を仮定しない最適化を行うとプログラムの意味が変わってしまいますよ、
とか
そんな感じの話
693デフォルトの名無しさん:2013/01/01(火) 22:17:20.92
>>689
で、
・volatile が a だけの場合、
・volatile が a, foo, bar の場合
でそれぞれ最適化での順番変更は
仕様上起こるんだっけ起こらないんだっけ
694680=690=691:2013/01/01(火) 22:36:23.08
二重投稿になってしまいました。すみませんOTL

> レジスタ上にロードした変数の値を再利用しないのがvolatile
> volatile変数への操作は他のvolatile変数への副作用があるものとして扱われる

これが根源的なんでしょうね…具体的な状況はよく分からないけど、そうだったら全て納得できる
そこから、命令の順番入れかえの禁止も必要条件として導かれる、と

foo や bar が volatile であるかどうか、が命令いれかえの禁止に関して
重要になってくるのかどうかは、よくわからないけどOTL
695デフォルトの名無しさん:2013/01/01(火) 23:50:00.62
>>694
> volatile変数への操作は他のvolatile変数への副作用があるものとして扱われる
だから、fooやbarがvolatileでなければ
順番変わってもいいということかいな?
696デフォルトの名無しさん:2013/01/02(水) 07:50:43.35
俺もそう思う。

そもそも volatile ではない foo や bar はメモリー上に実体がないかもしれないしね。
697デフォルトの名無しさん:2013/01/04(金) 12:09:02.99
お知恵拝借

cppファイル単位でエラーチェックを行いたいと思いました
具体的には、ファイルの冒頭で
#define CHECK_ERR
だと組み込んだエラーチェック関数がコンソールにエラーを出力するというものです
エラー関数自体は異なるファイルで共通のものにしたいのですが、どうするのが楽でしょうか
愚直には
...
#ifdef CHECK_ERR
eprintf("err:%d\n",err);
#endif
...
を全チェックポイントに記述すればよいのですが
つまるところこの#ifdef~#endifをeprintfに組み込む方法ってありますでしょうか
698デフォルトの名無しさん:2013/01/04(金) 12:20:47.86
windowsならATLTRACEとか参考にすればいいんじゃないかな
699697:2013/01/04(金) 12:23:10.09
ある程度思いつきました

#ifdef CHECK_ERR
#define eprintf(...) printf(__VA_ARGS__)
#else
#define eprintf(,,,)
#endif

これを作っておき、各cppファイルでこのファイルをインクルードする前に
#deifne CHECK_ERR
を記述すればチェックポイントにはeprintfだけで済む気がします

ただ、ここまで思いついて気付いたのですがヘッダにもinline的な関数があるので
結局影響範囲が広大になってしまうんですよね・・・
#undef eprintf
#define eprintf(,,,)
も使うべきか
700デフォルトの名無しさん:2013/01/04(金) 12:25:15.64
>>698
ありがとうございます、windowsですので調べてみます
701デフォルトの名無しさん:2013/01/04(金) 18:03:58.99
>>699
ヘッダ内でそれをやろうとすると
どうやってもundefしないとダメな宿命だと思われ
702デフォルトの名無しさん:2013/01/04(金) 19:48:00.12
__FILE__マクロでも引数にして、エラーが起きたソースファイル名を
エラー出力すればいいんじゃないの。
703デフォルトの名無しさん:2013/01/04(金) 20:11:21.05
ファイル単位でeprintfの有効無効を切り替えたいって話でしょ
704デフォルトの名無しさん:2013/01/04(金) 20:26:04.24
>>699
動くかどうかは知らん

[check_err.h] 最初にincludeする
#ifndef CHECK_ERR_H
#define CHECK_ERR_H
#include <stdio.h>
#define eprintf (!(CHECK_ERR)) ? (void)0 : (void)printf
#define CHECK_ERR 0
#endif

[main.cpp]
#include "check_err.h"

#undef CHECK_ERR
#define CHECK_ERR 1
#include "func1.h" // エラー出力有り

#undef CHECK_ERR
#define CHECK_ERR 0
#include "func2.h" // エラー出力なし
705デフォルトの名無しさん:2013/01/05(土) 02:31:54.96
危険だよ
可変個引数を使ってる安全な実装から劣化させてどうすんの
706デフォルトの名無しさん:2013/01/05(土) 12:26:29.23
一番簡単かつ安全かつまっとうと思われるなのは
可変長引数のインライン関数としてeprintf()を実装しておき、
ただしNDEBUG時は中を空にして最適化で除去されるのを気体する、

いやC++の言語仕様的にインライン関数で可変長引数を許しているかとか、
可変長引数な関数が空のとき最適化で本当に除去されるかとか未知数だが

上記でどうしてもダメなようなら、可変長引数が手の施しようのないガンだと特定されるので
YOU単発表示に切り替えなYO
#define EPRN(x) if (0) else std::cerr << #x << "=" << (x) << ";"
#define ENDL() if (0) else std::cerr << std::endl
として、NDEBUG時は上記マクロを空にする
707706:2013/01/05(土) 12:30:44.28
複数一挙に表示させたいときは連言する:
 EPRN(a); EPRN(b); EPRN(c); EPRN(d); ENDL;
すると、
 a=1;b=2;c=3;d=4;
こうなる
708706:2013/01/05(土) 12:52:12.87
スマンマクロの定義はこうだったorz
#define EPRN(x) if (1) { std::cerr << #x << "=" << (x) << ";"; } else
#define ENDL() if (1) { std::cerr << std::endl; } else
何か処理を追加したくなったらthen節のブロックの中に普通に追加して良い(do { } while(0)でも可)

もしくは、WindousのTRACEn()系マクロ式にやっても可変長引数を排除できる
つまり、TRACE0(cap)、TRACE1(cap, x),、TRACE2(cap, x, y)、TRACE3(cap, x, y, z), ..., TRACE8(cap, x, y, z, aa, ab, ac, ad, ae, af)
を定義してやり、引数の数に応じてnの部分を変えて使い分ける
709デフォルトの名無しさん:2013/01/05(土) 13:01:44.95
どうして仕様確認せずに気持ち悪いマクロ作るの?
710デフォルトの名無しさん:2013/01/05(土) 13:02:49.05
コンパイラが可変長引数テンプレート実装してればそれ使えばいい
711デフォルトの名無しさん:2013/01/05(土) 13:09:28.82
多分こんな感じにすれば良かったんだな
#define eprintf(...) do { !(CHECK_ERR) ? (void)0 : (void)printf(__VA_ARGS__); } while(0)
712デフォルトの名無しさん:2013/01/05(土) 13:11:02.71
可変個引数マクロを知ってる人に
ドヤ顔で変なマクロをすすめるのはやめていただきたい

VC++なら __noop を使う方法をとれば
gcc なら __VA_ARGS__ を使う方法をとれば
比較的移植性は高い

最も移植性が高いのは括弧を二重にする方法
713デフォルトの名無しさん:2013/01/05(土) 15:53:44.54
#ifdef CK_ERR
# define eprintf_FILE_HPP() printf()
# ifndef eprintf
# define eprintf() eprintf_FILE_HPP()
# endif
#else
# define eprintf_FILE_HPP()
#endif

inline … eprintf_FILE_HPP();…}
714デフォルトの名無しさん:2013/01/05(土) 21:16:11.21
eprintfをどう実装するかなんか誰も聞いてないだろ
715デフォルトの名無しさん:2013/01/07(月) 20:51:08.17
>>712
VC++でも__VA_ARGS__使えるからそれが一番いい。
__noopも便利なんだけど、移植性を考えるとちょっと躊躇するね。
716デフォルトの名無しさん:2013/01/07(月) 21:51:01.16
eprintfをどう実装するかなんか誰も聞いてないだろ
717デフォルトの名無しさん:2013/01/08(火) 22:57:58.66
イテレータをつくってみようと思ってBoost.Iteratorを使って以下のようにコードを書きました
http://ideone.com/fFSgEN
けどコンパイルするとalgorithm内でNo matching function for call to 'swap'.と言われてしまいます
何が問題なのでしょうか
環境はapple llvm 4.1?とBoost 1.52.0です
718デフォルトの名無しさん:2013/01/09(水) 00:58:29.61
>>717
iterator_facade のテンプレート引数 Reference に T を指定してるのがおかしい。
参照なんだから T& にしないと。
http://www.boost.org/doc/libs/1_52_0/libs/iterator/doc/iterator_facade.html#id12

っていうか、そこ移行わざわざ指定しなけりゃ T& になるのに。
719デフォルトの名無しさん:2013/01/09(水) 01:47:55.99
変なコンテナだなー
720デフォルトの名無しさん:2013/01/09(水) 01:51:40.33
>>717
ついでに言っとくとdereferenceの返却値型がint&に決めうちなのもおかしいぞ
721デフォルトの名無しさん:2013/01/09(水) 22:26:16.05
boost::iterator_facade<Iterator, T, boost::random_access_traversal_tag, T&, int>としたら通りました
ありがとうございます

>>718
swap(int, int)は存在しえないからエラーになったという理解で良いんでしょうか

>>719
正直自分でもそう思います

>>720
凡ミスでした
T&ですね
722718:2013/01/09(水) 22:30:48.62
>>721 うん。
723デフォルトの名無しさん:2013/01/10(木) 02:20:34.53
>>722
ありがとう
724デフォルトの名無しさん:2013/01/11(金) 14:50:02.55
cppてなんでこんなに書きにくいのに人気なんですか?
725デフォルトの名無しさん:2013/01/11(金) 14:59:57.75
cpp=Cプリプロセッサ
726デフォルトの名無しさん:2013/01/12(土) 00:08:21.43
>>724
書きやすいかどうかだけが基準じゃないだろ?
お前自分の会社の面接受けにきたやつが話しやすいってだけで雇うか?
727デフォルトの名無しさん:2013/01/12(土) 00:12:32.75
最近の、特に大手ではその傾向がありますよ?
728デフォルトの名無しさん:2013/01/12(土) 00:14:43.24
書きにくいとか、人気があるとか
主観的すぎて赤の他人にわかるはずがない
729デフォルトの名無しさん:2013/01/12(土) 00:28:59.86
>>727
それは書類選考や試験が終わってる前提の話だろボケ

いきなり面接やって「話しやすいですね、はい内定」とかないからw
そんなのは一部のバイトだけだ
730デフォルトの名無しさん:2013/01/12(土) 00:31:42.81
どの言語でも大抵作りたいものは作れる
その上で使いやすいかどうかって話だろ
731デフォルトの名無しさん:2013/01/12(土) 00:35:42.82
顧客の中には、「ボタン一発で全部出来るようにしてくれ」というのが居る
==>それが出来たら、あんた要らなくなるやん。
って話と一緒だな。
「書きやすくなるまで使わない」で済むのは、エンドユーザであって、クリエーターではない。
732デフォルトの名無しさん:2013/01/12(土) 00:41:06.18
【あなたに合ったプログラミング言語診断】
Yes:→  No:↓


とりあえずそれっぽく動くものが作れればいい → HSP、ひまわり、JavaScriptでも使ってろゴミ

処理速度は遅くていい → PHP、Perl、Rubyでも使ってろマジキチ

クラスは不要 → C言語でいいんじゃね?

C++をおすすめします
733デフォルトの名無しさん:2013/01/12(土) 01:02:01.44
俺はC++使ってるけど、STLまみれでJavaみたいになってるよ
734デフォルトの名無しさん:2013/01/12(土) 09:53:09.24
>>732
とりあえずそれっぽく動くもの作れて何が悪いんだよwww
735デフォルトの名無しさん:2013/01/12(土) 11:14:55.21
質問 以下の様な作法のapiがあるとします
ParentHandle parentH = getParentHandle();
ChildHandle childH = getChildHandle(parentH);
...
disposeChildHandle(childH);
disposeParentHandle(parentH);
これをC++的にラップしたい場合
class Child
{
friend class Parent;
 ChildHandle m_childH
 Child();
 Child(ParentHandle parentH){m_childH = getChildHandle(parentH);}
public:
 ~Child(){disposeChildHandle(m_childH);}
}
class Parent
{
 ParentHandle m_parentH;
public:
 Parent(){m_parentH = getParentHandle()}
 ~Parent(){disposeParentHandle(m_parentH);}
 Child birthChild(){return Child(m_parentH);}
}
このような感じにしたいのですが、これではreturn Child(m_parentH)でこの行が終了時点でChildの
デストラクタが呼ばれ、常に死産になってしまいます。
無事出産させるべきにはどのように設計すべきでしょうか
736デフォルトの名無しさん:2013/01/12(土) 11:17:48.40
std::shared_ptr<ChildHandle> m_childH;
737デフォルトの名無しさん:2013/01/12(土) 11:34:34.76
class Child
{
...
public:
Child(class Parent& parent){m_handle = getChildHandle(parent.m_handle);}
...
}
class Parent
{
...
friend Child::Child(Parent& parent);
public:
...
}
とか
738デフォルトの名無しさん:2013/01/12(土) 11:58:06.01
>>735
参照カウント
739デフォルトの名無しさん:2013/01/12(土) 12:16:06.13
一般に参照カウントはスコープ抜ける回数に使えそうですね
助言ありがとうございます
740デフォルトの名無しさん:2013/01/12(土) 16:46:01.36
>>734
「それっぽく動く」を「それなりに動く」と勘違いしてないか?
741デフォルトの名無しさん:2013/01/13(日) 15:17:48.78
CとC++ってどっちが早いの?
742デフォルトの名無しさん:2013/01/13(日) 15:23:21.68
>>741
確かCのはず
具体的なコードについてはベンチとってみれば良い
743デフォルトの名無しさん:2013/01/13(日) 15:25:05.28
>>741
CによるプログラミングもC++によるプログラミングもチューリング完全なので
片方で書けるアルゴリズムは他方でも書けるという意味で、同等
書く手間はもちろん違う(C++は関数のインライン展開がCより簡単に書けるし、テンプレートも使える)
生成されるオブジェクトコードの(アセンブリレベルでの実行ステップ数の)優劣は、
言語の違いというより処理系の違いで論ずるべき

『プログラミング作法』(か何かのカーニハンの本)では、
C++の方がCより実行時間の予測がつけ難いとありそれはまあ実感としてある
744デフォルトの名無しさん:2013/01/13(日) 15:25:14.70
>>741
Cのほうがコンパイルは速いよ。
実行速度事のなら、CにできてC++にできないことはない。後はわかるな?
745デフォルトの名無しさん:2013/01/13(日) 15:28:44.16
同じコードなら同じ
746デフォルトの名無しさん:2013/01/13(日) 15:47:19.22
例外発生時のロールバックへの対応があるから
僅かにC++の方が関数のエントリー部分が遅いような事を聞いた事が
noexcept なら別かもしれないが

あとはテンプレートのあるC++の方が
型によらない処理は速く書ける
型毎に自前で処理を書くならCでもほぼ同じ速度になるだろうけど
現実的じゃない場合も多い
747デフォルトの名無しさん:2013/01/13(日) 15:48:51.83
例外出ないときのコストなんかないよ
返り値チェックのコストは毎回かかるからむしろ例外のが早い
748デフォルトの名無しさん:2013/01/13(日) 15:56:02.46
逆汗したけど確かに同じだな >gcc, g++
749デフォルトの名無しさん:2013/01/13(日) 17:33:30.45
SjLj、Win32は例外発生しない時でもコストが有る
DWARF2、Win64は無い
750デフォルトの名無しさん:2013/01/13(日) 17:35:55.06
実行ファイル形式の問題なのか?
751 ◆QZaw55cn4c :2013/01/13(日) 17:37:47.47
例外の実装がsetjmp/longjmp って本当?
752デフォルトの名無しさん:2013/01/13(日) 17:42:05.13
ミニマムなコードだけ比較して例外の方が速いとか言ってんじゃないだろうなー!
753デフォルトの名無しさん:2013/01/13(日) 18:02:59.69
>>751
んなわけねーだろ
754デフォルトの名無しさん:2013/01/13(日) 18:06:35.06
SjLjは名前から察してくれ
755デフォルトの名無しさん:2013/01/13(日) 19:16:12.03
>>750
それが関係あるんだわ
756デフォルトの名無しさん:2013/01/13(日) 20:39:33.44
コンパイラの実装の問題だけかと思ってたけど、それだけもないんだな
757デフォルトの名無しさん:2013/01/13(日) 21:22:41.64
>>751
ある意味本当
setjmp/longjmp型実装の処理系と、
ゼロコスト実装の処理系がある
http://zakkas783.tumblr.com/post/3870295160/c
758デフォルトの名無しさん:2013/01/13(日) 23:40:20.39
↓のページに知りたいこと書いてるみたいだけど何て書いてあるか理解できんw
http://ja.softuses.com/161152

テンプレートとインタフェースって同じような使い方できるじゃんって思って
どちらがどういう時に使うか知りたい
759デフォルトの名無しさん:2013/01/13(日) 23:58:36.72
http://stackoverflow.com/questions/1165963/c-standard-practice-virtual-interface-classes-vs-templates
それここの機械翻訳転載だから原文読んだほうがいいんじゃないの
760デフォルトの名無しさん:2013/01/14(月) 06:30:33.30
OSやコンパイラ、ライブラリを巻き込んで終いにゃセキュリティまで絡んでくるから
触らぬ神に祟りなしだとおもうよ
761デフォルトの名無しさん:2013/01/14(月) 08:04:35.75
>>753生きてるか?
762757:2013/01/14(月) 12:31:30.25
>>761
>753の生死についてはノーコメントだが、
漏れもたまたま>753のページを見ておらねば>753のように反応したであろう
763デフォルトの名無しさん:2013/01/14(月) 12:36:45.90
どちらにしろ使ってるコンパイラは皆無なんじゃね
764デフォルトの名無しさん:2013/01/17(木) 22:30:54.99
aaaaaaa.cppに

int aa = 0;

と書いた場合、グローバルに書いてあるけど、他のファイルからアクセスしようがないですよね?
static int aa = 0;にするのと違いあるんですか?
765デフォルトの名無しさん:2013/01/17(木) 22:36:35.06
>>764
他のファイルでextern int aa;ってすれば使える
staticがついてたら externしても使えない
766デフォルトの名無しさん:2013/01/17(木) 23:03:41.59
staticはC++では古い記述法だけどね
無名名前空間に入れるのがC++流
767デフォルトの名無しさん:2013/01/20(日) 01:55:22.05
C++03で可変テンプレート関数に相当するものを
を作る事はできないのでしょうか
boostにそんなlibraryあったりしないのでしょうか
768デフォルトの名無しさん:2013/01/20(日) 02:51:35.91
Lokiのタイプリストあたり?
769デフォルトの名無しさん:2013/01/20(日) 10:33:48.47
Boost.PreProcessor で生成
Boost の中では大体そうしてるはず。
770デフォルトの名無しさん:2013/01/22(火) 16:02:18.73
クラス定義外にfriend関数を書く事は出来ますでしょうか?

クラスの定義はClass.hに、friend関数はfriend.cppにと言う具合にしたいのです。
771デフォルトの名無しさん:2013/01/22(火) 16:13:55.35
出来たら危ないなですやん
あったこともない韓国人が突然家に侵入して来て「ヘローフレンド!調子はどうだい?冷蔵庫のビールもらうね」なんて言って来たらやだろ?
772デフォルトの名無しさん:2013/01/22(火) 16:15:44.61
>>770
定義は別で良いけど宣言はクラス定義内に書かないとダメだよ。
それも含めてクラス定義なんだから。
773770:2013/01/22(火) 16:23:05.41
自己解決しました。
774デフォルトの名無しさん:2013/01/23(水) 00:37:10.32
最近の流れ面白いね。
775デフォルトの名無しさん:2013/01/23(水) 00:55:14.36
よっぽどつまらない生活してるんだな
776デフォルトの名無しさん:2013/01/23(水) 03:59:23.96
自決しました。
777デフォルトの名無しさん:2013/01/23(水) 23:19:05.57
早く成仏してくれ
778デフォルトの名無しさん:2013/01/23(水) 23:39:12.53
吐血しました。
779デフォルトの名無しさん:2013/01/25(金) 19:14:49.48
GUI部品作ったらgetterとsetterしかないんだけど、
これってクラスじゃなくて構造体にした方がいいの?
780デフォルトの名無しさん:2013/01/25(金) 21:44:23.27
メンバ関数にするメリットが必要ない・重要でないなら構造体にしとけば
781デフォルトの名無しさん:2013/01/25(金) 21:54:08.44
C++に構造体なんか無い
782デフォルトの名無しさん:2013/01/25(金) 22:15:41.30
ほいでそのうち「updateイベント」を用意したくなって
getter/setter にもどったりするんだよな
783デフォルトの名無しさん:2013/01/25(金) 22:27:48.17
>>782
おい、

それなんて俺
784デフォルトの名無しさん:2013/01/25(金) 22:28:31.39
>>781
無いというより「構造体⊆クラス」ってだけだろ
785デフォルトの名無しさん:2013/01/25(金) 22:33:09.41
いやC++視点だったら構造体=クラスだよね
C視点が入ってくると構造体はヘッダ共通化できるかもしれない、位で
786デフォルトの名無しさん:2013/01/25(金) 22:49:32.99
C++に限ればデフォルトのアクセス制限が違うだけだからな
787デフォルトの名無しさん:2013/01/26(土) 14:12:32.48
言葉遊びする奴が湧いてきたな
788デフォルトの名無しさん:2013/01/26(土) 14:16:40.79
言葉遊びではないだろ
C#みたいな区別が言語的にないんだから
C++では構造体という言葉は個々人で想像する要件が変化する曖昧な言葉になってしまう
議論をしたいのであればまず「構造体」という言葉の、
今回の議論における定義を提示しなければならない
789デフォルトの名無しさん:2013/01/26(土) 14:51:55.06
C++に構造体なんか無いというのを言葉遊びだと思う馬鹿は死ねばいい
790デフォルトの名無しさん:2013/01/26(土) 15:28:58.22
いや「死ねばいい」とか言う馬鹿こそ真っ先に死ね
791デフォルトの名無しさん:2013/01/26(土) 15:32:17.24
struct SomeStruct {
int a;
int b;
};

これは構造体じゃ「ない」のかね?
792デフォルトの名無しさん:2013/01/26(土) 15:47:57.88
それはただのPODなクラス
規格読み直せ
793デフォルトの名無しさん:2013/01/26(土) 15:55:10.18
>構造体
publicメンバ変数のみのクラスを指す人もいれば
メンバ変数が全部publicなら
コンストラクタやメンバ関数があってもいいよという人もいるし
structを使えば何でも構造体という人もいるし
ややこしい
794デフォルトの名無しさん:2013/01/26(土) 15:59:28.91
便所の落書きの雑感はどうでもいい
C++の作者は何て言ってるんだよ
795デフォルトの名無しさん:2013/01/26(土) 16:00:39.71
>>794
じゃあこんなとこにいないでハゲに聞けよ(´・ω・`)
796デフォルトの名無しさん:2013/01/26(土) 16:05:00.93
無能な規格原理主義の屁理屈野郎は本でも書いたらいいよ
何人かはきっと崇めてくれるよ
797デフォルトの名無しさん:2013/01/26(土) 16:06:39.44
無能であってほしい、というあんたの願望なんてどうでもよい。
798デフォルトの名無しさん:2013/01/26(土) 16:14:49.70
>>791を「それは構造体じゃない!ただのPODなクラスだ!」とか言っちゃ奴
と仕事するようなハメになりませんように(祈り)
799デフォルトの名無しさん:2013/01/26(土) 16:27:09.69
そもそも「これは構造体じゃ「ない」のかね?」なんて聞く奴と仕事する方が嫌だな (w
800デフォルトの名無しさん:2013/01/26(土) 16:28:17.39
そのないはあるほうだから別にいいだろう
801デフォルトの名無しさん:2013/01/26(土) 16:31:20.39
そんなくだらない言い争いするより、仕事すればいいだけ
802デフォルトの名無しさん:2013/01/26(土) 16:59:25.63
二階級特進を目指して毎日仕事に精を出せ
このガラクタどもめ!
803デフォルトの名無しさん:2013/01/26(土) 17:22:56.39
>>800
質問の内容じゃなくて、そんな「聞き方」する奴と仕事したいか?
804デフォルトの名無しさん:2013/01/26(土) 17:28:58.46
構造体という言葉を別に使ってもいいけど
構造体の指す意味ははっきりさせないと話がすれ違うだけなので
意味の確認くらいはとるわ
805デフォルトの名無しさん:2013/01/26(土) 17:48:49.03
確認するなら普通に「これは構造体か?」って聞くだろ。
806デフォルトの名無しさん:2013/01/26(土) 17:51:30.24
それじゃ意味の確認にならんじゃん
807デフォルトの名無しさん:2013/01/26(土) 17:55:14.98
>>791 なら、意味の確認になるんか?
808デフォルトの名無しさん:2013/01/26(土) 18:16:19.22
ならない
勝手に同一人物認定しないでほしい
809デフォルトの名無しさん:2013/01/26(土) 18:24:08.73
違う話なら、チラシの裏にでも書いとけよ。
810デフォルトの名無しさん:2013/01/26(土) 19:37:56.02
ISO/IEC 14882:2003
9 4 A structure is a class defined with the class-key struct;

JIS X 3014:2003
9 4 構造体は,《クラスキー》struct を付けて定義するクラスとする。

規格に書いてあったから>>791は構造体で
「構造体=クラス」ではなく「構造体⊆クラス」が正しい
C++11だとこの文消えてるけど
811デフォルトの名無しさん:2013/01/26(土) 20:04:48.99
「規格上では」という条件付きでな
812デフォルトの名無しさん:2013/01/26(土) 20:12:09.48
最近の流れ面白いね。
813デフォルトの名無しさん:2013/01/26(土) 21:31:21.53
>>803
はあ?「C++に構造体なんか無い」(キリッ
とか言う奴を見掛けたので>>791を書いたまで

『そんな「聞き方」』って、お前になんか何も聞く気はねーよ
何様のつもりか知らないけど
814デフォルトの名無しさん:2013/01/26(土) 22:20:09.02
確かにこんな奴とは、仕事したくないわ (w
815デフォルトの名無しさん:2013/01/26(土) 22:44:19.54
switch文のcase内でローカル変数定義するのってどう思う?
816デフォルトの名無しさん:2013/01/26(土) 22:46:30.14
まじローカルって感じ
817デフォルトの名無しさん:2013/01/26(土) 22:48:11.23
>>815
ローカルスコープ導入するならごく普通
818デフォルトの名無しさん:2013/01/26(土) 22:50:36.35
>>817
初めて知ってちょっと気持ち悪く感じたが普通なのか
ありがとう
819デフォルトの名無しさん:2013/01/26(土) 22:52:46.66
>>818
エディタによって気持ち悪いインデントを強制されることもあるけど、普通
ただ、case内があまり長くなるようなら関数化した方がいい
820デフォルトの名無しさん:2013/01/26(土) 22:58:00.90
>>819
ちょうど関数化するか迷ってたww
アドバイスありがとうございます
821デフォルトの名無しさん:2013/01/26(土) 23:24:26.39
ローカルスコープ導入しないと、
別のcase内でも使えてしまって問題になるから(主に初期化有無で)
使うなら必ずローカルスコープを導入すること
お兄さんとの約束だぞ☆
822デフォルトの名無しさん:2013/01/27(日) 04:58:24.87
extern "C" {
struct A
{
int a;
};
}

あー、オレのC++は構造体あるわー。
823デフォルトの名無しさん:2013/01/27(日) 07:35:46.46
おいextern "C"
824デフォルトの名無しさん:2013/01/27(日) 14:17:25.63
>>822
馬鹿だね
825デフォルトの名無しさん:2013/01/27(日) 23:39:10.53
C++で扱えるんだがなにがバカなの?
826デフォルトの名無しさん:2013/01/27(日) 23:40:41.80
C++がCの上位互換だって知らないのかなw
827デフォルトの名無しさん:2013/01/27(日) 23:51:31.58
template<class T> ...
とやった場合、Tには構造体(struct)も書けるが
構造体Fooの前方宣言は
 class Foo;
ではダメで、あくまで
 struct Foo;
と書かねばならない

ていうかテンプレートの引数部に書くtypenameってどうなん?
typename⊇class?
828デフォルトの名無しさん:2013/01/27(日) 23:54:16.93
テンプレートテンプレートパラメータの宣言にはclassしか使えない
それ以外はどちらでも良い
829デフォルトの名無しさん:2013/01/27(日) 23:54:34.65
>>827
前方宣言どっちでも通るだろ。
830デフォルトの名無しさん:2013/01/28(月) 00:03:18.59
ループ変数が整数な多重ループでは一応ループ変数をi, j, k, ...とするという慣習がありますが、
イテレータがループ変数(?)な多重ループでのイテレータの良さげな名前の付け方を教えてください
やっぱりit1, it2, it3, ...とかにする?

あと、find()メソッドとかもイテレータを返しますが、そういった場合のわかりやすい名前の付け方も知りたいですが
831デフォルトの名無しさん:2013/01/28(月) 00:13:10.19
意味のある名前にする
832デフォルトの名無しさん:2013/01/28(月) 00:37:23.78
it, jt, ktって書かれてるの見たことある
833デフォルトの名無しさん:2013/01/28(月) 00:39:08.70
慣習は無いと思う
it, jt, kt は面白いなw
834デフォルトの名無しさん:2013/01/28(月) 00:51:29.66
普通に連番にしてるわ……
ネストが妙に深かったら再帰も考慮するけど
835デフォルトの名無しさん:2013/01/28(月) 00:55:34.19
for(k;;)for(j;;)for(i;;){...} が案外少ないのが不思議
836デフォルトの名無しさん:2013/01/28(月) 01:03:14.82
>>835
入れ子の中のループを外部関数に出すから
「見かけのインデントが少ない」=「ネストが深くない」
ように思っているだけでは
837デフォルトの名無しさん:2013/01/28(月) 07:25:45.23
>>835
逆順ってことか
行列扱う時はそうなる事は多いな
838デフォルトの名無しさん:2013/01/28(月) 09:12:33.96
うん普通にそうするね。
839デフォルトの名無しさん:2013/01/28(月) 12:32:29.57
>>830
find() の戻り値は found がいい。
840デフォルトの名無しさん:2013/02/02(土) 22:37:00.44
MFCって遅い?
841デフォルトの名無しさん:2013/02/03(日) 00:43:31.19
遅くないよ。API丸出しラッパなんだから
842デフォルトの名無しさん:2013/02/03(日) 14:09:57.29
>>840
こんなところで質問してるくらいだからどうせMFCの速度が影響するような大規模なシステム作れないだろ
それにこんなところで質問してるくらいだからお前のコードのほうがボトルネックだよ

よって気にする必要なし
843デフォルトの名無しさん:2013/02/04(月) 20:49:14.13
薄いラッパのはずなのに使いにくいのはなんでなんだぜ
844デフォルトの名無しさん:2013/02/04(月) 21:26:15.39
薄いラッパだからじゃねえ?
845デフォルトの名無しさん:2013/02/04(月) 23:03:12.63
C APIの気持ち悪いところをあんまり隠していないというか。
846デフォルトの名無しさん:2013/02/04(月) 23:26:57.62
テンプレートの効能を簡単に説明してください
あと、具体的な使い道も簡単に教えてください

ネットで検索すれば色々出てきますが
テンプレートの作り方とか何に使えば良いのか良く分からない例ばかりで
わざわざテンプレートを作る必要性がわかりません
別になくてもいいんじゃないの、って感想です

しかし!
それなりに使ってる人がいるからには便利な使い道があるのでしょう
それを知りたいのです
847デフォルトの名無しさん:2013/02/04(月) 23:36:46.38
templateはそういうレベルの人が作ってはいけない機能です
848デフォルトの名無しさん:2013/02/04(月) 23:48:57.02
別になくてもいいよ
無理に使う必要は全くない
849デフォルトの名無しさん:2013/02/04(月) 23:52:43.09
STL使えば分かる
850デフォルトの名無しさん:2013/02/05(火) 00:57:42.35
コードをまとめるってことが意識できるようになってくるとなんでテンプレートが必要なのかも判ってくる。

習うより慣れろで、まずいっぱいコード書くことをオススメする。
851デフォルトの名無しさん:2013/02/05(火) 01:13:50.73
STLとかのC++用ライブラリを使えば知らないうちにいやでもテンプレートの恩恵を受けるから
理解できないならできないで気にするな
852デフォルトの名無しさん:2013/02/05(火) 04:51:05.86
そうだな
STL 使えに一票
853デフォルトの名無しさん:2013/02/06(水) 11:36:58.43
取り敢えずstd::min()でも使ってみたらどうか。
854デフォルトの名無しさん:2013/02/06(水) 15:09:59.62
cout << "BBBB";
cout << "BBBB";
cout << "BBBB";
.......
cout << "BBBB";

って書いていくのと

for(int i = 0; i <= 100; i++){
cout << "BBBB";
}

ってfor文で書くのと速度に違いある?
855デフォルトの名無しさん:2013/02/06(水) 15:11:55.48
ないよ
856デフォルトの名無しさん:2013/02/06(水) 16:26:51.30
速度は実測が基本
857デフォルトの名無しさん:2013/02/06(水) 19:46:19.01
繰り返し回数が100程度じゃ実測しても分からんだろうな。

十数桁くらいの繰り返し回数なら、
毎回インクリメントする分 for 方が遅いという結果が出るかもしれんな。
終了判定処理はきっと分岐予測が上手く働いて結果にはほぼ影響しないだろう。
858デフォルトの名無しさん:2013/02/06(水) 21:45:01.57
コードサイズがでかくなって遅くなるんじゃ
859デフォルトの名無しさん:2013/02/06(水) 22:05:50.64
キャッシュミスが頻発するかもな
860デフォルトの名無しさん:2013/02/06(水) 22:29:13.44
forの中でiを使わなかったら勝手に100回書いたのと同じにならない?
861デフォルトの名無しさん:2013/02/06(水) 22:41:26.92
どういう意味で「同じ」と言っているのかになよるな
862デフォルトの名無しさん:2013/02/06(水) 22:42:12.12
coutの先が詰まるから、、、
863デフォルトの名無しさん:2013/02/06(水) 22:42:39.29
さすがにそれはない
864デフォルトの名無しさん:2013/02/06(水) 23:03:49.30
>>854
対して変わらん
しかしループ数が少ないならばいちいちfor文使うより展開した方が「速い」こともある
(特にループが入れ子になっている場合の内側のループ)。それをコンパイラが判別して
勝手に展開してくれるのが「ループ展開」と呼ばれる技法
865デフォルトの名無しさん:2013/02/07(木) 05:03:28.55
>>863
デバイスにアクセスする方が圧倒的に遅い
866デフォルトの名無しさん:2013/02/07(木) 16:10:44.55
はじめまして。学生プログラマーです。
どうしても、思ったとおりに動作しないコードがあります。
以下、そのわからないソースコードを複数回に分けて貼り付けます。(3つのcppファイルで構成)
開発環境:VisualC++ 2010 Express Edition

//main.cpp ==============================================

#include <stdio.h>

//プロトタイプ宣言(test1.cpp , test2.cpp)
void* Init_1();
void* Init_2();

int main()
{
printf("test1のシングルトンのアドレス:%p\ntest2のシングルトンのアドレス:%p\n" , Init_1() , Init_2());
return 0;
}
867デフォルトの名無しさん:2013/02/07(木) 16:12:38.25
新しいバージョン出ても古いバージョン使い続ける人っているよね
なんで?
868デフォルトの名無しさん:2013/02/07(木) 16:13:07.21
//test1.cpp ==============================================

class Gloval{
public:
//定義
int a;

public:
static Gloval* GetInstance()
{
static Gloval instance;
return &instance;
}

private:
Gloval(){}
Gloval(const Gloval& rhs);
Gloval& operator=(const Gloval& rhs);
};

void* Init_1()
{
return Gloval::GetInstance();
}
869デフォルトの名無しさん:2013/02/07(木) 16:15:20.78
//test2.cpp ==============================================

class Gloval{
public:
//定義
float a;

public:
static Gloval* GetInstance()
{
static Gloval instance;
return &instance;
}

private:
Gloval(){}
Gloval(const Gloval& rhs);
Gloval& operator=(const Gloval& rhs);
};

void* Init_2()
{
return Gloval::GetInstance();
}
870デフォルトの名無しさん:2013/02/07(木) 16:17:24.73
実行結果
test1のシングルトンのアドレス:00BA813C
test2のシングルトンのアドレス:00BA813C

なんで、Init_1()とInit_2()から同じアドレスが返されるのかわかりません・・・。
ファイル分割してあるからtest1のクラス「Gloval」とtest2のクラス「Gloval」は
別物のはずだから違うアドレスが返される・・・と思ったんですが・・・
どなたか原因がわかる方いますか?

ちなみに、どちらかのクラス「Gloval」を別の名前に変えると別々のアドレスが返ってきます。
871デフォルトの名無しさん:2013/02/07(木) 16:47:28.36
Glovalの多重定義でそもそもコンパイル通らないはずだが
872デフォルトの名無しさん:2013/02/07(木) 17:54:08.59
>>871
あれ・・・そうなんですか?
うーん・・・VC++がエラーを吐き出さないように作られてただけなのかな
たしかに、Glovalに何らかのメンバを持たせてそこにアクセスしようとするとおかしくなりますし(ポインタがずれてる的な・・・)

ファイルAで
static int a;
ファイルBで
static int a;
と宣言したら二つの変数aが別物になるように、クラスもてっきり別物として宣言されてるものかと勘違いしてました・・・。
クラスそのものは実体がないのでそこらへんが曖昧だったんですけどね・・・。

なんとなく原因がわかった気がします。
>>871さん、返信ありがとうございます。
873デフォルトの名無しさん:2013/02/07(木) 18:08:35.68
それぞれの翻訳単位では多重定義じゃないからコンパイルは通るのが正常
リンクの問題
874デフォルトの名無しさん:2013/02/07(木) 18:20:28.82
メンバをすべてclass内で定義していればリンクできるようにしとかなきゃまずいでしょ。
ヘッダに書くのと状況的には一緒だし。
875デフォルトの名無しさん:2013/02/07(木) 21:53:06.89
>>867
そんなの互換性とか慣れとかいくらでも理由あるじゃん……
876デフォルトの名無しさん:2013/02/07(木) 22:23:44.50
古いパソコンだと新しいやつが重すぎるからっていうのもないでもない
877デフォルトの名無しさん:2013/02/07(木) 22:34:13.28
>>867
リリースされ間もない新しいバージョンは
まだ動作が不安定な場合もよくある。

バージョン 4.0 〜 4.2 辺りの間は、
バグフィクスが十分なされた 3.8 辺りを使う、
という選択も当然あり得る。
878デフォルトの名無しさん:2013/02/08(金) 03:58:51.26
C++11よりもVisualStudioに入る部分だけ対応した方が良さげな予感
879デフォルトの名無しさん:2013/02/08(金) 10:45:23.87
>>872
>と宣言したら
メンバ関数のstaticとグローバル変数のstaticは全然違う意味だろが
880デフォルトの名無しさん:2013/02/09(土) 13:22:49.98
イテレータのitr++はコンパイラによって++itrに最適化されるの?
881デフォルトの名無しさん:2013/02/09(土) 13:35:58.75
妄想は寝てから。
882デフォルトの名無しさん:2013/02/09(土) 13:41:13.84
>>880
そもそも、コンパイラは itr がイテレータなのかどうか知らん
883デフォルトの名無しさん:2013/02/09(土) 14:26:39.29
クラスAとその派生クラスA1, A2があるとき, A-1とA-2の両方のオブジェクトを引数に取れる関数って作れる?

class A {
virtual void hoge();
};

class A1 {
void hoge() {
// ここを実行させたい
}
};

int recieve_hoge(A* a) {
a.hoge();
884デフォルトの名無しさん:2013/02/09(土) 14:29:26.48
ごめんなさい、途中で送信しちゃいました。

上のクラスの宣言があるとき、

int recieve_hoge(A& a) {
a.hoge();
}

を実行すると親クラスのhogeが実行されるし、引数を (A1& a) にするとA2をとれなくなるので…。
885デフォルトの名無しさん:2013/02/09(土) 14:33:48.96
>>883
class A1 の hoge を virtual にすればいいじゃん
886デフォルトの名無しさん:2013/02/09(土) 14:38:01.74
とりあえず A1 は A 継承してんの?
コードはそうなってないが。
してるなら仮想関数なんだから A1::hoge が呼ばれるだろ。
887885:2013/02/09(土) 14:40:22.89
あ、そうか virtual は関係ないな、すまん
888デフォルトの名無しさん:2013/02/09(土) 14:51:28.44
やりたいことはこんな感じです。
recieve_aの引数を(A1 pa)にすればA1と表示されるのはわかるのですが、A1とA2両方に対応させたいのです…

http://ideone.com/EVeeGY
889デフォルトの名無しさん:2013/02/09(土) 15:22:48.52
890デフォルトの名無しさん:2013/02/09(土) 15:51:03.49
>>889
できました、ありがとうございます!
まさかこんなに簡単なことだったとは…。
891デフォルトの名無しさん:2013/02/09(土) 16:34:56.97
>>890
ちょっと待て

お前 >>884 でちゃんと & 付けてんじゃん
892デフォルトの名無しさん:2013/02/09(土) 17:18:49.41
>>891
元のコードではつけ忘れてたんです…

書き込み画面でサンプルを適当に書いたときは忘れなかった感じです
893デフォルトの名無しさん:2013/02/09(土) 21:55:05.16
基本的な質問ですいません。
ifstreamを用いたファイルからの入力が
ファイル終端に達して失敗したときは
fail()とeof()が同時にtrueになるのでしょうか?
894デフォルトの名無しさん:2013/02/10(日) 15:55:28.35
>>893 うん。
895デフォルトの名無しさん:2013/02/10(日) 16:03:18.21
本当にその状況でfail()とeof()が同時にtrueになる事を
どうやって確かめたらいいんだろうな
896デフォルトの名無しさん:2013/02/10(日) 16:51:16.89
>>895
規格を確認した後、自分の使ってるコンパイラでテストすればよい。
897デフォルトの名無しさん:2013/02/10(日) 17:09:12.16
>>896
いや、どうやってちょうどファイル終端で失敗する状況を作るか、と・・・

そもそも、読み取りが途中で fail になった経験もなくて
898デフォルトの名無しさん:2013/02/11(月) 06:12:32.66
>>897
例えば 0 バイトのファイルから 1 バイト読み取ればよいのでは?
899893:2013/02/11(月) 06:56:28.43
>>894
ありがとうございました
ということは、eof()がtrueでfail()がfalseの状況というのは
存在しないという理解でいいでしょうか

>>897
もしかしてeof()がtrueのときは常にfail()もtrueなのでは?
というような意味の質問のつもりでした
900デフォルトの名無しさん:2013/02/11(月) 07:13:27.44
>>899
なんで >>893-894 から「ということは」でそんな理解になるのかわからんな。
getline(), readsome() など、ファイル終端に達しても失敗とはならない操作はあり得る。
901デフォルトの名無しさん:2013/02/11(月) 10:08:07.91
>>898
なるほど、頭良いな

と言うか、俺の頭が硬すぎたか
902デフォルトの名無しさん:2013/02/11(月) 10:26:33.46
文字列リテラルしか受け付けない引数、というシグネチャの関数は書けませんか?

void func (const char *pstr) { ... }

char a[] = "abc";
func (a); // NG
func ("abc"); // OK

文字列をコンストラクタで受け取ってそれをメンバ変数に保存するクラスなのですが、
その値が変更されないようにするには文字列をコピーするしか方法はないですか?

このクラスは文字列からそのハッシュ値を計算して保存するのですが、
デバッグ用に元の文字列も保存しておきたいんです。

これは運用上、リテラル文字列以外からハッシュ値を作ることはあってはならないものです。
このクラスのインスタンスの外でその文字列の内容が変更されたら、整合性がとれないので。

そのような状況はできればコンパイル時に発見してエラーにしておきたいです。
しかし今のC/C++の規格で無理でしたら、安全のためにコピーする事で諦めます。
903デフォルトの名無しさん:2013/02/11(月) 10:32:02.12
無理
904デフォルトの名無しさん:2013/02/11(月) 10:42:28.71
普通にコピーしろよ
メンバが呼ばれたあとで保存しといた文字列ポインタの中身が変更されちゃうかもしれない
なんて考えるなんてアホらしい
905デフォルトの名無しさん:2013/02/11(月) 10:56:42.76
pstrが本当に書き込み不可な領域を指してるかは実行時になら判定できるけどね
書き込むと例外発生するから。OSによるけど。
906デフォルトの名無しさん:2013/02/11(月) 11:05:03.28
ありがとうございます。
諦めて普通にコピーすることにします。
907デフォルトの名無しさん:2013/02/11(月) 12:05:30.70
文字列リテラルでもconstexpr char[]にはならないんだな
908デフォルトの名無しさん:2013/02/11(月) 12:18:38.42
>>902
マクロの文字列化演算子を通して使う仕様にすればいいんじゃない?
909デフォルトの名無しさん:2013/02/11(月) 12:21:35.76
と思ったが、引数に渡せない内容のものも一部出てくるな
910デフォルトの名無しさん:2013/02/11(月) 12:30:46.50
#define func_isl(a) func("" a)

func_isl("abc");
911デフォルトの名無しさん:2013/02/11(月) 12:59:34.46
>>908 >>910
すばらしい。
マクロは盲点でした(特に >>910 はシンプルですね)

ただ・・・、必ず文字列リテラルを使う事と、必ずマクロ func_isl を使う事。
どちらもコーディングルールなんですよね。
マクロにした方が安全度がより増すのは確かですが。

面白いアイデアなので、しばらくこの方法で運用してみます。
912デフォルトの名無しさん:2013/02/11(月) 13:03:31.80
雀の涙ほどのメモリ節約のためにそんなルールに振り回されるなんて可哀想だな
913デフォルトの名無しさん:2013/02/11(月) 13:12:53.47
メモリ節約のためじゃないだろ
914デフォルトの名無しさん:2013/02/11(月) 13:20:36.01
もしメモリ節約ではなく文字列のコピー削減が目的だとしても大した意味は無いだろう
それとも他にコピーを避ける理由があるのか
915デフォルトの名無しさん:2013/02/11(月) 13:26:41.56
>>910
これは頭いい方法だな

>>911
マクロを通さず使うな、というのは
もとの名前を直打ちしちゃダメなのが分かる名前にしてしまえば良い
916デフォルトの名無しさん:2013/02/11(月) 13:29:43.89
>>914
良く読め
コピーを避けたいんじゃなくて文字列が書きかわることによる不整合を避けたいケースだよ
917デフォルトの名無しさん:2013/02/11(月) 13:34:20.63
うん頭いいね
マクロ通してないのはgrepすれば分かるしね
918デフォルトの名無しさん:2013/02/11(月) 13:36:29.15
てかちょっとしたツール作ればマクロ使うまでもないのか
919デフォルトの名無しさん:2013/02/11(月) 13:37:26.75
>>916
そのためには文字列をコピーするのが一番簡単で安全な方法だ
なのにわざわざマクロを使うという事はコピーを避けたいという事じゃないのか?
920デフォルトの名無しさん:2013/02/11(月) 13:38:28.24
まとめるとfuncをgrepしてリテラルじゃないところ探せってことだろ
921デフォルトの名無しさん:2013/02/11(月) 13:42:31.14
結局grepの類をしないと査察できないからC/C++の範囲内じゃやっぱり無理ってことだね
922デフォルトの名無しさん:2013/02/11(月) 13:43:59.36
>>916
いえ、>>914 は十分分かってらっしゃると思います。
文字列が書きかわることによる不整合を避けたいのなら、コピーすれば良いだけ。
それを拒否するのは、メモリを無駄にしたくないからだろ? と言っているのですよね。
私の質問の背景はまさにそれですから、見破られたということです。

で、そんな微々たる量のメモリの無駄や処理量なんか気にするな、と。
おっしゃるとおりです。

>>912
言ってなかったのですが、この件に関しては私一人で趣味でプログラムしています。
保守するのも永遠に私一人のはずです。

既にデータセグメントにあるのに、それをコピーしなければならないと言うのが、
「なんとなく気持ち悪い」というその程度の話ですから、諦めるのは簡単ですが、
>>910 が面白いので、この方法でしばらくやってみようかなと。

もちろんチームで仕事をするときは、よほど理に反したものでない限り、
こんな馬鹿な我が儘は言わずチームのルールに従います。
923デフォルトの名無しさん:2013/02/11(月) 13:45:43.41
>>922
えっ?そうなの?
ソースが文字列リテラルであることが重要なんだ思ったよ
924デフォルトの名無しさん:2013/02/11(月) 13:48:33.01
>>922
言葉が足らない感じなので、補足しておきます。

> 既にデータセグメントにあるのに、それをコピーしなければならないと言うのが・・・

コードに書かれたリテラル文字列は(普通は書き換わらない)データセグメントに存在していて、
それのメモリ位置をポイントすれば良いだけなのに、
関数にリテラル文字列ではなく変数を引数に入れて呼ばれる可能性も考慮して
わざわざ同じ情報をコピーしなければならないと言うのが、
「なんとなく気持ち悪い」というその程度の話ですから・・・
925デフォルトの名無しさん:2013/02/11(月) 22:55:40.63
なんでループを展開したほうが速いことになってんの?
昔と違ってオンキャッシュになる方が速いんだから
展開したコードより単に短い方が普通に速いんじゃね?
926デフォルトの名無しさん:2013/02/11(月) 23:04:41.03
ループのアンロールは効果あるよ
ループってのは毎回分岐処理を行うからね

例えば4回の固定ループがあるとすると、
4回に1回必ず分岐予測が失敗する

まあループのサイズにもよるかもしれないが
927デフォルトの名無しさん:2013/02/11(月) 23:35:57.14
最近のはループの最後に抜けてくれるよう予測してもらえるんじゃないの?
928デフォルトの名無しさん:2013/02/11(月) 23:38:12.77
無茶言うなよ
929デフォルトの名無しさん:2013/02/11(月) 23:40:39.95
インデックスを扱う分レジスタは減るし
(x64で増えたからそうダメージはないかもしれないが)
場合によってはインデックスによるアドレッシングに
時間がかかるかもしれない
(要素のサイズが1, 2, 4, 8 でない場合)

アンロールは今でも重要な高速化手法だよ
930デフォルトの名無しさん:2013/02/11(月) 23:52:02.16
サイズとか無視して何でもかんでも展開しちゃう困ったコンパイラを知っている
931デフォルトの名無しさん:2013/02/12(火) 00:37:36.50
最適化の基本は最適化するな。
まずアルゴリズムや全体の設計が妥当かどうかの検証が先。
ループアンロールはボトルネックが判明して、さらにロジックの
工夫ではどうしても解決できなくて、ループ処理が原因で遅い
場合のみ有効。
932デフォルトの名無しさん:2013/02/12(火) 01:37:24.48
コードをシンプルに保つのも一種の最適化やで
933デフォルトの名無しさん:2013/02/12(火) 02:56:46.10
エンコーダとか作ってるとアンロールは役に立った
934デフォルトの名無しさん:2013/02/12(火) 08:36:01.44
マの独りよがりな早期の最適化は、 大体において悪化だからな。
935デフォルトの名無しさん:2013/02/13(水) 12:32:22.87
多次元配列を舐めるのに1次元扱いするのはよくやるな。
936デフォルトの名無しさん:2013/02/13(水) 18:56:51.20
>>932
それは設計やリファクタリングであって最適化ではない。
937デフォルトの名無しさん:2013/02/13(水) 20:34:04.11
実行効率を最適化するなら開発効率を最適化したっていいだろ。
938デフォルトの名無しさん:2013/02/13(水) 21:01:16.92
>>937
一連の流れで、みんなは実行効率の話をしている。

もし >>932 が実行効率ではなく開発効率の話をしているのであれば、
会話の流れから一人だけずれている事になる。
939デフォルトの名無しさん:2013/02/14(木) 01:28:58.13
C++入門書でおすすめ教えていただけますか?
940デフォルトの名無しさん:2013/02/14(木) 05:54:34.23
>>939
技術評論社 はじめてのC++
gihyo.jp/book/1999/4-7741-0843-X
941デフォルトの名無しさん:2013/02/14(木) 07:25:37.45
>>939
ロベール
942デフォルトの名無しさん:2013/02/14(木) 10:03:36.83
なんで日本の参考書ってしょっぱいのばっかりなの
943デフォルトの名無しさん:2013/02/14(木) 10:05:09.20
しょっぱいプログラマしかいないからだよ
944デフォルトの名無しさん:2013/02/14(木) 12:37:37.38
しょっぱいって、どういう感じの本の事?
945デフォルトの名無しさん:2013/02/14(木) 12:46:16.78
カバーが塩昆布でできてます
946デフォルトの名無しさん:2013/02/14(木) 15:59:11.57
初心者ですみませんが
継承について、質問です

参考書に、基本クラスでオーバロードされた演算子のうち
代入演算子は派生クラス内で使用できない
とありました

基本クラスを、
+をオーバーロード
-をオーバーロード
=をオーバーロード
として継承すると、派生クラスでは
+-=のオーバーロードが継承はされるが、=は使用できないという認識でいいのでしょうか
947デフォルトの名無しさん:2013/02/14(木) 17:41:09.87
using 親::operator=;
でおk
948デフォルトの名無しさん:2013/02/14(木) 20:21:23.12
コンストラクタやデストラクタ同様operator=も定義しなければ暗黙に定義されるから
派生クラスの暗黙のoperator=で基底クラスのoperator=は隠蔽される
949デフォルトの名無しさん:2013/02/16(土) 02:21:03.25
ガンダムオンラインの糞さは改善されますか?
外からの観測ではおそらくメモリ周りの使い方が糞で
キャッシュミスがおきまくってるようなんだけど・・・
950デフォルトの名無しさん:2013/02/16(土) 03:06:57.88
ガンダムのネットゲーは呪われているから無理。

UGCOとか10年かけて開発してチャットも実装できなかったんだぞ。

あと20年お待ちください。
951デフォルトの名無しさん:2013/02/20(水) 21:21:25.92
日本語処理初心者なのですが、質問させて下さい。
環境はVC++ .Net 2003 (古いです…がアップデートはできません…)

std::stringでShiftJISの文字単位の処理は不可能でしょうか。
substr()で部分文字列の切り出しや、length()で(日本語としての)文字数をカウントする、などができないか、です。
952951:2013/02/20(水) 21:23:30.42
もちろん、std::wstring (UTF-16)へ変換すれば、可能でした。
また、std::string を _mbslen などのライブラリへ渡しても、可能だとは思います。
そうではなく、std::string のメソッドそのままで扱えないか、ということです。

自分が知らないだけで、可能な方法がないのか(ロケール設定の工夫など)?と疑っていますが、
いろいろ検索してみても、確信が得られません。

ロケールは以下のように設定しています。
setlocale(LC_ALL, "japanese")
953デフォルトの名無しさん:2013/02/20(水) 21:31:54.81
>>951 >>952
std::string クラスとそのメンバ関数のみでは、残念ながら無理ですね。

std::string のインスタンスを取って、
部分文字列を切り出した std::string のインスタンスを返す関数とか、
そういったものを自作することはそれほど難しくないですが、
そういう対処を求めているのではないんですよね?
954951:2013/02/20(水) 21:53:03.27
>>953

やはり無理ですか…
ロケールの影響を受ける版のstd::stringは存在しないのですね…

経緯としては、std::string ベースで組まれた、大規模な社内アプリケーションが
既に存在していまして、その日本語対応が必要になりました。
至る所にstd::stringが散りばめられているので、
ロケールの設定など、初期設定だけで使えるようになれば、という願望から質問しました。
955951:2013/02/20(水) 21:55:12.03
>std::string のインスタンスを取って、
>部分文字列を切り出した std::string のインスタンスを返す関数
現在は、部分的にこの方法を取っております。
この方法でアプリケーション全体を書き換えるか、
若しくはstd::wstringベースに書き換えるか、で検討しようと思います。

ありがとうございました。
956デフォルトの名無しさん:2013/02/20(水) 22:52:09.39
それらしい char_traits を作って
std::basic_string の第二引数に指定すればいけるかもしれないけど
結局型が変わる事に変わりはないか
957デフォルトの名無しさん:2013/02/21(木) 00:32:39.48
第1引数から変えないと破綻するよ
958951:2013/02/21(木) 06:44:33.45
>>956>>957
なるほど。こういう物も有るんですね。
typedef basic_string 〜 string
で無理やり自作タイプをstringという名前にしてしまう事も出来るんですかね
ただ、再定義すべきメソッドの数を見てめまいがしました…
959デフォルトの名無しさん:2013/02/21(木) 07:34:30.89
使ってるメンバ関数の数が少ないなら
自作クラスでいい気もする
960951:2013/02/21(木) 07:39:10.19
Unix系なら、Glib::ustringというものもあるんですね。
std::stringとの変換も、自動でやってくれるとのことなので
全部をstd::wstringベースにいきなりするよりは、やりやすいかも…
ustringだけ、Windowsで組み込めればの話ですが…

>>959 確かに
961デフォルトの名無しさん:2013/02/21(木) 13:48:08.66
#include <iostream>
using namespace std;

int main() {

}

class Human {

private: string name;
public: Human(string name) {
this.name = name;

}

}

昨日C++はじめた初心者ですがなぜこれでエラーがでるのかわかりません
教えてください
962デフォルトの名無しさん:2013/02/21(木) 13:51:13.53
// x this.name
this->name = name;
963デフォルトの名無しさん:2013/02/21(木) 13:51:37.31
thisは参照ではありません
エラーが出るならそれも張りましょう
964デフォルトの名無しさん:2013/02/21(木) 13:53:29.11
return 0;
965デフォルトの名無しさん:2013/02/21(木) 13:54:09.83
最後に;がない
966デフォルトの名無しさん:2013/02/21(木) 13:55:21.55
>>964
main関数だけは特別でreturn 0;は必要ない
967デフォルトの名無しさん:2013/02/21(木) 14:03:07.34
>>962
できましたがまたエラーがでました
#include <iostream>
using namespace std;

int main() {
Human yaruo("Yaruo");
yaruo.noise("datteowwwww");
}

class Human {

private: string name;
public: Human(string name) {
this->name = name;

}
public: void noise(string noise) {
cout <<name<<": "<<noise<< endl;
}

};

エラー内容をコピーしたいのですがコンソールのコピーができません。
968デフォルトの名無しさん:2013/02/21(木) 14:06:57.57
そんな簡単なエラー修正くらい自力でやれよ
969デフォルトの名無しさん:2013/02/21(木) 14:07:13.48
>>967
できるようになったら、またきてね
970デフォルトの名無しさん:2013/02/21(木) 14:09:10.78
>>966
だと思うだろ
例外があって、main()内にstd::exit()があるとreturnが必要になるんだなこれが
他にmain()が何も値を返さない時に限りreturn 0;は省略可能
971デフォルトの名無しさん:2013/02/21(木) 14:13:21.71
Human yaruo = new Human("Yaruo");
こうはかけないんですよね?
972デフォルトの名無しさん:2013/02/21(木) 14:20:57.06
入門サイト行けよ
くだらない
973デフォルトの名無しさん:2013/02/21(木) 14:43:54.67
ぽまいらそうカッカするなよ
974デフォルトの名無しさん:2013/02/21(木) 14:50:18.00
くだらなくはないな・・・。
975デフォルトの名無しさん:2013/02/21(木) 15:00:47.51
できました
#include <iostream>
using namespace std;


class Human {

private: string name;
public: Human(string name) {
this->name = name;

}
public: void noise(string noise) {
cout <<name<<": "<<noise<< endl;
}

};


int main() {
Human yaruo("Yaruo");
yaruo.noise("datteowww");
}

後方参照ができないってことなんですね・・・。
おどろきです。
976デフォルトの名無しさん:2013/02/21(木) 15:18:43.23
C#では余裕で後方参照できるから、C/C++に来た人はびっくりするだろうねえ

元々コンパイルを少しでも早くする工夫だったんだけど、今じゃC#の方がコンパイルが速い始末
977デフォルトの名無しさん:2013/02/21(木) 15:20:46.03
コンパイル速度なんてどうでもいいじゃん
実行速度が重要なんだよ
978デフォルトの名無しさん:2013/02/21(木) 15:21:45.45
実行速度www

C++とC#の速度計測して見た事あんのかよ
今じゃほとんど差がないぞ
979デフォルトの名無しさん:2013/02/21(木) 15:22:46.44
googleの人がC++のコンパイルに丸一日かかるって言ってた
980デフォルトの名無しさん:2013/02/21(木) 15:23:22.81
C#はポインタの処理が苦手なんだろ?
981デフォルトの名無しさん:2013/02/21(木) 15:38:13.33
982デフォルトの名無しさん:2013/02/21(木) 15:42:12.77
ここは個人的な人生の問題の相談室じゃねえんだよ
983デフォルトの名無しさん:2013/02/21(木) 15:51:45.63
>>980
そのポインタが最適化の妨げになっている件

restrictポインタにしないとFORTRANより大幅に速度低下
984デフォルトの名無しさん:2013/02/21(木) 15:52:37.39
#include <iostream>
using namespace std;

class Human {

private: string name;
public: Human(string name) {
this->name = name;

}
public: void noise(string noise) {
cout <<name<<": "<<noise<< endl;
}
public: string getChildName() {
Child child("Child");
return child.getName();
}

};

class Child {
private: string name;
public: Child(string name) { this->name = name; }
public: string getName() { return this->name; }
};

int main() {
Human yaruo("Yaruo");
yaruo.noise("datteowww");
cout <<yaruo.getChildName()<< endl;
}
985984:2013/02/21(木) 15:54:16.87
もしや、と思ってこれを試してみましたが、クラスの場合もダメなんですね。(後方参照ができないなら当然か)

ということは、"Child"クラスなのに親のHumanクラスより先頭にクラス定義しないといけないんですね・・・。
なんとなくC++がわかってきましたが、少し不安になってきました。
986デフォルトの名無しさん:2013/02/21(木) 15:56:53.07
前方宣言でもいいよ。
987984:2013/02/21(木) 15:57:33.92
設計の難易度というか、部品ごとに設計するのが苦しすぎないですか?
988デフォルトの名無しさん:2013/02/21(木) 15:59:29.46
宣言と定義を分けて書けるんだから別にねぇ
989984:2013/02/21(木) 16:01:05.61
>>986
クラスを前方宣言するってことですか?
990デフォルトの名無しさん:2013/02/21(木) 16:04:20.46
そう。class Human の定義より先に
 class Child;
って宣言を書いておく。
991デフォルトの名無しさん:2013/02/21(木) 16:30:14.00
>>990
なるほど・・・。ですが子のコンストラクタに引数があってそれを取得したい場合はどうなるんでしょうか。

#include <iostream>
using namespace std;

class Child {
private: string name;
public: Child(string name) { this->name = name; }
public: string getName() { return this->name; }
};

class Human {
private: string name;
public: Human(string name) { this->name = name; }
public: string getChildName() {
Child child("Child");
return child.getName();
}
};

int main() {
Human yaruo("Yaruo");
cout <<yaruo.getChildName()<< endl;
}

つまりこれを前方宣言?で書こうとすると・・・続く
992デフォルトの名無しさん:2013/02/21(木) 16:31:58.41
#include <iostream>
using namespace std;

class Child;
class Human {
private: string name;
public: Human(string name) { this->name = name; }
public: string getChildName() {
Child child("Child");
return child.getName();
}
};

class Child {
private: string name;
public: Child(string name) { this->name = name; }
public: string getName() { return this->name; }
};


int main() {
Human yaruo("Yaruo");
cout <<yaruo.getChildName()<< endl;
}

のように試しましたがこれはHumanクラスでエラーをはきました
993デフォルトの名無しさん:2013/02/21(木) 17:05:52.71
コンストラクタを互いに呼び出すような使い方は出来ない

それから前方宣言のクラスのポインタを持つ場合普通Pimplイディオムを使う
なぜかというと前方宣言の時点ではクラスの詳細が全く分からないからnew出来ないし
メンバ関数も呼び出せないから
994デフォルトの名無しさん:2013/02/21(木) 17:16:19.35
C#のコンパイルが速いって中間言語へのコンパイルのことでしょ?
995デフォルトの名無しさん:2013/02/21(木) 17:16:31.23
>>993

class Child {
private: string name;
public: Child(string name) { this->name = name; }
public: string getName() { return this->name; }
};
class Human {
private: Child child;
public: Human(Child child) {
this->child = child;
}
};

こういう設計の書き方したいのですが無理なんですかね
996デフォルトの名無しさん:2013/02/21(木) 17:28:03.83
>>995
それで通るだろ?
997デフォルトの名無しさん:2013/02/21(木) 17:33:08.22
>>996
no matching function エラーがHumanのコンストラクタででる。

#include <iostream>
using namespace std;

class Child {
private: string name;
public: Child(string name) { this->name = name; }
public: string getName() { return this->name; }
};
class Human {
private: Child child;
public: Human(Child child) { this->child = child; }
};


int main() {}
998デフォルトの名無しさん:2013/02/21(木) 17:34:48.88
>>995
そのChildの部分をヘッダファイルに持って、Humanの中にChildへのポインタを持たせて
privateに入れるのがPimplイディオム

詰まる所前方宣言だけではコンストラクタはおろかメンバ関数も呼び出せないわけよ

// Pimpl1.h

#ifndef PIMPL1_H_
#define PIMPL1_H_

class Child {
private:
std::string name1;
public:
Child(std::string name) : name1(name) {}
std::string getName() const { return name1; }
};

#endif /* PIMPL1_H_ */
999デフォルトの名無しさん:2013/02/21(木) 17:35:20.21
// Pimpl1.cpp

#include <iostream>
#include <string>
#include "Pimpl1.h"

class Human {
private:
std::string name1;
Child* pchild;
public:
Human(std::string name) : name1(name), pchild(new Child("Child")) {}
std::string getChildName() const { return pchild->getName(); }
std::string getName() const { return name1; }
~Human() { delete pchild; }
};

int main()
{
Human yaruo("Yaruo");
std::cout <<yaruo.getName() << std::endl;
std::cout <<yaruo.getChildName() << std::endl;
}

やりたけりゃこんな風に書けばよい
1000デフォルトの名無しさん:2013/02/21(木) 17:36:12.90
>>997
ttp://ideone.com/xBRzSr
これなら通る
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。