2ちゃんねる ■掲示板に戻る■ 全部 1- 最新50    

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

1 :デフォルトの名無しさん:2018/11/12(月) 14:55:13.35 ID:Tf74ZWQr.net
何にも知らない0からの出発、超初心者のためのC++相談室

875 :デフォルトの名無しさん:2024/07/21(日) 16:05:28.79 ID:neWsPxIF.net
安価忘れてた、>>872
複数の情報源持つべきとかは同意するけど
プラットフォーム固有のは公式が一番信用できるに決まってる(ただMicrosoftのは機械翻訳になってから日本語版がアレだけど・・・)

876 :デフォルトの名無しさん:2024/07/21(日) 19:10:23.03 ID:5YGWxq2c.net
>>871
>>872
ありがとうございます。
やっぱ、ググって調べるのが一番なんですね。
ただ、C++と言いつつほぼCの内容で紹介してて本でやってる課題とこの関数の使い方知りたいでなんか食い違いあったんですがここわかりやすそうなので助かります。

877 :デフォルトの名無しさん:2024/07/21(日) 21:04:50.60 ID:D0FAs2Ah.net
cpprefjpはなんかTシャツ作るらしいから記念に買うわ
https://github.com/cpprefjp/site/issues/1296

878 :デフォルトの名無しさん:2024/07/21(日) 21:06:26.85 ID:neWsPxIF.net
手元に置いておく辞典系の本があっても良いと思うけどちょっとお勧めできるものを知らない・・(C++11より前のものしか買ったことない)
秋葉原とかの技術系の書店で手に取って読んでみるのがベストなんだけどねぇ

879 :デフォルトの名無しさん:2024/07/23(火) 01:20:07.66 ID:Rfg4Mjqa.net
>>877
誰得

880 :デフォルトの名無しさん:2024/07/25(木) 15:13:06.50 ID:kulC2cnH.net
>>879
1万円くらいで転売しようと考えています

881 :デフォルトの名無しさん:2024/07/29(月) 05:00:32.70 ID:ycfafYuZ.net
>>871
https://cpprefjp.github.io/
、単発寄付が、簡単にできたらなーと、惜しくなった。

882 :デフォルトの名無しさん:2024/08/01(木) 04:44:09.33 ID:ZgmEa4OS.net
unordered_map の extract というのはC++17以降でしか使えないのですか

883 :デフォルトの名無しさん:2024/08/01(木) 09:34:34.68 ID:jWmufzw0.net
>>882
https://cpprefjp.github.io/reference/unordered_map/unordered_map.html
対応バージョンがC++17ってなってるね

884 :デフォルトの名無しさん:2024/08/02(金) 22:37:31.58 ID:8YStqjv0.net
ここでGoogleTestの質問をしてもよろしいでしょうか?

885 :デフォルトの名無しさん:2024/08/04(日) 12:54:37.69 ID:jHE0rxct.net
質問なのですが派生とshared_ptr<T>を組み合わせたときに、
class Base {
 int m_x;
protected:    // Baseクラスのコンストラクタはprotected
  Base(int x) : m_x(x) { }
  virtual ~Base() { } // 仮想関数にしてもしなくても同じ下記現象
};
class Derived {
public:      // 派生クラスのコンストラクタはpublic
  Derived() : Base(10) { }
};

std::shared_ptr<Base> pBase(new Derived());
とやったら
error C2248: 'Base::~Base': protected メンバー (クラス 'Base' で宣言されている) にアクセスできません。
と言われるんだけどなんで?その判定要る??

886 :デフォルトの名無しさん:2024/08/04(日) 12:56:00.59 ID:jHE0rxct.net
自己解決しますた
文句が言われているのはBaseのコンストラクタでは無くてデストラクタか……orz

887 :デフォルトの名無しさん:2024/08/04(日) 14:08:27.06 ID:dHG4OJIq.net
本当に解決したの?
それDerivedがBaseを継承していないよ?

888 :デフォルトの名無しさん:2024/08/04(日) 15:33:06.74 ID:jHE0rxct.net
あっはい
class Base {
 int m_x;
protected:    // Baseクラスのコンストラクタはprotected
  Base(int x) : m_x(x) { }
pulic:       // Baseのデストラクタをpublicに修正 // (1)
  virtual ~Base() { }
};
class Derived : public Base {  // 誤記訂正 // (2)
public:      // 派生クラスのコンストラクタはpublic
  Derived() : Base(10) { }
};
std::shared_ptr<Base> pBase(new Derived());    // (3)

(1)で解決、(2)は誤記訂正
文句言われたのがBaseのコンストラクタだとすると(3)においてDerivedのインスタンスがshared_ptr<Base>に渡される時点で呼び出し済なので

889 :デフォルトの名無しさん:2024/08/04(日) 15:35:40.71 ID:jHE0rxct.net
(3)でコンパイルエラーになるのは辻褄があわなくね?!と思った次第
文句言われたのがBaseのデストラクタだったからだいたい理解すた
(std::shared_ptr<Base>はあくまでBaseしか知らないから、Base::~Base()がpublicでなかったら
 呼べないという解釈でエラーにするのは当然な可能性

890 :デフォルトの名無しさん:2024/08/05(月) 09:26:19.70 ID:SHyTm/CM.net
std::unordered_map<std::string, std::unique_ptr<int>> map があった時のmapの管理について
教えてください

この場合値の方がunique_ptrなのでコピーはできませんよね。すると値を取り出す時は
foo = std::move(map["hoge"]); としないといけない?
で、moveしたあとは hogeに対する値は無効になっちゃってますよね。ということは
自分で消さないといけない? map.erase("hoo")とかで

891 :デフォルトの名無しさん:2024/08/05(月) 12:50:07.44 ID:Gb5pye15.net
>>890
>この場合値の方がunique_ptrなのでコピーはできませんよね。すると値を取り出す時は
>foo = std::move(map["hoge"]); としないといけない?
「値を取り出す」をどういう意味で使っているかによる
単に中身を読むだけならmoveしなくても良い

892 :はちみつ餃子 :2024/08/05(月) 12:51:26.12 ID:cmuXon6W.net
>>890
その考え方で正しい。
std::unique_ptr をムーブすると抜け殻のほうのオブジェクトは nullptr を指すようになることは保証されるが、
そのスマートポインタ自体が std::unordered_map から勝手に消えたりはしない。
消えて欲しいならそのための操作は必要。

893 :はちみつ餃子 :2024/08/05(月) 12:53:54.43 ID:cmuXon6W.net
std::unique_ptr 自体はコピーできないがそれが指しているオブジェクトを読むだけなら出来るしコピーすることも出来る (コピーコンストラクタを削除していないなら) 。

894 :デフォルトの名無しさん:2024/08/06(火) 11:13:46.48 ID:SBxTyrdX.net
Rust使おうず

895 :デフォルトの名無しさん:2024/08/06(火) 12:55:07.35 ID:7fXoqzm8.net
いらね

896 :デフォルトの名無しさん:2024/08/12(月) 00:31:08.71 ID:YAf3BhD8.net
標準講座C++―基礎からSTLを利用したプログラミングまで 新装版 ハーバート シルト著が気になったのですがこれで勉強したことある方いますか?

897 :はちみつ餃子 :2024/08/12(月) 01:07:19.65 ID:CLy07uUA.net
>>896
読んだことは無いけど 2009 年発売ってのは微妙な部分かもと思う。
2011 年の言語仕様改定がインパクトの強い変更を含んでいて基本的な書き方の習慣に大きな変化があった。
そこらへんの事情が含まれない本だと現状にそぐわない。

898 :デフォルトの名無しさん:2024/08/12(月) 03:05:00.33 ID:LOlm/bL8.net
weak_ptrが処理の途中で解放されてしまうのを防ぐために lock()を呼んでshared_ptrを
取得してから処理、というのがありますが、
lock()を呼んだ時点で既に解放されていることもあるわけですよね?

確かにlock()の戻り値をチェックして不正な呼び出し等を防げるのはありがたいのですが、
そもそもオブジェクトが既に解放されているのは残念といいますか。

lock()を呼んでからする処理の場所に来るまでに解放されないようにしたい、と思った場合、
どうしたらよいのでしょうか? もしかしてそもそもweak_ptrを使うな、ということになります?

899 :デフォルトの名無しさん:2024/08/12(月) 03:59:48.65 ID:ArETDaeV.net
あいまいな言葉よりコード見せてみ

900 :デフォルトの名無しさん:2024/08/12(月) 08:49:28.44 ID:+jMHtzbv.net
既に寿命が切れてる場合はlock() が無効な shared_ptr を返すのでそれで判定する
lock() を呼んだ後は戻り値の shared_ptr が寿命を伸ばすので問題ない

shared_ptrは「有効なshared_ptrが1つ以上ある間はオブジェクトの寿命が消えない」ものなので、lock() が返すshared_ptrを保持してる間は消えないよ
lockを「weak_ptrからshared_ptrへの昇格を試みる」ものと考えても良い

lockしたい箇所の時点で必ずオブジェクトが生きていて欲しいなら、それはweak_ptrでなくshared_ptrを使うべき

901 :デフォルトの名無しさん:2024/08/12(月) 10:20:21.64 ID:Lq53CINI.net
>>896
2000年くらいにSTLはこれで勉強したよ
基本的なことは網羅されているが
C++の新しい仕様には対応してないので
別途学習すべし
いまもっと良い本があるかは分からない
C++の仕様は建て増しなので
この本に書かれていることは無意味ではない

902 :デフォルトの名無しさん:2024/08/12(月) 13:09:35.61 ID:XQ/hRBSk.net
キメラ

903 :デフォルトの名無しさん:2024/08/12(月) 16:00:24.68 ID:K9Aw1MHl.net
超初心者とは何なのか・・・

904 :デフォルトの名無しさん:2024/08/13(火) 01:12:06.02 ID:sOEG0OlC.net
>>897>>901
返答ありがとうございます。
今同著者の別の本で勉強中ですが基本的なところでこれも買っとこうかな?って質問しました。
基本参考書として買ってみます。
基礎的なところ終わったら自分が作りたいプログラムに必要な現状の本でも買ってみます。

905 :デフォルトの名無しさん:2024/08/13(火) 01:32:59.16 ID:sOEG0OlC.net
すいません。誰か下のコンパイルオプションわかる方いますか?
解いてた問題の解答にも文字化けするって書いてあったので文字化け対策のオプションなんかないかな?って思って調べたらこのオプションで解決できるって出てたので使ってた人の入力例そのままオプション挿入してみてちゃんと解決できたから気になって調べたんですがググっても出てこなくて入力例が次の行のやつです。
g++ test.cpp -finput-charset=CP932 -fexec-charset=CP932
-finput-charset
-fexec-charset

906 :デフォルトの名無しさん:2024/08/13(火) 02:09:15.07 ID:sAvdrrrS.net
>>905
https://www.google.com/search?q=%22-finput-charset%22

907 :デフォルトの名無しさん:2024/08/13(火) 07:27:51.38 ID:8FMmWnXe.net
ああなるほど、意図せずマイナス検索状態になってたから一件もヒットしなかったってことか
あるある

908 :デフォルトの名無しさん:2024/08/13(火) 08:43:34.22 ID:6ajF2Nvb.net
>>896
シルトは有名

ロベールも有名だったけど、
C++11 に対応していないので古い

STL標準講座、1999年
ハーバート・シルト 著
επιστημη(エピステーメー) 監修

この本も古い。
確か、エピステーメーはC++ の標準化委員だっけ?

C++テンプレートテクニック―簡潔で再利用しやすいコードのためのC++活用術
επιστημη/高橋 晶【著】、2009

独習C++ 新版、2019/11
高橋 航平 (著), επιστημη(エピステーメー) (監修)

909 :デフォルトの名無しさん:2024/08/13(火) 12:38:43.84 ID:sOEG0OlC.net
>>906>>907
ありがとうございます
てか、検索でそういうことあるんですね

910 :デフォルトの名無しさん:2024/08/13(火) 12:57:30.56 ID:lcpgo4xV.net
>>900
了解です、どうもありがとうございます
>>899
一般的なことを知りたかっただけなので

911 :デフォルトの名無しさん:2024/08/14(水) 09:51:50.71 ID:UePmitOB.net
変数名の付け方について教えてくだち
Objectの個数、とかは nobjs とか objcnt (類例: argc)とかは本に載っていてそれぞれ
 nobjs --- number of objects の短縮表記
 objcnt --- object count の短縮表記(名詞obuectが形容詞的活用
となって対応する同じ語順の英語表現がある気がするのですが
<limit.h> の INT_MAX、INT_MIN はmaxやminがなぜ後置?
何の短縮形?
minやmaxの後置と前置の使い分けとは一体……

912 :はちみつ餃子 :2024/08/14(水) 10:32:46.90 ID:z6gmNdON.net
>>911
C は一貫した名付規約 (naming convention) を定めていないし、主要な処理系が持っていたものを追認する形で仕様に入ることもよくあるので起源ごとに名前の方式は異なる。
慣例はおおよそ踏襲されるのでもし新しい整数型が追加されたらそれの最大・最小値は同じような名前で表されると思うけれど全体を通したルールはない。

913 :デフォルトの名無しさん:2024/08/14(水) 11:43:42.69 ID:gAudIBvM.net
MIN_LONG, MIN_SHORT, MIN_USHORT だとmin まで同じで探しにくい
INT_MAXだとINT_ まで打てばコード補完できるけど、逆の語順だとMAX_ まで打った際に各型の候補がズラーっと並ぶことになる
当時は高級なエディタは無いし、多分そんな意図で命名してないと思うけど 、便利と言えば便利

意味を考えるならそれは max of int でなく、intという空間におけるmaxという値 (言語によってはint.max と書くような値) と考えると良いと思う

914 :デフォルトの名無しさん:2024/08/14(水) 13:14:34.06 ID:+mepCwPn.net
C++ならstd::numeric_limits使おうよ

915 :デフォルトの名無しさん:2024/08/14(水) 13:42:54.01 ID:UePmitOB.net
>>912
>全体を通したルールはない。
えええええええ……
迷える子羊は一体どうしたら……orz

>>914
それはそうかもしれんが
std::numeric_limits<double>::min()ではなくてstd::numeric_limits<double>::lowest()なのがイマイチなカンジ
あと
while ((*p <= CHAR_MAX && isspace(*p)) {
  p++;
}
とかのときは<limits.h>のがお似合いに思える……

916 :デフォルトの名無しさん:2024/08/14(水) 13:49:52.66 ID:NvgdlQi4.net
些細なことにこだわんな
複数人で開発してる以上そういう揺れはどうしても起こり得る
受け入れて先行け

917 :デフォルトの名無しさん:2024/08/14(水) 14:35:57.51 ID:uvjb8yy0.net
object count, count number of object
integer maximum, maximum of integer
…同じじゃね?

918 :はちみつ餃子 :2024/08/14(水) 15:32:03.62 ID:z6gmNdON.net
全体を通した名前の指針としてはマクロは大文字でそれ以外は小文字 (スネークケース) ってくらいかなぁ。
関数形式のマクロは小文字なのもあったりと例外はいくらかあるけども。

919 :デフォルトの名無しさん:2024/08/14(水) 21:18:49.93 ID:uPunKI9P.net
今ってクラス名とか割とキャメルケースじゃないですか? DocumentWindowみたいな
一方でC++自体は小文字とアンダースコアで
でも意外とちぐはぐな感じはない。むしろ予約語、システム的なものは小文字で
ユーザー定義のものと分離されていていい感じ?

920 :はちみつ餃子 :2024/08/14(水) 22:08:58.60 ID:z6gmNdON.net
>>919
C++ の大元の設計者である Stroustrup は言語の技術的な詳細 (文法上の役割?) を名前に埋め込むことを嫌がってる。
https://www.stroustrup.com/bs_faq2.html#Hungarian
クラスだから、ユーザ定義だからという区別を名前に入れるべきじゃないという考え方を取ってるわけ。

その一方で言語としての縛りは入れないという方針も著書に書いてある。
思うところはありつつも個々の場面は言語ユーザの判断にゆだねるってことだね。

C++ は C++ だけで完結するわけじゃなくて色んなシステムと接続することもあるからその都合に合わさないといけないこともあるだろうし。
たとえば Windows だと多くの API がキャメルケースなわけで。

私自身にはクラス名をキャメルケースにするのはちぐはぐに見えている。
でも出自が違うライブラリを組み合わせるならそういうこともしょうがないとも思ってる。

921 :デフォルトの名無しさん:2024/08/14(水) 22:31:40.03 ID:gAudIBvM.net
クラスや変数名に異なる命名を敵用するといった考え方が出てきたのがおそらC++登場の後だから仕方ないという感じ
C++は他の言語ほどには統一されたルールはない

自分は個人的に以下のルールを採用してる
おそらくPythonやRustあたりのルールに近い
・型の名前 (クラス、構造体、enum) は PascalCase
・変数と関数名は lower_snake_case
・定数とマクロは UPPER_SNAKE_CASE
・クラスのメンバー変数は value_ のように末尾にアンダースコアを付ける
・構造体のメンバーはアンダースコアなし (変数と同じ)

上記もあくまで個人的な意見に過ぎないので、プロジェクトの方針があるならそれに合わせるのが良いと思う

あと基本的な命名ルールも言語によって変わるので、その言語内に慣習やルールがあるならそれも見ておくと良いと思う
例えばC#はメソッドを PascalCase にするなど、上記とは異なる慣習がある

922 :デフォルトの名無しさん:2024/08/14(水) 22:37:11.57 ID:gAudIBvM.net
標準ライブラリは型が lower_snake なんだけどね
(std::string とか std::vectorとか)

自作型をこれに合わせるかは好みの域を出ない気がする
自分は型と関数で区別付けたいから PascalCaseにしてます (例. class MyData; enum MyEnum)

923 :デフォルトの名無しさん:2024/08/14(水) 22:37:12.21 ID:gAudIBvM.net
標準ライブラリは型が lower_snake なんだけどね
(std::string とか std::vectorとか)

自作型をこれに合わせるかは好みの域を出ない気がする
自分は型と関数で区別付けたいから PascalCaseにしてます (例. class MyData; enum MyEnum)

924 :デフォルトの名無しさん:2024/08/18(日) 12:06:41.90 ID:BK0va+Po.net
iostreamとか糞やん

322 KB
新着レスの表示

掲示板に戻る 全部 前100 次100 最新50
名前: E-mail (省略可) :

read.cgi ver.24052200