0からの、超初心者C++相談室
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2018/11/12(月) 14:55:13.35ID:Tf74ZWQr 何にも知らない0からの出発、超初心者のためのC++相談室
653はちみつ餃子 ◆8X2XSCHEME
2023/11/26(日) 14:18:15.64ID:k38CbPq9654デフォルトの名無しさん
2023/11/26(日) 14:34:29.20ID:mssmbX4x 自己正当化しか考えてない人格破綻者に道理を教えてやる気は無い、自分で考えろ
ここを利用してる初心者は、仕様について教えてくれるはちみつには感謝すべきだが、彼はプロではないしソフトウェアを書き上げたこともほぼ無いアマチュアであって
C++の学び方や上達の仕方についてまでご高説垂れてるのを真に受けないようにね
C++は別に仕様を完璧に把握しなくても使える言語だし(そんな言語なら使い物にならない)、未定義踏みまくるのは彼のようにわざと常識に沿わないおかしなコードを書きたがる素人だけだから。
荒らす気は無いのでこれで終わりにする
ここを利用してる初心者は、仕様について教えてくれるはちみつには感謝すべきだが、彼はプロではないしソフトウェアを書き上げたこともほぼ無いアマチュアであって
C++の学び方や上達の仕方についてまでご高説垂れてるのを真に受けないようにね
C++は別に仕様を完璧に把握しなくても使える言語だし(そんな言語なら使い物にならない)、未定義踏みまくるのは彼のようにわざと常識に沿わないおかしなコードを書きたがる素人だけだから。
荒らす気は無いのでこれで終わりにする
655はちみつ餃子 ◆8X2XSCHEME
2023/11/26(日) 14:42:52.42ID:k38CbPq9 完璧に把握しろなんて一度でも俺が書いた箇所があるなら指摘してくれよ。
書いてないことを主張したかのような風評を流してお前はなにをしたいんだ?
書いてないことを主張したかのような風評を流してお前はなにをしたいんだ?
656はちみつ餃子 ◆8X2XSCHEME
2023/11/26(日) 14:55:17.55ID:k38CbPq9 資料(この場合は入門書)を読んでから手を動かして学ぶというごく普通の手順を主張してるつもりだが、むしろそうじゃない方法でどうするのがよいと考えてるんだ?
学校だって座学でやったことを演習で実践してるだろう。
学校だって座学でやったことを演習で実践してるだろう。
657デフォルトの名無しさん
2023/11/26(日) 15:50:55.41ID:DTfcWvWZ 気にするなってほぼ嫉妬なんだから
658デフォルトの名無しさん
2023/11/26(日) 16:03:14.03ID:t0WQFMSf >ほぼ嫉妬
俺に言ってんの?
いずれにせよ荒らそうとしてる自覚はあるか?
俺に言ってんの?
いずれにせよ荒らそうとしてる自覚はあるか?
659デフォルトの名無しさん
2023/11/26(日) 16:08:02.37ID:Dy8SO9u0660デフォルトの名無しさん
2023/11/26(日) 16:22:42.40ID:t0WQFMSf >>642=645=659 バレバレだからwww
661デフォルトの名無しさん
2023/11/26(日) 18:08:35.12ID:fCQnoW9K662デフォルトの名無しさん
2023/11/26(日) 18:08:55.12ID:4RSi5A29 お取り込み中すみませんが質問です
ダウンキャストという用語が是か非かです
ボクは不適切な用語だと思っていて
理由は
1) 言語の仕様に出てきていない
2) アップかダウンかについてももちろん仕様に無い
3) アップキャスト相当の操作は通常行わない
です
少なくともC++界隈でちゃんとした定義なんて出てこないですよね?
ダウンキャストという用語が是か非かです
ボクは不適切な用語だと思っていて
理由は
1) 言語の仕様に出てきていない
2) アップかダウンかについてももちろん仕様に無い
3) アップキャスト相当の操作は通常行わない
です
少なくともC++界隈でちゃんとした定義なんて出てこないですよね?
663はちみつ餃子 ◆8X2XSCHEME
2023/11/26(日) 20:14:28.93ID:k38CbPq9 >>662
仕様の中を検索してみたら何故か例示のコードのコメントとして数か所だけ upcast という用語で書いてあるんだけど……
原則としては C++ 用語ではないと考えて良いと思う。
クラスの関係をスーパー/サブだとか親/子で言うのが混乱の元という理由で基底/派生という用語になっているので
方向をアップ/ダウンで言うのもおかしな話だし。
derived-to-base convertion というような用語は仕様書の文面にもあるので
アップキャストに相当するのはこの用語のはずだけど
base-to-derived convertion という用語は出てこないので
ダウンキャストに相当する直接の用語はなさそう。
冗長でも「××から〇〇への変換」みたいな言い方が公式なんだと思う。
ところであらためて JIS を見たら derived-to-base convertion の訳語は「派生基底変換」だった……。
to が脱落したらだいぶん雰囲気が変わってしまうでないの。
これは真似しないほうがいいかもね。
ただ、 C++ 界隈の中でも、というか規格の提案や検討に関する文面の中でも
アップキャスト/ダウンキャストという用語はまあまあ使ってるっぽいので
なんだかんだで一語で表せるってのは便利なんだと思う。
私は使わないようにしているけど。
仕様の中を検索してみたら何故か例示のコードのコメントとして数か所だけ upcast という用語で書いてあるんだけど……
原則としては C++ 用語ではないと考えて良いと思う。
クラスの関係をスーパー/サブだとか親/子で言うのが混乱の元という理由で基底/派生という用語になっているので
方向をアップ/ダウンで言うのもおかしな話だし。
derived-to-base convertion というような用語は仕様書の文面にもあるので
アップキャストに相当するのはこの用語のはずだけど
base-to-derived convertion という用語は出てこないので
ダウンキャストに相当する直接の用語はなさそう。
冗長でも「××から〇〇への変換」みたいな言い方が公式なんだと思う。
ところであらためて JIS を見たら derived-to-base convertion の訳語は「派生基底変換」だった……。
to が脱落したらだいぶん雰囲気が変わってしまうでないの。
これは真似しないほうがいいかもね。
ただ、 C++ 界隈の中でも、というか規格の提案や検討に関する文面の中でも
アップキャスト/ダウンキャストという用語はまあまあ使ってるっぽいので
なんだかんだで一語で表せるってのは便利なんだと思う。
私は使わないようにしているけど。
664はちみつ餃子 ◆8X2XSCHEME
2023/11/26(日) 20:20:37.65ID:k38CbPq9 すまぬ。 綴りが間違えてた。 concertion じゃなくて conversion だった。
665デフォルトの名無しさん
2023/11/26(日) 20:28:40.49ID:4RSi5A29 レスサンクス
お手数おかけして痛み入ります
> 3) アップキャスト相当の操作は通常行わない
B *b = (B *)d; // もしもこれが必要な世界だったら
使い分ける?ための用語が欲しくなるのはまだわかるけど
D *d = (D *)b; // こっち方向にしかキャストしないんだから
区別する必要もないし、アップだのダウンだの余計なもんくっつける必要もない
…とはいえボクがいくらこう考えても
みんながそうじゃないから蔓延ってるわけで
> 私は使わないようにしているけど。
その一言で何か救われた気分になりました
お手数おかけして痛み入ります
> 3) アップキャスト相当の操作は通常行わない
B *b = (B *)d; // もしもこれが必要な世界だったら
使い分ける?ための用語が欲しくなるのはまだわかるけど
D *d = (D *)b; // こっち方向にしかキャストしないんだから
区別する必要もないし、アップだのダウンだの余計なもんくっつける必要もない
…とはいえボクがいくらこう考えても
みんながそうじゃないから蔓延ってるわけで
> 私は使わないようにしているけど。
その一言で何か救われた気分になりました
666デフォルトの名無しさん
2023/11/26(日) 20:32:07.21ID:4RSi5A29 一応補足
> B *b = (B *)d; // もしもこれが必要な世界だったら
B *b = d; // こう書くだけじゃ許されなくて
> B *b = (B *)d; // もしもこれが必要な世界だったら
B *b = d; // こう書くだけじゃ許されなくて
667デフォルトの名無しさん
2023/11/26(日) 20:37:16.38ID:Dy8SO9u0 ダウンキャストって言葉は普通に使われてると思うが…
日本語版のウィキペディアなら
C++ - Wikipedia
https://ja.wikipedia.org/wiki/C%2B%2B
に「dynamic_castは基底オブジェクトから派生オブジェクトへの変換(ダウンキャスト)を実行時に安全に行うための演算子である」とある
英語版ウィキペディアなら
Downcasting - Wikipedia
https://en.wikipedia.org/wiki/Downcasting
マイクロソフトのリファレンスなら
dynamic_cast 演算子 | Microsoft Learn
https://learn.microsoft.com/ja-jp/cpp/cpp/dynamic-cast-operator
にアップキャストとダウンキャストのことが書かれてる
日本語版のウィキペディアなら
C++ - Wikipedia
https://ja.wikipedia.org/wiki/C%2B%2B
に「dynamic_castは基底オブジェクトから派生オブジェクトへの変換(ダウンキャスト)を実行時に安全に行うための演算子である」とある
英語版ウィキペディアなら
Downcasting - Wikipedia
https://en.wikipedia.org/wiki/Downcasting
マイクロソフトのリファレンスなら
dynamic_cast 演算子 | Microsoft Learn
https://learn.microsoft.com/ja-jp/cpp/cpp/dynamic-cast-operator
にアップキャストとダウンキャストのことが書かれてる
668デフォルトの名無しさん
2023/11/26(日) 20:47:28.85ID:4RSi5A29 rustに至っては嘆かわしいことに
https://doc.rust-lang.org/std/any/trait.Any.html
> pub fn downcast<T>(self) -> Result<Box<T, A>, Box<dyn Any, A>> where T: Any,
上記トレイトのメソッド名に採用されている
あー虚しい
あーヤダヤダ
https://doc.rust-lang.org/std/any/trait.Any.html
> pub fn downcast<T>(self) -> Result<Box<T, A>, Box<dyn Any, A>> where T: Any,
上記トレイトのメソッド名に採用されている
あー虚しい
あーヤダヤダ
669デフォルトの名無しさん
2023/11/26(日) 20:59:53.00ID:mssmbX4x >>667
使われてるけど規格に定義があるような正式な用語ではないってことだろ
使われてるけど規格に定義があるような正式な用語ではないってことだろ
670はちみつ餃子 ◆8X2XSCHEME
2023/11/26(日) 21:20:56.75ID:k38CbPq9 >>665
むしろアップ/ダウンだけでは状況を充分に表せないんじゃないかな。
ポインタを経由せずに値を直接キャストすることもありうるし
参照の場合かもしれない。
class foo {};
struct bar : public foo {};
int main() {
auto a = bar();
// bar から foo へのアップキャストってどれのこと?
auto b = static_cast<foo>(a);
auto c = static_cast<foo *>(&a);
auto &d = static_cast<foo &>(a);
}
むしろアップ/ダウンだけでは状況を充分に表せないんじゃないかな。
ポインタを経由せずに値を直接キャストすることもありうるし
参照の場合かもしれない。
class foo {};
struct bar : public foo {};
int main() {
auto a = bar();
// bar から foo へのアップキャストってどれのこと?
auto b = static_cast<foo>(a);
auto c = static_cast<foo *>(&a);
auto &d = static_cast<foo &>(a);
}
671デフォルトの名無しさん
2023/11/26(日) 21:48:36.05ID:Dy8SO9u0672デフォルトの名無しさん
2023/11/26(日) 21:52:47.74ID:DTfcWvWZ >>663
>仕様の中を検索してみたら何故か例示のコードのコメントとして数か所だけ upcast という用語で書いてあるんだけど……
>原則としては C++ 用語ではないと考えて良いと思う。
>クラスの関係をスーパー/サブだとか親/子で言うのが混乱の元という理由で基底/派生という用語になっているので
>方向をアップ/ダウンで言うのもおかしな話だし。
upcastとdowncastって一般名詞なのではないかな?
>仕様の中を検索してみたら何故か例示のコードのコメントとして数か所だけ upcast という用語で書いてあるんだけど……
>原則としては C++ 用語ではないと考えて良いと思う。
>クラスの関係をスーパー/サブだとか親/子で言うのが混乱の元という理由で基底/派生という用語になっているので
>方向をアップ/ダウンで言うのもおかしな話だし。
upcastとdowncastって一般名詞なのではないかな?
673デフォルトの名無しさん
2023/11/26(日) 21:57:36.24ID:mssmbX4x >>671
デファクトスタンダードだとは思うよ、個人的には使うことに全然否定的ではない
デファクトスタンダードだとは思うよ、個人的には使うことに全然否定的ではない
674デフォルトの名無しさん
2023/11/26(日) 22:15:54.01ID:Dy8SO9u0675はちみつ餃子 ◆8X2XSCHEME
2023/11/26(日) 23:34:44.38ID:k38CbPq9 言語仕様の説明をするときには >>670 のようなバリエーションの内のどれのことを言っているかで
事情が変わってくるので結局は具体的な場合を示さなければならず、
「アップキャスト」「ダウンキャスト」という用語で充分に説明できない。
(より詳細な場合分けをするので用語を使う機会がない。)
逆に言うなら「アップキャスト」「ダウンキャスト」という用語を使うときは
充分な補足説明が必要で、それをちゃんとやってるか? ってことでもある。
どうせ説明を付け足すなら用語の甲斐がないので
使う意味もそんなにないように思う。
念のために補足しておくけど、これは「言語仕様を説明するなら」という前提なので
そうではない状況で文脈を共有できていて
「アップキャスト」「ダウンキャスト」という用語で通じるという確信がある場面に対する意見ではないよ。
事情が変わってくるので結局は具体的な場合を示さなければならず、
「アップキャスト」「ダウンキャスト」という用語で充分に説明できない。
(より詳細な場合分けをするので用語を使う機会がない。)
逆に言うなら「アップキャスト」「ダウンキャスト」という用語を使うときは
充分な補足説明が必要で、それをちゃんとやってるか? ってことでもある。
どうせ説明を付け足すなら用語の甲斐がないので
使う意味もそんなにないように思う。
念のために補足しておくけど、これは「言語仕様を説明するなら」という前提なので
そうではない状況で文脈を共有できていて
「アップキャスト」「ダウンキャスト」という用語で通じるという確信がある場面に対する意見ではないよ。
676デフォルトの名無しさん
2023/11/27(月) 04:54:45.36ID:tiJqQBXv オナニー解答
677デフォルトの名無しさん
2023/11/27(月) 08:10:08.19ID:8c8BDf1i 相変わらずはちみちはめんどくせーな
678デフォルトの名無しさん
2023/11/27(月) 09:35:39.43ID:7/k6/GSg679デフォルトの名無しさん
2023/11/27(月) 09:39:16.20ID:7/k6/GSg680デフォルトの名無しさん
2023/11/27(月) 09:41:27.50ID:7/k6/GSg >>662
「ダブルポインタ」ってのも可笑しな使われ方してることが数多く観測される
「ダブルポインタ」ってのも可笑しな使われ方してることが数多く観測される
681デフォルトの名無しさん
2023/11/27(月) 09:52:51.04ID:7/k6/GSg >>675-677
アスペ臭を感じる
アスペ臭を感じる
682デフォルトの名無しさん
2023/11/27(月) 14:40:19.25ID:UqO8a829 アスペルガー症候群だって良いじゃないか?
何で差別的なことを書くのかね?
何で差別的なことを書くのかね?
683デフォルトの名無しさん
2023/11/28(火) 00:01:54.69ID:5UazaCro クラス内からのみ参照する定数配列のベストな書き方を模索しています。
まず
1、constメンバ変数にする方法。ヘッダに書くだけで手軽だが、オブジェクト生成のたびに領域が取られてしまい資源浪費。
2、staticメンバにする方法。
.h
static const int TABLE[3];
.cpp
const int TABLE[3]={1,2,3};
エラー。ほかに、{1,2,3}の場所をhに移動してみたりしたがすべてエラーになり断念。
3、cppにのみに書きhには書かない。
.cpp
const int TABLE[3]={1,2,3};
エラーにならず良好。ただこれだとクラス無関係のC風の書き方なので、別の翻訳単位とよ間で名前の衝突が起きうる?
名前の衝突なく、メモリ占有はただ一個で、資源節約につながるならconstexprも活用したい。ベストな書き方はどうなりますか。
constexprは上のconstを置き換えて試しましたが2ではエラー解消せずでした。
まず
1、constメンバ変数にする方法。ヘッダに書くだけで手軽だが、オブジェクト生成のたびに領域が取られてしまい資源浪費。
2、staticメンバにする方法。
.h
static const int TABLE[3];
.cpp
const int TABLE[3]={1,2,3};
エラー。ほかに、{1,2,3}の場所をhに移動してみたりしたがすべてエラーになり断念。
3、cppにのみに書きhには書かない。
.cpp
const int TABLE[3]={1,2,3};
エラーにならず良好。ただこれだとクラス無関係のC風の書き方なので、別の翻訳単位とよ間で名前の衝突が起きうる?
名前の衝突なく、メモリ占有はただ一個で、資源節約につながるならconstexprも活用したい。ベストな書き方はどうなりますか。
constexprは上のconstを置き換えて試しましたが2ではエラー解消せずでした。
684デフォルトの名無しさん
2023/11/28(火) 00:04:59.65ID:5UazaCro 2のcppは
const int クラス名::TABLE[3]={1,2,3};
も試したはずですがエラー解消しませんでした。
const int クラス名::TABLE[3]={1,2,3};
も試したはずですがエラー解消しませんでした。
685デフォルトの名無しさん
2023/11/28(火) 00:37:23.98ID:dISnZSIc 2で通るはずだけどなぁ・・・ヘッダインクルードしてないとか?はさすがに無いか
あとC++17以降ならstatic constexprにすれば暗黙的にinline変数(定数)になるのでなお通るはず(宣言と同時に=ヘッダで定義できる)
あとC++17以降ならstatic constexprにすれば暗黙的にinline変数(定数)になるのでなお通るはず(宣言と同時に=ヘッダで定義できる)
686デフォルトの名無しさん
2023/11/28(火) 01:08:09.85ID:dISnZSIc あ、ごめん2で通るはずってのはcpp側がクラス名::TABLEの場合
687デフォルトの名無しさん
2023/11/28(火) 06:02:30.27ID:fb4KLmhh 2、staticメンバにする方法。
.h
static const int TABLE[3]={1,2,3};
.cpp
extern const int TABLE[3];
もれはやらんけど
.h
static const int TABLE[3]={1,2,3};
.cpp
extern const int TABLE[3];
もれはやらんけど
688デフォルトの名無しさん
2023/11/28(火) 06:13:38.37ID:fb4KLmhh あ、ごめん逆だった
.cpp
static const int TABLE[3]={1,2,3};
.h
extern const int TABLE[3];
.cpp
static const int TABLE[3]={1,2,3};
.h
extern const int TABLE[3];
689デフォルトの名無しさん
2023/11/28(火) 10:21:56.36ID:tbacT9e+ >>684
これは通るだろ? コンパイラは何よ?
これは通るだろ? コンパイラは何よ?
690はちみつ餃子 ◆8X2XSCHEME
2023/11/28(火) 10:25:57.66ID:mRTkdYl9 >>684
出来なかったというコードをそのまま提示して欲しい。
状況がよくわからないのに想像で対処法を考えてもしょうがない。
コードがちょっと長くなるなら
codetter とか wandbox とか ideone とかを使って。
出来なかったというコードをそのまま提示して欲しい。
状況がよくわからないのに想像で対処法を考えてもしょうがない。
コードがちょっと長くなるなら
codetter とか wandbox とか ideone とかを使って。
691デフォルトの名無しさん
2023/11/28(火) 10:27:57.27ID:vcMwjchf クラス内の定数を外部に生出しとかしないから
enunとかで宣言はするけど
何番目が欲しいとかはサービス関数作るしなぁ
enunとかで宣言はするけど
何番目が欲しいとかはサービス関数作るしなぁ
692デフォルトの名無しさん
2023/11/28(火) 10:30:15.59ID:vcMwjchf つか、static宣言の内部でしか使わないものを何でヘッダーファイルに書くの?
693デフォルトの名無しさん
2023/11/28(火) 10:32:49.40ID:vcMwjchf ヘッダーファイルはクラスコードの名刺みたいなもんで
外部にこう言う事が出来ますよってPRする為のファイルなんだから、普通は内部で完結してるものは書かないよ
外部にこう言う事が出来ますよってPRする為のファイルなんだから、普通は内部で完結してるものは書かないよ
694デフォルトの名無しさん
2023/11/28(火) 10:35:09.02ID:vcMwjchf マジックナンバー避ける為に#defineするとかも、cpp側の先頭に書くと、全ビルドしなくて済むしな
695デフォルトの名無しさん
2023/11/28(火) 11:07:40.67ID:t7+ip2Xg696デフォルトの名無しさん
2023/11/28(火) 11:35:51.07ID:vcMwjchf >>695
staticより「内部でしか使わない」って話の方を拾ってね
staticより「内部でしか使わない」って話の方を拾ってね
697デフォルトの名無しさん
2023/11/28(火) 12:43:41.53ID:dISnZSIc >>696
質問者は「クラス内からのみ参照する」って言ってただろ
質問者は「クラス内からのみ参照する」って言ってただろ
698デフォルトの名無しさん
2023/11/28(火) 18:17:05.00ID:vcMwjchf >>697
それならヘッダーファイルに書く必要無いやんけw
それならヘッダーファイルに書く必要無いやんけw
699デフォルトの名無しさん
2023/11/28(火) 18:50:50.78ID:dISnZSIc そら綺麗に一つのcppに全部そのクラスの実装を切り分けてるならcpp内にstaticでいいだろうけどね
700デフォルトの名無しさん
2023/11/28(火) 20:09:09.84ID:vcMwjchf そんな巨大なクラスは設計が間違ってないか?
701デフォルトの名無しさん
2023/11/28(火) 20:12:44.23ID:bqHRuT95 >>680
> 「ダブルポインタ」ってのも可笑しな使われ方してることが数多く観測される
それなw
初心者ほどこの用語を使ってるように見える
初心者が集まるところでこれを流布してるやつがおるんやろな
ポインタへのポインタっていうスケーラブルな定義が理解できてなくて
アスタリスクいっこのポインタと、二個のぽいんたがある!って感じなんやろな
> 「ダブルポインタ」ってのも可笑しな使われ方してることが数多く観測される
それなw
初心者ほどこの用語を使ってるように見える
初心者が集まるところでこれを流布してるやつがおるんやろな
ポインタへのポインタっていうスケーラブルな定義が理解できてなくて
アスタリスクいっこのポインタと、二個のぽいんたがある!って感じなんやろな
702はちみつ餃子 ◆8X2XSCHEME
2023/11/28(火) 20:20:10.37ID:mRTkdYl9703デフォルトの名無しさん
2023/11/28(火) 20:27:35.33ID:dISnZSIc >>700
巨大とかじゃなくて、あんたの考えてるであろう1ヘッダに1ソースってのも指針としてはもちろん良いんだけど(そして質問者のケースに合ってるならいいけど)
例えばクラステンプレートになると、ソースに実装を書けないからヘッダのどこか(ヘッダからインクルードしてユーザーに見え辛い場所には出来るが)で実装を書くことになる
そうなるとその実装からソースファイル内のstaticな値など見えるわけがないだろ
巨大とかじゃなくて、あんたの考えてるであろう1ヘッダに1ソースってのも指針としてはもちろん良いんだけど(そして質問者のケースに合ってるならいいけど)
例えばクラステンプレートになると、ソースに実装を書けないからヘッダのどこか(ヘッダからインクルードしてユーザーに見え辛い場所には出来るが)で実装を書くことになる
そうなるとその実装からソースファイル内のstaticな値など見えるわけがないだろ
704デフォルトの名無しさん
2023/11/28(火) 20:29:47.21ID:dISnZSIc >>702
もちろんそれもある
もちろんそれもある
705デフォルトの名無しさん
2023/11/28(火) 20:57:18.00ID:dISnZSIc まぁどれを選ぶかは本人の都合だけど、クラス定義の中にprivateで書くのが自然っちゃ自然な希ガス
706デフォルトの名無しさん
2023/11/28(火) 21:00:29.03ID:HOP5xTTo >例えばクラステンプレートになると、ソースに実装を書けないから
C++の設計ミスだな
特にテンプレ
C++の設計ミスだな
特にテンプレ
707デフォルトの名無しさん
2023/11/28(火) 21:55:43.79ID:vcMwjchf テンプレートは単なる#defineだからなぁ
あんなもん#defineでの置き換えによる副作用を引き起こす悪習の最たるもんだよ
あんなもん#defineでの置き換えによる副作用を引き起こす悪習の最たるもんだよ
708はちみつ餃子 ◆8X2XSCHEME
2023/11/28(火) 22:43:12.61ID:mRTkdYl9 一応はモジュールの概念の導入でちょっと良くなっているはずだが皆でこぞって移行するってほどには全然なってないからそこまで魅力的とは思われてないんやろね。
従来のスタイルと共存できるようにするのは C++ の立場では当然ではあるものの、悪い部分も捨てきれないことになりがち。
コンパイラのサポートもあまり熱心ではない(?)ような雰囲気だからそこも不安だし。
従来のスタイルと共存できるようにするのは C++ の立場では当然ではあるものの、悪い部分も捨てきれないことになりがち。
コンパイラのサポートもあまり熱心ではない(?)ような雰囲気だからそこも不安だし。
709デフォルトの名無しさん
2023/11/28(火) 23:00:59.77ID:5UazaCro どうも>>683です。
2のクラス名あり版でビルド通りました。
-sample.h
class sample_1 {
int a;
static const int TBL[3];
public:
sample_1();
};
-sample.cpp
#include "sample.h"
#include <iostream>
const int sample_1::TBL[3] = {1,2,3};
sample_1::sample_1() {
a = 2;
std::cout << TBL[a] << std::endl;
}
-main.cpp
#include <iostream>
#include "sample.h"
int main() {
sample_1 sa;
return 0;
}
2のクラス名あり版でビルド通りました。
-sample.h
class sample_1 {
int a;
static const int TBL[3];
public:
sample_1();
};
-sample.cpp
#include "sample.h"
#include <iostream>
const int sample_1::TBL[3] = {1,2,3};
sample_1::sample_1() {
a = 2;
std::cout << TBL[a] << std::endl;
}
-main.cpp
#include <iostream>
#include "sample.h"
int main() {
sample_1 sa;
return 0;
}
710デフォルトの名無しさん
2023/11/28(火) 23:06:12.31ID:5UazaCro sample.hにTBL宣言なしで、
sample.cpp
#include "sample.h"
#include <iostream>
static const int TBL[3] = {1,2,3};
sample_1::sample_1() {
a = 2;
std::cout << TBL[a] << std::endl;
}
でもOKでした。こちらのstaticはC式の使い方ですね。
私はTBLが.hに現れない上の書き方がいいと思いますが、これを最適としてよさそうですか。
sample.cpp
#include "sample.h"
#include <iostream>
static const int TBL[3] = {1,2,3};
sample_1::sample_1() {
a = 2;
std::cout << TBL[a] << std::endl;
}
でもOKでした。こちらのstaticはC式の使い方ですね。
私はTBLが.hに現れない上の書き方がいいと思いますが、これを最適としてよさそうですか。
711デフォルトの名無しさん
2023/11/28(火) 23:19:21.29ID:dISnZSIc 解決おめ、自分の用途に合うと感じるならそれがベストと思うよ
712デフォルトの名無しさん
2023/11/29(水) 06:23:02.71ID:n75oaT1g h に static 描くと単に相互干渉しないってだけで
インスタンスは造られまくって無駄リソース出まくるんじゃね
インスタンスは造られまくって無駄リソース出まくるんじゃね
713デフォルトの名無しさん
2023/11/29(水) 09:24:39.36ID:5+1qDy8t 奴は人の書き込み見ちゃいないよw
714デフォルトの名無しさん
2023/11/30(木) 22:28:52.60ID:p6G1t8dm sizeof(クラス名)を活用できる場面はありますか。
メンバによってはCのsizeof(構造体名)と同じ使い方ができると思いますが、
クラス一般について考えると思いつきません。
たとえば
std::string name;
がメンバ変数にあるともう、クラスのサイズは不定になりそうです。
あっ、new は・・・いや、mallocと違ってサイズ指定は不要ですね。
メンバによってはCのsizeof(構造体名)と同じ使い方ができると思いますが、
クラス一般について考えると思いつきません。
たとえば
std::string name;
がメンバ変数にあるともう、クラスのサイズは不定になりそうです。
あっ、new は・・・いや、mallocと違ってサイズ指定は不要ですね。
715デフォルトの名無しさん
2023/11/30(木) 22:39:03.15ID:jq+Wc58z716はちみつ餃子 ◆8X2XSCHEME
2023/11/30(木) 23:39:52.07ID:3QI4e6Tt >>714
sizeof 演算子の適用結果は定数であることが保証される。
定数式として使うことができる。
std::string なども型の大きさが変動したりはしない。
C ではオペランドが VLA のときは sizeof の結果は定数にならないのだけれど C++ には VLA がないのでそういう例外はない。
(実際には処理系の拡張として VLA を使える場合もある。)
メモリアロケーションまわりを自分でコントロールする機会があれば普通のクラスの大きさを知る必要がある場合もなくはない。
それほど機会は多くないだろうけど。
本来 (?) の用途とは違うところで使われる場合もあって、
いわゆる SFINAE のトリックで sizeof が使われることもそれなりにある。
sizeof 演算子の適用結果は定数であることが保証される。
定数式として使うことができる。
std::string なども型の大きさが変動したりはしない。
C ではオペランドが VLA のときは sizeof の結果は定数にならないのだけれど C++ には VLA がないのでそういう例外はない。
(実際には処理系の拡張として VLA を使える場合もある。)
メモリアロケーションまわりを自分でコントロールする機会があれば普通のクラスの大きさを知る必要がある場合もなくはない。
それほど機会は多くないだろうけど。
本来 (?) の用途とは違うところで使われる場合もあって、
いわゆる SFINAE のトリックで sizeof が使われることもそれなりにある。
717デフォルトの名無しさん
2023/11/30(木) 23:55:15.59ID:p6G1t8dm >>716
高度な領域では使う場面はあるが、入門者には当分、なさそうですね。ありがとう。
高度な領域では使う場面はあるが、入門者には当分、なさそうですね。ありがとう。
718デフォルトの名無しさん
2023/12/01(金) 10:06:48.86ID:NZuUNSBe おまえら、stdとboostどう使い分けてる?
719デフォルトの名無しさん
2023/12/01(金) 13:58:15.55ID:aU4DjGEJ720デフォルトの名無しさん
2023/12/02(土) 07:29:47.55ID:qIqFVuKn まず鍵を与え、文字列を暗号化等して暗号文文字列を返したい。
暗号化ユーティリティ風のクラスをつくり、鍵とstringを渡す案 (1)と、stringを継承して鍵保持メンバ関数と暗号化メンバ関数を追加する案(2)を思いつきました。
どちらがでも実現できるように思いますが、何か設計のポイントはありますかね。
暗号化等には既製ライブラリ使います。
暗号化ユーティリティ風のクラスをつくり、鍵とstringを渡す案 (1)と、stringを継承して鍵保持メンバ関数と暗号化メンバ関数を追加する案(2)を思いつきました。
どちらがでも実現できるように思いますが、何か設計のポイントはありますかね。
暗号化等には既製ライブラリ使います。
721はちみつ餃子 ◆8X2XSCHEME
2023/12/02(土) 09:03:43.92ID:w8ZlbPjQ >>720
設計は総合的な判断だから単発の事情では判断しづらいというのは前置きとして書いておくけど、原則的には非メンバ関数として実装するほうがよい。
というよりも継承を使うほうが悪い。
「こういうメンバ関数があると便利」ということだけが理由なら継承を使うのは好ましくない。
プロジェクトの中で使う文字列を暗号化機能付きの文字列クラスで一貫して扱うならそれはそれでそんなに悪くないけど、通常は std::string 型のオブジェクトがあってそれを暗号化したいだけなのに別の型に変換にするという手間をかけるのがユーザーにとって便利だと思う?
設計は総合的な判断だから単発の事情では判断しづらいというのは前置きとして書いておくけど、原則的には非メンバ関数として実装するほうがよい。
というよりも継承を使うほうが悪い。
「こういうメンバ関数があると便利」ということだけが理由なら継承を使うのは好ましくない。
プロジェクトの中で使う文字列を暗号化機能付きの文字列クラスで一貫して扱うならそれはそれでそんなに悪くないけど、通常は std::string 型のオブジェクトがあってそれを暗号化したいだけなのに別の型に変換にするという手間をかけるのがユーザーにとって便利だと思う?
722はちみつ餃子 ◆8X2XSCHEME
2023/12/02(土) 11:45:21.73ID:w8ZlbPjQ 他の選択肢としてはストリームのアダプタにするとかいう方法も思いつく。
極端に大きなデータ (メモリに格納するには無理のある大きさ) にも対処したい場合は入出力と並行して処理することになるから、普通にストリームに書き出すのと同じように使ったら勝手に暗号化されてるというのは使う側としては楽でいい。
自分が使うものならそういう余計な抽象化層を挟むのは手間なだけかもしれないし、匙加減は微妙なところ。
極端に大きなデータ (メモリに格納するには無理のある大きさ) にも対処したい場合は入出力と並行して処理することになるから、普通にストリームに書き出すのと同じように使ったら勝手に暗号化されてるというのは使う側としては楽でいい。
自分が使うものならそういう余計な抽象化層を挟むのは手間なだけかもしれないし、匙加減は微妙なところ。
723デフォルトの名無しさん
2023/12/02(土) 12:16:48.61ID:0tC7Yjqi sqliteとかの(暗号化もあるけど)暗号化しないバージョンのDBを使ってて
書き込むとき勝手に暗号化してくれると有難いな
書き込むとき勝手に暗号化してくれると有難いな
724デフォルトの名無しさん
2023/12/02(土) 13:25:55.77ID:JgaBxQHi ここはプログラム技術板だぞ 自分で作れ
725デフォルトの名無しさん
2023/12/03(日) 06:49:36.39ID:xZHPSaOR このスレはC++の話ではない書き込みが多すぎる
726デフォルトの名無しさん
2023/12/03(日) 11:07:00.27ID:QTewqrs7 C++の守備範囲が広いんよ
727デフォルトの名無しさん
2023/12/03(日) 21:36:41.23ID:kkqQUehZ >>721
ありがとう。
非メンバ関数として実装、と見て最初はなぜ?と思いましたが、確かに文字列変換だけでクラスオブジェクトはいらないですね。
string 暗号化(鍵, 平文);
だけあれば十分だと。
ありがとう。
非メンバ関数として実装、と見て最初はなぜ?と思いましたが、確かに文字列変換だけでクラスオブジェクトはいらないですね。
string 暗号化(鍵, 平文);
だけあれば十分だと。
728デフォルトの名無しさん
2023/12/04(月) 21:09:04.65ID:wzr7hFvb msys2で開発環境を作りたくて
Windows10上にmsys2をインストールしてそのうえにpacmanからmingw-w64-x86_64-toolchainの最新版をインストールして
g++でコンパイルしてHello Worldを出力するところまではうまく行ったのですが
std::ifstream ifs("hoge.txt");
のような実行ファイルと同じ場所にある、あらかじめ用意したテキストファイルを読み込むだけのコードを書いてもファイルの読み込みに失敗します。
fstreamだけの問題ではなくfilesystemあたりをインクルードして適当な関数でテストしてもファイルが存在しないことになっていました。
どこで質問するのが適切なのかも見当がつかない状態なのですが原因に心当たりがある方がもしいらっしゃったら教えて頂けないでしょうか?
Windows10上にmsys2をインストールしてそのうえにpacmanからmingw-w64-x86_64-toolchainの最新版をインストールして
g++でコンパイルしてHello Worldを出力するところまではうまく行ったのですが
std::ifstream ifs("hoge.txt");
のような実行ファイルと同じ場所にある、あらかじめ用意したテキストファイルを読み込むだけのコードを書いてもファイルの読み込みに失敗します。
fstreamだけの問題ではなくfilesystemあたりをインクルードして適当な関数でテストしてもファイルが存在しないことになっていました。
どこで質問するのが適切なのかも見当がつかない状態なのですが原因に心当たりがある方がもしいらっしゃったら教えて頂けないでしょうか?
729デフォルトの名無しさん
2023/12/04(月) 22:11:21.42ID:+6ZMbPCa エラーメッセージは?
730はちみつ餃子 ◆8X2XSCHEME
2023/12/05(火) 00:16:37.88ID:z5PiblaY msys2 環境は数種類のモードがあるはずだがどれで起動した?
731デフォルトの名無しさん
2023/12/05(火) 04:57:07.09ID:DXGBHl1O 実行ファイルの場所がカレントになってないんだろ
getcwd()してみ
getcwd()してみ
732728
2023/12/12(火) 14:02:16.36ID:haJQSzRG エラーは何もなくて変数に何も格納されてない状態だったので原因よくわかりませんでしたが
今回は>>731さんの言う通りになっていて解決できました
まだmsys2自体の仕様も十分に理解してなくて手が回っていない状態なのでこれでいったん失礼します
ありがとうございました!
今回は>>731さんの言う通りになっていて解決できました
まだmsys2自体の仕様も十分に理解してなくて手が回っていない状態なのでこれでいったん失礼します
ありがとうございました!
733デフォルトの名無しさん
2023/12/12(火) 15:14:22.81ID:bMo3JLCK GUIから起動するとカレントディレクトリがホームになるんだったっけ?
734デフォルトの名無しさん
2023/12/13(水) 15:23:50.85ID:Xh1qTD5r OSの事情でカレントが簡単に移動してしまうのがめんどいな
735デフォルトの名無しさん
2023/12/13(水) 16:17:33.78ID:b3+IUHNQ プログラムの実行に必要な設定ファイルやデータファイルはカレントディレクトリではなく実行ファイルのパスを基準に決めたほうがいいね
736はちみつ餃子 ◆8X2XSCHEME
2023/12/13(水) 17:12:54.61ID:vPv7AHCs 設定ファイルの類いは AppData フォルダに置くのがこのましいということになってる。
アプリケーションインストール用のフォルダ Program Files は書き込み権限が制限されているからそこに設定ファイルは置けない。
逆にどうしてもアプリケーションと設定ファイルを同じフォルダに置きたいなら Program Files にはインストールできない。
Msys2 内で使うソフトならホームディレクトリ (windows のホームディレクトリではなく msys2 が設定するホームディレクトリ、環境変数 HOME で取得できる) に設定ファイルを置くのが基本的な習慣。
アプリケーションインストール用のフォルダ Program Files は書き込み権限が制限されているからそこに設定ファイルは置けない。
逆にどうしてもアプリケーションと設定ファイルを同じフォルダに置きたいなら Program Files にはインストールできない。
Msys2 内で使うソフトならホームディレクトリ (windows のホームディレクトリではなく msys2 が設定するホームディレクトリ、環境変数 HOME で取得できる) に設定ファイルを置くのが基本的な習慣。
737デフォルトの名無しさん
2023/12/13(水) 17:14:51.41ID:Xh1qTD5r 起動時の引数や 自分のフルパスを取得するAPI経由で
実行ファイルのある場所を基点にどうこうすることが多いわ (Windows
unix だと usr と bin で分ける文化があるからそういうのはどうなってるんやろか
起動時のカレントのまま?
実行ファイルのある場所を基点にどうこうすることが多いわ (Windows
unix だと usr と bin で分ける文化があるからそういうのはどうなってるんやろか
起動時のカレントのまま?
738デフォルトの名無しさん
2023/12/13(水) 17:20:10.83ID:b3+IUHNQ739デフォルトの名無しさん
2023/12/13(水) 17:23:03.86ID:HyXW4bJ5 カレントじゃ無くて、アプリが実行されたディレクトリに一緒に置いとくもんだろ?
ユーザー毎に違う設定にしたいなら、各ユーザーのホームディレクトリだろ?
ユーザー毎に違う設定にしたいなら、各ユーザーのホームディレクトリだろ?
740はちみつ餃子 ◆8X2XSCHEME
2023/12/13(水) 18:03:20.75ID:vPv7AHCs >>739
基本的にはそうだけどパッケージマネージャの管理方式との相性があったりする。
scoop で管理するなら設定ファイルも含めてひとつのフォルダに入れるほうが都合が良いと思う。
Msys2 内で pacman で管理するなら unix 風の流儀のほうが自然だし。
基本的にはそうだけどパッケージマネージャの管理方式との相性があったりする。
scoop で管理するなら設定ファイルも含めてひとつのフォルダに入れるほうが都合が良いと思う。
Msys2 内で pacman で管理するなら unix 風の流儀のほうが自然だし。
741デフォルトの名無しさん
2023/12/13(水) 23:12:49.25ID:zjCiNOvz グローバル位置に宣言したオブジェクトはmain前にコンストラクタが実行されますね。
仕様ではmain前に実行ということのほかに何か規定はありますか。
ある処理系で、main先頭である処理を呼び出すと成功するが、その処理を上記のコンストラクタから呼び出すと失敗するということがありました。
仕様ではmain前に実行ということのほかに何か規定はありますか。
ある処理系で、main先頭である処理を呼び出すと成功するが、その処理を上記のコンストラクタから呼び出すと失敗するということがありました。
742はちみつ餃子 ◆8X2XSCHEME
2023/12/14(木) 00:23:02.09ID:GWgG2Hfk >>741
ややこしい規則が色々あってここには書ききれないがおおざっぱにはこんな感じかな。
・ 定数初期化が終わってから動的初期化がされる
・ 動的初期化でも条件が揃ったときは静的初期化扱いで早めに初期化する最適化をしてもよい (しなくてもよい)
・ 翻訳単位内の初期化順序は定義が現れた順序
・ 翻訳単位をまたぐとどちらが先に初期化されるかは規定されていない
特に翻訳単位を跨いだら決まってないってのは引っかかりがちなポイントで、
強い依存関係のあるものはあまり細かく分割しないほうがやりやすいと思う。
ややこしい規則が色々あってここには書ききれないがおおざっぱにはこんな感じかな。
・ 定数初期化が終わってから動的初期化がされる
・ 動的初期化でも条件が揃ったときは静的初期化扱いで早めに初期化する最適化をしてもよい (しなくてもよい)
・ 翻訳単位内の初期化順序は定義が現れた順序
・ 翻訳単位をまたぐとどちらが先に初期化されるかは規定されていない
特に翻訳単位を跨いだら決まってないってのは引っかかりがちなポイントで、
強い依存関係のあるものはあまり細かく分割しないほうがやりやすいと思う。
743デフォルトの名無しさん
2023/12/14(木) 01:04:36.74ID:X6Ol8Z5z 普通は、WSL2 でLinux を使う
MSYS2/MinGW の利点は、
hypervisor で、2つのOS を起動しないから軽い
WSL2 では、Linux側から、Windows 側のアプリも起動できる。
ただし例えば、powershell ではなく、powershell.exe と拡張子も付ける
例えばpowershellで、Windows側のフォルダ内の一覧を表示して、Linuxのgrep で絞り込む
/mnt/c/Users/ユーザー名/Documents$ powershell.exe ls | grep クイ
出力
d----- 2015/10/13 13:52 クイズ
VSCode の拡張機能・Code Runner は、
右クリックメニューから、選択したコード、またはファイル全体を実行する
この設定をチェックしておく
Code-runner: File Directory As Cwd
Whether to use the directory of the file to be executed as the working directory.
そうすると実行時にcd で、そのファイルがある場所へ、カレントディレクトリを移動してから、
そのファイルをコンパイルして実行する
設定項目、executorMap には、多くの言語の実行コマンドが書いてある。
"code-runner.executorMap": {
"c": "cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
"cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
MSYS2/MinGW の利点は、
hypervisor で、2つのOS を起動しないから軽い
WSL2 では、Linux側から、Windows 側のアプリも起動できる。
ただし例えば、powershell ではなく、powershell.exe と拡張子も付ける
例えばpowershellで、Windows側のフォルダ内の一覧を表示して、Linuxのgrep で絞り込む
/mnt/c/Users/ユーザー名/Documents$ powershell.exe ls | grep クイ
出力
d----- 2015/10/13 13:52 クイズ
VSCode の拡張機能・Code Runner は、
右クリックメニューから、選択したコード、またはファイル全体を実行する
この設定をチェックしておく
Code-runner: File Directory As Cwd
Whether to use the directory of the file to be executed as the working directory.
そうすると実行時にcd で、そのファイルがある場所へ、カレントディレクトリを移動してから、
そのファイルをコンパイルして実行する
設定項目、executorMap には、多くの言語の実行コマンドが書いてある。
"code-runner.executorMap": {
"c": "cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
"cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
744デフォルトの名無しさん
2023/12/31(日) 22:48:46.98ID:tpduSr4A 相談室から誘導されたのでこちらで
http://mevius.5ch.net/test/read.cgi/tech/1698705458/104
buf_にPODではないオブジェクトが含まれる可能性がある場合、この領域をどのようにcopyしたりmoveすればよいでしょうか?
http://mevius.5ch.net/test/read.cgi/tech/1698705458/104
buf_にPODではないオブジェクトが含まれる可能性がある場合、この領域をどのようにcopyしたりmoveすればよいでしょうか?
745デフォルトの名無しさん
2024/01/01(月) 01:29:30.25ID:/rCM9JK/ このスレッドはゼロからC++と言っているが、C言語を知っている前提になっているよなw
746デフォルトの名無しさん
2024/01/02(火) 11:00:49.80ID:TDOOgc4U ワシも割と長く底辺コピペプログラマだけどなんでそんな詳しくなれるの?ってなる
有能と俺みたいな無能はどこでプログラマの生き方をたがえたのか
有能と俺みたいな無能はどこでプログラマの生き方をたがえたのか
747デフォルトの名無しさん
2024/01/02(火) 20:21:16.21ID:G9bvfkvl748はちみつ餃子 ◆8X2XSCHEME
2024/01/02(火) 21:40:20.68ID:RkRzwbey 知識は入れないと増えないというすごく当たり前の話。
長く放置してたら勝手に増えるなんてことはないよ。
長く放置してたら勝手に増えるなんてことはないよ。
749デフォルトの名無しさん
2024/01/03(水) 08:18:02.54ID:3n4RUKo6 ガキの頃からマイコンBASICマガジン見てたけど
PCなかったしポケコンはあったからたまにあるポケコンゲームのソースをポチポチ入力してたけどそれで何かの知識になったか言われたら何にもならんかったな
PCなかったしポケコンはあったからたまにあるポケコンゲームのソースをポチポチ入力してたけどそれで何かの知識になったか言われたら何にもならんかったな
750デフォルトの名無しさん
2024/01/03(水) 08:26:31.48ID:uKn1SmuA 糞コテが
751デフォルトの名無しさん
2024/01/03(水) 13:07:46.32ID:3mJitcl/ >>749
SHARPのポケコンでマシン語使ってシューティングゲーム作ったけど?
SHARPのポケコンでマシン語使ってシューティングゲーム作ったけど?
752デフォルトの名無しさん
2024/01/03(水) 13:17:11.92ID:SgwYv7hO ポケコン触ってたころが一番楽しかったです
手の中に物理キーボードと実行環境があるんだもん
一生遊べるよ
手の中に物理キーボードと実行環境があるんだもん
一生遊べるよ
■ このスレッドは過去ログ倉庫に格納されています
