C++相談室 part142at TECH
C++相談室 part142 - 暇つぶし2ch388:デフォルトの名無しさん
19/04/24 01:00:02.97 pnt3hUol.net
前方宣言したクラスをTにしたスマポメンバでコンパイル通るときと通らないときがあって調べてたら
デストラクタがインライン(暗黙)だと駄目だとわかった
しかもこの問題が起こるのはunique_ptrのときだけでshared_ptrはデストラクタの定義に関係なく通る
わけわからんぞ
教科書に書いておいてくれ
class ClassB;
class ClassA{
public:
ClassA();
private:
std::unique_ptr<ClassB> u; // NG
std::shared_ptr<ClassB> s; // OK
}
---
class ClassB;
class ClassA{
public:
ClassA();
~ClassA(); ←これでunique_ptrもOK
private:
std::unique_ptr<ClassB> u; // OK
std::shared_ptr<ClassB> s; // OK
}

389:デフォルトの名無しさん
19/04/24 07:38:59.52 IdP8M60W.net
>>388
unique_ptr<T>のデストラクタはインスタンス化するときにTが完全型であることを要求する(デストラクタで直接Tのデストラクタを呼ぶ)
unique_ptrを内包するクラスのデストラクタが暗黙だとクラス内でコンパイラによって実装されるけど、その場でunique_ptrのデストラクタを要求する
しかし、その翻訳単位内でTの定義が無ければコンパイルエラーとなる
unique_ptr<T>を内包するクラスのデストラクタがとりあえず宣言だけでもあると
実際の定義がある場所で同様の事が起こるので、その場所でTの定義が見つかればいい
その場合に定義を書かないと、コンパイラさんが適切な翻訳単位内に定義をおいてくれるみたい
shared_ptrは動的削除子のおかげでデストラクタが呼ばれるところで適切にデリータを定義し、デストラクタを呼ぶようになっているのでこの様な問題は起こらない
shared_ptr<T>のデストラクタ内ではTのデストラクタを直接呼び出すようなコードが無い

390:デフォルトの名無しさん
19/04/24 18:54:26.06 pnt3hUol.net
>>389
解説ありがとう

391:デフォルトの名無しさん
19/04/26 01:05:34.79 UW94aXeh.net
うーんC++プライマー8500円かぁ。本家のプログラミング言語C++第4版はもっとするし
情報量からすると安いが本一冊にポンと出すにはお高い……日本語である程度網羅的な本となるとこの2冊くらいよね

392:デフォルトの名無しさん
19/04/26 19:40:01.51 aJMYFNVy.net
set<double> って int のときと同様にちゃんとソートされるんですか?

393:デフォルトの名無しさん
19/04/26 20:34:04.97 Fns+A8Ou.net
NaNが無ければ大丈夫NaNじゃね

394:デフォルトの名無しさん
19/04/26 20:34:22.70 Fns+A8Ou.net
NaNが無ければ大丈夫NaNじゃね

395:デフォルトの名無しさん
19/04/26 22:17:06.30 PbDaLlJb.net
のちに永久保存される平成最後のスベり

396:デフォルトの名無しさん
19/04/26 23:59:20.16 LBUDtqYL.net
たしかにそうだな・・いよいよ平成最後なんだな
みなさん、>>393-394 みたいな事にならないよう、気をひきしめましょう

397:デフォルトの名無しさん
19/04/27 00:20:06.56 nrL5Mhiq.net
平成最後っていう言い回し使われすぎて嫌いになってきた

398:デフォルトの名無しさん
19/04/27 00:23:11.48 v7q7vgVx.net
イテレータの参照を次に移すときってなんでitr++ではなく++itrなの?

399:デフォルトの名無しさん
19/04/27 00:33:20.40 nrL5Mhiq.net
ヤフーでぐぐれ

400:デフォルトの名無しさん
19/04/27 01:04:24.73 oB7jkl++.net
素直な実装だとitr++より++itrのほうが速いんじゃないかなあ、となんとなくみんなが思っているから

401:デフォルトの名無しさん
19/04/27 01:07:57.61 v7q7vgVx.net
速度に差が出るのか
知らなかった

402:デフォルトの名無しさん
19/04/27 01:35:51.19 KjSesqKI.net
インクリメント後のイテレーターの値を返す処理の実装を考えると
先の場合はインクリメントしてそのまま渡せばいいけど
後の場合はインクリメント前の値を保存しといてそれを渡さないといけないので一手間かかるから
・・なんだけど諸々の最適化とか色んな条件とか考えたらそこまで差がでるかどうかはよくわからん

403:デフォルトの名無しさん
19/04/27 01:38:33.58 EJ6OYH9I.net
it++だと、戻り値をコピーしてとっておいてから、ポインタなりを進めた後にreturnする必要があるが、
++itだと、ポインタを進めた後に参照を返すだけでするからな。

404:デフォルトの名無しさん
19/04/27 01:39:08.58 EJ6OYH9I.net
被ったw

405:デフォルトの名無しさん
19/04/27 11:13:20.29 qp4sR6Ay.net
>>398
ite++と++iteなんて気持ちの問題
てか範囲for文使えばいい

406:デフォルトの名無しさん
19/04/27 11:46:20.51 Tan1PMrG.net
>>402-405
cppcheck にかけたらちゃんと警告出るね。

407:デフォルトの名無しさん
19/04/27 14:06:33.77 dwPa57iA.net
どうせ戻り値捨てるんだったら++itを選んでおいて損はない
無駄にit++を使うのは時期尚早な最不適化って奴だ

408:デフォルトの名無しさん
19/04/27 19:31:57.61 Ht8C3PIL.net
C++で書くんだから後置インクリメントの方がメインに決まってんじゃん
前置は異端だ

409:デフォルトの名無しさん
19/04/27 19:37:22.12 nrL5Mhiq.net
殺せ

410:デフォルトの名無しさん
19/04/27 20:12:28.01 uerCNQ9f.net
++C

411:デフォルトの名無しさん
19/04/27 20:53:36.82 hHA0b+W+.net
C++でいいんだよ。
規格は一歩進むけど、使ってるやつはbetter Cばかりってな

412:デフォルトの名無しさん
19/04/27 20:55:05.03 nrL5Mhiq.net
++C++まだかよ

413:デフォルトの名無しさん
19/04/27 22:37:09.45 Czz6ceI0.net
>>411
vectorとかstringとか使わんの?

414:デフォルトの名無しさん
19/04/28 03:35:47.43 c2OY2Ben.net
CArrayとCStringだぞ
コピコンは定義されてないから自分で作るぞ

415:デフォルトの名無しさん
19/04/28 11:01:20.49 DJV+PGkd.net
CArrayは、<algorithm>ヘッダーで定義された信頼性の高いユーティリティ関数を使えないのがね・・・。

416:デフォルトの名無しさん
19/04/28 13:46:52.13 nadmD8id.net
>>413
この思考がbetter C

417:デフォルトの名無しさん
19/04/28 14:25:38.47 n1RanWws.net
>>416
わけわからん

418:デフォルトの名無しさん
19/04/28 14:29:28.69 c2OY2Ben.net
俺がBest Cだ

419:はちみつ餃子
19/04/28 14:56:12.05 mA4VukHK.net
>>415
イテレータをうまいこと定義すれば使えるやつも結構あるんじゃね?
そうでもない?

420:デフォルトの名無しさん
19/04/28 15:37:56.41 UbqPSgHc.net
inconsistent begin/end types in range-based ‘for’ statement
gcc(g++) 8.2で -std=c++17オプションでコンパイルで
範囲forでこのエラーが出るんだが
begin endの型不一致の制限緩和されいるはずだよな?
原因わかる方いますか?

421:デフォルトの名無しさん
19/04/28 15:49:39.60 4R543R/q.net
>>415
GetData()とGetData()+GetSize()を渡せば、とりあえず動くんじゃね?

422:デフォルトの名無しさん
19/04/28 16:05:30.47 n1RanWws.net
>>420 比較演算子定義されてないとか?

423:デフォルトの名無しさん
19/04/28 16:22:25.11 UbqPSgHc.net
>>422
int _n = 0;
auto __begin = _container.begin();
auto __end = _container.end();
for (; __begin != __end; ++__begin) {
_n = *__begin;
}
比較演算子はちゃんと定義してるし
上のコードは何故かコンパイル通る
だけど
for (const auto _n : _container) {
//hoge
}
は何故か通らない

424:デフォルトの名無しさん
19/04/28 16:41:14.97 n1RanWws.net
範囲for文のconst autoをconst auto&かauto&&に変えるとどうなる?

425:デフォルトの名無しさん
19/04/28 16:43:13.35 UbqPSgHc.net
>>424
auto&&にした時のみエラーが増えます
cannot bind rvalue reference of type ‘const long unsigned int&&’ to lvalue of type

426:デフォルトの名無しさん
19/04/28 16:54:13.46 /ZzCGjK1.net
beginとendのシグニチャは?

427:デフォルトの名無しさん
19/04/28 17:02:57.34 UbqPSgHc.net
>>426
using iterator = typename std;;vector<int>::iterator;
using const_iterator = typename std;;vector<int>::const_iterator;
using my_iterator = MYIterator;
my_iterator begin();
iterator end();
const my_iterator begin() const;
const_iterator end() const;
const my_iterator cbegin() const;
const_iterator cend() const;

428:デフォルトの名無しさん
19/04/28 17:18:10.81 HBE/zmE6.net
これで動かん?
for (auto&& _n : _container) {
}

429:デフォルトの名無しさん
19/04/28 17:28:42.95 UbqPSgHc.net
>>428
動かないです

430:デフォルトの名無しさん
19/04/28 18:12:40.94 /ZzCGjK1.net
MYIteratorの実体がunsigned longみたいだけど
vector<int>::iteratorの実体がポインタだったらoperator!=の定義できなくない?

431:デフォルトの名無しさん
19/04/28 18:13:25.64 7uO4eV2c.net
>>420
wandboxで再現コード作って出直すか、それができないんならエスパーに頼んだほうがいいんじゃないかな。
URLリンク(mevius.2ch.net)

432:デフォルトの名無しさん
19/04/28 20:53:07.97 B+3vkW9O.net
>>423
bool operator != (~) const ← これ付け忘れてないか?

433:デフォルトの名無しさん
19/04/28 20:57:20.67 HwAGJ3yN.net
constつけ忘れは時々はまる

434:デフォルトの名無しさん
19/04/28 23:15:17.87 UbqPSgHc.net
>>427
自己解決
const iteratorとconst_iteratorが一緒だと勘違いしていた
const my_iteratorではなくmy_const_iteratorを実装して返り値とすべきでした

435:デフォルトの名無しさん
19/04/29 08:12:30.69 caHZo185.net
struct A{
int member;
};
struct B: A{
void run(){member = 0;}//ok
};
template<typename T>
struct TA{
T member;
};
template<typename T>
struct TB:TA<T>{
void run(){member = 0;}//NG。this->memberとするとok
};
クラステンプレートを継承してクラステンプレートを作成した場合にthisでないと継承元のメンバーが見えないのは仕様?

436:デフォルトの名無しさん
19/04/29 10:32:33.68 ytpB6N2f.net
仕様
一寸前までのmsvcではなぜか通っていたけど

437:デフォルトの名無しさん
19/04/29 11:47:53.29 atpu4K08.net
>>436
なんでそんな仕様になってるんだろう…

438:デフォルトの名無しさん
19/04/29 12:13:25.59 TWBg2sM/.net
>>437
2phase lookupだから
最初のTB解釈時にはTAが型引数一つのtemplate classであるという情報以外使わない
だいたいTAが特殊化される可能性があるだろ

439:デフォルトの名無しさん
19/04/30 10:16:07.47 5viqjSMx.net
8bitや16bitのintしか使えない環境で、
32bitなどの大きな数を扱うにはどうすれば良いですか?
変数をいくつかつなげて大きな数を表現できないかと思っているのですが、やり方が分りません。
ご存知の方いらっしゃいましたら教えて頂けると嬉しいです。

440:439
19/04/30 10:20:33.67 5viqjSMx.net
補足させて下さい。
足し算、引き算は出来るようにしたいです。
可能でしたら、掛け算や割り算もできると助かります。

441:デフォルトの名無しさん
19/04/30 10:25:07.05 l5C1eDEl.net
多倍長演算で検索

442:デフォルトの名無しさん
19/04/30 10:45:28.19 Cm5pFeJF.net
>>438
> だいたいTAが特殊化される可能性があるだろ
なるほどそりゃそうか、サンクス

443:
19/04/30 11:43:40.55 iYYZTFZo.net
>>439-440
スレリンク(tech板:51番)
近々、委譲をやめて継承に戻すつもりです
あと掛け算はkaratsubaを適用できる目処がたちました
x64 に特化してインラインアセンブラ化することも考えています

444:はちみつ餃子
19/04/30 12:03:49.54 MGpUBTsC.net
karatsuba はかなり桁数が多いときじゃないと効果がないとも聞くけど

445:
19/04/30 12:09:22.58 iYYZTFZo.net
>>444
多分それは乗算FFTのことかと

446:デフォルトの名無しさん
19/04/30 12:28:54.66 44LYo/LT.net
>>439
stdint.h で int_least32_t とか使えるのでは?

447:
19/04/30 13:43:58.68 iYYZTFZo.net
>>446
8bit/16bit CPU で int_least32_t とかはそもそも存在しないのでは?

448:デフォルトの名無しさん
19/04/30 14:19:40.82 44LYo/LT.net
>>447
「8bitや16bitのintしか使えない」を見て long や long long はもっと大きいんじゃないの?と思ったんだよ。
「整数型」の意味で"int"って書いてたんなら、確かに存在しない環境のことを言ってるのかもしれない。
その場合は ISO C/C++ の LONG_MAX の最低絶対値の要求に準拠できないってことになるんだけど。

449:デフォルトの名無しさん
19/04/30 14:19:47.17 gDkH0fQs.net
8bit pic用XCでもlongは32bitなのに

450:
19/04/30 15:03:05.44 iYYZTFZo.net
>>449
それはそれですごいインプリメンテーションですね…
8 bit PIC で 32bit int がさくさく書けちゃうとは、そのインプリメンターは根性がありますね、それか頭のねじが何本か外れていて「無理を無理と思わない人」とか…

451:デフォルトの名無しさん
19/04/30 15:29:16.24 0LsajAP1.net
shortは16bit固定でlongは32bit固定でしょ。何言ってんの?

452:デフォルトの名無しさん
19/04/30 16:18:35.89 coQMvXAj.net
>>451
いや、お前こそ何を言ってるんだ?

453:
19/04/30 16:37:10.66 iYYZTFZo.net
>>451
残念でした、short も long もインプリメンターが好きに実装していいのですっ!きりっ!

454:さまよえる蟻人間
19/04/30 16:45:08.36 lzNlO/OB.net
>>451
64-bit Linux でsizeof(long) が8だった。移植がある場合は<cstdint>使わんとあかん

455:デフォルトの名無しさん
19/04/30 17:46:03.06 bcA0O1+B.net
intが16bitならISOの規格は満たしてることになるかな。
32bit以上の長い整数はクラスと演算子オーバーロードで誤魔化すか。
頑張ってもリテラル表記もダメだろうから、使い勝手は悪いよな。

456:デフォルトの名無しさん
19/04/30 19:51:46.33 tnl21ewQ.net
>>451
うろ覚えだが
VC Win32bit: int 32bit long 32bit pointer 32bit
gcc Linux32bit: int 32bit long 32bit pointer 32bit -ここまでは同じ
VC Win64bit: int 32bit long 32bit pointer 64bit -int64_tで64bit整数
gcc Linux32bit: int 32bit long 64bit pointer 64bit

457:デフォルトの名無しさん
19/04/30 20:17:37.41 YvhWBPAF.net
既にLP64とかLLP64とかの呼び方が存在するんだから、そっちを使おうよ
URLリンク(ja.wikipedia.org)

458:デフォルトの名無しさん
19/04/30 20:34:29.38 4LCMFhXh.net
厳密なbit長が必要なときにintだのlongだの使っちゃ駄目よ

459:デフォルトの名無しさん
19/04/30 20:56:09.36 ba2OmOyM.net
じゃあ何を使えばいいの?

460:デフォルトの名無しさん
19/04/30 20:59:46.66 jq/I62+g.net
int_leastシリーズでは?

461:デフォルトの名無しさん
19/04/30 21:02:03.72 tJFiug19.net
intの配列のラッパーのようなものから再発明すりゃーいい
class Bignumber{
int number[4];
Bignumber(const String num){
for(int i=0; i<4; i++){
number[i] = //考えるのが面倒臭い
}
}
Bignumber operator+(){
//以下、延々とオペレータオーバーロードが続く
}
};

462:
19/04/30 21:02:11.05 iYYZTFZo.net
>>459
int64_t とか int32_t とか cstdint の面々を使うしかないでしょうね…私もデフォでそうするようになりました

463:デフォルトの名無しさん
19/04/30 21:08:03.86 0LsajAP1.net
あ…ありのまま 今 起こった事を話すぜ。
平成の終わりにいろんな奴からshort/longに対する認識の誤りを指摘される恥辱を味わった。
何言ってるかわからねーと思うが(以下略

464:デフォルトの名無しさん
19/04/30 21:08:35.71 QYmLdpSV.net
なんかもうビットという表現すら無くそうとしてるんじゃなかった?

465:デフォルトの名無しさん
19/04/30 21:19:14.38 l5C1eDEl.net
制限された環境で使える多倍長整数のライブラリくらいいくらでもありそうだけど

466:デフォルトの名無しさん
19/04/30 21:42:28.23 ba2OmOyM.net
>>462
なるほど、cstdint ですか!
教えてくださりありがとうございます

467:デフォルトの名無しさん
19/04/30 23:24:19.16 xHYWEb3z.net
ビット数を付けるのは、MISRA-C で決まっているだろ
int8, 16, 32
uint8, 16, 32

468:デフォルトの名無しさん
19/05/01 00:05:54.61 rGIFhODV.net
C++の規格上はintは16 bit以上(ターゲットのアーキテクチャで一番自然なサイズ
、longは32 bit以上
だったと思った

469:デフォルトの名無しさん
19/05/01 06:23:13.87 EdGuPz7E.net
class ClassA
class ClassB: public ClassA
class ClassA::ClassC
のときに、ClassBはClassAのサブクラスと言いますがClassCはなんと呼ぶものですか?

470:
19/05/01 06:32:09.33 JcO9/TOD.net
>>469
>class ClassA::ClassC
この意味はなんですか?

471:デフォルトの名無しさん
19/05/01 06:32:44.82 TS5dpT59.net
基底クラス
スーパークラス
親クラス
ベースクラス

472:デフォルトの名無しさん
19/05/01 06:56:41.43 q4ZM9Khf.net
細かいことを言えば、規格準拠の処理系でも
int32_t (ピッタリ32bit) が定義されるとは限らないのね。
int_fast32_t, int_least32_t なら定義される。
8bit単位じゃないCPUへの配慮らしいから、
普通の(この表現も危険だけど)コンピュータを使う分には
int32_t があると仮定して書いてもたいがい大丈夫だろうけど。
コンパイルエラーが出るから出たら対処、で十分かと。

473:デフォルトの名無しさん
19/05/01 07:06:00.95 EdGuPz7E.net
>>470
クラス内で定義したクラスです
class ClassA {
public:
...
private:
class ClassC;
ClassC * C;
}
class ClassA::ClassC {
...
}
の場合class ClassA::ClassC からClassA::を取るとコンパイルが通りません

474:デフォルトの名無しさん
19/05/01 07:25:40.44 shCLaGGL.net
「プログラミング言語C++」だと、入れ子クラス(nested class)とか
メンバクラス(member class)とか呼んでるみたい。

475:デフォルトの名無しさん
19/05/01 07:36:13.31 EdGuPz7E.net
おお、なるほど
ありがとうございます

476:デフォルトの名無しさん
19/05/01 09:29:42.19 HwrGV3PF.net
内部クラス(inner class)もよく聞くけど調べたらJava用語っぽいな

477:デフォルトの名無しさん
19/05/01 10:28:09.06 imZnb7dZ.net
Inner Class、Java用語なのか。そう呼んじゃってたわ

478:デフォルトの名無しさん
19/05/01 17:22:15.78 Ul5/0sra.net
今よみがえる構造体ネストの悪夢

479:はちみつ餃子
19/05/01 17:31:05.65 Gk4iJJA0.net
>>473-474
nested class は仕様にあるので、
これが公式な用語と思って良いみたいだね。

480:デフォルトの名無しさん
19/05/01 19:23:34.42 DLNQH846.net
以前、「完全さを求めるあまり今存在する良い物を犠牲にしてはならない」という趣旨のことわざをBBCハードトークで仄聞したのだが、原典はなんだろうか?

481:
19/05/01 19:59:09.50 JcO9/TOD.net
>>480
ググってヒットしたもののうち、これについてめぐらせています(ことわざとは関係ありません…)
URLリンク(www.kt.rim.or.jp)
この人(原著者)、最後まで間違ったままでいるような気がしてなりませんが、実際のところどうでしょうか

482:デフォルトの名無しさん
19/05/01 22:03:28.27 EdGuPz7E.net
>>479
ありがとう

483:デフォルトの名無しさん
19/05/04 17:19:13.49 x8LtSB02.net
>>480 URLリンク(en.wikipedia.org)

484:デフォルトの名無しさん
19/05/06 08:44:53.70 Omhj+R8I.net
ストリームの遅さは凄い凄すぎる。
ほとんどの場合、遅くても問題ないということはわかる。
でもあそこ迄遅くする必要があったのだろうか。

485:デフォルトの名無しさん
19/05/06 10:41:12.07 ZJRraXBB.net
突然何?

486:デフォルトの名無しさん
19/05/06 12:17:09.96 jqdyfBGc.net
3.5  ストリーム
URLリンク(sicp.iijlab.net)
これだろう
理想的にはこうなるべきだが、技術的には未だに追いついてないだけであり、将来的には解決される
なのでC++では他のどの言語も真似してない<<や>>がある
逆に言うとストリーム・プログラミングが主流になったらC++が主流の座に返り咲く

487:デフォルトの名無しさん
19/05/06 15:05:44.09 XjarcZ9f.net
今やどの言語もprintfのような書式付き文字列を指定する方式に回帰した(jsすら!)。
少なくとも書式付き出力に限れば、ストリームはプログラミング言語の中ではもう淘汰されてしまったんだと思うよ。
早いとこ、string::format()とかbasic_ostream::format()とか作ってほしいわ

488:デフォルトの名無しさん
19/05/06 15:24:11.52 ecbY6TsO.net
多言語対応するためにはC#みたいに %1, %2みたいに引数を番号で指定できる書式じゃないとダメでしょ。

489:デフォルトの名無しさん
19/05/06 15:30:05.12 HRNpJ9Fc.net
ストリームの精神はrangeに受け継がれて生き残るよ
だから書式はそろそろ負けを認めよう

490:デフォルトの名無しさん
19/05/06 16:03:09.57 ZJRraXBB.net
どうしてprintf使わないの?

491:デフォルトの名無しさん
19/05/06 16:28:48.00 YSlWnmwv.net
オーバーロードできないから

492:デフォルトの名無しさん
19/05/06 16:36:53.99 oGUqqIoM.net
<<には<<なりの良さがあると思うので、ストリームというより、stringがoperator <<をサポートすれば良いと思う。

493:デフォルトの名無しさん
19/05/06 16:40:04.95 DF3zK1Xx.net
文字列操作するためのインターフェイスとしては最悪だよ。
考えた奴は自分では絶対使わないで人に使わせるだけのタイプだろうな。

494:デフォルトの名無しさん
19/05/06 16:45:40.32 Yv9FD/Sb.net
そもそもだけど、なんで文字って表示されるのに
<< とか %s とかこういうのが必要なの?
どの言語でもprint(a);だけで表示させればよくない?aが文字列でも整数でも小数でもさ。
引数で判断してくれよ。

495:デフォルトの名無しさん
19/05/06 16:51:17.77 oGUqqIoM.net
>>493
え、そう?
文字列を連結する時に、+=と+を使い分けるより<<だけですむ方が楽だし、連結する順番も自明だし結構良くない?
std::string str;
str << "hoge" << 123 << ".txt";
みたいな。

496:
19/05/06 17:27:51.75 vu8V8zIe.net
>>492
それは私も考えていました、cerr に都度吐いているメッセージを、もう一度プログラムの最後にまとめて吐きなおす、とかをやってみたいんです…

497:デフォルトの名無しさん
19/05/06 17:37:23.51 QULX0INn.net
>>495
そのやり方は引数の順序を変えられないから語順が違う言語間での翻訳で困る

498:デフォルトの名無しさん
19/05/06 17:37:57.33 ecbY6TsO.net
コンストラクタの引数に出力先stringインスタンスを渡すostream派生クラスを作ればいいじゃない。
string str;
hogestream sstr(str);
sstr << "hoge" << 128;

499:デフォルトの名無しさん
19/05/06 17:42:30.68 B4KNKrTg.net
別にstringstreamで良いじゃない

500:デフォルトの名無しさん
19/05/06 17:42:46.83 B4KNKrTg.net
別にstringstreamで良いじゃない

501:デフォルトの名無しさん
19/05/06 18:13:11.14 L6nFhRY+.net
iostreamの<<はC++の黒歴史の一つだね

502:はちみつ餃子
19/05/06 18:19:09.50 K/rO19sE.net
stream の機能はいらんからとにかく文字列に差し込むだけ出来ればいいってのなら
単に operator<< を定義すれば出来るけど……。
URLリンク(wandbox.org)

503:デフォルトの名無しさん
19/05/06 18:27:12.43 ecbY6TsO.net
>>499,500,501
ostream派生クラスじゃなくて独自のクラスのほうが軽量でいい。
stringインスタンスへのポインタのほかに、数値書き込み時の進数設定(oct,dec,hexを覚えておく)などをメンバ変数に持てばOK。

504:デフォルトの名無しさん
19/05/06 18:58:24.90 oGUqqIoM.net
>>502
をを、なるほど、これは素晴らしいw

505:デフォルトの名無しさん
19/05/06 21:02:54.05 ZJRraXBB.net
>>492
stringstream・・・

506:デフォルトの名無しさん
19/05/07 19:51:10.38 FbrTB0S1.net
basic_ostream使えよっていつも思う
なんで決め打ちするのかわからない

507:デフォルトの名無しさん
19/05/08 21:52:50.27 iQQm+nuQ.net
to_charsというものをみつけました。

508:デフォルトの名無しさん
19/05/09 18:03:02.17 PdPEbd3c.net
b配列全てをa配列のケツにコピーするとき
std::vector<char> a;
char b[]={0,1,1,3,4};
a.insert(a.begin(),&b[0],&b[sizeof b]);
これでいいの?
&b[sizeof b]
これが死ぬほど気持ち悪いんだけど

509:デフォルトの名無しさん
19/05/09 18:18:44.76 JXKWFyOS.net
そんな気色悪い書き方しなくてもこれでいいよ
a.insert(a.end(), std::begin(b), std::end(b));

510:デフォルトの名無しさん
19/05/09 18:25:51.81 PdPEbd3c.net
なるほど!ありがとう

511:はちみつ餃子
19/05/09 18:44:16.05 IVoLxnXn.net
>>508-509
std::copy に back_inserter を渡す方が効率的という豆知識。

512:デフォルトの名無しさん
19/05/09 18:53:31.44 vbHvKAwn.net
>>511
insertのが速いんでね?
resizeしてmemcpyになるはず

513:デフォルトの名無しさん
19/05/09 23:40:45.34 q7ofaYCv.net
アルゴリズムよりvector::insertのほうが実装による最適化の余地は大きそうだな

514:デフォルトの名無しさん
19/05/10 00:47:30.50 5C678nxv.net
ポインタがイテレータとして渡された時点で相手が連続バッファだってわかるからね

515:デフォルトの名無しさん
19/05/10 11:00:01.95 KAkBQh2y.net
&b[sizeof b]でもstd::end(b)でもやってることは変わらないんだけどな
見映えは重要だな

516:デフォルトの名無しさん
19/05/10 11:08:59.15 pPfi71KH.net
sizeof bじゃcharでしか使えないんで、そういう意味でもイケてないかも

517:はちみつ餃子
19/05/10 12:01:59.87 g2QrvVju.net
>>515
見栄えというか、名前が付いているってのはそれだけで単純にわかりやすいな。
(名前が妥当であれば。)

518:デフォルトの名無しさん
19/05/10 19:02:43.61 UhKi+qPE.net
嫌儲で、東京五輪チケットのソースコードが出てるけど
C++使ってるお前らなら、こんなソースコードじゃないよね?
URLリンク(gogotsu.com)

519:デフォルトの名無しさん
19/05/10 19:05:10.83 curN/h5M.net
>>518
サーバーサイドあまりやってないけどこんな泥臭い書き方するのか

520:デフォルトの名無しさん
19/05/10 19:05:16.55 TAwz/zT/.net
javascriptやん

521:デフォルトの名無しさん
19/05/10 19:36:57.50 tfYAY6pz.net
こんなもんだろ
SIerが間違ってコンシューマ系のWeb制作を請けてしまうとこんな感じになる

522:デフォルトの名無しさん
19/05/10 21:47:05.61 oOPMkjEw.net
てかこんなもの韓国に出すのね
安くなさそう
ってもしや北の方?

523:デフォルトの名無しさん
19/05/10 21:53:19.07 oOPMkjEw.net
parseInt(Num).lengthって動かなそう

524:デフォルトの名無しさん
19/05/10 21:57:58.16 TAwz/zT/.net
ほんまやw桁でも返ってくるのかと思ったがundefinedじゃんかw

525:デフォルトの名無しさん
19/05/10 22:59:11.84 HK1/2Yro.net
型に無駄にこだわった結末がstreamと知っとくのは重要。
あの間違いを覚えとけ。

526:デフォルトの名無しさん
19/05/10 23:25:31.58 u3uVdMgu.net
ゲームのシーンを管理するクラスとシーンクラスがあり、管理するクラスはシーンクラスを保持しています
シーンクラスから管理クラスのシーンチェンジを行う関数を呼び出したいのですがどうやったらいいでしょうか
シーンクラスが管理クラスのインスタンスを持ちたくありません

527:デフォルトの名無しさん
19/05/10 23:30:31.35 0WVRNDv3.net
>>518
webにあげるなら難読化まではしないにしても最低限圧縮するよね

528:デフォルトの名無しさん
19/05/10 23:55:31.69 tshfuAdx.net
>>526
シーンクラスに管理クラスへの参照(ポインタ)を持たせればいいんじゃないのか

529:デフォルトの名無しさん
19/05/11 03:16:15.93 xsmcwCcm.net
早速情報漏洩やらかしたの?

530:デフォルトの名無しさん
19/05/11 10:30:07.92 f5HniSEP.net
>a.insert(a.begin(),&b[0],&b[sizeof b]);

これ、添字オーバーしてるけどメモリエラーとかにならないの?

531:デフォルトの名無しさん
19/05/11 10:54:36.87 RjxICFG6.net
>>530
イテレータ範囲のendは配列の場合最後の要素の次のアドレス
それは普通の実装ではアクセスされることはない
規格的にも最後の次の要素へのポインタだけは未定義じゃない

532:デフォルトの名無しさん
19/05/11 11:55:52.83 Y1ZlGg0p.net
>>530
アクセスしてるからダメそう

533:デフォルトの名無しさん
19/05/11 12:40:07.82 3XjGQ6E0.net
[]はただのアドレス計算じゃん

534:デフォルトの名無しさん
19/05/11 12:42:52.29 DVWj7ai3.net
&p[N]はp + Nと同じって規格にあったっけ?

535:デフォルトの名無しさん
19/05/11 12:44:31.45 RjxICFG6.net
確かに&b[sizeof b]はデリファレンスしてるわ
これはあかんそう

536:デフォルトの名無しさん
19/05/11 12:56:49.51 FaKAPAIh.net
>>533
a[i]は a+i ではなく *{a+i}

537:デフォルトの名無しさん
19/05/11 13:12:17.25 2v2BzL6t.net
経験上出来るプログラマーは言語オタクが多いイメージ?(ただし浅い)

538:デフォルトの名無しさん
19/05/11 18:44:16.82 fU686pnk.net
&*pはデリファレンスなしで単にpと評価するってどっかで特別に決められてなかったっけ?

539:デフォルトの名無しさん
19/05/12 06:58:46.18 x4ccFx6b.net
>>530
int a[5];
int *p = &a[5];
というコードが有効、つまり
「配列の最終要素の次の要素」(現実には存在しないデータ)のアドレスを取れる、
という仕様から、この場合は許される、というのが >>531 の指摘か。
一般的に >>538 が成り立つなら便利だけど、調べ切れなかった。
流れの元になった >>508 を見返したら、
a.insert(a.begin(),&b[0],&b[sizeof b]);
これだと b[] の内容はベクタ a の先頭に挿入されちゃうね。

540:デフォルトの名無しさん
19/05/12 07:43:52.68 2y1+p9UL.net
>>530
>>a.insert(a.begin(),&b[0],&b[sizeof b]);
>>

>これ、添字オーバーしてるけどメモリエラーとかにならないの?
508だけど、これは
a.insert(a.begin(),&b[0],&b[sizeof b]);
こっちの間違いです。ごめんなさい。
a.insert(a.end(),&b[0],&b[sizeof b]);
&b[sizeof b]);
この部分は
b+sizeof(b)
これなら問題ない感じ?
どちらでも動くけど、たまたまいてる可能性捨てきれないから不安なんだよね。
実際のソースはsizeof(b)がbに格納されているデータのサイズを示していて、
char b[256];
int s = read( fd, b, sizeof b);
a.insert(a.end(),&b[0],&b[s]);
みたいな感じで書いてます。
んで、b最大数来た場合にちゃんと動くか気になったというわけっす。
int s = read( fd, b, (sizeof b)-1);
無難にこれの方がいいですかね?

541:デフォルトの名無しさん
19/05/12 11:19:05.13 k8bUqGvO.net
>>539
>int *p = &a[5];
これは多分だめで、ポインタ値としての存在なら許される
int *p = a+5;

542:デフォルトの名無しさん
19/05/12 11:53:09.39 nuZIUjqi.net
ややこしいからoperator <<を定義しようw

543:デフォルトの名無しさん
19/05/12 15:25:00.10 8/5ODvoI.net
VC++だと
std::vector<T> a; &a[a.size()]はoperator[]のassertionに引っかかるね

544:デフォルトの名無しさん
19/05/12 22:25:11.86 yr8YjJOU.net
std::transformって並列処理されてますか?

545:デフォルトの名無しさん
19/05/12 23:20:05.82 jFoQmc6B.net
c++17のparallel版使えば並列実行されるかもしれない

546:デフォルトの名無しさん
19/05/13 01:24:36.27 RKe/NLvg.net
visual studioでC++17にしたけどいまいち並列版の使い方が分からなかった
普通にfor回すのと、OpenMP使ってfor並列化するのと、transform(非並列)使うの比較したら
OpenMP>普通にfor≧transform だった

547:デフォルトの名無しさん
19/05/13 20:49:38.54 YS57w6Jq.net
おとなしくpthead使えよ。

548:デフォルトの名無しさん
19/05/13 20:56:12.40 WUu3P+2G.net
非並列使ったならそりゃそうなるだろ

549:デフォルトの名無しさん
19/05/16 02:02:33.17 1v50lv4I.net
struct AとAを継承したstruct Bがあって
Aの内容をBの共通部分にコピーする方法ってないですか?
A a;
B b = a;
みたいにしたいんですけど親を派生先にキャストはできないので困ってます

550:デフォルトの名無しさん
19/05/16 02:06:57.91 mZDDPYlt.net
struct B : public A
{
B* operator=(const A& a){ this->hoge = a.hoge;}
};
これ初期時にも使えるんかな

551:デフォルトの名無しさん
19/05/16 02:25:05.62 1v50lv4I.net
コピーコンストラクタが実装できたとしてメンバ変数は1個ずつコピーするしかないですかね

552:デフォルトの名無しさん
19/05/16 02:28:08.55 mZDDPYlt.net
スライシングをさせるとか?
安全に?スライシング起こす方法ってあったっけな?
なんか危ういからやろうともしなかったが

553:デフォルトの名無しさん
19/05/16 06:25:17.13 /dAesd8e.net
cloneメソッド用意するとか

554:デフォルトの名無しさん
19/05/16 06:31:42.80 ebJ8HHSX.net
>>549
初期化時は普通にコンストラクタ初期化リストで A(a) って書けるでしょ。残りのメンバをどうするのか知らんけど。
代入なら static_cast<A&>(b) = a か b.A::operator=(a) で済みそう。

555:デフォルトの名無しさん
19/05/16 06:33:37.60 C3C4SHXA.net
普通にコンストラクタかオペレーター作ればいいんじゃね
B::B(const &A)
B::operator =(const &A)
A::operator B()
雑なキャストでよければdynamic_cast<A>でおk

556:デフォルトの名無しさん
19/05/16 06:38:27.18 C3C4SHXA.net
↑dynamic_cast<B>の間違い
B b = dynamic_cast<B>(a);

557:デフォルトの名無しさん
19/05/16 11:40:14.21 74mGoL8y.net
>>551
sturctでまとめればデフォルトコピーコンストラクタが使えるけどね。
あとはintとかPODオブジェクトだけだったらmemcpyしちゃうとかも、俺はたまにやるなw

558:デフォルトの名無しさん
19/05/16 17:20:00.24 PgzYowjZ.net
549です
解決しましたありがとうございます
以下のように書いたら思っていたことが出来ました
(派生先のコンストラクタで親のデフォルトコピーコンストラクタ呼べるの知りませんでした)
代入は現状使う予定がないので大丈夫です
B::B(const &A a) : A(a) {}

559:デフォルトの名無しさん
19/05/16 18:17:29.46 mr2QiBZl.net
その内容だったら=defaultでいいよ

560:デフォルトの名無しさん
19/05/16 21:32:58.41 /aEDSlbd.net
引数付きコンストラクタって、=default使えるの?

561:デフォルトの名無しさん
19/05/16 22:09:55.18 jJO9F8Je.net
使えないよね
うかうかっと読み過ごしてたわw


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