次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part137
http://mevius.5ch.net/test/read.cgi/tech/1531558382/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.103【環境依存OK】
http://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
探検
C++相談室 part138
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (スフッ Sd9f-fGne)
2018/08/05(日) 18:02:36.57ID:DigzqJtZd2デフォルトの名無しさん (ブーイモ MMa7-gYkF)
2018/08/05(日) 18:29:41.88ID:QdoPuPH9M STLつかうと一気に実行ファイルサイズが10倍に?!
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
---- テンプレ ここまで ----
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
---- テンプレ ここまで ----
3デフォルトの名無しさん (ワッチョイ ffcf-XO5Y)
2018/08/06(月) 01:35:11.09ID:BcLtAmRR0 >>2
テンプレ乙w
テンプレ乙w
4デフォルトの名無しさん (ワッチョイ e35e-sMWb)
2018/08/06(月) 19:00:03.54ID:dB2jG9W70 おすすめのC++を教えてください‼
5デフォルトの名無しさん (ワッチョイ 338a-vpSm)
2018/08/06(月) 19:08:12.36ID:Z6d+75Qr0 MIWA C++
6デフォルトの名無しさん (オッペケ Sr03-s/wt)
2018/08/11(土) 09:08:09.59ID:9wE6Nq69r rad c++ builderでファイルの入出力やドラッグ&ドロップ 簡単なdb操作は出来る様になったけど、もう一歩踏み出したいです
福岡当たりで勉強会みたいなのはないでしょうか?
大阪、東京でも有るなら飛行機使っていきたいです
福岡当たりで勉強会みたいなのはないでしょうか?
大阪、東京でも有るなら飛行機使っていきたいです
7デフォルトの名無しさん (オッペケ Sr03-s/wt)
2018/08/11(土) 09:14:26.43ID:9wE6Nq69r 6です
c++ builderのスレッドが合ったので
そちらで聞いてみます
失礼しました
c++ builderのスレッドが合ったので
そちらで聞いてみます
失礼しました
9デフォルトの名無しさん (ワッチョイ ed85-EM0A)
2018/08/28(火) 21:29:17.96ID:t/yKDZjb0 関数内にstaticつけたクラス変数定義した場合、
コンストラクタは関数を最初に呼び出したときだけ呼ばれると思います。
これはどういう仕掛けなのですか?どこかにフラグがこっそり用意されるのでしょうか。
コンストラクタは関数を最初に呼び出したときだけ呼ばれると思います。
これはどういう仕掛けなのですか?どこかにフラグがこっそり用意されるのでしょうか。
10デフォルトの名無しさん (ワッチョイ b98a-WOyi)
2018/08/28(火) 22:30:18.70ID:CqD+kceR011デフォルトの名無しさん (ワッチョイ ed85-EM0A)
2018/08/28(火) 22:51:57.87ID:t/yKDZjb0 >10
ちょっと書き方間違えました。
定義ではなく宣言です。
間違ってますでしょうか?ではコンストラクタが呼ばれるタイミングはどこでしょうか
ちょっと書き方間違えました。
定義ではなく宣言です。
間違ってますでしょうか?ではコンストラクタが呼ばれるタイミングはどこでしょうか
12デフォルトの名無しさん (ブーイモ MM01-my2l)
2018/08/28(火) 23:03:55.88ID:bcRKdMjSM13デフォルトの名無しさん (ワッチョイ 954f-kiUO)
2018/08/28(火) 23:12:40.50ID:UyOLOIaa014デフォルトの名無しさん (ワッチョイ db4f-f65Y)
2018/09/08(土) 15:23:29.92ID:Bduckbke0 virtualなデストラクタを持たないクラスを継承しているクラスを派生していない状態でコンテナ等に入れた場合、
エラーまたは警告にする方法ってある?
典型的な「デストラクタをvirtualにしろ」のケースであり、
安全性だけを取るのならそうすれば済むのだが、大量使用したいのでコストを限界までケチりたい。
可能であればコンパイラにチェックさせたい。
具体的に言うと、Matz曰く「実装が漏れてる」の典型的なケース、配列について、
長さと先頭のポインタをstructにして、各操作をそれに対するメソッドとして記述し、
スクリプト言語風に簡潔に書けるか試したい。
std::spanの再実装に近いので、そちらで言うと、
https://github.com/tcbrindle/span/blob/master/include/tcb/span.hpp
std::spanを継承して各種メソッドを生やし、(クラスM)
さらにそれを継承して以下3つのコンストラクタを持たせる。
クラスA. 型と既存ポインタと長さからの生成
クラスB. 型と長さを与え、allocaでの生成
クラスC. 型と長さを与え、heap上への生成
A,Bは問題ないが、Cはデストラクタでdeleteをする必要がある。
ここでstd::spanのデストラクタはvirtualではないので、(上記実装例の場合)
vector<C>をvector<M>等と間違えたら不味い。
このときに、警告またはエラーを発生させたい。
エラーまたは警告にする方法ってある?
典型的な「デストラクタをvirtualにしろ」のケースであり、
安全性だけを取るのならそうすれば済むのだが、大量使用したいのでコストを限界までケチりたい。
可能であればコンパイラにチェックさせたい。
具体的に言うと、Matz曰く「実装が漏れてる」の典型的なケース、配列について、
長さと先頭のポインタをstructにして、各操作をそれに対するメソッドとして記述し、
スクリプト言語風に簡潔に書けるか試したい。
std::spanの再実装に近いので、そちらで言うと、
https://github.com/tcbrindle/span/blob/master/include/tcb/span.hpp
std::spanを継承して各種メソッドを生やし、(クラスM)
さらにそれを継承して以下3つのコンストラクタを持たせる。
クラスA. 型と既存ポインタと長さからの生成
クラスB. 型と長さを与え、allocaでの生成
クラスC. 型と長さを与え、heap上への生成
A,Bは問題ないが、Cはデストラクタでdeleteをする必要がある。
ここでstd::spanのデストラクタはvirtualではないので、(上記実装例の場合)
vector<C>をvector<M>等と間違えたら不味い。
このときに、警告またはエラーを発生させたい。
15デフォルトの名無しさん (ワッチョイ db4f-f65Y)
2018/09/08(土) 22:19:49.23ID:Bduckbke0 もう一つよろしく。
C++でkey/valueソートしたい場合は
・std::unordered_multimap等にコピーしてからstd::sort
・自前で<key,value>を含んだ構造体を用意し、それに < を定義して、コピーしてstd::sort
のどちらかって感じ?
ちょっとまどろっこしいので、もう少し簡単な方法無いかな?
doubleの配列をソートした際、何番目がどこに行ったか追跡したい。
.NETだと Array::sort(array0, array1) があり、
array0 に double の配列、
array1 に [0 ... N-1] な配列を指定しておけば、array1の結果で簡単に追跡出来た。
記法が原始的ではあるが、結果的にはこっちの方が楽で良かった。
std::sortで2つの配列を取る物があれば助かるのだが、なさそうだし。
boostも見たが、よく分からん。
C++でkey/valueソートしたい場合は
・std::unordered_multimap等にコピーしてからstd::sort
・自前で<key,value>を含んだ構造体を用意し、それに < を定義して、コピーしてstd::sort
のどちらかって感じ?
ちょっとまどろっこしいので、もう少し簡単な方法無いかな?
doubleの配列をソートした際、何番目がどこに行ったか追跡したい。
.NETだと Array::sort(array0, array1) があり、
array0 に double の配列、
array1 に [0 ... N-1] な配列を指定しておけば、array1の結果で簡単に追跡出来た。
記法が原始的ではあるが、結果的にはこっちの方が楽で良かった。
std::sortで2つの配列を取る物があれば助かるのだが、なさそうだし。
boostも見たが、よく分からん。
16デフォルトの名無しさん (ワッチョイ db4f-f65Y)
2018/09/11(火) 19:14:32.80ID:85ZJZj420 抽象型のメソッドを使ったときにも型を失わず、派生型のままで返す方法って無いよね?
継承を使わず、テンプレートで展開するしかないか?
コード上で展開されるのが、多少勿体ないんだが。
>>14の実装で、
各種メソッドをクラスMに突っ込み、それを継承していると、
Cからメソッドを呼び出した際、どうしてもM&等の型しか返せず、
ダウンキャストがいちいち必要なのがウザイ。
具体的には、fromは既存の配列からコピー、sortはソートするメソッドとして、メソッドチェーンで初期化する際、
C& test = (C&)C( ... ).from( ... ).sort();
となり、fromやsortがM&を返すのでC&にダウンキャストする必要がある。
従来方式の初期化して使用なら問題はない。
コンストラクタは派生型を返し、メソッド群はM&で閉じているので。
A& test = A( ... );
test.from( ... ).sort();
メソッドをvirtualにすれば回避出来るはずだが、無駄にvirtualにしたくない。
B/C共に全く同一の関数で済むはずなので、可能で有れば共有したい。
諦めてB/C毎に同じ関数をtemplateで展開すれば出来るのは分かるが、これはしたくない。
何か方法有る?
継承を使わず、テンプレートで展開するしかないか?
コード上で展開されるのが、多少勿体ないんだが。
>>14の実装で、
各種メソッドをクラスMに突っ込み、それを継承していると、
Cからメソッドを呼び出した際、どうしてもM&等の型しか返せず、
ダウンキャストがいちいち必要なのがウザイ。
具体的には、fromは既存の配列からコピー、sortはソートするメソッドとして、メソッドチェーンで初期化する際、
C& test = (C&)C( ... ).from( ... ).sort();
となり、fromやsortがM&を返すのでC&にダウンキャストする必要がある。
従来方式の初期化して使用なら問題はない。
コンストラクタは派生型を返し、メソッド群はM&で閉じているので。
A& test = A( ... );
test.from( ... ).sort();
メソッドをvirtualにすれば回避出来るはずだが、無駄にvirtualにしたくない。
B/C共に全く同一の関数で済むはずなので、可能で有れば共有したい。
諦めてB/C毎に同じ関数をtemplateで展開すれば出来るのは分かるが、これはしたくない。
何か方法有る?
17デフォルトの名無しさん (ブーイモ MM06-M35H)
2018/09/11(火) 21:29:12.21ID:THBnA1g1M そもそもなんのためにMから継承してんのか考えてみたら
18デフォルトの名無しさん (ワッチョイ db4f-f65Y)
2018/09/11(火) 21:47:24.91ID:85ZJZj420 >>17
オブジェクト指向ではMで閉じるというのが正しいと思いこんでるんだろ。
それは一面にすぎない。
JavaScriptではメソッドチェーンで型を失わない。
だから上記のようなことも平気で出来る。
勿論C++でも実装を別々にすれば出来るが、ダブる分無駄に膨らむ。
或いはvirtualにしても出来るが、これはポインタ一つ分データが膨らみ、呼び出しも遅くなる。
最適化した状態での記述方法がない。
今回、AとCの違いはデストラクタ内で解放するかどうかだけであり、
当然全てのメソッドは共有出来る。
順当なら継承が妥当だが、virtualにしないと型を失ってしまう。
(この点、全てvirtualであるJavaはオブジェクト指向原理主義としては筋が通っている)
オブジェクト指向ではMで閉じるというのが正しいと思いこんでるんだろ。
それは一面にすぎない。
JavaScriptではメソッドチェーンで型を失わない。
だから上記のようなことも平気で出来る。
勿論C++でも実装を別々にすれば出来るが、ダブる分無駄に膨らむ。
或いはvirtualにしても出来るが、これはポインタ一つ分データが膨らみ、呼び出しも遅くなる。
最適化した状態での記述方法がない。
今回、AとCの違いはデストラクタ内で解放するかどうかだけであり、
当然全てのメソッドは共有出来る。
順当なら継承が妥当だが、virtualにしないと型を失ってしまう。
(この点、全てvirtualであるJavaはオブジェクト指向原理主義としては筋が通っている)
19デフォルトの名無しさん (ワッチョイ db4f-f65Y)
2018/09/11(火) 21:53:29.04ID:85ZJZj420 ちなみに技術的には、super に対するキーワード derived が足りないのだと思う。
クラスM内で、
M& from(){ ... ; return *this;}
ではなく
derived& from(){ ... ; return *this;}
と出来て「呼び出した型」を返せれば全く問題ないんだが。
この辺のキーワードって無いよね?
クラスM内で、
M& from(){ ... ; return *this;}
ではなく
derived& from(){ ... ; return *this;}
と出来て「呼び出した型」を返せれば全く問題ないんだが。
この辺のキーワードって無いよね?
20デフォルトの名無しさん (ブーイモ MMaf-M35H)
2018/09/11(火) 22:08:25.40ID:t5mEMNA5M なんだ、JavaScriptという一側面だけ見てC++に立ち向かってるアホだったのか
まぁがんばれよ
まぁがんばれよ
21デフォルトの名無しさん (ワッチョイ db4f-f65Y)
2018/09/11(火) 22:17:09.88ID:85ZJZj420 C++がメソッドチェーンに向いてないのは確かだよ。
それ向けの文法も用意されてない。
多分「継承」に対して型を失うこと自体が間違いなんだよ。
C++はそこら辺が古い。
ただ、ダブって良ければtemplateで解決出来るのも確かだが。
それ向けの文法も用意されてない。
多分「継承」に対して型を失うこと自体が間違いなんだよ。
C++はそこら辺が古い。
ただ、ダブって良ければtemplateで解決出来るのも確かだが。
22デフォルトの名無しさん (ワッチョイ 13f2-7GfT)
2018/09/11(火) 22:23:59.41ID:LgiPUNaQ0 JavaScriptの場合は型が失われないんじゃなくて「無い」んだな。
レシーバの型に関係なく呼び出せてしまうだけ。
レシーバの型に関係なく呼び出せてしまうだけ。
23デフォルトの名無しさん (ワッチョイ db4f-f65Y)
2018/09/11(火) 22:31:38.02ID:85ZJZj420 >>20
あとついでに言うと、その選民思想はマジで止めろ。
C++だけの話でもないが。
というより最近「俺がやってる言語スゲー」な奴が多いのは何でだ?
一昔前は全員Cが出来、その上で他言語だったから、その手の争いは皆無だった。
それ以前にプログラミングがきちんと出来れば、後は文法だけの問題だから、
多言語化は容易だし、実際全く問題ない。
「俺の言語スゲー」でイキれる奴って文法しか見えない馬鹿のような気がするが。
C++はコンパイラ向けの文法ばかり多くて、本質的なプログラミング用の文法は多くない。
今回も、JavaScriptだと容易に実現出来るのに、C++だと記述出来ないだろ。
あまり他言語を馬鹿にしていると足をすくわれるぞ。
あとついでに言うと、その選民思想はマジで止めろ。
C++だけの話でもないが。
というより最近「俺がやってる言語スゲー」な奴が多いのは何でだ?
一昔前は全員Cが出来、その上で他言語だったから、その手の争いは皆無だった。
それ以前にプログラミングがきちんと出来れば、後は文法だけの問題だから、
多言語化は容易だし、実際全く問題ない。
「俺の言語スゲー」でイキれる奴って文法しか見えない馬鹿のような気がするが。
C++はコンパイラ向けの文法ばかり多くて、本質的なプログラミング用の文法は多くない。
今回も、JavaScriptだと容易に実現出来るのに、C++だと記述出来ないだろ。
あまり他言語を馬鹿にしていると足をすくわれるぞ。
24デフォルトの名無しさん (ワッチョイ faa2-7GfT)
2018/09/11(火) 22:32:51.96ID:csxqls2+0 CRTP使えばどうだろう?
template <typename Derived>
class M {
public:
Derived &from(){ return static_cast<Derived &>(*this); }
};
class A : public M<A>{};
class B : public M<B>{};
template <typename Derived>
class M {
public:
Derived &from(){ return static_cast<Derived &>(*this); }
};
class A : public M<A>{};
class B : public M<B>{};
25デフォルトの名無しさん (ワッチョイ db4f-f65Y)
2018/09/11(火) 22:40:51.16ID:85ZJZj420 >>22
まあその通りだが、
C++: 記述出来ない
JavaScript: 動的型なのでそのまま書けるし、動作する
Java: 全部virtualだからそのまま書ける(ただし、これでいいのならC++でも書ける)
Go: 継承を廃止してしまったからそもそもこの問題は発生しない?
Rust: ちょっと見たがよく分からん
まあ俺はやっぱり、「継承」で親の関数を呼んだら型が失われるのは間違いだと思うよ。
仮に Z : Y : X と継承していたとして、
(Zの実体).(Xのメソッド).(Yのメソッド) とは出来ないでしょ。(Xのメソッドの時点でX&になるから)
これはメソッドチェーンする気なら使いにくい。
(これまでは居なかったから問題にならなかっただけ。バラバラに書けば出来るので)
まあその通りだが、
C++: 記述出来ない
JavaScript: 動的型なのでそのまま書けるし、動作する
Java: 全部virtualだからそのまま書ける(ただし、これでいいのならC++でも書ける)
Go: 継承を廃止してしまったからそもそもこの問題は発生しない?
Rust: ちょっと見たがよく分からん
まあ俺はやっぱり、「継承」で親の関数を呼んだら型が失われるのは間違いだと思うよ。
仮に Z : Y : X と継承していたとして、
(Zの実体).(Xのメソッド).(Yのメソッド) とは出来ないでしょ。(Xのメソッドの時点でX&になるから)
これはメソッドチェーンする気なら使いにくい。
(これまでは居なかったから問題にならなかっただけ。バラバラに書けば出来るので)
26デフォルトの名無しさん (ワッチョイ db4f-f65Y)
2018/09/11(火) 22:45:25.78ID:85ZJZj420 >>24
とりあえず今はそれで実装してる。
それが16で言ってる
> 諦めてB/C毎に同じ関数をtemplateで展開すれば出来る
というやつ。
ただどう見ても無駄なので、可能で有れば実体も一つにしたい。
とりあえず今はそれで実装してる。
それが16で言ってる
> 諦めてB/C毎に同じ関数をtemplateで展開すれば出来る
というやつ。
ただどう見ても無駄なので、可能で有れば実体も一つにしたい。
27デフォルトの名無しさん (ワッチョイ faa2-7GfT)
2018/09/11(火) 22:53:40.32ID:csxqls2+028デフォルトの名無しさん (ワッチョイ db4f-f65Y)
2018/09/11(火) 23:12:47.47ID:85ZJZj420 >>27
テンプレートは型毎に展開されるし、自明では?
むしろ通じない方が不思議だ。
仮に俺が言ったように19の表記が出来れば、
オブジェクトコードはその部分は半分で済むし、命令キャッシュのヒット率も上がる。
勿論C++でもvirtualにすればこれらの点は解決するが、
呼び出しが遅くなってデータオブジェクトもポインタ一つ分膨らむだろ。
今のC++では最適化したオブジェクトコードを吐かせる記述が出来ない。
テンプレートは型毎に展開されるし、自明では?
むしろ通じない方が不思議だ。
仮に俺が言ったように19の表記が出来れば、
オブジェクトコードはその部分は半分で済むし、命令キャッシュのヒット率も上がる。
勿論C++でもvirtualにすればこれらの点は解決するが、
呼び出しが遅くなってデータオブジェクトもポインタ一つ分膨らむだろ。
今のC++では最適化したオブジェクトコードを吐かせる記述が出来ない。
29デフォルトの名無しさん (ワッチョイ 7ab3-M35H)
2018/09/11(火) 23:40:37.34ID:XxpWxEDT0 C++コンパイラの気持ちになって考えてみなよ
お前の望みは無理だから
どうせベンチとらずに遅いとか言ってんだろ
だまってvirtual使うかダウンキャストするかそもそも継承使わないかどれかにしとけ
お前の望みは無理だから
どうせベンチとらずに遅いとか言ってんだろ
だまってvirtual使うかダウンキャストするかそもそも継承使わないかどれかにしとけ
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 米大統領報道官「日本と強固な同盟維持、中国とも協力」 [少考さん★]
- ミス・ユニバース フィンランド代表の「つり目」写真が波紋… 本人釈明も批判やまず 協会謝罪「徹底的に検証」へ [冬月記者★]
- 【おこめ券】鈴木憲和農相 小泉前農相の備蓄米放出を“反省”「備蓄の円滑な運営を図ってまいります」 [Hitzeschleier★]
- 1人3千円の食品高騰対策、何に使える? あいまいなまま衆院通過 [蚤の市★]
- ゆたぼん 二重手術を報告「めちゃくちゃ気に入っています」 [muffin★]
- 【山形】クマ駆除で誤射した猟友会隊員に町が1663万円請求へ...弾当たり男性大けが2023年 小国町 [nita★]
- __トランプ、イスラエル支援で追加6.5億ドル承認、合計約200億ドル、この支出を国内課題への対応と比較して批判 [827565401]
- 中国人、ガチ超正論。「日本人がアイヌに対してやったことを『問題ない』とするなら、中国が日本人に同じことをしても文句ないだろう?」 [314039747]
- そういえばクマのニュース減ったよな
- 【悲報】新米、全く売れなくて倉庫が満杯になってしまうwwwwwwwwwwwwwwwwwwww [802034645]
- 木曜日のんなっしょい❗(・o・🍬)仕放題スレ🏡
- 【悲報】日本共産党、ツイッター速報にブチギレ法的措置WWWWWWWWWWWWWWWWWWWWWWWWWWWW [935793931]
