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

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2018/11/12(月) 14:55:13.35ID:Tf74ZWQr
何にも知らない0からの出発、超初心者のためのC++相談室
2021/08/25(水) 15:58:08.24ID:3/bOIe3o
C++ キャスト でぐぐるといいよ
(キャストはCにもあるけど)
2021/08/25(水) 22:29:05.16ID:/Q8zinJC
>>358
型変換はその名前の通り型を変換する。 変換と同等の処理を普通の関数とし
て書いてもかまわないんだが、変換関数 (conversion function) または変換
コンストラクタ (converting constructor) が定義されていると暗黙の型変換
が適用される文脈では勝手に適用して変換してくれるので便利。

例えば以下のように foo 型のオブジェクトを受けとる文脈で bar 型のオブジェ
クトを渡しても通るのは変換が適用されるから。

struct foo {};

struct bar {
operator foo() {
return foo();
}
};

void func(foo) {}

int main(void) {
foo x = bar();
func(bar());
}
2021/08/26(木) 01:12:00.54ID:BlNdGFU0
>>360
ようやくイメージできてきました。ありがとうございます!
2021/08/26(木) 06:25:31.31ID:C2TXXzWD
>>360

そんな難しくせずに、

{ change A to B }

でいいんじゃないの?
2021/08/26(木) 09:12:40.22ID:QSgOZ0Rh
なんのこっちゃ
2021/08/27(金) 08:15:52.67ID:ue9a70Za
コマンドライン引数の意味が全く分からないのですが
Visualstudioを使っているからでしょうか?
それとも、コマンドプロンプトの使い方を理解できないでしょうか?

https://programming.pc-note.net/c/commandline.html
ここも参照にしたのですが何が得で何ができてるのかよく分かりません。
コマンドラインってVSでデバッグ無しで実行をした時に出る黒い画面ではないですよね?

質問ばかりですいませんが本当に何も分からないのでお願いします。
365デフォルトの名無しさん
垢版 |
2021/08/27(金) 11:14:47.31ID:xylLBHc1
>>364
メモ帳でファイルをドラッグアンドドロップで開く例が紹介されているが
これはWindowsのShellであるExplorerがexefileに対して登録されているドラッグアンドドロップハンドラーを処理してドロップしたファイルのフルパスを文字列として起動するプロセス環境のコマンドラインパラメータとして渡している
黒い画面(コマンドプロンプト)にもExplorerとは違うがプロセスの起動とパラメータを渡す機能が実装されている
起動するexefileに続けてスペースを開けたあと記入した文字列がそのままパラメータとして渡される
ファイル名以外にも自由に渡せるためプログラムの動作を指定したり変更する目的で使用される
あなたが作成するプログラムでシェルから渡されたコマンドラインパラメータを確認する方法はそのページにもある通りだ
コマンドラインパラメータを活用してバラ色の人生を満喫してくれ
366デフォルトの名無しさん
垢版 |
2021/08/27(金) 14:23:11.73ID:8dQk5Ix1
getopt
2021/08/27(金) 23:33:15.78ID:cMIVTei2
例えば、デスクトップにショートカットを作る。
コマンドプロンプトを起動して、Ruby スクリプト・a.rb を実行する

リンク先
C:\Windows\System32\cmd@.exe /k "ruby C:/Users/Owner/Documents/a.rb"

注意。書き込めないので、間に@を入れました

作業フォルダ
C:\Users\Owner\Desktop

a.rb 内には、puts ARGV
(ARGV は配列で、そこにコマンドライン引数が渡ってくる)

と書いておいて、ショートカットに、フォルダx・ファイルb.txt をdrag&drop すると、
コマンドプロンプトが起動して、以下のように表示される

C:\Users\Owner\Desktop\x
C:\Users\Owner\Desktop\b.txt
2021/10/06(水) 22:36:41.57ID:OG+j1FAK
const char* const str[]={"aaa","bbb","ccc"}

constの効果を教えてほしいです
後ろのstrの前のconstは付けると
const str[0]="dddd"って出来なくなるのは分かったのですが
先頭のconstが分かりません
2021/10/06(水) 22:51:34.11ID:ItOX1MR6
str[0][0]='d';
2021/10/06(水) 22:53:20.88ID:OG+j1FAK
>>369
なるほど。
ありがとうございます。
2021/10/09(土) 07:12:25.69ID:JFpyaThm
ロベールC++入門の代入演算子についてなのですが
コピーコンストラクタのときは動的配列をdelete[]しなかったのに
なぜ代入演算子を使うときだけdelete[]するのか分からないので教えて下さい
本にはm_arrayには前に確保したメモリが存在するためdelete[]しないとメモリリーク
と書いてあるのですがコピーコンストラクタも同じじゃないの?と混乱してます

100行目です
https://ideone.com/xL8UOn
2021/10/09(土) 10:44:46.48ID:tDH5FAwQ
newしたメモリが不要になったらdeleteする
これだけ

コピーコンストラクタでのdelete、
いつnewしたデータに対して?
2021/10/09(土) 17:51:02.84ID:QAOoCtV/
>>372
すいません、わからないです。
コピーコンストラクタはnewでアドレスを確保しないものなのですか?
2021/10/09(土) 18:03:01.95ID:Z56nk6n1
>>373
ロベールの C++ 入門を読んだことがないからどういう構成になっとるか知らんけど、
それがわからんのならたぶんそれ以前の章を理解でてきないと思う。
2021/10/09(土) 18:04:17.21ID:jELfb/xT
>>371
代入演算子は既にあるオブジェクトを別のオブジェクトで上書きする操作
コピーコンストラクタは別のオブジェクトから新しいオブジェクトを作って初期化する操作

代入演算子でdelete[]しているのは既にあるオブジェクト(*this)のメンバとして確保済みのメモリ領域
コピーコンストラクタの実行時には「既にあるオブジェクト」にあたるものは無いので、deleteするものも無い
2021/10/09(土) 20:35:07.35ID:QAOoCtV/
>>375
初期化と代入の知識が曖昧でした
分かった気がします。ありがとうございます。
377デフォルトの名無しさん
垢版 |
2021/10/10(日) 20:55:50.73ID:6QW0WSDe
AtCoderの初心者向けのC++の説明のページを読んでいます。

vector<int> a(10);

aの第i番目の要素にアクセスする場合、a[i]よりもa.at(i)と書くほうが良いと書いてあります。
これは現在のC++で推奨されている書き方でしょうか?それとも単に初心者はそう書いたほうがいいというだけのことでしょうか?
2021/10/10(日) 21:05:41.56ID:KKHdhYPj
>>377
>a[i]よりもa.at(i)と書くほうが良い
そう主張されている理由はどのように書かれていますか?私はどちらでも大差ないと思っていますが‥‥
2021/10/10(日) 21:07:18.12ID:6QW0WSDe
>>378

vector<int> a(10);
b = a.at(10);

などと書いた場合にコンパイルエラーになりますが、エラーメッセージがatを使うと表示されるというのが理由です。
2021/10/10(日) 21:08:35.36ID:6QW0WSDe
初心者でないプログラマーでatを使って書いている人は少数派ではないのですか?
2021/10/10(日) 21:31:47.25ID:zWyM5YPA
範囲外にアクセスする可能性があるならat、ちゃんと事前にチェックするなら[]でいいんじゃない?
2021/10/10(日) 22:58:42.68ID:gnqjARRQ
気分によるけどatが好きです
383デフォルトの名無しさん
垢版 |
2021/10/10(日) 23:07:44.84ID:gmqGyDAJ
vector配列を指すポインタを使ってる時に[i]で指定する書き方がよく分からないのでat(i)使ってる
2021/10/10(日) 23:14:51.45ID:U88jNIFg
(*ポインタ)[i]
2021/10/10(日) 23:15:56.24ID:cCUvKLuJ
>>377
これのことだね。
https://atcoder.jp/contests/apg4b/tasks/APG4b_n

例外処理やアサートの説明を省略しているせいでどう使い分けるべきものなのかがよくわからん説明になってる。
C++ はかなり複雑で、 AtCoder のサイトにある雑な説明だけでは細かいところまで理解はできないよ。

C++ の言語仕様の詳細を理解するのに手間取って競技を始められないくらいならそういう風に割り切れという意味で
AtCoder としては at を推してるんであって、言語仕様やプログラマの習慣としてどちらかを推奨してたりはしない。
それぞれに用途がある。
2021/10/11(月) 00:50:58.08ID:kxIK5/L+
余談だが C++ の言語仕様としては推奨というのはないが非推奨というのはあって
(結果的に同等のよりよい機能を推奨するのと同じことになっている場合はある)
将来の言語仕様の更新で廃止するつもりがあるということを意味する。
387デフォルトの名無しさん
垢版 |
2021/10/11(月) 02:00:14.70ID:xizp5ONl
ポインタ->operator[](i)
2021/10/13(水) 01:04:04.91ID:gvBCET4D
Notepad++でcppファイルを選んで実行をすると
Visualstudioが立ち上がるのですが
どうすればNotepadで実行出来るのでしょうか?
2021/10/13(水) 02:24:33.63ID:YMzdF2UZ
>>388
コンパネ→既定のプログラム→ファイルの関連付け

設定→アプリ→既定のアプリ→ファイルの種類ごとに
あたりでなんとかならないでしょうか?
390デフォルトの名無しさん
垢版 |
2021/10/13(水) 03:03:01.45ID:gvBCET4D
>>389
回答ありがとうございます。
ファイルの関連付けをメモ帳とVisualstudioしか選べなかったです。(後Microsoftストア)
Notepad++は初期設定結構大変な感じなんでしょうか?

https://imgur.com/a/V3jOiV0
2021/10/13(水) 19:41:40.64ID:YMzdF2UZ
>>390
たしかに「設定→アプリ→既定のアプリ→ファイルの種類ごとに」
はうまくいかないですね
では、
開きたい拡張子を持ったファイルを右クリック→プログラムから開く→別のプログラムを開く→その他のアプリ→このPCで別のアプリを探す
ではどうですか?

私は win7 メインで、うまいアドバイスができなくてすみません‥‥
2021/10/19(火) 08:20:19.87ID:7/3R28mC
C++でアプリを作る場合って、QTってやつかMFCって奴を勉強すればいいのでしょうか?
C++でWIN32APIを学ぶっていうのはないですか?
2021/10/19(火) 10:04:52.66ID:emsejTNf
ないです
2021/10/19(火) 10:18:17.44ID:vPA5f3eX
あります
395デフォルトの名無しさん
垢版 |
2021/10/19(火) 11:51:03.31ID:90qj1F6l
メッセージループによるイベントドリブン型アプリケーション
「ウインドウ」と「メッセージ」というウインドウズの基本概念ぐらいは理解してもいい
396デフォルトの名無しさん
垢版 |
2021/10/19(火) 19:00:27.41ID:C9DkQou5
tcl/tk
wxWidgets
DXLib
Unity
2021/10/19(火) 20:20:27.92ID:KyySFZDA
>>392
「C++でwin32api」ですか…
そういうのは c で win32api を理解した後、各自が独力で工夫して c++ と win32api とを辻褄あわせするものだと思っていましたが、それはそうと、そういう書籍は過去にありました
たしか leaf というライブラリと WOOL という lisp 処理系が掲載されていた記憶があります
2021/10/19(火) 22:23:42.02ID:P+gkhAFH
MFC は何十年も前だけど、今もあるの?

QT は、Linux で聞くけど、Windows で使うの?
399デフォルトの名無しさん
垢版 |
2021/10/20(水) 02:20:42.50ID:+2OzLQ7p
>>398
Qt5Core.dllで検索する色々出てくるから、win/macとマルチのアプリなんかで割と使われてみたいね。
手元だとfusion360とかresolveとかで使われてるっぽい。商用ライセンスあるからかな?
400デフォルトの名無しさん
垢版 |
2021/10/20(水) 11:06:18.19ID:OEiI06HQ
5以前は良かったんだがな
2021/10/20(水) 13:35:36.40ID:dLyN/sz8
>>392
MFC は API の利用をちょっと楽にする薄いラッパーという感じだな。
API のことを忘れて MFC の使い方だけ学べばよいというようなものではない。

>>397
今は C++/WinRT の時代だぞ。
2021/10/20(水) 18:01:15.01ID:oZqSjSwG
>>397-401
WIN32やったことないんですが
C++でアプリを作るときはWin32APIは避けては通れないのですか
ありがとうございます…
2021/10/20(水) 19:03:46.64ID:CkfuGqw9
知っておいた方が良いけど
避ける方法もある
404デフォルトの名無しさん
垢版 |
2021/10/20(水) 19:36:43.86ID:+2OzLQ7p
>>402
いや自分で書いてるQtって奴や>396なら違う世界観を満喫できると思う。
2Dゲーム系ならSDL2あたりも。他にもメンテされてるライブラリあるけどSDL2で引けば出て来ると思う。
2021/10/20(水) 20:15:37.71ID:I2cv7mAQ
>>401
ええ?

WinRT って .NET の世界のものかとおもっていました
2021/10/20(水) 23:17:39.77ID:vkb7a42p
>>405
C++でも出来るよう
2021/10/21(木) 00:38:03.74ID:JAunV20A
>>405
WinRT は Windows のモダンな API セットで、特定の言語に結びついたものではない。
2021/11/05(金) 12:47:56.16ID:dj6lZ6W1
無名クラスのメンバ関数の実装を宣言と別にすることって可能ですか

struct {
int func_hoge(int n);
} myClass;

(実装)?
2021/11/07(日) 08:51:29.08ID:+fO8/EKc
std::vecotrのインスタンスを作ったとき、指定した要素数以上のメモリを確保しないようにはできますか??
2021/11/07(日) 11:43:59.55ID:cdTTDz5e
実装依存
普通は出来ない
2021/11/09(火) 14:46:05.51ID:t/ZCl1K7
普通でなく指定したバイト数以上のメモリを確保しようとしたら例外が上がる実装例
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
#define MAX_SIZE 100
template <class T, class Alloc=allocator<T>>
class SizeLimitedAllocator {
public:
typedef T value_type;
T *allocate(size_t n) {
if (n > MAX_SIZE) throw bad_alloc();
return allocator_traits<Alloc>::allocate(allocator_, n);
}
void deallocate(T *p, size_t n) {
allocator_traits<Alloc>::deallocate(allocator_, p, n);
}
private:
Alloc allocator_;
};
int main()
{
vector<char,SizeLimitedAllocator<char>> vec(MAX_SIZE);
try { vec.resize(MAX_SIZE+1); }
catch (bad_alloc& e) { cerr << e.what() << endl; }
return 0;
}
412デフォルトの名無しさん
垢版 |
2021/11/25(木) 04:15:10.15ID:0166A/na
void *q = (void*)p;
void *r = reinterpert_cast<void *>(p);
void *s = static_cast<void *>(p);
どっちが良い?
2021/11/25(木) 04:51:08.49ID:Mn8CZmYm
>>412
static_cast で可能なものなら static_cast を使うのが行儀が良い。
Cスタイルのキャスト記法は適用範囲が広すぎて意図通りではない (危険な) 変換でもコンパイルが通るかもしれんということで
複数のキャストを用意しているので意図にあてまる限りなるべく狭い効果を持つキャストを用いるべき。
414デフォルトの名無しさん
垢版 |
2022/02/10(木) 15:34:30.67ID:Ido/99Jv
githubからcshogiというパッケージをインストールしようとしたところ
ビルド中に
src/mate.cpp:110:26: error: template parameter redefines default argument
というエラーが発生しました。
実行コマンドは
CPPFLAGS=-std=c++17 pip install git+https://github.com/TadaoYamaoka/cshogi
としているのですが、あれこれ調べてもう打つ手がなくなりそうです。なにが悪いでしょうか。
macOS12.2付属のclangでビルドしています。(他の人は使っているので、文法などは問題ないはずだと思っています。)
2022/02/10(木) 15:42:07.23ID:J5PrGMnU
そのエラーメッセージで検索すれば?
416デフォルトの名無しさん
垢版 |
2022/02/10(木) 15:46:35.62ID:Ido/99Jv
>>415
とっくにやってますわ!と言うところでしたが、stackoverflowでぴったりなのがありました。
https://stackoverflow.com/questions/14197436/c11-template-parameter-redefines-default-argument
gccならよさそうですね。
2022/03/15(火) 20:43:42.96ID:+mlS0n0o
test
2022/03/15(火) 21:05:11.63ID:q9dCXwxq
Borland C++Builder 1が無料ダウンロードできるようですが
Borland C++ Compiler 5.5 freeとは全く別物でしょうか?
2022/03/17(木) 11:44:12.82ID:Y2OAtTnf
1は大昔のを記念に無料DL可にしたやつじゃないかな
最新のやつもCommunity Editionていう無料版があるから、開発に使うならそっち
あとBuilderはVisual Studioのような統合開発環境でコンパイラも含まれる
2022/03/18(金) 12:32:15.10ID:Fw15ZxLZ
ロベール読んでるけど、途中からコードとファイルを端折りすぎてどこに書いてるのか理解出来ない
2022/03/19(土) 14:31:38.38ID:T81w77OE
>>420
その本(サイト?)はあまり読んでないからわからないけど、こういう知識・技術系は複数の本やサイトを利用したほうがいいかも
基本はそのロベールで、曖昧な部分は他のテキストでみたいに
まあ逆でもいいけど
2022/03/21(月) 11:12:55.05ID:Prmlj1K5
分割コンパイルの仕組みちゃんと理解しないまま雰囲気でヘッダインクルードしてるんですけど
cppファイルに#pragma once書かないのってどうしてですか??
2022/03/21(月) 11:22:20.21ID:S8aTENmp
>>422 書いても意味ないから。
2022/03/21(月) 11:45:05.99ID:TlR/Mg8q
>>422
まあ普通一回使ったら足りるからだけど、
cppをincludeしてたら意味があるのかもな
2022/04/07(木) 19:54:53.05ID:ozPVuLqH
cppってインクルード出来たんだ
ヘッダーだけかと思った
2022/04/11(月) 15:54:11.00ID:LBY7PFnU
単にコピペしてくるだけだけだからなんでもいいぞ
ルックアップテーブル計算してテキストにダンプし、ソース中に#include "table.txt" で取り込むのを見たことがある
2022/04/11(月) 19:50:08.66ID:uaVZR/I2
IDEだと、プロジェクトに.cppを含めるとコンパイル対象になるので.inlとかにしておくのが無難
2022/04/30(土) 07:28:15.03ID:2aZ7UOTr
前は中身がcppっぽいのはcppにしてたけど
インクルード前提のファイルはhにするようにした

#define ほにゃらら
#include ファイル名.h
##undef ほにゃらら

インクルードしても単体ソースとしても使えるヤツはcpp

ツールが吐き出したコードやデータでそのままincludeして使えるものは拡張子はそのまま
429デフォルトの名無しさん
垢版 |
2022/06/11(土) 20:56:47.72ID:zBk/MBZO
hpp
2022/06/11(土) 21:01:36.29ID:N4H8T0pQ
h と hpp どっちにするかの話じゃなくて

(h or hpp) にするか
(c or cpp) にするか

の話
2022/06/11(土) 21:02:37.04ID:N4H8T0pQ
初心者はトリッキーな使い方はしない方が良いから聞かなかった事にして
432デフォルトの名無しさん
垢版 |
2022/06/11(土) 21:20:49.53ID:kM12Kkyp
トリッカーズ。
433デフォルトの名無しさん
垢版 |
2022/06/12(日) 10:33:13.76ID:cPTHwR7Q
三角形の秘密はね
2022/06/12(日) 11:16:51.08ID:v0rlTKHd
おなかがすいたら
2022/06/12(日) 19:40:55.19ID:r44ApDPu
ピーナッツ
436デフォルトの名無しさん
垢版 |
2022/06/23(木) 10:13:29.99ID:06mLNX8U
なんか、すごい達者さんが並んでますけど、
ここって、
「プログラミング初めたいけど、なんにもわからないので、初めから教えてください。」
というスレです。
437デフォルトの名無しさん
垢版 |
2022/06/23(木) 10:52:47.91ID:M4XLJX6g
最初からでも0からでも構わんが
自分で努力しないやつはだめ
2022/06/23(木) 11:07:51.97ID:XRNmRbRA
俺は努力しなくてもできちゃうからなあ
2022/06/23(木) 14:33:26.79ID:06mLNX8U
掛け算の*と、「何ですか?」の*と一緒なんですが、
区別する方法を教えてください。
2022/06/23(木) 19:37:03.84ID:WbbET00J
ポインターの事?
441デフォルトの名無しさん
垢版 |
2022/06/23(木) 19:47:14.20ID:hToQs/iZ
は?何ですか?
442デフォルトの名無しさん
垢版 |
2022/06/24(金) 10:44:51.77ID:K2we1Lar
オレオレ
2022/06/24(金) 12:54:50.02ID:fYiV2rYB
そうだよオレだよ
2022/07/16(土) 16:13:36.70ID:2GuJXeRO
>>439
掛け算の*は二項演算子
「何ですか?」の*は単項演算子
*の前に項があるかどうかで判断する
2022/07/16(土) 17:44:38.20ID:WOPsEo4E
数字の、xxxと、
数字の、AAAの掛け算は、

xxx*AAAで、いつも迷うんです・・・
2022/07/16(土) 18:00:17.69ID:QRg/sabr
*a+++ ++*b
で迷え
2022/07/16(土) 18:01:53.10ID:QRg/sabr
+*a++*++*b
これも
448デフォルトの名無しさん
垢版 |
2022/08/01(月) 07:12:02.16ID:yd/7YIgU
map よりも unordered_map の方が高速ですか?
あと追加順が保障されないのが unordered_map ですか?
map は何順ですか?
2022/08/01(月) 13:52:12.46ID:jhXgj6wH
おまいは何を言っておるのだ?
2022/08/01(月) 15:12:11.10ID:YhL9Bhjt
>>448
> map よりも unordered_map の方が高速ですか?

操作によるので一概には言えない。
一般的には unordered_map のほうが有利なことが多いとは言えるけれど。

> 追加順が保障されないのが unordered_map ですか?

map でも unordered_map でも追加した順序は保持されない。
C++ に限らず辞書的なデータ構造では格納順序を保持しないのが普通で、
保証があるのは Ruby の Hash くらいだと思う。
Go や Rust だと辿る順序を乱数でかき乱す実装になっているくらいだし。

> map は何順ですか?

キーの順序。
特に指示しなければデフォルトではキーを std::less で比較した順序。
2022/08/05(金) 04:26:17.70ID:ECXKpFJi
そもそもmapの順序ってなんぞや
そりゃ内部表現としての順序(あるいは非順序という名の実装依存の順序)はあるけど
腹ワタ開腹して弄くり回したら、それはもうmapとは呼べねーよ
2022/08/16(火) 01:02:16.19ID:pMrCsY/x
vector<int*> xの特定の要素を削除したい場合
delete x[1];
してから
x.erase(x.begin()+1);
という手順であってますか?
deleteしないとメモリリークしますよね?
2022/08/16(火) 01:10:03.51ID:+o+ePBjP
>>452
それでいいよ。
でもスマートポインタを活用するとかの工夫はしたほうがいいね。
454デフォルトの名無しさん
垢版 |
2022/08/18(木) 11:36:39.99ID:p/limWqp
そもそも移動が大量に発生するのでそんな設計しない
2022/10/14(金) 01:43:37.78ID:ps9ayw5X
bitset<4>("1101")をsigned longに変換したいのですが
簡単な方法は無いでしょうか?
to_ulong()はあるのですが、to_long()が無いっぽいです
2022/10/14(金) 01:50:46.72ID:cI3rl/qY
unsigned longからlongにキャストすればいいだけでは?
2022/10/14(金) 02:13:27.03ID:rgl2oNFZ
念のため補足すると、変換後の整数型が符号付きである場合にその型で表現できる範囲をからはずれたときの結果は定義されていない。
しかし bitset<4> を元にするという前提の元では signed long int の範囲からはずれるということはありえない
ので signed long int にキャストするという対処で正しい。
2022/10/14(金) 02:13:45.28ID:ps9ayw5X
すみません肝心なことを書き忘れていました
2の補数表現された2進数の文字列を
signed longに変換したかったのでした

文字列は諦めて、
-(signed long)bitset<4>(~0b1101+1).to_ulong()
だと一応期待した動作なのですがなんか野暮ったい…
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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