C++相談室 part139
■ このスレッドは過去ログ倉庫に格納されています
次スレを立てる時は本文の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 >>79
>システムハンガリアンというか、 >>4 の「型と意味の二重の思考」を批判した。
物理学において、「次元解析」なる手法が知られており、単位の辻褄を合わす
組み合わせを見出すだけでかなりの事柄が導けることが知られている。
それが丁度、「型と意味の二重の思考」に近い。 ハンガリアンで書いてみればいいだろ。
今まで名前考えるのにどれだけ悩んでたかわかるから。
サクサクかけるでえ。 >>79
微妙な整数型の違いではまった経験があると
お前さんの理想論より泥臭くとも現実的な対処の仕方を優先したくなるんだよ >>79
>命名法を全否定したつもりはないけどな。
それはすまんかった
要するに記法に型を入れる必要は無いってこと?
まぁ型はちゃんと自分の目で確認しろよ、という考え方を否定するつもりはないけど
他人の書いた長いコード読んでると途中で忘れることもあるしなぁ
(特に数文字とかの短すぎるローカル変数名で長い関数書かれると地獄)
わかりやすけりゃ何でもいいんだけどさ
自分はテンプレートを理由にハンガリアンを否定するのは違うだろって言いたかっただけ >>85
私の思想では変数名が型を表すこともよくあるということを説明したつもりが、
まるで逆に受け取っているのでどう説明すればいいかわかんないや。
これ以上の説明はもうしない。 >>88
システムハンガリアンには型だけでなく意味(というか用途)まで混じってることを批判してるんじゃないの? いまどきハンガリアンごときで論争かよ。
間抜けだな。
日本人としての矜持はどこ行った。
今やるべきことはモンゴリアンの発表だろ。
作る人の板だぞここは。 この板は底辺ドカタしかいないからな
しょうがない >>91
そろそろ働けよ…
能書きだけじゃ食ってけないって身に沁みたろ? >>80
古来よりコピー作る(機能を提供する)のに使われている >>80
フィルタ(固有の動作状態を持つ(←重要)ブツ)のの配置や接続をユーザーがGUIで変更可能なフィルタアプリを作るとき使う
これは(部品)create()とclone()の両方が覿面に要る
イメージ的にはDirectShowのgraphEditみたいなアプリを考えたら良い
ユーザーがすでに書いた組み合わせフィルタ(A→B)を最終段にもう一発入れたいというときに、
今日日一般的で親切な操作インターフェースはワークシートにすでに描かれている(A→B)をclone()することである
フィルタが過去の入力履歴に依存するケースがあり、そういった記憶はフィルタのインスタンス固有なので、ポインタのコピーでは済まず、clone()である必要がある
(Visioみたいに単に部品の接続だけが問題なブツなら、部品自体はポインタのコピーで済ませて部品間の接続情報を別途管理するという構成も可能だが、部品の動作状態が絡むとclone()止む無し >>92,94,95
うーん、よくわからない。
純粋に
class A {
virtual: A() {}
}
のvirtual事なのですがその事を仰ってますよね?
"x* create()"と"x* clone()"が要る場合があるのは理解できるけど、
"x* create()"を実装するのにコンストラクタを仮想にする必要が無いような。
もう少しわかりやすくしてもらえると助かりますが、面倒でしたらスルー
していただいても結構です。ありがとう。 >>96
すまん。virtual constructer ってファクトリーメソッドの
別名というか旧い名前なんで其方の質問かと思ってたわ >>97, >>99
そもそもできてもどうやって使うんだ? >>100
さぁ?80に教示した人でないとわからないかも
「昔から」とあるから、独自処理系なのかも :-p コンストラクタはC++の構文上はvirtualにでっきない
抽象クラスx (Product)のx*を返すcreate()メソッドを何かのクラス(Creator)に設けたら機能としてはできる
Creatorが内部で実際の生成をサブクラスに委譲する場合は正にファクトリーメソッドパターン(のProductが抽象クラスのケース)になる
さらにその「何かのクラス」(Creator)まで抽象クラスにしたブツがアブストラクトファクトリーパターンというやつで、もはや
ProductとCreatorが同じ抽象クラスであってもかまわない。
ここまでやって初めてclone()が抽象化できるすわなち「インスタンスの」クローニングを抽象化のうちにやれる
抽象コンストラクタとはフツーアブストラクトファクトリーパターンかつProductとCreatorが共通の抽象クラスのケースを指す(のだと思う
※ 個人の感想です コンストラクタの中でそのクラスのvirtual関数を呼んでも
基底クラスのが呼ばれるよな。
基本的にコンストラクタの中ではあんまりいろいろしないほうがいい。 >基底クラスのが呼ばれるよな。
うそぴょん
自身のが(非仮想関数同然に)呼ばれる
理由はこんなかんじ↓
ttp://isoparametric.hatenablog.com/entry/20080707/1215396846 元の質問主はデストラクタと間違えたのかな?
コンストラクタにvirtual付けたらコンパイルエラーだからすぐわかるだろうし >>96に書いてるからそれはないだろ
最近コード書いてもみないで頭の中だけで机上の空論こね回すのが流行ってんだろ
初心者の間で 手を動かさずに脳内ですべてを完結させられたら、それはもう初心者じゃないだろ。
スーパープログラマの誕生だ。 「基底クラスのが呼ばれる」だと最基底のクラスの奴が呼ばれるみたいに見えるから突っ込まれたんでしょ
何を継承してようと何が派生してようと、あくまで自分自身のが呼ばれる >>109
なるほど
たしかに基底でなくて自分自身が正しいな HLSLのfloat4みたいに、xyzwでもrgbaでも扱える、
所謂エイリアスを実現するスマートな方法は参照でしょうか?
class float4
{
…
float x;
float& r=x;
}; >>17
CStringを使うのに「あのエディタ」以外を使うアホを救う必要あるか? typedef char* A;
typedef A B;
typedef B C;
typedef C D;
typedef E F;
typedef F G;
G lpszOmanko;
型が知りたいときに宣言を見ないアホを救おうと一生懸命なアホの書くコード >>112
>>115
ありがとうございます。
(A)VC++のプロパティ機能を使って、ゲッター、セッターを変数のように書く
(B)無名共用体
これらを試してみます。 無名共用体でもっともスマートに実装できました。
class float4
{
…
union{ float x; float r; };
union{ float y; float g; };
・・・
};
ありがとうございました。 float f4; float3 f3 = f4.ayx; が難しいみたいな話かと思った >>119
swizzleは(A)で対応できました。 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)を呼び出すにはどうすればいいですか? Boland C++ Builder 5を使用していたのですが仮想コンストラクタ
でコンパイルできませんでした。失礼しました。
VCLライブラリのTGraphicなどのヘッダーが仮想コンストラクタで記述
されていたのでてっきり仕様で認められている物だと・・。
このライブラリ(というかBuilder)だけ特殊ということで理解しました。
皆さんありがとうございました。 try __finally も使えて糞便利なんだよなアレ >>121
引数にconstつければ、"文字列リテラル"も渡せる。 引数なしのdispをオーバーライドしたから引数ありの方が隠蔽されたとかかな。明示的にusingしてみては? void disp(const char* str){
cout<<str<<\n;
}
virtual void disp(){
disp(“parent”);
}
void disp(){
disp(“child”);
}
124の言う通りconstつけろという話じゃないかな 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
}
}; clangの開発に携わりたいと思ったのですが、C++で書かれていて、テンプレートの理解も必要だし、簡単ではないですよね? clangの開発って、LLVMのチームに入りたいってこと?
だとするとC++のスキルは世界的な有名人になれるくらい凄腕でないと厳しいだろうな gnuの連中と真っ向やり合って勝とうって話だぜ
少なくとも、おまえらではゴミにすらカウントされんだろ バグの指摘だとか、
ドキュメントの typo を直すくらいの役にはたてるかもね。
ただ、自分のミス (未定義を踏んだとか) ではなく
コンパイラのバグであると確信をもって主張するには、
規格をかなり把握しておく必要は有るので、
それだけでもなかなか大変だ。 真のJava scriptがあればいいと思うのだが。 至る所に try catch を書かなきゃいけないスクリプト言語か 最近Java触ってないんだけど
あの検査例外指定を必ず書かされる糞仕様はまだ残ってるの? >>135
どっかの日本人が規格書だけ必死に読んでる間に
世界のプログラマは言語気にせずに必要なアプリ作ってるけどね。
そういうとこだよ。 >>135
コンパイラのバグ報告くらいなら、別に規格理解してなくても
ググったりメジャーなコンパイラで動作比較したらわかるけどな
さすがにコンパイラの開発に携わるなら規格読まないとダメだろうけど より詳しい人が精査するという前提でとにかく目を増やす、
おおざっぱでもバグを発見する目になるというのも悪いわけじゃないしな。
開発メンバーが少ないならそういう雑多な情報は嫌がられることもあるかもしれんが、
CLANG 級のソフトならそれなりにきちんとした開発体制は出来てるだろう。 バグ探しとかそういうレベルじゃなく
今なら並列に重きを置く最適化とかが勝負だろうが >>128は開発に携わりたいと言ってるのに、一人が無理と言い出し、多数バグ探ししか無理と言い
誰もアドバイス出来てないところが面白い ム板で返す言葉に事欠いて人格批判か
会社にも、論文に人情論を書くようなアホはさすがに少ないな >>144
本人が簡単ではないと思ってるから、 (割とハードルが低く) 出来ることもあるとアドバイスされている。 >>148
まあ新型のゲーム機のバグを見つけてネットで大騒ぎするというアドバイスは、本人は望んでなさそうだけどな 何言ってんだこいつ
俺は>>128への直接の回答じゃないけど、単にコンパイラのバグ報告ってそんな敷居の高いものではないよ、と
言っておきたかっただけなんだが 話の腰を折るようで悪いが
128が言っているのがclang自体の開発かどうか
まだ仮定なんだが スマートポインタの中身ぶち壊して他のアドレス与えて使いますことってできる? >>153
代入したら、元の生ポインタはいつ消えるの? >>144
> 一人が無理と言い出し
まあ務まるような奴ならこんなところで質問しない >>154
「消える」って言葉で何を意味してるのかがわからない
ポインタは消したりできるものではない
ポインタが指している先のインスタンスがデストラクトされるってことなら、
代入なりresetなりした時に前のをdeleteする必要があればdeleteされる
foo * p = new foo;
unique_ptr<foo> q(p);
みたいなときに q に何かして p に nullptr が入って欲しいならそれは無理 最近、gccを8.2にアップグレードしたのですが、
行列ライブラリGLMの最新版を使おうとすると、
std::log2他幾つかの数学関数(cmath)が未宣言とか言われてエラーがでます。
#代わりに::log2を使えとも
ネットを調べてみると、
「log2等はC99以降の追加なのでstd名前空間には入らない」
等のコメントが見つかったのですが、
ここら辺の真偽について教えてください。
仕様的な真偽以外にも、
1. 他のOSのg++8.2以上でも(自宅はFreeBSD10.0)でも同じなのか?
2. コンパイラオプション等で制御する方法はあるのか?
についても情報を求めています。 追記:
-std=c++11でも-std=c++17でもダメでした。何故? >>157-158
ありがとうございます
勉強します namespace std{
#include <math.h>
} >>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 名前空間に属しない関数として使えていた。 >>163
ふむ。ネットで調べた上での仕様的な解釈はだいたい正しかったみたいですね。
gcc 8.2.0で-std=c++11以降つけても使えないのは単なるバグなのか機種依存なのか…… >>165
どっち?
- GLM を使おうとするプログラムで std::log2 が未宣言というエラーになる
- cmath を include したどんなプログラムでも std::log2 を使えない >>165
gcc -std=c++11 -pedantic かも -pedantic は拡張機能を無効にするオプションなので、
紛うことなき C++11 の機能である std::log2 に影響しそうにないと思うけど……。 gccがバグってる派と規格がバグってる派の争いが勃発するのでは。 今のgccは-std=c++14がデフォだろ
7.0以後だっけ 一応ISOへ意見を言う機関(日本NB)で意見する権利くらいは持ってるんじゃないの range-based forでADLが効くことにすべきか否か
不特定多数に意見を請うてたな
奴は反対に傾いていたようで
俺とは見解を異にしていた そうなのか。
江添さんもすごいけど、このスレの人もすごいね。 俺も江添とは見解が異なるわ
どちらかというとビョーンの見解に近い >>175
へー。 ADL が使えないのなら、
std::begin と std::end の特殊化でやるってこと? 特殊化ってなんだ
ここで聞くよりググれよ、すぐ見つかるぞ 実際に発言権持ってるのってビャーネとGCCとかLLVMとかclingとかの中の人とその他お金出してる企業くらいだろ ■ このスレッドは過去ログ倉庫に格納されています