【初心者歓迎】C/C++室 Ver.90【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.90【環境依存OK】 - 暇つぶし2ch200:デフォルトの名無しさん
14/04/07 11:35:54.05 uM+gajuN
>>197
SYSTEMTIMEの起点は1601年1月1日0時0分0秒
つまり、ゼロをSYSTEMTIMEとして解釈すると「1601/01/01 0:00:00」になる

201:デフォルトの名無しさん
14/04/07 13:13:30.33 8ZhLD5KA
どうでもいいけど、>199は説明が下手だな。

202:片山博文MZジェバンニ ◆T6xkBnTXz7B0
14/04/07 14:25:12.80 nfj7Xkns
SystemTimeToFileTimeを使ってSYSTEMTIMEをFILETIMEに変換して、
ULARGE_INTEGERを使って64ビット整数に変換して、引き算をする。

203:デフォルトの名無しさん
14/04/07 15:40:44.16 4PSeJxmH
時刻と時間の違いが分かってないタイプ?

204:デフォルトの名無しさん
14/04/07 18:59:37.11 iQnUI2e5
>>202
194がやっているのがまさにそれなんだけど、問題は戻り値の型が時間間隔ではなく
時刻を表す型になっていることだから、
>>194 の operator-() の戻り値を __int64 にして v_res=v_right-v_left; 以下を
return v_res; に変えれば100ナノ秒単位の経過時間が得られるようになる。
100ナノ秒じゃ細かすぎるというなら、戻り値を double にして return v_res / 10000.0;
に変えるとか工夫しろ。

205:デフォルトの名無しさん
14/04/07 19:23:33.56 BajMmze5
>>202
時間差(経過時間)を秒単位ではなくて、年月..秒で表すものにしたいから、
SYSTEMTIMEを戻り型にしているんじゃないのか

Winで経過時間を求めるのにSYSYEMTIMEを使うって普通なのか?
違うなら何を使うのが多い?

206:デフォルトの名無しさん
14/04/07 19:29:45.40 4vTqmZSq
よく分からんがC++なら<chrono>使えばいいんじゃね?
Win依存でいいならtimeGetTimeとかQueryPerformanceCounterとかがあるし

207:デフォルトの名無しさん
14/04/07 20:26:10.88 Y4utMABq
「時間差(経過時間)を秒単位ではなくて、年月..秒で表すものにしたい」
という要求下で "年" の計算にうるう年の考慮は必要だろうか?

208:デフォルトの名無しさん
14/04/07 20:35:46.78 4vTqmZSq
>>207
その辺難しいよね
365日とするか365.2425日とするか365.2422日とするか……
表示を日までに済ませておくのが無難かと

209:デフォルトの名無しさん
14/04/07 21:01:58.18 iQnUI2e5
>>208
.NETのTimeSpanクラスはそうなってるね。
内部表現は100ナノ秒刻みの整数値で、ミリ秒、秒、分、時間、日への変換はするが
月、年への変換はしない。

210:デフォルトの名無しさん
14/04/07 21:27:01.61 dmj0DO96
>>207
それ以前に月が 30日でいいのかと...

211:デフォルトの名無しさん
14/04/07 21:32:53.82 Y4utMABq
>>210
あああああーーーーー
考えるほどマンドクサイっすな

212:デフォルトの名無しさん
14/04/07 21:49:28.54 wQYu7k63
>>186
なんでQZが筆頭なんだ?

213:デフォルトの名無しさん
14/04/07 21:52:25.42 pviM0T4Q
どう考えても一番の荒らしです

214:デフォルトの名無しさん
14/04/07 22:31:32.85 tNhu6rzw
片山やhogeよりPOSIXが上なのかw

215:デフォルトの名無しさん
14/04/07 22:33:46.15 4vTqmZSq
質問いい?
switch構文のcase内で変数宣言したら、それについて
「'変数' の初期化が 'case' ラベルによって行われませんでした。」
って言われたんだけどどういうことなの……?
ついでにswitch部分に赤波線が付いて、「制御の転送は次の初期化をバイパスします」
って言われたんだけど何故エラーになるのか意味が分からない。誰か分かる人教えて下さい
(VS2013でコンパイルしている時に発生)

216:デフォルトの名無しさん
14/04/07 22:35:47.03 2mFu56Lz
caseだけだとスコープが同じになる
ブロックをつければいい

217:デフォルトの名無しさん
14/04/07 22:40:02.07 Y4utMABq
switch () {
case A:
 { // ローカルスコープにしちまう
  int a;
 } break;
case B:
 …
default:
 …
}

218:デフォルトの名無しさん
14/04/07 22:41:30.01 4vTqmZSq
>>216
ブロックを付けるって、要するに
case test:
 ~
 break;

case test:{
 ~
 break;
}
にするってことでいいの?

219:デフォルトの名無しさん
14/04/07 22:47:22.50 2mFu56Lz
Yes

220:デフォルトの名無しさん
14/04/07 23:30:25.89 H5+AU72d
個人的にはbreakは外に出したいな

221:デフォルトの名無しさん
14/04/08 00:20:22.54 lvT6VRY6
case test:としたときに
testにおけるのは何?
int a,b,c;
...
switch()
case (b=a+1, c++, C): なんてのでもOK(試してないけど)?

222:デフォルトの名無しさん
14/04/08 00:23:17.09 lXmRpq/E
>>221
試せ

223:デフォルトの名無しさん
14/04/08 00:32:19.53 zX8m8ach
>>221
ラベルだけだよ

224:デフォルトの名無しさん
14/04/08 00:32:44.67 4GqgTU2E
>>221
定数の整数式とscoped enumの値だけ
switch (a) case std::integral_constant<int, 6>::value:;

225:デフォルトの名無しさん
14/04/08 13:44:22.59 J+Ne3rG0
最近、よその板で、"「"だけで右を閉じてないのが流行ってるのか
すんげーむずむずするんだが

226:デフォルトの名無しさん
14/04/08 14:02:26.18 M2I5N33k
>>225
在日のおまえは知らないだろうが、明治時代からある用法だぞ。

227:デフォルトの名無しさん
14/04/08 16:39:02.94 9nnVwB+Q
>>226
(正直鬼物語で見たのが最初だなんて言えない)

228:デフォルトの名無しさん
14/04/08 17:27:19.75 DhHmBmSp
エロゲーでは普通じゃないのか?

229:デフォルトの名無しさん
14/04/08 18:01:46.09 Agmut9XT
どんな使い方なんだ?
(ry なんかはときどき見るな
閉じていない括弧に違和感を持つのはある意味プログラマらしいか

230:デフォルトの名無しさん
14/04/08 18:31:11.83 Bi2RyCEo
カッコつけてんじゃね~よ

231:デフォルトの名無しさん
14/04/08 18:50:35.55 C0aY6nOj
つけてねーよ

232:デフォルトの名無しさん
14/04/08 19:05:43.04 Ge61TJlR
case 1+1;
goto 2;
goto 1+1;
goto 2*1;
各環境でナニがドコまで許されるのか興味はあるな

233:デフォルトの名無しさん
14/04/08 22:58:16.49 5xZMJR+X
>>229
プログラマは、半開区間が大好きさ!
[0, 4)

234:デフォルトの名無しさん
14/04/08 23:04:52.46 9wIzdaaz
>>233
ワロタ

235:デフォルトの名無しさん
14/04/09 00:10:02.38 dDyddEcZ
もう全て半角にして英語圏顔文字でも使っとけよ:D

236:デフォルトの名無しさん
14/04/09 04:45:08.14 GDCkrjSs
roffとか気持ち悪いよな

237:デフォルトの名無しさん
14/04/09 13:15:17.74 /wyRfLaC
>>236
UN*XやるまえにDOSでTeXやってたからあれは意外になんとも
かつては汗でパーサ書いてたっていうから、まあそういうことなら。

238:デフォルトの名無しさん
14/04/13 08:17:37.43 7/oWURrR
time関数は1970年からの秒数らしいですが
long型で格納するとなると、68年くらいで限界が来ませんか?
2038年くらいにいろんなプログラムやばいっすか?

239:デフォルトの名無しさん
14/04/13 08:24:54.58 2iqAA/H6
2000年問題の時に話題にあがりました 「2038年問題」でぐぐれぇ

240:デフォルトの名無しさん
14/04/13 08:30:51.23 7/oWURrR
おーやべえ
でも今からプログラムつくろうとするとtime_tは64bitで定義されてるっぽいですね
3000億年まで安心か

241:デフォルトの名無しさん
14/04/13 09:06:00.54 olete8aZ
炎上学習法は要りません

242:デフォルトの名無しさん
14/04/13 09:33:49.42 m7xM1FWF
どこが炎上してんだよ

243:デフォルトの名無しさん
14/04/13 15:21:37.00 qnyX9I3J
2000年の頃は見えないほど先の話だと思っていたが
既に3分の1消化してるんだな

244:デフォルトの名無しさん
14/04/13 18:18:53.37 CtgsENNt
1000年以上先の問題ならまだしも、38年だと分野によっては平気で使われ続けるからな

245:デフォルトの名無しさん
14/04/13 18:50:58.03 Am7dEU9n
言わんとしてることはわかるからいいんだけど、64bitでコンパイルしてlongが32bitなのMSのコンパイラぐらいだぞ

246:デフォルトの名無しさん
14/04/13 18:52:32.07 P3Ox4abS
互換性を優先したんだろうね

247:デフォルトの名無しさん
14/04/13 18:55:12.72 N2UMgO6H
time_tは64bitになってるから許してやれ

248:デフォルトの名無しさん
14/04/14 07:18:41.20 CAt5QB21
URLリンク(ja.wikipedia.org)
同じソースでlongが32bitになったり64bitになったりする方が混乱するわ
昔intが16bitになったり32bitになったりで難儀した

249:デフォルトの名無しさん
14/04/14 08:17:35.70 XwQYiHbH
typedefせずソースに直接intとかlongとか書いてるの?

250:デフォルトの名無しさん
14/04/14 08:28:42.62 iMQET/ga
>>248
つstdint.h(cstdint)
規格仕様上複数マシンで動作できることを重視したから型ごとの制約が緩いのよね
と言うか既出の話題だったわw
スレリンク(tech板:61-69番)

251:デフォルトの名無しさん
14/04/14 11:00:15.74 fXV0vjOD
vectorにクラスを格納するのって
#include <iostream>
#include <vector>
class c_myclass
{
public:
    void myfunc(int num)
    {
        std::cout << "myfunc" << num << " が呼び出されました \n";
    }
};
int main()
{
    c_myclass temp;
    std::vector<c_myclass> vec;
    
    for(int i=0; i<10; ++i)
        vec.push_back(temp);
    
    for(int i=0; i<vec.size(); ++i)
        vec[i].myfunc(i);
    
    return 0;
}
このような感じでよろしいでしょうか?
ちなみに
サイズを指定する場合は
std::vector<c_myclass> vec(10);でしょうか?

252:デフォルトの名無しさん
14/04/14 11:15:14.08 Kn6UHMuG
よろしいです
しいて言えば
vec.push_back(temp);
より
vec.emplace_back();
の方がよろしいかと思われます

253:デフォルトの名無しさん
14/04/14 11:22:23.22 fXV0vjOD
>>252
ありがとうございます
もしよろしければemplace_back()について解説お願いします
リファレンスを見てもよくわからなかったので

254:デフォルトの名無しさん
14/04/14 11:23:47.56 Kn6UHMuG
コンストラクタを直接呼び出してくれるpush_backでございます
コピーが発生しないので多少効率的になります

255:デフォルトの名無しさん
14/04/14 11:25:50.80 fXV0vjOD
>>254
なるほど

256:KUSO KOTE ◆unko./w.Osri
14/04/14 12:36:29.24 8ev4IZFy
>>253
もしc_myclassにc_myclass(bool,double)みたいなコンストラクターがあったら、
emplace_back(true,1.23)とすることが出来て
かつvectorの中の格納領域上に直接c_myclassを作成できる。
と思う(想像)。

257:デフォルトの名無しさん
14/04/14 15:28:45.80 MAoTOR9V
emplace*()はいいね。巨大なクラスを連想配列に放り込む時に重宝だよ。

258:デフォルトの名無しさん
14/04/14 16:17:06.14 /qNJTuFi
open(2)したディレクトリを直接read(2)する方法ってあります?

259:デフォルトの名無しさん
14/04/14 16:37:16.17 oIWmwaCC
日本語でおk

260:デフォルトの名無しさん
14/04/14 17:29:53.33 aQsMBHRD
↓ちなみにひろゆきサイドの開発者はめちゃくちゃ臭い

4095 :名無しさん@13周年 :2014/04/14(月) 04:46:02.73 ID:wJLzpOd2P(4)
jimがさくらのクローラを遮断したみたいだな
迂回しても迂回→遮断のイタチごっこは目に見えてるので遮断できない方法でdatを引っこ抜くまでだ
具体的には専ブラっぽい挙動でnetからdat引っこ抜いてscに投げるスクリプト書いてやるからお前らそれブン回せ
たらこにはリクエスト+受け取り+改ざんチェック用のスクリプト書いてやるよ

あー久しぶりにemacs起動するわ
3時間で書いてやる

4209 :名無しさん@13周年 :2014/04/14(月) 09:22:21.15 ID:wJLzpOd2P(4)
あとちょっと書き足してバグとったらexeで配るよ
さしあたりdatの回収は俺がやっとく
C++で書きなおして独自の難読化施してるからnetの奴らにREできるかな?マカフィーでも無理なんじゃないかな

4210 :名無しさん@13周年 :2014/04/14(月) 09:24:13.59 ID:wJLzpOd2P(4)
今の時点で一つ言えるとしたら不特定多数を舐めるなってこと



あー久しぶりにemacs起動するわ()
3時間で書いてやる()

C++で書きなおして独自の難読化施してるからnetの奴らにREできるかな?マカフィーでも無理なんじゃないかな()

不特定多数を舐めるなってこと()

261:デフォルトの名無しさん
14/04/14 18:01:44.00 0/p4fR0J
いちいち持ってくるお前も臭い

262:デフォルトの名無しさん
14/04/14 19:15:32.34 yacO1o/C
>>258
できるでしょ?readdir(3C)とかは内部ではreadを呼んでる

263:デフォルトの名無しさん
14/04/14 20:02:57.67 g31zNjzu
>>262
read(2) の manには

EISDIR fd refers to a directory.

Other errors may occur, depending on the object connected to fd.
POSIX allows a read() that is interrupted after reading some data to
return -1 (with errno set to EINTR) or to return the number of bytes

とある

264:デフォルトの名無しさん
14/04/14 20:41:55.55 DVvt3Ia1
最近C++勉強始めたんですが、質問があります。(Cは良く分っているつもりです)。
C++には参照渡しという記述方法があることを知ったのですが、Cのポインタ渡しに
慣れている私としては、参照渡しを使わずにすべてポインタ渡しでコードを記述する
ほうが見易いので、そうしようかと思うのですが、何かデメリットありますか?
参照渡しを使うほうがよい点などありましたら教えてください。

265:デフォルトの名無しさん
14/04/14 20:51:36.33 UPYb5gKr
(個人的に思う)一般的に
ポインタで渡す=ヌルが渡ってくる可能性がある、つまり、常にヌルチェックが必要
ポインタで渡す=ヌルが渡せる、この引数はオプション的である

参照で渡す=なんかしらわたってくる、ヌルチェック不要
参照で渡す=この引数は必ず必要である

あと一時変数オブジェクトの寿命の関係とかあった気がするが忘れたw

266:デフォルトの名無しさん
14/04/14 21:14:47.05 iMQET/ga
>>264
ポインタ渡しと違い、参照渡しの場合、
・絶対に実体があるので、適当なアドレスが渡って
 不正なメモリアクセスを行うことがない
 また、参照する中身は変更できないので紛れがない
・普通の変数と同じように記述できる。構造体のメンバ関数にも
 アロー演算子ではなくドット演算子でアクセスできる
 また、関数の引数に使った際、呼び出す側としてはいちいち
 アドレスを渡すということを意識せず使用できる
・ポインタと違い参照自体にはメモリ消費がない
こんなところか

267:デフォルトの名無しさん
14/04/14 21:17:29.88 lcY87dee
返り値の話ではないとして。
参照渡しの一番のメリットは渡したオブジェクトの所有権が移動しない事がわかる事かな。

268:デフォルトの名無しさん
14/04/14 21:21:57.27 lEZQ3TFl
メモリ消費がないというのは不適切だろ
インラインで消えたりするが

269:デフォルトの名無しさん
14/04/14 21:46:00.21 iMQET/ga
>>268
いや、俺の持ってる本では
「ポインタと違って独自にメモリ領域が割り当てられない」
的なことが書いてあるんだが……違うの?

270:デフォルトの名無しさん
14/04/14 21:49:58.13 7APDnn3f
(お前が)(malloc/new等で)と読めなくもないが大丈夫か

271:デフォルトの名無しさん
14/04/14 21:55:35.64 buURFUek
初期のC++はC言語へのコンバータで実現してたろ。
参照も内部的にはポインタ動作と変わらないかと。

272:デフォルトの名無しさん
14/04/14 22:00:06.15 iMQET/ga
>>271
それって「参照がポインタで実装されてる(ことが多い)」って話じゃなかった?

273:264
14/04/14 22:02:44.39 DVvt3Ia1
みなさん解説ありがとうございます。
大変参考になります。
>参照渡しの一番のメリットは渡したオブジェクトの所有権が移動しない事がわかる事かな。
もう少し詳しく解説お願いします。

274:デフォルトの名無しさん
14/04/14 22:04:37.96 iMQET/ga
あとこんなページも見つけた
URLリンク(detail.chiebukuro.yahoo.co.jp)
URLリンク(www.osak.jp)

275:デフォルトの名無しさん
14/04/14 22:18:22.93 msrdBAHC
>>269
通常の実装では、呼び出し側ではスタックにアドレスを積むという点で全く同じだし、
呼ばれる側でもそこを参照するのに違いはないよ。
まぁ、インライン展開で消えれば話は別だけど。
一番のメリットは、(参照先ではなく)参照自体を書きかえられないことだね。
それもまた、ポインタでもconstにすればできるわけだけど。

276:デフォルトの名無しさん
14/04/14 22:54:29.26 CAt5QB21
URLリンク(codepad.org)
この例ではポインタで渡す気が起きない

277:デフォルトの名無しさん
14/04/14 23:06:35.99 lcY87dee
>>276
const付けような。

278:264
14/04/14 23:14:28.51 DVvt3Ia1
>276
サンプルコードありがとうございます。
>この例ではポインタで渡す気が起きない
すみません、まだよく分らないのですが、ポインタで
void WriteLine(const string *pstr)
{
printf("%s\n", pstr->c_str());
}
のようにすると何か問題があるのでしょうか?

279:デフォルトの名無しさん
14/04/14 23:17:14.74 lcY87dee
URLリンク(codepad.org)

参照にするとこうかける

280:デフォルトの名無しさん
14/04/14 23:20:11.44 i+D5B13r
>>273
++や--の挙動がポインタと参照で違うんじゃね?

281:デフォルトの名無しさん
14/04/14 23:32:46.57 lcY87dee
>>273
ポインタでオブジェクト返されると誰がdeleteすべきなのかドキュメント見るか返す関数の中身見るまでわからないよね?
参照にすると返したやつが所有している物の中身を見させて貰ってるってことがわかるからdeleteしなくていいって事がドキュメント見なくてもわかる。

引数でもポインタだと引数で渡されたポインタを内部で保持しておくから呼び出し側でdeleteや中身の変更をしてはだめになるのかとかわからない。

282:デフォルトの名無しさん
14/04/14 23:41:59.74 CAt5QB21
>>278
URLリンク(codepad.org)
ポインタでも書けるしこの例では問題はない
が、やっぱり人に見せると「何で参照使わないの?」と言われそう

283:デフォルトの名無しさん
14/04/14 23:54:52.78 73GA0vhp
string *str = new string("hello");
....
delte str;
....
WriteLine(str); //deleteしてるけど、、、ポインタ値は生きてるから アッー

結局、コンテナをうまく使って生ポ(生new)は極力排除しようぜって流れ

284:デフォルトの名無しさん
14/04/14 23:59:10.65 lcY87dee
>>282
なんで「何で参照使わないの?」と言われるのかその理由を書かないと意味ないだろ。

たとえば
URLリンク(codepad.org)
文字列を返す関数と文字列を引数にとる関数があるとする。
参照だったら文字列を返す関数を文字列を引数にとる関数の引数に直接書ける
ポインタだったら一度ローカル変数で受け取ってそのポインタを書かないとだめ

285:デフォルトの名無しさん
14/04/15 00:13:55.46 MOmoi8a1
int& a = *(int*)0;
a = 0;

286:デフォルトの名無しさん
14/04/15 00:17:57.06 lShoPitp
ポインター操作が目的でなく
null許可を表現させたいわけでもなく
読み取り用途限定の時に
わざわざポインターを使う方が不自然

287:デフォルトの名無しさん
14/04/15 00:21:36.20 jMxUSFKT
>>285
一行目がダメコードって一目瞭然じゃないか。
ポインタだったらnullを渡すのが悪いのか?nullチェックせずに代入するほうが悪いのか?になる

>>286
ポインタしかない世界から来た人には多分通じないよ。

288:デフォルトの名無しさん
14/04/15 00:25:16.54 hh7KqCRP
生ポ引数/戻り値なんて特別理由がある場合以外は使うなってこった

289:264
14/04/15 00:28:56.87 7FIahpja
私なりに結論を出してみたのですが、
参照渡しをするのは、
void WriteLine(const string &str);
みたいに、その関数に値を読み取り限定で渡す場合に主に使う。
ただし、必ずconstを付けておく。

上記以外はポインタ渡しを使う。
で良いでしょうか?

290:デフォルトの名無しさん
14/04/15 00:35:43.12 8L+RgIaL
参照はポインタの初心者版みたいなもの。
使い方が分からないのがあえて使わなくていい。

291:デフォルトの名無しさん
14/04/15 00:36:31.44 c0zlhsuS
>上記以外はポインタ渡しを使う

いいえ。
その他にもムーブセマンティクスを達成
したいときにも参照を使います。

292:デフォルトの名無しさん
14/04/15 00:45:18.87 jMxUSFKT
>>290 っていうC++初心者が書くコードはひどく読みづらいので真に受けたらだめ

293:デフォルトの名無しさん
14/04/15 01:27:44.04 PjplhgrG
ageる奴は碌なこと喋んねーな

294:デフォルトの名無しさん
14/04/15 03:06:53.30 2JpOUwgl
>>289
漏れも俺様ルールで、const参照は読み取り用、
ポインタは値を変更する時と、使い分けている

295:デフォルトの名無しさん
14/04/15 06:05:04.19 sGkhMKKa
>>289
URLリンク(ideone.com)
なかなかいい例が思い浮かばないが
この例ではconstを付けられないが参照が相応しいと思う

全てに当てはまる使い分けの条件は提示できないので
個人やチームの判断で使い分けするしか

296:デフォルトの名無しさん
14/04/15 07:52:53.60 AA0ZYDWw
格納場所という意味で>289が作った関数仕様を実装する場合も、自衛はするべき。
void readSome(Type * const result)
{
// ++result; // これがエラーになってくれる。
}

297:デフォルトの名無しさん
14/04/15 08:09:35.12 6lm4j3zL
俺はしないな。
意味的にはそうなのだけれど
C++のconstは真面目に付けると可読性を著しく損なう

298:デフォルトの名無しさん
14/04/15 08:59:58.71 Byz6doxp
>>263
うん。262は間違いでした。
調べたらreaddirはgetdents(2)を呼んでた
そりゃそうか。ファイルシステムで構造違うしな

299:デフォルトの名無しさん
14/04/15 10:42:12.48 ZiuccpsX
>>296
そのレベルは冗長

300:デフォルトの名無しさん
14/04/15 12:47:22.14 tCJ2yelK
参照なら要らないのにね。

301:デフォルトの名無しさん
14/04/15 12:54:41.51 dDf7e/l1
値渡しの引数にconstをつけるのはやりすぎな気がする
void f(const int x) なんてしないでしょ

302:デフォルトの名無しさん
14/04/15 13:09:58.76 tCJ2yelK
する奴いるよ。きっと>296も同じタイプ。

303:KAC
14/04/15 13:26:56.79 OYr23JgA
>>296
なんか違う事書いてるぞ。>289の仕様満たすならconstは*の左。

>>297
どんな所で可読性が落ちるって?
お前がまともに使えないだけじゃないの?

304:デフォルトの名無しさん
14/04/15 14:19:33.38 SFbbbO6x
流れぶった切って悪いんですが
>>251
c_myclassがインターフェースクラスを継承している場合は
継承元メンバ(インターフェースクラス)に仮想デストラクタを書いておけば良いのですか?

305:デフォルトの名無しさん
14/04/15 14:41:39.21 tCJ2yelK
>>303
>296が言いたいことは、>289の仕様ならconst * string const strだろ。

306:デフォルトの名無しさん
14/04/15 14:42:44.92 tCJ2yelK
いけね、Typo。
string const * const strね。

307:デフォルトの名無しさん
14/04/15 14:59:38.52 JmWJ8ekL
>>304
違いが分かればよいのだが…
URLリンク(ideone.com)

308:デフォルトの名無しさん
14/04/15 15:09:29.49 SFbbbO6x
>>307
さらっと確認したので怪しいのですがたぶん
クラスAには仮想デストラクタが無い為に
newしたオブジェクトがデリートされる際、継承元のデストラクタが呼び出されていませんが、
クラスBは仮想デストラクタがメンバにあるので
deleteされる際に継承元のデストラクタが呼び出される訳ですよね

そこで、ベクターにオブジェクトを格納する話につながる訳ですが
>>251のc_myclassがインターフェースクラスを継承しているときには
やはり継承元のクラスに仮想デストラクタを記述しておかないと危険だという事ですよね?

309:デフォルトの名無しさん
14/04/15 15:27:23.32 JmWJ8ekL
だーね

310:デフォルトの名無しさん
14/04/15 15:32:30.40 SFbbbO6x
確認しつこくてすいませんが
まとめると>>307のdlvBを
dlvB temp
std::vector<dlvB> obj;
obj.push_back(temp);
みたいにしちゃっておkってことですよね

311:デフォルトの名無しさん
14/04/15 18:05:27.38 ef3kTbvB
>>310
そうしたいなら仮想デストラクタとか仮想関数とか関係ない。
コピーコンストラクタを作ればいいだけ。

312:デフォルトの名無しさん
14/04/15 18:37:17.89 u428dFct
std::vector<clsB>にdlvB型のオブジェクトを突っ込むとスライシングでダメになるから気をつけるように
多態をコンテナ内で実現したいならstd::shared_ptrやunique_ptrを入れるのがよい

313:デフォルトの名無しさん
14/04/15 20:01:11.81 Nbqron3B
仮想デストラクタが必須なのは当然として
vectorに突っ込むケースを考えると
難易度としては
vetcor<Base>
vetcor<Base*>
vetcor<shared_ptr<Base>>
ptr_vector<Base>
こんな感じじゃね?
それぞれ注意点はあるが
一見簡単そうに見える
vetcor<Base>
が一番きつい

314:デフォルトの名無しさん
14/04/15 20:12:18.40 MU2KfTCa
>vetcor<Base>
そもそも派生クラスを突っ込めない。
>vetcor<Base*>
所有権がどこにあるのか分からないので論外。
>vetcor<shared_ptr<Base>>
virtualデストラクタ不要で便利。
>ptr_vector<Base>
今更ptr_vector?unique_ptrでいい。

315:デフォルトの名無しさん
14/04/15 20:33:50.00 O7xBtcGx
make_uniqueが標準に入らないと、記述量がちょっと面倒

316:デフォルトの名無しさん
14/04/15 20:42:49.07 Nbqron3B
>>314
たしかに
デザパタで
知らんかった
流行り廃りとかあるの?デザパタで

317:デフォルトの名無しさん
14/04/15 20:49:25.61 aOtL598m
std::unique_ptrはvectorに突っ込めるのにboost::scoped_ptrは出来ないのはなんで?

318:デフォルトの名無しさん
14/04/15 20:54:50.82 tBkVUf7m
moveできないから

319:デフォルトの名無しさん
14/04/15 23:53:29.68 hh7KqCRP
noncopyableだからだろ

320:デフォルトの名無しさん
14/04/15 23:56:04.64 of9IS0B8
ユニポもそうだけど

321:デフォルトの名無しさん
14/04/16 00:00:41.11 cUKcFdx2
>>320
すまん、そうだね、copyかmoveが出来ないとコンテナには入れられないということで


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch