C++相談室 part135

■ このスレッドは過去ログ倉庫に格納されています
2018/03/31(土) 20:20:06.25ID:o3PNwIlC0
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part134
http://mevius.5ch.net/test/read.cgi/tech/1516406742/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1509780815/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2018/04/14(土) 13:25:03.37ID:RVvtBgPf0
DOS並にコンソールがクソな環境も珍しいよな
unixベースのシェルに比べるとこんな貧相なものがよく生き残ってこれたとおもふ
2018/04/14(土) 14:27:12.94ID:AqyGMwU/0
>>132
ウィンドウズの話だけど、threadヘッダのスリープは起こし忘れが少ない気がする。
2018/04/14(土) 22:00:06.17ID:7AzbU2hj0
未だにGUIがまともにならないLinuxも珍しいよな
2018/04/14(土) 22:16:23.39ID:B3QB9Fpb0
>>135
君に期待しても良いのかな?
2018/04/14(土) 22:26:38.67ID:jn5/AQ8F0
誰かがデザイナ雇わないとな
2018/04/14(土) 22:31:21.78ID:Tt8LTURP0
まともを定義せよ
2018/04/14(土) 22:47:45.04ID:jn5/AQ8F0
美しいGUIか使用上十分なGUIか
2018/04/14(土) 23:04:06.39ID:WAEnZz2X0
Class A
{


  void A(B* &b)
  {
  }
};
2018/04/14(土) 23:06:11.46ID:B3QB9Fpb0
毎日使う上では美しさはいらない。シンプルで頼む
2018/04/14(土) 23:08:51.81ID:WAEnZz2X0
済みません、途中送信してしまいました・・・

Class A
{
  B* _b;

  void A(B* &b)
  {
    _b = b;
    _b = new B();
  }
};

B* b;
A* a = new A(b);
b←newされてない・・・

クラスAのコンストラクタでクラスBのインスタンスを受け取り
newで新たなインスタンスを作成したうえで返そうと思います。
しかし上記のようなプログラムを作成してもインスタンスbは
newされてませんでした。

どうしたらbをnewしたうえで返すことができるようになるでしょうか?
2018/04/14(土) 23:15:39.02ID:EkNosKh20
void A(B** b)
{
*b = new B();
}
でいいんでないの
2018/04/14(土) 23:23:21.44ID:9kNArSDya
馬鹿だから分からないんだが教えて
インスタンス渡してからnewするのはなぜ?
ポインタを参照にする意味とは?
2018/04/15(日) 00:33:02.73ID:/OvgYAab0
>>142
>  void A(B* &b)
>  {
>    _b = b;
>    _b = new B();
>  }

下の方は b = new B(); としたかったんじゃないのか
2018/04/15(日) 00:44:36.47ID:b/ktaKN+0
A(B*&b) {
b=new B();
_b=b;
}
頭悪いだろオマエラw
2018/04/15(日) 00:52:36.30ID:b/ktaKN+0
A(B*&b){_b=b=new B();}
もしくは一発で書けば何の問題もおこらんよ
2018/04/15(日) 00:57:54.63ID:/OvgYAab0
受け取ったインスタンスを全く使ってないがそれが意図した動作なのか
2018/04/15(日) 01:00:18.78ID:b/ktaKN+0
参照オブジェクトの概念がよくわかってない
学び直せと言いたい
2018/04/15(日) 01:04:57.02ID:VAOccv/70
>>148
インスタンスなんて受け取ってないぞ
2018/04/15(日) 01:09:03.26ID:/OvgYAab0
>>150
>>142で「インスタンスを受け取り」と書いてあるから
ポインタ(の参照)でだけどインスタンスを渡しているのだろう
何故受け取っているのかとかの説明は無理だが
2018/04/15(日) 01:19:33.61ID:b/ktaKN+0
それにしてもbをnewするとかイミフ
何もしてないじゃんw
2018/04/15(日) 01:22:46.36ID:b/ktaKN+0
古いインスタンスを_bに格納して新しいインスタンスをbに返したいのか
新しいインスタンスを作成してbと_b両方に返したいのか
どっちなんだよ
2018/04/15(日) 01:22:49.52ID:/OvgYAab0
>>152
b を new するってのは
>b = new B();
のことか?参照で返してるんだよ

何故返す必要があるのかはこれも答えられないが
>>142に new して返そうと思っていますとあるからな
2018/04/15(日) 01:30:17.78ID:b/ktaKN+0
_b=new B() は見当たるが
b=new B() ←こんな記述は見当たらないぞ
嘘もたいがいにしとけや
2018/04/15(日) 01:39:29.12ID:b/ktaKN+0
>>142
コイツのソース見る限りbに対しては何もしてないでしょ
2018/04/15(日) 03:35:09.27ID:mYZtkoVNd
すまんすまん

>>142
>B* b;
>A* a = new A(b);

を見落としていた
インスタンスを渡すといっておいてインスタンスを渡していないとは思いもしなかったw
>>147であってるんだろうね
158デフォルトの名無しさん
垢版 |
2018/04/15(日) 06:03:36.65
>>142
>  void A(B* &b)
>  {
>    _b = b;
>    _b = new B();
>  }

  void A(B* &b)
  {
    B* new_b = new B();
    b = new_b;
    _b = new_b;
  }

こういうのは愚直に書けばええんや
2018/04/15(日) 08:25:34.99ID:IUBKEb9a0
AのコンストラクタにBへのポインタのポインタだか参照だかを渡さなくても
Bへのポインタと関係ないAのコンストラクタ、と
A内部のBメンバへのポインタを返すゲッタ、との
組み合わせにする方が素直でねぇか?

class A
{
  B* _b;

public:
  A() {_b = new B();}
  B* ptr_b() const {return _b;}
};

int main(void)
{
  A* a = new A();
  B* b = a->ptr_b();

  return 0;
}


別に確保した「Bを格納すべき領域へのポインタ」を受け取って、
Aの初期化時にBの配置newを行わせたい、という意図かもしれないけど、
元の質問から想像を広げすぎてるよね。
2018/04/15(日) 10:01:16.50ID:6WpjLuna0
Aが_bをdeleteするために管理するだけのクラスだとしたらスマポ使えという話になる
2018/04/15(日) 10:57:43.04ID:Yi/sDJN50
前に書き込んだことあるけど
https://qiita.com/notenopg/items/40571e69986a58b888a0
どうじゃ
2018/04/15(日) 11:01:19.87ID:GeT3puOg0
舌足らずでもうしわけありませんでした・・・

クラスBのインスタンスをクラスAで処理していくためにコンストラクタでクラスBの
インスタンスを参照受け取りする仕様にしました。

大半のケースではそのまま処理して終わり、なのですが
まれに受け取ったクラスBのインスタンスをnewし直す必要がありまして
その際受け取ったクラスAのメンバ変数 _b をnewしても受け取り元のインスタンスを
newできないことに悩んでいました

ただオブジェクト指向の観点から見るとあまり美しいプログラミングスタイルでは無いのかもしれませんね。
クラスBのインスタンスはクラスA内部で完全隔離処理するようにした方がいいのかもしれません
2018/04/15(日) 11:19:51.96ID:6WpjLuna0
BをAしか使わないならAの中に隔離する
他でも使う必要があって、Aの外部でBの寿命を管理してるなら、AにrefreshB()みたいなBをnewし直した時に渡し直す関数を用意する
でいいんじゃないの
本当にBをnewし直す(メモリ上再配置する)必要があるならだけど

実はB自体にreset()用意するだけで済む話のように見える
2018/04/15(日) 12:55:30.01ID:eVQUY7wra
c++じゃポインタのこともインスタンスっていうのか
2018/04/15(日) 14:39:37.81ID:rsq+XQj0M
>>164
2レス前も読めないのか
2018/04/15(日) 18:30:19.93ID:51qZxk5sa
理解不足を言い換えてミスしてない風にするのが流行ってるのかな
2018/04/15(日) 22:24:39.46ID:vR7s+ZvT0
ミスって理解不足からくるじゃん
2018/04/15(日) 23:39:26.36ID:Mp1WrgTGa
質問あるのですが、
同一PC内の画面機能と処理機能のプロセス間通信はどうやるのが便利ですか?
画面更新速度は100ms周期くらいです。

共有メモリがいいと思ったんですが、ソケット推してる人がいてもやもや
アクセス速度とかNICの通信量とか考えると共有メモリ一択な気がするんですが、どうなんでしょうか?

パイプとマップドメモリはメリット無いので考えていません。
2018/04/15(日) 23:42:01.12ID:sXJBpbWg0
何を重視するか次第
2018/04/15(日) 23:43:30.47ID:qZPDSYA20
共有メモリ=マップドファイルのファイル無しやで
2018/04/15(日) 23:43:31.62ID:51qZxk5sa
そもそも別にする理由は何?
どんなものを想定してるの?
プロセスは常に1対1なの
2018/04/15(日) 23:44:26.87ID:sXJBpbWg0
OSは?
2018/04/15(日) 23:47:06.30ID:51qZxk5sa
同一PC内なのにソケットとNICの通信量って何か関係あるの?
2018/04/15(日) 23:53:07.49ID:aQ0USPFo0
>>168
ソケットって、その場合はUNIXドメインソケットのことだろ。 NIC は関係ない。
プロセス間通信としてはほどほどに速度もあって、ほどほどに疎結合なので十分に選択肢の範囲内だと思う。
2018/04/16(月) 00:28:23.74ID:TXxoP4/a0
unix domain ソケットがお手軽で便利だけど
時代に合わせてパイプか tcp かなあ

Windows でしか使わないならならcom使うのも簡便
176デフォルトの名無しさん
垢版 |
2018/04/16(月) 01:39:01.50
共有メモリだとリングバッファとか排他とか自分で作り込まなきゃいけんやろ
ソケットならそのへん考えなくてええやん
2018/04/16(月) 02:21:40.05ID:kGNRvKds0
windowsはファイルマッピングオブジェクトでしょ
パイプでさえSYNCHRONIZE特権指定できないゴミなんだから
2018/04/16(月) 03:12:35.45ID:HsbFINqV0
標準入出力最強説
2018/04/16(月) 06:43:39.39ID:kK8liqj6M
unix domain socket なんて使ったことないな
名前空間としてファイルの指定がいるし将来違うマシン間で動作させる時に変更量が多いしtcp/udpに比べてデメリット多くね?
2018/04/16(月) 07:06:03.32ID:irvwqMpDa
>>173,174
共有メモリは例えば/dev/shmのRAM領域にあるメモリマップですよね

同一PC内のソケットのボーレートってほぼクロック数なんですか?
同一PC内の通信であったとしてもネットワークドライバの実装するプロトコルスタックを経由してしまうので、
その分のオーバーヘッドの分だけ速度が落ちる、という解釈ですが
2018/04/16(月) 07:17:01.48ID:irvwqMpDa
iperfとかで同一PC内で速度測ったらどれくらいいきます?
(1Gbpsな気が)
2018/04/16(月) 08:09:11.43ID:TXxoP4/a0
>>179
ドロップしないから楽なんだよ
デメリットは仰る通り
2018/04/16(月) 08:09:52.14ID:TXxoP4/a0
>>180
あなた知識が色々おかしいので何も考えずに教えられたとおりにした方が良いですよ
2018/04/16(月) 12:07:30.90ID:1SlhlQTu0
昨日の安全確保支援士の試験にC++が出ていたが、メンバ変数にm_が付いていた。
さすがにポインタのpなどは付いていないが、ちょっと意外だった。
2018/04/16(月) 18:56:27.96ID:aeexu7jXa
>>183
同一PCのTCP通信はどういう経路通るの?
2018/04/16(月) 20:00:43.80ID:Iff3OzVTM
クライアント→OS→サーバかその逆
2018/04/17(火) 17:50:44.77ID:YRsoLN600
未だにシステムハンガリアンなやつみたいに変なのとも
うまく付き合うのがC++使いのスキルの1つだかんね
2018/04/18(水) 00:38:34.88ID:1Mo3YyI90
↑ボゾビット
2018/04/18(水) 02:18:47.96ID:whM0Cl8U0
Windowsのネットワーク関係APIはkernel内に実装されていない
後は判るな?
2018/04/18(水) 07:02:39.34ID:bX/oR0u10
ネットワーク関係に限らずAPIはすべてサブシステムだね
2018/04/20(金) 23:48:17.59ID:MBksKo4b0
class Sample{
private:
const double val{0.0}

public:
void set(double v){
static_cast<double>(this->val) = v;
}
};

VS2015での話なのですが、こんな感じのコードを先日見かけまして
static_castでメンバ変数のconst外しができているように見えるのですけど、この動作は合法なものなのでしょうか?
試しにwandboxのclang 7.0で試して見た所当然のようにコンパイルエラーになったのですが・・・
2018/04/21(土) 00:23:55.79ID:7j/Wt31X0
>>191
const を外すのは const_cast じゃなきゃ出来ないことになっている。
だいぶん昔からそう。
でなきゃわざわざ分けている甲斐がない。
2018/04/21(土) 00:37:31.88ID:WobodGQW0
const char *a = "hoge";
const char *b = "hoge";
この2つのポインタがa == bになることは保障されていますか?
2018/04/21(土) 00:42:18.95ID:F9SE4HSu0
ない
2018/04/21(土) 00:47:40.36ID:5uFute1E0
>>192
やっぱりそうですよね、何か特別な動作かとも思ったのですがVC++のバグか仕様なんですね・・・
2018/04/21(土) 06:06:21.46ID:pETeS31u0
>>191
VS2017では警告されるぞ(おそらくVS2015でも)

cl 191.cpp /c /W4
Microsoft(R) C/C++ Optimizing Compiler Version 19.13.26129 for x86
Copyright (C) Microsoft Corporation. All rights reserved.

191.cpp
191.cpp(7): warning C4213: 非標準の拡張機能が使用されています: 左辺値でキャストしました。

後はわかるな?
2018/04/21(土) 06:22:18.02ID:wsxrLs1Z0
ポインタや参照のconst外しは合法だが
なぜ合法なのか(合法にせざるを得なかったのか)というとmemory aliasing状況下での最適化の限界に関する
ラクダ本ばりに長い議論を要する
悪寒、
プログラミング言語C++か何かでは古いライブラリのconst付け忘れにコード修正無しで対応できるYO!みたいな簡単な説明しかないが

しかし左辺値のキャストというのはどうなの?
2018/04/21(土) 08:02:29.99ID:POwjcYl50
static_cast<double>(this->val)自体は合法でしょ
this->valと同じ値のdouble一時オブジェクトができるだけ

おかしいのはそれに代入してること
2018/04/21(土) 11:34:19.85ID:pETeS31u0
int x;
(float&)x = 1;
2018/04/21(土) 11:34:55.76ID:pETeS31u0
途中で書き込まれてしまった

int x;
(float&)x = 1; //well-formed
(float )x = 1; //ill-formed
2018/04/22(日) 17:24:24.80ID:RLzEBpTGa
std:stringを引数や戻り値で使う場合、値渡しでも大丈夫ですか?
2018/04/22(日) 17:29:11.38ID:xCJicIF50
大丈夫
2018/04/22(日) 18:29:08.58ID:i5tL4+9s0
stringは内部に参照カウンタを保持した共有リファレンサを持っているから&&使用せずに直で渡しても特に副作用もなく何の問題もないよ
2018/04/22(日) 18:53:47.99ID:cFbiqY2T0
今どきのstringはヒープじゃなくスタックを使ったりもするね
鬼のように最適化されている
2018/04/22(日) 19:26:19.72ID:xCJicIF50
>>203
おじいちゃんそれ大昔の話ですよ
2018/04/22(日) 19:52:27.54ID:i5tL4+9s0
>>205
貴様は過去を否定するのか?
温故知新という言葉を知らないのか?
青二才
2018/04/22(日) 20:00:35.45ID:pGMCB93ha
ありがとうございます
勝手にデストラクタでdeleteされるとか色々考えていましたがそこは先人たちが考慮して作られているのですね
2018/04/22(日) 20:19:16.41ID:5qvptAAaM
いやいや老害に騙されちゃだめですよ。
参照カウントなstringは大昔に禁止されているので、ちゃんと参照や右辺値渡等を使いましょう
2018/04/22(日) 20:23:51.32ID:M8qmSLCN0
>>208
何言ってんだおまえ
頭悪すぎるにもほどがあるだろ
2018/04/22(日) 20:58:25.32ID:ltJDDxzZ0
COWなstringは効率が悪くてマルチスレッドとの相性が最悪なのでとっくの昔に打ち捨てられました
規格のCOW実装許容するための記述はC++11でバッサリ捨てられました
今はCOWは規格違反です
2018/04/22(日) 21:39:50.50ID:M8qmSLCN0
なん…だと!?
212デフォルトの名無しさん
垢版 |
2018/04/22(日) 21:51:37.63
おじいちゃんw
2018/04/22(日) 21:54:34.58ID:w7SgV4Bf0
値渡しや戻り値で戻せることと、
std::string内部での(ヒープ)メモリ管理の詳細は関係なくね??

引数や戻り値としてスタックに構造体を積めるようになった時点で値渡しや戻り値で戻せることとはほぼ自明
(よほど変なコピコンを定義してコピーをわざと不首尾に終わらせない限りそれはできる
2018/04/22(日) 23:24:42.33ID:xCJicIF50
>>213
まあそうだけれど無駄なコピーはなるべく避けましょうということで
2018/04/22(日) 23:50:24.01ID:usC+gOtq0
今時のコンパイラは、そこらの人間よりよっぽど高度な最適化をするから、素直で単純なコードを書くと速くなる。
効率化するつもりで余計なことをすると、コンパイラの最適化を妨げて、かえって効率が落ちたりする。

本当に重要な部分は実測しながら試行錯誤、それ以外はできるだけ素直なコードを書く、ってあたりが基本。
2018/04/23(月) 01:28:01.46ID:C1tu+nEe0
stringを値渡しせずにconst参照等々で渡すことはc++の基本なので、素直で単純なコードの部類に入ると思うが。
2018/04/23(月) 01:32:17.81ID:Lxhtz3Yj0
って、あたりが基本(`・ω・´)キリッ

道化かw
2018/04/23(月) 01:37:49.36ID:voecBiJS0
先生!OpenMPへの展開も自動でやってくれるんですか?
2018/04/23(月) 01:46:26.60ID:Lxhtz3Yj0
値渡しを素直なコードとか言う人って他人の書いたコード読まないんだろうな
宿題以外で何か書いたことあるのか
2018/04/23(月) 02:04:07.25ID:SgzxVTg+0
const type &
2018/04/23(月) 04:33:47.47ID:WjBjSqCj0
const参照渡しが基本だったのって C++11 以前の世界の話だよね…
幸い、近頃はそんなコードをあまり読まずに済んでるけど。

余計なことをしない、ってのが大事なんだよ。
参照でなきゃいけない理由がなければ、参照を使うべきじゃないんだ。
2018/04/23(月) 06:33:47.30ID:awXEdMZR0
どこの世界に生きてる人?
2018/04/23(月) 07:20:47.54ID:voecBiJS0
どんな作品を作っているのかなぁ?
2018/04/23(月) 08:32:33.12ID:EDVnvY5w0
初心者です。
今書いてるプログラムをコンパイルして実行すると、エラーが出たり出なかったり謎の挙動を起こします

最初はエラーが出て、その後数回、コードを一切変えずコンパイルしなおして実行すると急にエラーが出ず上手く行ったりします。

これって何が原因なのでしょうか…
こういう事ってよくあるのですか?
2018/04/23(月) 08:34:14.27ID:Lxhtz3Yj0
キチガイ発言はツイッターかブログでどうぞ
2018/04/23(月) 08:35:11.51ID:Lxhtz3Yj0
>>224
よくあることです
デバッグしましょう
2018/04/23(月) 10:17:10.24ID:Hh6TN2Aq0
>>224
そのエラーとやら、もしかして警告か?
エラーは直すまで何度コンパイルしても絶対に通らない
警告はコンパイルが完了しオブジェクトファイルができる

そのコンパイルとやら、もしかしてビルドか? それともmakeか?
ビルドやmakeはオブジェクトファイルとソースファイルの日付を比較して
ソースファイルのほうが古いとコンパイルを省く
だから警告が出てからもう一度ビルドしても同じ警告は出ない

おそらく、こういうことだと見受ける
228デフォルトの名無しさん (ワッチョイ 237f-9jjH)
垢版 |
2018/04/23(月) 10:24:23.61ID:48PNhEnX0
変数を初期化してないんだろ
2018/04/23(月) 12:27:19.92ID:8odlZZv8M
>>227
日本語読めないのかよ...

> 実行すると、エラーが出たり出なかったり謎の挙動を起こします
2018/04/23(月) 13:44:26.09ID:Hh6TN2Aq0
>>229
日本語でしゃべってくれ
2018/04/23(月) 13:58:46.97ID:1JtTwXqR0
実行してるということはコンパイルは通ってるということだと思う
つまりコンパイルの問題ではなく、コンパイルエラーではないだろうという推測
2018/04/23(月) 13:58:59.41ID:Lxhtz3Yj0
>>230
「実行すると」

ビルド時のコンパイラなどからのエラーではなく、
プログラムを実行したときの挙動についての質問のようですよ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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