0からの、超初心者C++相談室
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2018/11/12(月) 14:55:13.35ID:Tf74ZWQr 何にも知らない0からの出発、超初心者のためのC++相談室
489デフォルトの名無しさん
2023/06/20(火) 19:05:08.72ID:mbwsU8Mq なんか変換されたw
∑merでなくて&summerです
∑merでなくて&summerです
490はちみつ餃子 ◆8X2XSCHEME
2023/06/20(火) 20:45:04.07ID:IIzrqfbq >>488
参照が絡むとややこしくて単純に説明できないんだけど
代入演算子の左側は変更可能な lvalue (modifiable lvalue) であることということになっていて
そのキャストだと prvalue になってしまうから代入できないという結果になる。
たとえば
int x = 1;
x = 2;
は有りだけど
1 = 2;
は駄目なのはわかるでしょ。
この代入のときの x はそこに入っている 1 という値に意味はなくて場所に意味がある。
値として取り出されてしまうと代入できないんだ。
参照が絡むとややこしくて単純に説明できないんだけど
代入演算子の左側は変更可能な lvalue (modifiable lvalue) であることということになっていて
そのキャストだと prvalue になってしまうから代入できないという結果になる。
たとえば
int x = 1;
x = 2;
は有りだけど
1 = 2;
は駄目なのはわかるでしょ。
この代入のときの x はそこに入っている 1 という値に意味はなくて場所に意味がある。
値として取り出されてしまうと代入できないんだ。
491はちみつ餃子 ◆8X2XSCHEME
2023/06/20(火) 20:54:10.99ID:IIzrqfbq どういうときにどういう値カテゴリに属すことになるのか正確なところはここ見て。
https://timsong-cpp.github.io/cppwp/n3337/basic.lval
C++03 時代は lvalue と rvalue だけの単純な (と言ってもそれなりに複雑だが……) 世界だったんだけど
右辺値参照の概念を整理するため (?) かだいぶんごちゃついてる。
https://timsong-cpp.github.io/cppwp/n3337/basic.lval
C++03 時代は lvalue と rvalue だけの単純な (と言ってもそれなりに複雑だが……) 世界だったんだけど
右辺値参照の概念を整理するため (?) かだいぶんごちゃついてる。
492デフォルトの名無しさん
2023/06/20(火) 23:48:13.65ID:mbwsU8Mq >>490
返答ありがとう。
なぜconst_cast<Summer*>(summerConstPtr)が左辺としていけないのかがわかりませぬ。
summerConstPtrはconst_cast<Summer*>によって「Summer *const」から「const」が外れて「Summer*」となって
Summer *summerPtr;
summerPtr = &summer;
とするときの左辺summerPtrと同じようになったわけではないのでしょうか?
どうもこの左辺summerPtrと同じようにするためには、const_cast<Summer*&>としなければならないようだが、この「&」にはどんな意味ががが??
返答ありがとう。
なぜconst_cast<Summer*>(summerConstPtr)が左辺としていけないのかがわかりませぬ。
summerConstPtrはconst_cast<Summer*>によって「Summer *const」から「const」が外れて「Summer*」となって
Summer *summerPtr;
summerPtr = &summer;
とするときの左辺summerPtrと同じようになったわけではないのでしょうか?
どうもこの左辺summerPtrと同じようにするためには、const_cast<Summer*&>としなければならないようだが、この「&」にはどんな意味ががが??
493はちみつ餃子 ◆8X2XSCHEME
2023/06/21(水) 00:33:00.36ID:3HBFHOpK >>492
型とは別に (型と無関係ではないが) 文脈にカテゴリが存在するというのが肝心な部分。
どれがどのカテゴリに属すのかはダラダラとした箇条書きで書いてあって単純な原則では示せない。
(結果的には辻褄の合うようになってるけど……。)
& は参照を表す記号という解釈は正しい。
参照は lvalue なのでキャストの結果も lvalue ってだけ。
型とは別に (型と無関係ではないが) 文脈にカテゴリが存在するというのが肝心な部分。
どれがどのカテゴリに属すのかはダラダラとした箇条書きで書いてあって単純な原則では示せない。
(結果的には辻褄の合うようになってるけど……。)
& は参照を表す記号という解釈は正しい。
参照は lvalue なのでキャストの結果も lvalue ってだけ。
494デフォルトの名無しさん
2023/06/21(水) 01:03:31.08ID:tILY3YM/495デフォルトの名無しさん
2023/06/21(水) 11:05:32.10ID:cZp0PZIW >>493,494
「&」はやはり参照でしたか。
左辺の規則と右辺の規則があり、キャストしたポインターでは左辺の規則に従ってなくて、キャストした参照なら左辺の規則に従っていると、そうなっていると覚えるほかないのでありますな。
ありがとう。
「&」はやはり参照でしたか。
左辺の規則と右辺の規則があり、キャストしたポインターでは左辺の規則に従ってなくて、キャストした参照なら左辺の規則に従っていると、そうなっていると覚えるほかないのでありますな。
ありがとう。
496デフォルトの名無しさん
2023/06/29(木) 00:53:29.69ID:l197jz/x なんで可変長配列の名前がvectorなの?
497はちみつ餃子 ◆8X2XSCHEME
2023/06/29(木) 08:14:12.68ID:l+ZsGqGg 伝統。
498デフォルトの名無しさん
2023/06/29(木) 13:14:41.30ID:DfwcYShQ https://www.google.co.jp/search?q=%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB+%E6%84%8F%E5%91%B3
向きを持つ量をベクトルという
向きを持つためには複数の量が必要(単一の量はスカラーという)
それを抽象化して、要素を一列に並べたものをベクトルという
向きを持つ量をベクトルという
向きを持つためには複数の量が必要(単一の量はスカラーという)
それを抽象化して、要素を一列に並べたものをベクトルという
499デフォルトの名無しさん
2023/07/04(火) 17:43:58.34ID:Ld2RSFGK c++に限定される疑問ではないかも知れませんが標準出力がどうやってコンソールに出力しているか?というところで躓いてます
gnuのlibcを見てもわからず、アセンブラを見て0x80というシステムコールをしているところまで辿り着いたけど無学なので理解できずにいます
OSが用意している機能を実行しているという認識であってますか?
gnuのlibcを見てもわからず、アセンブラを見て0x80というシステムコールをしているところまで辿り着いたけど無学なので理解できずにいます
OSが用意している機能を実行しているという認識であってますか?
500はちみつ餃子 ◆8X2XSCHEME
2023/07/04(火) 17:52:47.39ID:wwaI/oJF >>499
そうだよ。
現代の OS は権限の管理がしっかりしてて、アプリケーションは
プロセスの外のリソース (メモリやデバイス) を直接には使えない。
OS に要求して適当なところに橋渡ししてもらう構造。
そうだよ。
現代の OS は権限の管理がしっかりしてて、アプリケーションは
プロセスの外のリソース (メモリやデバイス) を直接には使えない。
OS に要求して適当なところに橋渡ししてもらう構造。
501デフォルトの名無しさん
2023/07/04(火) 18:05:29.71ID:Ld2RSFGK >>500
どうやって実行中のコンソールに出力しているのだろうという素朴な疑問だったのですが、この先はOS仕事という事なんですね
自分で見ろって言われるかもしれませんが、OSの処理の実装を見るのは難易度高いですか?
HelloWorldからどちらに進もうか迷ってます
どうやって実行中のコンソールに出力しているのだろうという素朴な疑問だったのですが、この先はOS仕事という事なんですね
自分で見ろって言われるかもしれませんが、OSの処理の実装を見るのは難易度高いですか?
HelloWorldからどちらに進もうか迷ってます
502デフォルトの名無しさん
2023/07/04(火) 19:16:32.21ID:Ld2RSFGK 同様のテーマのITmediaの記事を見つけたので腰を据えて取り組んでみようと思います
回答いただきありがとうございましたお騒がせしました
回答いただきありがとうございましたお騒がせしました
503はちみつ餃子 ◆8X2XSCHEME
2023/07/05(水) 00:40:03.93ID:h//lr2GB >>501
標準出力の実態はパイプ。
パイプの接続先がターミナルのプロセスが繋がってるだけでカーネルはそれほど大したことはやってない。
と言えれば簡単なんだけど端末制御まわりは歴史的事情でよくわからんことになってるので
ソースコードだけから読み取ろうとするのはしんどいと思う。
標準出力の実態はパイプ。
パイプの接続先がターミナルのプロセスが繋がってるだけでカーネルはそれほど大したことはやってない。
と言えれば簡単なんだけど端末制御まわりは歴史的事情でよくわからんことになってるので
ソースコードだけから読み取ろうとするのはしんどいと思う。
504デフォルトの名無しさん
2023/07/13(木) 01:46:39.34ID:a7xsv8mg shared_ptrの解放時にweak_ptrを登録していたSTLコンテナから登録抹消したいけど、
shared_ptrのデリータでshared_ptr自身は扱えないっぽい。
出来ないということは、何か他にいい方法があるか、根本的に何か考え方間違ってる?
shared_ptrのデリータでshared_ptr自身は扱えないっぽい。
出来ないということは、何か他にいい方法があるか、根本的に何か考え方間違ってる?
505はちみつ餃子 ◆8X2XSCHEME
2023/07/13(木) 18:07:22.25ID:46c6OBqO >>504
設計意図次第だけど
コンテナにはオブジェクト本体をいれて shared_ptr は
コンテナ内の要素を指すイテレータを指す
という構造はどうだろう。
#include <iostream>
#include <memory>
#include <set>
int main(void) {
std::set<int> container;
auto [iter, result] = container.emplace(42);
{
// コンテナ内の要素を指す shared_ptr をいくつも作る
auto x = std::shared_ptr<decltype(iter)>(new decltype(container)::iterator(iter), [&container](decltype(container)::iterator* p) { container.erase(*p); delete p;});
auto y = x;
auto z = x;
// コンテナの中には要素が入ってる
for (auto& x : container) std::cout << x << " ";
std::cout << std::endl;
// shared_ptr はここで消滅
}
// デリータが消したのでもう残ってない
for (auto& x : container) std::cout << x << std::endl;
}
設計意図次第だけど
コンテナにはオブジェクト本体をいれて shared_ptr は
コンテナ内の要素を指すイテレータを指す
という構造はどうだろう。
#include <iostream>
#include <memory>
#include <set>
int main(void) {
std::set<int> container;
auto [iter, result] = container.emplace(42);
{
// コンテナ内の要素を指す shared_ptr をいくつも作る
auto x = std::shared_ptr<decltype(iter)>(new decltype(container)::iterator(iter), [&container](decltype(container)::iterator* p) { container.erase(*p); delete p;});
auto y = x;
auto z = x;
// コンテナの中には要素が入ってる
for (auto& x : container) std::cout << x << " ";
std::cout << std::endl;
// shared_ptr はここで消滅
}
// デリータが消したのでもう残ってない
for (auto& x : container) std::cout << x << std::endl;
}
506デフォルトの名無しさん
2023/07/13(木) 21:30:08.90ID:BEK5Ztwm >>505 ありがとうございます。実体とイテレータ、参考になります。
おかげで解放時何とかshared_ptrで引数を渡そうとしてましたが、諦めて実体でもいいんではと思い始めました。
回答を見るまでは、shared_ptr<shared_ptr<X>>なら解放時にshared_ptr<X>取れるじゃん、
修正とか色々めんどくさいけど、とかアホなこと考えてました。
処理の概略はshared_ptr側で値管理、コンテナ側は登録されたweak_ptrの値と別の値が合致したら処理、
shared_ptr側解放時コンテナ側から登録抹消(抹消関数の引数にshared_ptr:これがNG)というものです。
おかげで解放時何とかshared_ptrで引数を渡そうとしてましたが、諦めて実体でもいいんではと思い始めました。
回答を見るまでは、shared_ptr<shared_ptr<X>>なら解放時にshared_ptr<X>取れるじゃん、
修正とか色々めんどくさいけど、とかアホなこと考えてました。
処理の概略はshared_ptr側で値管理、コンテナ側は登録されたweak_ptrの値と別の値が合致したら処理、
shared_ptr側解放時コンテナ側から登録抹消(抹消関数の引数にshared_ptr:これがNG)というものです。
507デフォルトの名無しさん
2023/07/16(日) 13:37:45.84ID:aonKa36p 設計意図次第
508504
2023/07/16(日) 21:29:25.31ID:AcIm+utR 何でかshared_ptrって派生出来ないと思い込んでたけど出来た。
shared_ptrで出来ない理由は分からんが、他に変な問題が無ければほぼ当初の想定通り。
ありがとうありがとう。
template<class T>
struct X : public std::shared_ptr<T> {
X(T* t) : std::shared_ptr<T>(t){}
~X(){/*X自体の登録抹消*/}
};
shared_ptrで出来ない理由は分からんが、他に変な問題が無ければほぼ当初の想定通り。
ありがとうありがとう。
template<class T>
struct X : public std::shared_ptr<T> {
X(T* t) : std::shared_ptr<T>(t){}
~X(){/*X自体の登録抹消*/}
};
509蟻人間 ◆T6xkBnTXz7B0
2023/07/16(日) 22:10:43.92ID:/+p/BpGt クラス内部で
using std::shared_ptr<T>;
を付けるとコンストラクタの実装が完璧になるよ。
using std::shared_ptr<T>;
を付けるとコンストラクタの実装が完璧になるよ。
510蟻人間 ◆T6xkBnTXz7B0
2023/07/16(日) 22:12:03.59ID:/+p/BpGt511504
2023/07/16(日) 22:37:21.87ID:AcIm+utR >>510 基底クラス(shared_ptr)のコンストラクタを派生側に引っ張って来る便利な奴ですね(覚えきれてない)。
ありがとうございます。自前実装不要なのは助かります。
ありがとうございます。自前実装不要なのは助かります。
512はちみつ餃子 ◆8X2XSCHEME
2023/07/17(月) 00:18:57.61ID:YifLUjyU513504
2023/07/17(月) 01:33:58.67ID:9b8iHtwy >>512 …あー。それは意図通りではないですね。実際の解放はデストラクタで
use_count()==1であることを確認する必要があるのかな。ありがとうございます。
use_count()==1であることを確認する必要があるのかな。ありがとうございます。
514はちみつ餃子 ◆8X2XSCHEME
2023/07/18(火) 09:19:59.88ID://OyAtPF パブリック継承した型では基底への型変換を禁じることができない。
つまり
X<int> foo = new int(1);
std::shared_ptr<int> bar = foo;
みたいなことが出来てしまう。
間違った使い方を想定するとキリがないから
なんでもかんでもガチガチに型を設計する必要はないんだけど、
この場合はどこかでミスりそうと思うので
私なら継承でスマートポインタの挙動をカスタマイズしようとはしないと思う。
つまり
X<int> foo = new int(1);
std::shared_ptr<int> bar = foo;
みたいなことが出来てしまう。
間違った使い方を想定するとキリがないから
なんでもかんでもガチガチに型を設計する必要はないんだけど、
この場合はどこかでミスりそうと思うので
私なら継承でスマートポインタの挙動をカスタマイズしようとはしないと思う。
515504
2023/07/19(水) 03:16:45.39ID:0uGQJSD8 >>514
御忠告ありがとうございます。
高々shared_ptr自身を解放するだけと思っていたんですが、色々難しいですね。
> パブリック継承した型では基底への型変換を禁じることができない。
そんな問題があるとは。
派生クラスのキャスト演算子は引っかからず、基底クラスの
コピーコンストラクタをいじらないと禁止出来ないっぽかった。
protected継承にしてみたら代入は出来なかった。うーん、他に問題が無ければこれですかね。
> 間違った使い方を想定するとキリがないから
> なんでもかんでもガチガチに型を設計する必要はないんだけど、
> この場合はどこかでミスりそうと思うので
> 私なら継承でスマートポインタの挙動をカスタマイズしようとはしないと思う。
候補はprotected継承(暫定)、shared_ptr相当自作、或いは他の未知なる何か。
しかし一番素直で的確に機能を実現可能と思っているのがshared_ptrの拡張なので、
別の形で実現する方法はどうも迂遠過ぎて自分には思いつかないです。
# shared_ptr側がデータ実体と登録したコンテナの情報を持ち、コンテナ側はweak_ptrで参照
なので流石に自作は無し、とりあえず他に致命的な問題が無ければprotected継承で実装して、
他により良い方法を思いついたらそっちに乗り換えることにします。
御忠告ありがとうございます。
高々shared_ptr自身を解放するだけと思っていたんですが、色々難しいですね。
> パブリック継承した型では基底への型変換を禁じることができない。
そんな問題があるとは。
派生クラスのキャスト演算子は引っかからず、基底クラスの
コピーコンストラクタをいじらないと禁止出来ないっぽかった。
protected継承にしてみたら代入は出来なかった。うーん、他に問題が無ければこれですかね。
> 間違った使い方を想定するとキリがないから
> なんでもかんでもガチガチに型を設計する必要はないんだけど、
> この場合はどこかでミスりそうと思うので
> 私なら継承でスマートポインタの挙動をカスタマイズしようとはしないと思う。
候補はprotected継承(暫定)、shared_ptr相当自作、或いは他の未知なる何か。
しかし一番素直で的確に機能を実現可能と思っているのがshared_ptrの拡張なので、
別の形で実現する方法はどうも迂遠過ぎて自分には思いつかないです。
# shared_ptr側がデータ実体と登録したコンテナの情報を持ち、コンテナ側はweak_ptrで参照
なので流石に自作は無し、とりあえず他に致命的な問題が無ければprotected継承で実装して、
他により良い方法を思いついたらそっちに乗り換えることにします。
516504
2023/07/19(水) 18:45:15.41ID:4lyHW67x そういえばweak_ptr試してない…?と思って試したら当然の如く代入できなかったので、
public継承でほったらかします。
public継承でほったらかします。
517デフォルトの名無しさん
2023/07/20(木) 15:28:07.42ID:6BSTmMYa templateの世界へようこそ
518はちみつ餃子 ◆8X2XSCHEME
2023/07/21(金) 13:23:19.14ID:NiBubQrd std::unique_ptr なら型引数でもデリータを与えることが出来て、
型引数が異なれば異なる型ということになる。
#include <memory>
template<class T> struct custom_delete : public default_delete<T> {};
int main(void) {
std::unique_ptr<int, custom_delete<int>> foo{new int(42)};
// ↓ 別の型なので移動できない。 エラーになる。
std::unique_ptr<int> bar = std::move(foo);
}
ところが std::shared_ptr では型引数でデリータをカスタマイズすることが出来ない。
解体は動的な型に従うという保証をしているので。
#include <memory>
struct foo {};
struct bar : public foo {};
int main(void) {
// 解体のときに foo ではなく bar の
// デストラクタが呼ばれることが保証される
std::shared_ptr<foo> x{new bar};
}
std::shared_ptr は動的な情報 (実行時の情報) を元に挙動が決まるというのが
設計理念なので削除方法をカスタマイズしたいならコンストラクタにデリータを渡す
というのが最も自然な形と言える。
std::shared_ptr を継承する形でカスタマイズしようとするのは
してもそれ自体は仕様に反しないけれど不自然だなぁとは思う。 (個人の感想です。)
型引数が異なれば異なる型ということになる。
#include <memory>
template<class T> struct custom_delete : public default_delete<T> {};
int main(void) {
std::unique_ptr<int, custom_delete<int>> foo{new int(42)};
// ↓ 別の型なので移動できない。 エラーになる。
std::unique_ptr<int> bar = std::move(foo);
}
ところが std::shared_ptr では型引数でデリータをカスタマイズすることが出来ない。
解体は動的な型に従うという保証をしているので。
#include <memory>
struct foo {};
struct bar : public foo {};
int main(void) {
// 解体のときに foo ではなく bar の
// デストラクタが呼ばれることが保証される
std::shared_ptr<foo> x{new bar};
}
std::shared_ptr は動的な情報 (実行時の情報) を元に挙動が決まるというのが
設計理念なので削除方法をカスタマイズしたいならコンストラクタにデリータを渡す
というのが最も自然な形と言える。
std::shared_ptr を継承する形でカスタマイズしようとするのは
してもそれ自体は仕様に反しないけれど不自然だなぁとは思う。 (個人の感想です。)
519504
2023/07/21(金) 20:08:15.21ID:jaEOXewl 一応発端の動かなかったコードを短くしたのでおいときます。
0.動機:shared_ptr<int>のdeleterでvector<weak_ptr>を削除したい
1.deleter内だとxは有効でuse_count 0だったけど、vectorのweak_ptrは無効だったのでvectorから削除できない。
2.shared_ptr<int>のデリータはint*に対するもので、shared_ptr<int>へのポインタはshared_ptr<int>の
デストラクタじゃないと処理できないけど、既製品だから外からいじられない。
3.んじゃ、手っ取り早くshared_ptr継承してデストラクタを使えるようにすれば?
というのが趣旨でした。
#include<vector>
#include<memory>
int main(){
std::vector<std::weak_ptr<int>> v;
std::shared_ptr<int> x(new int(3), [&x, &v](int* i){
for(int j = 0; j < v.size(); j++){
std::shared_ptr<int> t = v[j].lock();
if(t && t == x){v.erase(v.begin() + j); break;}
}
delete i;
});
v.push_back(x);
}
0.動機:shared_ptr<int>のdeleterでvector<weak_ptr>を削除したい
1.deleter内だとxは有効でuse_count 0だったけど、vectorのweak_ptrは無効だったのでvectorから削除できない。
2.shared_ptr<int>のデリータはint*に対するもので、shared_ptr<int>へのポインタはshared_ptr<int>の
デストラクタじゃないと処理できないけど、既製品だから外からいじられない。
3.んじゃ、手っ取り早くshared_ptr継承してデストラクタを使えるようにすれば?
というのが趣旨でした。
#include<vector>
#include<memory>
int main(){
std::vector<std::weak_ptr<int>> v;
std::shared_ptr<int> x(new int(3), [&x, &v](int* i){
for(int j = 0; j < v.size(); j++){
std::shared_ptr<int> t = v[j].lock();
if(t && t == x){v.erase(v.begin() + j); break;}
}
delete i;
});
v.push_back(x);
}
520デフォルトの名無しさん
2023/07/25(火) 09:24:45.92ID:k8WJtY+U >shared_ptr<int>へのポインタはshared_ptr<int>のデストラクタじゃないと処理できない
これが無理っしょ
これが無理っしょ
521デフォルトの名無しさん
2023/07/28(金) 10:56:39.59ID:Zgvcm9f5 なんで出来ると思ったの
522デフォルトの名無しさん
2023/07/29(土) 20:15:59.76ID:ETnyq2kJ shared_ptrのデリータで他所様のオブジェクトもついでに解体したろっていう発想そのものが危険な香りしかしなくてゾワゾワする
523デフォルトの名無しさん
2023/07/29(土) 20:25:36.66ID:xEb8mTKO シャー専用ptr
5241
2023/09/03(日) 20:55:45.58ID:/ExZEMtW 「プログラム」作るのって、やってみたいけど、全然知らないから、教えて欲しい。
からのスレの目的で建てました。
からのスレの目的で建てました。
525デフォルトの名無しさん
2023/09/03(日) 20:59:12.95ID:W287fTtw まず、何が作りたいかイメージしてみましょう
526デフォルトの名無しさん
2023/09/04(月) 10:11:49.98ID:/ASAZOX6 >>524 がC++をやるのは早過ぎる
先にpythonでもやってみろ
先にpythonでもやってみろ
527デフォルトの名無しさん
2023/10/02(月) 22:07:14.88ID:l4Vvzubd 次のプログラムを実行するとコメントのように出力がされ、mainの最後で例外が発生してしまいます。
なぜ例外が発生するかわかる方教えてください。
mainを通してnewは2回実行され、deleteも2回実行されるので空ポインタをdeleteしていることもないと思うのです。
#include <iostream>
using namespace std;
class Csmp1 {
private:
int x;
int* p;
public:
Csmp1(int n);
~Csmp1();
void disp() { cout << "x=" << x << endl;}
};
Csmp1::Csmp1(int n) {
x = n;
p = new int;
cout << "constructor " << x << endl;
}
Csmp1::~Csmp1() {
delete p;
cout << "destructor " << x << endl;
}
int main()
{
Csmp1 d3(300); // "constructor 300"と出力
d3.disp(); // "x=300"と出力
d3 = Csmp1(400); // "constructor 400"と出力し、その後"destructor 400"と出力
d3.disp(); // x=400と出力
return 0;
} // デストラクタが呼ばれ、delete の部分で"Unknowin signal"例外発生
なぜ例外が発生するかわかる方教えてください。
mainを通してnewは2回実行され、deleteも2回実行されるので空ポインタをdeleteしていることもないと思うのです。
#include <iostream>
using namespace std;
class Csmp1 {
private:
int x;
int* p;
public:
Csmp1(int n);
~Csmp1();
void disp() { cout << "x=" << x << endl;}
};
Csmp1::Csmp1(int n) {
x = n;
p = new int;
cout << "constructor " << x << endl;
}
Csmp1::~Csmp1() {
delete p;
cout << "destructor " << x << endl;
}
int main()
{
Csmp1 d3(300); // "constructor 300"と出力
d3.disp(); // "x=300"と出力
d3 = Csmp1(400); // "constructor 400"と出力し、その後"destructor 400"と出力
d3.disp(); // x=400と出力
return 0;
} // デストラクタが呼ばれ、delete の部分で"Unknowin signal"例外発生
528蟻人間 ◆T6xkBnTXz7B0
2023/10/02(月) 22:12:06.36ID:/sjCb2h4 >>527
d3 への代入で暗黙のコピーコンストラクタが使われている。コピーコンストラクタを適切に定義すれば解决する。
d3 への代入で暗黙のコピーコンストラクタが使われている。コピーコンストラクタを適切に定義すれば解决する。
529蟻人間 ◆T6xkBnTXz7B0
2023/10/02(月) 22:12:09.92ID:/sjCb2h4 >>527
d3 への代入で暗黙のコピーコンストラクタが使われている。コピーコンストラクタを適切に定義すれば解决する。
d3 への代入で暗黙のコピーコンストラクタが使われている。コピーコンストラクタを適切に定義すれば解决する。
530蟻人間 ◆T6xkBnTXz7B0
2023/10/02(月) 22:12:23.61ID:/sjCb2h4 >>527
d3 への代入で暗黙のコピーコンストラクタが使われている。コピーコンストラクタを適切に定義すれば解决する。
d3 への代入で暗黙のコピーコンストラクタが使われている。コピーコンストラクタを適切に定義すれば解决する。
531蟻人間 ◆T6xkBnTXz7B0
2023/10/02(月) 22:12:42.13ID:/sjCb2h4 >>527
d3 への代入で暗黙のコピーコンストラクタが使われている。コピーコンストラクタを適切に定義すれば解决する。
d3 への代入で暗黙のコピーコンストラクタが使われている。コピーコンストラクタを適切に定義すれば解决する。
532蟻人間 ◆T6xkBnTXz7B0
2023/10/02(月) 22:18:32.15ID:/sjCb2h4 連投すみません。コピーコンストラクタと、代入もです。
533はちみつ餃子 ◆8X2XSCHEME
2023/10/03(火) 00:13:21.44ID:OUiDjLFt >>527
暗黙に生成される代入演算子は全てのサブオブジェクトを代入したような挙動になるルール。
ポインタを代入した場合には代入元と代入先のポインタが指す先のオブジェクトは同一なので
一方のポインタを通じて delete したならもう一方のポインタからオブジェクトに触れようとしてはならない。
(もう存在しないので。)
この場合は
d3 = Csmp1(400);
としたときに生成される一時オブジェクトはこの式が終わった時点で解体されるので
d3 内にあるポインタはデストラクタで delete 済み、すなわち無効なポインタとなる。
d3 のデストラクタが起動したときはデータメンバ p が指している先は無効なので
無効なポインタをいじったことになって問題が生じる。
それと d3 のコンストラクトのときに new したオブジェクトはどこからも delete されてない。
暗黙に生成される代入演算子は全てのサブオブジェクトを代入したような挙動になるルール。
ポインタを代入した場合には代入元と代入先のポインタが指す先のオブジェクトは同一なので
一方のポインタを通じて delete したならもう一方のポインタからオブジェクトに触れようとしてはならない。
(もう存在しないので。)
この場合は
d3 = Csmp1(400);
としたときに生成される一時オブジェクトはこの式が終わった時点で解体されるので
d3 内にあるポインタはデストラクタで delete 済み、すなわち無効なポインタとなる。
d3 のデストラクタが起動したときはデータメンバ p が指している先は無効なので
無効なポインタをいじったことになって問題が生じる。
それと d3 のコンストラクトのときに new したオブジェクトはどこからも delete されてない。
534527
2023/10/03(火) 00:55:04.57ID:RKQFDOr6 >>532-533
お二人さま ありがとうございます。
>d3 = Csmp1(400);としたときに生成される一時オブジェクトはこの式が終わった時点で解体される
右辺により生成されるオブジェクトが単にd3に格納されるのではないのですか。
それと入れ替わりに、d3コンストラクト時のオブジェクトのデストラクタが呼ばれると思ってました。
(どこからも参照されなくなるので)
自分が根本的に誤っている気がします、すみませんが上の内容でおかしい点を教えてください。
お二人さま ありがとうございます。
>d3 = Csmp1(400);としたときに生成される一時オブジェクトはこの式が終わった時点で解体される
右辺により生成されるオブジェクトが単にd3に格納されるのではないのですか。
それと入れ替わりに、d3コンストラクト時のオブジェクトのデストラクタが呼ばれると思ってました。
(どこからも参照されなくなるので)
自分が根本的に誤っている気がします、すみませんが上の内容でおかしい点を教えてください。
535はちみつ餃子 ◆8X2XSCHEME
2023/10/03(火) 02:13:14.63ID:OUiDjLFt >>534
> 右辺により生成されるオブジェクトが単にd3に格納
JavaScript とか Python の動的型言語の経験があるのかな?
それとも Java や C# の参照型のモデルで考えてる?
C++ では左辺はメモリ上の特定の場所に対応づいていて、
別の場所 (右辺で生成される一時オブジェクト) にあるものを格納するというのは
コピーするということ。
その上で不要になった一時オブジェクトは解体される。
一時オブジェクトは一部の例外を除いて完結式 (完全式ということもある) の終わりのタイミングで
解体されるルールなのでこの場合は行の終わりが解体のタイミングということになる。
> 右辺により生成されるオブジェクトが単にd3に格納
JavaScript とか Python の動的型言語の経験があるのかな?
それとも Java や C# の参照型のモデルで考えてる?
C++ では左辺はメモリ上の特定の場所に対応づいていて、
別の場所 (右辺で生成される一時オブジェクト) にあるものを格納するというのは
コピーするということ。
その上で不要になった一時オブジェクトは解体される。
一時オブジェクトは一部の例外を除いて完結式 (完全式ということもある) の終わりのタイミングで
解体されるルールなのでこの場合は行の終わりが解体のタイミングということになる。
536はちみつ餃子 ◆8X2XSCHEME
2023/10/03(火) 02:13:25.78ID:OUiDjLFt >>534
> 右辺により生成されるオブジェクトが単にd3に格納
JavaScript とか Python の動的型言語の経験があるのかな?
それとも Java や C# の参照型のモデルで考えてる?
C++ では左辺はメモリ上の特定の場所に対応づいていて、
別の場所 (右辺で生成される一時オブジェクト) にあるものを格納するというのは
コピーするということ。
その上で不要になった一時オブジェクトは解体される。
一時オブジェクトは一部の例外を除いて完結式 (完全式ということもある) の終わりのタイミングで
解体されるルールなのでこの場合は行の終わりが解体のタイミングということになる。
> 右辺により生成されるオブジェクトが単にd3に格納
JavaScript とか Python の動的型言語の経験があるのかな?
それとも Java や C# の参照型のモデルで考えてる?
C++ では左辺はメモリ上の特定の場所に対応づいていて、
別の場所 (右辺で生成される一時オブジェクト) にあるものを格納するというのは
コピーするということ。
その上で不要になった一時オブジェクトは解体される。
一時オブジェクトは一部の例外を除いて完結式 (完全式ということもある) の終わりのタイミングで
解体されるルールなのでこの場合は行の終わりが解体のタイミングということになる。
537はちみつ餃子 ◆8X2XSCHEME
2023/10/03(火) 02:17:47.16ID:OUiDjLFt サーバから書込みエラーが返ってきたのを専ブラの機能でリトライしたら多重投稿になってしまってるな。
なんか不安定な状況っぽい
なんか不安定な状況っぽい
538デフォルトの名無しさん
2023/10/05(木) 17:15:14.18ID:WXXGTjkD みんなでリトライするからF5攻撃並みに自爆DOS攻撃
539デフォルトの名無しさん
2023/10/05(木) 18:29:28.73ID:S7K0dlIY540デフォルトの名無しさん
2023/10/06(金) 10:09:01.67ID:Zl0hPCVy newとdeleteを直で呼んでるかどうかと
今回の問題(コピーが発生してるかどうか)は
関係無いんじゃね?
今回の問題(コピーが発生してるかどうか)は
関係無いんじゃね?
541デフォルトの名無しさん
2023/10/06(金) 10:16:23.02ID:QFTcWZUD いきなりC++から入るとは…
考え直した方がいい
考え直した方がいい
542デフォルトの名無しさん
2023/10/06(金) 12:08:09.60ID:xj8n2YWF543デフォルトの名無しさん
2023/10/06(金) 13:16:53.99ID:Zl0hPCVy544はちみつ餃子 ◆8X2XSCHEME
2023/10/06(金) 16:48:00.89ID:R7EjAYTn 両方やっとけばええじゃろ。
545デフォルトの名無しさん
2023/10/06(金) 21:05:50.93ID:BgvqARb2 vector dp(N+1,vector(i+1,vector<mint>(i,0)));
これはdp[N+1][i+1][i]個のデータを確保していると思っておk?
これはdp[N+1][i+1][i]個のデータを確保していると思っておk?
546デフォルトの名無しさん
2023/10/06(金) 21:10:07.75ID:G9Jlm58L OK牧場!
547デフォルトの名無しさん
2023/10/06(金) 21:44:11.09ID:BgvqARb2 TXH!
548527
2023/10/16(月) 23:49:47.91ID:6sfjI2pS >>535 を始めとして皆さんまたまたありがとうございます。
アセンブラ、Cを長くやってきたあと、最近C#を少し覚えたのでそちらと混同していました。
コピーコンストラクタと代入の演算子関数を作ろうとしていますがまだ途中。少しずつ進めます。
アセンブラ、Cを長くやってきたあと、最近C#を少し覚えたのでそちらと混同していました。
コピーコンストラクタと代入の演算子関数を作ろうとしていますがまだ途中。少しずつ進めます。
549デフォルトの名無しさん
2023/10/17(火) 23:09:31.94ID:cH9YbrYr 既製品のクラスライブラリについて、クラス階層が深いところのクラスは、公開メンバの全体をひと目で見渡すことができません。
マニュアルや継承のツリーををたどって地道に調べるしかないのですか。
マニュアルや継承のツリーををたどって地道に調べるしかないのですか。
550はちみつ餃子 ◆8X2XSCHEME
2023/10/18(水) 09:51:20.64ID:UZlHr99J551デフォルトの名無しさん
2023/10/18(水) 17:06:40.02ID:d+gN3jrr 既製品ならドキュメントあるだろ
ドキュメントで謳ってないことはやるべきでない
ドキュメントで謳ってないことはやるべきでない
552デフォルトの名無しさん
2023/10/18(水) 21:01:33.56ID:XEk7oAP2 visual studio community 2022で、
他のソリューションで作成されたmoduleをimportする方法がわかりません。
#includeみたいにパスを指定する方法とかがあるんでしょうか?
他のソリューションで作成されたmoduleをimportする方法がわかりません。
#includeみたいにパスを指定する方法とかがあるんでしょうか?
553デフォルトの名無しさん
2023/10/18(水) 21:18:35.91ID:GW9b62tt あるよ
554デフォルトの名無しさん
2023/10/18(水) 22:46:30.83ID:XEk7oAP2 >>553
ぜひ教えてください!
ぜひ教えてください!
555デフォルトの名無しさん
2023/10/19(木) 10:07:14.52ID:W1XtHktx 外部モジュール取り込みは言語仕様じゃ無くてIDEの機能だから
556デフォルトの名無しさん
2023/10/20(金) 09:56:30.99ID:/M3RKJCH IDEに頼ってるとアホになるよ
557デフォルトの名無しさん
2023/10/21(土) 16:32:35.29ID:dhBJRkMq 0のうちにやめとけ
時間がもったいない
時間がもったいない
558デフォルトの名無しさん
2023/10/26(木) 23:16:10.15ID:4gABazLN typedef uint8_t byte;
:
byte a = 3;
uint8_t b = a;
bの初期化は型不一致エラーにならないと思います。
コンパイラは型の異なる変数の初期化や代入を見つけると、typedefを探して元の型が同一かを調べてエラーにするかどうかを決めるのですか。
:
byte a = 3;
uint8_t b = a;
bの初期化は型不一致エラーにならないと思います。
コンパイラは型の異なる変数の初期化や代入を見つけると、typedefを探して元の型が同一かを調べてエラーにするかどうかを決めるのですか。
559デフォルトの名無しさん
2023/10/26(木) 23:23:19.82ID:oN20rU1J >>558
typedef は型の別名を作る機能であって新しい型を作らない。
typedef は型の別名を作る機能であって新しい型を作らない。
560デフォルトの名無しさん
2023/11/05(日) 12:44:18.01ID:iVzKXsmj Visual StudioでソリューションAでビルドしたブツ(.exe、.dll、lib)、シンボルファイル(.pdb)、必要なヘッダファイル(.h)
をソリューションBで取り込むの場合、Aのビルド後イベントとBのビルド前イベントを駆使してフォルダのパスは
"$(Solution)..\x\$(Platform)\$(Configuration)" みたいなマクロで解決、みたいなローテク頼みという印象、
Visual Studio 2019以降だと今は実はもっと簡単?
をソリューションBで取り込むの場合、Aのビルド後イベントとBのビルド前イベントを駆使してフォルダのパスは
"$(Solution)..\x\$(Platform)\$(Configuration)" みたいなマクロで解決、みたいなローテク頼みという印象、
Visual Studio 2019以降だと今は実はもっと簡単?
561デフォルトの名無しさん
2023/11/10(金) 23:40:20.59ID:mtEH7OmF class MyClass {
public:
MyClass();
:
};
int main()
{
MyClass* c = new MyClass(); ①
MyClass d;
MyClass* dp = &d; ②
:
}
オブジェクトのポインタは①や②のように取得できると思います。
私からすると①はdeleteしなければならないのでできれば使いたくない。
①の書き方は、よく入門書に出てくる、継承関係にあるポインタの相互代入のためにあると考えて正しいですか。
public:
MyClass();
:
};
int main()
{
MyClass* c = new MyClass(); ①
MyClass d;
MyClass* dp = &d; ②
:
}
オブジェクトのポインタは①や②のように取得できると思います。
私からすると①はdeleteしなければならないのでできれば使いたくない。
①の書き方は、よく入門書に出てくる、継承関係にあるポインタの相互代入のためにあると考えて正しいですか。
562デフォルトの名無しさん
2023/11/10(金) 23:49:08.54ID:VDRR6isO >>561
その「相互代入」って何ですか?
その「相互代入」って何ですか?
563はちみつ餃子 ◆8X2XSCHEME
2023/11/10(金) 23:56:43.46ID:Irnop6+y >>561
自動変数の寿命はスコープ単位だから
それより長い寿命のオブジェクトが必要なら new する。
寿命の種類のことを Storage duration といい、
new で生成したオブジェクトは Dynamic storage duration に該当する。
継承関係がどうこうというのは何が言いたいのかよくわからないが、
ポインタの性質はオブジェクトの寿命とは関係ない。
自動変数の寿命はスコープ単位だから
それより長い寿命のオブジェクトが必要なら new する。
寿命の種類のことを Storage duration といい、
new で生成したオブジェクトは Dynamic storage duration に該当する。
継承関係がどうこうというのは何が言いたいのかよくわからないが、
ポインタの性質はオブジェクトの寿命とは関係ない。
564デフォルトの名無しさん
2023/11/12(日) 00:13:49.90ID:M40i1rJ9 相互代入は言葉がおかしいですね。
基底クラスのポインタで派生クラスのオブジェクトをポイントできるというものです。
オブジェクトのボインタを使う場面があまりないので用途を聞きました。
>>563
>自動変数の寿命はスコープ単位だから
それより長い寿命のオブジェクトが必要なら new する。
自分の場合、関数内より長い寿命が必要となったらそれはもうグローバルにしてしまいます。設計方針がよくないですかね。
基底クラスのポインタで派生クラスのオブジェクトをポイントできるというものです。
オブジェクトのボインタを使う場面があまりないので用途を聞きました。
>>563
>自動変数の寿命はスコープ単位だから
それより長い寿命のオブジェクトが必要なら new する。
自分の場合、関数内より長い寿命が必要となったらそれはもうグローバルにしてしまいます。設計方針がよくないですかね。
565はちみつ餃子 ◆8X2XSCHEME
2023/11/12(日) 02:00:51.06ID:O0gb6uIB >>564
グローバル変数として書いたオブジェクトの寿命は static storage duration に該当する。
この static というやつは main が始まる前に構築されて main が終わった後に解体されるので
必要以上に長い寿命になってしまうことが多いし、
実行時の情報を元にして構築するオブジェクトを static にはしようがない。
dynamic (new でのオブジェクト生成) が必要になる場面はごく普通にある。
ごく普通にあるのに使わずに済ませてるならたぶん不自然な設計になってると思う。
グローバル変数は寿命も長すぎるがスコープも広すぎる。
人間は自分が思ってるより馬鹿だから最初にどういう想定をしてたのか忘れて要らんことをしてワヤにする。
触らせたくないものは隠しておくのはカプセル化の考え方の重要な部分。
本当に人間は忘れるし間違える。
部品ごとに間違った使い方を出来ないように配慮しておかないと規模を大きく出来ない。
まあ逆に言えば小さいプログラムではそんなに凝ったことをしなくても大丈夫なんだけど。
グローバル変数として書いたオブジェクトの寿命は static storage duration に該当する。
この static というやつは main が始まる前に構築されて main が終わった後に解体されるので
必要以上に長い寿命になってしまうことが多いし、
実行時の情報を元にして構築するオブジェクトを static にはしようがない。
dynamic (new でのオブジェクト生成) が必要になる場面はごく普通にある。
ごく普通にあるのに使わずに済ませてるならたぶん不自然な設計になってると思う。
グローバル変数は寿命も長すぎるがスコープも広すぎる。
人間は自分が思ってるより馬鹿だから最初にどういう想定をしてたのか忘れて要らんことをしてワヤにする。
触らせたくないものは隠しておくのはカプセル化の考え方の重要な部分。
本当に人間は忘れるし間違える。
部品ごとに間違った使い方を出来ないように配慮しておかないと規模を大きく出来ない。
まあ逆に言えば小さいプログラムではそんなに凝ったことをしなくても大丈夫なんだけど。
566デフォルトの名無しさん
2023/11/12(日) 11:04:18.35ID:l8rhUXJt >>561
>@の書き方は、よく入門書に出てくる、継承関係にあるポインタの相互代入のためにあると考えて正しいですか。
そのためだけにあるという訳ではない
>私からすると@はdeleteしなければならないのでできれば使いたくない。
生のポインタではなくスマートポインタ(unique_ptrやshared_ptr)を使えば
deleteはスマートポインタがやってくれる
構築は uniqu_ptr <MyClass> = new MyClass(); や
uniqu_ptr <MyClass> = make_unique <MyClass> (); のようにやる
>@の書き方は、よく入門書に出てくる、継承関係にあるポインタの相互代入のためにあると考えて正しいですか。
そのためだけにあるという訳ではない
>私からすると@はdeleteしなければならないのでできれば使いたくない。
生のポインタではなくスマートポインタ(unique_ptrやshared_ptr)を使えば
deleteはスマートポインタがやってくれる
構築は uniqu_ptr <MyClass> = new MyClass(); や
uniqu_ptr <MyClass> = make_unique <MyClass> (); のようにやる
567デフォルトの名無しさん
2023/11/12(日) 13:14:04.39ID:xpiKETrj > 基底クラスのポインタで派生クラスのオブジェクトをポイントできるというものです。
> オブジェクトのボインタを使う場面があまりないので用途を聞きました。
アップキャストのことだろうかね。
必ずといっていいほど使う機会がある。関数の引数にオブジェクトを渡すときとか
> オブジェクトのボインタを使う場面があまりないので用途を聞きました。
アップキャストのことだろうかね。
必ずといっていいほど使う機会がある。関数の引数にオブジェクトを渡すときとか
568デフォルトの名無しさん
2023/11/13(月) 06:27:48.00ID:qbVz2ceg >>561 は、最初から必要数が決まっているオブジェクトしか作ったことがないのかな。
リストやツリー構造を自作していれば、①が必要なケースは分かると思うけど。
リストやツリー構造を自作していれば、①が必要なケースは分かると思うけど。
569デフォルトの名無しさん
2023/11/13(月) 10:31:45.02ID:IRswNIWu >>567
型チェックしなきゃ危険だけどな
型チェックしなきゃ危険だけどな
570デフォルトの名無しさん
2023/11/13(月) 13:26:36.10ID:qAieNn1D uniqu_ptr
571デフォルトの名無しさん
2023/11/13(月) 18:54:22.80ID:CCXWxw1E572デフォルトの名無しさん
2023/11/13(月) 23:59:54.01ID:RLYu3oMv573デフォルトの名無しさん
2023/11/14(火) 00:03:40.68ID:F1cdKor4 >>567
だいたい参照で済んでしまいます
だいたい参照で済んでしまいます
574デフォルトの名無しさん
2023/11/14(火) 12:46:18.30ID:SRCspH78 mallocもnewも使ったこと無いってやばいぞ
575はちみつ餃子 ◆8X2XSCHEME
2023/11/14(火) 15:58:08.40ID:oTbgWDDI new 演算子はオーバーロードも出来て、型ごとにメモリの確保の仕方を変えるといったようなことも出来る。
メモリの確保と値の構築を別のレイヤとして定義できるということに意味がある。 (いわゆる関心の分離?)
低レイヤでも便利な場面はたぶんある。
分離する甲斐がないほど小規模ならべた書きが悪いわけじゃないけど
あえてべた書きという設計を選ぶってのとなんもわからんで使わないってのでは違う。
知っておくに越したことはないよ。
メモリの確保と値の構築を別のレイヤとして定義できるということに意味がある。 (いわゆる関心の分離?)
低レイヤでも便利な場面はたぶんある。
分離する甲斐がないほど小規模ならべた書きが悪いわけじゃないけど
あえてべた書きという設計を選ぶってのとなんもわからんで使わないってのでは違う。
知っておくに越したことはないよ。
576デフォルトの名無しさん
2023/11/14(火) 21:59:36.46ID:WxE96Zj2 空配列を用意してそれを順繰り使い回す
チープなCPUでは必須の方法
チープなCPUでは必須の方法
577デフォルトの名無しさん
2023/11/14(火) 22:15:51.21ID:VpxEmvp/ RAM2KBでmallocが必要かどうか
578デフォルトの名無しさん
2023/11/15(水) 09:06:17.34ID:vh+zgKB1 よく
A a = new A();
a->b();
delete a;
みたいに生成してすぐ解放ってのがありますけど、
A a;
a.b();
じゃ駄目なんでしょうか。前者に何のメリットがあるんでしょうか。
A a = new A();
a->b();
delete a;
みたいに生成してすぐ解放ってのがありますけど、
A a;
a.b();
じゃ駄目なんでしょうか。前者に何のメリットがあるんでしょうか。
579デフォルトの名無しさん
2023/11/15(水) 09:39:21.05ID:88mXe6hW 後者はスタックを消費するから A が巨大なオブジェクトだったら困るとかかな
580デフォルトの名無しさん
2023/11/15(水) 09:40:08.83ID:7t1hSBTd581デフォルトの名無しさん
2023/11/15(水) 10:25:46.06ID:2QF9cM/v スタック?
そんな所にゃ領域取らないだろ
そんな所にゃ領域取らないだろ
582デフォルトの名無しさん
2023/11/15(水) 16:06:06.00ID:rnHf5KLb 何したらここの人らみたいにプログラム詳しくなれるの?PC98からやらなきゃダメ?
583はちみつ餃子 ◆8X2XSCHEME
2023/11/15(水) 16:35:01.46ID:k729Xl/N >>578
> ありますけど、
ないよ……。
少なくともそう頻繁にはない。
あるとしたら >>579 が指摘するように A が特に巨大な場合というのはひとつの可能性。
ただ、巨大になるのがわかってるならリソースを分割して A の中で
上手いことやりくりする (A 自体の大きさは抑える) べきで、
クラスを使う側で配慮しなきゃならないのは普通は悪い設計だと思う。
第二の可能性として、 new 演算子をオーバーロードして
そのオブジェクトがメモリの特定の場所に対応づけられる場合。
メモリバス経由でデバイスと接続するようなアーキテクチャもまあまあ有るから
それを C++ 上ではオブジェクトのように抽象化するということはあるかもしれない。
でもそれは低いレイヤだけの話で、
適当にラップするクラスを作ってもうちょっと抽象度の高いクラスを挟むのが普通だと思う。
> ありますけど、
ないよ……。
少なくともそう頻繁にはない。
あるとしたら >>579 が指摘するように A が特に巨大な場合というのはひとつの可能性。
ただ、巨大になるのがわかってるならリソースを分割して A の中で
上手いことやりくりする (A 自体の大きさは抑える) べきで、
クラスを使う側で配慮しなきゃならないのは普通は悪い設計だと思う。
第二の可能性として、 new 演算子をオーバーロードして
そのオブジェクトがメモリの特定の場所に対応づけられる場合。
メモリバス経由でデバイスと接続するようなアーキテクチャもまあまあ有るから
それを C++ 上ではオブジェクトのように抽象化するということはあるかもしれない。
でもそれは低いレイヤだけの話で、
適当にラップするクラスを作ってもうちょっと抽象度の高いクラスを挟むのが普通だと思う。
584デフォルトの名無しさん
2023/11/15(水) 18:55:56.04ID:aqUxtLPE 超初心者スレで揚げ足とったり、マウントしたり
585デフォルトの名無しさん
2023/11/15(水) 19:46:52.63ID:O3I3kWYX >>582
何か作ってるうちに嫌でも詳しくなるよ
何か作ってるうちに嫌でも詳しくなるよ
586はちみつ餃子 ◆8X2XSCHEME
2023/11/15(水) 21:31:49.26ID:k729Xl/N PC9801 時代を知ってる人は色々と詳しいと思うがその知識が役立っているというわけでもなくて、 PC9801 時代からの三十年くらいあれば詳しくなって当たり前ってだけだぞ。
たくさんの知識を身に付けるにはたくさん学ぶというシンプルな話。
たくさんの知識を身に付けるにはたくさん学ぶというシンプルな話。
587デフォルトの名無しさん
2023/11/16(木) 11:26:46.68ID:QXdh7keC 当時は役に立ったけど今はオワコンの技術と
今でも役に立ってる技術と
どっちが割合多い?
今でも役に立ってる技術と
どっちが割合多い?
588デフォルトの名無しさん
2023/11/16(木) 11:55:31.84ID:nxuWB9A/ 「技術は陳腐化するが考え方は永遠である」
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- NY円、一時1ユーロ=180円台まで下落…1999年のユーロ導入以来初 [蚤の市★]
- 【外交】日中関係悪化、長期化の様相 2012年には自動車輸出80%減も ロイター★3 [1ゲットロボ★]
- 国内ホテル、既にキャンセルも 訪日客関連業界、事態見守る ★3 [蚤の市★]
- 俳優 高岡蒼佑「エジプト出身とかナイジェリア出身とかの人が、日本の代表顔して移民の事とか話してるの見るとなんか違う気がする」★2 [Anonymous★]
- 「どうしようもない」 ため息つくアジアの玄関口 中国の訪日自粛で−福岡市 [蚤の市★]
- 「稼ぐのよ!」高市総理が電話ガチャ切りで伝えたこと 鈴木憲和農林水産大臣が国政報告会に出席 自身が目指す農政の方針語る [煮卵★]
- 『しんちゃんと岸田さん』 [175344491]
- 中国発日本行の航空券、491,000件(全体の32%)がキャンセルされたと判明。高市どうすんのこれ [603416639]
- 自民「高市の一言でこれまで積み上げてきた関係が駄目になる。言葉の重みを分かっていない。自分でまいた種は自分で刈り取ってもらう」 [256556981]
- 日本株、大暴落!!! [252835186]
- 識者「『フリーパレスチナ』とかイキってる連中が台湾の話になると『中国を怒らせるな!』ってなる。ほんと左翼の正義って薄っぺらい」 [279254606]
- 【超悲報】中国への武力行使、世論調査で「賛成」「どちらかといえば賛成」48.8% 「反対」「どちらかといえば反対」の44.2%を上回る [314039747]
