0からの、超初心者C++相談室

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2018/11/12(月) 14:55:13.35ID:Tf74ZWQr
何にも知らない0からの出発、超初心者のためのC++相談室
2023/07/16(日) 22:10:43.92ID:/+p/BpGt
クラス内部で
using std::shared_ptr<T>;
を付けるとコンストラクタの実装が完璧になるよ。
2023/07/16(日) 22:12:03.59ID:/+p/BpGt
>>509
クラス内部で
using std::shared_ptr<T>::shared_ptr;
を付けるとコンストラクタの実装が完璧になるよ。
511504
垢版 |
2023/07/16(日) 22:37:21.87ID:AcIm+utR
>>510 基底クラス(shared_ptr)のコンストラクタを派生側に引っ張って来る便利な奴ですね(覚えきれてない)。
ありがとうございます。自前実装不要なのは助かります。
2023/07/17(月) 00:18:57.61ID:YifLUjyU
>>508
それって本当に意図通り?
X のデストラクタが起動するのは X 型のオブジェクトが解体されるときであって
参照カウントがゼロになったときじゃないんだよ。
513504
垢版 |
2023/07/17(月) 01:33:58.67ID:9b8iHtwy
>>512 …あー。それは意図通りではないですね。実際の解放はデストラクタで
use_count()==1であることを確認する必要があるのかな。ありがとうございます。
2023/07/18(火) 09:19:59.88ID://OyAtPF
パブリック継承した型では基底への型変換を禁じることができない。
つまり
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継承で実装して、
他により良い方法を思いついたらそっちに乗り換えることにします。
516504
垢版 |
2023/07/19(水) 18:45:15.41ID:4lyHW67x
そういえばweak_ptr試してない…?と思って試したら当然の如く代入できなかったので、
public継承でほったらかします。
2023/07/20(木) 15:28:07.42ID:6BSTmMYa
templateの世界へようこそ
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 を継承する形でカスタマイズしようとするのは
してもそれ自体は仕様に反しないけれど不自然だなぁとは思う。 (個人の感想です。)
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);
}
2023/07/25(火) 09:24:45.92ID:k8WJtY+U
>shared_ptr<int>へのポインタはshared_ptr<int>のデストラクタじゃないと処理できない

これが無理っしょ
521デフォルトの名無しさん
垢版 |
2023/07/28(金) 10:56:39.59ID:Zgvcm9f5
なんで出来ると思ったの
2023/07/29(土) 20:15:59.76ID:ETnyq2kJ
shared_ptrのデリータで他所様のオブジェクトもついでに解体したろっていう発想そのものが危険な香りしかしなくてゾワゾワする
2023/07/29(土) 20:25:36.66ID:xEb8mTKO
シャー専用ptr
5241
垢版 |
2023/09/03(日) 20:55:45.58ID:/ExZEMtW
「プログラム」作るのって、やってみたいけど、全然知らないから、教えて欲しい。
からのスレの目的で建てました。
2023/09/03(日) 20:59:12.95ID:W287fTtw
まず、何が作りたいかイメージしてみましょう
2023/09/04(月) 10:11:49.98ID:/ASAZOX6
>>524 がC++をやるのは早過ぎる
先にpythonでもやってみろ
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"例外発生
2023/10/02(月) 22:12:06.36ID:/sjCb2h4
>>527
d3 への代入で暗黙のコピーコンストラクタが使われている。コピーコンストラクタを適切に定義すれば解决する。
2023/10/02(月) 22:12:09.92ID:/sjCb2h4
>>527
d3 への代入で暗黙のコピーコンストラクタが使われている。コピーコンストラクタを適切に定義すれば解决する。
2023/10/02(月) 22:12:23.61ID:/sjCb2h4
>>527
d3 への代入で暗黙のコピーコンストラクタが使われている。コピーコンストラクタを適切に定義すれば解决する。
2023/10/02(月) 22:12:42.13ID:/sjCb2h4
>>527
d3 への代入で暗黙のコピーコンストラクタが使われている。コピーコンストラクタを適切に定義すれば解决する。
2023/10/02(月) 22:18:32.15ID:/sjCb2h4
連投すみません。コピーコンストラクタと、代入もです。
2023/10/03(火) 00:13:21.44ID:OUiDjLFt
>>527
暗黙に生成される代入演算子は全てのサブオブジェクトを代入したような挙動になるルール。

ポインタを代入した場合には代入元と代入先のポインタが指す先のオブジェクトは同一なので
一方のポインタを通じて 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コンストラクト時のオブジェクトのデストラクタが呼ばれると思ってました。
(どこからも参照されなくなるので)

自分が根本的に誤っている気がします、すみませんが上の内容でおかしい点を教えてください。
2023/10/03(火) 02:13:14.63ID:OUiDjLFt
>>534
> 右辺により生成されるオブジェクトが単にd3に格納

JavaScript とか Python の動的型言語の経験があるのかな?
それとも Java や C# の参照型のモデルで考えてる?

C++ では左辺はメモリ上の特定の場所に対応づいていて、
別の場所 (右辺で生成される一時オブジェクト) にあるものを格納するというのは
コピーするということ。

その上で不要になった一時オブジェクトは解体される。
一時オブジェクトは一部の例外を除いて完結式 (完全式ということもある) の終わりのタイミングで
解体されるルールなのでこの場合は行の終わりが解体のタイミングということになる。
2023/10/03(火) 02:13:25.78ID:OUiDjLFt
>>534
> 右辺により生成されるオブジェクトが単にd3に格納

JavaScript とか Python の動的型言語の経験があるのかな?
それとも Java や C# の参照型のモデルで考えてる?

C++ では左辺はメモリ上の特定の場所に対応づいていて、
別の場所 (右辺で生成される一時オブジェクト) にあるものを格納するというのは
コピーするということ。

その上で不要になった一時オブジェクトは解体される。
一時オブジェクトは一部の例外を除いて完結式 (完全式ということもある) の終わりのタイミングで
解体されるルールなのでこの場合は行の終わりが解体のタイミングということになる。
2023/10/03(火) 02:17:47.16ID:OUiDjLFt
サーバから書込みエラーが返ってきたのを専ブラの機能でリトライしたら多重投稿になってしまってるな。
なんか不安定な状況っぽい
538デフォルトの名無しさん
垢版 |
2023/10/05(木) 17:15:14.18ID:WXXGTjkD
みんなでリトライするからF5攻撃並みに自爆DOS攻撃
2023/10/05(木) 18:29:28.73ID:S7K0dlIY
>>527
int *をunique_ptr <int>にすると
コンパイルで弾かれるから
気づきやすいかもね
newとdeleteは直で呼ばない方が良い
540デフォルトの名無しさん
垢版 |
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:xj8n2YWF
>>540
「コピーが発生してるかどうか」とは関係ないのはその通り
>>527が恐ろしいのは
コンパイル時点では気づかず実行して初めて明らかになるところ
どうしたら実行前に避けるかの方策として
unique_ptrの常用を提案しました
543デフォルトの名無しさん
垢版 |
2023/10/06(金) 13:16:53.99ID:Zl0hPCVy
>>527 に有効な解決策は
コピーコンストラクタじゃなくて
ムーブコンストラクタじゃないのかな
2023/10/06(金) 16:48:00.89ID:R7EjAYTn
両方やっとけばええじゃろ。
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?
2023/10/06(金) 21:10:07.75ID:G9Jlm58L
OK牧場!
2023/10/06(金) 21:44:11.09ID:BgvqARb2
TXH!
548527
垢版 |
2023/10/16(月) 23:49:47.91ID:6sfjI2pS
>>535 を始めとして皆さんまたまたありがとうございます。
アセンブラ、Cを長くやってきたあと、最近C#を少し覚えたのでそちらと混同していました。

コピーコンストラクタと代入の演算子関数を作ろうとしていますがまだ途中。少しずつ進めます。
2023/10/17(火) 23:09:31.94ID:cH9YbrYr
既製品のクラスライブラリについて、クラス階層が深いところのクラスは、公開メンバの全体をひと目で見渡すことができません。
マニュアルや継承のツリーををたどって地道に調べるしかないのですか。
2023/10/18(水) 09:51:20.64ID:UZlHr99J
>>549
ソースコードの構造を調べるのを補助するツールはあるが
どういう意図でどういう使い方を想定してそう書かれているのかは
プログラマが読み解かないとどうしようもない。
551デフォルトの名無しさん
垢版 |
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みたいにパスを指定する方法とかがあるんでしょうか?
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の機能だから
2023/10/20(金) 09:56:30.99ID:/M3RKJCH
IDEに頼ってるとアホになるよ
2023/10/21(土) 16:32:35.29ID:dhBJRkMq
0のうちにやめとけ
時間がもったいない
2023/10/26(木) 23:16:10.15ID:4gABazLN
typedef uint8_t byte;
:
byte a = 3;
uint8_t b = a;

bの初期化は型不一致エラーにならないと思います。

コンパイラは型の異なる変数の初期化や代入を見つけると、typedefを探して元の型が同一かを調べてエラーにするかどうかを決めるのですか。
2023/10/26(木) 23:23:19.82ID:oN20rU1J
>>558
typedef は型の別名を作る機能であって新しい型を作らない。
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以降だと今は実はもっと簡単?
2023/11/10(金) 23:40:20.59ID:mtEH7OmF
class MyClass {
public:
MyClass();
:
};

int main()
{
MyClass* c = new MyClass(); ①
MyClass d;
MyClass* dp = &d; ②
:
}

オブジェクトのポインタは①や②のように取得できると思います。
私からすると①はdeleteしなければならないのでできれば使いたくない。

①の書き方は、よく入門書に出てくる、継承関係にあるポインタの相互代入のためにあると考えて正しいですか。
2023/11/10(金) 23:49:08.54ID:VDRR6isO
>>561
その「相互代入」って何ですか?
2023/11/10(金) 23:56:43.46ID:Irnop6+y
>>561
自動変数の寿命はスコープ単位だから
それより長い寿命のオブジェクトが必要なら new する。
寿命の種類のことを Storage duration といい、
new で生成したオブジェクトは Dynamic storage duration に該当する。

継承関係がどうこうというのは何が言いたいのかよくわからないが、
ポインタの性質はオブジェクトの寿命とは関係ない。
2023/11/12(日) 00:13:49.90ID:M40i1rJ9
相互代入は言葉がおかしいですね。
基底クラスのポインタで派生クラスのオブジェクトをポイントできるというものです。
オブジェクトのボインタを使う場面があまりないので用途を聞きました。

>>563
>自動変数の寿命はスコープ単位だから
それより長い寿命のオブジェクトが必要なら new する。

自分の場合、関数内より長い寿命が必要となったらそれはもうグローバルにしてしまいます。設計方針がよくないですかね。
2023/11/12(日) 02:00:51.06ID:O0gb6uIB
>>564
グローバル変数として書いたオブジェクトの寿命は static storage duration に該当する。
この static というやつは main が始まる前に構築されて main が終わった後に解体されるので
必要以上に長い寿命になってしまうことが多いし、
実行時の情報を元にして構築するオブジェクトを static にはしようがない。
dynamic (new でのオブジェクト生成) が必要になる場面はごく普通にある。
ごく普通にあるのに使わずに済ませてるならたぶん不自然な設計になってると思う。

グローバル変数は寿命も長すぎるがスコープも広すぎる。
人間は自分が思ってるより馬鹿だから最初にどういう想定をしてたのか忘れて要らんことをしてワヤにする。
触らせたくないものは隠しておくのはカプセル化の考え方の重要な部分。

本当に人間は忘れるし間違える。
部品ごとに間違った使い方を出来ないように配慮しておかないと規模を大きく出来ない。
まあ逆に言えば小さいプログラムではそんなに凝ったことをしなくても大丈夫なんだけど。
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> (); のようにやる
2023/11/12(日) 13:14:04.39ID:xpiKETrj
> 基底クラスのポインタで派生クラスのオブジェクトをポイントできるというものです。
> オブジェクトのボインタを使う場面があまりないので用途を聞きました。

アップキャストのことだろうかね。
必ずといっていいほど使う機会がある。関数の引数にオブジェクトを渡すときとか
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
2023/11/13(月) 18:54:22.80ID:CCXWxw1E
>>570
おおスマン
typoだね
2023/11/13(月) 23:59:54.01ID:RLYu3oMv
>>565 ほか皆さんありがとう。

自分の関わってきた分野が小規模組み込みだからか、そもそもCでmallocの使用経験がないのです。
処理系がmallocをサポートしないMCUもありました(使いたいなら自分で作ってという思想、標準入出力も)。
なので>>568 さんの指摘は当たりです。

c++に挑戦している今の環境も小規模なので、newの利用はほどほどに検討してみます。
2023/11/14(火) 00:03:40.68ID:F1cdKor4
>>567
だいたい参照で済んでしまいます
2023/11/14(火) 12:46:18.30ID:SRCspH78
mallocもnewも使ったこと無いってやばいぞ
2023/11/14(火) 15:58:08.40ID:oTbgWDDI
new 演算子はオーバーロードも出来て、型ごとにメモリの確保の仕方を変えるといったようなことも出来る。
メモリの確保と値の構築を別のレイヤとして定義できるということに意味がある。 (いわゆる関心の分離?)
低レイヤでも便利な場面はたぶんある。

分離する甲斐がないほど小規模ならべた書きが悪いわけじゃないけど
あえてべた書きという設計を選ぶってのとなんもわからんで使わないってのでは違う。
知っておくに越したことはないよ。
576デフォルトの名無しさん
垢版 |
2023/11/14(火) 21:59:36.46ID:WxE96Zj2
空配列を用意してそれを順繰り使い回す
チープな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();
じゃ駄目なんでしょうか。前者に何のメリットがあるんでしょうか。
579デフォルトの名無しさん
垢版 |
2023/11/15(水) 09:39:21.05ID:88mXe6hW
後者はスタックを消費するから A が巨大なオブジェクトだったら困るとかかな
2023/11/15(水) 09:40:08.83ID:7t1hSBTd
>>578
A *a = new A(); よね、一応
bを呼び出したいだけなら特にメリットはないよ
581デフォルトの名無しさん
垢版 |
2023/11/15(水) 10:25:46.06ID:2QF9cM/v
スタック?
そんな所にゃ領域取らないだろ
2023/11/15(水) 16:06:06.00ID:rnHf5KLb
何したらここの人らみたいにプログラム詳しくなれるの?PC98からやらなきゃダメ?
2023/11/15(水) 16:35:01.46ID:k729Xl/N
>>578
> ありますけど、

ないよ……。
少なくともそう頻繁にはない。

あるとしたら >>579 が指摘するように A が特に巨大な場合というのはひとつの可能性。
ただ、巨大になるのがわかってるならリソースを分割して A の中で
上手いことやりくりする (A 自体の大きさは抑える) べきで、
クラスを使う側で配慮しなきゃならないのは普通は悪い設計だと思う。

第二の可能性として、 new 演算子をオーバーロードして
そのオブジェクトがメモリの特定の場所に対応づけられる場合。
メモリバス経由でデバイスと接続するようなアーキテクチャもまあまあ有るから
それを C++ 上ではオブジェクトのように抽象化するということはあるかもしれない。
でもそれは低いレイヤだけの話で、
適当にラップするクラスを作ってもうちょっと抽象度の高いクラスを挟むのが普通だと思う。
2023/11/15(水) 18:55:56.04ID:aqUxtLPE
超初心者スレで揚げ足とったり、マウントしたり
2023/11/15(水) 19:46:52.63ID:O3I3kWYX
>>582
何か作ってるうちに嫌でも詳しくなるよ
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/
「技術は陳腐化するが考え方は永遠である」
2023/11/16(木) 14:01:30.65ID:brAf4s3Y
新しい技術的流行が昔からあったやつの焼き直しってことは珍しいことじゃない。
「なんや、結局は××やないか」というときに××自体が廃れていてもう使わなくても
理解のためには役立っているのでオワコンとも役に立ってるとも言えたりする。
590デフォルトの名無しさん
垢版 |
2023/11/16(木) 15:18:16.01ID:QXdh7keC
ActiveXってCOMだよね
COMってOLEだよね
591デフォルトの名無しさん
垢版 |
2023/11/20(月) 15:56:09.22ID:QJSPRwrd
こんにちは坂本と申します。
C++を0から勉強したく書き込み致しました。
私ごとですが先月定年退職し、やっと自由な時間がもてる様になりました。
在職中ずっとプログラミングの勉強をしたかったのですが子育てや職場がプラントの電気機械保全業務の3交代だった為に定年後を楽しみに我慢してまいりました。
プログラミングの知識は全くなく制御盤のPLCでニーモニック語でリストプログラミングをするぐらいしか経験はありません。
有料でもかまいませんので何回でも質問ができ、すぐに返答と解説をして頂けるサービスや学習機関がございましたら教えて頂きたく書き込ませてもらいました。
漠然とした質問で申し訳ありませんが今月よりプログラミングの勉強を独学で始めましたが質問できる知り合いもいなく困り果てております。
長文失礼致しました。
592デフォルトの名無しさん
垢版 |
2023/11/20(月) 19:07:01.26ID:UNSN9Hhc
>>590
DDEは?
2023/11/21(火) 00:24:28.42ID:cXhp/VaI
C/C++ はポインターがあるから、ややこしい。
10年やっても無理

Ruby をやれ。
半年で、Ruby on Rails も出来る
594デフォルトの名無しさん
垢版 |
2023/11/21(火) 11:11:38.44ID:HSO31doi
神社code
2023/11/21(火) 14:22:46.70ID:tYm3I+7J
ポインターが分からない奴は
プログラムを組む資格がない
2023/11/21(火) 17:27:32.66ID:4ADiN9xr
ちゃんとした本があれば独学でそんなに困らないと思うけどな。
入門書の各章をじっくり読んで理解してから次の章に進むみたいな学習法をしているなら
詰まったときにどうしていいかわからなくなりがちなのでやめたほうがいいと思う。
色んな要素が相互に絡むので順番通りに学べるようなものじゃないから。

理解できなくてもたくさん詰め込んでいけばその内に繋がりがわかってくる。
「最初は」熟考しなくてもいい。 入ってない知識が関連するなら考えてもどうせわからん。
2023/11/21(火) 17:38:45.53ID:oh7zlSJI
>>593
ポインタ使わないこともできるのに何言ってんだ
そもそもポインタはノイマンアーキテクチャの基本なのでポインタがわからないというならコンピュータの利点を十分に利用できないということ
2023/11/21(火) 18:05:44.93ID:tYm3I+7J
ポインター: 変数が入っているアドレスの数字
なんも難しいことはない
599デフォルトの名無しさん
垢版 |
2023/11/21(火) 18:24:30.60ID:fyFN08Ef
インデックスって言えば分かる?
コンピュータにあるメモリー全体のインデックス番号
2023/11/21(火) 18:35:32.85ID:Ai4yJ31G
俺も最初全然わからなかったけどC言語ポインタ完全制覇のおかげで覚えた
601デフォルトの名無しさん
垢版 |
2023/11/21(火) 19:20:18.31ID:JkIDzJ0A
Java や C# にもポインタはあるしポインタを理解できなかったら他の言語も使えないよ
ポインタ自体は難しくないんだけど C/C++ ではポインタ演算できちゃうのが鬼門なんだよね
602デフォルトの名無しさん
垢版 |
2023/11/21(火) 20:49:14.51ID:TIZNoRj+
N88-BASICにポインタあったっけ?
603デフォルトの名無しさん
垢版 |
2023/11/21(火) 20:53:06.63ID:TIZNoRj+
ポインタの文法なんて入門書には必ず説明があるので直ぐ分かるとして
俺が初期に読んだ数冊の入門書には
それがプログラミングでどう役に立つのかが示されてなくて
悶々としながら読んでいたなぁ
604デフォルトの名無しさん
垢版 |
2023/11/21(火) 21:38:13.97ID:fyFN08Ef
ポインターなんて処理が糞遅いCPUをいかに速く動かすかって事以外に意味が無いからなぁ
2023/11/21(火) 23:15:10.49ID:mJ6deMbY
std::string str = "abc";
①str = str + "dd";
②str = "dd" + str;
これらの記述は有効のようです。
①の右辺はstr.operator+("dd");
と解釈でき理解できます。

②の右辺は "dd".operator+(str);
と書きかえるとこれは無効に見えます。

std::stringのoperator+のプロトタイプを調べたところテンプレートが駆使されており私では読めませんでした。

②が有効なのは、テンプレートの仕組み?でそう書けるようにつくられているからですか。
2023/11/22(水) 06:21:16.63ID:xG0rhWaa
>>605
非メンバ関数として定義されている。
つまり
str=std::operator+("dd", str);
に相当することをやってる。
メンバ関数として定義すると不都合が起こるから std::complex とかも非破壊的な二項演算子は非メンバ関数として定義するのが通例だよ。
2023/11/23(木) 18:16:14.60ID:yQq1Seno
>>606
本を見直したらfriendにするといい等ありました。

第1引数+第2引数、という記述があり、2個の引数を持つ+演算子関数が定義されている場合はそれが呼び出される決まりになっているのですね?
2023/11/23(木) 18:17:35.84ID:yQq1Seno
stringから離れて一般的な質問です。↑
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況