[過去ログ] C++相談室 part164 (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
39(3): (ワッチョイ 0310-QNcS) 2023/05/16(火)15:18 ID:cdgpde7Q0(1/2) AAS
教えてもらえないでしょうか
c++で
クラスを作って関数を書いています。
大きくなり、可読性が悪いので、
同じクラス内のcppを別ファイルに分けたいのですが、
可能なのでしょうか
継承を使って、10個ぐらい数珠つなぎにして、一番最後の継承クラスに関数呼び出し元の関数を書いて、
省2
40: (アウアウウー Sa67-+/XS) 2023/05/16(火)15:58 ID:mGp2Y9l5a(1/2) AAS
>>19
めっちゃわかります
41(1): (アウアウウー Sa67-+/XS) 2023/05/16(火)16:03 ID:mGp2Y9l5a(2/2) AAS
>>39
可能
ヘッダのクラス定義はまとめないとだめだけど
cppのソースは分かれてても最後にリンクで辻褄が合えばOK
42(1): (アウアウウー Sa67-MLJk) 2023/05/16(火)16:24 ID:hKNAv4Vda(1) AAS
>>39
後半で言っていることがちょっと難しいかな
多重継承の数珠繋ぎを言ってる?
よく分からんけど多分そんな変なことしなくていいよ
43: (ワッチョイ 0310-QNcS) 2023/05/16(火)17:34 ID:cdgpde7Q0(2/2) AAS
>>41
>>42
助かります。ありがとうございます。
勉強してみます。
44: (スッップ Sd1f-paFp) 2023/05/16(火)21:35 ID:+NXdN5Npd(1) AAS
可読性が悪いものは
ファイルを分けても良くはならんぞ
45: (ワッチョイ 6fad-ZkZz) 2023/05/16(火)21:55 ID:RFVtGrOF0(1) AAS
>>39
1つのクラスに機能を詰め込み過ぎなんじゃない?
昔、4万行のcppファイルを見たことはあるけどw
46: (ワッチョイ 73da-M4GN) 2023/05/16(火)22:05 ID:oY5Fe8SB0(1) AAS
殆どコピペなんだろうな
クラスの継承知らないヤツがよくやる荒業
47(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ ff3e-ZkZz) 2023/05/16(火)22:27 ID:tGbGLk1R0(1) AAS
そういえば C# でクラス定義を分ける機能 (パーシャルクラス) があると聞いたことがあるけど
本来的に分けるべきクラスを見かけだけ分割するような悪い設計を誘発しそうな印象がある。
C# について全然知らんので印象だけだけど。
48: (ワッチョイ 335f-GJof) 2023/05/16(火)22:54 ID:A1rs+At80(1) AAS
partialはXAMLから生成された.csと手書きする.csをマージするための機能なので
49: (スプッッ Sd1f-zj+H) 2023/05/17(水)07:00 ID:s9zxu+xkd(1) AAS
>>47
多重継承っぽいやつ?
50: (スップ Sd1f-kcYJ) 2023/05/17(水)08:36 ID:9mruUvtDd(1) AAS
分割されたそれぞれの断片をコンパイラの後工程で1クラスにまとめ上げる感じ。
なのでこんな感じの相互参照も許される。
partial class C{
private void F1(){ F2(); }
}
partial class C{
private void F2(){ F1(); }
省3
51: (スッププ Sd1f-paFp) 2023/05/17(水)12:04 ID:nFfh+5gid(1) AAS
「1ファイル1クラスにしておくのが鉄則」
10行のクラスも10000行のクラスも何も考えずに1ファイル
思考停止君のやること
52: (オイコラミネオ MMc7-ZkZz) 2023/05/17(水)12:36 ID:F24a8wLtM(1/2) AAS
C#のpartialは基本的に自動生成されたファイルとの分離が主目的
winformsのコントロールのプロパティのイニシャライズとか人から触ってほしくないファイルで一種の馬鹿避けになってる
delphiではそのコントロール向けのファイルがバイナリでぶっ壊れてもどうにもできないし
コーディング中にコード内検索も出来ない
利便性が著しくよくない
後は一般のコードジェネレータの吐き出すファイル用にも使える
最近はmvvm toolkitで便利に使われている
省5
53: (アウアウウー Sa67-MLJk) 2023/05/17(水)12:57 ID:TlHThGt8a(1) AAS
おんなじ意味合いの関数なんだけどSFINAEしまくってて1000行くらいあるやつはよく見かける
54: (ワッチョイ 3302-Cej3) 2023/05/17(水)13:32 ID:6s1sKbMg0(1) AAS
時代はパーシャル
55: (スプッッ Sd07-zj+H) 2023/05/17(水)16:10 ID:ZA2j/mjnd(1) AAS
触られたくないコードって危険を孕んで内科医?
業務の情報が1人の社員に独占されていると
そいつが急死したら詰むだろ
56: (オイコラミネオ MMc7-Np+b) 2023/05/17(水)22:50 ID:F24a8wLtM(2/2) AAS
彼も若いころは文脈も理解できてまともにコーディングできたのかもしれない
皆いつか老化して意味が取れなくなるんだから
いつか行く道と言うことで…
57: (ワッチョイ 7f28-sx1H) 2023/05/18(木)08:16 ID:rquLbZPK0(1/2) AAS
互いに依存しないことを明確にするためにファイルを分けることはまれによくある……
static int g_foo;
class A { ... };
class B {
void bar() { baz(g_foo); A x; } // Bがg_fooやAへの依存が無いことはBをファイルを分けたらワカル分けなかったらわからん
};
58: (ワッチョイ 7f28-sx1H) 2023/05/18(木)08:21 ID:rquLbZPK0(2/2) AAS
もっともファイルを分けたからといってもメモリのエイリアシング的な形で依存した場合は知らん
some_func()が表記上はg_fooを含まないのに実は中でg_fooのアドレスを知っていて以下略
59: (オイコラミネオ MMc7-Np+b) 2023/05/18(木)22:15 ID:mLb7AMe5M(1) AAS
さすがに冷たい対応だったかなと
C#でpartialが入った経緯
winformsはGUIデザイナを使ってボタン等のコントロールを自由に配置してプロパティを変えて表示される文字を変えることができる
初期はデザイナで変更するとformのファイルがそのまま変更された
そのファイルを人間も書き換えているので人がミスしたり運が悪いと整合性が取れなくなったりしてた
例えば全置換などやってデザイナの部分も書き換わったりとか
それで自動生成された部分を人が不意に触れないないようにそこだけを別ファイルに出す目的でpartial classが出来た
省1
60: (ワッチョイ ff79-ScEU) 2023/05/19(金)02:03 ID:iSJAQTOS0(1) AAS
日本でパーシャルと言えばパーシャル冷蔵庫
微妙に凍結させた状態にして保存するというアレ
まさにC#のpartialの事である
61: (スプッッ Sd1f-zj+H) 2023/05/19(金)14:04 ID:Y7veEz1vd(1) AAS
偏微分
62: (ラクッペペ MM7f-fulC) 2023/05/19(金)14:20 ID:s84ipUzkM(1) AAS
グラッド ダイバージェンス ローテーション
63: (アウアウウー Sa2f-SwK+) 2023/05/20(土)13:24 ID:QfLlK72xa(1) AAS
Φ(E)
∇・E
∇×E
64: (JP 0H2b-QEN2) 2023/05/20(土)14:24 ID:duXb8gf0H(1) AAS
ナブラッ
65: (ワッチョイ 03cf-owa4) 2023/05/20(土)14:35 ID:mmZhl8HV0(1) AAS
チロワッ
66: (オイコラミネオ MMeb-owa4) 2023/05/20(土)15:53 ID:KTPYLvU6M(1/2) AAS
APLを思い出した
さすがに使ったことはないけど
67(2): (アウアウウー Sa2f-IRVr) 2023/05/20(土)16:00 ID:eGW3N412a(1) AAS
for(auto &v: createVector()) なんか処理
みたいな書き方してもcreateVectorは一回しかよばれず大丈夫ってことでいい?
68: はちみつ餃子◆8X2XSCHEME (ワッチョイ cb3e-FIIW) 2023/05/20(土)16:21 ID:dyAKGBP20(1) AAS
>>67
せやで。
その関数が呼ばれるのは一度だけという解釈で正しい。
69(1): (ワッチョイ b301-HmrL) 2023/05/20(土)16:23 ID:am3G09Kz0(1) AAS
>>67
そんくらい自分で試しなされ
$ cat test.cpp
#include <iostream>
#include <vector>
using namespace std;
auto createVector() {
省10
70(1): (ワッチョイ fff0-IRVr) 2023/05/20(土)18:59 ID:VcGb9zmJ0(1) AAS
>>69
自分の環境だと通るのは知ってるけど、実は未定義でアウトみたいな場合あるから5chの有識者の意見が聞きたかった
71(1): (オイコラミネオ MMeb-owa4) 2023/05/20(土)19:26 ID:KTPYLvU6M(2/2) AAS
かなり昔範囲forはプリプロセッサで展開されると聞いたことがあったなあ
そういうのから誤解なんじゃないかな
実際展開してみたけどプリプロセッサでは展開されないです
72(1): (ワッチョイ 5f7c-aV//) 2023/05/20(土)20:10 ID:pdI1pmlS0(1) AAS
>>70
これのこと?
std::vector<int> createVector();
for(auto &v: createVector()) // セーフ
struct Result { std::vector<int> v; };
Result createResult();
for(auto &v: createResult().v) // UB
73(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ cb3e-FIIW) 2023/05/21(日)00:13 ID:tvaGSf6W0(1/2) AAS
>>71
range-based for は等価なコードを示す形で意味論が規定されてる。
外部リンク:timsong-cpp.github.io
「こう書いた場合の挙動と等しい」という説明が「このように展開される」と誤解されたんだろう。
コンパイラの内部で実際に展開しても構わないんだが
プリプロセッサはフェイズの整合性がとれなくなるのでこの展開をプリプロセッサでは実現できない。
74(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ cb3e-FIIW) 2023/05/21(日)00:41 ID:tvaGSf6W0(2/2) AAS
一時オブジェクトの寿命は個々の具体例を網羅的に覚えるというわけにもいかんので
ちゃんと原則を理解しないといかんというのは警告しておく。
>>72 で提示された内容を解説すると、このとき createResult の結果である Result は一時オブジェクトなので
完結式の終わりには解体される。 (>>73 で提示した展開形を参照のこと。)
右辺値は参照で受けた場合に限りその参照の寿命と同じ分だけ寿命が延長されるというルールがあるので
その原則に従えば Result::v の寿命は延長されるのだが v を内包する Result が解体されるときにメンバも解体してしまうので
Result::v も無効になってしまう。
省1
75: (スップ Sd8a-Cz+X) 2023/05/21(日)10:05 ID:bUoMcGVnd(1) AAS
単純なFOREACHマクロだと展開できないんだよねこれ
FOREACH(T x, iterable) "文"
↓
{
auto&& range=iterable;
auto&& begin=range.begin();
auto&& end=range.end();
省11
76: (オイコラミネオ MMeb-owa4) 2023/05/21(日)13:16 ID:gNV32dtiM(1) AAS
そうそう
プリプロセッサは重複の無い任意の変数名を持ってこれない
固定でもスコープの問題もあるからプリプロセッサ論は馬鹿げてるなと思った
77(1): (ワッチョイ 5f7c-aV//) 2023/05/21(日)14:57 ID:TLn2V+5X0(1/2) AAS
>>74
ちなみにこれはC++23からは解決する(P2644)
for文の中身のあらゆる一時オブジェクトは(謎の力によって)ループ終了まで生存するようになる
まあ現時点ではやらない方がいいし、気にしなくて良くなるまで10年はかかるだろうけど
78: (ワッチョイ b301-HmrL) 2023/05/21(日)15:50 ID:hDRagkvp0(1) AAS
>>77
えええ!
どんな需要を満たそうとしてそんな変更するんかね?
79: (ワッチョイ aa28-ff77) 2023/05/21(日)19:09 ID:9sSc2LHl0(1) AAS
class Foo {
int m_value;
public:
Foo() { m_value = 現在時刻に依存して決まる何かの値; }
int v() const { return m_value; }
};
int tmp;
省4
80: (ワッチョイ 5f7c-aV//) 2023/05/21(日)20:47 ID:TLn2V+5X0(2/2) AAS
for (auto&& x: <<ここだけだよ>>)
81: (ワッチョイ 6f5f-u1DA) 2023/05/21(日)21:41 ID:Wy9ZySN20(1) AAS
std::for_eachと死ぬタイミング合わせようとしてるのかな
82: (スププ Sdea-3V1s) 2023/05/22(月)11:38 ID:da9WNPSud(1) AAS
do{}while(ここにblock内で宣言した変数使えるのマダ?);
83: (ラクッペペ MM86-F7IQ) 2023/05/23(火)08:13 ID:Zuh94crlM(1/2) AAS
Main でインスタンス化した、ファイル操作
クラスの設定を、別のクラスutilityの
インスタンスで使いたい時ってどうしたら
いいですか?
ファイル開いておいて、デバッグ内容を
そこに書き込みたい。
デバッグ終わったら不要になるんで、
省2
84(1): (スップ Sd8a-Cz+X) 2023/05/23(火)08:33 ID:2zdXEqSEd(1/2) AAS
「ファイル操作クラス」ってなんのことか読み取れんが
std::osteamのことか?std::ostreamを持ってる別の仕事があるクラスか?
差し支えなければ現状のクラス定義を貼ってほしいが
85: (ラクッペペ MM86-F7IQ) 2023/05/23(火)09:15 ID:Zuh94crlM(2/2) AAS
>>84
ファイル操作を含んだ、デバッグ用に用意した
クラスです。Debugクラスとします。
Debug dbg; グローバルで‥
WWinMain(){
dbg.initial(); 色んな初期設定。
dbg.filename(debugfile) ;
省12
86: (アウアウウー Sa2f-SwK+) 2023/05/23(火)10:39 ID:X1m2WkvHa(1) AAS
Utility util(dbg);
87: (ワッチョイ defb-a+t/) 2023/05/23(火)12:30 ID:gLCisDzi0(1) AAS
関数の命名センスが短絡的やな
扇子を磨け
88: (スップ Sd8a-Cz+X) 2023/05/23(火)12:40 ID:2zdXEqSEd(2/2) AAS
std::ostreamはコピーを禁止してるから参照渡し(or ポインタ渡し)で受け取るのがいいかな
class Utility{
Debug& _debug;
public:
Utility(Debug& debug) : _debug(debug) {}
void f(){
_debug.writefile(...);
省6
89: (アウアウウー Sa2f-k5Su) 2023/05/23(火)13:00 ID:zQ9auONPa(1) AAS
Debugをシングルトン化しておけばいいのでは。
そうすれば、utilityもMainもDebugの定義を読むだけで、お互いに無関心でいられる。
90: (スップ Sdea-9ehv) 2023/05/23(火)13:07 ID:Gn7U56ehd(1) AAS
staticおじさんになるんだよ
91: (ワッチョイ ffda-dfFb) 2023/05/23(火)13:19 ID:4jUsmOvf0(1/2) AAS
禁じ手
グローバルおじさん
92: (ワッチョイ 635f-cbOI) 2023/05/23(火)14:52 ID:HWUzxVfV0(1) AAS
#ifdef NDEBUG
#define DEBUG_PUTLN(line)
#else
#define DEBUG_PUTLN(line) dbg.writefile(line)
#endif
93: (ワッチョイ 5f7c-aV//) 2023/05/23(火)20:11 ID:QG1lXeie0(1) AAS
シングルトンって実質はグローバル変数そのものなんだけどな
94: (ワッチョイ dbd4-3DEL) 2023/05/23(火)20:33 ID:H3Kl0Etq0(1) AAS
クラス定義がそもそもグローバルだからな
95: (ワッチョイ ffda-dfFb) 2023/05/23(火)23:59 ID:4jUsmOvf0(2/2) AAS
int i をグローバル変数にしてたおじさん居たな
理由聞いたら書くの面倒だからとか
96: (アウアウウー Sa2f-pkzb) 2023/05/24(水)01:56 ID:EzFDCa2Ya(1) AAS
全部シングルトンおじさんとglobalおじさんは一人でもいると周りがめっちゃ迷惑やな
97: (ワンミングク MM3a-F7IQ) 2023/05/24(水)14:31 ID:VF8oVK+zM(1/2) AAS
ありがとう。
やっばり、Utility の中にも色々書く必要あり
ですね。
デバッグのためだけにUtility2 3 4全部直すのも
と思ってたけど、諦めて頑張ります。
98: (ワンミングク MM3a-F7IQ) 2023/05/24(水)14:34 ID:VF8oVK+zM(2/2) AAS
external でインスタンス渡して、
global.h さんだけincludeしてできないかなと、
甘く考えてた時もありました。
99: (ワッチョイ 0705-vBUL) 2023/05/24(水)23:58 ID:lCJuR93r0(1) AAS
世界で1つのint iをブンブン回してるのクソワロタ
100: (アウアウエー Sac2-cyLm) 2023/05/25(木)00:06 ID:1obgfOJTa(1) AAS
ループ内でサブルーチンとか呼んだときどうするんだろう・・・
101(2): (ワッチョイ 1b02-XPFS) 2023/05/25(木)00:18 ID:8bGOXla20(1) AAS
std::u16string_view stringView (string);
stringView = {stringView.data () + 1, stringView.size () - 1};
これの2行目はどういう意味なんでしょうか?何かの文法のような気がするのですが、調べ切れていません・・・。
102: (ワッチョイ aa28-ff77) 2023/05/25(木)00:55 ID:NKFrr9+j0(1) AAS
グローバルなオブジェクトのコンストラクタの中からprintf()とかのC言語の標準ライブラリ機能が呼べるのはワカルが
coutとかのC++の標準ライブラリ機能は安全に呼べることは保証されるの?
103: (ワッチョイ 5f7c-aV//) 2023/05/25(木)01:41 ID:WiPfB6bJ0(1) AAS
される
規格上はstdに含まれる値(オブジェクト)はユーザーコードで参照されたら(特別の規定がない限り)常に有効でなければならない
104: (ワッチョイ 4aa5-owa4) 2023/05/25(木)08:37 ID:2LyQ/gAw0(1) AAS
>>101
rangesのviewだろ
105(2): はちみつ餃子◆8X2XSCHEME (ワッチョイ cb3e-FIIW) 2023/05/25(木)09:32 ID:G3dlC7U30(1/2) AAS
>>101
> stringView = {stringView.data () + 1, stringView.size () - 1};
↑これは↓こう書いた場合と同じ。
stringView = std::u16string_view(stringView.data () + 1, stringView.size () - 1);
106(1): (スップ Sdea-9ehv) 2023/05/25(木)11:13 ID:vvIauVZOd(1) AAS
>>105
一見意味不明何だけど何て記法?
107: (ワッチョイ 0705-vBUL) 2023/05/25(木)11:49 ID:tfjCiJA40(1/2) AAS
勉強中なんだけど、クラスの相互参照って気持ち悪い
108: (ワッチョイ 0705-vBUL) 2023/05/25(木)12:04 ID:tfjCiJA40(2/2) AAS
もう、慣れた
109: はちみつ餃子◆8X2XSCHEME (ワッチョイ cb3e-FIIW) 2023/05/25(木)12:08 ID:G3dlC7U30(2/2) AAS
>>106
たぶん直接的に表す用語は定義されてないと思う。
型の情報がないときは波括弧で表されたリストは initializer_list に推論されるけど
代入のときは代入演算子のオーバーロード解決時候補に関数シグネチャとして T& operator=(T&,T); が加わるので
結果としてこのとき生成される一時オブジェクトの初期化子という解釈になる。
110: (ブーイモ MMea-UgiX) 2023/05/25(木)13:19 ID:E3OVdEtKM(1) AAS
Uniform initialization 一様初期化とか統一初期化?
外部リンク[html]:cpprefjp.github.io
std::initializer_listも含んだ文法だね
std::initializer_listの方か他のコンストラクタの方になるかはけっこうルールがややこし
111: (オイコラミネオ MMeb-owa4) 2023/05/25(木)19:45 ID:bX845kvIM(1/2) AAS
c++はその{}の中に書くとclassの中に書いた変数が順番に初期化される
いろいろ問題があるから他の言語で採用されていない
c++は実用面で利点があると判断されたのかそのまんま
112: (オイコラミネオ MMeb-owa4) 2023/05/25(木)19:47 ID:bX845kvIM(2/2) AAS
Brace initialization
外部リンク:learn.microsoft.com
113(2): (ワッチョイ 1b02-XPFS) 2023/05/26(金)06:48 ID:kRDoXd150(1) AAS
>>105
ありがとうございます。
DTMのプラグイン(VST3)を作ってみたくて、それにはC++をある程度分かってないといけないそうなので、
参考書読んだりしているのですが、これれまでC++に全く触れてこなかったので、かなり面食らってます・・・。
サンプルのソースを見ても、いろいろな応用が含まれていて、前提となる知識がそれなりにないと分からないのかなと・・・。
114: はちみつ餃子◆8X2XSCHEME (ワッチョイ cb3e-FIIW) 2023/05/26(金)10:03 ID:qewSmBpu0(1/2) AAS
>>113
C++ の仕様には未定義がたくさんあるので実際に動作させた結果から学ぶべきではないという事情がある。
ある程度は理屈で理解しておかないと簡単に破綻するよ。
実例を見ながら雰囲気で使うってのは出来ない言語だと思う。
115: (ワッチョイ 67c9-HmrL) 2023/05/26(金)10:55 ID:Yaiov3bU0(1) AAS
しらない間に未定義踏んでて、コンパイラ変わったりしたときに挙動が変わるやつ
116(1): (ササクッテロラ Sp03-OHH9) 2023/05/26(金)11:28 ID:VVS6yE6rp(1) AAS
>ある程度は理屈で理解しておかないと
に対しての
>実際に動作させた結果から学ぶべきではない
極端じゃね?
117: (ワッチョイ 5f9c-uVPi) 2023/05/26(金)11:37 ID:jtoHc2Cr0(1) AAS
>>113
chatgptにサンプルコードを解説させたら?
118: はちみつ餃子◆8X2XSCHEME (ワッチョイ cb3e-FIIW) 2023/05/26(金)13:02 ID:qewSmBpu0(2/2) AAS
>>116
「ちゃんとした資料を読まずに動作から何かを読み取ろうとするな」という話なので、
資料を読んだうえで手を動かして確認することまで否定してるわけじゃないよ。
少なくとも初手は入門書くらい読まんといかんという程度のことを言ってる。
119: (スッップ Sdea-Q5bc) 2023/05/26(金)21:10 ID:u5i01UPgd(1) AAS
解脱させたらに見えたし
上下前次1-新書関写板覧索設栞歴
あと 883 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.035s