C++相談室 part98
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2012/09/18(火) 19:42:02.09参考書のプログラム書いてコンパイル時に
エラーE2316 seftはostreamのメンバーではない関数ってエラーが出てしまった。
原因が自分で調べてもわからなかったんで
分かる人が居たら教えて欲しい。
以下ソース↓
//seft02.cpp
#include <iostream>
using namespace std;
int main()
{
int a = 10, b = 100;
cout << "16進数表示" << endl;
cout.seft(ios::hex, ios::basefield);
cout << "a = " << a << endl;
cout << "b = " << b << endl << endl;
return 0;
}
0002デフォルトの名無しさん
2012/09/18(火) 22:37:42.68言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
京都大学霊長類研究所
0003デフォルトの名無しさん
2012/09/20(木) 01:14:50.740004デフォルトの名無しさん
2012/09/20(木) 07:40:38.24こっちでやれ そしてここは削除依頼しろ
C++相談室 part98
http://toro.2ch.net/test/read.cgi/tech/1345823164/
0005デフォルトの名無しさん
2012/10/02(火) 12:43:40.650007デフォルトの名無しさん
2012/10/09(火) 15:17:04.620008デフォルトの名無しさん
2012/10/09(火) 17:55:54.85======
初期化リストを返す関数って許されていますか?
下に貼るコードの動作がおかしくて困っています。
また、forward_listにすれば解決はしますが、
何度も呼ばれる場合、パフォーマンスは初期化リストの方がいいですよね?
#include <iostream>
#include <utility>
#include <initializer_list>
std::initializer_list<int> test(const std::pair<int,int>& e) {
//return {1,2,3}; //ok!
return {e.first,e.second,e.first}; //undefined?
}
int main()
{
for (auto i: test(std::make_pair(1,2))) {
std::cout << i << std::endl;
}
}
0009デフォルトの名無しさん
2012/10/09(火) 17:58:26.820010デフォルトの名無しさん
2012/10/09(火) 18:02:40.440011デフォルトの名無しさん
2012/10/09(火) 19:19:31.390012デフォルトの名無しさん
2012/10/09(火) 19:59:56.90ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part98
http://toro.2ch.net/test/read.cgi/tech/1347964922/
(従ってこのスレは実質part99となります)
姉妹スレ
【初心者歓迎】C/C++室 Ver.80【環境依存OK】
http://toro.2ch.net/test/read.cgi/tech/1348161305/
■長いソースを貼るときはここへ。■
http://codepad.org/
http://ideone.com/
0013デフォルトの名無しさん
2012/10/09(火) 20:00:23.94[C++ FAQ]
http://www.parashift.com/c++-faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
http://en.cppreference.com/w/cpp (英語)
http://ja.cppreference.com/w/cpp (↑の日本語訳だけどまだ未完)
[Stroustrup]
http://www.stroustrup.com/
[C++ International Standard]
http://www.iso.org/iso/iso_catalogue/catalogue_ics/catalogue_detail_ics.htm?csnumber=50372
[JTC1/SC22/WG21 - C++]
http://www.open-std.org/jtc1/sc22/wg21/
ここから規格の最新ドラフトがダウンロードできる。
[JIS X3014]
http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3014
ISO規格の日本語訳。JIS X3014:2003はISO/IEC 14882:2003 (E)に対応。
0014デフォルトの名無しさん
2012/10/09(火) 20:00:40.96amazon C,C++関連書籍
http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
http://www.amazon.co.jp/b/?node=754384
The C++ Programming Language
http://www.amazon.com/exec/obidos/ASIN/0201700735/
http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
http://www.amazon.com/exec/obidos/ASIN/0201824701/
http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
http://www.amazon.com/exec/obidos/ASIN/0201379260/
http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
http://www.amazon.com/exec/obidos/ASIN/0201924889/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
http://www.amazon.com/exec/obidos/ASIN/020163371X/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/0201615622/
http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/020170434X/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714833/ (翻訳)
Exceptional C++ Style
http://www.amazon.com/exec/obidos/ASIN/0201760428/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714663/ (翻訳)
0015デフォルトの名無しさん
2012/10/09(火) 20:00:57.50Effective STL
http://www.amazon.com/exec/obidos/ASIN/0201749629/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
http://www.amazon.com/exec/obidos/ASIN/0201704315/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
http://www.amazon.com/exec/obidos/ASIN/0321227255/
0016デフォルトの名無しさん
2012/10/09(火) 20:01:45.65[Boost]
Boost http://www.boost.org/
(日本語) http://www.kmonos.net/alang/boost/
(日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
SGI-STL http://www.sgi.com/tech/stl/
STLport http://stlport.sourceforge.net/
GNU libstdc++ http://gcc.gnu.org/libstdc++/
Apache C++ Standard Library (STDCXX) http://stdcxx.apache.org/
STLFilt http://www.bdsoft.com/tools/stlfilt.html
(日本語) http://episteme.wankuma.com/stlprog/ (※1999年発行注意)
[Loki]
http://sourceforge.net/projects/loki-lib/
LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
0017デフォルトの名無しさん
2012/10/09(火) 20:02:14.68STLつかうと一気に実行ファイルサイズが10倍に?!
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
------------------------------------------------------------------
一応テンプラ書きました
0018デフォルトの名無しさん
2012/10/09(火) 20:05:43.99http://cpplover.blogspot.jp/2011/05/initializerlist.html
こんなのがあるからだめだろうね
規格票にはどう書いてあるか探してみるけど
0019デフォルトの名無しさん
2012/10/09(火) 20:23:51.86ありがとうございます。
しっかし委員会の人たちは本当に偉いな・・・。
何年も前から知ってるけどこれからも頑張ってほしい。
0020デフォルトの名無しさん
2012/10/10(水) 10:57:08.46コンパイル時間を縮めるとあるのですが、どうにも理解出来なくて・・・
0021デフォルトの名無しさん
2012/10/10(水) 12:30:55.500022デフォルトの名無しさん
2012/10/10(水) 12:32:19.980023デフォルトの名無しさん
2012/10/10(水) 13:03:35.50Deep Copyにならない
インターフェース内に代入演算子関数やコピーコンストラクタを書くと正常に動作するがそうすると
中身を変更する度に代入演算子やコピーコンストラクタも変更しなければならないため
PImplの意味が失われてしまう
コピーしない場合に限りPImplを使うか、コピーするための特別なスマポを作る必要がある
0024デフォルトの名無しさん
2012/10/10(水) 15:01:13.98素人でも1時間あればそれなりのものは作れる
0025デフォルトの名無しさん
2012/10/10(水) 16:28:50.17動的にインスタンス生成することの
メリットが分かりません
教えて下さい
0026デフォルトの名無しさん
2012/10/10(水) 16:31:22.54ばーか^^
0027デフォルトの名無しさん
2012/10/10(水) 16:33:15.750028デフォルトの名無しさん
2012/10/10(水) 18:44:15.40メリットなんなない。
止めたほうがいい。
0029デフォルトの名無しさん
2012/10/10(水) 21:09:39.721. コンパイル時間を縮める
2. private メンバをヘッダから隠せる
これが pimpl の意義
通常は private メンバを変更しただけで
そのヘッダをインクルードしている全ての .cpp が再コンパイルされる
private メンバなんて外部から見えないのだから、これは非常に不合理だと言える
pimpl を使えば private な実装が全て1つの .cpp 内に収まるので
private な実装を変更する限りにおいては1つの .cpp が再コンパイルされるだけで済む
また、private な実装を他から隠匿出来るという点が
商業的に役に立つ場合がある
ただ、pimpl 以外にも似たような事を行う方法はある
まずインタフェースだけのクラスを作って、
そのクラスを継承して実装し、その派生クラスの生成関数だけを外部に公開する、というもの
両者は1, 2の目的を満たしているという点でよく似ているけど、
生成したメモリを管理する責任の所在が異なるというのと、
あとはここから更に継承したいという場合に違いが出てくる
0030デフォルトの名無しさん
2012/10/10(水) 22:47:52.39> 通常は private メンバを変更しただけで
> そのヘッダをインクルードしている全ての .cpp が再コンパイルされる
private関係ねえぞ。
お前の書くソースは汚そうだ。
0031デフォルトの名無しさん
2012/10/10(水) 22:50:08.830032デフォルトの名無しさん
2012/10/10(水) 22:50:59.05> 通常は private メンバを変更しただけで
> そのヘッダをインクルードしている全ての .cpp が再コンパイルされる
「再コンパイルされる」じゃねえぞ。
「しなければ問題が起きる」もしくは「実害の有無に関わらず、すべきである」のいずれかの問題だ。馬鹿が。
0033デフォルトの名無しさん
2012/10/10(水) 22:51:39.57ぽいんぽる
0034デフォルトの名無しさん
2012/10/10(水) 23:15:12.620035デフォルトの名無しさん
2012/10/10(水) 23:18:56.62ttp://www.nicovideo.jp/watch/sm758341
0036デフォルトの名無しさん
2012/10/10(水) 23:20:44.61http://translate.google.co.jp/#en/ja/pimpl
左の窓の下のスピーカーのアイコンクリックしてみ
0037デフォルトの名無しさん
2012/10/10(水) 23:29:03.82まともなプログラマなら「通常は」依存関係を元に
自動的に再コンパイルされるような環境でプログラムするので
「通常は」再コンパイルされる
理論的に再コンパイルしなくても実害がない場合もそりゃあるが(メンバ関数だけ増やした時とか)、
それでもまともな環境でプログラムしてりゃ通常は再コンパイルされる
0038デフォルトの名無しさん
2012/10/10(水) 23:30:37.25普通に匿名名前空間に関数おけばいいだろ
0039デフォルトの名無しさん
2012/10/10(水) 23:54:08.100040デフォルトの名無しさん
2012/10/11(木) 00:05:14.51こいつ最高にアホ
0041デフォルトの名無しさん
2012/10/11(木) 00:06:51.78正直プログラムが読み辛くなるだけだぞ
0042デフォルトの名無しさん
2012/10/11(木) 00:13:16.08いっぺんやってみればわかるけど関数にしたほうがわかりやすい
引数で副作用を絞れるからバグも減るから良いことしかない
0043デフォルトの名無しさん
2012/10/11(木) 00:38:45.61再コンパイルされるなら何も問題ないんじゃない?
0044デフォルトの名無しさん
2012/10/11(木) 01:49:11.69・生成するインスタンスの数を実行時に決定できる
・インスタンスの寿命をより自由に制御できる
0045デフォルトの名無しさん
2012/10/11(木) 06:49:02.390046デフォルトの名無しさん
2012/10/11(木) 06:51:22.72それは確かに問題だろうが、
今の論点とは関係ないだろ
0047デフォルトの名無しさん
2012/10/11(木) 07:31:15.33時間がかかる
0048デフォルトの名無しさん
2012/10/11(木) 07:31:55.62そんな変なプログラムは他の人が保守し辛い
0049デフォルトの名無しさん
2012/10/11(木) 08:44:31.29そういう実装を好む会社と仕事をしたことがあるが、
完全に C の思想になっていると感じた
0050デフォルトの名無しさん
2012/10/11(木) 09:50:35.030051デフォルトの名無しさん
2012/10/11(木) 09:52:55.22確かに
Cはもう時代遅れになりかけている
それにもかかわらず高いシェアを未だに誇っているというのはCOBOLと同じで
老害が多いって事
0052デフォルトの名無しさん
2012/10/11(木) 10:59:55.010053デフォルトの名無しさん
2012/10/11(木) 11:04:36.120054デフォルトの名無しさん
2012/10/11(木) 12:05:59.720055デフォルトの名無しさん
2012/10/11(木) 12:40:29.28Cでなきゃ何でファームウエアやドライバを書くんだ
方言は当然ありとして
おまえら結局ファームエアもドライバも作りたくないって
仕事をえり好みしてるだけだろ
若いのがそんなていたらくであることが
今の製造業のピンチを招いたんだよ
0056デフォルトの名無しさん
2012/10/11(木) 12:41:42.58典型的な老害思考
C++で書いてもCと同じように書けば問題ない
0057デフォルトの名無しさん
2012/10/11(木) 12:46:16.410058デフォルトの名無しさん
2012/10/11(木) 12:47:31.060059デフォルトの名無しさん
2012/10/11(木) 12:49:38.71Cの機能だけを使えばならねーよアホ
使った事ねーんだな
0060デフォルトの名無しさん
2012/10/11(木) 12:51:40.95かぶりものは?
0061デフォルトの名無しさん
2012/10/11(木) 13:32:56.35方言はありだと言っただろう
Cの流れを汲む言語をすべて含むという意味だ
おまえせいぜい片手できくくらいしか知らねえだろ
それから C++ の C にない機能をふんだんに使っても
ヘボがバカやらない限り問題なんか起きねえよ
要注意は例外と RTTI くらいだがコンパイラのマニュアルをよく読むこった
0062デフォルトの名無しさん
2012/10/11(木) 13:34:57.28それ論理的におかしなことになってるだろ
0063デフォルトの名無しさん
2012/10/11(木) 13:39:10.13>>51 「確かに (C++と違って)Cはもう時代遅れになりかけている」「それにもかかわらず高いシェアを未だに誇っているというのはCOBOLと同じで老害が多いって事」
>>55 「Cでなきゃ何でファームウエアやドライバを書くんだ 方言は当然ありとして 」
>>56 「典型的な老害思考 C++で書いてもCと同じように書けば問題ない 」
>>61 「方言はありだと言っただろう Cの流れを汲む言語をすべて含むという意味だ (ゆえにC++はCに含む)」
0064デフォルトの名無しさん
2012/10/11(木) 13:40:15.170065デフォルトの名無しさん
2012/10/11(木) 13:54:37.24つまりアレか
C++ 独自の機能が C の何に相当するか見通せてないんだな
クロージャや intializer_list がおまえにとっては魔法の箱か
0066デフォルトの名無しさん
2012/10/11(木) 14:03:46.17何そのちぐはぐな反応は
0067デフォルトの名無しさん
2012/10/11(木) 14:10:56.72何だその荒唐無稽な反応は
0068デフォルトの名無しさん
2012/10/11(木) 18:45:59.59何だその焼肉定食な反応は
0069デフォルトの名無しさん
2012/10/11(木) 20:14:59.88C++で書くと大きくなる妄想乙
0070デフォルトの名無しさん
2012/10/11(木) 20:55:56.430071デフォルトの名無しさん
2012/10/11(木) 20:56:27.980072デフォルトの名無しさん
2012/10/11(木) 20:57:45.950073デフォルトの名無しさん
2012/10/11(木) 21:00:51.40VCやgccはiostreamや例外を使わないとほとんど同じになっちゃうぞ
0074デフォルトの名無しさん
2012/10/11(木) 21:08:36.000075デフォルトの名無しさん
2012/10/11(木) 22:24:39.39IOstreamはライブラリとかじゃなく
別言語に移管し改めてitegrateすべき時期に来たと思うんだ
0076デフォルトの名無しさん
2012/10/11(木) 22:27:23.160077デフォルトの名無しさん
2012/10/12(金) 00:00:08.10そりゃSTLをたっぷり使うとか、大きくなるような書き方をしてるだけだ
0078デフォルトの名無しさん
2012/10/12(金) 01:20:31.64その程度で保守できなくなるなんてよほどの低脳なんだなぁ
class Type {
OtherType m;
void PrivateFunc();
public:
void Method();
};
void Type::PrivateFunc() { m.DoSomething(); }
void Type::Method() { PrivateFunc(); }
これを
class Type {
OtherType m;
public: void Method();
};
static void PrivateFunc(OtherType & m) { m.DoSomething(); }
void Type::Method() { PrivateFunc(m); }
こうすればコンパイルコストの削減、不要なメンバアクセスによる副作用の予防といった明らかなメリットがデメリットなしに見込める
たったそれだけの話なのに何がそんなに難しいんだろうか?
低IQの脳みそって本当にかわいそうだわ
0079デフォルトの名無しさん
2012/10/12(金) 01:44:36.84コンパイルコストごときを理由にそういう設計が振り回されるか
0080デフォルトの名無しさん
2012/10/12(金) 01:46:46.23逆に聞くがこれを否定する論理的な理由は?
0081デフォルトの名無しさん
2012/10/12(金) 01:47:18.00OtherType m;
public: void Method() { m.DoSomething(); }
};
これでいい
0082デフォルトの名無しさん
2012/10/12(金) 01:48:53.40privateメソッドの仕様はクラスの仕様と不可分
クラス外で定義するのは危ないよな
0083デフォルトの名無しさん
2012/10/12(金) 01:50:30.01あなたの言ってるメリットは、実装以降どころかコンパイル以降の話。
それらの都合のためにオブジェクト指向を否定するかのごとく設計に犠牲を強いているようだ。
0084デフォルトの名無しさん
2012/10/12(金) 01:56:45.12危ないって?
匿名関数のどこが危ないの?
0085デフォルトの名無しさん
2012/10/12(金) 01:58:13.95C++はもともと純粋なオブジェクト指向言語じゃないですよ?
あなたのほうこそ自分の勝手な都合でC++の能力を犠牲にしていませんか?
0086デフォルトの名無しさん
2012/10/12(金) 02:17:04.10> static void PrivateFunc(OtherType & m) { m.DoSomething(); }
これが綺麗に見えるのは幻覚。
使っているprivateメンバー変数がたった一個だから。
このメンバーも使おう。さらにこれも、と追加していったとき、
privateの範囲内で当該クラスに閉じた世界の話になるはずなのに、
そのやり方していたら、そのクラスとクラス外の様々なstatic関数に広く影響を与えることになる。
そんな作り方してると内部仕様の変更に対する隠れた抵抗勢力になる。
そういうのでがんじがらめにしておくと、悪い方への変化はしやすいけど、良い方への変化はしにくくなる。
それは誰かを陥れるために使う戦略で、日常は使うな。
0087デフォルトの名無しさん
2012/10/12(金) 02:19:03.43君はその道を突き進めばいいと思うよ
俺はついていかないけど
でもそっちの世界の人達も頑張って欲しい
0088デフォルトの名無しさん
2012/10/12(金) 03:59:30.89ねえ君はアホなの?
短いレスでサンプルを示すためにあえて十分小さい例を出しただけなのに、それに噛み付いてくるなんて言葉遊び覚えたばかりの中学生みたいな反応で笑えるね
メンバーが増えれば増えるほど匿名関数のほうが有利になるんだけど?
増えたメンバーのうちその処理にひつようなメンバのみにアクセスを絞ることができるから
メンバ関数を直接書くより遥かに信頼性、安全性が高い
馬鹿はメンバ関数そのまま書いて無秩序にメンバにアクセスし整合性を保つ難易度を上げている
というかそもそも君はなにか勘違いしてるだろ
この匿名関数はそのクラスのプライベートメンバとして作られるのだから
クラスの内部仕様の変更でこの匿名関数に変更があってもクラスの外部には1バイトも影響しないんだが?
まずそこから理解することからはじめよう
なにごとも最初の一歩が肝心だよ
君は初心者かもしれないけどそこはちゃんと押さえておこう。いいね?
0089デフォルトの名無しさん
2012/10/12(金) 05:57:25.74ひとまとめにしてなんかの意味を持たせようというところにクラスの意義があり、それはprivateなメソッド(メンバ関数)とて同じことなのだが、
それをわざわざstaticな関数にばらし、クラスのメンバ変数の形にばらし、と要素にくだり細部フォーカスとするのは、それではなんのためのクラスか首をかしげるのだが?
privateなメソッドであっても、そのクラスがクラスの形を保っていることに意味があるんでは?
それともprivateな処理は、クラスというまとまりをばらしてしまうことの方がおおいのか?
static な関数の引数に、クラスのメンバ関数がずらずら並ぶのは、アクセスを明示する意味ではいいのだが、他にメリットがみえてこない
むしろ「まとまり」を欠いた散漫なコードにみえる
0090デフォルトの名無しさん
2012/10/12(金) 14:27:48.590091デフォルトの名無しさん
2012/10/12(金) 14:32:17.15それでコンパイルコスト削減になってると思うのがチャンチャラおかしい
0092デフォルトの名無しさん
2012/10/12(金) 20:14:50.53もう大人しくCでプログラム組んでろ
0093デフォルトの名無しさん
2012/10/12(金) 20:44:04.42コンパイラの性能、強い型、程よい暗黙の変換などがなければ、困難なデバッグを諦めていたことでしょう。
Javascriptのデバッグとか考えただけで身の毛もよだつ・・・
0094デフォルトの名無しさん
2012/10/12(金) 20:52:14.91struct A {
void func1();
void func2();
};
みたいなのがあったときに、単純にそれぞれにかかった合計時間が計測できればいいのですが・・・
0095デフォルトの名無しさん
2012/10/12(金) 20:53:55.170096デフォルトの名無しさん
2012/10/12(金) 22:12:35.95典型的なCに染まった老害だろ
たまに現場にいるけどここ十数年ほどは干され傾向だろ
0097デフォルトの名無しさん
2012/10/13(土) 00:13:31.87教科書を開いてクラスをもういちど勉強したほうがいいよ
クラスの重要チェックポイントをいくつかあげるとすると
・公開されたプロパティと処理の一箇所への集中
・カプセル化による詳細の隠蔽
・継承とポリモーフィズム
なんだよね
要するに非公開であるべきクラスの実装の詳細がどうなってるのかなんてものはクラスの概念にはまったく必要ない話なんだよ
privateなメンバ関数であろうが外部の匿名関数だろうがその選択によってクラスとして正しいか正しくないかなんてのは変わらないんだ
だとしたらこの部分は純粋にその機能としての優位性で選ぶのが正しいIT技術者のあるべき姿だろう
君もここで、またひとつ勉強になったね
第二段落の質問への答えだが、プライベートな処理はまとまりをばらすことが非常に多いよ
それは当然だろう。クラスの公開機能を実装するためのサブ処理をメンバ関数や匿名関数で行うのだから
それがクラスの一部分だけを処理するのは当然の話だ
それと、君は『むしろ「まとまり」を欠いた散漫なコード』にみえるというが
目に見えないだけで不要な変数にも平気でアクセスでき、副作用を生み出しかねない状況のほうが
遥かにまとまりの無い不安定な状況であるということを自覚しようね
おそらくだが、君はいまだに、コードの「見た目」が気に入らないだけでその機能的な部分に美意識を持っていないように見受けられる
それは識別子を並べたときに不ぞろいだ、汚い、と感じ無駄なスペースやタブでこぎれいに並べようとする無意味で低俗な美意識と同じことだよ
そういうのは素人から中級者にありがちなことなのだが、しっかりと勉強し成長すればコードの見た目より機能的な合理性と美しさというものを理解し優先するようになる
君は今はまだその段階に無いが君もいずれ理解できるだろうから心配しなくてもいい
>>91
君のプロジェクトにある適当な良く使われているクラスをピックアップし
�@新しいプライベートメンバ関数をヘッダに追加し、cppに実装を書く
�A新しい匿名関数をcppに書く
場合に分けてリビルドしたときのコンパイルコストを実測してみなさい
それで判らないなら君は時計を見る能力を持っていないことになるので病院で診断を受けることをお勧めする
0098デフォルトの名無しさん
2012/10/13(土) 00:28:49.55だらだらと長くて美しくない文章を書く人ですね
0099デフォルトの名無しさん
2012/10/13(土) 00:31:02.54みんなこっち行こうず
IDあるほうがまだマシ
0100デフォルトの名無しさん
2012/10/13(土) 00:34:45.81ここにコードやアイデア書くと運営にパクられるよ
0101デフォルトの名無しさん
2012/10/13(土) 00:37:58.72参照する可能性のあるすべての private なメンバ変数を引数として渡すの?
ちょうど最近、private な関数をヘッダに書かなくてもいい方法ないかなーって思ってたところなんで参考にしたい
メンバ変数が多くなったら大変そうに見える
また、その匿名関数から見ると、
渡された引数がメンバ変数かどうかが分からないから見難くなりそう。どのあたりどうなんだろう。
public なメンバ変数は this を渡してアクセス、private なメンバ変数は個別で引数として…
それならもう全部引数で渡すことにして、this を渡す必要なくね?ってなってまた迷いそう
0102デフォルトの名無しさん
2012/10/13(土) 00:41:19.790103デフォルトの名無しさん
2012/10/13(土) 01:30:43.65なんか難しく考えすぎてないか?
普通にいつも通りに関数を書くだけだぞ?
違いは匿名か否かってだけ
0104デフォルトの名無しさん
2012/10/13(土) 03:27:48.70COMインターフェイス的な
抽象クラス使った方がいいんじゃないの?
0105デフォルトの名無しさん
2012/10/13(土) 08:31:40.73その関数の中でprotectedメンバは呼べないがな
010689
2012/10/13(土) 10:38:41.06すでに手元に一定のクラスライブラリがあって、それを上位クラスに組み込むとき、もともとあったクラスを全部書き直すの?
すべてのアプリケーションを一からフルスクラッチで書き起こすやりかたなの?
0107デフォルトの名無しさん
2012/10/13(土) 10:49:42.620108デフォルトの名無しさん
2012/10/13(土) 11:25:10.64と
map<K,V>::emplace
の違いが分かりません。
後者はどういうときに優位性を発揮するのでしょうか?
0109デフォルトの名無しさん
2012/10/13(土) 11:39:22.570110デフォルトの名無しさん
2012/10/13(土) 11:44:48.70文字通りemplaceしたいときに優位性を発揮するんだよ
emplaceの意味わかる?辞書で調べた?話はそこからだよ
0111デフォルトの名無しさん
2012/10/13(土) 11:52:50.51emplace=設置する
insert=挿入する
・・・違いがわからん(汗
0112デフォルトの名無しさん
2012/10/13(土) 12:00:38.64設置したいときに挿入したら違うことしてることになるだろ
お前は尻コキしたいときに膣に入れるのか?
ちんちんを尻の上に設置するのとちんちんを挿入することの区別もつかないのか?
いやはやまったく、最近の若者の言語感覚の欠落はまことに嘆かわしいことだな
0113デフォルトの名無しさん
2012/10/13(土) 12:08:57.16だからinsertしか使ったことなかった。
emplaceで要素があったらどうなるのですか?
要素がないときに効率良くなるのですか?
0114デフォルトの名無しさん
2012/10/13(土) 12:21:34.45std::map<std::string, int> m;
m.insert(std::make_pair("1", 2)); // pairの作成/コピー(ムーブ)/破棄が発生
m.emplace("1", 2); // emplaceの中で直接mapが保持するオブジェクトを作る
簡潔でパフォーマンス的にもよろしい?
0115デフォルトの名無しさん
2012/10/13(土) 12:25:22.81C++11ならinsertでもムーブが呼ばれて、パフォーマンスにほとんど違いがなさそうなんだけど・・・
0116デフォルトの名無しさん
2012/10/13(土) 12:45:04.480117デフォルトの名無しさん
2012/10/13(土) 13:38:49.020118デフォルトの名無しさん
2012/10/13(土) 13:47:40.020119デフォルトの名無しさん
2012/10/13(土) 13:48:07.56メンバが多いと、それなりに差は出た。
0120デフォルトの名無しさん
2012/10/13(土) 13:50:18.590121デフォルトの名無しさん
2012/10/13(土) 13:52:13.900122デフォルトの名無しさん
2012/10/13(土) 13:59:17.17struct Interface { virtual int & Value() = 0; };
こういうことはできないこともないんだけどC#でブイブイ言わせてる身としては
どうしてもobj.Value() = 100;の()が美的感覚にかなわなくて許せないわけ
0123デフォルトの名無しさん
2012/10/13(土) 14:13:02.820124デフォルトの名無しさん
2012/10/13(土) 14:42:17.71ttp://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.8.2.html にあげられているのと同じところを目指すのかい?
0125デフォルトの名無しさん
2012/10/13(土) 14:51:18.38特に計測して下さった方、助かりました。
0126デフォルトの名無しさん
2012/10/13(土) 14:57:55.11>>97
0127デフォルトの名無しさん
2012/10/13(土) 15:13:19.31美的感覚以前に
参照を返せる場合しか使えないぞそれ
setter を呼ぶクラスを返す手もあるけど
0128デフォルトの名無しさん
2012/10/13(土) 15:42:52.28duration_cast<seconds>(sec).count()
が返す型がドキュメントを見ると
constexpr rep count() const;
となっているのですが、これがstd::chrono::repというわけではないようです。
どういう意味ですか?
また、上のコードでdurationのcount()をするとただの整数になってしまうのですが、
"6.532 sec elapsed"みたいに結果を小数で表示したいとき
「millisecondsで取得してcountして1000.0で割る」みたいなことを手でやる必要があるのでしょうか?
0129デフォルトの名無しさん
2012/10/13(土) 15:58:58.76auto s = duration_cast<seconds>(sec).count();
をauto使わず明示的に型を書きたいです。どう書くのが正解ですか?
0130デフォルトの名無しさん
2012/10/13(土) 16:11:23.840131デフォルトの名無しさん
2012/10/13(土) 16:18:23.27なるほど。考える前にやってみるべきでした。
しかしrepってどういう意味だったんだ・・・?
0132デフォルトの名無しさん
2012/10/13(土) 17:35:01.19> しかしrepってどういう意味だったんだ・・・?
representation(表現)、durationクラスの中で値を保持する型(値をrep型で表現する)。
durationの中の話だからstd::chrono::seconds::repとかで取得する。
repが実数型だったら1.5秒とか表現できるようになる。
0133デフォルトの名無しさん
2012/10/14(日) 10:54:22.50list<ABC*> ABCList;
ABC abc;
ABCList.push_back(abc);
ってあったときに
ABCList.erase(abc);
ってすれば消えてくれるし、詰めてくれる??
0134デフォルトの名無しさん
2012/10/14(日) 10:57:15.57コンパイルしてみ
多分エラー出るから
0135デフォルトの名無しさん
2012/10/14(日) 10:57:44.640136デフォルトの名無しさん
2012/10/14(日) 11:01:16.95あ、些細なタイポなら気にしないよ
ただ、そのコードだと何が聞きたいのかポイントが判断できないんだ
0137デフォルトの名無しさん
2012/10/14(日) 11:02:50.800138デフォルトの名無しさん
2012/10/14(日) 11:04:23.96せめて
ABCList.push_back(&abc);
だろ
こういう用途にはboost::ptr_listを使わないとデストラクタ呼んでくれないぞ
既存のオブジェクトを渡した時はいいのかもしれないけどどちらにしろ後始末は
自分でしなければならない
ABCList.push_back(new ABC);
みたいな場合は確実にメモリリークを起こす
それかshared_ptrで包めばいいな
0139デフォルトの名無しさん
2012/10/14(日) 11:04:33.24えーと、listの中間の要素を削除したい
あとポインタだったからこうでした
ABCList.push_back(&abc);
0140デフォルトの名無しさん
2012/10/14(日) 11:05:34.340141デフォルトの名無しさん
2012/10/14(日) 11:06:58.37であれば、問題ないよ
0142デフォルトの名無しさん
2012/10/14(日) 11:08:03.91ポインタ先を保持してるコンテナやポインタ変数が他に存在しないのなら、メモリリーク起こしてるぞ
よく考えてみ
0143デフォルトの名無しさん
2012/10/14(日) 11:10:34.62今はリストから削除されるかどうかを聞いてるだけ
0144デフォルトの名無しさん
2012/10/14(日) 11:11:13.82大丈夫そうです。
ありがとうございました。
0145デフォルトの名無しさん
2012/10/14(日) 11:12:11.66していない
しかしその後erase()したらメモリリークしてる
eraseする前に自分でデストラクタを呼び出してその後deleteするのなら分かるけど
悪い事は言わないからboost::ptr_list使っとけ
0146デフォルトの名無しさん
2012/10/14(日) 11:14:45.970147デフォルトの名無しさん
2012/10/14(日) 11:15:58.54std::list::remove?
0148デフォルトの名無しさん
2012/10/14(日) 11:20:59.050149デフォルトの名無しさん
2012/10/14(日) 11:22:21.460150デフォルトの名無しさん
2012/10/14(日) 11:22:31.120151デフォルトの名無しさん
2012/10/14(日) 11:23:40.98これは多分splice()何かを内部的に使ってstd::remove()より効率的に削除するメンバ関数だろう
しかしポインタをコンテナに入れる時はいつも気をつけろよ
0152デフォルトの名無しさん
2012/10/14(日) 11:24:23.47お前の理解レベルが低いだけ
そこは論点じゃない
0153デフォルトの名無しさん
2012/10/14(日) 11:25:25.030154デフォルトの名無しさん
2012/10/14(日) 11:26:35.86小さいサンプルでリークを起こす奴はそのまま大きなプログラムでもリークを起こす
0155デフォルトの名無しさん
2012/10/14(日) 11:27:06.750156デフォルトの名無しさん
2012/10/14(日) 11:28:24.320157デフォルトの名無しさん
2012/10/14(日) 11:29:41.420158デフォルトの名無しさん
2012/10/14(日) 11:30:32.140159デフォルトの名無しさん
2012/10/14(日) 11:31:21.58意思疎通・協調すればバグ出してもいいってか?アホかお前
0160デフォルトの名無しさん
2012/10/14(日) 11:31:36.42>>148 は、単にメモリリークしか突っ込めない奴がそこは議論の対象外と指摘されて、
ムキーってなってるだけでしょ。
0161デフォルトの名無しさん
2012/10/14(日) 11:33:15.13意思疎通・協調できるやつは、指摘すればバグ直してくれるし、
そのうちバグも出さなくなるから。
0162デフォルトの名無しさん
2012/10/14(日) 11:33:19.60そうだよ
意思疎通できるやつなら先輩が指導して修正できる
お前みたいな屑は修正効かないから使い物にならない
だから最近の企業は面接でそういうカスをはじいてるんだけど知らなかった?
就職するときは苦労するよお前さんいまから覚悟したほうがいい
0163デフォルトの名無しさん
2012/10/14(日) 11:33:23.13一応newは別の場所でやって別の場所で保管して、その場所からlistにポインタだけpush_backしてます。
これをremoveするとメモリリークになりますか?
0164デフォルトの名無しさん
2012/10/14(日) 11:33:30.600165デフォルトの名無しさん
2012/10/14(日) 11:34:27.66newしたオブジェクトを指すポインタを他の場所で保存していればおk
0166デフォルトの名無しさん
2012/10/14(日) 11:35:25.56こういう「屑」とか「カス」って言葉を多用する奴は自分自身が「屑」であり「カス」だと
全く気づいてないんだよなあ
0167デフォルトの名無しさん
2012/10/14(日) 11:36:40.43そこからすでにズレてんだよなお前
リークしてるのなんてみんなわかってるけど、質問者の意図・論点に集中してしゃべってんの
お前はこんな簡単なことも判らないからコミュ障の屑って呼ばれてるんだけど自覚したほうがいいよ
0168デフォルトの名無しさん
2012/10/14(日) 11:37:01.13>>165
ありがとうございます。
0169デフォルトの名無しさん
2012/10/14(日) 11:37:29.78お前もクズだな
よくわかった
0170デフォルトの名無しさん
2012/10/14(日) 11:37:34.84え!?
0171デフォルトの名無しさん
2012/10/14(日) 11:39:40.68どうも最近この板おかしい
0172デフォルトの名無しさん
2012/10/14(日) 11:40:09.71shared_ptrを使わないやつは最底辺のゴミ
0173デフォルトの名無しさん
2012/10/14(日) 11:41:13.90気にしない、気にしない
いつもの事だから
0174デフォルトの名無しさん
2012/10/14(日) 11:41:43.01そうやって人の手を煩わしているわけですね
分かりやすいなあ
お前多分会社の重荷になってるよ
リストラ候補に入れられてるな
0175デフォルトの名無しさん
2012/10/14(日) 11:43:38.79煩わせる?
笑わせんな教育は仕事していくうちでもっとも重要なファクターだ
そこをわずらわしいとかめんどくさがってる会社に未来は無いよ
ようするにおまえの未来もないってことな
0176デフォルトの名無しさん
2012/10/14(日) 11:53:34.110177デフォルトの名無しさん
2012/10/14(日) 11:54:06.47オブジェクトの管理は別の場所でやってて
そこへの参照をstd::listに適宜入れて使いたいって話なのに
なんでstd::listでメモリ管理するという話になってんだよ
0178デフォルトの名無しさん
2012/10/14(日) 11:55:11.14「素直に質問に答えるだけでいいんだよハゲ」派が対立してるな……
0179デフォルトの名無しさん
2012/10/14(日) 11:55:16.31おまえさあ、ニートの癖によく言うよ
何が最も重要なファクターだよ
>>177
それは後出しじゃんけんで出てきた情報だろうが
最初は書いてなかったぞ
0180デフォルトの名無しさん
2012/10/14(日) 11:56:01.73要素の追加にnew使ってなかっただろwww
何見てんだよ
0181デフォルトの名無しさん
2012/10/14(日) 11:56:41.75簡単にまとめるとそういう事だな
「質問に答えるだけでいいんだよ」派が「おいそれリーク起こしてるぞ」派を
必要以上の汚い言葉で罵倒してるだけ
こいつらの方がよほどコミュ障なのに気づいてない構図
0182デフォルトの名無しさん
2012/10/14(日) 11:58:14.36>>133はそもそもリークなんて起こしてないだろ
newしてないんだから
>>138が勝手にnewしてリーク起こすって騒いでるだけ
0183デフォルトの名無しさん
2012/10/14(日) 11:58:18.76ああいうコードが単なるサンプルである事にも気付けないのか?
実際後からnewしてる情報が出てきただろ
0184デフォルトの名無しさん
2012/10/14(日) 11:58:21.61最初はnewしてメモリ確保してないけど…
0185デフォルトの名無しさん
2012/10/14(日) 11:58:48.14その情報と同時に別な所でメモリ管理してるって言ってるじゃんw
0186デフォルトの名無しさん
2012/10/14(日) 11:59:02.720187デフォルトの名無しさん
2012/10/14(日) 11:59:39.95お前頭悪すぎる
何を話してもワンテンポずれて遅れてる
0188デフォルトの名無しさん
2012/10/14(日) 12:00:40.850189デフォルトの名無しさん
2012/10/14(日) 12:01:52.90俺はいつもそうだが
突然噛み付かれたので応酬しただけだ
なんなのこいつら
絶対社会人じゃないだろ
0190デフォルトの名無しさん
2012/10/14(日) 12:04:31.75スタックかメンバ変数で確保した形のサンプルに対して
boost::ptr_listを使わないとデストラクタ呼んでくれないぞと言っちゃう人は
さぞかし頭がいいんでちゅね
0191デフォルトの名無しさん
2012/10/14(日) 12:06:05.41おいいい加減に話の流れに付いてこいよ
粘着
0192デフォルトの名無しさん
2012/10/14(日) 12:06:53.25>何を話してもワンテンポずれて遅れてる
初めからあさっての方向の奴よりマシ (w
>>189
底辺ドカタだろ
0193デフォルトの名無しさん
2012/10/14(日) 12:08:46.66あさってじゃないんだが
いつもこういう場面でリークを後から起こすのを経験で知ってんだよ
後からポインタを保存してるって話が出てきたからそれは解決したけどな
ドカタ?お前スレ乱立荒らししてたap.seikyou.ne.jpの大学生だろ?
就職決まらなくて他人に当たり散らすな
0194デフォルトの名無しさん
2012/10/14(日) 12:10:10.65ポイントポイントで燃料投下派もいるけど、何か?
0195デフォルトの名無しさん
2012/10/14(日) 12:11:03.720196デフォルトの名無しさん
2012/10/14(日) 12:11:54.92こいつが荒らしてた犯人か
0197デフォルトの名無しさん
2012/10/14(日) 12:13:20.31分かりやす過ぎる
ワンパターンなんだよお前
0198デフォルトの名無しさん
2012/10/14(日) 12:14:27.270199デフォルトの名無しさん
2012/10/14(日) 12:15:23.93スレ立てるまでもない質問はここで 121匹目
http://toro.2ch.net/test/read.cgi/tech/1346177196/
643 名前:デフォルトの名無しさん[sage] 投稿日:2012/10/14(日) 12:10:09.68
馬鹿には無理
こんな所まで当たり散らすなよ
お前社会に出れないわ
確信した
どうせそのうち凶悪犯罪でも起こすんだろうな
0200デフォルトの名無しさん
2012/10/14(日) 12:20:29.70プログラマってそんなストレスたまんの?
0201デフォルトの名無しさん
2012/10/14(日) 12:39:22.77> いつもこういう場面でリークを後から起こすのを経験で知ってんだよ
それを自分しか知らないと思い込んでるところが、あさってなんだよ (w
0202デフォルトの名無しさん
2012/10/14(日) 12:40:39.32その原因のすべてはお前自身にあるんで
0203デフォルトの名無しさん
2012/10/14(日) 12:44:20.38ま、shared_ptrを使う(ABCListの要素もABCのshared_ptrにする)のが一般的にbetter
ただしもちろんナマポよりは速度性能とかメモリ消費とかが劣化するから、
(特にマルチスレッド対応版shared_ptrは遅い恐れが大きい
それがボトルネックになるようなら、>133のコードでありかつ
オブジェクトの生成破棄を別のコンテナで管理する、とするのは十分有り得る
0204デフォルトの名無しさん
2012/10/14(日) 12:52:57.31デストラだけ呼んだ後領域全体を一気に開放するとか、
そもそもデストラが要らない型にしていきなり領域全体を一気に開放するとか、
そういうアロケータ/デアロケータを設けることも分野によってはわりと普通
0205デフォルトの名無しさん
2012/10/14(日) 12:55:20.570206デフォルトの名無しさん
2012/10/14(日) 13:07:02.03誰も言っていない就職をいきなり持ち出すところ見ると、相当苦労したんだな、可愛そうに。
同情してやるよ (w
0207デフォルトの名無しさん
2012/10/14(日) 13:10:04.75半月ぐらいで大手メーカー決まったしさすがにNNTはもういないでしょ
0208デフォルトの名無しさん
2012/10/14(日) 19:05:29.02○解放
0209デフォルトの名無しさん
2012/10/14(日) 20:57:48.47なんで大学生が荒らす必要あんの?
0210デフォルトの名無しさん
2012/10/14(日) 21:51:39.80そこにコミュニティがあるからだ
0211デフォルトの名無しさん
2012/10/14(日) 21:59:19.480212デフォルトの名無しさん
2012/10/14(日) 22:00:28.00彼らに社会人の常識は通用しない。そもそも休日が週3日以上あってもおかしく無い生き物と職業プログラマが理解しあえるはずが無い
0213デフォルトの名無しさん
2012/10/14(日) 22:41:36.12深夜も灯りの絶えない、労働基準法が適用されない世界。
0214デフォルトの名無しさん
2012/10/14(日) 22:44:50.56人に迷惑を掛ける大学生は生きてる価値ないよ
0215デフォルトの名無しさん
2012/10/14(日) 22:46:03.54大学生はまだ未来があり価値がある可能性を持っている
だがプログラマに未来は無くあるのは暗闇だけだ
本当に生きている価値がないのはどちらだ
0216デフォルトの名無しさん
2012/10/14(日) 22:48:41.410217デフォルトの名無しさん
2012/10/14(日) 23:17:53.52犯罪者になって牢屋に入る未来だろが
0218デフォルトの名無しさん
2012/10/14(日) 23:22:07.37この現実を君たちは幾度と無く見てきたはずだ
私も同じ立場の人間として君たちの悔しさは理解できる
だが世の中というものは不条理と理不尽の巨大な塊なのだ
0219デフォルトの名無しさん
2012/10/14(日) 23:24:16.32実際、いいヤツは苦労するし、早死にしそうだよな
0220デフォルトの名無しさん
2012/10/14(日) 23:30:40.28http://merckmanual.jp/mmhe2j/sec07/ch105/ch105a.html
>反社会性人格の人は、アルコール依存、薬物依存、性的に逸脱した行動、乱交、投獄
>といった問題を起こしやすい傾向があります。仕事に失敗しがちで、住居を転々と変える
>ケースもよくみられます。多くの場合、反社会的な行動、薬物などの乱用、離婚、肉体的
>虐待などの家族歴があり、小児期に情操面での養育放棄(ネグレクト)や虐待を経験して
>いることもあります。反社会性人格の人は一般の人に比べて寿命が短い傾向があります。
こういうわけだ
0221デフォルトの名無しさん
2012/10/14(日) 23:59:11.290222デフォルトの名無しさん
2012/10/15(月) 00:02:46.66激しく同意
0223デフォルトの名無しさん
2012/10/15(月) 00:24:08.29宅間守とか酒鬼薔薇聖斗とか加藤智大が性格良いとでも?
0224デフォルトの名無しさん
2012/10/15(月) 00:59:51.650225デフォルトの名無しさん
2012/10/15(月) 01:04:06.050226デフォルトの名無しさん
2012/10/15(月) 01:04:25.890227デフォルトの名無しさん
2012/10/15(月) 01:07:20.94お前は社会を知らなすぎ
0228デフォルトの名無しさん
2012/10/15(月) 01:22:11.55失格
0229デフォルトの名無しさん
2012/10/15(月) 01:35:54.93自分の事が分かってないようだなuy
0230デフォルトの名無しさん
2012/10/15(月) 04:43:17.74評価者の「自分がどうであるか」が関係するのか?
0231デフォルトの名無しさん
2012/10/15(月) 04:44:18.68本当に「性格が悪い人は全て反社会性パーソナリティ障害である」と思ってるの?
0232デフォルトの名無しさん
2012/10/15(月) 05:11:27.38狂ってる奴の評価はデタラメであてにならない
>>231
それを書いたのは俺じゃないな
反社会性パーソナリティ障害→性格が悪い→犯罪者
は間違いないが
性格が悪い→反社会性パーソナリティ障害
とは限らない
他にも
自己愛性パーソナリティ障害
境界性パーソナリティ障害
妄想性パーソナリティ障害
精神病質パーソナリティ障害
といろいろある
0233デフォルトの名無しさん
2012/10/15(月) 05:57:58.89> それを書いたのは俺じゃないな
じゃあお前は関係ない。
「必要十分条件」などとほざく馬鹿に質問している。
0234デフォルトの名無しさん
2012/10/15(月) 06:01:28.91性格悪い=反社会性パーソナリティ障害=狂っている=そいつの評論はデタラメ
0235デフォルトの名無しさん
2012/10/15(月) 07:30:46.68邪魔だかどっちももどっかいけ
0236デフォルトの名無しさん
2012/10/15(月) 08:38:25.600237デフォルトの名無しさん
2012/10/15(月) 09:03:50.82全然まとまってないなw
Qは自己愛性パーソナリティ障害で、Qが嫌われ者という事実は変わらない
0239デフォルトの名無しさん
2012/10/15(月) 14:12:24.66必要十分条件ということは
反社会性パーソナリティ障害→性格が悪い
性格が悪い→反社会性パーソナリティ障害
の両方が成り立つということか
0240デフォルトの名無しさん
2012/10/16(火) 11:28:56.17そういうときは確率的必要十分条件が成り立つ。
0241デフォルトの名無しさん
2012/10/16(火) 11:55:14.37クズの戯言に付き合うな
0242デフォルトの名無しさん
2012/10/16(火) 22:54:18.84アールグレイ、ホットで。
0243デフォルトの名無しさん
2012/10/17(水) 20:58:24.82struct B {
vector<int> vec;
vector<int>::iterator f() { return vec.begin(); }
};
はコンパイル通るのに
template <class T>
struct A {
vector<T> vec;
vector<T>::iterator f() { return vec.begin(); }
};
は以下のエラーメッセージでコンパイルが通りません
error: type 'std::vector<_Tp, std::allocator<_CharT> >' is not deriv ed from type 'A<T>'
対処法をお教えください。よろしくお願いします。
0244デフォルトの名無しさん
2012/10/17(水) 21:03:28.63はどう?
0245デフォルトの名無しさん
2012/10/17(水) 21:03:42.970246デフォルトの名無しさん
2012/10/17(水) 21:07:36.910247デフォルトの名無しさん
2012/10/17(水) 21:13:20.35ありがとうございます >>244 で通りました
型名であることをコンパイラに教えないといけなかったのですね
0248デフォルトの名無しさん
2012/10/18(木) 02:22:14.69このページの三目並べのプログラムを実行しようと、Mingwでfltkを導入し、Mingwでコンパイルして、exeファイルを製作したのですが、
出来たexeファイルを実行しようとしても、Visual C++ Runtime Library「This application has requested
the Runtime to terminate it an unusual way〜」というエラーメッセージが出てきて、ファイルが実行出来なくなってしまいます。
簡単なFltkのライブラリを含んだものをコンパイルしたexe.ファイルは実行出来たので、Fltkには原因はないみたいです。
Visual c++の再頒布パッケージをダウンロードしたり、管理者権限で実行しても同じ結果になりました。
一体、何が足りないんでしょうか?
書籍に書かれたコードなので、コードが間違っているとも思えません。
0249デフォルトの名無しさん
2012/10/18(木) 06:42:10.88つ 正誤表
0250デフォルトの名無しさん
2012/10/18(木) 08:16:24.49コンパイラを新しくしろ。
最近のエラーメッセージはずっとまとも。
0251デフォルトの名無しさん
2012/10/18(木) 18:04:32.93class IFoo {
public:
virtual void Func() = 0;
};
class FooBase : IFoo {
public:
void Func() { } // オーバーライドしたい
};
class FooEx : FooBase {
public:
void Func() { } // オーバーライドさせたくない
};
0252デフォルトの名無しさん
2012/10/18(木) 18:31:34.960253デフォルトの名無しさん
2012/10/18(木) 18:47:33.8111ならできる
0254デフォルトの名無しさん
2012/10/18(木) 22:28:20.33最近プログラムの高速化について調べているのですが
最近のCPUはどんどん高速化していって、キャッシュサイズ等も増えてきているが
メモリはパスの互換性の問題等から速度は昔とあまり変わっていないので
速いプログラムを書くにはメモリとあまりやりとりせずにCPUのキャッシュに乗せるのが
有効とあったのですが、プログラムでCPUのキャッシュに乗せるというのがイメージできません。
コードで明示的にキャッシュに乗せる事は出来るのでしょうか?それとも、キャッシュにのるサイズのデータなら
自動的にキャッシュを使われるようになっているのでしょうか?
0255デフォルトの名無しさん
2012/10/18(木) 22:31:36.73コードとデータをキャッシュサイズより小さいものだけで回すように
0256デフォルトの名無しさん
2012/10/18(木) 22:34:54.290257デフォルトの名無しさん
2012/10/18(木) 22:39:51.39ドライバの関数って普通はカーネル経由で呼ばれて、レジスタは気にする必要無いんじゃないの?
__interrupt__ってそのカーネルを書くときに使うやつじゃないの?
I/O用の関数をカーネルが持ってる場合はアセンブリ無くてもドライバ書けるんじゃないの?
0258デフォルトの名無しさん
2012/10/18(木) 22:58:23.050259デフォルトの名無しさん
2012/10/18(木) 23:13:48.221つにまとめれないのでしょうか
template<typename T1, typename T2>
f(const T1 & t1,const T2 & t2
,typename boost::enable_if<boost::is_arithmetic<T1> >::type* = 0
,typename boost::enable_if<boost::is_arithmetic<T2> >::type* = 0
){...
template<typename T1, typename T2>
f(T1 & t1,const T2 & t2
,typename boost::disable_if<boost::is_arithmetic<T1> >::type* = 0
,typename boost::enable_if<boost::is_arithmetic<T2> >::type* = 0
){...
0260デフォルトの名無しさん
2012/10/19(金) 01:30:51.110261デフォルトの名無しさん
2012/10/19(金) 12:37:22.76キャッシュ自体は原則的にCPUが勝手に制御するから意識する必要はない。
ターゲットCPUが決まっていて、それのインストラクションを使える開発環境ならば、
幾つかの関数呼び出しでキャッシュの制御ができる場合もあるが。
先ずは実測してみて欲しい。食わせるデータによってランダムアクセスになるか
シーケンシャルアクセスになるか切り替わるようなプログラムを用意し、
そのプログラムの処理時間を記録するとキャッシュの効果が見えるだろう。
で、後はSoAかAoSか、演算量が多くなってもシーケンシャルアクセスの方が速いか、
そもそもコード自体が最適化によってベクタ化されて速くならないか、などを検討していくことになる。
いずれにしても、C++一般の話からは外れてくるので後は最適化スレにでも。
0262デフォルトの名無しさん
2012/10/19(金) 13:25:49.59c,dはaとbの長さがあります
aとbの長さzとは*aをa[0] ,a[1],...と分解して
さらにa[0],[1],...を2進数列で分解してx_1,.......,x_32, y_1,...........
と分解したとき2進数列のz番目以下の値は定義されていることをいいます。
このときaのcまでの値後ろにbのdまでの値を付け加えたeを作りたいんですけど、
eに対してもまたfを付け加えてgを作ったりしなければなりません。
このときa,b,e,fのデータ構造を全て同じなものに書き換えて効率のよいものにしたいのですけど
どのようにしたらいいですか?
0263デフォルトの名無しさん
2012/10/19(金) 13:30:06.030264デフォルトの名無しさん
2012/10/19(金) 13:31:57.090265デフォルトの名無しさん
2012/10/19(金) 13:52:34.240266デフォルトの名無しさん
2012/10/19(金) 13:55:22.35std::wstring r1 = L"3445";
std::wcout << r1 << std::endl;
std::wregex wr2(L"(.)\1+");
std::wstring fmt2(L"x");
std::wstring r2 = std::regex_replace(r1,wr2,fmt2);
std::wcout << r2 << std::endl;
実行結果
3445
3445
任意の数字列にて、同じ数字が連続するものを"x"に置換したいのです。
この場合"3x5"になって欲しいんですが、何故マッチしないのでしょうか?
0267デフォルトの名無しさん
2012/10/19(金) 14:03:45.220268デフォルトの名無しさん
2012/10/20(土) 10:01:44.63sscanf("deep/dir/tree/file.txt","%[^/]/%s.txt",a,b);
a="deep/dir/tree", b="file"にマッチさせたいのですが、
これだとはじめの/で止まってしまいます。できればscanfの範囲で解決策を教えて下さい。
もし無理な場合、
stringでfindを使えばよいことはすでにわかっています。
また、std::regexを使う方法は試していませんが興味があるのでぜひ提示してください。
0269デフォルトの名無しさん
2012/10/20(土) 11:38:46.970270デフォルトの名無しさん
2012/10/20(土) 12:42:10.01どうしてそう思った?
0271デフォルトの名無しさん
2012/10/20(土) 13:04:50.390272デフォルトの名無しさん
2012/10/20(土) 14:17:37.96それくらい自分で調べろよ超絶低能役立たず。社会のガン細胞。C++と何の関係もないからまずどっかに消えてなくなれ。
0273デフォルトの名無しさん
2012/10/20(土) 15:06:16.200274デフォルトの名無しさん
2012/10/20(土) 15:10:12.34自分がゴミである事に気がついてないゴミ(笑)
0275デフォルトの名無しさん
2012/10/20(土) 15:10:15.98何が便利(どう使えばいい)か教えてくれ。
キャストできないときに NULL が返るのは分かったが、
別に NULL チェックがしたいわけじゃないし、
キャストするときは大抵基底で判別してからやらない?
キャストしまくってポインタが返ってきたものだけ処理するとか…そんな書き方するのか…?
0276デフォルトの名無しさん
2012/10/20(土) 15:13:28.160277デフォルトの名無しさん
2012/10/20(土) 15:16:29.98またコピペか
0278デフォルトの名無しさん
2012/10/20(土) 15:37:04.49namespace A{
}
「名前空間 A を宣言する」
と言って良いものか・・・
0279デフォルトの名無しさん
2012/10/20(土) 15:49:50.130280デフォルトの名無しさん
2012/10/20(土) 15:50:26.66class P{
private:
double hoge;
public:
double Hoge(){ return hoge;}
};
double F(P<double> a, P<double> b){
return a.Hoge() + b.Hoge();
}
テンプレート型のクラスを引数に持ってくる際に型を固定したいのですが
以上のようにできるでしょうか
0281デフォルトの名無しさん
2012/10/20(土) 17:58:36.56ttp://en.cppreference.com/w/cpp/regex/match_results/operator_at
ここにある例を走らせるとsm[1]が空文字""になってしまいます。
仕様変わりました?
0282デフォルトの名無しさん
2012/10/20(土) 19:07:41.93意味があるのか不明だがそのコードは通る
0283デフォルトの名無しさん
2012/10/20(土) 22:47:19.84引数ありのコンストラクタが引数無しのコンストラクタ呼ぶことって可能ですか?
class Test{
bool po;
public:
Test()
:po(NULL)
{
}
Test( int i )
{
// ここでTest()のやつをうごかしたい
}
};
191 名前:デフォルトの名無しさん[sage] 投稿日:2012/03/01(木) 15:19:07.74
class Test {
bool po;
public:
Test(void) { initialize(); }
Test(int i) { initialize(i); }
private:
void initialize(void) { po = false; }
void initialize(int i) {
// ここでinitialize()のやつをうごかす
}
};
0284デフォルトの名無しさん
2012/10/20(土) 22:50:24.610285デフォルトの名無しさん
2012/10/20(土) 23:56:42.67C++03なら無理なので191のやってるように初期化関数使え
0286デフォルトの名無しさん
2012/10/21(日) 07:11:06.70(ちなみにダブルディスパッチでダメな理由は型のパターンが多すぎてインターフェースがすさまじく大きくなるからです)
void Func(IObject * p, IObject * q, IObject * r);
をコールしたら
*pの本来の型S、*qの本来の型T、*rの本来の型Uとして
void Func(S * p, T * q, U * r);
にディスパッチしてほしいです
0287デフォルトの名無しさん
2012/10/21(日) 08:02:44.31その方針だと型の数が増えると定義しなければならない
Funcの組み合わせの数が爆発的に増えてしまう
0288デフォルトの名無しさん
2012/10/21(日) 10:13:16.92自分で戻すもんじゃない?
0289デフォルトの名無しさん
2012/10/21(日) 11:56:49.43OpenGLだけど
const char* pVer = glGetString(GL_VERSION);
printf("version is %s¥n",pVer);
これだとOKで
printf("version is %s¥n",glGetString(GL_VERSION));
これだとダメだったんだが、もしかして返り値の寿命が関係してるの?
だとすると寿命はどう捉えるべき?
0290デフォルトの名無しさん
2012/10/21(日) 12:09:06.350291デフォルトの名無しさん
2012/10/21(日) 12:12:37.940292デフォルトの名無しさん
2012/10/21(日) 12:14:24.64それでダメになるというのは仕様的にはあり得ない
そこまでの間にメモリ破壊でも起こしてるか、
コンパイラにバグがあるか、あるいはリビルドすると直るとか、そういうもの
0293デフォルトの名無しさん
2012/10/21(日) 13:59:19.87_endthreadexでここのスレッドを判別するにはどうしたら良いのでしょうか?
0294デフォルトの名無しさん
2012/10/21(日) 15:26:26.80_endthreadexは絶対に呼んじゃダメ
デストラクタが呼ばれない
0295デフォルトの名無しさん
2012/10/21(日) 15:50:11.780296デフォルトの名無しさん
2012/10/21(日) 16:15:46.41にレスがつかなくて困ってたんだけど、もしかしてGCCの実装が未完成ってこと?
ttp://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html
完成してないどころか、間違った結果を返すものを公開するなよって感じなんだけど一体どうなってんだw
0297デフォルトの名無しさん
2012/10/21(日) 16:22:44.12(セグフォを起こす処理)
}
を
while (cin >> input) {
try {
(セグフォを起こす処理)
} catch (std::exception& e) {
std::cerr << input << std::endl;
}
}
に書き換えても、catchできてないしループが1回で止まってしまうのですが、
セグフォってcatchできないのでしょうか?
ちなみにセグフォを起こしているのはstd::vector::operator[]だと思います。
0298デフォルトの名無しさん
2012/10/21(日) 16:57:02.42operator =を書くときに困っています。
たとえば内部に持つバッファのサイズなどはコンストラクタで決まり、以後変更されないのでconstにしています。
が、そうするとconst_castでconstをはがさないと代入演算子が書けないわけで・・・
こういうときはどうするべきなのでしょう。
1.constではなくmutableにすべき
2.代入演算子を書くべきでない。使うときはコピーコンストラクタで済ませるべき
3.そもそもその程度の不変性ならconstにするな
アドバイスいただけると嬉しいです。
0299デフォルトの名無しさん
2012/10/21(日) 16:59:42.510300デフォルトの名無しさん
2012/10/21(日) 17:35:00.30カーネルが発するSegmentation Faultに対応する
C++標準のexception classが存在しないもよう
ハンドラを通してC++の例外に変換してる例↓
http://www.ibm.com/developerworks/linux/library/l-cppexcep/index.html
0301デフォルトの名無しさん
2012/10/21(日) 17:41:06.66メンバ変数にconstは可能な限り付けない方がいい
どうしてもconstが必要なら代入不可であるべき
0302デフォルトの名無しさん
2012/10/21(日) 17:42:29.590303デフォルトの名無しさん
2012/10/21(日) 17:46:25.370304デフォルトの名無しさん
2012/10/21(日) 17:53:43.700305デフォルトの名無しさん
2012/10/21(日) 18:01:15.910306デフォルトの名無しさん
2012/10/21(日) 19:04:15.860307デフォルトの名無しさん
2012/10/21(日) 20:12:02.31nanndatteee
ありがとうございます。仕方ない、おとなしくprintfデバッグします・・・。
whileの中は独立だから途中で止めたくないんだけどな・・・
0308デフォルトの名無しさん
2012/10/21(日) 20:27:03.010309デフォルトの名無しさん
2012/10/21(日) 20:50:20.55フレームワークに設けられている便利に使っていいvoid*なんですが
&でアドレス取得して入れたら、うまく動作しませんでした。
&でアドレス取得する場合、参照カウントが増えなくて消えちゃうみたいです。
こういう時ってどう実装するものなのでしょう?。
0310デフォルトの名無しさん
2012/10/21(日) 21:13:00.700311デフォルトの名無しさん
2012/10/22(月) 13:10:09.17printf()だとバッファリングされるから、fprintf(stderr, ...)の方がいいよ。
0312デフォルトの名無しさん
2012/10/22(月) 15:19:23.24template<class II, class PD, class CT>
int sansuu(II pos, PD n, CT tr)
{
for (; 0 < n ; --n, ++pos)
{
---> ここの書き方 if( tr.eq(*pos, '0') )
{
}
}
return 0;
}
int main(int argc, char* argv[])
{
const char* p = "1+1";
ここの書き方 sansuu(p, strlen(p), char_traits<char>);
const wchar* wp = L"1+1";
sansuu(wp, strlen(wp), char_traits<wchar>);
インプットイテレータとサイズを引数にして、あとcharとwcharでも
使えるようにしたいんですがどうしたらいいのでしょうか
stringを見たらchar_traitsとかあったんですがよくわかりませんでした。
お願いします。
0313雑魚シカ
2012/10/22(月) 15:50:12.92int sansuu(const char_type* pos, length n);
0314デフォルトの名無しさん
2012/10/22(月) 17:26:24.79しかしリリースモードで実行すると1行ずつ読み込めません。デバッグモードでは問題なく読み込めました。
原因が分かる人がいたら教えてください。 ちなみにvs2008を使っています。
0315デフォルトの名無しさん
2012/10/22(月) 17:33:11.10モードの違いに言及したいのなら、開発環境に依存した話なので該当スレへ。
どう読み込めないのか説明ができないのならエスパースレへ。
まさかと思うが、モードだとかデバッグ実行だとかでcwdが違うって落ちじゃないよな。
0316デフォルトの名無しさん
2012/10/22(月) 17:51:39.56ttp://qarc.info/qa/show-10336-519.html
0317デフォルトの名無しさん
2012/10/22(月) 17:53:29.98あるタイミングで i を使って、別のタイミングで d を使うって事?
使ったかどうか覚えておけばいいだけのような
0318デフォルトの名無しさん
2012/10/22(月) 18:30:10.19C++相談室 part94
ttp://toro.2ch.net/test/read.cgi/tech/1329512856/490-
0319デフォルトの名無しさん
2012/10/22(月) 18:31:14.90C++相談室 part94
ttp://toro.2ch.net/test/read.cgi/tech/1329512856/536-
0320デフォルトの名無しさん
2012/10/22(月) 20:08:53.54クラス内にメンバ変数しかなかったら
newする度に変数の分だけメモリを消費するだろうと推測できるのですが
例えば、メンバ変数は2〜3個でも、メンバ関数が100個くらいある場合には
newする度にメモリの消費量が半端ない感じになってしまったりしますか?
クラスのメモリを確保した時の挙動がちょっと気になってしまいまして
詳しい方いらっしゃったら教えてくださいまし
0321デフォルトの名無しさん
2012/10/22(月) 20:30:27.87http://qarc.info/qa/show-10336-650.html
0322デフォルトの名無しさん
2012/10/22(月) 23:39:55.72struct IBar { virtual func(void) = 0; };
struct Baz : IFoo, IBar {
// ?
};
funcをインターフェースごとに明示的に違う内容でオーバーライドしたいのですがどうすればよいでしょうか?
0323デフォルトの名無しさん
2012/10/22(月) 23:53:29.490324デフォルトの名無しさん
2012/10/22(月) 23:56:48.040325デフォルトの名無しさん
2012/10/22(月) 23:58:50.56struct FooImpl : IFoo { virtual func() { ...
struct BarImpl : IBar { virtual func() { ...
struct Baz : FooImpl, BarImpl { ...
0326デフォルトの名無しさん
2012/10/23(火) 20:07:34.23多重継承は楽しい。
0327デフォルトの名無しさん
2012/10/23(火) 20:20:44.070328デフォルトの名無しさん
2012/10/23(火) 21:06:28.600329デフォルトの名無しさん
2012/10/23(火) 21:13:10.270330デフォルトの名無しさん
2012/10/23(火) 22:13:29.10struct A { protected: int data; };
struct B { const A& a; B(const A& a): a(a) {} int func(){ return a.data+1; } }
みたいなことをしようとすると、Aのpublicメソッドとしてdataのゲッターを用意しないといけませんよね、
Aを継承すればdataを使えるけど、dataが2箇所に重複してしまう。(コピーつくらずに共有したい)。
0331デフォルトの名無しさん
2012/10/23(火) 22:18:36.470332デフォルトの名無しさん
2012/10/23(火) 22:20:09.270333デフォルトの名無しさん
2012/10/23(火) 22:26:29.280334デフォルトの名無しさん
2012/10/23(火) 23:22:11.990335デフォルトの名無しさん
2012/10/23(火) 23:30:31.18a.data = 2;
B b(a);
b.func();//2
a.data = 3;
b.func();//3
//bはaのオブサーバ
みたいにしたい。
「オブサーバパターン使え」とかはなしで。
たしかに今はvirtual継承する設計になってるんだけど、
機能的には完全に独立な内容をもつ巨大なクラスになってしまっているから、
見たいデータだけ共有して機能を切り離したい。
それこそ設計を見なおしてる段階なので、あいまいな説明になってしまって申し訳ないです。
0336デフォルトの名無しさん
2012/10/24(水) 07:22:54.95普通の関数だと
int (*kanp)();
int kan(int a);
kanp=kanで入るけどkanの部分をテンプレート関数にすると入らない
0337デフォルトの名無しさん
2012/10/24(水) 07:25:05.760338デフォルトの名無しさん
2012/10/24(水) 07:25:41.18バカには無理。
0339デフォルトの名無しさん
2012/10/24(水) 10:24:46.600340デフォルトの名無しさん
2012/10/24(水) 10:53:14.080341デフォルトの名無しさん
2012/10/24(水) 11:00:36.71kanp=kan<int>だめでした
int (*kanp)(int*)だと入ったんですけど()で入れたいです
0342デフォルトの名無しさん
2012/10/24(水) 11:24:03.89無理だろ
ttp://ideone.com/LFlHdR
関数ポインタにこだわらないならbindするという手もあるけどなぜそんなことをしたがるんだ
0343デフォルトの名無しさん
2012/10/24(水) 13:22:09.880344デフォルトの名無しさん
2012/10/24(水) 20:58:10.22実際にはtxtファイルを用いるところをダイアルボックスでjpgを選択する形にしたいのですが
画像だとサムネイルがみえてわかりやすいので
0345デフォルトの名無しさん
2012/10/24(水) 21:06:00.67そんなことも自分で考えられないならソフトウェア製作業者にお金を払って作ってもらいなさい。
0346デフォルトの名無しさん
2012/10/24(水) 21:21:02.20ありがとうございます
おかげで解決しました
0347デフォルトの名無しさん
2012/10/24(水) 21:21:50.340348デフォルトの名無しさん
2012/10/27(土) 11:15:30.370349デフォルトの名無しさん
2012/10/28(日) 12:02:08.81operator++でTに対して何をやってるのかによりますが、8byteのunion型か何かを自分で作れば可能でしょうか?
#include <iostream>
#include <fstream>
#include <vector>
int main()
{
std::ifstream fin("dataset.dat",std::ios::binary);
std::istreambuf_iterator<double> bf(fin),eof;
std::vector<double> buf(fin,eof);
for (int i=0; i<10; ++i) {
std::cout << buf[i] << std::endl;
}
}
0350デフォルトの名無しさん
2012/10/28(日) 12:15:48.460351デフォルトの名無しさん
2012/10/28(日) 12:24:29.01doubleのところを適当なunion型かなにかにするの?という質問。
発想がそもそもズレてる可能性はある。
Cだとreinterpret_castで8byte読み込むところだがストリームでやりたいなと。
0352デフォルトの名無しさん
2012/10/28(日) 13:35:38.73それでいいよ
0353デフォルトの名無しさん
2012/10/28(日) 17:36:10.56うまくいかねぇ
#include <iostream>
#include <fstream>
union dbl {
char mem[8];
double d;
};
int main()
{
std::ifstream fin("dataset.dat",std::ios::binary);
std::istreambuf_iterator<dbl> buf(fin),eof;
}
0354デフォルトの名無しさん
2012/10/28(日) 18:18:37.350355デフォルトの名無しさん
2012/10/28(日) 19:16:33.87union {double, char[8]} から8文字取り出して連続して書き込めよ
0356デフォルトの名無しさん
2012/10/28(日) 19:37:20.73これでいいような気がするけど
何か問題あるかな
0357デフォルトの名無しさん
2012/10/28(日) 20:22:28.23規格で入出力形式って一つに決められていたっけ
0358デフォルトの名無しさん
2012/10/28(日) 20:50:39.97こんな感じでfor文外にフラグ置かないとできないですか?
http://codepad.org/1MOZpRNh
↓こんな感じで、「最後まで何も該当しなかったよ」というのを基本構文(if,for,whileなど)で再現したいです。
http://codepad.org/8D51w0WR
5時間ぐらい悩みました。
誰か本当に教えて下さい。
0359デフォルトの名無しさん
2012/10/28(日) 20:56:46.84for (;i<END;++i)
〜;
if (i!=END)
〜;
else
〜;
0360デフォルトの名無しさん
2012/10/28(日) 21:08:33.85シリアライズ用に使いたいならどっちかで統一した方がいいね
0361デフォルトの名無しさん
2012/10/28(日) 21:44:28.51う〜ん、そのまんまか・・・。
やっといてもらってアレだが、これだとfout.readするほうが明らかに楽ですよね。
何が嬉しいのか分からん。速いとか?
>>360
C系(規格ではない)とJava系で逆だった気がするが、ユーザーの責任にするしかないと思われ。
0362デフォルトの名無しさん
2012/10/28(日) 22:13:12.66istreambufを使うのはユーザー定義で自由なストリームを構築出来るという
自由度の高さがあるからです
欠点は1文字ずつしか入出力出来ないこと
速さはどうなんだろう
そんなに変わらないと思うけど
0363デフォルトの名無しさん
2012/10/28(日) 22:17:49.02ありがとう。ちょっと仕様でも読んで使い道考え直しますわ。
ライブラリのあまり使われない部品って、けっこう多いよね>C++
0364デフォルトの名無しさん
2012/10/28(日) 23:30:40.44「CharTypeはcharまたはwchar_tである。・・・」
それ以上読むのやめたw
0365デフォルトの名無しさん
2012/10/28(日) 23:38:17.50使ってはいけない部品も多い
0366デフォルトの名無しさん
2012/10/30(火) 10:06:24.92shared_ptr<A> x(new A);
shared_ptr<A> y = x;
shared_ptr<A> z(new A); // �@
cout<<x.use_count()<<endl; // 参照カウンタは2
cout<<y.use_count()<<endl; // 参照カウンタは2
cout<<z.use_count()<<endl; // 参照カウンタは1
z=x; // �@で生成したオブジェクトが消滅
cout<<x.use_count()<<endl; // 参照カウンタは3
cout<<y.use_count()<<endl; // 参照カウンタは3
cout<<z.use_count()<<endl; // 参照カウンタは3
z=xで、どうしてyのカウンタまで3に変更されるのかが
よくわかりません。
裏側にカウンタクラスがあって実際はこれがオブジェクト
Aへの生ポインタと参照回数をカウントする変数をもって
いる。x,y,zはこの裏クラスを参照もしくは指している
という理解でよろしいでしょうか?
0367デフォルトの名無しさん
2012/10/30(火) 10:17:22.260368デフォルトの名無しさん
2012/10/30(火) 10:40:25.57ありがとうございます。
裏側にカウンタクラスがあって
↓
裏側にカウンタクラスのオブジェクトがあって
x,y,zはこの裏クラスを
↓
x,y,zはこの裏側にあるカウンタオブジェクトを
0369デフォルトの名無しさん
2012/10/30(火) 11:19:28.87http://d.hatena.ne.jp/setuna-kanata/20081125/1227620902
0370デフォルトの名無しさん
2012/10/30(火) 12:33:53.17おお、ありがとうございます。
0371デフォルトの名無しさん
2012/10/30(火) 12:37:22.990372デフォルトの名無しさん
2012/11/02(金) 22:32:34.850373デフォルトの名無しさん
2012/11/08(木) 10:05:56.55const int HOGE = 10;
などと書いてしまうべきですか?
それとも、ヘッダに
static const int HOGE;
と書いておいて、
const int クラス名::HOGE = 10;
と実体をソースに定義するべきですか?
Cの頃は関数内でのみ使用する定数は前者(しかも#define)でしたが、C++だとどうなるのでしょうか。
後者だと、クラスを使用する側には関係ないものをヘッダに書く必要が出てくるのですが。
0374デフォルトの名無しさん
2012/11/08(木) 10:48:46.830375デフォルトの名無しさん
2012/11/08(木) 12:18:15.90private の enum か static
もしくは pimpl でヘッダにも残さない
0376デフォルトの名無しさん
2012/11/08(木) 12:36:32.04宣言と実態を分けて書くと、コンパイル時定数ではなくて、
変更できない変数になってしまって、
いろいろと不都合が出たよ。
ヘッダにstatic const intで書いた方が、何かと便利。
privateにしてしまえば、使う側には関係ない。
0377デフォルトの名無しさん
2012/11/08(木) 14:57:32.54やっぱりこの手のものはヘッダにprivateで書くものなんですか。
ソース内のみで使う定数が外から見えるところで宣言されているのが違和感があるのですが、
たしかにprivateメンバ変数やprivateメンバ関数も同じように外に見えていますし、
クラスはそういうものなんだと理解するようにします。
0378デフォルトの名無しさん
2012/11/08(木) 15:46:38.08ソースのグローバルに
static const int HOGE = 10;
0379デフォルトの名無しさん
2012/11/08(木) 15:52:54.270380デフォルトの名無しさん
2012/11/08(木) 16:00:45.03これが最初に書いた前者の方法ですよね?
>>379
すいません、同じ意味です。
一つのソース内に書かれている関数は、通常は一つのクラスのメンバ関数のみなので。
0381デフォルトの名無しさん
2012/11/08(木) 16:38:50.330382デフォルトの名無しさん
2012/11/08(木) 18:47:16.06そもそもstaticより無名名前空間を使うべきだな
0383デフォルトの名無しさん
2012/11/08(木) 18:52:12.77.cppソースが無くてヘッダに全部実装書いてる有名ライブラリの立場は・・・
0384デフォルトの名無しさん
2012/11/08(木) 18:53:02.810385デフォルトの名無しさん
2012/11/08(木) 19:06:27.570386デフォルトの名無しさん
2012/11/08(木) 19:16:49.0054 :仕様書無しさん:2009/06/13(土) 18:26:48
>>51
そのとおりっていうかそれが当然っていうか話題にする価値もないっていうか
まさか世の中にはstaticな関数までヘッダに書く奴がいるのかと戦慄してるんですが。
ところでc++のクラスでプライベートなメンバ/メソッドをクラス定義に一度に書かせる
のが諸悪の根源だわな。あれのせいでc++から学習する奴がヘッダの意味がわからず
混乱する。
パブリックなメンバは一箇所でしか定義できないが、プライベートメンバは既存クラスに
追加の形で定義してよい、とすればc時代のヘッダの意味を取り戻せるのだが。
コンパイラの実装めんどくさそうだけど。
0387デフォルトの名無しさん
2012/11/08(木) 20:47:48.06横レスだけど・・・なんのライブラリですか?
0388デフォルトの名無しさん
2012/11/08(木) 21:19:14.100389デフォルトの名無しさん
2012/11/08(木) 21:39:07.760390デフォルトの名無しさん
2012/11/08(木) 22:58:29.230391デフォルトの名無しさん
2012/11/08(木) 23:08:45.800392デフォルトの名無しさん
2012/11/08(木) 23:55:56.960393デフォルトの名無しさん
2012/11/08(木) 23:56:34.740394デフォルトの名無しさん
2012/11/09(金) 01:23:41.34ただ一つのソースにまとめてコンパイルするほうが早いって話
ヘッダに実装を全部書くとそのやり方と相性がいい
0395デフォルトの名無しさん
2012/11/09(金) 01:24:16.300396デフォルトの名無しさん
2012/11/09(金) 01:30:37.47それは分割されたソース全部再コンパイルするのに比べて、だろ。
ちょっと変更してビルドしなおすって状況ではちゃんと分かれてないと死ぬ。
0397デフォルトの名無しさん
2012/11/09(金) 08:28:16.460398デフォルトの名無しさん
2012/11/15(木) 20:21:04.44shared_ptr<const Piyo> GetPiyoA() const {
const shared_ptr<cosnt Piyo> sp(this->spPiyo);
assert(sp != NULL);
return sp;
}
shared_ptr<const Piyo> GetPiyoB() const {
assert(this->spPiyo != NULL);
return this->spPiyo;
}
...
};
GetPiyoAとGetPiyoB、ベターなのはどちらですか?
0399デフォルトの名無しさん
2012/11/15(木) 20:23:19.18前者に何の意味があるんだ
0400デフォルトの名無しさん
2012/11/15(木) 20:30:13.76shared_ptr<Piyo> spPiyo;
です
assert(this->spPiyo != NULL); のspPiyo
return this->spPiyo; のspPiyo
spPiyoが保持する内容はassertなりの呼び出しで変えられないことが保障されているかという話です
0401デフォルトの名無しさん
2012/11/15(木) 20:46:38.90void ProcessHoge(const shared_ptr<const Hoge> & spHoge)
{
// shared_ptr<const Piyo> spPiyo(spHoge->GetPiyo());
// const Piyo * pPiyo(spPiyo.get());
const Piyo * pPiyo(spHoge->GetPiyo().get());
GlobalFunc();
spHoge->ConstFunc();
pPiyo->ConstFunc();
}
シングルスレッドにおいて、このようにspPiyoを作成せずに直接生ポを取得して使用することは問題になりますか?
0402デフォルトの名無しさん
2012/11/15(木) 20:54:18.300403デフォルトの名無しさん
2012/11/15(木) 22:03:44.33spHoge->spPiyoがいつまで有効であるかどうか解からないからです
0405デフォルトの名無しさん
2012/11/15(木) 22:41:48.07最大の問題はHoge使ってる奴がプログラミングなんかに手を出したことです。
0406デフォルトの名無しさん
2012/11/15(木) 22:47:15.430407デフォルトの名無しさん
2012/11/15(木) 22:47:33.830408デフォルトの名無しさん
2012/11/15(木) 22:51:52.24hagi 歯ぎしりしたいのか?
hagu ハグしたいのか?
hage ツルピカ
hago んんん何だ
higa キッコーマンか
higi 秘技炸裂
higu 秘具・・・て何だ具体的に
hige 恐れようが結局ただのおっさん
higo ラーメン3杯に繊月の染みいるパワー明日知らず
hoga 味玉に山芋オクラのB2パワー
hogi 締まった肉にホギホギくいつくハム喰い
hogo 何だと、もう誰も信じてはいない、だれがだれを守るんだよ、それが現実的に意味があることなのかよ、なあおい答えろよ,次第によってはぶっ殺すぞ
0409デフォルトの名無しさん
2012/11/15(木) 22:52:09.940410デフォルトの名無しさん
2012/11/15(木) 22:53:53.51hoge厨は迷惑だから消えろよ
0411デフォルトの名無しさん
2012/11/15(木) 22:59:12.61ホゲ使ってる奴=ヴァカの図式が今回も証明されたなw
0412デフォルトの名無しさん
2012/11/15(木) 23:03:25.33やってみれば分かるけどそれは問題にならない。
って言ったら信じるんだろうなこの基地害。
本当に生きてる価値ないな。
法で人権が保護されてるってだけで、社会では価値なし。
0413デフォルトの名無しさん
2012/11/15(木) 23:06:18.14hoge以外にも>>400みたいに後出しで情報出してるし、荒らし以外の何者でもない、スルーよろ
0414デフォルトの名無しさん
2012/11/15(木) 23:09:56.37キーボード入力で値をそれぞれ与え、自作関数を用いてそれぞれの累積和を求めるプログラムが書きたいのですが、
自作関数が、その2つの構図体を引数として与え、1つの構造体を返すというものです。
全く手が出ません。
どうアプローチして良いかすら分からないので、1つ簡単な解答例をお願いします。
0415デフォルトの名無しさん
2012/11/15(木) 23:42:42.18まずその構造体を定義するプログラムを書いてみろ
0416デフォルトの名無しさん
2012/11/15(木) 23:57:50.52hogeは日本人のしかもごく一部しか使わない。
つまりhogeに慣れ親しんで当たり前のように使う奴は、
プログラムに関して日本語でしか検索しないことが多く(もしくは日本語のみでしか検索したことがない)、また、
普段学習等のために閲覧しているサイトもhogeを多用するようなサイトに偏っている。
これは学習の段階や検索能力そのものに問題があるということであり、
すなわち、プログラム以前の部分に問題のある馬鹿だということ。
馬鹿の中でも>>398のような最底辺。
0417デフォルトの名無しさん
2012/11/16(金) 00:03:04.250418デフォルトの名無しさん
2012/11/16(金) 00:09:47.16struct number{
int x;
int y;
int z;
};
struct sum(struct score,struct score); //プロトタイプ宣言
main(){
…
こんな感じです。あってると思うが…
0419デフォルトの名無しさん
2012/11/16(金) 00:12:14.80引数の値が誤植だわ。× score 〇 number
0420デフォルトの名無しさん
2012/11/16(金) 00:24:51.79int x, y, z;
};
number sum(number&, number&); // プロトタイプ宣言
number sum(number& a, number& b)
{
number output;
output.x = a.x + b.x;
output.y = a.y + b.y;
output.z = a.z + b.z;
return output;
}
void main () {
number a = { 1, 2, 3 };
number b = { 4, 5, 6 };
number ans = sum(a, b);
printf("%d, %d, %d\n", ans.x, ans.y, ans.z);
}
0421デフォルトの名無しさん
2012/11/16(金) 01:09:15.14もちろんコンパイルは通っていません。色々なミスを含め指摘・訂正をお願いします。
struct number{
int x,y,z;
};
struct number sum(struct number,struct number);//プロトタイプ宣言
struct number sum(struct number,struct number){
struct number sum;
sum.x = ?;
sum.y = ?;
sum.z = ?;
return sum;
}
//↑の自作関数の部分で引数が、同じ構造体を2つ使う場合の引数の設定の仕方がよくわかりません。
//構造体を名前を入れるとダブってしまいます。
0422デフォルトの名無しさん
2012/11/16(金) 01:11:27.50申し訳ございません。
main(){
struct number data;
struct number temp;
printf("x y z? ");
scanf("%d %d %d",&temp.x, &temp.y,&temp.z);
data = sumscores(data,temp);//←代入できないのかな?
printf("total: %d %d %d\n",data.x,data.y,data.z);
}
//↑のmain関数で、本当は入力が != EOFの限り繰り返しを行いたいです。
0423デフォルトの名無しさん
2012/11/16(金) 01:21:51.500424デフォルトの名無しさん
2012/11/16(金) 01:32:09.67引数が構造体でない関数、例えばintを二つ受け取って合計を返す関数は書けるか?
書けるなら引数が構造体の場合でも同じようなもんだ
0425デフォルトの名無しさん
2012/11/16(金) 02:00:06.60そっちのほうに興味があるわ
0426デフォルトの名無しさん
2012/11/16(金) 04:47:22.01質問があります、じゃねえだろクズ
お前にはhoge使う以前にやることがあるだろ
さっさと回線切れ
どーでも良い。
0428デフォルトの名無しさん
2012/11/16(金) 10:45:43.610429デフォルトの名無しさん
2012/11/16(金) 12:25:14.22何がclass Hogeだよ。
頭おかしいだろお前。
お前リアルでも基地害扱いされてるよ、
基地害に面と向かって言うと面倒なことになるから言わないだけで、
陰では早く消えればいいのにって言われてるよ。
お前みたいな奴は居るだけで迷惑だからね。
0430デフォルトの名無しさん
2012/11/16(金) 13:19:22.990431デフォルトの名無しさん
2012/11/16(金) 14:06:35.590432デフォルトの名無しさん
2012/11/16(金) 14:16:42.24void ProcessFoo(const shared_ptr<const Foo> & spFoo)
{
// shared_ptr<const Bar> spPiyo(spFoo->GetBar());
// const Bar * pBar(spBar.get());
const Bar * pBar(spFoo->GetBar().get());
GlobalFunc();
spFoo->ConstFunc();
pBar->ConstFunc();
}
シングルスレッドにおいて、このようにspPiyoを作成せずに直接生ポを取得して使用することは問題になりますか?
0433デフォルトの名無しさん
2012/11/16(金) 14:20:09.13ヲッチャーじゃなくてまともな回答者ならNG入れとけ
hoge厨にもアンチもまともな書き込みは1つもしてないからNG入れて問題ない
コピペ用↓
Hoge
hoge
Huga
huga
Piyo
piyo
0434デフォルトの名無しさん
2012/11/16(金) 14:55:59.630435デフォルトの名無しさん
2012/11/16(金) 16:02:15.04hogeを知っててもまともな神経してたら使わねーし.
thx 登録完了です。
0437デフォルトの名無しさん
2012/11/16(金) 16:40:43.67誰だこれ?
0438デフォルトの名無しさん
2012/11/16(金) 17:26:29.06【いんたーねっとくすぷろーら】で確認するといいよ
0439デフォルトの名無しさん
2012/11/17(土) 09:54:14.580440デフォルトの名無しさん
2012/11/17(土) 12:12:26.680441デフォルトの名無しさん
2012/11/19(月) 23:19:51.63お前らはどこのC++コンパイラー使ってる?
0442デフォルトの名無しさん
2012/11/20(火) 00:26:42.01VC++2010とか言ったら情弱扱いされる流れ?
0443デフォルトの名無しさん
2012/11/20(火) 01:35:39.640444デフォルトの名無しさん
2012/11/20(火) 23:13:54.700445デフォルトの名無しさん
2012/11/20(火) 23:48:28.130446デフォルトの名無しさん
2012/11/21(水) 00:32:07.380447デフォルトの名無しさん
2012/11/21(水) 00:36:51.170448デフォルトの名無しさん
2012/11/21(水) 00:43:07.48このスレ住人にはCray、IBM、京...どれかのコンパイラ開発に参加しした奴意外といるんじゃないか
0449デフォルトの名無しさん
2012/11/21(水) 01:04:55.66C++コンパイラ作ってる企業はパーサーの部分はよそから買ってきたりしてるんだっけ?
0450デフォルトの名無しさん
2012/11/21(水) 01:05:20.390451デフォルトの名無しさん
2012/11/21(水) 01:15:07.470452デフォルトの名無しさん
2012/11/21(水) 07:15:39.790453デフォルトの名無しさん
2012/11/21(水) 07:33:26.490454デフォルトの名無しさん
2012/11/21(水) 08:27:07.740455デフォルトの名無しさん
2012/11/21(水) 08:28:23.150456デフォルトの名無しさん
2012/11/21(水) 09:08:05.950457デフォルトの名無しさん
2012/11/21(水) 09:37:21.000458デフォルトの名無しさん
2012/11/21(水) 22:57:46.290459デフォルトの名無しさん
2012/11/22(木) 01:33:21.160460デフォルトの名無しさん
2012/11/22(木) 07:15:20.06ttp://jibun.atmarkit.co.jp/ljibun01/rensai/tabecho/09/01.html
0461デフォルトの名無しさん
2012/11/22(木) 10:40:01.15漫画が売れるの理由がわかったよ。
0462デフォルトの名無しさん
2012/11/22(木) 12:56:56.020463デフォルトの名無しさん
2012/11/22(木) 23:20:32.82関数の多重定義を使わずに、sizeof...(args)の値が0かそれ以上かで条件分岐するコードにはできないですか?
実装を一箇所にまとめておきたい、というニーズのためです。
template <typename T, typename... Ts>
void func(T x, Ts... xs) {
std::cout << x << std::endl;
if (sizeof...(xs)) func(xs);
}
みたいなイメージなんですが、これだと
コンパイル時にif判定されるわけじゃないので「func()がないよ」って怒られます。
0464デフォルトの名無しさん
2012/11/22(木) 23:23:32.94ちゃんと見てないけどたぶん笑わそうとした漫画じゃなくて、
平文でいい内容をわざわざ漫画にしたパターンじゃないの?
100字を超える文字列を連続で読めないのが大衆と思われる。
0465デフォルトの名無しさん
2012/11/22(木) 23:30:32.730466デフォルトの名無しさん
2012/11/22(木) 23:47:52.20そういったことはstatic_if検討中の次期C++にご期待ください
0467デフォルトの名無しさん
2012/11/23(金) 00:04:29.59サンクスです。たちどころにこういう答えが返ってくる場所があるってすばらしい。
C++11も、規格化されるまでは大丈夫かよ?
と思ってたけどけっこう受け入れられてるみたいだし、健全な発展をお祈りします。
0468デフォルトの名無しさん
2012/11/23(金) 02:55:33.90>>464みたいに安価込みで4行になったレスも読み飛ばしてるの?
0469デフォルトの名無しさん
2012/11/23(金) 23:18:03.43#include "stdafx.h"
#include "stdio.h"
#using <System.Dll>
#using <System.Data.Dll>
#using <System.Xml.Dll>
#include <string>
using namespace System;
using namespace System::Data;
using namespace System::Xml;
using namespace System::Collections;
using namespace System::Data::SqlClient;
int main(void)
{
String^ str;
String^ str200;
char* comp[100] ;
SqlConnection^ Conn = gcnew SqlConnection("Password=apple;User ID=sa;Initial Catalog=master200;Data Source=.\\sql2031");
Conn->Open();
int t;
str = "Select * FROM Customers";
SqlCommand^ sqlCmd = gcnew SqlCommand(str,Conn);//
SqlDataReader^ dr= sqlCmd->ExecuteReader ();
while( dr->Read() )
{ str200=dr["CompanyName"]->ToString();
comp[t] = (char*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(str200).ToPointer();
こっから 表示ができない。
printf("<TD><input type='text' name='comp' size='30' value='"+comp[t]+"' ></TD>" );
0470デフォルトの名無しさん
2012/11/23(金) 23:20:00.50char* 変換できたけど
どうやってstringf できるか教えてほしい。
0471デフォルトの名無しさん
2012/11/23(金) 23:22:54.13http://toro.2ch.net/test/read.cgi/tech/1268613679/
LANケーブルで首吊ればわかるよ
0472デフォルトの名無しさん
2012/11/24(土) 01:57:33.58普通の関数かいて分岐してその中からテンプレートなりよべば?
0473デフォルトの名無しさん
2012/11/24(土) 09:57:15.770474デフォルトの名無しさん
2012/11/24(土) 10:00:40.73http://ideone.com/wCLFh3
0475デフォルトの名無しさん
2012/11/24(土) 10:14:47.540476デフォルトの名無しさん
2012/11/24(土) 10:18:30.86func() を作ればいいという所まで頭が回ってるようには見えない
0477デフォルトの名無しさん
2012/11/24(土) 11:15:54.57オーバーロード使えること知っててこのエラー・・・その先は言う必要ないですよね。
自分で考えてみてください。
0478デフォルトの名無しさん
2012/11/24(土) 11:20:35.900479デフォルトの名無しさん
2012/11/24(土) 12:21:13.48func()含めて多重定義したくなかったんです。
funcという名前を一箇所にまとめたかった。
多重定義というか再帰を空気のように使うと初心者が拒絶するかなぁ、と。
0480デフォルトの名無しさん
2012/11/24(土) 12:23:20.350481デフォルトの名無しさん
2012/11/24(土) 12:28:46.310482デフォルトの名無しさん
2012/11/24(土) 12:32:52.070483デフォルトの名無しさん
2012/11/24(土) 12:42:16.89もうみんな複雑さにうんざりしてる感じ?
0484デフォルトの名無しさん
2012/11/24(土) 12:48:37.040485デフォルトの名無しさん
2012/11/24(土) 12:52:35.000486デフォルトの名無しさん
2012/11/24(土) 13:01:46.060487デフォルトの名無しさん
2012/11/24(土) 13:25:24.44実体毎にループ処理が作られるのでちょっとキモい
0488デフォルトの名無しさん
2012/11/25(日) 20:29:55.280489デフォルトの名無しさん
2012/11/25(日) 22:00:45.38って未実装?
//g++ -std=c++11 a.cpp(バージョン4.7.2)
struct X {
static constexpr value = 1.0;
};
int main()
{
X x;
}
でリンカエラーになるのですが。
0490デフォルトの名無しさん
2012/11/25(日) 22:24:23.38完全なソースとエラーメッセージをコピペしましょう。
0491デフォルトの名無しさん
2012/11/25(日) 22:26:31.740492デフォルトの名無しさん
2012/11/25(日) 22:30:04.59static constメンバをクラス内で初期化できるのは
int型だけだよ。
0493デフォルトの名無しさん
2012/11/25(日) 22:39:05.83WindowsのBCCならCでもC++でも同じコマンドでいけるのにね
りなっくすだと何かとても覚えきれないほどややこしかったよ
調べながらなんとかコンパイルできるようになったけど
次から手打ちできる気がしなかったからシェルスクリプトにしといたよ
あのシェルスクリプトなくしたら僕もうコンパイルできないよ
0494デフォルトの名無しさん
2012/11/25(日) 22:39:44.64なんか再現に苦労してしまっている。もうちょっと待ってください。
0495デフォルトの名無しさん
2012/11/25(日) 22:42:13.96g++の場合double含めた数値型が使用できた気がする
0496デフォルトの名無しさん
2012/11/25(日) 22:51:54.82この機能はC++11の話です。>>492
struct X {
double value;
static constexpr double data = 1.0;
X(): value(-data) {}
};
int main()
{
X x;
}
これでリンカエラー。
X(): value(data) {}
に変えるか、あるいは
X x();
とすれば通る。
0497デフォルトの名無しさん
2012/11/25(日) 22:55:07.23clang++ -std=c++11 a.cpp
なら通るけど
(GCC4.7.2)
g++ -std=c++11 a.cpp
では通らない。
0498デフォルトの名無しさん
2012/11/25(日) 23:37:41.71X x();
でコンパイルして実行したとき、X(): ... {}
は呼ばれてないな。誰が呼ばれたw
0499デフォルトの名無しさん
2012/11/25(日) 23:40:33.010500デフォルトの名無しさん
2012/11/25(日) 23:41:36.78どう修正すればいいの?
explicit X(): ... {}
にしてもダメだった。
0501デフォルトの名無しさん
2012/11/25(日) 23:42:45.15変数宣言を X x{}; にする。
0502デフォルトの名無しさん
2012/11/25(日) 23:43:00.91{
X x();
}
が関数宣言と思われるってこと?そんなのアリ?
0503デフォルトの名無しさん
2012/11/25(日) 23:45:28.780504デフォルトの名無しさん
2012/11/25(日) 23:46:39.28できた。
元のコード、
int main()
{
X x{};
}
としてください。
value(-data)でリンカエラー。
value(data)に変えると期待通りです。
0505デフォルトの名無しさん
2012/11/25(日) 23:48:19.80C++11から出てきた話?それとも元から注意すべきだった?
話の本筋とはズレてたけどありがとう。とりあえず助かった。
0506デフォルトの名無しさん
2012/11/26(月) 00:05:15.08昔から。昔のstd::list<std::map<T>> hoge; の>>がシフト演算子と解釈されてたのと同じようなもん。
こっちは本当に区別不能だからC++11じゃ{}っていうのがOKになって解決したけど。
0507デフォルトの名無しさん
2012/11/26(月) 00:43:21.490508デフォルトの名無しさん
2012/11/26(月) 02:00:38.260509デフォルトの名無しさん
2012/11/26(月) 02:05:52.650510デフォルトの名無しさん
2012/11/26(月) 02:16:01.02*「クソが」
0511デフォルトの名無しさん
2012/11/26(月) 02:32:39.730512デフォルトの名無しさん
2012/11/26(月) 02:38:30.34コンパイラ「仕様通りの実装だといつから錯覚していた」
マ「ぐぬぬ」
0513デフォルトの名無しさん
2012/11/26(月) 07:21:44.64関数宣言と見なされるだけで
0514デフォルトの名無しさん
2012/11/26(月) 08:18:33.97>>504
0515デフォルトの名無しさん
2012/11/26(月) 08:31:53.59に対して
reinterpret_cast<complex<double>>(arr);
的なことは可能ですか?
C++11なら逆は可能と仕様に書いてありますが、この場合は記述がないので無理なのでしょうか?
0516デフォルトの名無しさん
2012/11/26(月) 09:56:22.73data が ODR-use されてるけど定義が無い、ってことじゃないの?
constexpr double が ODR-use される条件は詳しく見てないけど。
0517デフォルトの名無しさん
2012/11/26(月) 18:31:51.81なるべく効率的な方法でやるとするとどういったものがあるのでしょうか
0518デフォルトの名無しさん
2012/11/26(月) 18:44:28.820519デフォルトの名無しさん
2012/11/26(月) 19:09:57.77そうだよな。はじめて出くわした時はなんでってなるがな
0520デフォルトの名無しさん
2012/11/26(月) 20:00:18.75あんな方法やこんな方法でできるけどお前には無理。
0521デフォルトの名無しさん
2012/11/26(月) 23:52:57.11ところで X(): value(data) {} に変えると通るのは何で?
0522デフォルトの名無しさん
2012/11/27(火) 00:03:58.90規格上は保障されないんだろうな
0523デフォルトの名無しさん
2012/11/27(火) 00:40:20.31reinterpret_cast<complex<double>*>(arr);
の間違いだよな
complex<double>としてあり得ない値というのがあるなら
安全性を保てないという意味でダメなのだと思う
例えば、実部が NaN で虚部が NaN でないとか、
complex<double>としてはあり得ない値になるんじゃないのかな? 多分
そして、そういう値を使って演算した結果は
complex<double>の考慮外の結果を引き起こす可能性はあると思う
そういうのを度外視して、ちゃんとした値が入っている事が保証されている状況であれば、
可能であると言ってもいいんじゃないかと思う
0524デフォルトの名無しさん
2012/11/27(火) 07:26:19.25引数チェックなんてしてるのか?
0525デフォルトの名無しさん
2012/11/27(火) 08:53:06.87struct X { int m; };
int i;
X *p = reinterpret_cast<X*>(&i);
みたいなのですらpが正当なXへのポインタである保障はないってだけだろ
0527デフォルトの名無しさん
2012/11/27(火) 12:15:40.28その点が未解決です。>>516がヒントなんだろうけど、そこまで詳しくないから。
ちなみにC++03のように、クラス外に改めてdataの宣言をすれば通ります。
0528デフォルトの名無しさん
2012/11/27(火) 12:20:53.47サンクス。やっぱ微妙だな。
>>524,525
想定している使い道は、
double arr[2*N];
//arrに色々書き込む
complex<double> half[N];
//arrをhalfにmove
って話です。
もしarrが動的に確保されててmove後にarrを破壊したら
halfはどうなっちゃうの?とか、よく分かっていないw
0529デフォルトの名無しさん
2012/11/27(火) 13:41:08.190530デフォルトの名無しさん
2012/11/27(火) 14:29:11.430531デフォルトの名無しさん
2012/11/27(火) 14:29:28.29基底クラスに必要な情報以外は削ぎ落とせ、というプログラマ明確な意思表示に対する正当な動作です。
0532デフォルトの名無しさん
2012/11/27(火) 19:34:08.57その用途なら
complex<double> half[N];
double *arr = reinterpret_cast<double*>(half);
としてarrを配列として使うべきだろ
0533デフォルトの名無しさん
2012/11/27(火) 20:37:31.18どうしてこのプリプロセッサ条件で上手くいくん?
#ifdef __GXX_EXPERIMENTAL_CXX0X__
constexpr T real() { return _real; }
…
#else
T& real() { return _real; }
const T&real() const { return _real; }
…
#endif
0534デフォルトの名無しさん
2012/11/27(火) 21:24:34.99上手くいくん?ってのは「ぼくのかんがえではうまくいかないはずなのにこれでいいんですか?」って意味だろうが
君の考えは君以外の誰も知らないんだからそれだけでは誰もまともに答えられない
0535デフォルトの名無しさん
2012/11/27(火) 21:48:10.45だが、「なぜか」を説明するのは難しい。
0536デフォルトの名無しさん
2012/11/27(火) 21:58:52.860537デフォルトの名無しさん
2012/11/27(火) 22:11:35.07いや、reinterpret_cast<double*>(&c) が well-formed である以上、
そのポインタを使っていかようにも値は書き換えられることになる
だからその点は問題ないはず
何かあるとすればcomplex<double>に
特別なアラインメントを要請する実装があった場合くらいか
0538デフォルトの名無しさん
2012/11/27(火) 23:18:05.47GCC の仕様がそうなってるから。
-std=c++0x とかがオプションで与えられると __GXX_EXPERIMENTAL_CXX0X__ が定義される。
http://gcc.gnu.org/viewcvs/trunk/gcc/c-family/c-cppbuiltin.c?revision=188178&view=markup の 718 行目。
0539デフォルトの名無しさん
2012/11/27(火) 23:27:08.350540デフォルトの名無しさん
2012/11/27(火) 23:35:13.81俺はむしろ #else 側の実装が気持ち悪くて、やるべきことをやってくれたと見ている
0541デフォルトの名無しさん
2012/11/27(火) 23:50:40.54(双方が Standard-layout type へのポインタ型でかつアラインメントが許せば)
reinterpret_cast による異なる(オブジェクト)型へのポインタの変換は、
C++11 においては void* を経由する 2 回の static_cast と同じ結果になると
規定が変更された。
void* への変換結果はオブジェクトの先頭を指す(まま)、という規定は以前から存在するため、
結果として reinterpret_cast による異なるポインタ型への変換は、
A→B→A で元に戻した場合以外は unspecified から、同じアドレスを指したままの変換、へと
挙動が変更されたことになる。
ということで reinterpret_cast で片方向の変換が OK であれば逆方向の変換も仕様上 OK としていいと思う。
0542デフォルトの名無しさん
2012/11/28(水) 00:10:15.26char* から double* への reinterpret_cast も可能だけど
アクセス可能かどうかは環境依存だな
double がアラインメント揃ってないと死ぬ事もあるし
0543デフォルトの名無しさん
2012/11/28(水) 00:10:17.550544デフォルトの名無しさん
2012/11/28(水) 13:15:54.47standard layout type とかアラインメントを置いとくとして。
void * からの変換については static_cast の項に書かれていてその通り(行って戻るT*->void*->T*場合のみ元に戻る)。
一方、void* への変換は pointer conversion の項に書かれていて先頭を指すと記述されている。
この両方(行って戻ると先頭を指す)を満たすためには、void* からの変換についても先頭を指したままである必要がある。
この解釈が認められない場合、標準の範囲内では例えば unsigned char* を char* に妥当に変換する手段が規定されていないことになる。
(あるいは適当な型へのポインタ型を char* に変換してバイト単位でアクセスできない、とか)
さすがにそれはないだろうし、DR658 の記述からみても妥当な解釈だと思うけど。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#658
0545デフォルトの名無しさん
2012/11/28(水) 21:53:34.64typedef double T;
std::complex<T> c(1.0,1.0);
std::array<T,2> a;
std::copy_n(reinterpret_cast<T(&)[2]>(c),2,&a[0]);
std::copy_n(&a[0],2,reinterpret_cast<T(&)[2]>(c));
これで大丈夫なのか?
対称に書けてよろしいけど、
std::vector<T> c;
とか
std::valarray<T> c;
(aじゃないよ!)に対して同じコードではコンパイルは通るけど実行時にぐちゃぐちゃ(可変長だから?)。
結局reinterpret_cast<T*>(...)が万能ってことだろうか・・・。
0546デフォルトの名無しさん
2012/11/28(水) 22:04:23.75動的なstd::vectorとかstd::valarrayでは&c[0]にコピーするしかなさそう。
0547デフォルトの名無しさん
2012/11/28(水) 22:10:10.66>>546
の判別ってtype_traitsのstd::is_xxx<...>でできる?
0548デフォルトの名無しさん
2012/11/28(水) 22:15:00.48が0か2かでいけるかも。
これよりいい方法あるかしら?
0549デフォルトの名無しさん
2012/11/28(水) 23:48:09.71いや、なにがしたいの?
typedef double T;
std::complex<T> c(1.0,1.0);
std::array<T,2> a;
std::copy(reinterpret_cast<T*>(c), reinterpret_cast<T*>(c) + 2, a.begin());
std::copy(a.begin(), a.end(), reinterpret_cast<T*>(c));
そしてどういう意味?
>(aじゃないよ!)
complexがcでただのT(double)の集合がaじゃないの?
0550549
2012/11/29(木) 01:05:04.710551デフォルトの名無しさん
2012/11/29(木) 17:16:40.590552デフォルトの名無しさん
2012/11/29(木) 17:20:11.740553デフォルトの名無しさん
2012/11/29(木) 18:45:56.110554デフォルトの名無しさん
2012/11/29(木) 21:58:35.34https://ideone.com/Pmldk
これどういうこと?未実装?
0555デフォルトの名無しさん
2012/12/01(土) 01:44:12.900556デフォルトの名無しさん
2012/12/01(土) 01:52:03.890557デフォルトの名無しさん
2012/12/01(土) 07:22:42.47error C2784: 'bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)' : テンプレート 引数を 'const std::_Tree<_Traits> &' に対して 'const std::string' から減少できませんでした
というエラーが出ています。
STL初心者です。
こんな風(↓)に使っています。たぶんconst char *とstd::stringの間で変換できないから?かなーと思うのですが、何分初心者なので。。
HANDLE _get_handle(const char * key)
{
HANDLE hFile;
std::map<std::string, HANDLE>::iterator it;
if((it = gFileTable.find(key)) == gFileTable.end())
{
return INVALID_HANDLE_VALUE;
}
else
{
return (HANDLE)(it->second);
}
}
適切な使い方をご教授いただけると助かります。
以上、よろしくお願い致します。
0558557
2012/12/01(土) 07:25:46.38#include <string>が抜けてました。。。。。。。。。。。。。。。。
0559デフォルトの名無しさん
2012/12/01(土) 07:47:10.11まあでも車輪の再発明も、勉強という意味では悪くないよね・・・
0560デフォルトの名無しさん
2012/12/01(土) 08:30:09.83設計能力が鍛えられてないんじゃないかと思う
0561デフォルトの名無しさん
2012/12/01(土) 11:31:45.02下々にはコピペ業をいとなむコードモンキーという動物がおってだな・・・
0562デフォルトの名無しさん
2012/12/01(土) 12:45:43.43Windowsでは/をUnixでは-を使うのがルールなんですか?
winで-使ったら怒られますか?
0563デフォルトの名無しさん
2012/12/01(土) 12:47:43.920564デフォルトの名無しさん
2012/12/01(土) 12:51:58.260565デフォルトの名無しさん
2012/12/01(土) 13:12:00.070566 忍法帖【Lv=40,xxxPT】(2+0:5)
2012/12/01(土) 17:10:02.130567デフォルトの名無しさん
2012/12/01(土) 18:15:52.03ぶっちゃけCUIアプリケーションの利用者層はusage:みたいなの見て勝手に合わせて使ってくれるから無問題
0568デフォルトの名無しさん
2012/12/03(月) 15:26:13.32D:\work>attrib /?
ファイル属性を表示または変更します。
ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] [[ドライブ:] [パス] ファイル名]
[/S [/D]]
+ 属性を設定します。
- 属性を解除します。
R 読み取り専用属性。
A アーカイブ属性。
S システム ファイル属性。
H 隠しファイル属性。
/S 現在のディレクトリとすべてのサブフォルダの一致するファイルを
処理します。
/D フォルダも処理します。
0569デフォルトの名無しさん
2012/12/03(月) 15:57:00.110570デフォルトの名無しさん
2012/12/03(月) 16:15:51.37ファイル属性を表示または変更します。
ATTRIB [+R | -R] [+A | -A ] [+S | -S] [+H | -H] [+I | -I]
[ドライブ:][パス][ファイル名] [/S [/D] [/L]]
+ 属性を設定します。
- 属性を解除します。
R 読み取り専用属性。
A アーカイブ属性。
S システム ファイル属性。
H 隠しファイル属性。
I 非インデックス対象ファイル属性。
[ドライブ:][パス][ファイル名]
attrib で処理するファイルを指定します。
/S 現在のフォルダーとすべてのサブフォルダーの一致するファイルを
処理します。
/D フォルダーも処理します。
/L Symbolic Link のターゲットに対する Symbolic Link
の属性で動作します。
0571デフォルトの名無しさん
2012/12/12(水) 00:20:01.77ライブラリを作成してるのですが、Gui用とコンソール用で分けた方がいいでしょうか?
それとも一括で管理してしまって良いでしょうか?
0572デフォルトの名無しさん
2012/12/12(水) 07:25:45.60そうでもなければ一緒でいいんじゃない?
0573デフォルトの名無しさん
2012/12/12(水) 07:44:18.260574デフォルトの名無しさん
2012/12/12(水) 08:34:20.97ライブラリ内で
#include <Windows.h>
しているのですが、コンソールアプリケーションを作るときは必要ないのでどうしようか迷って質問しました
Gui作るときに毎回2つリンクさせるのが面倒ですし、重複した場合修正するのが2度手間になるので一緒にすることにしました
0575デフォルトの名無しさん
2012/12/12(水) 11:31:43.92>ライブラリ内で#include <Windows.h>しているのですが、コンソールアプリケーションを作るときは必要ない
この時点で仕様が違うんだから別々にするべきだろ。
ソースは一つでも複数のターゲットを生成することくらいプロジェクトの設定でどうにでもなるだろ。
0576デフォルトの名無しさん
2012/12/12(水) 18:36:14.94そのメンバ関数をたくさん呼び出すなら、メンバ変数にした方がいいでしょうか?
0577デフォルトの名無しさん
2012/12/12(水) 18:42:15.86ぁあ、プロジェクトの設定毎回しなくていい方法見つけた
ありがとう
0578デフォルトの名無しさん
2012/12/12(水) 19:05:52.12void Foo::foo()
{
char *s = "baz";
}
みたいなの?だったら実行ファイルに格納されててsにポインタが入るだけ(文字列分の領域はかくほされない)だけど
0579デフォルトの名無しさん
2012/12/12(水) 19:08:32.240580デフォルトの名無しさん
2012/12/19(水) 16:23:17.95{
typedef bool ( BBB::*func_type )();
func_type func;
int a;
int b;
};
BBB bbb = BBB();
これでbbbが0で初期化されません
メンバ関数ポインタが入っているとPODにはならないんでしょうか。
0581デフォルトの名無しさん
2012/12/19(水) 16:26:36.200582デフォルトの名無しさん
2012/12/19(水) 17:10:16.48「BBB::」を消せばいいのでは?
0583デフォルトの名無しさん
2012/12/19(水) 17:22:52.82メンバ関数じゃないとだめなので
0584デフォルトの名無しさん
2012/12/19(水) 18:16:12.20グローバルの話?なら=BBB()をどけろ。そいつで未初期化の一時オブジェクトが用意されて0初期化済みのオブジェクトに代入されてるから。
ローカルの話だとしても、=BBB()で、新たに用意された未初期化の一時オブジェクトから代入されてるだけたから
だいたい、括弧をつけることで0初期化されるのは単体のnewの時だけだから。
ローカルなオブジェクトを作ったときに括弧を付けたって、コンパイラにプロトタイプ宣言と間違われて、エラー吐かれるだけだからな?
PODを想定してて、それを0初期化したいなら、素直に = {}付けとけ。={0,}でもいいけど
0585デフォルトの名無しさん
2012/12/19(水) 18:22:34.570586デフォルトの名無しさん
2012/12/19(水) 18:52:10.40だと0で初期化されて
typedef bool ( BBB::*func_type )();
だとされないのは仕様ですか?
0587デフォルトの名無しさん
2012/12/19(水) 20:03:28.100588デフォルトの名無しさん
2012/12/19(水) 21:15:11.98そのソースのとおりなら0初期化されるわけがない
BBB()はデフォルトコンストラクタの呼び出し
BBBにはユーザー定義のデフォルトコンストラクタがないので暗黙に次のように定義される BBB() {}
これはメンバ初期化子リストを持たないので各メンバはデフォルト初期化される
組み込み型のデフォルト初期化はなにもせず値は不定値になる
BBBを0初期化したければアグリゲートだから BBB bbb = {}; とする
0589デフォルトの名無しさん
2012/12/19(水) 21:16:42.22これで0になるってのは仕様で決まってないってことですか?
0590デフォルトの名無しさん
2012/12/19(水) 21:44:28.700591デフォルトの名無しさん
2012/12/19(水) 22:21:16.82JISのほうは該当部分に誤訳があるから注意
0592デフォルトの名無しさん
2012/12/19(水) 22:38:29.40NULLで分割されているchar配列StrBuffを分解したいんですけど、メモリエラーが出ます。
どうすればいいですか?
0593デフォルトの名無しさん
2012/12/19(水) 22:46:10.370594デフォルトの名無しさん
2012/12/19(水) 23:01:51.06うろ覚えだけど当たればラッキー
strtok(strBuf, "0");
0595デフォルトの名無しさん
2012/12/19(水) 23:04:52.61strtok(strBuf, "\0");
0596デフォルトの名無しさん
2012/12/20(木) 00:06:17.41NULLが連続して入ります
>>595
ありがとう、できた!
0597デフォルトの名無しさん
2012/12/20(木) 00:08:37.70最初の分解した要素までが元々の文字列だからstrtok(NULL,NULL)ができない・・・
0598デフォルトの名無しさん
2012/12/20(木) 00:36:56.59普通に strlen で分割しろよ
0599デフォルトの名無しさん
2012/12/20(木) 00:46:45.12ヌルポインタ定数 NULL と ASCII コード 0 NUL '\0' とをごっちゃにするんじゃねぇ。
http://www.kouno.jp/home/c_faq/c5.html#9
0600デフォルトの名無しさん
2012/12/20(木) 01:05:05.16試してみたら問題ないみたいだけど、「0で初期化されません」って何を見て言ってるの?
http://ideone.com/EY723z
メンバへのポインタも POD かどうかの判定では他のポインタと区別されることは無いよ。
3.9 [basic.types] p9
> BBB bbb = BBB();
このコードで、ゼロ初期化された BBB 型の一時オブジェクトから bbb がコピー初期化
されることになる。
>>584,588,590 あたりでいろいろ書かれてるけど、たぶんおかしい。
BBB() はゼロ初期化された POD 型の一時オブジェクトを得る式として有効。
5.2.3 [expr.type.conv] p2 および 8.5 [dcl.init] p7
0601デフォルトの名無しさん
2012/12/20(木) 01:37:09.77そのコードの実行結果を参考にしちゃいけないと思うけど、言ってることは>>600が正しいんじゃないかな
0602デフォルトの名無しさん
2012/12/20(木) 11:05:05.41VC2010で試したらbbb.a,bbb.b,bbb.funcがどれも不定の値でした
0603デフォルトの名無しさん
2012/12/20(木) 15:19:29.27よくわからないのですが、できた・・?
http://codepad.org/X8ffqtZJ
区別する必要は皆無、区別するのはわかっていない証拠、全部「0」と書いて無問題。
http://www.kouno.jp/home/c_faq/c5.html#9
0605デフォルトの名無しさん
2012/12/20(木) 20:30:12.24よく置換対象を指定するときに使われる${ABC}の括弧部分ってなんていうんでしょうか?
何か名前があった気がするんですが思い出せなくて・・・お願いします。
0606デフォルトの名無しさん
2012/12/20(木) 20:39:37.02マクロス
0607デフォルトの名無しさん
2012/12/20(木) 20:46:30.58カーリーブラケット
0608デフォルトの名無しさん
2012/12/20(木) 20:51:09.800609デフォルトの名無しさん
2012/12/20(木) 21:54:42.680610デフォルトの名無しさん
2012/12/20(木) 23:53:37.940611デフォルトの名無しさん
2012/12/20(木) 23:59:42.69Cみたいに((void*)0)で定義してはいけないけど、
0と定義してもいいし、ヌルポインタを表す特殊な値で定義しても構わない
実際g++では__nullと定義している
0612デフォルトの名無しさん
2012/12/21(金) 00:11:38.36その「試した」の中身を聞いてるんだよ。
どんなコードで、何を(標準出力に出したもの?デバッガの表示?)を見たのか、と。
0613デフォルトの名無しさん
2012/12/21(金) 00:15:17.04規格違反があったら知らん
0614デフォルトの名無しさん
2012/12/21(金) 02:19:04.59通常のint変数とかだと、ストア命令1つで済むので、他スレッドが割り込んでしまう余地はないと思いますが、
構造体変数の場合、各メンバの代入に複数回のストア命令発行が必要になるので、
他スレッドが割り込んでしまう余地ができてしまうのではないかと思うのですが・・・
0615デフォルトの名無しさん
2012/12/21(金) 02:25:37.660616デフォルトの名無しさん
2012/12/21(金) 03:36:36.79>通常のint変数とかだと、ストア命令1つで済むので、他スレッドが割り込んでしまう余地はない
マルチコアの場合はそうともいえないのでは?
0617デフォルトの名無しさん
2012/12/21(金) 04:45:37.51香ばしすぎて俺には無理だったw
0618デフォルトの名無しさん
2012/12/21(金) 07:08:36.15>通常のint変数とかだと、ストア命令1つで済むので、他スレッドが割り込んでしまう余地はない
メモリバリアでググれ
0619デフォルトの名無しさん
2012/12/21(金) 10:17:09.28struct BBB
{
typedef bool ( BBB::*func_type )();// タスクの型名
func_type func;
};
int main()
{
BBB bbb = BBB();
printf( "%d\n", bbb.func );
return 0;
}
こうです。デバッガで見ても出力してもbbb.funcは不定値でした。
メンバ関数ポインタではなく普通の関数ポインタにすると0になります。
0620デフォルトの名無しさん
2012/12/21(金) 11:22:36.25いずれにせよ期待値を保証したいなら明確に初期化するべき。
定義時の自動初期化は暗黙の動作ということも忘れずに。
0621デフォルトの名無しさん
2012/12/21(金) 12:16:32.20http://stackoverflow.com/questions/3931312/value-initialization-and-non-pod-types
0622デフォルトの名無しさん
2012/12/21(金) 20:52:26.840623614
2012/12/21(金) 22:14:18.93やはりそうでしたか・・・
>>616
例えば、スレッドAで更新した変数を、スレッドBで参照するとき、
更新前、更新後どちらを読んでも支障がないような処理の場合は問題ないと言えますよね?
例えば、スレッドAは常にフル回転していて、そのときどきの状態を表す変数を更新し、
スレッドBは適当なタイミングでその変数をサンプリングしてGUIに表示するというようなケースです。
構造体の場合で、それを構成する複数のメンバ変数の整合が取れている必要があるとき(座標値など)は、
あるメンバだけは更新後を、他のメンバは更新前を参照してしまうのでは、と心配になります。
>>618
ありがとうございます。
やはり明示的に命令してやらんといかんのですね・・・。
調べていると、C++11ではstd::atomicという便利そうなライブラリが追加されたみたいなので、
これを使ってみようと思います。
じつは、つい先日、汎用性は低いものの、同じような自作ライブラリを作ってましたが(汗)
0624デフォルトの名無しさん
2012/12/21(金) 22:21:20.43マルチスレッドはよくわからん
0625デフォルトの名無しさん
2012/12/21(金) 22:43:51.530626デフォルトの名無しさん
2012/12/21(金) 22:45:13.960627デフォルトの名無しさん
2012/12/21(金) 23:20:46.300628デフォルトの名無しさん
2012/12/22(土) 07:21:24.650629デフォルトの名無しさん
2012/12/22(土) 15:05:27.62class Base
{
0630デフォルトの名無しさん
2012/12/22(土) 15:07:29.510631デフォルトの名無しさん
2012/12/22(土) 15:08:44.38class Base
{
...
public:
Base* getInstance(Handle handle);
}
class Drive : public Base
{
...
}
これでDriveを呼びだそうとすると
Drive* drive = reinterpret_cast<Drive*>(Drive::getInstance(handle));
となってしまって、reinterpret_castも使う上に若干助長な気がするんですが
何かもっとスマートな方法ってありますか?
0632デフォルトの名無しさん
2012/12/22(土) 15:09:34.170633デフォルトの名無しさん
2012/12/22(土) 15:19:54.860634デフォルトの名無しさん
2012/12/22(土) 15:50:27.460635デフォルトの名無しさん
2012/12/22(土) 15:57:24.59BaseとDriveの使い方次第な話なんですかね?今の場合Baseは単にnewとdeleteを特定のメモリ
から取るアロケーター的なものですが
今思いついたのはtemplateにすれば多少見た目良くなるかなあと
0636デフォルトの名無しさん
2012/12/22(土) 16:00:52.600637デフォルトの名無しさん
2012/12/22(土) 16:05:19.560638デフォルトの名無しさん
2012/12/22(土) 16:07:03.46Baseに必要な仮想関数を定義すればいいって話だろうが
0639デフォルトの名無しさん
2012/12/22(土) 16:09:15.490640デフォルトの名無しさん
2012/12/22(土) 16:09:15.78struct Base{
static T* getInstance(Handle handle);
};
class Drive : public Base<Drive>
その使い方ならアップキャストしなくていいだろうからCRTPでいいよね
0641デフォルトの名無しさん
2012/12/22(土) 16:13:11.52うおお目からウロコです
CRTP,初めて知りました、やってみます
0642デフォルトの名無しさん
2012/12/22(土) 16:22:15.570643デフォルトの名無しさん
2012/12/22(土) 16:54:51.490644デフォルトの名無しさん
2012/12/22(土) 16:58:02.830645デフォルトの名無しさん
2012/12/22(土) 17:53:12.230646デフォルトの名無しさん
2012/12/23(日) 02:46:09.100647デフォルトの名無しさん
2012/12/23(日) 09:34:36.990648デフォルトの名無しさん
2012/12/23(日) 09:43:11.37IDE上でコードを叩く姿は十分に厨二らしいのではなかろうか
0649デフォルトの名無しさん
2012/12/23(日) 13:38:27.72#include <functional>
int (*func)(int, int, void*)
↑上の型に変換したい
int (CSample::*func)(int, int, void*)
std::function<int (int, int, void*)> にはstd::bindを使うことで変換できるのですが、
これを int (*func)(int, int, void*)型に変換するにはどういった処理をするとよいのでしょうか?
0650デフォルトの名無しさん
2012/12/23(日) 13:41:34.700651デフォルトの名無しさん
2012/12/23(日) 13:50:14.24足りなくなる引数 CSample* を静的変数あたりから引っ張ってくるラッパーをかませば可能だろう。
「よい」かどうかは知らない。
0652デフォルトの名無しさん
2012/12/23(日) 13:51:42.23int (*func)(int, int, void*)
これは引数として固定されているので、うまく変換したいんです・・・
0653デフォルトの名無しさん
2012/12/23(日) 14:05:19.58int func(int a, int b, void * q) {
p->func(a, b, q);
}
0654デフォルトの名無しさん
2012/12/23(日) 17:38:55.48それシグネチャ一致してないのは理解してるん?
暗黙のthisポインタを埋めないと、変換もクソもない
0655デフォルトの名無しさん
2012/12/23(日) 17:45:27.86どういう関数かは分からんが、
普通は void* に this ポインタが渡されるようにして、
static メンバ関数を func に渡して
その static メンバ関数内で
渡されてきた this ポインタを使って非 static メンバ関数を呼ぶ
class CSample {
static int Func(int x, int y, void* self) {
return static_cast<CSample*>(self)->Func(x, y);
}
int Func(int x, int y) {
// ここで処理
}
};
0656649
2012/12/23(日) 19:09:51.230657デフォルトの名無しさん
2012/12/23(日) 19:21:15.070658デフォルトの名無しさん
2012/12/23(日) 21:57:13.07キャッシュメモリに関しては、IA-32やIA-64のマルチコアCPUでは
<今のところは>コア間のキャッシュメモリの一貫性をハードウェアで自動的にとってくれるから
危険性は無く、プログラマは実行効率のみ気にしていれば良い
実験的に作られてたりしている48コアとかのやつはそうではないらしいが
それよかマルチコア構成ではキャッシュメモリよりもOoO(Out of Order実行)の影響が危険なのだが
VC++2005以降ならvolatileでおk
メモリフェンスをきちんとやってくれるようにvolatileの仕様変更がなされた
ttp://yamasa.hatenablog.jp/entry/20090720/1248089123
0659デフォルトの名無しさん
2012/12/23(日) 22:04:03.02わしこの仕事向いてないかも
0660デフォルトの名無しさん
2012/12/23(日) 22:06:36.76それはあくまでintだけでしょ?
0661デフォルトの名無しさん
2012/12/23(日) 22:30:52.04a&=~!(a&x);の結果が正しいかどうかなんか考察したく無いよ
0662デフォルトの名無しさん
2012/12/23(日) 22:34:15.130663デフォルトの名無しさん
2012/12/26(水) 08:21:48.83「割り込み内で利用する変数に使う」みたいなこと書かれていたように思いますが
変数を確保したメモリー空間に対して排他制御するわけでもなく
勝手にスレッドセーフにしてくれるわけでもないですよね?
volatile char xxx[256];
とか意味あるのかな?と
0664デフォルトの名無しさん
2012/12/26(水) 08:31:25.220665デフォルトの名無しさん
2012/12/26(水) 08:38:36.10C#やった後だとすごい違和感あるんだが?
0666デフォルトの名無しさん
2012/12/26(水) 09:16:11.07>volatile ってどういう風に効くんですか?
組込み系で、特定のハードウェア端子をオン・オフするのに使う事もある。
0667デフォルトの名無しさん
2012/12/26(水) 09:21:30.57人それぞれだね。
使いすぎると全部グローバルになっちゃうからな。
0668デフォルトの名無しさん
2012/12/26(水) 09:49:04.57メモリバリアを作りたいのならmutexやクリティカルセクションなどOS呼び出ししないと変なバグに悩まされる
0669デフォルトの名無しさん
2012/12/26(水) 12:23:31.26C#のusingとC++のusingって意味がちがくね?
0670デフォルトの名無しさん
2012/12/26(水) 12:33:13.490671デフォルトの名無しさん
2012/12/26(水) 12:54:29.71組み込みのプログラムなどで、メモリマップドI/O(アドレスにチップ信号が
出てくるようなメモリマップ)をアクセスする時なんかに使う。
ある変数に入っている値は、通常「演算しない限り不変である」と判断して
毎回読まないでレジスタ上の値を再利用するようにコンパイルされる。
これをやると、コンパイラが知らないところで値が書き換わるような構造は
対応できない。
そこで「この変数は毎回読まないと信用できませんよ」ということをコンパイラ
に教えてやるために使うキーワード。
ただし排他制御とは違う概念なので、マルチスレッドの変数ロックには別途
それ専用の仕組みを使う必要がある。
0672デフォルトの名無しさん
2012/12/26(水) 19:06:10.59まともなC++コンパイラ(gccとかclang)なら使えるはず。
0673デフォルトの名無しさん
2012/12/26(水) 19:13:37.810674デフォルトの名無しさん
2012/12/30(日) 14:45:46.520675デフォルトの名無しさん
2012/12/30(日) 15:05:20.850676デフォルトの名無しさん
2013/01/01(火) 08:28:43.46できないと今の今まで思っていたわけですが、
C++でclassを介するとできてしまった↓
http://codepad.org/ohNwTXOF
これって何か落とし穴とか弊害とか無い?
(例えば、環境によっては別の大域関数シンボルと人知れず被ることがある、とか
0677デフォルトの名無しさん
2013/01/01(火) 08:41:16.73※ Bar::frac( ) から main( ) のローカル変数にアクセスできない。
まあ、正しい構文だし、別に弊害はないと思う。
0678デフォルトの名無しさん
2013/01/01(火) 08:45:29.60>C系の言語はPascalと違い、関数の定義の入れ子(ローカル関数の定義)は
>できないと今の今まで思っていたわけですが、
Cでも、gccは可能。
>http://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html
6.4 Nested Functions
0679デフォルトの名無しさん
2013/01/01(火) 11:13:00.16C++11ではラムダを使ってローカル関数が作れるぞ
0680デフォルトの名無しさん
2013/01/01(火) 17:59:02.53変数のRAM上の内容と、レジスタにあるコピーの同期に関するキーワードなんですね
volatile 修飾すると、レジスタにコピーを残す最適化はできなくなって
毎回メモリ上の値を読まないといけないんですね
volatile は、最適化させないキーワードということでおk?
0681デフォルトの名無しさん
2013/01/01(火) 19:17:24.10○ 変数の値を毎回ロードする
レジスタ上にロードした変数の値を再利用しないのがvolatile
0682デフォルトの名無しさん
2013/01/01(火) 19:40:43.930683デフォルトの名無しさん
2013/01/01(火) 20:22:55.82横だが
ReadとWriteの順番を入れ替えたら毎回ロードしたうちにならないんんジャマイカ、
0684デフォルトの名無しさん
2013/01/01(火) 21:05:19.41volatile int a = 0;
foo += 4;
a = 3;
bar += 5;
とあったとき、foo += 4; と bar += 5; の間のタイミングで必ず a = 3; が行われるとかそういう意味
最適化で
a = 3; foo += 4; bar += 5;
とか
foo += 4; bar += 5; a = 3;
とかのように命令が移動されることは無いよ、と
foo や bar も volatile の時は特に重要で、
(CPUのではなく、メモリマップドI/Oで操作される)レジスタの操作順が保証されないと困る
0685デフォルトの名無しさん
2013/01/01(火) 21:18:04.39でっていう
例えば生成コード上でa = 3がbar +=5の後ろに移動したとしたら、
ソースリスト上でa = 3; の次にあるread modify writeであるbar +=5; のロードが行われないってことになるジャン
これはvolatileな変数を「毎回ロードする」という約束に反する
つまり>681のvolatileの定義は、命令の順番入れかえの禁止も必要条件として要請するから>681だけでおk
0686【補足】
2013/01/01(火) 21:23:01.82他のコアからは生成コード上の順序どおり実行されているように見えなかったりする
(自コアの読み書きの結果を自コアで参照する分には問題ない)
これがマルチコアではvolatileだけでは不足でメモリフェンスが必要な理由う
0687デフォルトの名無しさん
2013/01/01(火) 21:34:37.57?
別に順番が変わろうがロードする事に変わりないだろ?
0689デフォルトの名無しさん
2013/01/01(火) 22:02:23.86ロードに対する副作用の存在を仮定するか否かの違いがある
volatile変数への操作は他のvolatile変数への副作用があるものとして扱われる
(故に「ソースリストに現れた位置で」「毎回」(←これら重要)ロードする必要がある)
…と書いて気づいたが、>684の説明は、もしvolatileなのがaだけで、fooとbarが普通の非volatile変数なのだとしたら
fooやbarに対する操作と、a=3;との順後の前後は最適化で普通に起きるから間違いということに
0690デフォルトの名無しさん
2013/01/01(火) 22:07:25.30>>684
> foo や bar も volatile の時は特に重要で、
> (CPUのではなく、メモリマップドI/Oで操作される)レジスタの操作順が保証されないと困る
a に読み書きする毎に、メモリからレジスタに毎回ロードすることと、
volatile ではない foo や bar への命令順序って、やはり重要なんでしょうか?
一見、関係なさそうな…
0691デフォルトの名無しさん
2013/01/01(火) 22:08:38.38>>684
> foo や bar も volatile の時は特に重要で、
> (CPUのではなく、メモリマップドI/Oで操作される)レジスタの操作順が保証されないと困る
a に読み書きする毎に、メモリからレジスタに毎回ロードすることと、
volatile ではない foo や bar への命令順序って、やはり重要なんでしょうか?
一見、関係なさそうな…
0692デフォルトの名無しさん
2013/01/01(火) 22:11:58.57コンパイラの使命はもちろんプログラムの意味を買えずにソースコードからオブジェクトコードに翻訳することだが、
副作用が存在する場合としない場合とで最適化の立ち位置が変わってきますよ
副作用が存在する場合に副作用の存在を仮定しない最適化を行うとプログラムの意味が変わってしまいますよ、
とか
そんな感じの話
0693デフォルトの名無しさん
2013/01/01(火) 22:17:20.92で、
・volatile が a だけの場合、
・volatile が a, foo, bar の場合
でそれぞれ最適化での順番変更は
仕様上起こるんだっけ起こらないんだっけ
0694680=690=691
2013/01/01(火) 22:36:23.08> レジスタ上にロードした変数の値を再利用しないのがvolatile
> volatile変数への操作は他のvolatile変数への副作用があるものとして扱われる
これが根源的なんでしょうね…具体的な状況はよく分からないけど、そうだったら全て納得できる
そこから、命令の順番入れかえの禁止も必要条件として導かれる、と
foo や bar が volatile であるかどうか、が命令いれかえの禁止に関して
重要になってくるのかどうかは、よくわからないけどOTL
0695デフォルトの名無しさん
2013/01/01(火) 23:50:00.62> volatile変数への操作は他のvolatile変数への副作用があるものとして扱われる
だから、fooやbarがvolatileでなければ
順番変わってもいいということかいな?
0696デフォルトの名無しさん
2013/01/02(水) 07:50:43.35そもそも volatile ではない foo や bar はメモリー上に実体がないかもしれないしね。
0697デフォルトの名無しさん
2013/01/04(金) 12:09:02.99cppファイル単位でエラーチェックを行いたいと思いました
具体的には、ファイルの冒頭で
#define CHECK_ERR
だと組み込んだエラーチェック関数がコンソールにエラーを出力するというものです
エラー関数自体は異なるファイルで共通のものにしたいのですが、どうするのが楽でしょうか
愚直には
...
#ifdef CHECK_ERR
eprintf("err:%d\n",err);
#endif
...
を全チェックポイントに記述すればよいのですが
つまるところこの#ifdef~#endifをeprintfに組み込む方法ってありますでしょうか
0698デフォルトの名無しさん
2013/01/04(金) 12:20:47.860699697
2013/01/04(金) 12:23:10.09#ifdef CHECK_ERR
#define eprintf(...) printf(__VA_ARGS__)
#else
#define eprintf(,,,)
#endif
これを作っておき、各cppファイルでこのファイルをインクルードする前に
#deifne CHECK_ERR
を記述すればチェックポイントにはeprintfだけで済む気がします
ただ、ここまで思いついて気付いたのですがヘッダにもinline的な関数があるので
結局影響範囲が広大になってしまうんですよね・・・
#undef eprintf
#define eprintf(,,,)
も使うべきか
0700デフォルトの名無しさん
2013/01/04(金) 12:25:15.64ありがとうございます、windowsですので調べてみます
0701デフォルトの名無しさん
2013/01/04(金) 18:03:58.99ヘッダ内でそれをやろうとすると
どうやってもundefしないとダメな宿命だと思われ
0702デフォルトの名無しさん
2013/01/04(金) 19:48:00.12エラー出力すればいいんじゃないの。
0703デフォルトの名無しさん
2013/01/04(金) 20:11:21.050704デフォルトの名無しさん
2013/01/04(金) 20:26:04.24動くかどうかは知らん
[check_err.h] 最初にincludeする
#ifndef CHECK_ERR_H
#define CHECK_ERR_H
#include <stdio.h>
#define eprintf (!(CHECK_ERR)) ? (void)0 : (void)printf
#define CHECK_ERR 0
#endif
[main.cpp]
#include "check_err.h"
#undef CHECK_ERR
#define CHECK_ERR 1
#include "func1.h" // エラー出力有り
#undef CHECK_ERR
#define CHECK_ERR 0
#include "func2.h" // エラー出力なし
0705デフォルトの名無しさん
2013/01/05(土) 02:31:54.96可変個引数を使ってる安全な実装から劣化させてどうすんの
0706デフォルトの名無しさん
2013/01/05(土) 12:26:29.23可変長引数のインライン関数としてeprintf()を実装しておき、
ただしNDEBUG時は中を空にして最適化で除去されるのを気体する、
いやC++の言語仕様的にインライン関数で可変長引数を許しているかとか、
可変長引数な関数が空のとき最適化で本当に除去されるかとか未知数だが
上記でどうしてもダメなようなら、可変長引数が手の施しようのないガンだと特定されるので
YOU単発表示に切り替えなYO
#define EPRN(x) if (0) else std::cerr << #x << "=" << (x) << ";"
#define ENDL() if (0) else std::cerr << std::endl
として、NDEBUG時は上記マクロを空にする
0707706
2013/01/05(土) 12:30:44.28EPRN(a); EPRN(b); EPRN(c); EPRN(d); ENDL;
すると、
a=1;b=2;c=3;d=4;
こうなる
0708706
2013/01/05(土) 12:52:12.87#define EPRN(x) if (1) { std::cerr << #x << "=" << (x) << ";"; } else
#define ENDL() if (1) { std::cerr << std::endl; } else
何か処理を追加したくなったらthen節のブロックの中に普通に追加して良い(do { } while(0)でも可)
もしくは、WindousのTRACEn()系マクロ式にやっても可変長引数を排除できる
つまり、TRACE0(cap)、TRACE1(cap, x),、TRACE2(cap, x, y)、TRACE3(cap, x, y, z), ..., TRACE8(cap, x, y, z, aa, ab, ac, ad, ae, af)
を定義してやり、引数の数に応じてnの部分を変えて使い分ける
0709デフォルトの名無しさん
2013/01/05(土) 13:01:44.950710デフォルトの名無しさん
2013/01/05(土) 13:02:49.050711デフォルトの名無しさん
2013/01/05(土) 13:09:28.82#define eprintf(...) do { !(CHECK_ERR) ? (void)0 : (void)printf(__VA_ARGS__); } while(0)
0712デフォルトの名無しさん
2013/01/05(土) 13:11:02.71ドヤ顔で変なマクロをすすめるのはやめていただきたい
VC++なら __noop を使う方法をとれば
gcc なら __VA_ARGS__ を使う方法をとれば
比較的移植性は高い
最も移植性が高いのは括弧を二重にする方法
0713デフォルトの名無しさん
2013/01/05(土) 15:53:44.54# define eprintf_FILE_HPP() printf()
# ifndef eprintf
# define eprintf() eprintf_FILE_HPP()
# endif
#else
# define eprintf_FILE_HPP()
#endif
inline … eprintf_FILE_HPP();…}
0714デフォルトの名無しさん
2013/01/05(土) 21:16:11.210715デフォルトの名無しさん
2013/01/07(月) 20:51:08.17VC++でも__VA_ARGS__使えるからそれが一番いい。
__noopも便利なんだけど、移植性を考えるとちょっと躊躇するね。
0716デフォルトの名無しさん
2013/01/07(月) 21:51:01.160717デフォルトの名無しさん
2013/01/08(火) 22:57:58.66http://ideone.com/fFSgEN
けどコンパイルするとalgorithm内でNo matching function for call to 'swap'.と言われてしまいます
何が問題なのでしょうか
環境はapple llvm 4.1?とBoost 1.52.0です
0718デフォルトの名無しさん
2013/01/09(水) 00:58:29.61iterator_facade のテンプレート引数 Reference に T を指定してるのがおかしい。
参照なんだから T& にしないと。
http://www.boost.org/doc/libs/1_52_0/libs/iterator/doc/iterator_facade.html#id12
っていうか、そこ移行わざわざ指定しなけりゃ T& になるのに。
0719デフォルトの名無しさん
2013/01/09(水) 01:47:55.990720デフォルトの名無しさん
2013/01/09(水) 01:51:40.33ついでに言っとくとdereferenceの返却値型がint&に決めうちなのもおかしいぞ
0721デフォルトの名無しさん
2013/01/09(水) 22:26:16.05ありがとうございます
>>718
swap(int, int)は存在しえないからエラーになったという理解で良いんでしょうか
>>719
正直自分でもそう思います
>>720
凡ミスでした
T&ですね
0723デフォルトの名無しさん
2013/01/10(木) 02:20:34.53ありがとう
0724デフォルトの名無しさん
2013/01/11(金) 14:50:02.550725デフォルトの名無しさん
2013/01/11(金) 14:59:57.750726デフォルトの名無しさん
2013/01/12(土) 00:08:21.43書きやすいかどうかだけが基準じゃないだろ?
お前自分の会社の面接受けにきたやつが話しやすいってだけで雇うか?
0727デフォルトの名無しさん
2013/01/12(土) 00:12:32.750728デフォルトの名無しさん
2013/01/12(土) 00:14:43.24主観的すぎて赤の他人にわかるはずがない
0729デフォルトの名無しさん
2013/01/12(土) 00:28:59.86それは書類選考や試験が終わってる前提の話だろボケ
いきなり面接やって「話しやすいですね、はい内定」とかないからw
そんなのは一部のバイトだけだ
0730デフォルトの名無しさん
2013/01/12(土) 00:31:42.81その上で使いやすいかどうかって話だろ
0731デフォルトの名無しさん
2013/01/12(土) 00:35:42.82==>それが出来たら、あんた要らなくなるやん。
って話と一緒だな。
「書きやすくなるまで使わない」で済むのは、エンドユーザであって、クリエーターではない。
0732デフォルトの名無しさん
2013/01/12(土) 00:41:06.18Yes:→ No:↓
とりあえずそれっぽく動くものが作れればいい → HSP、ひまわり、JavaScriptでも使ってろゴミ
↓
処理速度は遅くていい → PHP、Perl、Rubyでも使ってろマジキチ
↓
クラスは不要 → C言語でいいんじゃね?
↓
C++をおすすめします
0733デフォルトの名無しさん
2013/01/12(土) 01:02:01.440734デフォルトの名無しさん
2013/01/12(土) 09:53:09.24とりあえずそれっぽく動くもの作れて何が悪いんだよwww
0735デフォルトの名無しさん
2013/01/12(土) 11:14:55.21ParentHandle parentH = getParentHandle();
ChildHandle childH = getChildHandle(parentH);
...
disposeChildHandle(childH);
disposeParentHandle(parentH);
これをC++的にラップしたい場合
class Child
{
friend class Parent;
ChildHandle m_childH
Child();
Child(ParentHandle parentH){m_childH = getChildHandle(parentH);}
public:
~Child(){disposeChildHandle(m_childH);}
}
class Parent
{
ParentHandle m_parentH;
public:
Parent(){m_parentH = getParentHandle()}
~Parent(){disposeParentHandle(m_parentH);}
Child birthChild(){return Child(m_parentH);}
}
このような感じにしたいのですが、これではreturn Child(m_parentH)でこの行が終了時点でChildの
デストラクタが呼ばれ、常に死産になってしまいます。
無事出産させるべきにはどのように設計すべきでしょうか
0736デフォルトの名無しさん
2013/01/12(土) 11:17:48.400737デフォルトの名無しさん
2013/01/12(土) 11:34:34.76{
...
public:
Child(class Parent& parent){m_handle = getChildHandle(parent.m_handle);}
...
}
class Parent
{
...
friend Child::Child(Parent& parent);
public:
...
}
とか
0738デフォルトの名無しさん
2013/01/12(土) 11:58:06.01参照カウント
0739デフォルトの名無しさん
2013/01/12(土) 12:16:06.13助言ありがとうございます
0740デフォルトの名無しさん
2013/01/12(土) 16:46:01.36「それっぽく動く」を「それなりに動く」と勘違いしてないか?
0741デフォルトの名無しさん
2013/01/13(日) 15:17:48.780742デフォルトの名無しさん
2013/01/13(日) 15:23:21.68確かCのはず
具体的なコードについてはベンチとってみれば良い
0743デフォルトの名無しさん
2013/01/13(日) 15:25:05.28CによるプログラミングもC++によるプログラミングもチューリング完全なので
片方で書けるアルゴリズムは他方でも書けるという意味で、同等
書く手間はもちろん違う(C++は関数のインライン展開がCより簡単に書けるし、テンプレートも使える)
生成されるオブジェクトコードの(アセンブリレベルでの実行ステップ数の)優劣は、
言語の違いというより処理系の違いで論ずるべき
『プログラミング作法』(か何かのカーニハンの本)では、
C++の方がCより実行時間の予測がつけ難いとありそれはまあ実感としてある
0744デフォルトの名無しさん
2013/01/13(日) 15:25:14.70Cのほうがコンパイルは速いよ。
実行速度事のなら、CにできてC++にできないことはない。後はわかるな?
0745デフォルトの名無しさん
2013/01/13(日) 15:28:44.160746デフォルトの名無しさん
2013/01/13(日) 15:47:19.22僅かにC++の方が関数のエントリー部分が遅いような事を聞いた事が
noexcept なら別かもしれないが
あとはテンプレートのあるC++の方が
型によらない処理は速く書ける
型毎に自前で処理を書くならCでもほぼ同じ速度になるだろうけど
現実的じゃない場合も多い
0747デフォルトの名無しさん
2013/01/13(日) 15:48:51.83返り値チェックのコストは毎回かかるからむしろ例外のが早い
0748デフォルトの名無しさん
2013/01/13(日) 15:56:02.460749デフォルトの名無しさん
2013/01/13(日) 17:33:30.45DWARF2、Win64は無い
0750デフォルトの名無しさん
2013/01/13(日) 17:35:55.060752デフォルトの名無しさん
2013/01/13(日) 17:42:05.130753デフォルトの名無しさん
2013/01/13(日) 18:02:59.69んなわけねーだろ
0754デフォルトの名無しさん
2013/01/13(日) 18:06:35.060755デフォルトの名無しさん
2013/01/13(日) 19:16:12.03それが関係あるんだわ
0756デフォルトの名無しさん
2013/01/13(日) 20:39:33.440757デフォルトの名無しさん
2013/01/13(日) 21:22:41.64ある意味本当
setjmp/longjmp型実装の処理系と、
ゼロコスト実装の処理系がある
http://zakkas783.tumblr.com/post/3870295160/c
0758デフォルトの名無しさん
2013/01/13(日) 23:40:20.39http://ja.softuses.com/161152
テンプレートとインタフェースって同じような使い方できるじゃんって思って
どちらがどういう時に使うか知りたい
0759デフォルトの名無しさん
2013/01/13(日) 23:58:36.72それここの機械翻訳転載だから原文読んだほうがいいんじゃないの
0760デフォルトの名無しさん
2013/01/14(月) 06:30:33.30触らぬ神に祟りなしだとおもうよ
0761デフォルトの名無しさん
2013/01/14(月) 08:04:35.750763デフォルトの名無しさん
2013/01/14(月) 12:36:45.900764デフォルトの名無しさん
2013/01/17(木) 22:30:54.99int aa = 0;
と書いた場合、グローバルに書いてあるけど、他のファイルからアクセスしようがないですよね?
static int aa = 0;にするのと違いあるんですか?
0765デフォルトの名無しさん
2013/01/17(木) 22:36:35.06他のファイルでextern int aa;ってすれば使える
staticがついてたら externしても使えない
0766デフォルトの名無しさん
2013/01/17(木) 23:03:41.59無名名前空間に入れるのがC++流
0767デフォルトの名無しさん
2013/01/20(日) 01:55:22.05を作る事はできないのでしょうか
boostにそんなlibraryあったりしないのでしょうか
0768デフォルトの名無しさん
2013/01/20(日) 02:51:35.910769デフォルトの名無しさん
2013/01/20(日) 10:33:48.47Boost の中では大体そうしてるはず。
0770デフォルトの名無しさん
2013/01/22(火) 16:02:18.73クラスの定義はClass.hに、friend関数はfriend.cppにと言う具合にしたいのです。
0771デフォルトの名無しさん
2013/01/22(火) 16:13:55.35あったこともない韓国人が突然家に侵入して来て「ヘローフレンド!調子はどうだい?冷蔵庫のビールもらうね」なんて言って来たらやだろ?
0772デフォルトの名無しさん
2013/01/22(火) 16:15:44.61定義は別で良いけど宣言はクラス定義内に書かないとダメだよ。
それも含めてクラス定義なんだから。
0773770
2013/01/22(火) 16:23:05.410774デフォルトの名無しさん
2013/01/23(水) 00:37:10.320775デフォルトの名無しさん
2013/01/23(水) 00:55:14.360776デフォルトの名無しさん
2013/01/23(水) 03:59:23.960777デフォルトの名無しさん
2013/01/23(水) 23:19:05.570778デフォルトの名無しさん
2013/01/23(水) 23:39:12.530779デフォルトの名無しさん
2013/01/25(金) 19:14:49.48これってクラスじゃなくて構造体にした方がいいの?
0780デフォルトの名無しさん
2013/01/25(金) 21:44:23.270781デフォルトの名無しさん
2013/01/25(金) 21:54:08.440782デフォルトの名無しさん
2013/01/25(金) 22:15:41.30getter/setter にもどったりするんだよな
0783デフォルトの名無しさん
2013/01/25(金) 22:27:48.17おい、
それなんて俺
0784デフォルトの名無しさん
2013/01/25(金) 22:28:31.39無いというより「構造体⊆クラス」ってだけだろ
0785デフォルトの名無しさん
2013/01/25(金) 22:33:09.41C視点が入ってくると構造体はヘッダ共通化できるかもしれない、位で
0786デフォルトの名無しさん
2013/01/25(金) 22:49:32.990787デフォルトの名無しさん
2013/01/26(土) 14:12:32.480788デフォルトの名無しさん
2013/01/26(土) 14:16:40.79C#みたいな区別が言語的にないんだから
C++では構造体という言葉は個々人で想像する要件が変化する曖昧な言葉になってしまう
議論をしたいのであればまず「構造体」という言葉の、
今回の議論における定義を提示しなければならない
0789デフォルトの名無しさん
2013/01/26(土) 14:51:55.060790デフォルトの名無しさん
2013/01/26(土) 15:28:58.220791デフォルトの名無しさん
2013/01/26(土) 15:32:17.24int a;
int b;
};
これは構造体じゃ「ない」のかね?
0792デフォルトの名無しさん
2013/01/26(土) 15:47:57.88規格読み直せ
0793デフォルトの名無しさん
2013/01/26(土) 15:55:10.18publicメンバ変数のみのクラスを指す人もいれば
メンバ変数が全部publicなら
コンストラクタやメンバ関数があってもいいよという人もいるし
structを使えば何でも構造体という人もいるし
ややこしい
0794デフォルトの名無しさん
2013/01/26(土) 15:59:28.91C++の作者は何て言ってるんだよ
0795デフォルトの名無しさん
2013/01/26(土) 16:00:39.71じゃあこんなとこにいないでハゲに聞けよ(´・ω・`)
0796デフォルトの名無しさん
2013/01/26(土) 16:05:00.93何人かはきっと崇めてくれるよ
0797デフォルトの名無しさん
2013/01/26(土) 16:06:39.440798デフォルトの名無しさん
2013/01/26(土) 16:14:49.70と仕事するようなハメになりませんように(祈り)
0799デフォルトの名無しさん
2013/01/26(土) 16:27:09.690800デフォルトの名無しさん
2013/01/26(土) 16:28:17.390801デフォルトの名無しさん
2013/01/26(土) 16:31:20.390802デフォルトの名無しさん
2013/01/26(土) 16:59:25.63このガラクタどもめ!
0803デフォルトの名無しさん
2013/01/26(土) 17:22:56.39質問の内容じゃなくて、そんな「聞き方」する奴と仕事したいか?
0804デフォルトの名無しさん
2013/01/26(土) 17:28:58.46構造体の指す意味ははっきりさせないと話がすれ違うだけなので
意味の確認くらいはとるわ
0805デフォルトの名無しさん
2013/01/26(土) 17:48:49.030806デフォルトの名無しさん
2013/01/26(土) 17:51:30.240807デフォルトの名無しさん
2013/01/26(土) 17:55:14.980808デフォルトの名無しさん
2013/01/26(土) 18:16:19.22勝手に同一人物認定しないでほしい
0809デフォルトの名無しさん
2013/01/26(土) 18:24:08.730810デフォルトの名無しさん
2013/01/26(土) 19:37:56.029 4 A structure is a class defined with the class-key struct;
JIS X 3014:2003
9 4 構造体は,《クラスキー》struct を付けて定義するクラスとする。
規格に書いてあったから>>791は構造体で
「構造体=クラス」ではなく「構造体⊆クラス」が正しい
C++11だとこの文消えてるけど
0811デフォルトの名無しさん
2013/01/26(土) 20:04:48.990812デフォルトの名無しさん
2013/01/26(土) 20:12:09.480813デフォルトの名無しさん
2013/01/26(土) 21:31:21.53はあ?「C++に構造体なんか無い」(キリッ
とか言う奴を見掛けたので>>791を書いたまで
『そんな「聞き方」』って、お前になんか何も聞く気はねーよ
何様のつもりか知らないけど
0814デフォルトの名無しさん
2013/01/26(土) 22:20:09.020815デフォルトの名無しさん
2013/01/26(土) 22:44:19.540816デフォルトの名無しさん
2013/01/26(土) 22:46:30.140817デフォルトの名無しさん
2013/01/26(土) 22:48:11.23ローカルスコープ導入するならごく普通
0818デフォルトの名無しさん
2013/01/26(土) 22:50:36.35初めて知ってちょっと気持ち悪く感じたが普通なのか
ありがとう
0819デフォルトの名無しさん
2013/01/26(土) 22:52:46.66エディタによって気持ち悪いインデントを強制されることもあるけど、普通
ただ、case内があまり長くなるようなら関数化した方がいい
0820デフォルトの名無しさん
2013/01/26(土) 22:58:00.90ちょうど関数化するか迷ってたww
アドバイスありがとうございます
0821デフォルトの名無しさん
2013/01/26(土) 23:24:26.39別のcase内でも使えてしまって問題になるから(主に初期化有無で)
使うなら必ずローカルスコープを導入すること
お兄さんとの約束だぞ☆
0822デフォルトの名無しさん
2013/01/27(日) 04:58:24.87struct A
{
int a;
};
}
あー、オレのC++は構造体あるわー。
0823デフォルトの名無しさん
2013/01/27(日) 07:35:46.460824デフォルトの名無しさん
2013/01/27(日) 14:17:25.63馬鹿だね
0825デフォルトの名無しさん
2013/01/27(日) 23:39:10.530826デフォルトの名無しさん
2013/01/27(日) 23:40:41.800827デフォルトの名無しさん
2013/01/27(日) 23:51:31.58とやった場合、Tには構造体(struct)も書けるが
構造体Fooの前方宣言は
class Foo;
ではダメで、あくまで
struct Foo;
と書かねばならない
ていうかテンプレートの引数部に書くtypenameってどうなん?
typename⊇class?
0828デフォルトの名無しさん
2013/01/27(日) 23:54:16.93それ以外はどちらでも良い
0829デフォルトの名無しさん
2013/01/27(日) 23:54:34.65前方宣言どっちでも通るだろ。
0830デフォルトの名無しさん
2013/01/28(月) 00:03:18.59イテレータがループ変数(?)な多重ループでのイテレータの良さげな名前の付け方を教えてください
やっぱりit1, it2, it3, ...とかにする?
あと、find()メソッドとかもイテレータを返しますが、そういった場合のわかりやすい名前の付け方も知りたいですが
0831デフォルトの名無しさん
2013/01/28(月) 00:13:10.190832デフォルトの名無しさん
2013/01/28(月) 00:37:23.780833デフォルトの名無しさん
2013/01/28(月) 00:39:08.70it, jt, kt は面白いなw
0834デフォルトの名無しさん
2013/01/28(月) 00:51:29.66ネストが妙に深かったら再帰も考慮するけど
0835デフォルトの名無しさん
2013/01/28(月) 00:55:34.190836デフォルトの名無しさん
2013/01/28(月) 01:03:14.82入れ子の中のループを外部関数に出すから
「見かけのインデントが少ない」=「ネストが深くない」
ように思っているだけでは
0837デフォルトの名無しさん
2013/01/28(月) 07:25:45.23逆順ってことか
行列扱う時はそうなる事は多いな
0838デフォルトの名無しさん
2013/01/28(月) 09:12:33.960839デフォルトの名無しさん
2013/01/28(月) 12:32:29.57find() の戻り値は found がいい。
0840デフォルトの名無しさん
2013/02/02(土) 22:37:00.440841デフォルトの名無しさん
2013/02/03(日) 00:43:31.190842デフォルトの名無しさん
2013/02/03(日) 14:09:57.29こんなところで質問してるくらいだからどうせMFCの速度が影響するような大規模なシステム作れないだろ
それにこんなところで質問してるくらいだからお前のコードのほうがボトルネックだよ
よって気にする必要なし
0843デフォルトの名無しさん
2013/02/04(月) 20:49:14.130844デフォルトの名無しさん
2013/02/04(月) 21:26:15.390845デフォルトの名無しさん
2013/02/04(月) 23:03:12.630846デフォルトの名無しさん
2013/02/04(月) 23:26:57.62あと、具体的な使い道も簡単に教えてください
ネットで検索すれば色々出てきますが
テンプレートの作り方とか何に使えば良いのか良く分からない例ばかりで
わざわざテンプレートを作る必要性がわかりません
別になくてもいいんじゃないの、って感想です
しかし!
それなりに使ってる人がいるからには便利な使い道があるのでしょう
それを知りたいのです
0847デフォルトの名無しさん
2013/02/04(月) 23:36:46.380848デフォルトの名無しさん
2013/02/04(月) 23:48:57.02無理に使う必要は全くない
0849デフォルトの名無しさん
2013/02/04(月) 23:52:43.090850デフォルトの名無しさん
2013/02/05(火) 00:57:42.35習うより慣れろで、まずいっぱいコード書くことをオススメする。
0851デフォルトの名無しさん
2013/02/05(火) 01:13:50.73理解できないならできないで気にするな
0852デフォルトの名無しさん
2013/02/05(火) 04:51:05.86STL 使えに一票
0853デフォルトの名無しさん
2013/02/06(水) 11:36:58.430854デフォルトの名無しさん
2013/02/06(水) 15:09:59.62cout << "BBBB";
cout << "BBBB";
.......
cout << "BBBB";
って書いていくのと
for(int i = 0; i <= 100; i++){
cout << "BBBB";
}
ってfor文で書くのと速度に違いある?
0855デフォルトの名無しさん
2013/02/06(水) 15:11:55.480856デフォルトの名無しさん
2013/02/06(水) 16:26:51.300857デフォルトの名無しさん
2013/02/06(水) 19:46:19.01十数桁くらいの繰り返し回数なら、
毎回インクリメントする分 for 方が遅いという結果が出るかもしれんな。
終了判定処理はきっと分岐予測が上手く働いて結果にはほぼ影響しないだろう。
0858デフォルトの名無しさん
2013/02/06(水) 21:45:01.570859デフォルトの名無しさん
2013/02/06(水) 22:05:50.640860デフォルトの名無しさん
2013/02/06(水) 22:29:13.440861デフォルトの名無しさん
2013/02/06(水) 22:41:26.920862デフォルトの名無しさん
2013/02/06(水) 22:42:12.120863デフォルトの名無しさん
2013/02/06(水) 22:42:39.290864デフォルトの名無しさん
2013/02/06(水) 23:03:49.30対して変わらん
しかしループ数が少ないならばいちいちfor文使うより展開した方が「速い」こともある
(特にループが入れ子になっている場合の内側のループ)。それをコンパイラが判別して
勝手に展開してくれるのが「ループ展開」と呼ばれる技法
0865デフォルトの名無しさん
2013/02/07(木) 05:03:28.55デバイスにアクセスする方が圧倒的に遅い
0866デフォルトの名無しさん
2013/02/07(木) 16:10:44.55どうしても、思ったとおりに動作しないコードがあります。
以下、そのわからないソースコードを複数回に分けて貼り付けます。(3つのcppファイルで構成)
開発環境:VisualC++ 2010 Express Edition
//main.cpp ==============================================
#include <stdio.h>
//プロトタイプ宣言(test1.cpp , test2.cpp)
void* Init_1();
void* Init_2();
int main()
{
printf("test1のシングルトンのアドレス:%p\ntest2のシングルトンのアドレス:%p\n" , Init_1() , Init_2());
return 0;
}
0867デフォルトの名無しさん
2013/02/07(木) 16:12:38.25なんで?
0868デフォルトの名無しさん
2013/02/07(木) 16:13:07.21class Gloval{
public:
//定義
int a;
public:
static Gloval* GetInstance()
{
static Gloval instance;
return &instance;
}
private:
Gloval(){}
Gloval(const Gloval& rhs);
Gloval& operator=(const Gloval& rhs);
};
void* Init_1()
{
return Gloval::GetInstance();
}
0869デフォルトの名無しさん
2013/02/07(木) 16:15:20.78class Gloval{
public:
//定義
float a;
public:
static Gloval* GetInstance()
{
static Gloval instance;
return &instance;
}
private:
Gloval(){}
Gloval(const Gloval& rhs);
Gloval& operator=(const Gloval& rhs);
};
void* Init_2()
{
return Gloval::GetInstance();
}
0870デフォルトの名無しさん
2013/02/07(木) 16:17:24.73test1のシングルトンのアドレス:00BA813C
test2のシングルトンのアドレス:00BA813C
なんで、Init_1()とInit_2()から同じアドレスが返されるのかわかりません・・・。
ファイル分割してあるからtest1のクラス「Gloval」とtest2のクラス「Gloval」は
別物のはずだから違うアドレスが返される・・・と思ったんですが・・・
どなたか原因がわかる方いますか?
ちなみに、どちらかのクラス「Gloval」を別の名前に変えると別々のアドレスが返ってきます。
0871デフォルトの名無しさん
2013/02/07(木) 16:47:28.360872デフォルトの名無しさん
2013/02/07(木) 17:54:08.59あれ・・・そうなんですか?
うーん・・・VC++がエラーを吐き出さないように作られてただけなのかな
たしかに、Glovalに何らかのメンバを持たせてそこにアクセスしようとするとおかしくなりますし(ポインタがずれてる的な・・・)
ファイルAで
static int a;
ファイルBで
static int a;
と宣言したら二つの変数aが別物になるように、クラスもてっきり別物として宣言されてるものかと勘違いしてました・・・。
クラスそのものは実体がないのでそこらへんが曖昧だったんですけどね・・・。
なんとなく原因がわかった気がします。
>>871さん、返信ありがとうございます。
0873デフォルトの名無しさん
2013/02/07(木) 18:08:35.68リンクの問題
0874デフォルトの名無しさん
2013/02/07(木) 18:20:28.82ヘッダに書くのと状況的には一緒だし。
0875デフォルトの名無しさん
2013/02/07(木) 21:53:06.89そんなの互換性とか慣れとかいくらでも理由あるじゃん……
0876デフォルトの名無しさん
2013/02/07(木) 22:23:44.500877デフォルトの名無しさん
2013/02/07(木) 22:34:13.28リリースされ間もない新しいバージョンは
まだ動作が不安定な場合もよくある。
バージョン 4.0 〜 4.2 辺りの間は、
バグフィクスが十分なされた 3.8 辺りを使う、
という選択も当然あり得る。
0878デフォルトの名無しさん
2013/02/08(金) 03:58:51.260879デフォルトの名無しさん
2013/02/08(金) 10:45:23.87>と宣言したら
メンバ関数のstaticとグローバル変数のstaticは全然違う意味だろが
0880デフォルトの名無しさん
2013/02/09(土) 13:22:49.980881デフォルトの名無しさん
2013/02/09(土) 13:35:58.750882デフォルトの名無しさん
2013/02/09(土) 13:41:13.84そもそも、コンパイラは itr がイテレータなのかどうか知らん
0883デフォルトの名無しさん
2013/02/09(土) 14:26:39.29class A {
virtual void hoge();
};
class A1 {
void hoge() {
// ここを実行させたい
}
};
int recieve_hoge(A* a) {
a.hoge();
0884デフォルトの名無しさん
2013/02/09(土) 14:29:26.48上のクラスの宣言があるとき、
int recieve_hoge(A& a) {
a.hoge();
}
を実行すると親クラスのhogeが実行されるし、引数を (A1& a) にするとA2をとれなくなるので…。
0885デフォルトの名無しさん
2013/02/09(土) 14:33:48.96class A1 の hoge を virtual にすればいいじゃん
0886デフォルトの名無しさん
2013/02/09(土) 14:38:01.74コードはそうなってないが。
してるなら仮想関数なんだから A1::hoge が呼ばれるだろ。
0887885
2013/02/09(土) 14:40:22.890888デフォルトの名無しさん
2013/02/09(土) 14:51:28.44recieve_aの引数を(A1 pa)にすればA1と表示されるのはわかるのですが、A1とA2両方に対応させたいのです…
http://ideone.com/EVeeGY
0889デフォルトの名無しさん
2013/02/09(土) 15:22:48.52ホレ
0890デフォルトの名無しさん
2013/02/09(土) 15:51:03.49できました、ありがとうございます!
まさかこんなに簡単なことだったとは…。
0891デフォルトの名無しさん
2013/02/09(土) 16:34:56.97ちょっと待て
お前 >>884 でちゃんと & 付けてんじゃん
0892デフォルトの名無しさん
2013/02/09(土) 17:18:49.41元のコードではつけ忘れてたんです…
書き込み画面でサンプルを適当に書いたときは忘れなかった感じです
0893デフォルトの名無しさん
2013/02/09(土) 21:55:05.16ifstreamを用いたファイルからの入力が
ファイル終端に達して失敗したときは
fail()とeof()が同時にtrueになるのでしょうか?
0894デフォルトの名無しさん
2013/02/10(日) 15:55:28.350895デフォルトの名無しさん
2013/02/10(日) 16:03:18.21どうやって確かめたらいいんだろうな
0896デフォルトの名無しさん
2013/02/10(日) 16:51:16.89規格を確認した後、自分の使ってるコンパイラでテストすればよい。
0897デフォルトの名無しさん
2013/02/10(日) 17:09:12.16いや、どうやってちょうどファイル終端で失敗する状況を作るか、と・・・
そもそも、読み取りが途中で fail になった経験もなくて
0898デフォルトの名無しさん
2013/02/11(月) 06:12:32.66例えば 0 バイトのファイルから 1 バイト読み取ればよいのでは?
0899893
2013/02/11(月) 06:56:28.43ありがとうございました
ということは、eof()がtrueでfail()がfalseの状況というのは
存在しないという理解でいいでしょうか
>>897
もしかしてeof()がtrueのときは常にfail()もtrueなのでは?
というような意味の質問のつもりでした
0900デフォルトの名無しさん
2013/02/11(月) 07:13:27.44なんで >>893-894 から「ということは」でそんな理解になるのかわからんな。
getline(), readsome() など、ファイル終端に達しても失敗とはならない操作はあり得る。
0901デフォルトの名無しさん
2013/02/11(月) 10:08:07.91なるほど、頭良いな
と言うか、俺の頭が硬すぎたか
0902デフォルトの名無しさん
2013/02/11(月) 10:26:33.46void func (const char *pstr) { ... }
char a[] = "abc";
func (a); // NG
func ("abc"); // OK
文字列をコンストラクタで受け取ってそれをメンバ変数に保存するクラスなのですが、
その値が変更されないようにするには文字列をコピーするしか方法はないですか?
このクラスは文字列からそのハッシュ値を計算して保存するのですが、
デバッグ用に元の文字列も保存しておきたいんです。
これは運用上、リテラル文字列以外からハッシュ値を作ることはあってはならないものです。
このクラスのインスタンスの外でその文字列の内容が変更されたら、整合性がとれないので。
そのような状況はできればコンパイル時に発見してエラーにしておきたいです。
しかし今のC/C++の規格で無理でしたら、安全のためにコピーする事で諦めます。
0903デフォルトの名無しさん
2013/02/11(月) 10:32:02.120904デフォルトの名無しさん
2013/02/11(月) 10:42:28.71メンバが呼ばれたあとで保存しといた文字列ポインタの中身が変更されちゃうかもしれない
なんて考えるなんてアホらしい
0905デフォルトの名無しさん
2013/02/11(月) 10:56:42.76書き込むと例外発生するから。OSによるけど。
0906デフォルトの名無しさん
2013/02/11(月) 11:05:03.28諦めて普通にコピーすることにします。
0907デフォルトの名無しさん
2013/02/11(月) 12:05:30.700908デフォルトの名無しさん
2013/02/11(月) 12:18:38.42マクロの文字列化演算子を通して使う仕様にすればいいんじゃない?
0909デフォルトの名無しさん
2013/02/11(月) 12:21:35.760910デフォルトの名無しさん
2013/02/11(月) 12:30:46.50func_isl("abc");
0911デフォルトの名無しさん
2013/02/11(月) 12:59:34.46すばらしい。
マクロは盲点でした(特に >>910 はシンプルですね)
ただ・・・、必ず文字列リテラルを使う事と、必ずマクロ func_isl を使う事。
どちらもコーディングルールなんですよね。
マクロにした方が安全度がより増すのは確かですが。
面白いアイデアなので、しばらくこの方法で運用してみます。
0912デフォルトの名無しさん
2013/02/11(月) 13:03:31.800913デフォルトの名無しさん
2013/02/11(月) 13:12:53.470914デフォルトの名無しさん
2013/02/11(月) 13:20:36.01それとも他にコピーを避ける理由があるのか
0915デフォルトの名無しさん
2013/02/11(月) 13:26:41.56これは頭いい方法だな
>>911
マクロを通さず使うな、というのは
もとの名前を直打ちしちゃダメなのが分かる名前にしてしまえば良い
0916デフォルトの名無しさん
2013/02/11(月) 13:29:43.89良く読め
コピーを避けたいんじゃなくて文字列が書きかわることによる不整合を避けたいケースだよ
0917デフォルトの名無しさん
2013/02/11(月) 13:34:20.63マクロ通してないのはgrepすれば分かるしね
0918デフォルトの名無しさん
2013/02/11(月) 13:36:29.150919デフォルトの名無しさん
2013/02/11(月) 13:37:26.75そのためには文字列をコピーするのが一番簡単で安全な方法だ
なのにわざわざマクロを使うという事はコピーを避けたいという事じゃないのか?
0920デフォルトの名無しさん
2013/02/11(月) 13:38:28.240921デフォルトの名無しさん
2013/02/11(月) 13:42:31.140922デフォルトの名無しさん
2013/02/11(月) 13:43:59.36いえ、>>914 は十分分かってらっしゃると思います。
文字列が書きかわることによる不整合を避けたいのなら、コピーすれば良いだけ。
それを拒否するのは、メモリを無駄にしたくないからだろ? と言っているのですよね。
私の質問の背景はまさにそれですから、見破られたということです。
で、そんな微々たる量のメモリの無駄や処理量なんか気にするな、と。
おっしゃるとおりです。
>>912
言ってなかったのですが、この件に関しては私一人で趣味でプログラムしています。
保守するのも永遠に私一人のはずです。
既にデータセグメントにあるのに、それをコピーしなければならないと言うのが、
「なんとなく気持ち悪い」というその程度の話ですから、諦めるのは簡単ですが、
>>910 が面白いので、この方法でしばらくやってみようかなと。
もちろんチームで仕事をするときは、よほど理に反したものでない限り、
こんな馬鹿な我が儘は言わずチームのルールに従います。
0923デフォルトの名無しさん
2013/02/11(月) 13:45:43.41えっ?そうなの?
ソースが文字列リテラルであることが重要なんだ思ったよ
0924デフォルトの名無しさん
2013/02/11(月) 13:48:33.01言葉が足らない感じなので、補足しておきます。
> 既にデータセグメントにあるのに、それをコピーしなければならないと言うのが・・・
コードに書かれたリテラル文字列は(普通は書き換わらない)データセグメントに存在していて、
それのメモリ位置をポイントすれば良いだけなのに、
関数にリテラル文字列ではなく変数を引数に入れて呼ばれる可能性も考慮して
わざわざ同じ情報をコピーしなければならないと言うのが、
「なんとなく気持ち悪い」というその程度の話ですから・・・
0925デフォルトの名無しさん
2013/02/11(月) 22:55:40.63昔と違ってオンキャッシュになる方が速いんだから
展開したコードより単に短い方が普通に速いんじゃね?
0926デフォルトの名無しさん
2013/02/11(月) 23:04:41.03ループってのは毎回分岐処理を行うからね
例えば4回の固定ループがあるとすると、
4回に1回必ず分岐予測が失敗する
まあループのサイズにもよるかもしれないが
0927デフォルトの名無しさん
2013/02/11(月) 23:35:57.140928デフォルトの名無しさん
2013/02/11(月) 23:38:12.770929デフォルトの名無しさん
2013/02/11(月) 23:40:39.95(x64で増えたからそうダメージはないかもしれないが)
場合によってはインデックスによるアドレッシングに
時間がかかるかもしれない
(要素のサイズが1, 2, 4, 8 でない場合)
アンロールは今でも重要な高速化手法だよ
0930デフォルトの名無しさん
2013/02/11(月) 23:52:02.160931デフォルトの名無しさん
2013/02/12(火) 00:37:36.50まずアルゴリズムや全体の設計が妥当かどうかの検証が先。
ループアンロールはボトルネックが判明して、さらにロジックの
工夫ではどうしても解決できなくて、ループ処理が原因で遅い
場合のみ有効。
0932デフォルトの名無しさん
2013/02/12(火) 01:37:24.480933デフォルトの名無しさん
2013/02/12(火) 02:56:46.100934デフォルトの名無しさん
2013/02/12(火) 08:36:01.440935デフォルトの名無しさん
2013/02/13(水) 12:32:22.870936デフォルトの名無しさん
2013/02/13(水) 18:56:51.20それは設計やリファクタリングであって最適化ではない。
0937デフォルトの名無しさん
2013/02/13(水) 20:34:04.110938デフォルトの名無しさん
2013/02/13(水) 21:01:16.92一連の流れで、みんなは実行効率の話をしている。
もし >>932 が実行効率ではなく開発効率の話をしているのであれば、
会話の流れから一人だけずれている事になる。
0939デフォルトの名無しさん
2013/02/14(木) 01:28:58.130940デフォルトの名無しさん
2013/02/14(木) 05:54:34.23技術評論社 はじめてのC++
gihyo.jp/book/1999/4-7741-0843-X
0941デフォルトの名無しさん
2013/02/14(木) 07:25:37.45ロベール
0942デフォルトの名無しさん
2013/02/14(木) 10:03:36.830943デフォルトの名無しさん
2013/02/14(木) 10:05:09.200944デフォルトの名無しさん
2013/02/14(木) 12:37:37.380945デフォルトの名無しさん
2013/02/14(木) 12:46:16.780946デフォルトの名無しさん
2013/02/14(木) 15:59:11.57継承について、質問です
参考書に、基本クラスでオーバロードされた演算子のうち
代入演算子は派生クラス内で使用できない
とありました
基本クラスを、
+をオーバーロード
-をオーバーロード
=をオーバーロード
として継承すると、派生クラスでは
+-=のオーバーロードが継承はされるが、=は使用できないという認識でいいのでしょうか
0947デフォルトの名無しさん
2013/02/14(木) 17:41:09.87でおk
0948デフォルトの名無しさん
2013/02/14(木) 20:21:23.12派生クラスの暗黙のoperator=で基底クラスのoperator=は隠蔽される
0949デフォルトの名無しさん
2013/02/16(土) 02:21:03.25外からの観測ではおそらくメモリ周りの使い方が糞で
キャッシュミスがおきまくってるようなんだけど・・・
0950デフォルトの名無しさん
2013/02/16(土) 03:06:57.88UGCOとか10年かけて開発してチャットも実装できなかったんだぞ。
あと20年お待ちください。
0951デフォルトの名無しさん
2013/02/20(水) 21:21:25.92環境はVC++ .Net 2003 (古いです…がアップデートはできません…)
std::stringでShiftJISの文字単位の処理は不可能でしょうか。
substr()で部分文字列の切り出しや、length()で(日本語としての)文字数をカウントする、などができないか、です。
0952951
2013/02/20(水) 21:23:30.42また、std::string を _mbslen などのライブラリへ渡しても、可能だとは思います。
そうではなく、std::string のメソッドそのままで扱えないか、ということです。
自分が知らないだけで、可能な方法がないのか(ロケール設定の工夫など)?と疑っていますが、
いろいろ検索してみても、確信が得られません。
ロケールは以下のように設定しています。
setlocale(LC_ALL, "japanese")
0953デフォルトの名無しさん
2013/02/20(水) 21:31:54.81std::string クラスとそのメンバ関数のみでは、残念ながら無理ですね。
std::string のインスタンスを取って、
部分文字列を切り出した std::string のインスタンスを返す関数とか、
そういったものを自作することはそれほど難しくないですが、
そういう対処を求めているのではないんですよね?
0954951
2013/02/20(水) 21:53:03.27やはり無理ですか…
ロケールの影響を受ける版のstd::stringは存在しないのですね…
経緯としては、std::string ベースで組まれた、大規模な社内アプリケーションが
既に存在していまして、その日本語対応が必要になりました。
至る所にstd::stringが散りばめられているので、
ロケールの設定など、初期設定だけで使えるようになれば、という願望から質問しました。
0955951
2013/02/20(水) 21:55:12.03>部分文字列を切り出した std::string のインスタンスを返す関数
現在は、部分的にこの方法を取っております。
この方法でアプリケーション全体を書き換えるか、
若しくはstd::wstringベースに書き換えるか、で検討しようと思います。
ありがとうございました。
0956デフォルトの名無しさん
2013/02/20(水) 22:52:09.39std::basic_string の第二引数に指定すればいけるかもしれないけど
結局型が変わる事に変わりはないか
0957デフォルトの名無しさん
2013/02/21(木) 00:32:39.480958951
2013/02/21(木) 06:44:33.45なるほど。こういう物も有るんですね。
typedef basic_string 〜 string
で無理やり自作タイプをstringという名前にしてしまう事も出来るんですかね
ただ、再定義すべきメソッドの数を見てめまいがしました…
0959デフォルトの名無しさん
2013/02/21(木) 07:34:30.89自作クラスでいい気もする
0960951
2013/02/21(木) 07:39:10.19std::stringとの変換も、自動でやってくれるとのことなので
全部をstd::wstringベースにいきなりするよりは、やりやすいかも…
ustringだけ、Windowsで組み込めればの話ですが…
>>959 確かに
0961デフォルトの名無しさん
2013/02/21(木) 13:48:08.66using namespace std;
int main() {
}
class Human {
private: string name;
public: Human(string name) {
this.name = name;
}
}
昨日C++はじめた初心者ですがなぜこれでエラーがでるのかわかりません
教えてください
0962デフォルトの名無しさん
2013/02/21(木) 13:51:13.53this->name = name;
0963デフォルトの名無しさん
2013/02/21(木) 13:51:37.31エラーが出るならそれも張りましょう
0964デフォルトの名無しさん
2013/02/21(木) 13:53:29.110965デフォルトの名無しさん
2013/02/21(木) 13:54:09.830966デフォルトの名無しさん
2013/02/21(木) 13:55:21.55main関数だけは特別でreturn 0;は必要ない
0967デフォルトの名無しさん
2013/02/21(木) 14:03:07.34できましたがまたエラーがでました
#include <iostream>
using namespace std;
int main() {
Human yaruo("Yaruo");
yaruo.noise("datteowwwww");
}
class Human {
private: string name;
public: Human(string name) {
this->name = name;
}
public: void noise(string noise) {
cout <<name<<": "<<noise<< endl;
}
};
エラー内容をコピーしたいのですがコンソールのコピーができません。
0968デフォルトの名無しさん
2013/02/21(木) 14:06:57.570969デフォルトの名無しさん
2013/02/21(木) 14:07:13.48できるようになったら、またきてね
0970デフォルトの名無しさん
2013/02/21(木) 14:09:10.78だと思うだろ
例外があって、main()内にstd::exit()があるとreturnが必要になるんだなこれが
他にmain()が何も値を返さない時に限りreturn 0;は省略可能
0971デフォルトの名無しさん
2013/02/21(木) 14:13:21.71こうはかけないんですよね?
0972デフォルトの名無しさん
2013/02/21(木) 14:20:57.06くだらない
0973デフォルトの名無しさん
2013/02/21(木) 14:43:54.670974デフォルトの名無しさん
2013/02/21(木) 14:50:18.000975デフォルトの名無しさん
2013/02/21(木) 15:00:47.51#include <iostream>
using namespace std;
class Human {
private: string name;
public: Human(string name) {
this->name = name;
}
public: void noise(string noise) {
cout <<name<<": "<<noise<< endl;
}
};
int main() {
Human yaruo("Yaruo");
yaruo.noise("datteowww");
}
後方参照ができないってことなんですね・・・。
おどろきです。
0976デフォルトの名無しさん
2013/02/21(木) 15:18:43.23元々コンパイルを少しでも早くする工夫だったんだけど、今じゃC#の方がコンパイルが速い始末
0977デフォルトの名無しさん
2013/02/21(木) 15:20:46.03実行速度が重要なんだよ
0978デフォルトの名無しさん
2013/02/21(木) 15:21:45.45C++とC#の速度計測して見た事あんのかよ
今じゃほとんど差がないぞ
0979デフォルトの名無しさん
2013/02/21(木) 15:22:46.440980デフォルトの名無しさん
2013/02/21(木) 15:23:22.810981デフォルトの名無しさん
2013/02/21(木) 15:38:13.330982デフォルトの名無しさん
2013/02/21(木) 15:42:12.770983デフォルトの名無しさん
2013/02/21(木) 15:51:45.63そのポインタが最適化の妨げになっている件
restrictポインタにしないとFORTRANより大幅に速度低下
0984デフォルトの名無しさん
2013/02/21(木) 15:52:37.39using namespace std;
class Human {
private: string name;
public: Human(string name) {
this->name = name;
}
public: void noise(string noise) {
cout <<name<<": "<<noise<< endl;
}
public: string getChildName() {
Child child("Child");
return child.getName();
}
};
class Child {
private: string name;
public: Child(string name) { this->name = name; }
public: string getName() { return this->name; }
};
int main() {
Human yaruo("Yaruo");
yaruo.noise("datteowww");
cout <<yaruo.getChildName()<< endl;
}
0985984
2013/02/21(木) 15:54:16.87ということは、"Child"クラスなのに親のHumanクラスより先頭にクラス定義しないといけないんですね・・・。
なんとなくC++がわかってきましたが、少し不安になってきました。
0986デフォルトの名無しさん
2013/02/21(木) 15:56:53.070987984
2013/02/21(木) 15:57:33.920988デフォルトの名無しさん
2013/02/21(木) 15:59:29.460990デフォルトの名無しさん
2013/02/21(木) 16:04:20.46class Child;
って宣言を書いておく。
0991デフォルトの名無しさん
2013/02/21(木) 16:30:14.00なるほど・・・。ですが子のコンストラクタに引数があってそれを取得したい場合はどうなるんでしょうか。
#include <iostream>
using namespace std;
class Child {
private: string name;
public: Child(string name) { this->name = name; }
public: string getName() { return this->name; }
};
class Human {
private: string name;
public: Human(string name) { this->name = name; }
public: string getChildName() {
Child child("Child");
return child.getName();
}
};
int main() {
Human yaruo("Yaruo");
cout <<yaruo.getChildName()<< endl;
}
つまりこれを前方宣言?で書こうとすると・・・続く
0992デフォルトの名無しさん
2013/02/21(木) 16:31:58.41using namespace std;
class Child;
class Human {
private: string name;
public: Human(string name) { this->name = name; }
public: string getChildName() {
Child child("Child");
return child.getName();
}
};
class Child {
private: string name;
public: Child(string name) { this->name = name; }
public: string getName() { return this->name; }
};
int main() {
Human yaruo("Yaruo");
cout <<yaruo.getChildName()<< endl;
}
のように試しましたがこれはHumanクラスでエラーをはきました
0993デフォルトの名無しさん
2013/02/21(木) 17:05:52.71それから前方宣言のクラスのポインタを持つ場合普通Pimplイディオムを使う
なぜかというと前方宣言の時点ではクラスの詳細が全く分からないからnew出来ないし
メンバ関数も呼び出せないから
0994デフォルトの名無しさん
2013/02/21(木) 17:16:19.350995デフォルトの名無しさん
2013/02/21(木) 17:16:31.23class Child {
private: string name;
public: Child(string name) { this->name = name; }
public: string getName() { return this->name; }
};
class Human {
private: Child child;
public: Human(Child child) {
this->child = child;
}
};
こういう設計の書き方したいのですが無理なんですかね
0996デフォルトの名無しさん
2013/02/21(木) 17:28:03.83それで通るだろ?
0997デフォルトの名無しさん
2013/02/21(木) 17:33:08.22no matching function エラーがHumanのコンストラクタででる。
#include <iostream>
using namespace std;
class Child {
private: string name;
public: Child(string name) { this->name = name; }
public: string getName() { return this->name; }
};
class Human {
private: Child child;
public: Human(Child child) { this->child = child; }
};
int main() {}
0998デフォルトの名無しさん
2013/02/21(木) 17:34:48.88そのChildの部分をヘッダファイルに持って、Humanの中にChildへのポインタを持たせて
privateに入れるのがPimplイディオム
詰まる所前方宣言だけではコンストラクタはおろかメンバ関数も呼び出せないわけよ
// Pimpl1.h
#ifndef PIMPL1_H_
#define PIMPL1_H_
class Child {
private:
std::string name1;
public:
Child(std::string name) : name1(name) {}
std::string getName() const { return name1; }
};
#endif /* PIMPL1_H_ */
0999デフォルトの名無しさん
2013/02/21(木) 17:35:20.21#include <iostream>
#include <string>
#include "Pimpl1.h"
class Human {
private:
std::string name1;
Child* pchild;
public:
Human(std::string name) : name1(name), pchild(new Child("Child")) {}
std::string getChildName() const { return pchild->getName(); }
std::string getName() const { return name1; }
~Human() { delete pchild; }
};
int main()
{
Human yaruo("Yaruo");
std::cout <<yaruo.getName() << std::endl;
std::cout <<yaruo.getChildName() << std::endl;
}
やりたけりゃこんな風に書けばよい
1000デフォルトの名無しさん
2013/02/21(木) 17:36:12.90ttp://ideone.com/xBRzSr
これなら通る
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。