16/02/21 16:37:13.72 jZESqUY+.net
[C++ FAQ]
URLリンク(isocpp.org)
URLリンク(www.bohyoh.com) (日本語)
3:デフォルトの名無しさん
16/02/21 16:38:18.90 jZESqUY+.net
STLつかうと一気に実行ファイルサイズが10倍に?!
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
4:デフォルトの名無しさん
16/02/21 16:39:22.97 jZESqUY+.net
---- テンプレ ここまで ----
5:デフォルトの名無しさん
16/02/21 16:42:58.92 x0ZK9w0e.net
URLリンク(codepad.org)
何故cは0になるのですか
6:デフォルトの名無しさん
16/02/21 16:44:46.98 BYiGM6la.net
>前スレ994
>externは引き続く識別子が外部シンボル(!=ファイルスコープ)であることを明示するためのもの
んなこたーない
7:デフォルトの名無しさん
16/02/21 16:44:54.68 toLQNscP.net
471 デフォルトの名無しさん[sage] 2016/02/09(火) 08:07:47.87 ID:GGDlYrLi
Windowsでエクスプローラその他殆どのアプリがメモリ不足死んだ状態でも生き残らななきゃ
いけないシステム監視ソフトを書いたことがある俺に言わせるとそれほど難しいことじゃない
Windowsの場合、メモリアロケーションに失敗する前にPostMessageが失敗するようになるから
その辺に対応するのがコツ
8:デフォルトの名無しさん
16/02/21 16:48:35.85 2IuYSi1y.net
>>5
初期値が設定されないまま読み出されているので未定義動作。
0 が読み出されたように動くこともあるというだけ。
9:デフォルトの名無しさん
16/02/21 16:51:01.47 BYiGM6la.net
んなこたーない
10:デフォルトの名無しさん
16/02/21 17:10:56.91 hql2OPnW.net
>>5
偶然だ,頼ってはいけない
11:デフォルトの名無しさん
16/02/21 17:16:20.23 BYiGM6la.net
よく見たらデフォルトコンストラクターが有った
そんなことあった失礼>>8
12:デフォルトの名無しさん
16/02/21 17:21:25.25 m+BXwdHb.net
偶然は余計だ
規格上未定義動作というレスで十分
13:デフォルトの名無しさん
16/02/21 17:34:03.41 toLQNscP.net
このスレでは文法に関するレスは規格書と一言一句一致している事が要求されているので、素人さんは要注意
14:デフォルトの名無しさん
16/02/21 17:55:01.74 UzPMPT/j.net
なんか混乱させたけど、
1.ore.cppにも#include "ore.h"を入れる。
2.classやstructの宣言、定義も普通にore.hで行う。
3.インスタンスとして生成するものにはexternつける。
4.グローバル変数等も同様。
5.それらはore.cpp内で初期値与えたりなんか色々。
ちゃんと動作させようとするならこんな感じ?
あとwifeの複数形は使ったことなくて知りません。
15:デフォルトの名無しさん
16/02/21 18:06:28.24 jZESqUY+.net
定数だとconstexprで済ませちゃう。
16:片山博文MZ ◆T6xkBnTXz7B0
16/02/21 21:02:00.64 mZ9I4pVL.net
C++でリスト操作を行うプログラムを作ったよ。
URLリンク(katahiromz.web.fc2.com)
感想を聞かせて欲しい。
17: ◆tAo.kQ2STk
16/02/21 22:01:06.41 S7h+0zbS.net
>>16
prologで良いじゃんっていう感想はあり?
fgetsの第二引数にsizeofを使いたい
コメント少なめ
1関数100行超え当たり前をどうにかしたい
他
18:片山博文MZ ◆T6xkBnTXz7B0
16/02/21 22:18:23.20 mZ9I4pVL.net
>>17
Prologかぁ。ありがとう、参考になった。
19:片山博文MZ ◆T6xkBnTXz7B0
16/02/21 22:40:14.68 mZ9I4pVL.net
>>17
Prologでリスト方程式を解くプログラムを作って欲しいんだが、可能だろうか?
20:デフォルトの名無しさん
16/02/21 23:39:26.02 BYiGM6la.net
前スレ994に一応補足しておくか
externはリンケージの内部・外部とあまり関係無い
static void f();
const int g;
extern void f(); //内部リンケージ
extern int g; //内部リンケージ
21:デフォルトの名無しさん
16/02/22 01:21:52.17 x/uM3a1P.net
「あまり」とか、曖昧な用語でしか説明できないならするな。
sssp://o.8ch.net/85c5.png
22: ◆tAo.kQ2STk
16/02/22 08:16:49.84 /YQF/sqY.net
>>19
チューリング完全である以上は可能だろうけど、リスト方程式とは?
23:片山博文MZ ◆T6xkBnTXz7B0
16/02/22 14:25:58.02 C/gFN+RL.net
>>22
リスト(ここでは動的配列みたいなもの)に対する基本操作を関数で表し、
リスト変数と関数からなる等式によって2個以上の
リスト変数の関係を表すとき、その式に含まれるあるリスト変数はどのように表せるか。
という問題なんだけど。
24: ◆tAo.kQ2STk
16/02/22 16:55:47.45 PefQFuu/.net
>>23
用語の厳密な定義か任意の言語による実装例を望むんだけど
リスト変数ってのは
1. N次元ベクトルを格納するリスト型の変数の事(std::list<int> list;)?
2. それとも環境に束縛されている変数を記述するリストの事(std::list<std::pair<std::function<int()>, std::function<void(int)>>> values;)?
3. それとも式を名前や演算子のリストとして表現した物(std::list<Token> expr;)?
4. それとも構文解析済みの式を格納した木の事(struct L {std::list<L> left, right; Token token;}; std::list<L> ast;)?
あとは
3番だと仮定して、入力されるリスト表現された式は主加法標準形のように何らかの標準化がされていると仮定しても良い?
数学的な意味での「変数」は複数存在しうる?
人力でなら代数的に解ける?つまり、注目している変数の次数は高々4次だと仮定しても良い?
関係が複数の組に対して定義されている時で、かつ、注目している変数について解いた結果として独立な式が得られた場合、
つまり関係式に十分なランクがある場合に、どう動作するべき?
25:デフォルトの名無しさん
16/02/22 18:01:13.58 2E9mhUXS.net
struct hoge
{
hoge( int ){}
};
hoge h[ 8 ] = {};
初期化の値を省略した場合はゼロで初期化されるといろんなサイトに書いてあるのに初期化されません
何故ですか
26:片山博文MZ ◆T6xkBnTXz7B0
16/02/22 18:02:19.08 C/gFN+RL.net
ここではリストは、タプルとかstd::list<int>だと考えてかまわない。
4個の項1,2,3,4を順番に並べたリストを<1,2,3,4>と表す。
リストXの第(h+1)項をX[h]と表す。<1,2,3,4>[1]==2である。
リストXとYを連結した結果をAPPENDLIST(X,Y)と表す。
リストXに項yを追加した結果をAPPENDITEM(X,y)と表す。
リストXから項X[h]を取り除いた結果をERASEITEM(X,h)と表す。
27:片山博文MZ ◆T6xkBnTXz7B0
16/02/22 18:10:53.22 C/gFN+RL.net
リストXの項X[h]の直前に項yを挿入した結果をINSERTITEM(X,h,y)と表す。
ここでZ=INSERTITEM(X,h,y)と仮定すると、X=ERASEITEM(Z,h)と書ける。
これは方程式Z=INSERTITEM(X,h,y)のXについての解であると言える。
一方、Z=ERASEITEM(X,h)と仮定するとX=INSERTITEM(Z,X[h])と書ける。ただ、XのうちでX[h]は未知数として残る。
私は数学者ではないので未知の項目があるときにどのように扱えばいいかはわからない。
28:片山博文MZ ◆T6xkBnTXz7B0
16/02/22 18:30:37.05 C/gFN+RL.net
>>25
主語が抜けてるよ。「メンバー変数」がゼロクリアされるんだよ。
そのhoge構造体にはメンバー変数がない。
29:片山博文MZ ◆T6xkBnTXz7B0
16/02/22 18:55:08.21 C/gFN+RL.net
なぜこんなことを考えているかと言うと、
リストを操作して別のリストを作り出すという変換器Cに対して
Cが基本操作c_1,...,c_nの合成で表せたなら、Cの逆変換器C^(-1)は
それらの逆変換器c_n^(-1),...,c_1^(-1)の合成で表せる。
つまり、あるプロセッサから逆の動作を行う別のプロセッサを作れるわけです。
30: ◆tAo.kQ2STk
16/02/22 18:58:18.98 PefQFuu/.net
>>27
URLリンク(ideone.com)
こういう感じ?
31:片山博文MZ ◆T6xkBnTXz7B0
16/02/22 19:10:56.66 C/gFN+RL.net
>>30
いい感じ。残念ながら私はまだPrologを習得していないので必要なら勉強するつもり。
「SOLVE FOR X: 方程式」みたいな表現で方程式を解けると有り難い。
メールでAmazonギフト券5000円差し上げます。メルアド教えて。
32: ◆tAo.kQ2STk
16/02/22 19:23:11.74 PefQFuu/.net
>>31
5000円券くれるのん?ありがとう。
himajinn13sei@gmail.com
prologは全探索すれば解けて、パターンマッチングとして記述できる問題を書くのには向いてるけど、
本質的に繰り返しを含むアルゴリズム、例えばニュートン法なんかを書くには向いてないですよ。
prologで解く典型的な問題としては
N-Queensとか4色問題とか、あとは条件付きスケジューリングなんかが挙げられるです。
33:デフォルトの名無しさん
16/02/22 19:31:42.90 Sq52s7+O.net
>>25
コンパイルが通らないからです
34:片山博文MZ ◆T6xkBnTXz7B0
16/02/22 19:59:40.54 C/gFN+RL.net
>>32
メール送ったよ
35:片山博文MZ ◆T6xkBnTXz7B0
16/02/22 20:05:18.22 C/gFN+RL.net
今回の謝礼の件は経歴書に書いても構いません。続きはPrologのスレでやります。
【論理】Prolog【初心者】
スレリンク(tech板)
36:デフォルトの名無しさん
16/02/22 20:45:46.28 yZnaoS7H.net
>>33
ゼロで初期化されるなら
hoge h[8] = { hoge(0), hoge(0), hoge(0), hoge(0), hoge(0), hoge(0), hoge(0), hoge(0) };
となるんじゃないんですか
37:デフォルトの名無しさん
16/02/22 22:22:03.27 v1Wohs7h.net
いやそうじゃない
ゼロ初期化はコンストラクタ引数にゼロを渡すのとはまったくちがう
struct hoge
{
int baka;
};
hoge h[ 8 ] = {};
ならh[0].baka~h[7].bakaはゼロ初期化される
っていうか初心者歓迎スレに行け
38:片山博文MZ ◆T6xkBnTXz7B0
16/02/22 22:22:33.71 C/gFN+RL.net
メンバー変数がなければデータを格納できない。
39:デフォルトの名無しさん
16/02/22 22:56:49.91 /YQF/sqY.net
>>36
「ゼロ初期化」っていう訳語の専門用語と、「ゼロで初期化する事」は意味が違う。
zero initializationでググると良いよ。
40: ◆tAo.kQ2STk
16/02/22 22:57:46.65 /YQF/sqY.net
>>>34
メール受け取ったよ
41:デフォルトの名無しさん
16/02/22 22:58:23.84 yZnaoS7H.net
>>37
struct hoge
{
hoge(){}
int baka;
};
ならbakaは不定です。
ほんとにゼロ初期化されるのがルールなんですか
42:デフォルトの名無しさん
16/02/22 23:00:01.44 yZnaoS7H.net
>>39
大抵のサイトは値を省略すると「ゼロで初期化される」と書いてあります。
正確なところを教えてください。値を省略すると何が起こるのですか
43:デフォルトの名無しさん
16/02/22 23:33:38.04 /YQF/sqY.net
>>42
n3690から抜粋すると
8.5.17:The semantics of initializers are as follows. The destination type is the type of the object or reference being
initialized and the source type is the type of the initializer expression. If the initializer is not a single (possibly
parenthesized) expression, the source type is not defined.
— If the initializer is a (non-parenthesized) braced-init-list, the object or reference is list-initialized
8.5.4.3: List-initialization of an object or reference of type T is defined as follows:
if the initializer list has no elements and T is a class type with a default constructor, the
object is value-initialized.
8.5.8: To value-initialize an object of type T means:
— if T is a (possibly cv-qualified) class type (Clause 9) with either no default constructor (12.1) or a
default constructor that is user-provided or deleted, then the object is default-initialized
8.5.7: To default-initialize an object of type T means:
— if T is a (possibly cv-qualified) class type (Clause 9), the default constructor (12.1) for T is called
つまりこの場合に限ると
・リストで初期化するとlist-initializeされる。
・リストが空の場合、list-initializeはvalue-initializeになる。
・デフォルトコンストラクタが削除されてたり、ユーザ定義されてる場合はvalue-initializeはdefault-initializeになる。
・default-initializeはデフォルトコンストラクタを呼び出す
・hoge::hoge()は何も実行しない→hoge::bakaは未定義のままになる
といった具合。
解決するには、
hoge() : baka(0) {return;}
みたいにちゃんと初期化コードを書かなきゃ駄目。
44:デフォルトの名無しさん
16/02/22 23:37:52.25 /YQF/sqY.net
ちなみにhoge::hoge()を定義しない場合、暗黙のデフォルトコンストラクタが定義されて
その場合はvalue-initializeはzero-initializeになるですよー
45:デフォルトの名無しさん
16/02/22 23:59:33.96 ANT1CVM2.net
面倒だ
struct hage
{
hage() = default;
hage( int ){}
};
これでOK
46:デフォルトの名無しさん
16/02/23 02:18:04.37 gGx+alPj.net
前スレでラムダ式を気軽に使っていいか?という質問をした者ですが、
以下のようにforの中に定義を書いてしまった場合、forのループの度に
ラムダ式のオブジェクトを生成したりするんでしょうか?
そうだとするとforの外に出しておいたほうがいいんでしょうか?
for
{
~ウン十行ある~
auto func = [](){}; // ラムダ式を使う場所の近くで定義を書きたい(把握しやすいように)
if
{
func();
}
else
{
func();
}
}
47:デフォルトの名無しさん
16/02/23 02:42:27.72 0Gk/RmeS.net
2chに書き込む暇が有ったら測定してみろ
48:デフォルトの名無しさん
16/02/23 07:59:59.43 ltvQNGjy.net
>>41
以下だと、int baka; を、{ }で囲んでいないから、初期化できていない
struct hoge
{
hoge(){}
int baka;
};
上記を以下のようにすればよい。>>37 に書いてある
struct hoge
{
int baka;
};
hoge h = {};
ちゃんと本を読め。初心者歓迎スレに行け
49:デフォルトの名無しさん
16/02/23 08:04:39.95 ltvQNGjy.net
>>46
ループ毎に、処理が変わらないのなら、forの外に書く
ループ毎に、処理が変わるのなら、forの内に書く
50:デフォルトの名無しさん
16/02/23 08:18:48.42 UeUvEN3+.net
>>48
bakaをゼロで初期化する方法は最初から聞いてません
初期化の値を省略した場合の挙動を聞いているのです
デフォルトコンストラクタが呼ばれるならそう書けばいいのにどこもゼロで初期化されるとしかかいてませんでした
51:デフォルトの名無しさん
16/02/23 08:31:58.63 xDQTJcBy.net
まあ>>50が予想された結果だ
>>43の後に>>48はいろいろとマヌケすぎる
52:デフォルトの名無しさん
16/02/23 11:21:56.71 ltvQNGjy.net
>>43 みたいに、複雑な判定が必要なら、
そもそも必ず明示的に初期化すべき
多くのコーディング規則でも、
初期化していない値を使ってはならないと書いてあるだろ
未初期化の場合、初期化し忘れたのか、
故意にやっているのか、意図がわからないから困る
もし、各コンパイラで挙動が異なったら、
こんなバグや意図を突き止めて、修正するのは大変
53:デフォルトの名無しさん
16/02/23 13:35:15.59 aFHEViKg.net
>>50
素人が適当なウソを無責任に書き散らしているサイトが多いが、
「どこでも」と言うなら、Cの構造体の初期化について書いてあったんだろう。
要約するとお前が間抜け
54:デフォルトの名無しさん
16/02/23 14:05:39.64 4c1IOC2x.net
>>50
C++の文脈でPODと非PODの違いにも触れずに={}で一律にゼロ初期化されるなんて
書いてるバカなサイトなんて見たことないんだが?
どこでもっていうなら3つくらいは挙げてくれ
55:デフォルトの名無しさん
16/02/23 14:15:32.01 UeUvEN3+.net
>>54
列挙しても特に意味ないので
意味があるならやりますけど
56:デフォルトの名無しさん
16/02/23 14:24:32.35 4c1IOC2x.net
もうお前はいいよ相手にしちゃいかんやつだ
57:デフォルトの名無しさん
16/02/23 14:37:12.48 UeUvEN3+.net
突然絡んできてもういいよとは何が何やらわかりません
どうしてしまったんですか
58:デフォルトの名無しさん
16/02/23 20:17:07.10 bPGlp/ev.net
>>55
意味ならあるだろ
>>54は={}でゼロ初期化されるなんて書かれているサイトは見たこと無いって主張していて、
君はその逆に、どのサイトを見ても={}でゼロ初期化されるって書いてあると主張している。
どちらが正しいか証明したければ
君が知ってるサイトを片っ端から挙げるべきなのは分かるね?
逆に君がそうしない、又は出来ないというのなら君が単に嘘ついて炎上学習したって事になる。
59:デフォルトの名無しさん
16/02/23 20:24:46.11 MF5ot8kL.net
>>58
嘘もついてないですし自分の正しさを証明する必要も意味もないので
貼るなら正しい仕様を理解するための参考になるサイトを貼ってくれる方がいいですね
ダメなサイトを貼る意味ってあります?
60:デフォルトの名無しさん
16/02/23 20:34:32.34 xDQTJcBy.net
>>59
興味があるので、ゼロ初期化と書いてあるサイトを教えていただけませんか?
今回だけ特別に教えて欲しいです。
代わりに参考になるサイトを紹介します
URLリンク(www.open-std.org)
→WG21→papers
N4567がオススメです
61:デフォルトの名無しさん
16/02/23 20:48:31.49 MF5ot8kL.net
>>60
そこは知ってるので別の所お願いします
62:デフォルトの名無しさん
16/02/23 23:03:35.63 bPGlp/ev.net
>>59
背理法って知ってる?
63:デフォルトの名無しさん
16/02/24 06:55:08.54 iraD9m85.net
>>62
熱膨張的な物言いでカッコいいですね
64:デフォルトの名無しさん
16/02/24 07:00:00.19 iS9soXkB.net
ボク自身も熱で膨張しそうです
65:デフォルトの名無しさん
16/02/24 08:48:53.60 qiLj0DES.net
熱くたぎる怒張がどうしたって?
66:デフォルトの名無しさん
16/02/24 12:21:03.69 CiZ4HRqF.net
>>62
ム板じゃないところに来てるかと思って板名見なおしたぞ
67:デフォルトの名無しさん
16/02/24 14:23:42.94 4ZA9ynQM.net
>片桐 はいり(かたぎり はいり、1963年1月18日 - )は、日本の女優。
>本名、片桐 由美(かたぎり ゆみ)。東京都大田区出身。
>スターダストプロモーション芸能1部所属。
68:デフォルトの名無しさん
16/02/24 20:35:27.44 qiLj0DES.net
はいりはいりふれはいりほー
69:デフォルトの名無しさん
16/02/24 21:23:02.15 wSKjAMnV.net
int a = int();
a = int();
のint()はどういう意味ですか
一行目と二行目のint()に違いはありますか
70:デフォルトの名無しさん
16/02/24 21:27:07.75 f7gTsPBB.net
一行目、aをコンストラクトする。
二行目、コンストラクトした一時オブジェクトをaに代入する。
71:デフォルトの名無しさん
16/02/24 21:31:59.33 iraD9m85.net
一行目は一時オブジェクトは作成されないのですか
72:デフォルトの名無しさん
16/02/24 21:44:13.38 t5G9cIIP.net
URLリンク(qiita.com)
結構面白かったです。
73:デフォルトの名無しさん
16/02/24 22:14:05.66 ZvNmPlpt.net
>>71
知ってるくせに
74:デフォルトの名無しさん
16/02/25 09:45:38.74 pcAVTpJw.net
int();
と
int(0);
は何が違うんですか
75:デフォルトの名無しさん
16/02/25 09:50:39.66 pDSMfAMl.net
int(0)の方が1文字多い。そしてより明示的
だけどよっぽどの偏屈者じゃない限りint()とかint(0)とか書かない
76:デフォルトの名無しさん
16/02/25 20:29:55.94 /tM+b5YW.net
int()はint型の値初期化によって得られる値
int(0)は0をintにconst_castした結果
77:デフォルトの名無しさん
16/02/25 23:46:46.50 Y3PURJ2y.net
auto i = int{}; はフツーだろ?
auto j = int{0}; は変人
78:デフォルトの名無しさん
16/02/26 00:43:33.92 VN+AWD5G.net
いやいやフツーはint i = 0;だろw
79:デフォルトの名無しさん
16/02/26 02:27:23.53 JkkprwN3.net
int i {0}; // だろ
80:デフォルトの名無しさん
16/02/26 02:57:45.65 sByuqtKs.net
宣言と初期化に関して、いろんな表記が有りすぎて笑えないレベルだな
コンストラクタなのかキャストなのかも分かりにくいし
最高です
81:デフォルトの名無しさん
16/02/26 06:59:41.78 L7RTVb9K.net
しかしnewでクラス作成時にメンバを全ゼロ初期化する方法がないんだな
82:デフォルトの名無しさん
16/02/26 07:10:06.43 FbdyjvxV.net
ちょっと何言ってるかわからない
83:デフォルトの名無しさん
16/02/26 07:44:52.80 L7RTVb9K.net
しかしnewでクラス作成時コンストラクタ呼出し前にメンバを全ゼロ初期化する方法がないんだな
84:デフォルトの名無しさん
16/02/26 07:48:12.67 L7RTVb9K.net
DelphiとかBCBだとTObject派生物はゼロ初期化されるが
標準C++規格でのやり方では聞いたことが無い
85:デフォルトの名無しさん
16/02/26 08:01:04.93 Pw5RFD2X.net
自分が知らない、聞いたことがないことを
方法が無いと断定する低能には難しいだろうな
86:デフォルトの名無しさん
16/02/26 08:04:28.09 tJ1gUyHd.net
初期化はコンストラクタでやるもんだと思うが、なぜコンストラクタ呼び出し前に
そんなことやる必要があるんだろうか。
87:デフォルトの名無しさん
16/02/26 08:28:20.75 ouDcFdqg.net
char p[sizeof hoge]={};
new(p) hoge();
で
88:デフォルトの名無しさん
16/02/26 08:53:49.35 L7RTVb9K.net
>>86
初期値がゼロのメンバ変数はいちいち初期化する面倒が不要になる
89:デフォルトの名無しさん
16/02/26 10:15:10.11 OlJixx6H.net
struct X { int a, b, c; }
X *x = new X({0, 0, 0});
これを簡略化したいってことか?
90:デフォルトの名無しさん
16/02/26 12:19:06.42 h1q56VEq.net
new X() で済む話だよね。
91:デフォルトの名無しさん
16/02/26 18:27:57.97 Pw5RFD2X.net
これでおk
struct baka {
int p;
baka() = default;
baka(int p) : baka{}, p{p} {
}
};
92:デフォルトの名無しさん
16/02/26 18:43:51.81 AYRtcLu9.net
struct baka {
int a=0;
bool b=true;
baka() = default;
};
でええやん
93:片山博文MZ ◆T6xkBnTXz7B0
16/02/26 18:45:56.98 6Zondczs.net
struct tensai {
int a=0;
bool b=true;
};
94:デフォルトの名無しさん
16/02/26 19:38:43.59 VKP1Cmo0.net
0で初期化すれば安心って、それ自体が間違ってる気がする。
95:デフォルトの名無しさん
16/02/26 20:27:08.19 5826a3fE.net
PostMessageを監視すべし
96:デフォルトの名無しさん
16/02/26 23:25:03.72 yiTr60/V.net
double型の行列とcomplex<double>型の行列演算結果がcomplex<double>
型になるように型拡張を行うには何のテクニック使ったらいい?
あ、単純な演算子のオーバーロード使うと結構大変だから(できんわけではないが)
テンプレートテクニックとかうまく使えないかな。
97:デフォルトの名無しさん
16/02/26 23:45:09.61 zaiZLpHx.net
演算子のオーバーロードが一番いい
98:デフォルトの名無しさん
16/02/27 00:58:43.79 e3stW6O/.net
なにをいってるかわからんな
行列の個々の要素ごとにdoubleとcomplex<double>で四則演算するなら
結果は自動的にcomplex<double>になるだろ
99:デフォルトの名無しさん
16/02/27 01:54:26.55 pvHfkl8D.net
complex<double>をベクトルとみなして、doubleをスカラとみなすのか
そういう演算はC++では普通標準で用意しないから自分でオーバーロードすればいいじゃん
100:デフォルトの名無しさん
16/02/27 01:57:02.77 C/ecoBXH.net
TVアニメ『NEW GAME!』というのを知り、漫画を読みました。
無職5年目ですが、ぷろぐらむ(C++)Win32 アプリケーションを使い
ゲームを製作(勉強)したいと思いました。
お勧めの参考書籍やサイトが有りましたら教えて下さい
101:デフォルトの名無しさん
16/02/27 02:32:29.58 wxfsuIHK.net
>>96
行列クラス自分で作るつもりなら当然行列どうしや行列とスカラーの演算子も定義しなきゃいかんわな
俺ならそんなもの自作しないで既存の行列演算ライブラリ(例えばeigenとか)使うけど
ちなみに>>98が言ってるようにdouble型とcomplex<double>型のスカラー演算結果は標準でcomplex<double>になるよ
102:デフォルトの名無しさん
16/02/27 03:47:18.73 0gtZVCNd.net
>>100
ここは怖い人ばかりなので初心者スレへどうぞ
103:デフォルトの名無しさん
16/02/27 04:15:41.61 EVLCSxnr.net
>>102は会話のできないアスペ
104:デフォルトの名無しさん
16/02/27 09:03:39.57 vL66Pzde.net
>>96
もしかして、このあたりの話をすればいいのかな?
URLリンク(stackoverflow.com)
これが「結構大変だ」と言っていたのならすまぬ。
105:デフォルトの名無しさん
16/02/27 09:52:02.29 HsyJ5PWO.net
>>104
ありがとう。
スカラー単位の型拡張はあたりまえだけど、double型を要素とする
行列をcomplex<double>型の行列に型拡張するときどうするんだろ
と思ってね.
やはり要素レベルでtraitsを使って,traitsで定義した型を要素と
する行列を作るのが正攻法かなあ。C++14だともっとエレガントに
できないかな? 紹介してくれた所を見てみるよ.
106:デフォルトの名無しさん
16/02/27 12:31:21.47 hVqcAFgk.net
手法にこだわって目的を達成できない典型的パターンだな。
107:デフォルトの名無しさん
16/02/27 16:53:21.38 tW+Ks6U1.net
目的がオナニーだから問題ない
108:デフォルトの名無しさん
16/02/27 18:46:59.39 HsyJ5PWO.net
馬鹿には好きなだけ言わせとくよ
109:デフォルトの名無しさん
16/02/27 20:19:31.60 qyipvj4l.net
初心者の口から出る「エレガント」に反吐が出る
110:デフォルトの名無しさん
16/02/27 20:25:42.58 HsyJ5PWO.net
はいはい、キチガイ犬w
111:デフォルトの名無しさん
16/02/27 20:43:20.31 e3iZnQnQ.net
#ifndef INCFILE_H_
最後のアンダーバーは何のためにあるですか?
112:デフォルトの名無しさん
16/02/27 21:54:26.15 TnvXsjWd.net
反吐が出ると言って本当に吐いてるやつを見たことがない
113:デフォルトの名無しさん
16/02/27 21:57:54.41 EVLCSxnr.net
自然言語の言い回しも理解できない低能には
プログラム言語は難しいだろう
114:デフォルトの名無しさん
16/02/27 22:06:17.26 EVLCSxnr.net
>>111
低能が書いた#defineによる定数と
名前を衝突しにくくするためだろうきっと
115:デフォルトの名無しさん
16/02/27 22:07:02.57 T6Jc3KoX.net
ひとつのテンプレート関数内部で'A'とL'A'を自動判別する方法教えてください
int a['A' or L'A'];
みたいな
116:デフォルトの名無しさん
16/02/27 22:26:19.05 TnvXsjWd.net
>>113
あのさ、ここは2チャンネルであって、基本的に初心者が集まる場所なんだよ?
昔とは違うんだ。わかるか?
117:デフォルトの名無しさん
16/02/27 23:38:42.62 bRJMsBK5.net
>>116
馬鹿の無根拠な妄言ktkr
118:デフォルトの名無しさん
16/02/27 23:53:52.62 TnvXsjWd.net
もともとは>>109の発言
119:デフォルトの名無しさん
16/02/28 09:01:53.38 p5UOgBYD.net
昔ってなんだ? ネットニュースか?
120:デフォルトの名無しさん
16/02/28 09:51:52.96 sxXcnRPc.net
>>100
14歳からはじめるC言語オンラインゲームプログラミング
15歳からはじめるDirectX9 3Dゲームプログラミング教室
14歳からはじめるシリーズ~ あと二冊
121:デフォルトの名無しさん
16/02/28 10:59:04.87 yeDT/yDi.net
Compositeデザインパターンでcomposite1のchildlenの型をcomponentの配列ではなくcomposite2の配列に限定し、composite2のchildrenはleafのみの配列に限定したいのですが、どのようにしたらいいのでしょうか?
122:デフォルトの名無しさん
16/02/28 13:29:41.30 w64tNJjH.net
それはコンポジットパターンなのか?
123:デフォルトの名無しさん
16/02/28 13:48:26.49 5n5R60tK.net
それだけじゃ型を明示しろよとしか思えんが
124:デフォルトの名無しさん
16/02/28 14:19:39.94 tz1QY8TO.net
そういうふうに組めばいいとしか言いようがない。
組む際に何がネックになってるのかね。
125:デフォルトの名無しさん
16/02/28 17:19:18.45 yeDT/yDi.net
>>123
>>124
Compositeでchildrenの型としてComponentを用い、それを継承してComposite1とComposite2を作ったら
これらのchildrenの型が自動的にComponentになってしまうのでどこでどうやって型を明示すればよいのか困っております
126:デフォルトの名無しさん
16/02/28 17:35:13.98 emPXsfmM.net
型を限定したいとか明示したいとか言ってる時点でCompositeパターンを使うのは間違いなんじゃない?
127:デフォルトの名無しさん
16/02/28 18:05:44.76 jJK+500Y.net
配列要素の型を限定したい(componentの配列ではなくcomposite2の配列に限定したい)というのはいかんともし難い
配列要素の型を明示したいだけなら多態性がわかっていれば問題なくできるはず…
ただし、インスタンスの配列で多態性をやるには配列要素の型は基底クラスでなく派生クラスにする必要があり、
派生クラスが2種類(以上)あるcomponentパターンはできない
この場合の配列は基底クラスを指すポインタの配列であるべきなのでは…
※ 個人の感想です。
128:デフォルトの名無しさん
16/02/28 18:27:33.71 fFRYdAaf.net
配列を持つコンポーネントにして、visitorと組み合わせるってのはダメなのかな
129:デフォルトの名無しさん
16/02/28 18:28:25.88 yeDT/yDi.net
>>122,>>126
Compositeパターンじゃなくてもいいのですが、childrenに対する操作は同じ操作がたくさんあるので継承したいのです。
しかしcomposite1はcomposite2にしかないメソッドを呼び出すこともあり、この時ダウンキャストするのを出来れば避けたいと思っております。
>>127
やはり限定するのは難しいですか……
すみません、
>配列要素の型を明示したいだけなら多態性がわかっていれば問題なくできるはず
というのは何を使って明示することを想定されているのか教えていただけないでしょうか?
130:デフォルトの名無しさん
16/02/28 19:11:55.42 c40FCrwk.net
登場人物がComposite1とComposite2とLeafだけなら、普通にComposite1::getChild()は
Composite2を返してComposite2はLeafを返せばいいだけだろ。
131:デフォルトの名無しさん
16/02/28 19:52:22.72 PMSRihXY.net
>>125
「これらのchildrenの型が自動的にComponentになってしまう」
↑ここが何かおかしい。んなわけねーだろ、と。
ほんとうにそんなところまで Composite が制約を加えてるなら、そこが問題。
>>129
ダウンキャストして済むならそれで済ませればいいだろうとも思う。
「避けたい」の具体的な理由があるのかと。
132:デフォルトの名無しさん
16/02/28 20:57:13.19 gim467qR.net
>>129
childrenに対する操作の一部を共通化したいだけなら、
こんな感じでCompositeに共通処理を集めるだけじゃ駄目かね。
template<class Child> class Composite { /* 共通処理 */ };
class Leaf { };
class Composite2 : public Composite<Leaf> { /* Leafだけの処理 */ };
class Composite1 : public Composite<Composite2> { /* Composite2だけの処理 */ };
133:デフォルトの名無しさん
16/02/28 21:20:23.21 yeDT/yDi.net
>>131
class composite{
vector<shared_ptr<component> > children;
}
class composite1:public composite{
}
の形で実装したらcomposit1のchildrenはcomponentになると思っていましたが、違ったでしょうか?
ダウンキャストを避けたいのは単に私が管理しきれなくなりそうだからです
>>132
おっしゃる通りの実装で解決しました。
たしかにtemplateを使えば私の望む動きをしてくれます。
分かりやすく素晴らしい回答大変ありがとうございました。
134:デフォルトの名無しさん
16/02/28 21:27:42.44 emPXsfmM.net
妙に早いな
135:デフォルトの名無しさん
16/02/28 21:33:54.60 PMSRihXY.net
>>133
配列実体の持ち方を composite で決めてしまっているところが問題だということ。
class composite{
virtual component& nth_child(int n) = 0;
}
class composite1:public composite{
vector<shared_ptr<compisite2> > children;
}
こうしておけばよかったんじゃないかと思うんだけど >132 で解決したならいいかな。
136:デフォルトの名無しさん
16/02/28 22:12:35.00 jJK+500Y.net
お禿げ様はインターフェースは一般に最初の基底クラスに全て集まる傾向にあるとはどっかに書いてたが
実装まで最初の基底クラスに集約するのが良い設計なのかどうか…
Cmposite1、Comosite2だけならまだしも
Cmposite3、Comosite4、…と増えていった場合に都度Compositeクラスのソースコードが編集され、肥大化していくんやで~
137:デフォルトの名無しさん
16/02/29 05:58:03.54 j6jzPb2d.net
Mixin的な使い方に限るなら問題ないでしょう。
継承が嫌なら、Compositeをメンバ変数にするとか、
vectorを受け取る関数テンプレート群にしてしまうとかすればいいし。
138:デフォルトの名無しさん
16/03/02 23:08:12.47 g3p9uXMc.net
C++の質問です。
ウィンドウハンドルHWND型を数値化する方法をご教授下さい。
何をしたいのかというと、VisualStudio付属のspy++を使用して、
色々な事をしています。
spy++の各ウィンドウの「ウィンドウ」文字列の右にウィンドウハンドルID?のような、
ウィンドウ毎に一意につけられたIDが表示されています。
このIDを取得したいのです。
なのでウィンドウハンドルHWND型を数値化出来れば、上記spy++のウィンドウハンドルID?
と同じ物を取得できると考えました。
よって、ウィンドウハンドルHWND型を数値化する方法をご教授下さい。
※もしかしたら目的と実施しようとしている事が間違っているかもしれません
※その場合は正しくウィンドウハンドルID?を取得できる方法をご教授下さい
139:デフォルトの名無しさん
16/03/02 23:26:29.94 v5tMoIR7.net
>>138
size_t id = reinterprete_cast<size_t>(hwnd);
140:デフォルトの名無しさん
16/03/02 23:57:02.22 9ZwWQH++.net
なぜそこでstd::intptr_tでなくsize_tが出てくるのか不思議
141:デフォルトの名無しさん
16/03/03 05:25:34.43 tlFkd89Q.net
しかもreinterpret_cast<&size_t>じゃないとパンニングできないし
142:デフォルトの名無しさん
16/03/03 05:55:57.70 vKHIYEam.net
uint32_t id = (uint32_t)(uintptr_t)hwnd;
で問題ないよ
143:片山博文MZ ◆T6xkBnTXz7B0
16/03/03 06:01:02.75 UnIH0jHm.net
>>142
hwndが64ビットの可能性
144:デフォルトの名無しさん
16/03/03 06:03:58.47 vKHIYEam.net
>>143
URLリンク(msdn.microsoft.com)
145:片山博文MZ ◆T6xkBnTXz7B0
16/03/03 06:18:15.21 UnIH0jHm.net
#include <cstdint>
uint32_t id = static_cast<uint32_t>(reinterpret_cast<uintptr_t>(hwnd));
C++スタイルのキャスト、めんどい
146:片山博文MZ ◆T6xkBnTXz7B0
16/03/03 06:22:38.14 UnIH0jHm.net
Windows限定ならcstdint要らないかな?
UINT id = static_cast<UINT>(reinterpret_cast<UINT_PTR>(hwnd));
147:片山博文MZ ◆T6xkBnTXz7B0
16/03/03 06:27:13.98 UnIH0jHm.net
Win16じゃ動かないんだな
148:デフォルトの名無しさん
16/03/03 06:42:45.53 +JeDUCvS.net
16ビットオブジェクトを出力できるコンパイラ未だもってんのか?
149:デフォルトの名無しさん
16/03/03 08:31:20.27 6K3/+EIJ.net
>>138
ありがとう解決しました。
.Netの世界の文字列型に変換する必要があるので以下としました。
String^ hw_id = static_cast<UINT>(reinterpret_cast<UINT_PTR>(this->hw)).ToString("X");
150:デフォルトの名無しさん
16/03/03 08:36:11.53 km2vGawV.net
>>148
持ってるか?
って聞かれたら、
Visual C++ 1.52c が押し入れのどこかに眠ってるはず
って答えることにしてる
151:デフォルトの名無しさん
16/03/03 11:36:15.96 DPHy8aYb.net
>>148
昔手に入れたLSI Cの試食版の方ならたしかどこかに・・・
152:デフォルトの名無しさん
16/03/03 12:03:10.46 mDpo7bQQ.net
Cマガ電脳倶楽部
153:デフォルトの名無しさん
16/03/03 12:50:10.40 ECv4uLci.net
ビジアルシー2についてるのがある。
154:デフォルトの名無しさん
16/03/03 20:25:35.72 km2vGawV.net
>>153
それが >>150 だよ
大元の Visual C++ 2.0 は捨てたかも知らんけど、1.52c はなぜか捨てられない
155:デフォルトの名無しさん
16/03/03 20:47:49.02 +JeDUCvS.net
1.52って5.24" FDDだったりしない?
156:デフォルトの名無しさん
16/03/03 21:13:16.06 km2vGawV.net
>>155
単品売りは知らんけど 2.0 付属の奴は1995 年だから、1.52c も普通に CD-ROM だよ
URLリンク(ja.m.wikipedia.org)
157:デフォルトの名無しさん
16/03/03 21:20:26.58 +JeDUCvS.net
そう言えば、32ビットWindowsもう動態保存してるの無いや
double spaceからサルベージするためにWin98SEをqemuかvboxにいれたイメージがどこかにあるはずだけど
158:デフォルトの名無しさん
16/03/04 09:04:28.30 TYlQwhRh.net
strcopyを代入演算子=に置き換えてみればわかるだろ
159:デフォルトの名無しさん
16/03/04 10:00:38.32 wO5/jJwK.net
は?どこの誤爆だよ
それにstrcopyなんてものは聞いたこともないぞ
朝からクソ酔っ払ってる俺よりもトンチンカンな事書き込むってどんだけヤバイ薬やってるんだよ
160:デフォルトの名無しさん
16/03/04 10:05:52.57 4C3oKPHs.net
俺に聞け
161:デフォルトの名無しさん
16/03/05 16:26:40.97 Uw046/hC.net
初心者です。
c++で文字を入力するとそれを出力するものをビルドしたら、出力した後すぐにビルドが終わってしまいます。
出力後に画面を固定する方法はありませんか?
162:デフォルトの名無しさん
16/03/05 16:33:23.72 yY6Am1xo.net
ビルドじゃなくてデバッグ実行だろ?
ひとまずVSと仮定して、適当にブレークポイントでも打っとけば?
163:デフォルトの名無しさん
16/03/05 16:33:48.17 niBmwPNn.net
>>161
入力待ちを利用する
164:デフォルトの名無しさん
16/03/05 16:36:24.81 TtOs9IsN.net
環境を書かないと
165:デフォルトの名無しさん
16/03/05 16:53:34.22 Uw046/hC.net
<<163
出来そうです。有難うございました。
166:デフォルトの名無しさん
16/03/05 17:01:13.18 e8RWR+IR.net
デバッガーで実行(F5)ではなく、デバッガー無しで実行(ctrl-F5)すれば良い
167:デフォルトの名無しさん
16/03/05 17:42:59.14 u5sweskK.net
いやそういう話じゃないし質問者は解決したみたいだから
168:デフォルトの名無しさん
16/03/05 18:15:07.47 eQxVJDBh.net
system("pause");
169:デフォルトの名無しさん
16/03/05 19:06:42.96 e8RWR+IR.net
いや、確実にそういう話だよ。
そういう話じゃないなら、どう言う話だよ。
170:デフォルトの名無しさん
16/03/05 19:35:57.25 u5sweskK.net
はあ?入力文字の出力直後にコンソール消えちゃった(泣)のありがちパターンに決まってるだろ
なんでそれが分らないんだよ
171:デフォルトの名無しさん
16/03/05 19:47:02.21 oAjMaO0h.net
>>170
だからそういう話だろう。
172:デフォルトの名無しさん
16/03/05 19:56:15.67 u5sweskK.net
>>171
もしかして、それがデバッガで実行するかそうじゃないかで変わるとでも思ってるのか?
173:デフォルトの名無しさん
16/03/05 19:57:35.25 e8RWR+IR.net
その、ありがちなパターンがどう言う状況で生じるのか、わからないのか?
PostMessage監視してろよ
174:デフォルトの名無しさん
16/03/05 19:59:34.21 e8RWR+IR.net
>>172
もしかして、それがデバッガで実行するかそうじゃないかで変らないとでも思ってるのか?
175:デフォルトの名無しさん
16/03/05 20:00:46.88 TtOs9IsN.net
多分そうなんだろうけど、決めつけはしない方が良いかと
176:デフォルトの名無しさん
16/03/05 20:03:50.62 45RldPY2.net
PostMessageさんはもう許してやれよ
177:デフォルトの名無しさん
16/03/05 20:41:09.94 e8RWR+IR.net
>>175
俺の推測は完璧だ。
キミも後10年PostMessage監視してれば、「環境書け」とかバカのひとつ覚え繰り返さなくても済むようになるかもね。
178:デフォルトの名無しさん
16/03/05 20:41:10.45 oAjMaO0h.net
実際変わるよねぇ
VSだと。
179:デフォルトの名無しさん
16/03/05 21:15:14.82 u5sweskK.net
ホントだ知らんかったわ。どうなってるんだこれ?
でもデバッガ無しかどうかの問題じゃないわな
180:デフォルトの名無しさん
16/03/05 21:41:59.15 NhCRzDCm.net
みんなの書き込みがまるでわかんないんだけど
やっぱり PostMessage から勉強しなきゃいけないと、そういうこと…?
181:デフォルトの名無しさん
16/03/05 21:50:07.17 u5sweskK.net
>>177
たしかに俺はPostMessageについて書いた者だが
キミは
while (PostMessage(hWnd, WM_NULL, 0, 0))
と64メガのVirtualAllocで証明終了!君か
これをバカ呼ばわりされたのがよっぽど悔しかったみたいだな
CTRL-F5についてはいいことを教えてもらったよありがと
exe直接起動と振る舞いが違うんじゃ使うことはないだろうけど
もう一度言っておくけどキミがしつこく言ってる「PostMessageの失敗がメモリ不足の兆候になる」なんて俺は一言も言ってないからw
182:デフォルトの名無しさん
16/03/05 21:58:24.08 e8RWR+IR.net
>>181
自信満々で、物凄くあたま悪い発言をして、しかも、その頭悪さを理解してないバカは
日本中探してもそんなに多くは無い。
471 デフォルトの名無しさん[sage] 2016/02/09(火) 08:07:47.87 ID:GGDlYrLi
Windowsでエクスプローラその他殆どのアプリがメモリ不足死んだ状態でも生き残らななきゃ
いけないシステム監視ソフトを書いたことがある俺に言わせるとそれほど難しいことじゃない
Windowsの場合、メモリアロケーションに失敗する前にPostMessageが失敗するようになるから
その辺に対応するのがコツ
183:デフォルトの名無しさん
16/03/05 22:04:16.82 u5sweskK.net
>>182
それが「PostMessageの失敗がメモリアロケーション失敗の兆候を知ることが出来る」としか読めないわけか
そんなんだから
while (PostMessage(hWnd, WM_NULL, 0, 0))
と64メガのVirtualAllocで証明終了!
になっちゃうんだよCTRL-F5クン
184:デフォルトの名無しさん
16/03/05 22:17:53.94 e8RWR+IR.net
プライドだけ高いバカって始末に負えないな
ま、バカだから虚栄張ってないと世渡りできないんだろうが
185:デフォルトの名無しさん
16/03/05 22:21:58.02 NhCRzDCm.net
よくわかりました。ありがとう
186:デフォルトの名無しさん
16/03/05 22:43:46.74 KlM00wBU.net
環境はVC++2010です
セミコロン『;』について質問ですが
クラスの場合
class Test
{ ..... };
『}』の後ろに『;』がついています
class Test
{ ..... } obj ;
この様に『}』と『;』との間に記述すれば
『obj』というオブジェクトが生成
という事を最近知りました
構造体で同じことを試したら
オブジェクトが生成できました
配列、列挙体に同じ事をしたらエラーになります
配列、列挙体の『;』は何ですか?
187:デフォルトの名無しさん
16/03/05 22:52:37.60 oAjMaO0h.net
文の終端記号
文法上そうなっている。
変数定義構文だから。
配列がどういう記述をしているかはわからないが、enumでもいけるだろ。
namespaceは要らないのよね。
188:デフォルトの名無しさん
16/03/05 23:12:16.43 xWrvFPw5.net
ID:u5sweskK はコンソールアプリのデバッガ有り無しで動作が変わることも
知らなかったのに、結局偉そうなんだな
どうしようもないな
そんなことだからPostMessageなんだよ
サブスレッドから結果を返す為にPostMessage使ったんだって?バカ
189:デフォルトの名無しさん
16/03/05 23:29:40.33 oC+37Qlp.net
valgrind使いものにならないさんか。
Visual Studioの挙動も知らずposix環境のツールも使えず一体何だったら知ってるんだろうか?
190:デフォルトの名無しさん
16/03/05 23:42:02.63 VRv8TvnQ.net
え、valgrind使い物にならないも、postmessageさんなの?
だとしたら、ほんとすげぇなwww
191:デフォルトの名無しさん
16/03/06 00:05:21.79 ChxbUFgQ.net
10年以上前にPostMessageを駆使した監視プログラム作ったらしい
会社勤めなら中堅どころなはずだが、これだけ無能な奴も珍しい
良く辞めずに続いてると思う
己の無能さを理解出来ないバカが最強って事だな
192:デフォルトの名無しさん
16/03/06 00:11:04.70 LHysMdWz.net
だいぶ前にclassのデフォルトアクセス範囲をpublicにすべきっていってたのもpostMessageさんな気がする
193:デフォルトの名無しさん
16/03/06 00:13:58.16 FS9V5eXL.net
いつまでこのネタをひっぱるんだろう
そんなに話題がないのか?
終わってる言語なのか?
194:デフォルトの名無しさん
16/03/06 00:19:35.66 Brtwb7pX.net
構文解析のオススメ書籍教えてください
195:デフォルトの名無しさん
16/03/06 00:26:27.79 Vcl9wz74.net
namespaceをどう使えばいいかわかりません。
基本的に○○.hのクラスの中で定義して、○○.cppで実装すれば良いのでは?、と考えています。
namespaceを利用する理由は何ですか?
196:片山博文MZ ◆T6xkBnTXz7B0
16/03/06 00:31:44.13 EizY3BRi.net
>>195
他の人が作ったソースを参照するときに名前が衝突しないようにするためだろうね。
197:デフォルトの名無しさん
16/03/06 00:33:35.07 R4Ql0hHb.net
いろんなところからライブラリを持ってきてくっつけてアプリケーションを開発するのに、クラスや関数に名前やシグネチャかぶりがあったらコンパイル通らないじゃないか。
198:デフォルトの名無しさん
16/03/06 00:34:08.24 LHysMdWz.net
>>195
名前だけで個人を識別してくださいって言われたらどう思う?
いやいや苗字もあったほうが識別しやすいよと思うだろ?
そんな時に使うんだよ
199:片山博文MZ ◆T6xkBnTXz7B0
16/03/06 00:50:13.80 EizY3BRi.net
std::shared_ptrとboost::shared_ptrという二種類のshared_ptrがある。
stdとboostという2つのnamespaceにより同時に使っても名前は衝突しない。
また、using std::shared_ptr;のようにしてshared_ptrを切り替えて使うことができる。
200:デフォルトの名無しさん
16/03/06 00:53:06.89 0RQOBmjP.net
同じネームスペースの{}内に属しているクラスや関数同士で
定義の前後関係なく後ろにあるものも参照できるようになるのはいつですか?
いわゆる後方参照?と呼ばれるものだと思うのですが
今でも、同じクラス内に有るクラスやメソッドは記述の前後関係なく参照できますが
同じクラス内に定義が有るものは後方参照が可能な理由は、私が思うに
「同じクラス内に存在している」->「同一コンパイル単位に存在している」
という式が成り立つからだと思うんですよ
C++は分割コンパイルをサポートしている上に、C譲りのヘッダシステムなので
コンパイル単位を跨いで後方参照をするのが無理なのはわかります
そこで、同一クラス内に定義が有るなら必ず同じコンパイル単位に属するのは明白なので
これをもって、後方参照が可能になっているのかと
だったら、同じように同一ネームスペースの{}内に定義が有るクラスや関数も必ず同一コンパイル単位なわけですから
(何故なら{}は必ず対応していなければならないのだから)
後方参照が出来ても問題ないように思うのですが
細かいことを抜きにして、同一コンパイル単位内であれば後方参照が可能になれば良いんですが
部分的には既にできているわけですし
201:片山博文MZ ◆T6xkBnTXz7B0
16/03/06 00:55:01.26 EizY3BRi.net
また、名前空間というまとまりがあることも重要だ。
まとまりがなければ、プロジェクト全体を見ることになって、維持コストがかかる。
202:デフォルトの名無しさん
16/03/06 00:57:14.96 PT9uiEbB.net
>同一ネームスペースの{}内に定義が有るクラスや関数も必ず同一コンパイル単位
え?
203:デフォルトの名無しさん
16/03/06 00:58:30.86 2oASoSJR.net
10年前にPostMessageを使った監視プログラムを発明した奴に
リファレンスも読めずマトモに反論出来なかった低能の自演がまだ続くのか
204:デフォルトの名無しさん
16/03/06 01:05:53.01 2oASoSJR.net
>>187
>文の終端記号
規格のどこを読むとそうなるのかkwsk
205:デフォルトの名無しさん
16/03/06 01:16:52.82 2oASoSJR.net
>>189
>posix環境のツールも使えず
ほうほう、valgrindが一体POSIXの第何章で規定されているのですか?
206:デフォルトの名無しさん
16/03/06 02:17:18.54 tuNXTXW3.net
>>184
いやー>>165で質問者が「入力待ちを利用する」という正しい方法で解決してるのに
しゃしゃり出てきてCTRL-F5などというバッドノウハウを披露するキミの捻れたプライドには到底及ばないよ
207:デフォルトの名無しさん
16/03/06 02:29:09.64 tuNXTXW3.net
よっぽどPostMessageがウケたみたいだけど
今ではWindowsでもLinuxでもメモリリーク検出とかにはInspector(インテル)を使ってるよ
208:デフォルトの名無しさん
16/03/06 04:05:47.59 ChxbUFgQ.net
こいつ本物のヴァカだ
209:デフォルトの名無しさん
16/03/06 04:07:10.17 ChxbUFgQ.net
471 デフォルトの名無しさん[sage] 2016/02/09(火) 08:07:47.87 ID:GGDlYrLi
Windowsでエクスプローラその他殆どのアプリがメモリ不足死んだ状態でも生き残らななきゃ
いけないシステム監視ソフトを書いたことがある俺に言わせるとそれほど難しいことじゃない
Windowsの場合、メモリアロケーションに失敗する前にPostMessageが失敗するようになるから
その辺に対応するのがコツ
210:デフォルトの名無しさん
16/03/06 04:47:19.07 Vcl9wz74.net
>>196->>199
よくわかりました。
ありがとうございます。
211:デフォルトの名無しさん
16/03/06 06:01:58.25 2oASoSJR.net
最初>>167は>>206の考えで言っているのだろうと思っていたら
>>179のレスで少し驚いた
212:デフォルトの名無しさん
16/03/06 06:10:40.49 1plcRuJs.net
他の言語からの移行組ですが正直吐き気が止まりません
この言語は頭おかしいんじゃないんですか?
213:デフォルトの名無しさん
16/03/06 07:52:12.28 r0r1JwnR.net
言語自体が「頭おかしい」かは分からないけど…。
ストラウストラップ先生は頭(の外観が)おかしい。
規格の変化の激しさ(不安定さ)を見ると規格作成者は頭おかしい。
このスレッドの住人も頭おかしい(この発言の投稿者も含む)。
C++の村へようこそ。
214:デフォルトの名無しさん
16/03/06 08:10:32.19 oNsCkDHW.net
C#の自動実装プロパティみたいなの実装される予定ある?
215:デフォルトの名無しさん
16/03/06 08:29:03.39 py9p5YRa.net
>>187
どうもありがとう
enumも通りました
列挙型は列挙子しか代入できない事を理解していませんでした
enum E
{
a, b, c, d
}e;
int main()
{
cout << e << endl; //0
e = a;
cout << e << endl; //0
e = d;
cout << e << endl; //3
e = (E)1;
cout << e << endl; //1
}
配列は調査中です
216:デフォルトの名無しさん
16/03/06 10:32:12.23 tuNXTXW3.net
>>209
お前は粘着根性だけは一級だ。そこだけは褒めてやるよ
ところで、CTRL-F5で「続行するには何かキーを押してださい」
が出てくるかどうかはVSのバージョンによるようだな
例えばVS2010のデフォルトで作ったコンソールアプリプロジェクトじゃそうはならなずにコンソールすぐ消える
まあ、俺はそんなあやふやなものは永遠に使うことはないだろうけど、豆知識として頭の片隅に置いておくよ
何故そういう違いが発生するのかもおかげさまで調べたらすぐに分かったし。ありがと
217:デフォルトの名無しさん
16/03/06 10:43:08.67 hANsEkzf.net
>>216
もういいよ
VSのバージョンによらないよ
VSはCtrl +F5で起動するとサブプロセスとして走らせることができるんだよ
VS2008はサブプロセスとしてコンソールで起動されるのがデフォルトだったが、
2010以降は空のプロジェクトから作るとメインプロセスで走らせるのがデフォルトになった
ただ2010以降もコンソールアプリテンプレートから作ればサブプロセスとして走らせる設定がデフォルトになる
違いの原因を調べたって、一体何をどうやって調べたんだ
218:デフォルトの名無しさん
16/03/06 10:46:38.57 LHysMdWz.net
>>216
NGしたいからコテつけてほしい
219:デフォルトの名無しさん
16/03/06 10:48:49.35 dMKN1oWb.net
はじめまして。質問をさせてください。
dmcで作った32ビットヘルツのオブジェモジュールは
win配下etcと互換性ありすか?
220:デフォルトの名無しさん
16/03/06 10:53:52.53 5DvD/H5K.net
>>213
ハゲハゲ言うなハゲ!
221:デフォルトの名無しさん
16/03/06 11:05:06.45 Z2wdRjzg.net
>>218
むしろ君が自演してないでコテ付けるべき
222:デフォルトの名無しさん
16/03/06 12:15:36.32 uXhlHP6G.net
規格の変化の激しさ?
223:デフォルトの名無しさん
16/03/06 12:41:50.70 ChxbUFgQ.net
痴呆症のようだから、定期的に貼ってやるよ。
471 デフォルトの名無しさん[sage] 2016/02/09(火) 08:07:47.87 ID:GGDlYrLi
Windowsでエクスプローラその他殆どのアプリがメモリ不足死んだ状態でも生き残らななきゃ
いけないシステム監視ソフトを書いたことがある俺に言わせるとそれほど難しいことじゃない
Windowsの場合、メモリアロケーションに失敗する前にPostMessageが失敗するようになるから
その辺に対応するのがコツ
224:デフォルトの名無しさん
16/03/06 12:52:01.64 uNrtakxt.net
おじいちゃん、それもうさっき貼りましたよ
225:デフォルトの名無しさん
16/03/06 13:05:10.37 FS9V5eXL.net
おじいちゃん、それもうさっき貼りましたよ
226:デフォルトの名無しさん
16/03/06 16:30:31.67 MC5mpgnR.net
Windowsのスペシャリストを気取ってVSの使い方も知らないとは情けないな
しかも入力待ちとか本来不要で本末転倒な解決策を改善だと思ってるし
227:デフォルトの名無しさん
16/03/06 16:55:34.96 rlBUJ/rg.net
c++の仕様の拡大は信者のプライドの拡大と比例している。
228:213
16/03/06 17:32:52.89 r0r1JwnR.net
古い書き方がエラーになるわけじゃないから「規格の変化」は不適切だったね。
>>222 を見て「しまった」と思ったけど、他の良い表現が思いつかなかった。
でも >>227 に乗っからせてもらう。「仕様の拡大」がより適切だ。
規格や仕様じゃないけど、推奨される書き方は変化が大きいよね。
数年前のきれいなソースも、すぐに古臭くなる。
…などと知った口を叩けるほどC++の経験は積んでないんだけど。
229:デフォルトの名無しさん
16/03/06 18:16:36.06 o7h42g4R.net
互換性維持のために既存の文法の隙間に新機能を詰め込んでいるような状態だからなぁ。
そのうち維持しきれなくなってOpenGLのようにばっさりやることになるんだろう。
230:デフォルトの名無しさん
16/03/06 18:46:01.70 iWD/4muj.net
具体例
231:デフォルトの名無しさん
16/03/06 18:54:13.36 O4MCW888.net
auto は既存文法の隙間狙いだね
232:デフォルトの名無しさん
16/03/06 20:21:03.80 rlBUJ/rg.net
= 0 で pure virtual とかな。。
素人から見ても馬鹿みたいな構文だわ。
233:デフォルトの名無しさん
16/03/06 21:30:59.08 0RQOBmjP.net
>>223
この発言って、本人は
メモリアロケーションが失敗するより先にPostMessageが失敗するようになって
プログラムでPostMessageを使っていた場合は動作不能になって困るから
その辺に対処しなければならない
ってつもりで書いていると思うんだけど、一部の人は
メモリアロケーションに失敗するより先にPostMessageが失敗するようになるから
メモリ不足のテストに使える
って読み違えているんだよね、わざとかもしれないが
でもそんな究極の生命力のログ取りソフトを作らなきゃならないときに
サブスレッド作ってメインスレッドにデータ渡すときにPostMessage使っている時点でバカなんだがな
234:デフォルトの名無しさん
16/03/06 21:46:56.54 2oASoSJR.net
>メモリ不足のテストに使える
>って読み違えているんだよね
俺もずっとそう思ってたが、よく読み返したら違っていた
コピペ荒らしには何を言っても無駄だろうが
235:デフォルトの名無しさん
16/03/06 23:29:20.12 ChxbUFgQ.net
461 デフォルトの名無しさん[sage] 2016/02/08(月) 22:06:08.66 ID:LnO11qfO
まあ商用でもシミュレーションソフトとか、メモリ不足や設定ミスしたらエラーも出さずに普通にセグフォで落ちる場合があるものも多いけど。
ご丁寧にエラーを出したところでメモリ増やすかメッシュ数減らすと言うのは変わらんわけで。
467 デフォルトの名無しさん[sage] 2016/02/09(火) 04:30:48.06 ID:1CYnHFpe
>>461
世の中にある商用のシミュレーションソフトとやらのほとんどは
おまいらが見たら噴飯物かあるいは卒倒するレベルのコードだと思う
とくに国産ソフトは
470 デフォルトの名無しさん[sage] 2016/02/09(火) 07:58:11.21 ID:sh9Vl//D
>>469
設定ミスでフォルトするのはどうかと思うが、メモリ一不足の対応は難しいな
痴呆症のようだから、定期的に貼ってやるよ。
471 デフォルトの名無しさん[sage] 2016/02/09(火) 08:07:47.87 ID:GGDlYrLi
Windowsでエクスプローラその他殆どのアプリがメモリ不足死んだ状態でも生き残らななきゃ
いけないシステム監視ソフトを書いたことがある俺に言わせるとそれほど難しいことじゃない
Windowsの場合、メモリアロケーションに失敗する前にPostMessageが失敗するようになるから
その辺に対応するのがコツ
236:デフォルトの名無しさん
16/03/06 23:38:50.41 ChxbUFgQ.net
>>233-234
他プロセスがメモリ使い尽した状況でPostMessageが失敗する
という現象が発生するという無能クンの主張
無能クンがPostMessageの失敗に対応したとか関係ない
そのような現象が無能クンの主張どおり発生するなら、それはメモリ状況の観測に利用出来るということだ
無能クンの報告では、簡単に作れるメモリを使い尽くすテストプログラムで再現したそうだし 笑
237:デフォルトの名無しさん
16/03/07 02:22:11.72 rcA1ymXW.net
オツムの弱さは仕方ないが
スレを荒らすのはいただけない
238:デフォルトの名無しさん
16/03/07 04:14:17.45 1EfQqvnH.net
reinterpret_castながったらしい
なるべく使わせない為の配慮なんだろうけど
239:デフォルトの名無しさん
16/03/07 06:54:32.46 HUiylToy.net
>>233
そもそも...
> メモリアロケーションが失敗するより先にPostMessageが失敗するようになって
自体がほんとかなぁ~?
って思われてるし
> その辺に対処しなければならない
そのご自慢の対処方法が GetLastError( ) の確認もせずにリトライするだけ
とかのお笑いレベル
どう見てもたまたまうまく動いてるように見えたからどやってるようにしか見えん
240:デフォルトの名無しさん
16/03/07 10:18:53.31 skfTtER3.net
>>238
読み方が分からないからなるべく使わないようにしてるw
リインタープリットであってるのかな
241:デフォルトの名無しさん
16/03/07 10:22:22.50 TiPYYq0f.net
strlenは?
242:デフォルトの名無しさん
16/03/07 10:37:35.54 VfKbAPeO.net
シュトーレン
243:デフォルトの名無しさん
16/03/07 11:38:42.08 4dTN6Z0P.net
>>238
Yes, but my program depends on the function and works well so far.
244:デフォルトの名無しさん
16/03/07 15:55:29.06 AqI6//Ed.net
reinterpret_cast<int>(x)ってやってることは結局(int)xじゃん。
いっそのこと(int)x使えばいいのに。
245:デフォルトの名無しさん
16/03/07 16:07:40.49 4dTN6Z0P.net
>>244
Never!
246:デフォルトの名無しさん
16/03/07 17:44:56.74 SPuLNVrG.net
>結局(int)xじゃん
reintrepret_castを何だと思っているんだろう
247:デフォルトの名無しさん
16/03/07 18:00:16.97 Ie6AXs1q.net
コンパイルできない…だと?!
248:デフォルトの名無しさん
16/03/07 18:41:28.00 rjj7cXsm.net
void F(std::string&& s)
{
F(s);
}
sは右辺値参照なのにどうしてFに渡せないのですか?
249:デフォルトの名無しさん
16/03/07 18:44:55.35 AwkwjYtb.net
左辺値だから
250:デフォルトの名無しさん
16/03/07 18:47:33.85 vq5fVXSL.net
std::move(s)
251:デフォルトの名無しさん
16/03/07 20:17:57.14 z9gSfyl1.net
右辺値参照は右辺値を参照しているものであってそれ自体は左辺値
252:デフォルトの名無しさん
16/03/07 20:30:48.32 rcA1ymXW.net
まるで、式 []()->auto&&{return 0;}() が左辺値かのような物言いだな
253:デフォルトの名無しさん
16/03/07 21:19:45.32 PJh8eKUi.net
問い
std::string && s = hoge();
sは右辺値か左辺値か
254:デフォルトの名無しさん
16/03/07 22:01:51.49 rcA1ymXW.net
まるで左辺値か右辺値かのどちらかであるような物言いだ
255:デフォルトの名無しさん
16/03/07 22:16:10.78 DhnnCcYX.net
え?左辺値じゃないの?
256:デフォルトの名無しさん
16/03/07 22:19:04.83 be9Auz0b.net
>>253
は?何が言いたいのか意味不明
その式の評価値は真か偽だろ
257:デフォルトの名無しさん
16/03/07 22:19:40.89 be9Auz0b.net
>>253
sはhoge()の戻り値
258:デフォルトの名無しさん
16/03/07 22:21:10.23 addXPaOO.net
真偽値??
259:デフォルトの名無しさん
16/03/07 22:22:18.18 addXPaOO.net
名前がついていて右辺値なんてあったっけ?
ないよな?
260:デフォルトの名無しさん
16/03/07 22:30:41.58 rcA1ymXW.net
スコットメイヤーの本ですら(意図的だが)不正確な説明がしてあるので>>255が騙されるのは仕方ない
規格上はどちらでもない
261:デフォルトの名無しさん
16/03/07 23:33:11.14 DhnnCcYX.net
>>260
どういう解釈になるんです?
この文だけでは未確定ってこと?
262:デフォルトの名無しさん
16/03/07 23:58:07.53 rcA1ymXW.net
>>261
『std::string && s = hoge();』
この『s』は右辺値参照型の変数だが、式ではないので値のカテゴリー(lvalue,xvalue,prvalue)の概念は存在しない
263:262
16/03/08 00:01:44.10 xyKYQJcY.net
auto s2 = s;
のように式として使われて初めて左辺値になる
264:デフォルトの名無しさん
16/03/08 00:12:01.42 xyKYQJcY.net
この例だと右辺値への自動変換が働くからわかりづらいな
「f ( s ) に含まれる式sは、型が右辺値参照型で値のカテゴリーは左辺値」
と言った方がいいだろうか
265:デフォルトの名無しさん
16/03/08 00:13:06.20 A6lTQmi7.net
>>262-263
なるほど、確かにここだけではどれかとは言えないですね。
勉強になりました。ありがとうございます。
266:デフォルトの名無しさん
16/03/08 07:10:35.81 jeIx1SXX.net
細かいこと言ってるとハゲるぞ
267:デフォルトの名無しさん
16/03/08 07:58:44.45 s5rIDaCh.net
C++界隈ではハゲは弱点にならない、と思う。
規格でどう決まってるかは知らないけど。
268:デフォルトの名無しさん
16/03/08 19:34:59.52 0k5HNdyV.net
C++でハゲが弱点になるかどうか
厳格に規格で決まっていたら
ハゲ病的すぎるだろ
269:デフォルトの名無しさん
16/03/08 21:55:31.91 A6lTQmi7.net
C++マスコットの頭部が薄いのは、禿げ上がる程の高速動作を表現しています。
こうした考えられた仕様と設計を、一般の価値観で弱点と批判するのは論点がずれていますね。
270:デフォルトの名無しさん
16/03/08 21:56:39.84 Q4atenOx.net
ズレてるのはお前のズラだろ
271:デフォルトの名無しさん
16/03/08 22:06:57.27 A6lTQmi7.net
お前今俺のことハゲって言ったか?
272:デフォルトの名無しさん
16/03/08 22:12:40.09 OMUEfTHQ.net
そんなこと言ってないハゲ
気のせいハゲ
これはただの語尾だハゲ
273:デフォルトの名無しさん
16/03/08 22:34:06.49 +4p1BEPZ.net
言っとくけどハゲと坊主は違うからな
274:デフォルトの名無しさん
16/03/08 23:26:46.03 40zCAszT.net
>>200
namespaceは同じ翻訳単位とは限らないお。
275:デフォルトの名無しさん
16/03/09 00:01:35.54 gceSYQgA.net
同じネームスペースは必ず同じコンパイル単位だとは限らないけど
同じネームスペースの{}で囲われた部分は同じコンパイル単位になるだろ
さもなくば、}が無いです、ってコンパイラに怒られる
同じコンパイル単位で、{}は必ず対になってなきゃダメだからね
だからネームスペースどうこうってより、その後ろの{}こそが重要なんだよ
{}に囲われた部分は必ず同じコンパイル単位になるから
本当なら前方参照は可能なはず
今は同じクラス内に有るもののみ前方参照が可能だが
これはクラス定義内は{}で守られていて必ず同じコンパイル単位になることが保証されているからだとも考えられ
同じ理屈でネームスペースにも拡張しても良いはず
もっと単純に、同じコンパイル単位であれば、前方参照が可能としても良いと思うがね
今のクラス内のみ前方参照が可能とかという、中途半端な仕様は意味が分からないね
文法的に出来るんならやれよ、他の今風の言語は大体可能だぞ
C#なんか、コンパイル単位を飛び越えて前方参照が可能なように
並行してコンパイルするって聞いたことあるぞ、本当かどうかは知らんがな
未定義なシンボルに出会ったら、一旦中断して、別のファイルをコンパイルするって感じかね
全く本当かどうかは知らないし、適当だが、C++にそこまでの要求はしない
ただ、同じコンパイル単位であれば前方参照できても良いだろってだけの話
276:デフォルトの名無しさん
16/03/09 00:52:56.35 gceSYQgA.net
極端な話、今のC++でもソースコード全体を適当なダミークラスで囲ってやれば
前方参照し放題の、順番なんか気にしない状態になるわけで(←実際には多少の制約はあるが)
既に、そういうことが現実に可能な状態なわけだから
同じコンパイル単位で前方参照を可能にすることは技術的に然程難しいことではないはずなんだよね
277:デフォルトの名無しさん
16/03/09 00:53:35.71 R7oQ7N64.net
必要ないからだろ。
クラスのメンバ関数は前方宣言できないかわりに前方参照できるようにしてるだけで。
278:デフォルトの名無しさん
16/03/09 01:02:25.39 gceSYQgA.net
//test.hpp
class name
{
void method(); //←コレ
};
これがメンバ関数の実質的な前方宣言だろ
実体の方はcppファイルにあるんだからな
だから、C++的には、たとえクラス内の前方参照が出来なかったとしても、一応成り立つんだよ
なのに、クラス内に関してだけは、利便性のために前方参照が可能となっている
だったら、利便性のために、同じコンパイル単位内であれば前方参照可能としても良いだろ
279:デフォルトの名無しさん
16/03/09 01:22:01.07 gceSYQgA.net
つまりは、もし仮にC++がクラス内で前方参照が出来なかったとしたら
クラス内で何か相互参照しているような場合は
必ずクラス定義とメンバ関数の実体は分けて定義してください、ってことになるわけだが
実際それで問題ないし、C++erには日常茶飯事にすら感じる話だが
これが面倒だからクラス内に関しては特別に前方参照を可能としたわけでしょ
でも、「相互参照している場合はクラス定義とメンバ関数の実体は分けて書いてください」
は、クラス内だけじゃなくて、C++の彼方此方に頻出するわけで
クラス内の相互参照問題だけ特別扱いする意味が良くわからないんだよね
技術的に可能な範囲で考えると、同じコンパイル単位なら前方参照可能だろう
280:デフォルトの名無しさん
16/03/09 01:46:28.08 gceSYQgA.net
俺もね、C++が全く前方参照を許していないのだったら諦めもつくよ
むしろ清いとすら思う
でもクラス内だけは特別に前方参照可能なんだよ
もしクラス内の前方参照が出来なくても言語としては成り立つにも拘わらずだよ?
もし出来なくても、クラス内で相互参照が発生した場合は、クラス定義とメンバ変数の実体を分けて書けって話で
これはC++では日常だろ?仮にクラス内の前方参照が出来無くてもC++的には普通のこと、むしろ自然
でも何故かクラス内だけ前方参照可能なんだよな
同じクラス内に有れば、変数もクラスも関数も、前方参照可能なんだよ
実際、ダミーのクラスでコードを囲めば、クラスだろうが変数だろうが関数だろうが
前方参照し放題って書き方も可能で、一つのテクニック
それが可能なのだから、技術的には同じコンパイル単位であれば前方参照可能に出来る筈なんだよ
281:デフォルトの名無しさん
16/03/09 02:13:30.73 gceSYQgA.net
訂正
クラス定義とメンバ「変数」の実体
↓
クラス定義とメンバ「関数」の実体
282:デフォルトの名無しさん
16/03/09 04:38:36.51 XYqbGPFP.net
確かにクラスでforward-declarationがいらないが為にめちゃくちゃ解りにくいソース書いて来る奴らにイライラするときがあるな
283:デフォルトの名無しさん
16/03/09 06:24:16.72 PsUKAneX.net
ぼくのかんがえたさいきょうのしーぷらすぷらす
の独演会は終わった?
284:デフォルトの名無しさん
16/03/09 11:50:49.57 WF7rFyWl.net
「利便性を向上させる機能が一部既に存在しているのだから適用範囲を拡大すべき」
そんなにおかしな意見ではないと思うが
どこの世界にも「改善」を否定する283のような残念な人間は居るものだ
285:デフォルトの名無しさん
16/03/09 11:55:58.57 c8zeaZJl.net
別に改善を否定してるとは限らないだろ?
単に長文を否定してるだけかもしれない
286:デフォルトの名無しさん
16/03/09 12:05:50.76 1UcnLTLP.net
こんな所で吠えてても実装なんてされないよ?
287:デフォルトの名無しさん
16/03/09 14:02:39.92 VjFIrQgn.net
反響があれば実装はされるだろ。
288:デフォルトの名無しさん
16/03/09 14:25:54.39 WCvUs0lb.net
まあ長文はいらないよね。
別に大したこと言ってないんだから1レスで短く説明すればいい。
289:デフォルトの名無しさん
16/03/09 14:26:38.30 3jrP1VBb.net
反響があるくらいならとっくにC++なんて廃れてるよ
290:デフォルトの名無しさん
16/03/09 15:12:18.63 lSGTJ8xS.net
対偶を取ると、
「C++が廃れてないなら反響はなかった」
291:デフォルトの名無しさん
16/03/09 17:36:52.78 lHuhk1uY.net
ADL周りの仕様が今以上に訳ワカメになるからダメだろう。
クラスと違って名前空間は後でいくらでも弄れるのだから、コード書く人間がどれが呼ばれるか今以上に予測が難しくなる。
292:デフォルトの名無しさん
16/03/09 19:25:22.04 8DyMxRve.net
>>284
そう言うのがそれしかないとでも思ってるのか?
例えば inner class がどうあがいても前方参照できないことについてはどう思ってるんだい?
自分のことしか考えてなさそうだから
ぼくのかんがえたさいきょうのしーぷらすぷらす
って書かれるんだよ
293:デフォルトの名無しさん
16/03/09 21:19:55.72 gceSYQgA.net
>例えば inner class がどうあがいても前方参照できない
struct outer
{
struct inner_a
{
void method(){ inner_b::method(); }
};
struct inner_b
{
static void method(){};
};
};
普通にinner_a内からinner_bを使えますが、いったい何のことを言っているんですか?
コンパイルもちゃんと通りますよ
294:デフォルトの名無しさん
16/03/09 21:30:15.59 EHNG1aVZ.net
それはVSだからとかいうのがあったりする
295:デフォルトの名無しさん
16/03/09 21:35:08.09 PsUKAneX.net
>>293
> いったい何のことを言っているんですか?
それはこっちの台詞だよ...
inner class 前方参照
あたりでググってから出直してこい
296:デフォルトの名無しさん
16/03/09 21:37:16.35 gceSYQgA.net
そうなの?
297:デフォルトの名無しさん
16/03/09 21:39:49.11 gceSYQgA.net
>>295
だったら、インナークラスの前方宣言が出来ないって書くべきで
「inner class がどうあがいても前方"参照"できない」
って書くのはおかしくないですか?そっちのミスでしょ
298:デフォルトの名無しさん
16/03/09 21:53:21.58 gceSYQgA.net
VSだけかもしれないけど、こんな複雑なコードもちゃんとコンパイルできる
struct outer
{
void method()
{
inner_a().method();
auto obj = new inner_b::inner_inner;
obj->method();
obj->value = inner_b::inner_inner::enum_::e;
}
struct inner_a
{
void method()
{
inner_b::inner_inner().method();
}
};
struct inner_b
{
struct inner_inner
{
enum struct enum_{ e, };
enum_ value;
void method(){}
};
};
};
一旦クラスで囲んでしまえば、こんな入り組んでいても、何事もなかったかのように前方参照が出来てしまう
C++を同一コンパイル単位内で前方参照を可能とすることに、文法的な隔たりや、技術的ハードルは無いという事だね
299:デフォルトの名無しさん
16/03/09 21:56:46.43 WCvUs0lb.net
まだ荒らし足りないのか
300:デフォルトの名無しさん
16/03/09 21:57:25.47 PsUKAneX.net
>>297
> 「inner class がどうあがいても前方"参照"できない」
> って書くのはおかしくないですか?
メソッドではなく inner "クラス" の前方参照ができるようになってから出直してこいよ
301:デフォルトの名無しさん
16/03/09 22:05:10.18 WCvUs0lb.net
>>300
いやお前も何言ってるんだよ・・・。
302:デフォルトの名無しさん
16/03/09 22:09:47.23 WF7rFyWl.net
>>292
「クラススコープでできていることと同等のことを一つの名前空間定義のなかでもしたい」
というID:gceSYQgAの話と関係無いことを言い出す理由が不明。
唐突に根拠も無く「自分のことしか考えてなさそう」とか言い出すあたり、
知覚障害か何か?
303:デフォルトの名無しさん
16/03/09 22:10:12.26 jX68pRI9.net
この手の議論のためだけに無駄に頑張る人が多いのがc++ってイメージ。
304:デフォルトの名無しさん
16/03/09 22:13:56.70 gceSYQgA.net
>>300
struct outer
{
void method(){ inner_b obj; //←これ }
struct inner_a
{
void method()
{
inner_b obj; //←これ
}
};
struct inner_b{ };
};
VSだけかもしれないけど、インナークラスの前方参照は出来ますよ、ただし、メソッド内ではね
struct outer{ inner *ptr; inner{}; };
って書けない話だろうけど
struct outer{ struct inner; inner *ptr: struct inner{}; };
って前方宣言してあげれば良いだけで、大した手間ではない
同一コンパイル単位で前方参照できるといっても、例外は有って構わないわけで
struct hogehoge; と書くことぐらいの手間は全くの程度問題
305:デフォルトの名無しさん
16/03/09 22:23:03.30 gceSYQgA.net
何事にも例外が有ってよいと思うわけです、ハイ
完ぺき主義者ではないので
仮に
「インナークラスの型のポインタ変数を前方参照っぽく定義より先に使って宣言したいときは
struct hogehoge; と事前に前方宣言しなければならない」
というルールが有ったとしても、この程度は何の手間でもないから問題ないですね
306:デフォルトの名無しさん
16/03/09 22:24:08.59 gceSYQgA.net
あーこれ間違ったわ
struct outer{ inner *ptr; inner{}; };
↓
struct outer{ inner *ptr; struct inner{}; };
struct が抜けてたわ
307:デフォルトの名無しさん
16/03/09 22:25:04.02 WCvUs0lb.net
>>305
それならそのまま使えばいいじゃないの。
何に不満があるんだよ。
308:デフォルトの名無しさん
16/03/09 22:25:25.73 eOjuPS6Y.net
int main()
{
struct A{ A(){} };
struct B{ A a; int x; };
B b = B();
printf( "%d\n", b.x );
309:デフォルトの名無しさん
16/03/09 22:26:12.04 eOjuPS6Y.net
b.xがvc2015だと0なのに2012、2013だと不定値になります。何故でしょうか。
310:デフォルトの名無しさん
16/03/09 22:28:49.66 lHuhk1uY.net
不定なのが偶々0なだけ
311:デフォルトの名無しさん
16/03/09 22:30:44.15 av11/7D/.net
初期化されてないから
312:デフォルトの名無しさん
16/03/09 22:32:19.48 WCvUs0lb.net
>>309
0が正しいと思う。MSのバグじゃないの?
313:デフォルトの名無しさん
16/03/09 22:34:09.23 +X5y9V0s.net
>>309
0が正しい。
314:デフォルトの名無しさん
16/03/09 22:35:46.14 +X5y9V0s.net
なので、VC++のバグに1票。
315:デフォルトの名無しさん
16/03/09 22:37:39.69 PsUKAneX.net
>>302
できるからやればいいじゃん
って言うのは ID:gceSYQgA が言ってること以外にも色々ある
ってまで説明しないとわからんの?
主張するのは勝手だけど、長々やるほどじゃねーだろ
って言われてるだろ
316:デフォルトの名無しさん
16/03/09 22:41:03.03 WCvUs0lb.net
ごめん血迷ってた。default-intializedだね。
317:デフォルトの名無しさん
16/03/09 22:43:46.61 +X5y9V0s.net
>>316
zero initializeでは?
318:デフォルトの名無しさん
16/03/09 22:46:47.91 lHuhk1uY.net
いやPODだから不定値だろ
319:デフォルトの名無しさん
16/03/09 22:48:02.12 WF7rFyWl.net
PODだと不定値
などという仕様がどこから出てきたのか
320:デフォルトの名無しさん
16/03/09 22:49:51.34 +X5y9V0s.net
>>318
だからゼロ初期化という仕様なんだって。
321:デフォルトの名無しさん
16/03/09 23:01:30.54 WF7rFyWl.net
ついでに、PODがあるようには見えない
322:デフォルトの名無しさん
16/03/09 23:05:53.89 WCvUs0lb.net
逆、非PODだから不定値。
自分はPODのカッコ付きと勘違いした。
323:デフォルトの名無しさん
16/03/09 23:10:57.26 WF7rFyWl.net
ここまで、>>309の炎上学習法若しくは確認間違いという指摘無し
324:デフォルトの名無しさん
16/03/10 01:14:31.68 lKwsVgJC.net
という>>323 の炎上学習法に見えるね
自分で確認するのが面倒だからって
325:デフォルトの名無しさん
16/03/10 01:44:57.86 eUGHchpD.net
0になったり他の値になったりするのは、偶々だね。
12.6.5のサンプル
struct C {
C(){}
A a;
const B b;
int i;
int j = 5;
};
// initializes members as follows:
// OK: calls A::A()
// error: B has no default constructor
// OK: i has indeterminate value
// OK: j has the value 5
規格書読めない初心者は発言しないように。
326:デフォルトの名無しさん
16/03/10 01:58:57.97 8KJ6+/BF.net
>>325
話を読めない人は発言してもいいんですか?
327:デフォルトの名無しさん
16/03/10 02:32:53.57 mfhQ4lhr.net
>>325
お前さーC++14の規格票を持ってることだけが自慢なんだろ
俺も持ってるからお前の間違い突っ込んでやるよ
328:デフォルトの名無しさん
16/03/10 02:47:23.86 eUGHchpD.net
タダで入手できるもの持ってると自慢できるのか?
じゃ、自慢しよう
どうだ、まいったか
329:デフォルトの名無しさん
16/03/10 03:23:13.76 mfhQ4lhr.net
>>328
タダだと?どこで無料で入手出来るというんだ
お前もしかしてタダで入手したのか?
330:デフォルトの名無しさん
16/03/10 03:41:17.30 mxNsUMFn.net
>>308-309
B() で B 型のオブジェクトが値初期化 "value initialize" される。 (8.5 p11)
B はユーザー定義のデフォルトコンストラクタを持たないクラス型なので、値初期化のプロセスとして
まずゼロ初期化 "zero initialize" され、そのあとデフォルト初期化 "default initialize" される。 (8.5 p8 bullet-2)
int 型の B::x がゼロ初期化されると値 0 になる。 (8.5 p6 bullet-1)
そのあと B::x がデフォルト初期化されるが、 int 型なので何も行われず 0 のまま。 (8.5 p7 bullet-3)
と言う感じで、 C++14 の規格に従うと 0 になる。
C++03 以降だと経路が多少違うものの同じ結果になるけど、古の C++98 では B::x は不定となってしまっていた。
URLリンク(www.open-std.org)
MSDN 見る限りだと 2013 で value initialize に対応してそうなんで、 2013 で不定ならバグかな。
URLリンク(msdn.microsoft.com)
URLリンク(msdn.microsoft.com)
331:デフォルトの名無しさん
16/03/10 10:36:48.16 OLUNjZSr.net
>>330
この仕様ってポインタに対しても有効?
以前似たような質問が議論されてたんだけど。
スレリンク(tech板:184番)
332:デフォルトの名無しさん
16/03/10 11:13:34.09 l944yzKo.net
330じゃないけどポインタもscalar typeだから同じくゼロ初期化でしょ
でもvalue initializeルールに依存するようなクラスは書くべきじゃないなあ
スレリンク(tech板:184番)
をNode node;ってやっちゃったらやっぱりnode.nodeは不定だよ
こんなコードは書かずにちゃんとコンストラクタを書いて明示的にnullptrで初期化しなくちゃいかん
333:デフォルトの名無しさん
16/03/10 11:23:42.71 mBEuB6ly.net
デストラクター作ってPODを諦めてるのに、適切に初期化するコンストラクター無いとか
ただのバグでしかない
334:デフォルトの名無しさん
16/03/10 11:46:11.58 xbWf2tod.net
やっぱりvc2012でも2013でもxはゼロで初期化されません
バグですか
gccではゼロになります
335:デフォルトの名無しさん
16/03/10 13:35:05.45 l944yzKo.net
バグだね
>>308のBはxの初期値が重要ならこれもバグ
336:デフォルトの名無しさん
16/03/10 18:43:26.84 uK8a0ubO.net
VCの規格無視はいつもの事らしいから気にすんな
337:デフォルトの名無しさん
16/03/10 20:58:27.62 l944yzKo.net
調べたらこのバグは2012年6月にはもう報告されているね
URLリンク(connect.microsoft.com)
VC++ 2015 RCでやっと直ったらしい
338:デフォルトの名無しさん
16/03/10 21:21:03.49 wKO6hiHF.net
そもそもが、int()で0だなんて馬鹿げたルールができたばっかりに...
339:デフォルトの名無しさん
16/03/10 21:38:31.66 kxB40Mc+.net
マイクロソフト「C++11対応は2015 Update 2から本気出す」
340:デフォルトの名無しさん
16/03/10 22:09:45.41 1z8FCjXU.net
>>331
有効
using P = int *;
P p{};
はp==nullptrになる
341:デフォルトの名無しさん
16/03/10 22:59:23.79 XIXQ4NCN.net
変数の初期値がどうなるかというだけの話でこんな議論になるのはC++ぐらいだろうなぁ。
342:デフォルトの名無しさん
16/03/11 11:55:53.38 +X87dz7B.net
値か0の初期化を当たり前にし、初期化なしを例外記述にする方向性なのだろう。
今のところ(バグがあるので)値初期化を信じず、
未初期化を前提に書けと言うのは、ある意味正しいのかもしれないが、
考え方としては逆行しているね。
343:デフォルトの名無しさん
16/03/11 12:52:11.72 Y6ECzuws.net
ある意味正しいじゃなくてパフォーマンスを考慮すると未初期化がデフォなのはC++としては完全に正しいんだよ
0初期化がデフォになってしまったらCを継承したC++の利点が薄れてしまう
value initializationこそがC++の思想に逆行してると思う
344:デフォルトの名無しさん
16/03/11 13:05:18.46 kWA4jyXp.net
>>308
そもそも非POD型をメンバーに持つPOD型は非POD型になるだろ。
>URLリンク(cpplover.blogspot.jp)
>さらに、非PODな非staticデータメンバーを持たないこと。
345:デフォルトの名無しさん
16/03/11 13:10:43.94 vYMpLkUm.net
コンストラクタの強制なんかを見ると、
うっかり未初期化の値を使うことによる不具合を防ぐって
言語思想も含まれてるでしょ。
となると、単純な値にも何らかの初期値が保証される方向性もアリかと。
初期値は保証されるが、そのことによるパフォーマンス上のペナルティがない、
プログラマが初期化すればデフォルト初期値の処理は発生しない、
という仕様なら八方丸くおさまると思ったり。
346:デフォルトの名無しさん
16/03/11 13:12:37.67 +X87dz7B.net
>>343
正しいなら実装側でstack protectorなんてデフォルトにならないよ。
現状もパフォーマンスが欲しいときだけ別にするというのが基本だ。
347:デフォルトの名無しさん
16/03/11 13:13:39.58 2/u08KSA.net
基本強制初期化で
int a = noinit;
みたいにしたら初期化しない方式で
348:デフォルトの名無しさん
16/03/11 13:21:02.38 zH9xDiQd.net
デフォは未初期化で記述方法によっては初期化もしてくれるって方針だろ。
その記述方法が紛らわしいのと、規格通り実装しないのがメジャーなコンパイラの1つなのが問題
もう少し分かりやすい記述なら良いのに、現状だとデフォルトconstructorが呼ばれているようにしか見えない。
349:デフォルトの名無しさん
16/03/11 14:21:15.08 49om0mRF.net
>>347
Dでは
int i = void; // デフォルトの初期値を省く
コンパイラのオプションで従来動作も選べればすぐ導入可能だと思うがね
350:デフォルトの名無しさん
16/03/11 15:25:46.64 dykTweBs.net
>>349
だからどうしたって話
int i{0}; とタイプすることもできないのか
351:デフォルトの名無しさん
16/03/11 15:35:13.63 kWA4jyXp.net
int i(); でもいいよ。
352:デフォルトの名無しさん
16/03/11 15:36:56.24 kuBG6faz.net
int i = 0;
while(std::cin >> i) std::cout << i;
こんな馬鹿っぽい初期化いらんし邪魔だ
353:デフォルトの名無しさん
16/03/11 18:27:14.35 0EDCO8WT.net
>>351
ウソを書くな
354:デフォルトの名無しさん
16/03/11 22:49:53.55 YlUxysAB.net
>>351
それは関数宣言だと何度
355:デフォルトの名無しさん
16/03/11 22:52:02.91 RA7SR1be.net
お前ら一体 何を言ってるんだ
356:デフォルトの名無しさん
16/03/11 22:56:28.69 YlUxysAB.net
>>344
その通りだけど、ゼロ初期化とは何の関係も無い件
357:デフォルトの名無しさん
16/03/11 23:02:09.89 4G2Dcq4h.net
15年C++書いてきて
別案件でC#と数ヶ月戯れたけど
C++はやっぱり変態だと感じたわ
良くも悪くも
358:デフォルトの名無しさん
16/03/11 23:09:07.85 RA7SR1be.net
C++はぐちゃぐちゃ汚いよね
359:デフォルトの名無しさん
16/03/11 23:30:50.24 RoKMXwVB.net
それは綺麗なC++コーダに出会ってない坊やだからさ
360:デフォルトの名無しさん
16/03/11 23:31:51.83 +X87dz7B.net
またハゲの話してる…。
361:デフォルトの名無しさん
16/03/11 23:33:00.33 RA7SR1be.net
いや書き方の問題じゃなくて言語仕様自体の問題なんd
362:デフォルトの名無しさん
16/03/11 23:35:30.87 a6R8C1/e.net
C++はヘンタイだし、クソ言語だと思うけど、
大好き
363:デフォルトの名無しさん
16/03/11 23:36:37.63 +X87dz7B.net
あなたの落とした物はこのC++CLIですか?それともこのJ#ですか?
364:デフォルトの名無しさん
16/03/11 23:37:36.54 RA7SR1be.net
言語体系や構文ではC#が上だが、玄人好みなのはC++
365:デフォルトの名無しさん
16/03/11 23:43:00.34 +X87dz7B.net
ヘンタイな玄人好みって、まるで素人童貞みたいな言い草だな。
366:デフォルトの名無しさん
16/03/11 23:44:29.48 RA7SR1be.net
すまんわかるようでわからん
367:デフォルトの名無しさん
16/03/11 23:53:03.42 YlUxysAB.net
お前ら一体 何を言ってるんだ
368:デフォルトの名無しさん
16/03/11 23:54:21.02 RA7SR1be.net
ほんとだよ全く
369:デフォルトの名無しさん
16/03/12 00:03:43.97 z2WBnFu0.net
でもそれがc++なんだよね。
370:デフォルトの名無しさん
16/03/12 00:35:06.18 FH3bqKTZ.net
こういうことをC++でやるにはあの機能ではダメでこの機能を使ったこの設計でなければならない
っていう無知と思い込みから汚いコード書いて無駄に苦労してる人は珍しくないぞ
371:デフォルトの名無しさん
16/03/12 01:39:29.17 Zbyfy48z.net
自分だけはキレイなコードかいてるという前提
372:デフォルトの名無しさん
16/03/12 01:43:01.42 Pl4Qm8o2.net
データ構造を隠蔽したままinterfaceを隔離する方法ってありませんか?
class IContainer {
};
class Ifold {
virtual do(IContainer& container) const = 0;
};
class VectorContainer : public IContainer {
private:
std::vector<double> container_;
};
みたいな感じでIfoldのインターフェースはコンテナに依存しないようにしたいです。
visitorパターンにするとIContainerに、Ifoldの具象クラスのacceptメソッドが増えていくのが…。
何かうまい実装はありませんでしょうか?
373:デフォルトの名無しさん
16/03/12 02:13:17.49 VClvi+pB.net
言っている意味が全然わからない。
Ifoldの具象型がIContanerの具象データに依存してるって事?
上位型だけでやりとりしたいなら、IfoldかIContainerどっちでも良いが、
具象型の中でダウンキャストでもすればいいだろ。
374:デフォルトの名無しさん
16/03/12 02:16:35.39 VClvi+pB.net
もし外でvisit/accept可能か確認したいなら、
bool supports(IContainer&) (またはIfold&)とか付ける。
それ以外思いつかないが、そういうことじゃない?
375:デフォルトの名無しさん
16/03/12 02:18:19.39 Pl4Qm8o2.net
>>373
Ifoldの具象型がIContainerの具象型が中で持ってるデータ構造に依存するのはOKです
ダウンキャストというと、どのように行えばいいですか?
インターフェースクラスからは具象クラスがわからないため何にダウンキャストすればいいか決定できません…
376:デフォルトの名無しさん
16/03/12 02:19:31.10 Pl4Qm8o2.net
>>374
すみません、具体的にどのような実装になるかイメージができません…
377:デフォルトの名無しさん
16/03/12 02:21:31.37 VClvi+pB.net
>>375-376
いまいち要領を得ないが、具象クラスにdo(IContainer& x);を実装、
中でIContainerからVectorContainerなどにキャストすれば良いんじゃないのか?
これ以上は何がしたいのかよくわからないから何とも言えん。
378:デフォルトの名無しさん
16/03/12 02:42:31.41 VClvi+pB.net
もしかしてIfoldではなく、その具象クラスすら、
受け取るべき具象コンテナが決まってないって事か?
それもう設計破綻してるから無理だろ。
そうではなく特定型にキャスト可能かわからないってだけなら、
自分でID付けてis_a(int id)とか実装して調べるか、dynamic_cast。
379:デフォルトの名無しさん
16/03/12 02:51:53.53 9NhLr4qt.net
>>372
class IContainer {
virtual double& at(int index)=0;
virtual void push_back(double& v)=0;
};
380:デフォルトの名無しさん
16/03/12 09:19:37.98 Vp+P3H45.net
>>372
std::accumulateみたいなことがしたいように見受けられるけどそうかね?
381:デフォルトの名無しさん
16/03/12 09:54:48.36 fbT4KBM6.net
std::stack<T, C>を
IContainerを受け取るIStackに魔界造したイメージだろうきっと
382:デフォルトの名無しさん
16/03/12 11:36:06.87 oS3fCNyN.net
欲しいのは単にiteratorじゃね?
visitorはfoldの仕方が変わるからaccept必要でしょ?
383:デフォルトの名無しさん
16/03/12 13:19:48.43 VClvi+pB.net
てっきりテンプレート無しに異なる数値型を扱いたいって事かと思ってたよ。
テンプレート使うならStrategyだけで済んじゃうし。
384:デフォルトの名無しさん
16/03/14 22:12:09.15 bYJAKtH4.net
結局何だったんだ…?
385:デフォルトの名無しさん
16/03/15 18:46:33.79 7F6lH4i+.net
すみません、visitorパターンを使うとacceptを持つインターフェースクラス(ライブラリコード)が、
具象クラスであるvisitor(ユーザーコード)に依存してしまうという問題を解決したかったのですが、いまいち伝わらなかったみたいです。
>>378
型タグによるダウンキャストは、メンテの観点から採用できません...
>>382
自分がなにを抽象化したいのか再考するきっかけになりました。
ありがとうございました。
結局visitorを内部のコンテナ型に依存するインターフェースクラスとすることで解決しました。
実際にはIVectorContainerとかIListContainerのような形にしました。
正確にはvalue_typeは決まってたのでテンプレートテンプレートパラメータを使いました。
386:デフォルトの名無しさん
16/03/15 20:37:53.71 drELySke.net
それだとデータ別にインターフェースできるから統一できないんじゃないの。
ダウンキャストの方が見えてる分まだマシかと。
387:デフォルトの名無しさん
16/03/15 20:46:48.46 7F6lH4i+.net
>>386
ダウンキャストだとコンテナ型が増えるたびにif文を追加しなくてはならず、
しかも追加し忘れてもコンパイル時にエラーが出ないので…
388:デフォルトの名無しさん
16/03/15 20:51:40.14 drELySke.net
>>387
またわけわからん事言っとるね君。
テンプレートだろうが、結局特定のコンテナのインターフェースに依存するだから、
その部分は場合分けしなきゃならんでしょ。
389:デフォルトの名無しさん
16/03/15 20:54:05.87 7F6lH4i+.net
>>388
いや、それはaccept側のオーバーライドで解決します
これがvisitorパターンの一般的な実装かと思いますが、どこがわかりませんか?
390:デフォルトの名無しさん
16/03/15 21:12:36.21 drELySke.net
>>389
うむわけわからんよ。
どうやってacceptのオーバーライドで別種のvisitorを分ける?
そもそもテンプレート型に仮想関数付ける形こそ始末が悪くメンテしにくいのだから、
それならいっそインターフェースも消して、
テンプレートの構造的部分型だけで十分だと思うんだが。
391:デフォルトの名無しさん
16/03/15 21:13:54.39 7F6lH4i+.net
>>390
家に帰ったら実装書きます
392:デフォルトの名無しさん
16/03/15 22:59:29.47 7F6lH4i+.net
>>390
こういうことです
URLリンク(ideone.com)
これダウンキャストで実装すると、acceptを一つにまとめてif文で一つずつキャストを試すわけですよね?
その場合ConcreteXxxContainerがひとつ増えるとacceptを修正し忘れてもコンパイルが通ってしまって困ります
393:デフォルトの名無しさん
16/03/15 23:00:15.31 18/5NGhU.net
visitorクラスの基底クラスをライブラリ側が提供すれば良いのでは?
394:デフォルトの名無しさん
16/03/15 23:01:00.99 7F6lH4i+.net
>>393
という風にしました
395:デフォルトの名無しさん
16/03/15 23:04:19.56 z48QWO4Q.net
ダウンキャストとか言ってるアホはやばいだろ
コード書かせちゃダメなレベル
396:デフォルトの名無しさん
16/03/15 23:11:15.71 18/5NGhU.net
>>394
申し訳
397:デフォルトの名無しさん
16/03/15 23:48:10.07 L3nufqEx.net
結局具体的に何をやりたいのか分からんな
そもそもVisitorパターンが本当に適切なのか?
Visitorパターンみたいな汚くなりがちなものはなるべく避けるべきだと思うが
398:デフォルトの名無しさん
16/03/16 06:31:57.64 +XU07v9B.net
>>392
なんだオーバーライドじゃなくてオーバーロードじゃないの。
静的なのがいいなら構造部分型や標準コンテナの模倣で十分だろう。
そこまでしてインターフェースとVisitorに拘る理由は何?
>>395
dynamic_castなら危険でも何でもない。
そうやってダウンキャストを危険危険と、
いちいち大げさに騒ぎ立てる方がアホというか初心者だな。
実際OOPなら多くの場所で使われてるし、設計が簡単になるなら使っても良いんだよ。
399:デフォルトの名無しさん
16/03/16 06:42:44.25 +XU07v9B.net
そんなに静的なチェックが重要と言うなら、オーバーロードもやめとけ。
それぞれ別の名前にしたほうがより安全確実だからね。馬鹿みたいだけど。
400:デフォルトの名無しさん
16/03/16 07:47:22.56 Jbc4KVVa.net
そんなに言うならコード提示すればいいのに
401:デフォルトの名無しさん
16/03/16 11:05:22.41 9QBMlTeC.net
> ダウンキャストとか言ってるアホはやばい
> そうやってダウンキャストを危険危険と
個人的には「ダウンキャスト」っていう用語自体がアホ
アップ/ダウンの概念を不用意に持ち込んだ初心者ワードだと思う
暗黙の型変換(implicit conversion)
キャスト演算[明示的な型変換(explicit conversion)
後者を単にキャストと呼ぶのがC/C++の文化
402:デフォルトの名無しさん
16/03/16 12:20:06.84 hEm8Gz+A.net
>>401
お前のルールをさも普遍的なものであるかのように語られても
403:デフォルトの名無しさん
16/03/16 15:13:44.46 YWKSC+YR.net
参照を返す関数は戻り値の一時オブジェクトは作成されないのですか