C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part150
https://mevius.5ch.net/test/read.cgi/tech/1584975873/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1556142878/
■長いソースを貼るときはここへ。■
http://codepad.org/
https://ideone.com/
[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
テンプレここまで
探検
C++相談室 part151
■ このスレッドは過去ログ倉庫に格納されています
2020/05/14(木) 11:53:25.59ID:ZPCfyTux
559デフォルトの名無しさん
2020/06/24(水) 17:26:36.53ID:L0Gy/Feu よく分からん
libは兎も角、appはソースあるのが普通じゃね
リンクしなおしている時点で、コンパイルからし直すのも出来るはず
ヘッダのバージョン合ってなきゃそりゃ転けるわ
libは兎も角、appはソースあるのが普通じゃね
リンクしなおしている時点で、コンパイルからし直すのも出来るはず
ヘッダのバージョン合ってなきゃそりゃ転けるわ
560デフォルトの名無しさん
2020/06/24(水) 18:00:35.46ID:irp07WaX >>558
newの変わりに、仮想関数のCreateObject()というメソッドを呼ぶ方式があるね。
newの変わりに、仮想関数のCreateObject()というメソッドを呼ぶ方式があるね。
561デフォルトの名無しさん
2020/06/24(水) 18:18:52.62ID:irp07WaX 1. Pimplの場合:
class CXxx {
public:
(メソッド群)
protected:
CImpl *pImpl;
};
2. 別解
使う側 :
class CBase {
public:
virtual CBase *CreateObject();
(メソッド群)
};
実装する側 :
class CDerived : public Base {
public:
CBase *CreateObject(); // 実際にはCDeriveの先頭アドレスをCBase*にcastしたものを返す。
(データメンバ群)
};
class CXxx {
public:
(メソッド群)
protected:
CImpl *pImpl;
};
2. 別解
使う側 :
class CBase {
public:
virtual CBase *CreateObject();
(メソッド群)
};
実装する側 :
class CDerived : public Base {
public:
CBase *CreateObject(); // 実際にはCDeriveの先頭アドレスをCBase*にcastしたものを返す。
(データメンバ群)
};
562デフォルトの名無しさん
2020/06/24(水) 18:26:04.51ID:OmEqu4Is563デフォルトの名無しさん
2020/06/24(水) 18:35:10.44ID:fimjTN9U >>547
プロジェクトの範囲内ではテンプレートパラメータが数種類に限られることも多いからそういう時には明示的インスタンス化が利用できるよ
プロジェクトの範囲内ではテンプレートパラメータが数種類に限られることも多いからそういう時には明示的インスタンス化が利用できるよ
564デフォルトの名無しさん
2020/06/24(水) 18:38:06.77ID:q+GJbQMN565デフォルトの名無しさん
2020/06/24(水) 18:57:23.17ID:irp07WaX566デフォルトの名無しさん
2020/06/24(水) 18:59:39.89ID:wsyC1+3+567デフォルトの名無しさん
2020/06/24(水) 19:01:25.53ID:QJ36Pf9n568デフォルトの名無しさん
2020/06/24(水) 19:08:20.34ID:irp07WaX >>565
すまん、こうでなくてはならなかった:
使う側:
class CBase {
public:
static CBase *CreateObject();
(メソッド群)
};
実装側:
class CDerived : public Base {
public:
(データメンバ群)
};
CBase *CBase::CreateObject() {
return new CDerived;
}
すまん、こうでなくてはならなかった:
使う側:
class CBase {
public:
static CBase *CreateObject();
(メソッド群)
};
実装側:
class CDerived : public Base {
public:
(データメンバ群)
};
CBase *CBase::CreateObject() {
return new CDerived;
}
569デフォルトの名無しさん
2020/06/24(水) 19:08:44.81ID:wsyC1+3+ >>567
実体のあるクラスをアップキャストすれば必要ねぇだろバカか
実体のあるクラスをアップキャストすれば必要ねぇだろバカか
570デフォルトの名無しさん
2020/06/24(水) 19:17:24.53ID:QJ36Pf9n 何が目的なんだか
その派生クラスのインスタンスを作りたいから、CreateObject呼ぶんだろ?
呼ぶ前に派生クラスのインスタンスが必要って、鶏と卵じゃないか
その派生クラスのインスタンスを作りたいから、CreateObject呼ぶんだろ?
呼ぶ前に派生クラスのインスタンスが必要って、鶏と卵じゃないか
571デフォルトの名無しさん
2020/06/24(水) 19:19:01.22ID:ML+2IMf2 こっそりlib差し替えとか後が怖いなーと思いましたw
572デフォルトの名無しさん
2020/06/24(水) 19:24:18.50ID:q+GJbQMN573デフォルトの名無しさん
2020/06/24(水) 19:27:44.47ID:QJ36Pf9n ヘッダにオブジェクトの中身を読み書きするinline関数有ったら危険
inlineじゃなくてもtemplateだとヤバイ
まあtemplateで実体生成されないように実装分離してたらセーフかな
inlineじゃなくてもtemplateだとヤバイ
まあtemplateで実体生成されないように実装分離してたらセーフかな
574デフォルトの名無しさん
2020/06/24(水) 19:29:28.85ID:q+GJbQMN 当然外から直接アクセスする変数は変えたらダメ
575デフォルトの名無しさん
2020/06/24(水) 19:42:58.81ID:q+GJbQMN ヘッダは基本変えない
不便ならポインタに置き換える変数1個だけ型と名前を変える
あとはライブラリ側のコードのみ変更
アクセス関数を後から増やすなら
クラスのポインタとパラメータをパラメータにしたグローバル関数にする
多少使いづらいが
互換性を考えて設計しなかったツケ
不便ならポインタに置き換える変数1個だけ型と名前を変える
あとはライブラリ側のコードのみ変更
アクセス関数を後から増やすなら
クラスのポインタとパラメータをパラメータにしたグローバル関数にする
多少使いづらいが
互換性を考えて設計しなかったツケ
576デフォルトの名無しさん
2020/06/24(水) 19:48:51.80ID:e6Wuxio/577デフォルトの名無しさん
2020/06/24(水) 21:43:18.10ID:N310/pVU 拡張した方は別の型(派生クラス)じゃあかんのか。
578デフォルトの名無しさん
2020/06/25(木) 09:10:26.77ID:TVNlb9r7579デフォルトの名無しさん
2020/06/25(木) 10:19:29.66ID:X3nsKEKb580デフォルトの名無しさん
2020/06/25(木) 10:26:19.02ID:lze6mCYp581デフォルトの名無しさん
2020/06/25(木) 12:53:57.93ID:yb+enRFi582デフォルトの名無しさん
2020/06/25(木) 18:36:00.50ID:KZb+gCmD583デフォルトの名無しさん
2020/06/25(木) 18:41:27.48ID:/eSpQqPW ヘッダは変更するの前提じゃないの?
バイナリ互換させるの前提なのだから
バイナリ互換させるの前提なのだから
584デフォルトの名無しさん
2020/06/25(木) 19:04:50.22ID:X3nsKEKb 「メンバ変数の一個をポインタに置き換える」
こともヘッダを変更するのが必須になると思うのだが。
こともヘッダを変更するのが必須になると思うのだが。
585デフォルトの名無しさん
2020/06/25(木) 19:07:11.43ID:TznTPNyN >>584
必須じゃない
必須じゃない
586デフォルトの名無しさん
2020/06/25(木) 19:13:33.80ID:g2od3l7G 実装側でアクロバットするのは無理やりバイナリ互換させる旧バージョン対応の方で良い
新バージョンの中身にあわせてヘッダを更新しておかないと、負の遺産が延々と続くことになる
新バージョンの中身にあわせてヘッダを更新しておかないと、負の遺産が延々と続くことになる
587デフォルトの名無しさん
2020/06/25(木) 19:14:44.69ID:L+/QiPNH588デフォルトの名無しさん
2020/06/25(木) 19:16:18.79ID:X3nsKEKb >>587
ええ!!??
ええ!!??
589デフォルトの名無しさん
2020/06/25(木) 19:27:44.15ID:aCPUEpAO バイナリ互換をはじめてかんがえた
って感じの人が多くて驚く
って感じの人が多くて驚く
590デフォルトの名無しさん
2020/06/25(木) 19:27:52.99ID:g2od3l7G pointerに置き換えたとして、指す先の実体の管理はどうするんだ
元々デストラクタが外部定義されてないと、デフォルトのデストラクタ呼び出しはinline化されてしまっている
元々デストラクタが外部定義されてないと、デフォルトのデストラクタ呼び出しはinline化されてしまっている
591デフォルトの名無しさん
2020/06/25(木) 19:32:44.29ID:aCPUEpAO なんでインラインだと思ったんだか
592デフォルトの名無しさん
2020/06/25(木) 19:34:45.97ID:aCPUEpAO ライブラリ作ったこと無いのかな?
593デフォルトの名無しさん
2020/06/25(木) 19:36:15.68ID:g2od3l7G いや、はじめからバイナリ互換させる前提で設計したライブラリでもない限り、小手先の対応でなんとかなる場面は物凄い限られるよ
594デフォルトの名無しさん
2020/06/25(木) 19:38:38.17ID:aCPUEpAO >>593
それは互換性を保つ技術が無いから
それは互換性を保つ技術が無いから
595デフォルトの名無しさん
2020/06/25(木) 19:41:06.01ID:aCPUEpAO メモリアラインメント調整等で発生する隙間を集めて変数として使う
っていう手もある
データ構造互換だとよくやる手法
っていう手もある
データ構造互換だとよくやる手法
596デフォルトの名無しさん
2020/06/25(木) 19:41:55.04ID:L+/QiPNH597デフォルトの名無しさん
2020/06/25(木) 19:42:42.30ID:g2od3l7G バイナリ互換前提で開発されていないから、問題が出ているんじゃないの?
appがコンパイルされた時点で、デストラクタやらコピコンやら代入やらをすべて明示的に外部定義していないと、コード中で必要に応じてデフォルトが呼ばれて、当然inline化もされてしまう
appがコンパイルされた時点で、デストラクタやらコピコンやら代入やらをすべて明示的に外部定義していないと、コード中で必要に応じてデフォルトが呼ばれて、当然inline化もされてしまう
598デフォルトの名無しさん
2020/06/25(木) 19:43:40.85ID:jUSiql3P599デフォルトの名無しさん
2020/06/25(木) 19:44:07.37ID:aCPUEpAO600デフォルトの名無しさん
2020/06/25(木) 19:45:52.88ID:aCPUEpAO ライブラリを作った事がないヤツが
ライブラリの互換性についてアドバイスしようとしてて笑える
ライブラリの互換性についてアドバイスしようとしてて笑える
601デフォルトの名無しさん
2020/06/25(木) 19:47:42.56ID:g2od3l7G ?
ライブラリ作ったことあるからこその内容だろうに
GCするとか、リークしたままOSに回収させるとかそれこそライブラリとしてあり得ない対応だろう
ライブラリ作ったことあるからこその内容だろうに
GCするとか、リークしたままOSに回収させるとかそれこそライブラリとしてあり得ない対応だろう
602デフォルトの名無しさん
2020/06/25(木) 19:51:39.44ID:aCPUEpAO なんでデストラクタがインラインだと思うんだ?
603デフォルトの名無しさん
2020/06/25(木) 19:55:22.62ID:g2od3l7G デフォルトだとinlineのデストラクタが生成されるのがc++の仕様だろ
じゃないと単なるプレーンな構造体でもデストラクタの呼び出しするはめになる
じゃないと単なるプレーンな構造体でもデストラクタの呼び出しするはめになる
604デフォルトの名無しさん
2020/06/25(木) 20:01:17.97ID:aCPUEpAO クラスをライブラリ化するのにメンバ関数がインライン?
ご冗談を
ご冗談を
605デフォルトの名無しさん
2020/06/25(木) 20:02:21.68ID:aCPUEpAO デストラクタがインラインなら>>595
606デフォルトの名無しさん
2020/06/25(木) 20:05:18.94ID:g2od3l7G バイナリ互換想定してないなら、inlineしない方が稀じゃね
全部外部定義だと、高速化の妨げになるじゃないか
世の中のc++用ライブラリを見てみれば良いさ
inlineが無いどころかheader onlyが幅を利かせている
全部外部定義だと、高速化の妨げになるじゃないか
世の中のc++用ライブラリを見てみれば良いさ
inlineが無いどころかheader onlyが幅を利かせている
607デフォルトの名無しさん
2020/06/25(木) 20:08:52.95ID:g2od3l7G alignmentサイズの隙間に入れたところで、コピーの時にコピーされるかどうかも不明
と言うか、単体だとまずされない
まあコピーも外部定義されていれば置き換え可能だけど
と言うか、単体だとまずされない
まあコピーも外部定義されていれば置き換え可能だけど
608デフォルトの名無しさん
2020/06/25(木) 20:10:03.10ID:L+/QiPNH >>599
そもそもバイナリ互換を考慮していないライブラリを今さら何とかしようとするウンコな発想ありきだからな。
まともなライブラリ実装者なら
「そんなクソとっとと便所に流してマトモなもの作り直せ」
としか言わんわ。
そもそもバイナリ互換を考慮していないライブラリを今さら何とかしようとするウンコな発想ありきだからな。
まともなライブラリ実装者なら
「そんなクソとっとと便所に流してマトモなもの作り直せ」
としか言わんわ。
609デフォルトの名無しさん
2020/06/25(木) 20:11:42.55ID:Y+MR3z5H >>606
テンプレートだろそれ
テンプレートだろそれ
610デフォルトの名無しさん
2020/06/25(木) 20:13:29.88ID:Y+MR3z5H >>607
コピーもインライン前提か?
コピーもインライン前提か?
611デフォルトの名無しさん
2020/06/25(木) 20:14:36.46ID:g2od3l7G inlineじゃないtemplateのヘッダオンリーでも、バイナリ互換保つの無理だよね
例えinline化されてなくても、各obj内で実体化されたtemplate関数が同一じゃないと何が起こっても文句言えない
例えinline化されてなくても、各obj内で実体化されたtemplate関数が同一じゃないと何が起こっても文句言えない
612デフォルトの名無しさん
2020/06/25(木) 20:15:41.12ID:g2od3l7G 明示的なinlineもだけど、定義せずコンパイラに任せた場合デフォルトで出来るものはinline扱いになる
613デフォルトの名無しさん
2020/06/25(木) 20:16:21.51ID:Y+MR3z5H なんでobj?
ライブラリっていってるんだからlibだろ
ライブラリっていってるんだからlibだろ
614デフォルトの名無しさん
2020/06/25(木) 20:18:38.89ID:g2od3l7G libはobjの集合だろうに
615デフォルトの名無しさん
2020/06/25(木) 20:19:42.46ID:Y+MR3z5H インライン混じりのライブラリ
ならメンバ変数を増やすのを心配する以前だろ
問題が変わってる
ならメンバ変数を増やすのを心配する以前だろ
問題が変わってる
616デフォルトの名無しさん
2020/06/25(木) 20:27:59.07ID:Y+MR3z5H >>611
だからヘッダは基本変更しない
だからヘッダは基本変更しない
617デフォルトの名無しさん
2020/06/25(木) 20:29:04.78ID:iE0yhaVV どうしても必要なことなら、
ライブラリの中にスタティックな連想配列置いて、thisアドレスをキーにして追加したいメンバ変数引くようにしたら?
トリッキーでないし確実に動く
ライブラリの中にスタティックな連想配列置いて、thisアドレスをキーにして追加したいメンバ変数引くようにしたら?
トリッキーでないし確実に動く
618デフォルトの名無しさん
2020/06/25(木) 20:29:54.44ID:g2od3l7G コピーされなきゃ良いよね
619デフォルトの名無しさん
2020/06/25(木) 20:30:23.57ID:g2od3l7G vectorで持たれてても再配置されたら困るし
620デフォルトの名無しさん
2020/06/25(木) 20:32:18.93ID:Y+MR3z5H621デフォルトの名無しさん
2020/06/25(木) 20:34:29.24ID:Y+MR3z5H 何の互換性を保ちたいのかわからなくなってきた
622デフォルトの名無しさん
2020/06/25(木) 20:42:06.05ID:N8mY4JDD 同感
623デフォルトの名無しさん
2020/06/25(木) 21:13:19.28ID:Y+MR3z5H ライブラリを使う(一部の)コードはコンパイル済みでリコンパイル出来ない
コンパイル済みのコード内で使ってるクラスのメンバ変数を追加したい
当然
クラスのサイズは変えられないし
コンパイル済みのコード内の(インライン展開されてる)関数も変えられない
どの関数がコンパイル済みコード内にあって
どの関数がライブラリ内にあるかは不明
コンパイル済みのコード内で使ってるクラスのメンバ変数を追加したい
当然
クラスのサイズは変えられないし
コンパイル済みのコード内の(インライン展開されてる)関数も変えられない
どの関数がコンパイル済みコード内にあって
どの関数がライブラリ内にあるかは不明
624デフォルトの名無しさん
2020/06/25(木) 21:14:06.17ID:Y+MR3z5H こんな感じ?
625デフォルトの名無しさん
2020/06/25(木) 21:25:58.94ID:GV91Na/E ほとんど読んでないけどID:aCPUEpAOとID:Y+MR3z5Hがド素人なのはわかった
626デフォルトの名無しさん
2020/06/25(木) 21:27:27.39ID:Y+MR3z5H はいはいwww
627デフォルトの名無しさん
2020/06/25(木) 21:32:36.99ID:GV91Na/E ヘッダの変更無しにどうやって新しい機能追加すんだよ
628デフォルトの名無しさん
2020/06/25(木) 21:39:56.91ID:Y+MR3z5H 機能を追加したいなんて言ってたか?
629デフォルトの名無しさん
2020/06/25(木) 21:40:05.85ID:GV91Na/E630デフォルトの名無しさん
2020/06/25(木) 21:46:21.80ID:Y+MR3z5H なにそのド素人発言
631デフォルトの名無しさん
2020/06/25(木) 21:47:56.11ID:GV91Na/E >>610,613,615
632デフォルトの名無しさん
2020/06/25(木) 21:49:41.84ID:GV91Na/E インスタンスで扱ってるなら暗黙定義された関数の動作が変わる可能性くらいすぐ気づけやド素人が
633デフォルトの名無しさん
2020/06/25(木) 21:58:47.71ID:W+LR7rOf ポインタで扱うとインライン関数がリコンパイル無しで変えられるって?
634デフォルトの名無しさん
2020/06/25(木) 22:01:17.65ID:W+LR7rOf ライブラリなんだから
メンバ関数は全てライブラリ側で実装するだろ普通
テンプレートとか別途リンクが不要なことが売りなライブラリならともかく
何のためのライブラリだか
メンバ関数は全てライブラリ側で実装するだろ普通
テンプレートとか別途リンクが不要なことが売りなライブラリならともかく
何のためのライブラリだか
636デフォルトの名無しさん
2020/06/25(木) 22:06:38.78ID:Q7o8gz5q てかこの要件だと>>617ですでに答え出てる気がする
637デフォルトの名無しさん
2020/06/25(木) 22:06:48.48ID:W+LR7rOf 案を出せない人間が何を言っても負け犬の遠吠え
638デフォルトの名無しさん
2020/06/25(木) 22:09:27.67ID:W+LR7rOf639デフォルトの名無しさん
2020/06/25(木) 22:11:36.08ID:W+LR7rOf640デフォルトの名無しさん
2020/06/25(木) 22:14:20.52ID:Q7o8gz5q641デフォルトの名無しさん
2020/06/25(木) 22:15:15.45ID:Q7o8gz5q642デフォルトの名無しさん
2020/06/25(木) 22:16:59.09ID:W+LR7rOf 外部から直接アクセスしない変数を置き換えるに決まってるたろ
連想配列だと
初期化順とかスレッド安全とかパフォーマンスとか
色々と心配だねえ
連想配列だと
初期化順とかスレッド安全とかパフォーマンスとか
色々と心配だねえ
643デフォルトの名無しさん
2020/06/25(木) 22:20:39.99ID:lze6mCYp644デフォルトの名無しさん
2020/06/25(木) 22:20:56.12ID:W+LR7rOf645デフォルトの名無しさん
2020/06/25(木) 22:26:37.67ID:Q7o8gz5q646デフォルトの名無しさん
2020/06/25(木) 22:26:45.54ID:W+LR7rOf647デフォルトの名無しさん
2020/06/25(木) 22:29:26.54ID:Q7o8gz5q 何言ってんだこいつ
648デフォルトの名無しさん
2020/06/25(木) 22:29:51.27ID:W+LR7rOf コンストラクタはインラインでも>>572で問題ないね
649デフォルトの名無しさん
2020/06/25(木) 22:35:32.05ID:W+LR7rOf650デフォルトの名無しさん
2020/06/25(木) 22:36:49.66ID:W+LR7rOf >>643じゃなかった
連想配列案
連想配列案
651デフォルトの名無しさん
2020/06/25(木) 22:47:52.28ID:Q7o8gz5q インラインじゃないならって、普通コンパイルオプションやnoinlineで指定してない限り、
実装が見えているメンバ関数は全てインライン展開はされうるんだぞ
そんな厳しい前提がOKなら>>645で言ったdeleteの問題だって対処できる
実装が見えているメンバ関数は全てインライン展開はされうるんだぞ
そんな厳しい前提がOKなら>>645で言ったdeleteの問題だって対処できる
652デフォルトの名無しさん
2020/06/25(木) 22:50:51.97ID:W+LR7rOf653デフォルトの名無しさん
2020/06/25(木) 22:54:30.29ID:W+LR7rOf >>651
ヘッダにない関数はインラインにしようがない
ヘッダにない関数はインラインにしようがない
654デフォルトの名無しさん
2020/06/25(木) 22:59:14.54ID:W+LR7rOf655デフォルトの名無しさん
2020/06/25(木) 23:01:53.27ID:W+LR7rOf デストラクタ問題に対応出来るのは今のところ>>595だけ
656デフォルトの名無しさん
2020/06/25(木) 23:05:32.49ID:Q7o8gz5q657デフォルトの名無しさん
2020/06/25(木) 23:06:38.16ID:Q7o8gz5q658デフォルトの名無しさん
2020/06/25(木) 23:11:48.74ID:W+LR7rOf659デフォルトの名無しさん
2020/06/25(木) 23:23:27.92ID:W+LR7rOf コンテナやスマポなど、コピーやデストラクタで処理される物の中身を少し大きくするとか
close()みたいな最後に必ず呼ばれる関数があればそこに入れ込むとか
中身がわかればもっと別の案も出るかも
close()みたいな最後に必ず呼ばれる関数があればそこに入れ込むとか
中身がわかればもっと別の案も出るかも
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- タワマンに戻りたい…子どものため郊外の庭付き一軒家に引っ越した世帯年収1,600万円の40代パワーカップル「心底後悔しています」 ★3 [樽悶★]
- マイナ保険証「メリットなし」が最多 1.1万人調査で見えた“不安と様子見” ★2 [♪♪♪★]
- カズレーザー「サンタクロースはいない」「買ってくれた親に感謝」発言に“視聴者から苦情”で「バカじゃねーの?って本当に思う」★2 [muffin★]
- 【野球】メジャー挑戦・村上宗隆 22日に期限迫るも市場沈黙… 三振率や変化球対応を懸念 「日本Uターン」悪夢が現実味 米報道★2 [冬月記者★]
- 【おこめ】コメ価格は「損切り」間近か 卸最大手・神明社長の「暴落」発言の真意とは 「5キロ3500円」は実現するか ★2 [ぐれ★]
- 【赤坂サウナ火災】「賠償額は2億円超」弁護士が指摘。経営者の夫妻に小さな子がいたことも、慰謝料の高額化に [ぐれ★]
- 働けや殴りダムたる馬鹿無職🏡
- チェンソーマンのラスボス
- 悪夢の民主党政権ってよく言われてるけど、今の高市政権とどっちが良かったん? [484676894]
- アナルセックス童貞なんだけど
- お前らって今世紀中に死んでいそう
- 来週末に株価が倍になる銘柄教えてやろうか?
