X



C++相談室 part139
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ f65b-zn+7)垢版2018/10/06(土) 00:59:48.54ID:CdYUXXMG0
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

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

前スレ
C++相談室 part137 (正しくはpart138)
http://mevius.5ch.net/test/read.cgi/tech/1535353320/

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

■長いソースを貼るときはここへ。■
 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
0081デフォルトの名無しさん (ワッチョイ c4e3-BkfR)垢版2018/10/06(土) 23:00:31.50ID:YHCdyeri0
>>79
>システムハンガリアンというか、 >>4 の「型と意味の二重の思考」を批判した。

物理学において、「次元解析」なる手法が知られており、単位の辻褄を合わす
組み合わせを見出すだけでかなりの事柄が導けることが知られている。

それが丁度、「型と意味の二重の思考」に近い。
0082デフォルトの名無しさん (ワッチョイ a6b3-XM+q)垢版2018/10/06(土) 23:07:04.84ID:3GKrUe5y0
ハンガリアンで書いてみればいいだろ。
今まで名前考えるのにどれだけ悩んでたかわかるから。
サクサクかけるでえ。
0084デフォルトの名無しさん (ワッチョイ a6b3-XM+q)垢版2018/10/06(土) 23:12:29.30ID:3GKrUe5y0
サクッちょサクサクやで。
0085デフォルトの名無しさん (ワッチョイ 70b3-vBoO)垢版2018/10/07(日) 00:02:27.52ID:2FImrXZj0
>>79
>命名法を全否定したつもりはないけどな。
それはすまんかった
要するに記法に型を入れる必要は無いってこと?

まぁ型はちゃんと自分の目で確認しろよ、という考え方を否定するつもりはないけど
他人の書いた長いコード読んでると途中で忘れることもあるしなぁ
(特に数文字とかの短すぎるローカル変数名で長い関数書かれると地獄)
わかりやすけりゃ何でもいいんだけどさ

自分はテンプレートを理由にハンガリアンを否定するのは違うだろって言いたかっただけ
0086デフォルトの名無しさん (スップ Sd02-YLcB)垢版2018/10/07(日) 00:05:36.66ID:rbebcA6zd
>>85
まだ理解できてなくてワロタw
00885 (ワッチョイ e66f-vBoO)垢版2018/10/07(日) 00:33:33.16ID:77445U4A0
>>85
私の思想では変数名が型を表すこともよくあるということを説明したつもりが、
まるで逆に受け取っているのでどう説明すればいいかわかんないや。
これ以上の説明はもうしない。
0090デフォルトの名無しさん (ワッチョイ a6b3-XM+q)垢版2018/10/07(日) 01:06:34.13ID:iX7g/tHs0
いまどきハンガリアンごときで論争かよ。
間抜けだな。
日本人としての矜持はどこ行った。
今やるべきことはモンゴリアンの発表だろ。
作る人の板だぞここは。
0091デフォルトの名無しさん (ワッチョイ d980-A6IM)垢版2018/10/07(日) 01:11:39.10ID:mIq+f5AO0
この板は底辺ドカタしかいないからな
しょうがない
0095デフォルトの名無しさん (ワッチョイ 26bd-PkCJ)垢版2018/10/07(日) 06:58:40.31ID:874mFeqU0
>>80
フィルタ(固有の動作状態を持つ(←重要)ブツ)のの配置や接続をユーザーがGUIで変更可能なフィルタアプリを作るとき使う
これは(部品)create()とclone()の両方が覿面に要る
イメージ的にはDirectShowのgraphEditみたいなアプリを考えたら良い

ユーザーがすでに書いた組み合わせフィルタ(A→B)を最終段にもう一発入れたいというときに、
今日日一般的で親切な操作インターフェースはワークシートにすでに描かれている(A→B)をclone()することである
フィルタが過去の入力履歴に依存するケースがあり、そういった記憶はフィルタのインスタンス固有なので、ポインタのコピーでは済まず、clone()である必要がある
(Visioみたいに単に部品の接続だけが問題なブツなら、部品自体はポインタのコピーで済ませて部品間の接続情報を別途管理するという構成も可能だが、部品の動作状態が絡むとclone()止む無し
0096デフォルトの名無しさん (ワッチョイ fcaf-XM+q)垢版2018/10/07(日) 11:07:53.26ID:rhwre/Em0
>>92,94,95
うーん、よくわからない。
純粋に
class A {
virtual: A() {}
}
のvirtual事なのですがその事を仰ってますよね?
"x* create()"と"x* clone()"が要る場合があるのは理解できるけど、
"x* create()"を実装するのにコンストラクタを仮想にする必要が無いような。
もう少しわかりやすくしてもらえると助かりますが、面倒でしたらスルー
していただいても結構です。ありがとう。
0102デフォルトの名無しさん (ワッチョイ 26bd-PkCJ)垢版2018/10/07(日) 14:41:28.41ID:874mFeqU0
コンストラクタはC++の構文上はvirtualにでっきない
抽象クラスx (Product)のx*を返すcreate()メソッドを何かのクラス(Creator)に設けたら機能としてはできる
Creatorが内部で実際の生成をサブクラスに委譲する場合は正にファクトリーメソッドパターン(のProductが抽象クラスのケース)になる

さらにその「何かのクラス」(Creator)まで抽象クラスにしたブツがアブストラクトファクトリーパターンというやつで、もはや
ProductとCreatorが同じ抽象クラスであってもかまわない。
ここまでやって初めてclone()が抽象化できるすわなち「インスタンスの」クローニングを抽象化のうちにやれる

抽象コンストラクタとはフツーアブストラクトファクトリーパターンかつProductとCreatorが共通の抽象クラスのケースを指す(のだと思う

※ 個人の感想です
0107デフォルトの名無しさん (ワッチョイ a6b3-XM+q)垢版2018/10/07(日) 15:47:27.26ID:iX7g/tHs0
手を動かさずに脳内ですべてを完結させられたら、それはもう初心者じゃないだろ。
スーパープログラマの誕生だ。
0109デフォルトの名無しさん (ワッチョイ 9bc3-dNAh)垢版2018/10/07(日) 16:17:18.47ID:ldfyXuEU0
「基底クラスのが呼ばれる」だと最基底のクラスの奴が呼ばれるみたいに見えるから突っ込まれたんでしょ
何を継承してようと何が派生してようと、あくまで自分自身のが呼ばれる
0116111 (ワッチョイ 6223-AEfH)垢版2018/10/07(日) 23:30:13.67ID:EwS6ucBG0
>>112
>>115
ありがとうございます。

(A)VC++のプロパティ機能を使って、ゲッター、セッターを変数のように書く
(B)無名共用体

これらを試してみます。
0117111 (ワッチョイ 6223-AEfH)垢版2018/10/08(月) 01:39:38.90ID:LP2GoVYR0
無名共用体でもっともスマートに実装できました。

class float4
{

union{ float x; float r; };
union{ float y; float g; };
・・・
};

ありがとうございました。
0118デフォルトの名無しさん (ワッチョイ a6b3-XM+q)垢版2018/10/08(月) 03:22:10.62ID:mztv/TPA0
どういたしまして。
0121デフォルトの名無しさん (ワッチョイ df81-vBoO)垢版2018/10/09(火) 12:09:32.42ID:R91wWJMl0
class parent {
public:
void disp() {
cout << "parent\n";
}
void disp(char* str) {
cout << str << "\n";
}
};

class child : public parent {
public:
void disp() {
cout << "child\n";
}
};

disp(char* str)を呼び出すにはどうすればいいですか?
012280 (ワッチョイ d081-TgND)垢版2018/10/09(火) 12:49:30.07ID:+8izRWpu0
Boland C++ Builder 5を使用していたのですが仮想コンストラクタ
でコンパイルできませんでした。失礼しました。
VCLライブラリのTGraphicなどのヘッダーが仮想コンストラクタで記述
されていたのでてっきり仕様で認められている物だと・・。
このライブラリ(というかBuilder)だけ特殊ということで理解しました。
皆さんありがとうございました。
0127デフォルトの名無しさん (ワッチョイ 1508-vBoO)垢版2018/10/09(火) 18:55:23.66ID:sicZSpN90
class parent {
public:
void disp() {
cout << "parent\n";
}
void disp(char const* str) { //added: const
cout << str << "\n";
}
};

class child : public parent {
public:
using parent::disp; //created
void disp() {
disp("child"); //changed: cout -> disp
}
};
0130デフォルトの名無しさん (ワッチョイ e2d2-pJhu)垢版2018/10/10(水) 09:46:07.79ID:HW3BEf/50
ん?プルリク送るだけじゃないの
0135デフォルトの名無しさん (ワッチョイ e66f-vBoO)垢版2018/10/10(水) 17:08:56.41ID:MsVaxrK/0
バグの指摘だとか、
ドキュメントの typo を直すくらいの役にはたてるかもね。

ただ、自分のミス (未定義を踏んだとか) ではなく
コンパイラのバグであると確信をもって主張するには、
規格をかなり把握しておく必要は有るので、
それだけでもなかなか大変だ。
0136デフォルトの名無しさん (スプッッ Sdda-YLcB)垢版2018/10/10(水) 17:33:55.95ID:+jUb1Zszd
ハンガリアン使ってる奴には無理だろうな
0137デフォルトの名無しさん (ワッチョイ a6b3-XM+q)垢版2018/10/10(水) 18:50:52.92ID:ApxL+L/D0
真のJava scriptがあればいいと思うのだが。
0141デフォルトの名無しさん (ワッチョイ 70b3-vBoO)垢版2018/10/10(水) 21:24:35.61ID:r0MKwZEq0
>>135
コンパイラのバグ報告くらいなら、別に規格理解してなくても
ググったりメジャーなコンパイラで動作比較したらわかるけどな

さすがにコンパイラの開発に携わるなら規格読まないとダメだろうけど
0142デフォルトの名無しさん (ワッチョイ e66f-vBoO)垢版2018/10/10(水) 22:41:09.57ID:MsVaxrK/0
より詳しい人が精査するという前提でとにかく目を増やす、
おおざっぱでもバグを発見する目になるというのも悪いわけじゃないしな。
開発メンバーが少ないならそういう雑多な情報は嫌がられることもあるかもしれんが、
CLANG 級のソフトならそれなりにきちんとした開発体制は出来てるだろう。
0156デフォルトの名無しさん (ブーイモ MMcf-NsMu)垢版2018/10/12(金) 05:17:14.20ID:1iFt3dhJM
scopeから出たら消える
0157デフォルトの名無しさん (スプッッ Sd7f-WryL)垢版2018/10/12(金) 05:40:31.89ID:ZYTXH3K/d
>>154
「消える」って言葉で何を意味してるのかがわからない
ポインタは消したりできるものではない

ポインタが指している先のインスタンスがデストラクトされるってことなら、
代入なりresetなりした時に前のをdeleteする必要があればdeleteされる

foo * p = new foo;
unique_ptr<foo> q(p);

みたいなときに q に何かして p に nullptr が入って欲しいならそれは無理
0159デフォルトの名無しさん (ワッチョイ df04-tiyD)垢版2018/10/12(金) 16:26:55.42ID:KckWK6Wl0
最近、gccを8.2にアップグレードしたのですが、
行列ライブラリGLMの最新版を使おうとすると、
std::log2他幾つかの数学関数(cmath)が未宣言とか言われてエラーがでます。
#代わりに::log2を使えとも
ネットを調べてみると、
「log2等はC99以降の追加なのでstd名前空間には入らない」
等のコメントが見つかったのですが、
ここら辺の真偽について教えてください。

仕様的な真偽以外にも、
1. 他のOSのg++8.2以上でも(自宅はFreeBSD10.0)でも同じなのか?
2. コンパイラオプション等で制御する方法はあるのか?

についても情報を求めています。
0163はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-4Hut)垢版2018/10/12(金) 21:26:30.53ID:v3EBhOgT0
>>159
言語仕様的には C++11 で std::log2 は追加された。
なので、 C++11 以降なら cmath を include していれば std::log2 を使うことは出来る。

C++ は C が提供する関数は基本的に使えることになっていて、それらは std 名前空間に属するが、
C++03 の時点で想定していた C は C90 のこと。 なので、 C++03 には log2 は無かった。
ただ、環境に C99 用の math.h があればそれを include すれば (C++03 の仕様には無いが) std 名前空間に属しない関数として使えていた。
0169デフォルトの名無しさん (ワッチョイ 67b3-JlWZ)垢版2018/10/14(日) 01:19:47.45ID:k35qB8Cf0
gccがバグってる派と規格がバグってる派の争いが勃発するのでは。
0177デフォルトの名無しさん (ワッチョイ 277f-4Hut)垢版2018/10/14(日) 11:47:14.18ID:xrZwnrIj0
俺も江添とは見解が異なるわ
どちらかというとビョーンの見解に近い
■ このスレッドは過去ログ倉庫に格納されています

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