C++相談室 part69
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2009/05/04(月) 21:04:54ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part66
http://pc12.2ch.net/test/read.cgi/tech/1231640498/
※part63, part66 が重複していたようですので part69 としました。
0002デフォルトの名無しさん
2009/05/04(月) 21:07:52環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0003デフォルトの名無しさん
2009/05/04(月) 21:09:01[C++ FAQ]
http://www.parashift.com/c++-faq-lite/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
http://www.cppreference.com/ (英語)
http://www.cppll.jp/cppreference/ (↑の日本語訳だけど最新は反映しない)
[禿 Stroustrup]
http://public.research.att.com/~bs/
[C++ International Standard]
http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110
[JTC1/SC22/WG21 - C++]
http://www.open-std.org/jtc1/sc22/wg21/
ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
[JIS X3014]
http://www.jisc.go.jp/app/pager?&RKKNP_vJISJISNO=X3014
ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
0004デフォルトの名無しさん
2009/05/04(月) 21:09:17Effective 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/
0005デフォルトの名無しさん
2009/05/04(月) 21:09:39[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 STDCXX http://incubator.apache.org/stdcxx/
STLFilt http://www.bdsoft.com/tools/stlfilt.html
(日本語) http://www005.upp.so-net.ne.jp/episteme/html/stlprog/
(日本語) http://www.wakhok.ac.jp/~sumi/stl/
[Loki]
http://sourceforge.net/projects/loki-lib/
LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
0006デフォルトの名無しさん
2009/05/04(月) 21:12:23http://www.cplusplus.com/
・入門,一覧,使い方
http://www5c.biglobe.ne.jp/~ecb/cpp/07_01.html
・メソッド一覧
http://www.wakhok.ac.jp/~sumi/stl/
・サンプルプログラム集
http://www.s34.co.jp/cpptechdoc/reference/stl_samples/
0007デフォルトの名無しさん
2009/05/04(月) 21:13:06とりあえず、
Apache STDCXX http://incubator.apache.org/stdcxx/
は
Apache C++ Standard Library (STDCXX) http://stdcxx.apache.org/
というのは指摘済みでした。ごめんなさい。とりあえず訂正。
■Libraries■
[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://www005.upp.so-net.ne.jp/episteme/html/stlprog/
(日本語) http://www.wakhok.ac.jp/~sumi/stl/
[Loki]
http://sourceforge.net/projects/loki-lib/
LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
0008デフォルトの名無しさん
2009/05/04(月) 21:19:28http://www.boost.org/
Boost 翻訳プロジェクト
http://boost.cppll.jp/HEAD/
Let's Boost
http://www.kmonos.net/alang/boost/
boost info
http://shinh.skr.jp/boost/
0009デフォルトの名無しさん
2009/05/04(月) 21:52:57std::multisetのoperator>は任意のクラスの比較オブジェクト若しくは
比較関数を定義する時に用いる
挿入順序を決定する
struct Set {
int a;
double b;
Set(int i, double d) : a(i), b(d) {}
};
bool operator>(const Set& a, const Set& b) {
return a.b > b.b;
}
int main()
{
std::multiset<Set, std::greater<Set> > ms;
ms.insert(Set(1, 2.0));
ms.insert(Set(2, 1.0));
for (std::multiset<Set, std::greater<Set> >::const_iterator pos = ms.begin(); pos != ms.end(); ++pos)
std::cout << pos->a << ' ' << pos->b << std::endl;
}
0010デフォルトの名無しさん
2009/05/04(月) 22:07:51<()std::less)が使われるので定義しておかなければならない。
struct Set {
int a;
double b;
Set(int i, double d) : a(i), b(d) {}
};
bool operator>(const Set& a, const Set& b) {
return a.b > b.b;
}
bool operator<(const Set& a, const Set& b) {
return a.b < b.b;
}
int main()
{
std::multiset<Set, std::greater<Set> > ms, ms2;
ms.insert(Set(1, 2.0));
ms.insert(Set(2, 1.0));
ms2.insert(Set(1, 0.0));
ms2.insert(Set(1, 0.5));
for (std::multiset<Set, std::greater<Set> >::const_iterator pos = ms.begin(); pos != ms.end(); ++pos)
std::cout << pos->a << ' ' << pos->b << std::endl;
if (ms > ms2)
std::cout << "ms > ms2\n";
}
0011前スレ>>994
2009/05/04(月) 22:14:59なるほど。
自作クラスSetに>を実装しないとstd::setやstd::multisetに入れられないのは理解できました。
ありがとうございます。
しかしご教示いただきたいのですが、最後の方の
if (ms > ms2)
このms>ms2の部分がtrueやfalseになるという決定はどういう基準で決まるということですか?
例えばms == ms2でしたら、「最初から最後まで全要素がmsとms2で等しい時true, 他はfalse」ですよね。
ms>ms2はどうなのでしょうか?
0012デフォルトの名無しさん
2009/05/04(月) 22:20:09これで見る限り木の単純比較のように見えます
std::equal()を使っても同じ結果が得られると思います
struct Set {
int a;
double b;
Set(int i, double d) : a(i), b(d) {}
};
bool operator==(const Set& a, const Set& b) {
return a.b == b.b;
}
bool operator<(const Set& a, const Set& b) {
return a.b < b.b;
}
int main()
{
std::multiset<Set> ms, ms2;
ms.insert(Set(1, 2.0));
ms.insert(Set(2, 1.0));
ms2.insert(Set(1, 1.0));
ms2.insert(Set(3, 2.0));
if (ms == ms2)
std::cout << "ms == ms2\n";
}
0013デフォルトの名無しさん
2009/05/04(月) 22:23:27size()が等しくかつ単純比較で大小を決めているようです
1,3,5
1,2,6 のような場合はどちらが大きくなるかと、辞書順、つまり
最初に見つかった違いで判断しているようです
0014デフォルトの名無しさん
2009/05/04(月) 22:25:14struct Set {
int a;
double b;
Set(int i, double d) : a(i), b(d) {}
};
bool operator==(const Set& a, const Set& b) {
return a.b == b.b;
}
bool operator<(const Set& a, const Set& b) {
return a.b < b.b;
}
int main()
{
std::multiset<Set> ms, ms2;
ms.insert(Set(1, 3.0));
ms.insert(Set(2, 1.0));
ms.insert(Set(2, 5.0));
ms2.insert(Set(1, 1.0));
ms2.insert(Set(3, 2.0));
ms2.insert(Set(3, 6.0));
ms2.insert(Set(3, 1.0));
if (ms > ms2)
std::cout << "ms > ms2\n";
}
0016デフォルトの名無しさん
2009/05/04(月) 22:52:26a < b の operational semantics として
lexicographical_compare(a.begin(), a.end(), b.begin(), b.end())
って書いてあるよ。
0017デフォルトの名無しさん
2009/05/04(月) 22:54:00手持ちの書籍を読んでもなかなか
SGIのホームページを見ると
Lexicographical comparison. This is a global function, not a member function.
とあるから間違いないと思いますが
規格書を読むと§23.1のTable65にやはり
convertible to bool lexicographical_compare linear
(a.begin(),a.end(),b.begin(),b.end())
pre: < is defined for values of T. < is a total ordering relation.
とあります
0018デフォルトの名無しさん
2009/05/04(月) 22:54:42という事で辞書順という事で決まり・・・みたいですね
0019デフォルトの名無しさん
2009/05/04(月) 23:06:37setの入れ子とかが出来るように適当に全順序決めてるだけだろうから
002011
2009/05/04(月) 23:09:32辞書順と言うことはすなわち
Rule1:msとms2で「格納している最小の要素」が大きい方を大きいとする。
Rule2:最小の要素が等しい場合は、それを除いてもうRule1を適用する。
Rule3:Rule2により要素が無くなったら、無くなった方が小さいとする。
ということですね。なんか変な定義ですねぇ。。。
ですが
ms.insert(Set(2, 1.0));
ms.insert(Set(1, 3.0));
ms.insert(Set(2, 5.0));
ms.insert(Set(2, 7.0));
と
ms2.insert(Set(2, 1.0));
ms2.insert(Set(1, 3.0));
ms2.insert(Set(2, 5.0));
ms2.insert(Set(2, 7.0));
ms2.insert(Set(2, 9.0));
とではms<ms2になるらしいですしやっぱりこういうことですよね。
ありがとうございました。
0021デフォルトの名無しさん
2009/05/04(月) 23:12:42std::lexicographical_compare()の動作の仕方を理解できればいいよ
002211
2009/05/04(月) 23:15:13setやmultisetが自動でソートされるから紛らわしいと感じるだけでした。
0023デフォルトの名無しさん
2009/05/04(月) 23:32:140025デフォルトの名無しさん
2009/05/05(火) 01:07:29割と大きめの行列にSVD(特異値分解)したいので
そういうライブラリを探しています。
それで、liboctave C++を使おうと思い以下のコードを試しに実行してみたのですが、
2x2程度の行列なら、1秒以内に完了するのですが、このコードだと15分たった現在も結果が返りません。
実際に演算にかけたい対象は、更に大きいものなので、これでは使い物にならないのですが・・・
こんなものなのでしょうか?また他に良いライブラリはないのでしょうか?確かSVDに関しては高速化の手法がいくつか考えられてたとおもうのですが・・・
Matrix m(5, 6);
m(0,0) = 1; m(0,1) = 0; m(0,2) = 1; m(0,3) = 0; m(0,4) = 0; m(0,5) = 0;
m(1,0) = 0; m(1,1) = 1; m(1,2) = 0; m(1,3) = 0; m(1,4) = 0; m(1,5) = 0;
m(2,0) = 1; m(2,1) = 1; m(2,2) = 0; m(2,3) = 0; m(2,4) = 0; m(2,5) = 0;
m(3,0) = 0; m(3,1) = 0; m(3,2) = 0; m(3,3) = 1; m(3,4) = 1; m(3,5) = 0;
m(4,0) = 0; m(4,1) = 0; m(4,2) = 0; m(4,3) = 1; m(4,4) = 0; m(4,5) = 1;
cout << "Original Matrix" << endl << m << endl;
SVD svd(m);
cout << "Left Singular Matrix" << endl << svd.left_singular_matrix() << endl;
cout << "Singular Values" << endl << svd.singular_values() << endl;
cout << "Right Singular Matrix" << endl << svd.right_singular_matrix() << endl;
cout << "Recomposed Matrix" << endl << svd.left_singular_matrix()*Matrix(DiagMatrix(svd.singular_values()))*svd.right_singular_matrix() << endl;
0026デフォルトの名無しさん
2009/05/05(火) 04:06:33ソースから作った?あと、ATLAS組み込んだ?
ATLASをgcc4&SSE4&マルチコア構成でmakeしてみて
liboctaveに組み込めばかなり高速化すると思う。
SVDの演算ならそんなもんだよ。
そんなに速度が欲しいなら、精度無視してNNを使った方法を取ったら?
0027デフォルトの名無しさん
2009/05/05(火) 09:48:54で、存在しないキーを指定してアクセスした時はそのキーが自動的に登録されそのキーに対応する値はその値の型のデフォルトコンストラクタによって初期化されると聞きました。
試したところ、たしかにthe_map["this key doesn't exist."]とするとその値はMyclass()で初期化されていました。
では
std::map<std::string, int> the_map;
だった場合も大丈夫なのでしょうか?
g++ではthe_map["this key doesn't exist."]とするとその値はint()で初期化されて0になっているようですが、これは他の環境でも期待して良い物でしょうか?
0028デフォルトの名無しさん
2009/05/05(火) 10:08:19引数なしのコンストラクタが呼ばれます
0029デフォルトの名無しさん
2009/05/05(火) 10:39:310030デフォルトの名無しさん
2009/05/05(火) 10:40:13はい、それですと、
int型のクラスで言うところのデフォルトコンストラクタ
により0で初期化してくれるのですか?
たとえばstd::string str;だとデフォルトコンストラクタにより""になりますけど
int i;だと初期化されませんよね。
・・・と思いましたが、そう言えばint()で0が返るんでしたね
失礼しました。
0031デフォルトの名無しさん
2009/05/05(火) 10:42:00組み込み型でもT()で全て初期化してくれるんじゃなかったか?
誰か有識者plz
0032デフォルトの名無しさん
2009/05/05(火) 11:02:21イニシャライザが空の括弧(要するに()のこと)の場合はdefault-initializeされ、
PODに対してのdefault-initializeとはzero-initializeであって、
スカラー型に対してのzero-initializeとはその型での値0をセットすることである
と決められてる
だからint()は0初期化が保証されてると考えておk
ちなみにint i;みたいなのは「イニシャライザなし」であって()で初期化する場合とは区別される
イニシャライザなしの場合は非PODはdefault-initializeだが、PODの場合は不定値と決まっている
0034デフォルトの名無しさん
2009/05/05(火) 11:41:15具体的には↓↓
pimplイディオムを使うことを想定してMyClassとMyClass_implを定義した。
class MyClass_impl;
class MyClass
{
boost::shared_ptr<MyClass_impl> pimpl;
public:
int foo();
//以下略
};
ここで、MyClassのpublicメンバ関数int foo()からMyClass_implのメンバ関数int foo()を呼び出すように
int MyClass::foo()
{return pimpl->foo();}
と定義しろと学んだんだが、これはどこに書くべきなの?
実装ファイル.cpp(MyClass_implの定義と実装が書かれている)に書くべきなのか、
それともMyClassクラスの定義されたヘッダファイル.hに書かないと意味ないの?
003534
2009/05/05(火) 11:44:16変更されないように極力努めるが、
実装ファイル.cpp(MyClass_implの定義と実装が書かれている)が
しょっちゅう変更される物として。
お願いします。
0036デフォルトの名無しさん
2009/05/05(火) 12:33:26MyClass.cppでfooの実装とMyClassImpl.hをインクルードすれば済むんじゃね?
0037デフォルトの名無しさん
2009/05/05(火) 13:56:10cpp内でPOD*をキャッチボールしたりコンストラクタが役立たずになったりして
コンパイラの最適化お仕事の邪魔になるだろうけど
003834
2009/05/05(火) 14:53:46int MyClass::foo()
{return pimpl->foo();}
これはどこに書くといいのかい?
0039デフォルトの名無しさん
2009/05/05(火) 15:17:54MyClass_implの定義は実装ファイル.cppに書かれてるんでしょ?
004034
2009/05/05(火) 15:26:33あ・・・そもそもMyClass_implが不完全型だから
fooを持っているかどうか分からないから書けないのか。
ごごごごごごごめん
正直すまんかった。
0041デフォルトの名無しさん
2009/05/05(火) 15:32:19cppに書けば実装を隠蔽できる
0042デフォルトの名無しさん
2009/05/05(火) 15:33:02ん?ClassとPlain Old Data、どっちで_implを実装すべきだというのだい?
興味あるからその辺の話を聞かせてほしい。
0044デフォルトの名無しさん
2009/05/05(火) 15:44:06004642
2009/05/05(火) 23:18:16明確な解ではないとはいえ、私の情報論理構成の範疇外の事象とは。
おっと、言葉が過ぎたようだ。また組織から小言をもらってしまう。
では。
004842
2009/05/06(水) 02:15:10004942
2009/05/06(水) 02:16:480050デフォルトの名無しさん
2009/05/06(水) 12:26:54みたいに書く時って、
std::cout << HOGE << ":" << PIYO << std::endl;
とどっちがいいの?
0051デフォルトの名無しさん
2009/05/06(水) 13:18:400052デフォルトの名無しさん
2009/05/06(水) 13:20:44しかし気にするほどではない。
0053デフォルトの名無しさん
2009/05/06(水) 13:24:50同じ文字列をマージする最適化をコンパイラが行うとかは考えられない?
0054デフォルトの名無しさん
2009/05/06(水) 14:13:20005511
2009/05/06(水) 14:19:35コンテナのa < b
lexicographical_compare(a.begin(), a.end(), b.begin(), b.end())
sed::setの場合は格納している値を辞書式に比較すると言うことでしたが、
std::mapの場合はどうなるのでしょうか?
mapの格納している要素はkeyと値の組になっていますが
どちらで比較するのでしょうか?
サンプルソース
C++ code - 51 lines - codepad
ttp://codepad.org/XOdZ3Avt
mymap<yourmapがtrueとなるのは
Rule1:mymapの最初のkey < yourmapの最初のkey の時。
Rule2:(mymapの最初のkey == yourmapの最初のkey) ならば (mymap[key]で得られる値 < yourmap[key]で得られる値) の時。
Rule3:最初のkeyも最初の値も同じなら、次の要素でRule1, Rule2を適用する。
Rule4:Rule3にてmymapの方がyourmapより先に次の要素が無くなった時。
といった感じがするのですが、ご存じの方いらっしゃいますか?
0057デフォルトの名無しさん
2009/05/06(水) 14:25:31全くどう使っていいのかわかりません…
画像付きで解説してるサイトはありませんか?
とりあえずハローワールドすら出来ないと泣きそうです
VBAなら少しさわったことあります
よろしくお願いします
0058デフォルトの名無しさん
2009/05/06(水) 14:28:56★初心者にVisual C++を教えるスレ★ Part33
ttp://pc12.2ch.net/test/read.cgi/tech/1235292263/
0059デフォルトの名無しさん
2009/05/06(水) 14:29:250062デフォルトの名無しさん
2009/05/06(水) 15:39:41あってんじゃね?俺も知らんけど、見た感じそうなってると思う。
0063デフォルトの名無しさん
2009/05/06(水) 15:56:35lexicographical_compare(a.begin(), a.end(), b.begin(), b.end())
は対応するイテレータがそれぞれ参照している要素をoperator<で比較していく。
mapのイテレータが参照しているのはpair<key_type,mapped_type>。
pair<first_type,second_type> x,y に対して x < y が真になるのは
x.first < y.first または !(y.first < x.first) && x.second < y.second が真になるとき。
0064デフォルトの名無しさん
2009/05/06(水) 15:58:48× !(y.first < x.first) && x.second < y.second
○ y.first == x.first && x.second < y.second
006564
2009/05/06(水) 16:07:080066デフォルトの名無しさん
2009/05/06(水) 17:49:02オススメはありますか?
上の方のレス見たらそんな本は捨てた方がいいとか書いてあって怖くなりました(間違った知識がつくんじゃないかと)
とりあえず古本屋も見てみたのですが、10年ぐらい前のしかありませんでした…
0067デフォルトの名無しさん
2009/05/06(水) 17:56:430068デフォルトの名無しさん
2009/05/06(水) 17:58:45さっそく買ってきます
0069デフォルトの名無しさん
2009/05/06(水) 19:11:350070デフォルトの名無しさん
2009/05/06(水) 19:36:39またはC++的にはこう書いた方が正しい等です。
//-------------------
class AA { int a1; };
//-------------------
class BB {
AA **app;
void setapp(int no) {
app = new (*AA)[no]; //<-ここが不明 エラーになる
}
};
//-------------------
int _tmain(int argc, _TCHAR* argv[])
{
BB dat;
dat.setapp(10);
}
1.<−−ここが不明の部分の書き方
2.こんなのは良くない、もっといい方法がある。
の2つです。お願いします。
0072デフォルトの名無しさん
2009/05/06(水) 20:34:12エラーメッセージが読めるようになってからまたお越し下さい。
0073デフォルトの名無しさん
2009/05/06(水) 20:37:40もしかして多言語の経験者かい?
007470
2009/05/06(水) 20:43:33エラーメッセージは上記です。 正直わからないから聞いているので。
答えられないのであればあきらめます。
0075デフォルトの名無しさん
2009/05/06(水) 20:45:14> 答えられないのであればあきらめます。
ああそうか、じゃあ俺の頭じゃ答えられないわ。
0076デフォルトの名無しさん
2009/05/06(水) 20:46:35007770
2009/05/06(水) 20:52:41出来ました、ありがとうございます。
所で、クラスの配列を動的に作ってアクセスする場合。
この様なポインターの配列をnewしてクラスデーターを入れて管理するのは。
ごく普通のやり方でしょうか? どうもなんか、いまいちなような気がして・・・
0078デフォルトの名無しさん
2009/05/06(水) 20:53:01> 2.こんなのは良くない、もっといい方法がある。
強いて挙げると
newで得た配列はデフォルトコンストラクタでしか初期化されません。
ポインタの(と言いますか組み込み型の)配列となると全く初期化されませんけど大丈夫ですか?
ということと
setappがpublic:じゃいのでアクセスできませんよ。
ということと
忘れずにdeleteしてくださいね
ということと
もしかしたらnewで例外が発生するかもしれませんよ
ぐらいかな。
0079デフォルトの名無しさん
2009/05/06(水) 20:57:12これでも>>78の問題はほとんどそのままだが。
008170
2009/05/06(水) 21:00:59//-------------------
class AA { int a1[10]; };
//-------------------
class BB {
public:
AA **app;
void setapp(int no) {
app = new AA*[no]; //<-ここが不明
}
};
//-------------------
int _tmain(int argc, _TCHAR* argv[])
{
BB dat;
dat.setapp(3);
dat.app[0] = new AA();
dat.app[1] = new AA();
dat.app[2] = new AA();
}
こんな感じでうまくいったのですが、本当にこのままでいいのだろうかという疑問が・・・
008270
2009/05/06(水) 21:06:150083デフォルトの名無しさん
2009/05/06(水) 21:08:14008478
2009/05/06(水) 21:10:22> こんな感じでうまくいったのですが、本当にこのままでいいのだろうかという疑問が・・・
>>78にあるとおり、良くない。
いつdeleteするかとか、newが4回あるうちのどこかで例外が発生しうるがその時はどうするかとかは?
たぶんboostないしstd::tr1のshared_ptrが必要になるのではないでしょうかね。
・・・ってstd::vector使ったこと無いのか。
じゃあまずSTLのお勉強だな。
0085デフォルトの名無しさん
2009/05/06(水) 21:14:260086デフォルトの名無しさん
2009/05/06(水) 23:45:57良いんだよね?別に。
そう言うこともあるよね?
0087デフォルトの名無しさん
2009/05/06(水) 23:50:53基本的には問題ないし、コンストラクタで正常にオブジェクトの構築が出来ないときは
例外を投げるのが最も適切。
もし、気になっている問題があるなら、具体的に書いてもらってもいいけど。
0088デフォルトの名無しさん
2009/05/07(木) 00:05:27全く問題ないよ。
0089デフォルトの名無しさん
2009/05/07(木) 00:13:08> (pairが)等価ベースとはどういう事でしょうか?
その元レスは直前のレスに対する独り言のようなものだろうから文面をそのまま受け取っては駄目。
おそらく以下の説明のようなことを踏まえての発言。
pairのoperator<はまずfirst同士を比較して、それが等しければsecond同士を比較するという流れ。
ここで等しければを判定するのに等値かどうかで判定するのではなく等価かどうかで判定する。
0090デフォルトの名無しさん
2009/05/07(木) 00:21:12後始末が必要なものをしっかりかたづけてればおk。
A(){
h = gethandle(); // 後で明示的に解放する必要あり
/* このあとに例外投げるかもしれない処理を行う */
}
~A(){
releasehandle(h);
}
みたいな場合、例外をコンストラクタの外に投げる前に後始末が必要。
0091デフォルトの名無しさん
2009/05/07(木) 00:32:28という仕事をするためのクラスを利用すると、例外に対処しやすい。
そういうクラス自体の設計時は例外安全に注意する必要がある(コンストラクタでうかつに例外を投げてはならない)
が、そういうクラスの利用者のほうは適当に例外を投げてもリソースリークが起こらないようになる。
0092デフォルトの名無しさん
2009/05/07(木) 00:44:59009391
2009/05/07(木) 01:02:48例えばスマートポインタを使う場合が最も分かりやすい。
次のようなクラス MyClass があったとする。
class MyClass {
public:
MyClass();
~MyClass();
private:
MyAnotherClass* p;
};
で、MyClass::MyClass() の内部で p = new MyAnotherClass(); などとして、
MyClass::~MyClass() で delete p; しているとする。この場合、MyClass::MyClass() が迂闊に例外を
スローすると、MyClass::~MyClass() が実行されないためにpが解放されない場合があるから、
例外をスローする場合はpの解放がきちんとされるように、注意深くコードを書かなければならない。
ただし、メンバ変数 p をポインタではなくスマートポインタとすると、そのような注意は不要となる。
例えば std::auto_ptr<MyAnotherClass> p; となっていて、MyClass::MyClass() の内部で
p(new MyAnotherClass()); とした場合、たとえMyClass::MyClass()が例外をスローしても
newされたものはちゃんと解放されるから、神経質にならなくて済む。
忘れてはならないのは、スマートポインタのコンストラクタが迂闊に例外をスローしてしまうと、
結局、リソースリークの可能性は消えないということだ。まあ自分でスマートポインタを書いて使うことは
普通の人はないと思うけど、実際 boost::shared_ptr 等はコンストラクタで例外を投げる場合があり、
その場合でもリソースリークが起こらないようにちゃんと配慮されている。
009491
2009/05/07(木) 01:08:31コンストラクタのメンバ初期化子に書いたと思ってくれ。
0095デフォルトの名無しさん
2009/05/07(木) 08:24:20「そういうクラス」「そういうクラスの利用者」って何?
「そういうクラスの利用者『のほう』」って何と比べてるの?
0096デフォルトの名無しさん
2009/05/07(木) 10:34:03文脈から明らかでないか?
0097デフォルトの名無しさん
2009/05/07(木) 11:10:34明らかだと思うなら、どう明らかか書けばいい。
0098デフォルトの名無しさん
2009/05/07(木) 11:16:18>>93に登場するクラスのどれが、「そういうクラス」に相当するのか?
009911
2009/05/07(木) 11:35:51等値(equality)
a == b
等価(equivalence)
!(a < b) && !(b < a)
これの事ですね。
ありがとうございました。
0100デフォルトの名無しさん
2009/05/07(木) 11:36:10std::auto_ptr とか boost::shared_ptr とかが「そういうクラス」。
0101100
2009/05/07(木) 11:37:50std::auto_ptr<MyAnotherClass> とかが「そういうクラス」だと思ってもらえれば。
0103デフォルトの名無しさん
2009/05/07(木) 15:40:22thx
0104デフォルトの名無しさん
2009/05/09(土) 16:12:48for( std::vector< std::pair< key_t, value_t > >::iterator i = i.begin();....
というコードがあるとして、for文の「std::vector< std::pair< key_t, value_t > >」のように
長いテンプレート型書く必要が多々あり、それが面倒に感じます。
「v.self_type」のような、変数名から型を引っ張ってくるような
仕組みは出来ないものでしょうか?
0105デフォルトの名無しさん
2009/05/09(土) 16:15:390106デフォルトの名無しさん
2009/05/09(土) 16:22:020107デフォルトの名無しさん
2009/05/09(土) 16:25:100108デフォルトの名無しさん
2009/05/09(土) 16:32:54承知しました。
ありがとうございました。
0109デフォルトの名無しさん
2009/05/09(土) 17:09:320110デフォルトの名無しさん
2009/05/09(土) 17:10:34だからC++03ではtypmlateのtypedefは無理だっつーに
0111デフォルトの名無しさん
2009/05/09(土) 17:11:17○template
0112デフォルトの名無しさん
2009/05/09(土) 17:16:55部分特殊化のような形の typedef は無理だが
>>104 みたいなのは全く問題ないっつーか、常套手段だろ
0113デフォルトの名無しさん
2009/05/09(土) 17:17:48パラメータが確定してるテンプレートクラスならできるぞ
できないのはtypedefのテンプレート
0114デフォルトの名無しさん
2009/05/09(土) 17:17:57・・・まさかやったこと無いわけじゃないよな?
0115デフォルトの名無しさん
2009/05/09(土) 17:21:48通りませんでしたよ^^
VC2008
0116デフォルトの名無しさん
2009/05/09(土) 17:30:400117デフォルトの名無しさん
2009/05/09(土) 17:55:020118デフォルトの名無しさん
2009/05/09(土) 18:03:04using alias使うんだよ
using hoge = std::vector< std::pair< key_t, value_t > >;
0119デフォルトの名無しさん
2009/05/09(土) 18:19:02また的外れてるし。
0120デフォルトの名無しさん
2009/05/09(土) 18:48:32これは釣りだろ
0121デフォルトの名無しさん
2009/05/09(土) 23:06:38atom330でも問題なさそうでしょうか
あまりに重そうならE1400辺りで自作しようと思います
0122デフォルトの名無しさん
2009/05/09(土) 23:46:34IDE使いたいなら話は別だが
0123デフォルトの名無しさん
2009/05/10(日) 00:12:43全く問題ないよ。
IDE使ったところで問題なんて起きないから大丈夫。
0124デフォルトの名無しさん
2009/05/10(日) 00:20:19変数の値を常に表示する方法はありますか?
現在はcout<<hoge;みたいなものを随所に入れています
VBにあったウォッチウィンドウみたいな奴が欲しいです・・
0125デフォルトの名無しさん
2009/05/10(日) 00:34:37デバッグ|ウィンドウ|ウォッチ
デバッグ|クイックウォッチ
0126デフォルトの名無しさん
2009/05/10(日) 00:34:47無いわけ無い。
それともEEだと存在しないとか??
0127デフォルトの名無しさん
2009/05/10(日) 00:44:28ttp://www1.axfc.net/uploader/Img/so/45753.jpg
ないっぽいです・・
イミディエイトウィンドウならあるんですが、無料だとこんなものかもしれません
0128デフォルトの名無しさん
2009/05/10(日) 00:51:16メニューにはデバッグ実行中でないと出てこないはず
というか、初期状態でデバッグ実行したら下に自動変数とかローカル変数のタブ出てこない?
0129デフォルトの名無しさん
2009/05/10(日) 00:53:320130デフォルトの名無しさん
2009/05/10(日) 00:55:52コッソリタブが増えてました
こりゃ気づきませんぜ・・
0131デフォルトの名無しさん
2009/05/10(日) 05:03:03いや、まぁ・・・気づくけどな。
0132デフォルトの名無しさん
2009/05/10(日) 09:21:46普通はなかなか気づかないだろう。
0133デフォルトの名無しさん
2009/05/10(日) 09:26:070134デフォルトの名無しさん
2009/05/10(日) 09:29:170135デフォルトの名無しさん
2009/05/10(日) 11:09:06いくつかのショートカットキーとか
0136デフォルトの名無しさん
2009/05/10(日) 17:08:18代入する時と参照する時とで挙動が完全に変わってしまいます。
C#のgetメソッドやsetメソッドのような完全な書き分けってどうやるんでしたっけ。
0137デフォルトの名無しさん
2009/05/10(日) 17:12:27挙動が異なるなら、別の表記を取るのが一番間違いが無い
0138デフォルトの名無しさん
2009/05/10(日) 17:13:10proxyクラスでも使え
0139デフォルトの名無しさん
2009/05/10(日) 17:13:45それで大丈夫なものなのかは疑問だ
0140デフォルトの名無しさん
2009/05/10(日) 17:14:40個人的にはあまり好きではないな
0143デフォルトの名無しさん
2009/05/10(日) 17:18:27細かい技法を使わないと演算子のオーバーロードでは実現できないような処理は
普通のメンバ関数にしてしまった方がいいと個人的には思う
0144デフォルトの名無しさん
2009/05/10(日) 17:48:08同じように見せたいのなら<map>みたいにすればいいと思うけど
0145デフォルトの名無しさん
2009/05/10(日) 18:00:21std::cout << hoge;ならサンプルコードが良く見つかるのですが。。。
0146デフォルトの名無しさん
2009/05/10(日) 18:17:540147デフォルトの名無しさん
2009/05/10(日) 18:22:19というのは、例えば
std::string str;
std::cin >> str;
としてstrから適切に処理すれば良いってことですか?
0148デフォルトの名無しさん
2009/05/10(日) 18:32:28(n,m) の形式で読み取るが、どのようにして実現しているのか
考えるのも楽しいものだ
0149デフォルトの名無しさん
2009/05/10(日) 18:33:270150147
2009/05/10(日) 19:52:38ありがとうございます。
さっそく見てみます。
>>149
ありがとうございます。
宣言の方は
std::ostream& operator << 〜
で理解しました。
0151デフォルトの名無しさん
2009/05/10(日) 21:46:01ttp://codepad.org/YWNCgmUO
このソースはgccに付いてきた
std::complex<〜>のstd::istream& operator>>(std::istream&,complex&);のソースなのですが、
この
if (__ch == ')')
__x = complex<_Tp>(__re_x, __im_x);
else
__is.setstate(ios_base::failbit);
が何をしているのか分かりません。
自分なりに推測するとstd::istreamで読み込んでいった結果、所定のフォーマットになっていない(閉じ括弧がおかしい)場合にエラーを伝えるべくsetstateとやらをしているようなのですが、
__is.setstate(ios_base::failbit);
ってどういう意味ないし効力なのでしょうか?
0152デフォルトの名無しさん
2009/05/10(日) 22:00:38これがCとは違う所
この状態をクリアするにはis.clear()を行う
0153151
2009/05/10(日) 22:02:27フラグ立てですか。
読み込みに失敗したと言うことで、エラー状態にしているわけですね。
ありがとうございます。
・・・でも何で例外を投げる仕様にしなかったのでしょう?
使いづらそうな。。。
0154デフォルトの名無しさん
2009/05/10(日) 22:04:400155デフォルトの名無しさん
2009/05/10(日) 22:05:300156デフォルトの名無しさん
2009/05/10(日) 22:06:21例外を投げる事もできる
ただ歴史的経緯があって例外がC++に存在しなかった時代から
iostreamは使われて来ているわけでデフォルトで例外はOFFに
されている
例外を投げるにはメンバ関数exceptions()にトリガとなるビットを
セットすればよい
0158デフォルトの名無しさん
2009/05/10(日) 22:15:39Boost C++ libraries 第二版
0159デフォルトの名無しさん
2009/05/10(日) 22:45:39はじめてのC。
電車の中で立ち読みして
JKやOLからの冷たい視線でたまらなく興奮する人にお勧め。
0160デフォルトの名無しさん
2009/05/10(日) 22:48:21やさしいC++
電車の中で読む度胸はないぜ
0161デフォルトの名無しさん
2009/05/11(月) 00:01:31配列1[i]=配列2[i]などとしてforで回すのが一般的でしょうか
0162デフォルトの名無しさん
2009/05/11(月) 00:04:140163デフォルトの名無しさん
2009/05/11(月) 00:05:590164デフォルトの名無しさん
2009/05/11(月) 00:07:18一見関数だらけになるが、恐ろしいほど最適化される。
0165デフォルトの名無しさん
2009/05/11(月) 00:09:03ありがとうございます
とりあえず全部試して見ます
0166デフォルトの名無しさん
2009/05/11(月) 08:04:07Programming - Principles and Practice Using C++
0167デフォルトの名無しさん
2009/05/12(火) 22:16:57で &v[0] を char 256個の配列として扱って良いものですか?
0168デフォルトの名無しさん
2009/05/12(火) 22:41:08> &v[0] を char 256個の配列として扱って良いものですか?
v[0]でvの先頭要素のリファレンスが返ってくる。
そして&v[0]はそのアドレスを取得している。
よって先頭アドレスが取得できるのか?ということかい?
たしかOKと聞いたことがあるなぁ。
C++編(標準ライブラリ) 第2章 vector
ttp://www.geocities.jp/ky_webid/cpp/library/002.html
の○生の配列との関連のところで。
0169デフォルトの名無しさん
2009/05/12(火) 23:11:26ええよ
C++98とC++03間の変更点の一つにvectorはリニアアドレス↑に
取られる事が保証されたというのがある
規格票を見れば書いてあるはず
stringはまだでc++0xで保証される予定
0170デフォルトの名無しさん
2009/05/13(水) 05:29:54例えば、ボタンの上にマウスを持っていった時に、ヘルプメッセージを出す事を考えます。
所謂コマンドパターンによる実装になると思うのですが、
ボタンが親子関係でもないオブジェクトの参照を持つ事になり、気持ち悪く感じます。
これは気にしても仕方ない事なのでしょうか?
0171デフォルトの名無しさん
2009/05/13(水) 08:13:100172デフォルトの名無しさん
2009/05/13(水) 18:48:03>所謂コマンドパターン
って言ってみたかっただけなんじゃ
0173167
2009/05/13(水) 21:17:48ありがとうございます。
std::string の c_str() のようにポインタを取得するというメソッドが
無いので、もしかしてやっちゃいけないことなのかと不安に思ったのです。
0174デフォルトの名無しさん
2009/05/13(水) 21:43:46アセンブラも勉強した方がいいのかな?
0175デフォルトの名無しさん
2009/05/13(水) 21:47:28意識せずとも、いずれ自然に必要になって自然に勉強してる
0177デフォルトの名無しさん
2009/05/13(水) 23:27:37特にSSE2/SSE3関連は
0178デフォルトの名無しさん
2009/05/14(木) 00:48:26クラスの関連が複雑になるのと、オブジェクトの寿命管理の点が気になりました。
> 履歴一覧を表示する元に戻すボタンでも実装するのか?
これも1つです。
ソースの見通しが悪くなり、あとで機能を追加したいと思った時に困るのではないかと思いました。
0179デフォルトの名無しさん
2009/05/14(木) 01:13:320180デフォルトの名無しさん
2009/05/14(木) 01:53:25最初は難しいイメージがあったが、やってみるとそうでもなかった。
0181デフォルトの名無しさん
2009/05/14(木) 02:25:47調べてみてはいるのですが、なかなかうまく動きません。
乱数生成のためのソフトとかはいるのでしょうか?
もしお暇がありましたらよろしくおねがいします。
0182デフォルトの名無しさん
2009/05/14(木) 02:30:59今、どれくらいの知識を持ってるの? どんなコード書いてみたの?
とりあえず、標準Cライブラリの rand っていう関数は知ってる?
0183デフォルトの名無しさん
2009/05/14(木) 02:31:35srand((unsigned int)time(0));
r = rand() / RAND_MAX;
printf("%lf", r);
0184デフォルトの名無しさん
2009/05/14(木) 02:44:000185デフォルトの名無しさん
2009/05/14(木) 02:54:43きっと0か1しか返さないぞ。
>>178
>ボタンが親子関係でもないオブジェクトの参照を持つ
ここでいってるオブジェクトってコマンドクラスのこと?
同じボタンの機能がころころ変化するのでもなければ
参照を持つ必要なんて無いと思うけど?
どうしてもUIにヘルプ文字列を埋め込みたくないのなら
コントロールクラスに自分(ボタン)が今どんな機能なのか
問い合わせるメソッドでも作ったら?
0186デフォルトの名無しさん
2009/05/14(木) 03:34:01rand関数はさっきから学びはじめたばかりです。
知識は基本的なプログラムならつくれる程度です。
0187デフォルトの名無しさん
2009/05/14(木) 03:38:42ゲームのサイコロ振るくらいに使うならいいけど
0188デフォルトの名無しさん
2009/05/14(木) 03:40:12rand関数は、0 から RAND_MAX までの範囲の整数を返す。
(RAND_MAX は実際にはある特定の数値であり、コード中に RAND_MAX と書けばその数値として扱われる)
後は、0 から RAND_MAX までの範囲の整数を、0 から 1 までの間の小数の値に変換すればよい。
>>183-185あたりを参考に。まだ分からんところがあったら聞いてくれ。
もし本格的な乱数を使用したいなら、boostのrandomってのを調べてみるといいが、
まあそこまでする気がないならrandでいいよ。
0189デフォルトの名無しさん
2009/05/14(木) 03:43:14本格用途ではなくごく簡単なプログラムで、サイコロを振る程度です。
>>188
rand関数について自分でも調べていたところです。
丁寧におしえていただきありがとうございます。
もしわからないことがあったら書き込みたいと思います。
ありがとうございました!
0190189
2009/05/14(木) 04:34:11#include <stdlib.h>
#include <time.h>
int main(void)
{
double random;
srand((unsigned) time(NULL)); // rand関数による乱数生成を不規則にする
for(int i=0; i<20; i++){
random = (double)rand()/RAND_MAX; // 0から1までの乱数の生成
printf("%f\n",random); // 表示する
}
}
ここでのアドバイスなどをもとにして自分でつくりました。
コメントは自分でつけたので語弊があるかもしれません。
0191189
2009/05/14(木) 05:08:06#include <stdlib.h>
#include <time.h>
int main(void)
{
double random;
srand((unsigned) time(NULL)); // rand関数による乱数生成を不規則にする
for(int i=0; i<20; i++){
random = (double)rand()/RAND_MAX; // 0から1までの乱数の生成
printf("%f\n",random); // 表示する
}
}
ここでのアドバイスなどをもとにして自分でつくりました。
コメントは自分でつけたので語弊があるかもしれません。
0192189
2009/05/14(木) 05:11:06上のプログラムだと乱数表示はされるのですが
一個だけ乱数表示するプログラムを実行すると、何度実行してもほとんど変わらない乱数
(例えば、0.963742 ⇒0.972378 ⇒0.981201など)
になってしまいます。
良い解決方法はないでしょうか?
0193デフォルトの名無しさん
2009/05/14(木) 05:37:580194デフォルトの名無しさん
2009/05/14(木) 06:28:58> ここでいってるオブジェクトってコマンドクラスのこと?
> 同じボタンの機能がころころ変化するのでもなければ
> 参照を持つ必要なんて無いと思うけど?
ヘルプメッセージを表示するクラスのメンバ関数をboost::functionに入れてボタンクラスに渡すという意味です。
Clickなど他のイベントも同様に「他のクラスのメンバ関数をboost::functionに入れて〜」とやっていったらクラスの関連が複雑になるのではないのかと。
また、boost::functionの中で保持されているポインタの寿命(有効か)の不安を感じます。
0195デフォルトの名無しさん
2009/05/14(木) 06:33:380196デフォルトの名無しさん
2009/05/14(木) 07:42:43struct B:A{virtual int operator()(int)=0;};
struct C{A&x;C(A&a):x(a){} int operator()(int i){return static_cast<B&>(x)(i);}};
struct D:A{void operator()(){}} d;
int f(){
C c(d);
c();
return c(1u); // これ・・・
}
コンパイルを通ってしまわない様にするにはどう改造すればいいのでしょう?
0197デフォルトの名無しさん
2009/05/14(木) 08:01:28コンパイルが通らないようにする方法ならいくらでもわるわけで、
何がしたいのか挙げてもらわないと望む答えは得られないでしょう。
0198196
2009/05/14(木) 08:10:12struct C{A&x;C(A&a):x(a){} int operator()(int i){return static_cast<B&>(x)(i);} void operator()(){x();}};
0199デフォルトの名無しさん
2009/05/14(木) 09:03:46なんのために+1.0するの?
0200デフォルトの名無しさん
2009/05/14(木) 09:06:17結果に整数 N をかけることで、簡単に N とおりの選択に使う乱数が得られる。
「0 から 1 の乱数」が 1.0 を含んでいると、こうはいかない。
0201デフォルトの名無しさん
2009/05/14(木) 09:12:53今回の目的は
「0から1の乱数を表示させる」
だけど、いいの?
0202デフォルトの名無しさん
2009/05/14(木) 09:20:22日本語だけでは閉区間なのか開区間なのか、区別がつかないんで、
質問者に判別してもらうしかないな。
簡単なサイコロの用途であれば 200 の性質が役に立つはずなんだけど。
0203デフォルトの名無しさん
2009/05/14(木) 09:22:50random = rand()%6; // で、十分。
0204189
2009/05/14(木) 11:12:04「GetTickCount()識別子が見つかりませんでした」とでます。
変数として扱われているのですかね・・・
他のプログラムをみてみたのですが使い方がわかりません
勉強不足ですよねスミマセン
>>195
お返事ありがとうございます
プログラムの下から4行目のことですよね?
してみたのですがほとんど値がかわりませんでした
何かまちがっているでしょうか
0205189
2009/05/14(木) 11:13:50「GetTickCount()識別子が見つかりませんでした」とでます。
変数として扱われているのですかね・・・
他のプログラムをみてみたのですが使い方がわかりません
勉強不足ですよねスミマセン
>>195
お返事ありがとうございます
プログラムの下から4行目のことですよね?
してみたのですがほとんど値がかわりませんでした
何かまちがっているでしょうか
0206189
2009/05/14(木) 12:43:26GetTickCount()は識別子が定義されてませんとでてしまいます
変数としてあつかわれてしまっているようです
>>195
お返事ありがとうございます
1を足したのですがあまり乱数はかわらなかったのですが
何かまちがっているのでしょうか
0207195
2009/05/14(木) 12:45:450208189
2009/05/14(木) 12:49:10GetTickCount()は識別子が定義されてませんとでてしまいます
変数としてあつかわれてしまっているようです
>>195
お返事ありがとうございます
1を足したのですがあまり乱数はかわらなかったのですが
何かまちがっているのでしょうか
0209189
2009/05/14(木) 12:51:070210189
2009/05/14(木) 12:55:04[0,1)区間となっています。0以上1未満ということです。
サイコロの乱数程度といってしまいましたが
サイコロは関係ありません
0211デフォルトの名無しさん
2009/05/14(木) 13:25:26windows.hをインクルードしてないとか言うなよ
0212デフォルトの名無しさん
2009/05/14(木) 13:29:260213189
2009/05/14(木) 13:30:44ご指摘ありがとうございます。
してませんでした。
0215デフォルトの名無しさん
2009/05/14(木) 23:50:55繰り上げるには何をつけたらいいんですか?
0216デフォルトの名無しさん
2009/05/14(木) 23:53:45Cにもある
0217デフォルトの名無しさん
2009/05/14(木) 23:55:090218デフォルトの名無しさん
2009/05/15(金) 00:16:28因みに俺は小数点以下の「繰り上げ」なる概念について知らないので答えられん
0219デフォルトの名無しさん
2009/05/15(金) 00:17:500220215
2009/05/15(金) 00:21:120221デフォルトの名無しさん
2009/05/15(金) 00:25:230222デフォルトの名無しさん
2009/05/15(金) 09:52:02それって偏りが出るよね。
0223デフォルトの名無しさん
2009/05/15(金) 10:02:1132767程度あれば、5461回が5462回になる程度のばらつきだよ。
0224デフォルトの名無しさん
2009/05/15(金) 10:22:090225デフォルトの名無しさん
2009/05/15(金) 10:23:33サイコロに偏りが無いとでも?
0226デフォルトの名無しさん
2009/05/15(金) 10:45:400227デフォルトの名無しさん
2009/05/15(金) 12:14:07知っているのは、modern C++ と、テンプレートテクニックという本です。
良いサイトや良い本の情報ください。
0228デフォルトの名無しさん
2009/05/15(金) 12:26:080229デフォルトの名無しさん
2009/05/15(金) 12:53:18取得する方法ってありますか?常駐ソフトのような形で、起動してからクリック、ドラッグ
したファイルのパスをテキストログとして、出力するようなものを作りたいのですが・・・。
0230デフォルトの名無しさん
2009/05/15(金) 12:56:300231デフォルトの名無しさん
2009/05/15(金) 13:00:38そんな乱数でもない数列をrand()という名前の関数の出力にする処理系が悪い。
ゴミだから早急に廃棄しろ。
0232デフォルトの名無しさん
2009/05/15(金) 13:39:39製作工程の都合で、1,6の面積が微妙に大きいという話しか?
それとも、くりぬかれた目による重心のずれ、密度の偏りの方か?
0233デフォルトの名無しさん
2009/05/15(金) 13:55:52ありがとうございます。
翻訳出てないんですかね……残念です。
C++の一番の特徴であるテンプレート関係の本が少ないのは何故?
わかりやすくテクニックを知りたいのに
0234デフォルトの名無しさん
2009/05/15(金) 15:54:15C++で、配列で宣言した変数は、跡になってから自らがいくつの要素を持つ配列なのかチェックする方法ってありますか?
Javaだと、
String str[] = new String[3]
のように宣言した場合、
str.length を見れば要素数を見ることができますが、C++の場合は方法ありますか?
0235デフォルトの名無しさん
2009/05/15(金) 15:56:52ないから素直にstd::vector使っとけ
0236デフォルトの名無しさん
2009/05/15(金) 15:57:32sizeof(str) / sizeof(str[0]) で自分は調べてる
0237デフォルトの名無しさん
2009/05/15(金) 15:58:40アホか
0238デフォルトの名無しさん
2009/05/15(金) 16:03:46俺も>>236を常用してるけど・・
0239デフォルトの名無しさん
2009/05/15(金) 16:07:00char * foo = new char[3];
した場合は要素数を知る手段はない。
char foo[] = "abc";
した場合は要素数(≠文字数)を>236で得られる。
0240234
2009/05/15(金) 16:20:29C言語の場合、
配列を作ったら作りっぱなし、メモリのどこまでがその配列に割り当てられた場所かという情報はどこにもないという認識で良いですか?
たとえば10要素の配列を作ったあとに20番目の要素にアクセスしようとすると、JAVAだとぬるぽが出て教えてくれますが、
Cの場合はシステムから見てそれが分からずに、20番(に相当する場所)を読みに行ったり、書き込んでしまう という理解で良いですか?
0241デフォルトの名無しさん
2009/05/15(金) 16:25:57ちなみにここはC++のスレです。
0242デフォルトの名無しさん
2009/05/15(金) 16:39:03そうです
運が良ければアプリ自体が吹っ飛んでくれますが運が悪いとそのままメモリ破壊して動き続けます
なのでJavaしかできない人が集まってC++案件とかやるととても楽しいことになります
0243デフォルトの名無しさん
2009/05/15(金) 16:41:59「Javaしかできない人」ではなく、「Javaもできない人」
0244デフォルトの名無しさん
2009/05/15(金) 16:47:00大きな勘違いをしている。
>配列を作ったら作りっぱなし、メモリのどこまでがその配列に割り当てられた場所かという情報はどこにもないという認識で良いですか?
配列は、>36でサイズを得ることができる。
つまり、newなんていう外道なモノを使わずに、(昔なつかしの)固定長配列を使うかstd::vectorを使えと言うことだ。
0245デフォルトの名無しさん
2009/05/15(金) 20:48:500246デフォルトの名無しさん
2009/05/15(金) 21:16:41何??
0247デフォルトの名無しさん
2009/05/15(金) 21:18:100248デフォルトの名無しさん
2009/05/15(金) 21:19:500249デフォルトの名無しさん
2009/05/15(金) 21:22:370250デフォルトの名無しさん
2009/05/15(金) 21:50:310251デフォルトの名無しさん
2009/05/15(金) 21:52:470252デフォルトの名無しさん
2009/05/15(金) 22:09:270253デフォルトの名無しさん
2009/05/16(土) 22:00:39原文の構成もひどいけど。
規格をもっと読みやすくしたような、同じだけ詳しい本ってあるんでしょうか?
0254デフォルトの名無しさん
2009/05/16(土) 22:06:550255デフォルトの名無しさん
2009/05/16(土) 22:15:03訳が酷いわけじゃない。
0256デフォルトの名無しさん
2009/05/17(日) 01:01:570257デフォルトの名無しさん
2009/05/17(日) 01:56:44訳してたんじゃないか?w
0258デフォルトの名無しさん
2009/05/17(日) 02:35:49例えば、char[3] 型の最初の要素のアドレスをchar*型に代入したら
もうメモリサイズがわからなくなるのは当然といえば当然。
char[3] 型を char[3] 型に代入する分にはちゃんとサイズがわかる。
という感じかしら
0259デフォルトの名無しさん
2009/05/17(日) 04:11:030260デフォルトの名無しさん
2009/05/17(日) 04:25:190261デフォルトの名無しさん
2009/05/17(日) 08:18:010262デフォルトの名無しさん
2009/05/17(日) 08:57:46unlambdaやれば全てが関数だからオススメ。
0263デフォルトの名無しさん
2009/05/17(日) 09:49:55またあるとして、現実的に気にした方が良いですか?
0264デフォルトの名無しさん
2009/05/17(日) 10:53:44言語仕様としてはメモリの許す限りおk
0265デフォルトの名無しさん
2009/05/17(日) 10:56:290266デフォルトの名無しさん
2009/05/17(日) 11:16:18じゃあ気にせず行きます!
0267デフォルトの名無しさん
2009/05/17(日) 11:29:51120文字超えてたらちょっとイラッとする。
0268デフォルトの名無しさん
2009/05/17(日) 11:32:26コピー返しでも可能ならconstにしろ
とEffective C++で言われていましたが、
なぜか返り値がbool型だけはconst付けない風習がありません?
例: bool is_valid() const {return member?true:false;}
この場合も返り値にconst付けた方が良いのでしょうか?
0269デフォルトの名無しさん
2009/05/17(日) 11:34:170270デフォルトの名無しさん
2009/05/17(日) 11:54:31メリットはなに?
0272デフォルトの名無しさん
2009/05/17(日) 12:12:37なんてできません。
馬鹿って言う人が馬鹿なんだぞw
ちゃんと読もうぜ。
0273デフォルトの名無しさん
2009/05/17(日) 12:25:20テンプレート引数にするときにいいことってある?
自分は組み込み型にはconst付けない派だな
0274デフォルトの名無しさん
2009/05/17(日) 12:34:530275デフォルトの名無しさん
2009/05/17(日) 12:35:35全くない。
むしろ
組み込み型戻り値のconstは
環境によってはwarningやerrorになるから
うっとうしいことこの上ない。
0276デフォルトの名無しさん
2009/05/17(日) 13:02:350277271
2009/05/17(日) 13:06:18> >組み込み型の返り値を万が一変更する
> なんてできません。
有名どころのコンパイラならちゃんとコンパイルエラー出してくれるみたいですが
環境が違っても確実に予防してくれるのでしょうかね?
>>274
Exceptional C++だったかもしれません。
>>275
gccやboostの実装でも確かに組み込み型の戻り値にconstは付いていないようですね。
0278デフォルトの名無しさん
2009/05/17(日) 13:59:47どういう意味なの?
0279デフォルトの名無しさん
2009/05/17(日) 14:00:46private継承も分かる。
ではprotected継承は?
使ったことある人います?(遊びじゃなく実用で。)
0280デフォルトの名無しさん
2009/05/17(日) 14:17:27Effecitve C++ 2ndの21節と29節に書いてあるのは、
非組み込み型のコピーを返す関数を左辺値として使われないように、
左辺値になり得る型が戻り値の場合はconst付けよーねってことと、
const宣言したメソッドがデータのハンドル(stringクラスのcharポインタとか)を
返却するときは戻り値にconst付けよーねってこと。
わざわざ押し入れからEffectiveC++取り出してきた俺に
プッチンプリン買ってこいw
>環境が違っても確実に予防してくれるのでしょうかね?
ぶっ壊れたコンパイラの話をされても困る。
0281デフォルトの名無しさん
2009/05/17(日) 14:18:550283デフォルトの名無しさん
2009/05/17(日) 14:35:030284デフォルトの名無しさん
2009/05/17(日) 17:10:42非組み込み型の戻り値について const つけてあると、右辺値参照として取れなくなっちゃいそう。
この指針は将来的に非推奨になるんじゃなかろうか?
0285デフォルトの名無しさん
2009/05/17(日) 17:52:26Effective C++で問題が広く知れ渡ったことで
実装されることになったんじゃないかな。
ぷらぷら界に多大な影響を与えた引き替えに、
次の版は全面改定だな。
0286デフォルトの名無しさん
2009/05/17(日) 17:55:230287デフォルトの名無しさん
2009/05/17(日) 17:56:06専用スレがあるから、まずはそっちで。
↓
CPPUnitについて少し話そうかい
http://pc12.2ch.net/test/read.cgi/tech/1042358524/
0288デフォルトの名無しさん
2009/05/17(日) 18:07:210289デフォルトの名無しさん
2009/05/17(日) 18:09:03コピーになったりすることが考えられる。まぁ最適化の範疇と認識する分には問題には
ならないんだろうけど。
0290デフォルトの名無しさん
2009/05/17(日) 19:44:11C++0xが出れば解説も増えるかな?
0291デフォルトの名無しさん
2009/05/17(日) 20:32:36もとのオブジェクトが捨てられる場面で、
コピーコンストラクタを呼ばないでよりコストの低い破壊的なコピー、
つまりオブジェクトのメンバを移動することをするってことなんでしょ?
ただそれだけでしょ?
0292290
2009/05/17(日) 21:12:34戻値最適化
とは違うのかいな?
C++ ラビリンス Return value and constructor
ttp://www.fides.dti.ne.jp/~oka-t/cpplab-retval-ctor.html
0293デフォルトの名無しさん
2009/05/17(日) 21:12:36ほかに分かりやすい例を挙げるとしたらauto_ptr(の後継)がvectorに入れられるようになることとか、
functionやbindなどで各引数のconstや参照の有無の挙動を完全に再現したoperator ()を実現できるなんて効果がある。
0294デフォルトの名無しさん
2009/05/17(日) 21:27:43どう書くのが良いでしょうか。
1次元の場合は std::fill や std::fill_n が使えるのですが。
int a[10][10];
for(int i=0; i < 10; i++)
for(int j=0; j < 10; j++)
a[i][j] = 42;
ということをしたいわけです。
0295デフォルトの名無しさん
2009/05/17(日) 21:28:25最初の例や2番目のコピーコンストラクタ・代入演算子が呼ばれる例でもムーブセマンティクスは効く。
そこのコピーコンストラクタ・代入演算子の呼出が、ムーブコンストラクタ・代入演算子の呼出になる。
一般にムーブコンストラクタ代入演算子はコピーコンストラクタと違って、
それより遙かに低コストで例外の投げようもない実装になるので、より最適なコードになるとされる。
0296デフォルトの名無しさん
2009/05/17(日) 21:31:12自分で書いてるじゃねーか。何が不満なの?
0297デフォルトの名無しさん
2009/05/17(日) 21:34:040299デフォルトの名無しさん
2009/05/17(日) 21:46:45memset(a, 42, 100);
で、いいんでない。string.h が使える環境なら
それより最近、スザンヌとギャル曽根の区別が付かなくて困ってます
見分け方を教えてください
0300デフォルトの名無しさん
2009/05/17(日) 21:47:47int に memset() して 42 になるとでも思ってんのか?
0302デフォルトの名無しさん
2009/05/17(日) 21:51:12これはひどい。
0303299
2009/05/17(日) 21:52:38回線切って(ry
0305デフォルトの名無しさん
2009/05/17(日) 22:04:38お前の方がよっぽど暇人に見えるんだが
0306デフォルトの名無しさん
2009/05/17(日) 22:11:27その配列だったら連続性が保証されてるから
std::fill_n(&a[0][0], 100, 42)
でいいだろ。
0307デフォルトの名無しさん
2009/05/17(日) 22:12:15お好きなほうをどうぞ。
std::fill_n(&a[0][0], sizeof a / sizeof a[0][0], 42);
namespace bll = boost::bind;
std::for_each(a, a + sizeof a / sizeof a[0], bll::bind(std::fill_n<int*, std::size_t, int>, bll::_1, sizeof a[0] / sizeof a[0][0], 42));
0308デフォルトの名無しさん
2009/05/17(日) 22:23:24std::fill_n(first, n, val) は [first, first + n) に対しての操作だから
要素数でOK。sizeof a / sizeof a[0][0] は冗長。
0309デフォルトの名無しさん
2009/05/17(日) 22:26:420310デフォルトの名無しさん
2009/05/17(日) 22:28:14C++ code - 60 lines - codepad
ttp://codepad.org/l7pocEaw
このソースコードでは50行目hoge < short(1)の部分で
error: no match for 'operator<' in 'hoge < 1'
と言われてしまいます。どうやら暗黙の型変換がうまくいかないようです。
これを改変してForward declarationを無くして代わりにクラステンプレートの内部で friend 関数を定義することで回避できます。
C++ code - 49 lines - codepad
ttp://codepad.org/F0VomJTk
しかし、どうして前者のソースコードでは暗黙の型変換がうまくいかないのでしょうか?
0311294
2009/05/17(日) 22:30:18std::fill_n(&a[0][0], sizeof a / sizeof a[0][0], 42)
がよさそうですね。勉強になりました。
0312デフォルトの名無しさん
2009/05/17(日) 22:39:30だから、要素数が既知なのに一々冗長に書くことないってこと。
0313デフォルトの名無しさん
2009/05/17(日) 22:42:54「要素数が既知」ということに依存したコードにするほうが面倒なこともあると覚えておけ。
一般的には、保守性のほうが一回だけの記述の利便よりも重要だ。
0314デフォルトの名無しさん
2009/05/17(日) 22:45:14何頭に血を登らせてるの?
質問者が提示したコードで要素数が定数になってたんだからそれでいいだろ。
不明な場合に要素数を計算するのは当然のこと。
0315デフォルトの名無しさん
2009/05/17(日) 22:45:22マジックナンバーは避けるべきだろjk
const N = 10;
int a[N][N];
なんてしているならsizeofを使わずにNと書いてもいいとは思うけど。
0316デフォルトの名無しさん
2009/05/17(日) 23:08:170317デフォルトの名無しさん
2009/05/18(月) 01:54:38template<T,U0,U1>void fill(T (&d)[U0][U1],T v){for(unsigned i=0;i<U0;++i)for(unsigned j=0;j<U1;++j)d[i][j]=v;}
マジックナンバーイラズサイテキ化キタイダイ
int a[10][10];
double b[10];
fill(a,0);
fill(b,0.0);
0318デフォルトの名無しさん
2009/05/18(月) 02:07:27ループを書きたくないってのが本題なのに、それじゃ本末転倒だろうが
0319デフォルトの名無しさん
2009/05/18(月) 02:22:32何いってんの?
ライブラリって知ってる?
0320デフォルトの名無しさん
2009/05/18(月) 02:57:44暗黙の型変換はテンプレートを具象化しなければならない時には行われないから
んで、どうすればいいかというと後者のようにすればいい
Effective C++の46項に詳しく書いてあるよ
0321デフォルトの名無しさん
2009/05/18(月) 03:25:03C++0x の話としては,戻り値の型が const 修飾されていると
move 出来ない (immutable な右辺値になる) ので,
Effective C++ の記述がやや古くなるのはその通りだと思います.
C++0x 的には, EC++ のこの記述は
恐らく "Extending move semantics to *this" と
"Defaulted and Deleted Functions" との組み合わせに置き換わるべき話だと思います.
0322デフォルトの名無しさん
2009/05/18(月) 03:56:14ファイル内の文字列を探すプログラムです。
これをC++で書くとしたらこの程度でもクラスを作るのですか?
#include <stdio.h>
#include <string.h>
int main(int ac, char * av[])
{
//ファイルからメモリーに読み込み
FILE * fp = fopen("文字列が入ったファイル", "r");
fseek(fp, 0, SEEK_END);
int fSize = ftell(fp);
fseek(fp, 0, SEEK_SET);
char * buf = (char *)malloc(fSize);
fread(buf, 1, fSize, fp);
fclose(fp);
//さがす
char ss = "abcde";
int ss_len = strlen(ss);
char * p = buf;
for (int i = 0; i < fSize - ss_len; i++) {
if (strncmp(ss, p, ss_len) == 0) {
printf("%d番目に見つかりましたよ\n", i);
return 0;
}
p++;
}
free(buf);
return 0;
}
0323デフォルトの名無しさん
2009/05/18(月) 04:00:29英語で育った人は、特に何も考えずに英語会話するのと同じ
0324デフォルトの名無しさん
2009/05/18(月) 04:03:57極論すればクラスってのは作るものというより使うもの。
0325デフォルトの名無しさん
2009/05/18(月) 04:09:51それはたまたま短いプログラムだから、OOPだと、明示的にディストラクタがある。
まあ使わなきゃ意味無いけど、私はこれも標準で書いてしまう。だから少し安心なわけ。
それに、そのプログラムはバッファーオーバランしないようだけど、それも、保護されやすい。
ただし、標準でOOPが身についてるからであって、人によってはOOPでもいくらでも汚くかける。
0326デフォルトの名無しさん
2009/05/18(月) 04:13:160327デフォルトの名無しさん
2009/05/18(月) 04:14:400328デフォルトの名無しさん
2009/05/18(月) 04:16:550329デフォルトの名無しさん
2009/05/18(月) 04:17:57ただ、バッファはvector<char>で確保するし
探索も文字列探索クラス(BM法とか)を作って実行するね。
処理自体は(mainには限らないが)普通の関数に置く。
ただこれは当然「ファイル内の文字列探索が処理の全て」の場合。
何らかのclassの処理の中でファイル内探索を必要とする時は、当然そのように書く。
0330310
2009/05/18(月) 05:52:46Effective C++では後者の方式が天下りに与えられていました。
あくまで前者のような方式(実装をクラス宣言部分に書かない)
で解決する方法はありませんか?
(後者の方式でprivate宣言されたヘルパー関数を呼び出すという回避策もありますけれど。)
0331デフォルトの名無しさん
2009/05/18(月) 05:56:50destructor
はディストラクタではなくデストラクタね。発音的にも用語的にも。
ディスクトップでなくデスクトップなのと同じで。
0332デフォルトの名無しさん
2009/05/18(月) 10:51:25関数が2つになっちゃうけど、
クラス内に
template<typename T> friend bool operator <(const Hoge &lhs, T rhs);
template<typename T> friend bool operator <(T lhs, const Hoge &rhs);
って書けば、関数テンプレートの定義を外に書けると思う…たぶん
それか、関数テンプレートをやめて定義を特殊化して書いてもいけるんじゃないかな。
間違ってたらサーセン
0333デフォルトの名無しさん
2009/05/18(月) 16:13:37ファイルを読み込み文字列検索するだけでこんな長く分り難いにコードにえーって感じなんですが、
C++を使って書くとこれより短く解りやすいコードになるんですか?
それはどんな感じになるんですか?
>>322 で
printf("%d番目に見つかりましたよ\n", i);
return 0;
ここでreturnしているんですが、ここではfreeしなくて良いんですか?
0334デフォルトの名無しさん
2009/05/18(月) 16:41:01main() {system("grep abcde 文字列が入ったファイル");}
>free
リークしていないので問題ないが、姑に目を付けられる。
0335デフォルトの名無しさん
2009/05/18(月) 16:53:00常にfreeした方がいいよ。
0336デフォルトの名無しさん
2009/05/18(月) 17:02:55>free
見つかった時、見つからない時の両方でfreeしないなら良いけど
片方しかしてないって、C使いらしくないんじゃない?
短いコードでたった2箇所を管理するだけなのに、それすら出来ないなんて
0337デフォルトの名無しさん
2009/05/18(月) 17:55:44>>322のソース自体に文句付けるなら
もっといろいろあるだろ。
0338デフォルトの名無しさん
2009/05/18(月) 21:07:110339デフォルトの名無しさん
2009/05/18(月) 21:14:110340デフォルトの名無しさん
2009/05/18(月) 21:15:00なんにしても作りたい物が無ければ頭に入らない気がしてきたんだけど、ドリルみたいなものって無いですか
0341デフォルトの名無しさん
2009/05/18(月) 21:16:190342デフォルトの名無しさん
2009/05/18(月) 21:19:510343デフォルトの名無しさん
2009/05/18(月) 21:35:44宿題スレはいいよな
糞問ばっかりだけど最初のうちは数こなす方が大事だし
0344310
2009/05/18(月) 23:20:37なるほど。
やはり関数を1つにまとめ、かつ
(特殊化をすると妨げられる)汎用性を保とうとするならば
Dan Saksの
More C++ Idioms/friend 関数の生成(Making New Friends) - Wikibooks
ttp://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/friend_%E9%96%A2%E6%95%B0%E3%81%AE%E7%94%9F%E6%88%90(Making_New_Friends)
すなわちEffective C++でいう後者の方式しかないようですね。
ありがとうございました。
0345デフォルトの名無しさん
2009/05/18(月) 23:30:530346デフォルトの名無しさん
2009/05/18(月) 23:32:240347デフォルトの名無しさん
2009/05/18(月) 23:43:35わくわく
0348デフォルトの名無しさん
2009/05/19(火) 01:23:320349デフォルトの名無しさん
2009/05/22(金) 23:15:48自動的にinline展開要請になるんだよね?
では
クラス中の宣言の中でfriend関数の定義を記述した場合、
inline展開要請になるのかい?
0350デフォルトの名無しさん
2009/05/22(金) 23:32:490351デフォルトの名無しさん
2009/05/22(金) 23:35:260352デフォルトの名無しさん
2009/05/22(金) 23:49:36デバッグの時の事を考えてだと
0353デフォルトの名無しさん
2009/05/23(土) 00:48:25BCC以外でもみんなそうだけど……。
0354デフォルトの名無しさん
2009/05/23(土) 15:44:38コンストラクタで例外を投げるな、というのをかなり以前Cマガジンで読みました。
その後、Google や >>93 で、コンストラクタ内で例外を投げる時に
適切にリソースを解放すれば問題ない、というのが多かったのですが、
以下のサイトに気になる記述も見つけました。
ttp://www.geocities.jp/chacha_yhk1219/prog/prog004.html
newで作ったときにオブジェクト自体がリークしてしまう
http://monoist.atmarkit.co.jp/fembedded/symbian/symbian04/symbian03.html
ポインタが返ってこない。知らないポインタは消せない
コンストラクタで例外を発生させてもよいが、その場合は new するな、
という理解でよいでしょうか。
0355デフォルトの名無しさん
2009/05/23(土) 16:19:13Symbianは組込だからそうなっていないのかもしれないが、普通はその心配は要らない。
その場合は確かにプログラムで対処できないので、言語が面倒を見てdeleteしてくれる。
規格では15.2にそう定められている。
ちなみに、そういうわけでnewを定義するときには必ず対応するdeleteを定義しないといけない。
ttp://www.fides.dti.ne.jp/~oka-t/cpplab-placement-new-2.html
0356デフォルトの名無しさん
2009/05/23(土) 17:13:34規格での項番まで示していただきまして、有難う御座います。
15.2/2 の箇所ですね。
規格に正しく準拠した処理系であれば問題ないとことで、懸念なく利用したいと思います。
有難うございました。
0357デフォルトの名無しさん
2009/05/23(土) 22:49:39的確に答えられなかった自分が恥ずかしいです。どなたか、模範解答を教えてください。
「ヘッダファイルの用途と、使用によるメリットは理解できました。
ただ、cpp ファイルを分ける目的がわかりません。
また、cpp ファイルを複数持たせた場合、ビルド順はどうなるのですか?」
宜しくお願いします。
0358デフォルトの名無しさん
2009/05/23(土) 23:01:32分割コンパイルすることで仕様変更に伴う再コンパイル時間の短縮とかも見込めるけど、
それ以上にそもそも他人が作ったクラスとかを使いたい(再利用したい)場合とか
cppファイルが分かれてなかったら再利用できないだろ。
0359デフォルトの名無しさん
2009/05/23(土) 23:06:45その観点で考えると、うちのプロジェクトは基本的にほどんどがヘッダファイルで構成されていて、
クラスは基本的に .h で作って #include で取り込む、っていう方法を取っています。
なので、再利用には困りません。
ほとんどがヘッダっていう考え方がNG?
あと、ビルド順序はどうなるものですか?やってみたんですが分かりませんでした。
0360デフォルトの名無しさん
2009/05/23(土) 23:07:48そんなことできないだろ。
0361デフォルトの名無しさん
2009/05/23(土) 23:10:520362デフォルトの名無しさん
2009/05/23(土) 23:12:36分割コンパイルやリンクについてわかってないまま脱初心者とは。
ちなみに、グローバルやclass-staticな変数の初期化順については
何も規定されていないことが規定されている。
ということは、リンク順についてそれが当てはまることを意味するが
規格に「リンク」という単語が出ているかは知らない。
cppの分割については>>358と同じ。
classにわけたり、意味的なまとまりにわけたりして
まともなものを作るのなら分割するのが当然。
>>359
Javaチックな書き方ってことかね。
別にそれならそれで良いんじゃないの。
.hに全部書く、ということは、「ビルド(コンパイル)時間の短縮」なんて
露ほどにも考えていないということだから、
再利用もできるし分割コンパイルなんて必要無いかもね。
0363デフォルトの名無しさん
2009/05/23(土) 23:13:20もしかして、全部 inline にしたり、あらかじめ obj にしたりしてあるのだろうか。
0364デフォルトの名無しさん
2009/05/23(土) 23:17:24>クラスは基本的に .h で作って #include で取り込む、っていう方法を取っています。
>なので、再利用には困りません。
>ほとんどがヘッダっていう考え方がNG?
マジ??
その会社 大丈夫???
考えて見ればcppファイルが1つだけなら関数の定義とかを.hに書き込んでも
バイナリの時点で重複は起らないが(hでインクルードガードしていること前提ね。)
それにしても、、、ねぇ。。。
0365デフォルトの名無しさん
2009/05/23(土) 23:18:54dllexport が必要な時と、main() 系、コールバック系以外はすべてヘッダファイルなんです。
クラスの定義や構造体など、ほとんど。
ヘッダファイルの考え方が違うのかな…
>>362
規定が無い点について理解しました。
確かにうちのプロジェクトのソースはビルド時間かなりかかるんです…
.cpp で書くと分割コンパイルされて速度が向上するということですね。
まったく知りませんでした。。
まさに java チックです。
なので、include 順序がかなり大事で問題も結構起きるんですよね。
でも私個人的には、c++ で開発しているので、c++ の基本を知りたいです。
>>363
全然、そんなことないんです><
おまけに、プリコンパイルヘッダもないので時間ばかりが掛かって…
0366デフォルトの名無しさん
2009/05/23(土) 23:21:28ヘッダに定義を全部書いたら、クラスのインタフェースに全く影響を及ぼさない
変更であっても、そのヘッダに依存するソースファイルすべてが再コンパイル
されるじゃないか。その程度も分かってない会社って一体・・・
0367デフォルトの名無しさん
2009/05/23(土) 23:22:39インクルードガードしてもできないよ。
インクルードガードは同一翻訳単位内でしか有効ではないから。
0368デフォルトの名無しさん
2009/05/23(土) 23:25:16そうなんですよ!!
.cpp ファイルは main 用に1つだけあって、あとは .h の処理を呼び出したり、
クラスを生成してクラスに処理を任せたり、、、
グローバル関数までもが .h に居る始末です。
>>366
まさにその通りですね。
これでも一部上場なのですが、本当にお恥ずかしいです。
0370デフォルトの名無しさん
2009/05/23(土) 23:27:170371デフォルトの名無しさん
2009/05/23(土) 23:29:20あぁ、そういうことか。理解したw
すごいな。
0372357
2009/05/23(土) 23:33:35拡張子の意味を確実に逸脱しているのですね。
みなさんがおっしゃったように、リンクの意味を理解していなかったようです。
分割ビルドは十分理解できました。
今一度教えてください。みなさんは .h を基本的にどのような用途で利用されていますか?
また、現状のように .cpp を1つだけもち、ほとんどすべてを .h に置くことで発生しうる
考えられる問題がありましたら教えてください。
>>369
すみません、私は理解できませんでした。
まだ初心者であることを思い知りました。
翻訳単位が1つだと、恐ろしいものですか?時間が掛かる、という観点でしょうか。
0373369
2009/05/23(土) 23:40:35>翻訳単位が1つだと、恐ろしいものですか?
そんな開発者見たことないから、恐ろしいと形容した。
>今一度教えてください。みなさんは .h を基本的にどのような用途で利用されていますか?
あくまで宣言だけを書いておく。
MyClassを使う必要があればMyClass.hをインクルードする。
一方MyClass.cppにもMyClass.hをインクルードしておいて、別途コンパイルしておく。
こうすることで、MyClass.cppが変更されても他の大部分のcppは再コンパイルしないで済む。
あるいはMyClass.cppをコンパイルしてライブラリとして公開する場合、
他社には.hだけを見せるわけだから実装を隠せるとか。
>また、現状のように .cpp を1つだけもち、ほとんどすべてを .h に置くことで発生しうる
>考えられる問題がありましたら教えてください。
他の会社や組織に公開する時に実装がだだ漏れになるとか
0374デフォルトの名無しさん
2009/05/23(土) 23:46:19大概の教科書は分割の仕方書いてあるだろ^^
0375デフォルトの名無しさん
2009/05/23(土) 23:49:36ビルドに時間が掛かって仕方がないだろう
0376357
2009/05/23(土) 23:54:38なるほど、、、将来を見据えた設計をしながら開発してるんですね。
なんかもう、うちの会社が悩ましいです。
>>374
会社の研修では一切…
ちなみにほとんどのプロジェクトがそんな感じです。
java と COBOL 人間ばかりなので、include = そこにそのファイル内容を挿入、っていう
意味合いだけしか着目していないんだと思います。
>>375
その通りですね。勉強になりました。
今日皆さんにご指導いただいた内容を以って、会社の開発体制の改善を
促して以降と思います。
ありがとうございました。
0377デフォルトの名無しさん
2009/05/23(土) 23:55:23例えば、分割コンパイルには関係ないようなC++の問題だしても解けるか?
0379デフォルトの名無しさん
2009/05/23(土) 23:56:270380デフォルトの名無しさん
2009/05/23(土) 23:59:44私も信じられなくなってきましたが、こんな開発者ばかりながらも、
一部上場です。
私はアセンブル系のドライバ開発あがりで、ウィザードを利用して ATL/WTL アプリケーションの
開発をやっているので、一から自分でファイルを作ってプロジェクトを構成したことがありませんでした。
20年弱もプログラミングをして来ましたが、初心者からはなかなか抜け出せませんね。
大変勉強になりました。
0381デフォルトの名無しさん
2009/05/24(日) 00:06:46そうなのか。
じゃあもういっそC++やめて、各自が得意なCOBOLとかアセンブラやればいいのではないでしょうかね。。。
少なくとも一人、C++の知識がある人が居ないととんでもないことになるのでは。
まああなたがその一人になれば良いだけだが。
頑張ってください。
0382デフォルトの名無しさん
2009/05/24(日) 00:07:00大丈夫。そのやり方で会社が回っているならそれで正しい。
開発の仕方に正解なんてないんだし、そもそも他と同じことをやっていたらこのご時世生き残れない。
君の会社は君の会社なりのやり方を見つけたんだと思う。だから生き残っているんだろう。
もっと、堂々としていいよ。
0383デフォルトの名無しさん
2009/05/24(日) 00:16:10なかなか COBOL やアセンブルの案件が見つからなくなってきたんですよね。。
でも、頑張ります!ありがとうございます。
>>382
ありがとうございます。
基本をしっかり抑えた上で、スタイルを大事にして行くことにします。
0384デフォルトの名無しさん
2009/05/24(日) 00:37:07優秀であってもドカタ企業のドカタじゃどうしよもないよ
一部上場の正社員とドカタ企業のドカタじゃ霄壌の差
0385デフォルトの名無しさん
2009/05/24(日) 02:15:34可哀想だろ俺が
0386デフォルトの名無しさん
2009/05/24(日) 02:27:32まともな本買いましょうよ
0387デフォルトの名無しさん
2009/05/24(日) 02:39:06どれがまともな本なのかわからんでしょ
まともな本教えましょうよ
0388デフォルトの名無しさん
2009/05/24(日) 02:54:41中を見て初心者なりでも”自分”で選ぶべきだと、俺は思う
で、幾つかの本を読破してこそ、まともな本かどうかの判断が付く脱初心者になって行くんだと思う
その最初のステップを”初心者”と言う理屈で飛ばすような奴が
プログラムの本を読んで技術力を上げていくなんて出来ないだろ
そもそも、本人が教えてと言ってるならともかく
初心者なんだから教えるべき、と言って自分は教えてない奴は好きじゃないw
0389デフォルトの名無しさん
2009/05/24(日) 02:59:18特に後半の設計に関する部分を読んでない人は多いと思うけど、色々含蓄あるし。
0390デフォルトの名無しさん
2009/05/24(日) 03:02:13ネタと分かるように語尾を>>386と同じにしたのに
釣られる奴居るんだな
0391デフォルトの名無しさん
2009/05/24(日) 03:05:39長々と小言を言う暇があるなら、自分が薦める本を挙げればいいのに。
>>390
釣りならVIPでも行ってやれば?
0392デフォルトの名無しさん
2009/05/24(日) 03:15:54俺が良いと言ったって、合う合わないがある、だから教えないし、
自分でググるなり、本を手に取れって言ってるじゃん
アンタゆとり?
0393デフォルトの名無しさん
2009/05/24(日) 03:25:130394デフォルトの名無しさん
2009/05/24(日) 03:25:14解決方法を教えて下さい。
5 class B;
6
7 class A{
8 public:
9 int hoge;
10 A(int i){ i = hoge; }
11
12 B conv(){ return B(hoge); }
13 };
14
15 class B{
16 public:
17 int hoge;
18 B(int i){ i = hoge; }
19
20 A conv(){ return A(hoge); }
21 };
-------------------
エラー
test.cpp: In member function ‘B A::conv()’:
test.cpp:12: error: return type ‘struct B’ is incomplete
test.cpp:12: error: invalid use of incomplete type ‘struct B’
test.cpp:5: error: forward declaration of ‘struct B’
0395デフォルトの名無しさん
2009/05/24(日) 04:39:09class B;
class A {
public:
int hoge;
A(int i) { i = hoge; }
B conv();
};
class B {
public:
int hoge;
B(int i) { i = hoge; }
A conv() { return A(hoge); }
};
B A::conv(){ return B(hoge); }
0396デフォルトの名無しさん
2009/05/24(日) 04:40:16class A {
...
B conv();
...
};
class B {
...
};
B A::conv() {
return B(...);
}
0397デフォルトの名無しさん
2009/05/24(日) 04:45:07>>396
ありがとうございます。
0398デフォルトの名無しさん
2009/05/24(日) 05:36:49この関数って参照返すだけだから、
それだったら内部の実数、虚数変数に直接アクセスした方が関数呼び出し無い分早いだろうし、
ソースコードも見やすく(多分)なると思うのですが、
これには何か理由があるのでしょうか?
0399デフォルトの名無しさん
2009/05/24(日) 08:12:110400デフォルトの名無しさん
2009/05/24(日) 10:53:54基本的に内部の実装に触れられるようにしちゃうと
いざインターフェースは変わらないが実装が変わるような仕様変更をするときに
悲劇がおこるからとか。
0401デフォルトの名無しさん
2009/05/24(日) 14:06:24それくらいコンパイラの最適化でいともたやすく消え去るられる。
0402デフォルトの名無しさん
2009/05/24(日) 14:11:10だったらなぜわざわざinlineなんて予約語が用意されてるんだ?
関数呼び出しを減らすのは高速化の基本のキだ
ウソを教えるのはやめろ
0403デフォルトの名無しさん
2009/05/24(日) 14:15:360404デフォルトの名無しさん
2009/05/24(日) 14:15:42狂信者の戯言は聞き流して己が道を進めばいいと思うよ
0405デフォルトの名無しさん
2009/05/24(日) 14:20:59アウトラインの下駄雪駄なんておぞましいものは狂信者でも書くわけがない
少なくとも長いループ内では、アウトライン関数を呼んではいけない
これは今も重要なガイドラインだ
0406デフォルトの名無しさん
2009/05/24(日) 15:01:18百害あって一利なしだな。
>>402
>>401が言ってるのはreal/imagの話だろ。
言葉足らずならそう指摘すればいいのに。力抜けよ。
0407デフォルトの名無しさん
2009/05/24(日) 15:05:37下の方のアクセサの項目
0408デフォルトの名無しさん
2009/05/24(日) 15:06:24hoge.hage.foo.bar.set_value(0); とかはあったとしても
hoge.get_hage().get_foo().get_bar().set_value(0); なんてことはしないよね
この辺みんなどうしてるんだろ。
hage や foo は public なメンバにするよね?でもそれだと統一感ないよね?
0409デフォルトの名無しさん
2009/05/24(日) 15:08:190410デフォルトの名無しさん
2009/05/24(日) 15:12:41メンバ関数はコンストラクタ、コピー、シライライズ、ダンプ、アサートぐらいしか定義しない
それと同じ目的の変数は構造体にまとめる
class A
0411デフォルトの名無しさん
2009/05/24(日) 15:15:28後ろの段落は class の中で struct xxx_param とか struct xxx_item, xxx_state とかを定義して
まとめてあつかう
0412デフォルトの名無しさん
2009/05/24(日) 15:18:06> hoge.hage.foo
この辺までですでに内部状態の一貫性を壊していると思われ(setの場合)。
設計が悪いから作り直せ。
0413デフォルトの名無しさん
2009/05/24(日) 15:38:47System.Form.SetValue() みたいにどんどん深くなっていってない?
実モデルでたとえても、例えば
部屋A.本棚B.本C.ページD.GetText();
みたいな例は十分にありえるんじゃないの?
0414デフォルトの名無しさん
2009/05/24(日) 15:39:020415デフォルトの名無しさん
2009/05/24(日) 16:02:00void foo::set_bar_value(int n) { bar.set_value(n); }
void hage::set_bar_value(int n) { foo.set_bar_value(n); }
void hoge::set_bar_value(int n) { hage.set_bar_value(n); }
hoge.set_bar_value(0);
俺はvector3やmatrix44みたいなのは公開してるなあ。
あとは、クラスとして独立させるほどでもないが、関連のあるメンバ変数をグループ化したいときに
structを使ってる。
0416デフォルトの名無しさん
2009/05/24(日) 16:05:06System.Form.SetValue()
どこのC#?
あとそれ名前空間と混ざってるから。
0417デフォルトの名無しさん
2009/05/24(日) 16:13:500418デフォルトの名無しさん
2009/05/24(日) 16:21:41それはない
0419デフォルトの名無しさん
2009/05/24(日) 16:38:05名前空間で内部状態を壊されることはないから問題ない。
0420デフォルトの名無しさん
2009/05/24(日) 17:11:46B* get();
}
というクラスで、get()メソッドをインライン関数にしたい
テンプレートクラスと同様に同じヘッダファイルに実装を書く場合、
inline B* A::get(){
コード
}
の「inline」は意味があるのでしょうか?
0421デフォルトの名無しさん
2009/05/24(日) 17:15:11というか意味があるかないかで言うなら、inlineは常に意味がない
コンパイラは自由にインライン化要請を無視できるし、要請されてない関数をインライン化することが出来る
0422デフォルトの名無しさん
2009/05/24(日) 17:25:36例えば俺が使っているコンパイラは「inline指定に従う/無視する」「inline指定がなくても勝手にinline化する/しない」
などの指示を自分で出すことができる。
0423422
2009/05/24(日) 17:26:220424デフォルトの名無しさん
2009/05/24(日) 17:33:39ヘッダに直接(= インラインで)定義するぞ、という意味だと思えばいい。
0425デフォルトの名無しさん
2009/05/24(日) 17:53:20変な誤解を生むから詳しく知らないなら
黙ってるか断定的に書くな。
0426デフォルトの名無しさん
2009/05/24(日) 18:02:20適当なこと書くなよ。
cppファイルにてもinlineは書けるわけだし
もう何が何なのかw
0427デフォルトの名無しさん
2009/05/24(日) 18:05:30インラインに”ヘッダに直接”という意味があったなんて白なkったおれはどうすればいい?
0428デフォルトの名無しさん
2009/05/24(日) 18:06:300430デフォルトの名無しさん
2009/05/24(日) 18:35:56そういう意味でinlineはいると思うんだけど。
0431デフォルトの名無しさん
2009/05/24(日) 18:37:060432デフォルトの名無しさん
2009/05/24(日) 18:38:13よくわからないけどオブジェクトコードにクロージャっぽいのがつくられるきがするぅ
0433デフォルトの名無しさん
2009/05/24(日) 18:53:52あるDLLについてたヘッダ内の記載なんですがVCで「構文エラー : '('」が出ます
カッコの数は合ってるし、関数ポインタの宣言としてもおかしくないように見えるのですが
詳しい方から見て何か違和感はありますでしょうか?
ちなみに #define DLLAPI WINAPI されてます
0434デフォルトの名無しさん
2009/05/24(日) 18:55:29それを複数の翻訳単位でインクルードしてコンパイルしてリンクすると、多重定義エラーでるなぁ。
0435デフォルトの名無しさん
2009/05/24(日) 18:56:14多分その直前に何かおかしい所がありそう
0436デフォルトの名無しさん
2009/05/24(日) 18:58:400437デフォルトの名無しさん
2009/05/24(日) 19:02:20自分の作ったのでも結構悩むのに、さらに人の作ったのだと難度高いです・・・
もうちょっと見直してきます
0438デフォルトの名無しさん
2009/05/24(日) 19:18:020439デフォルトの名無しさん
2009/05/24(日) 19:19:270440デフォルトの名無しさん
2009/05/24(日) 19:30:27プリプロセッサ以外の記述を削除ってことですか?
>>439
<windows.h>とかメジャー系はいくつか試したんですがダメでした・・・
0441433
2009/05/24(日) 19:35:13ttp://www.geocities.jp/altshibabou/win/image/mcrwwin110.LZH
どなたかVC使いの方でビルド通るか実験して頂ける方はおりますでしょうか
最近入れなおしたので、私のVCの設定が悪いのかもしれない
0442デフォルトの名無しさん
2009/05/24(日) 19:37:14#define WINAPI
か
#define WINAPI __stdcall
って書いとけ。
0443433
2009/05/24(日) 19:52:22すんません、勘違いしてました
/E /Pで.i吐かせて該当行見ましたら
int __stdcall (*mcOpenDevice ) (void) = ((void *)0);
と展開されてました、他の箇所も見た感じ悪くはなさげなのです
0444デフォルトの名無しさん
2009/05/24(日) 20:09:04おお、それはエラーになる。
int (DLLAPI *mcOpenDevice)(void) = NULL;としてみるんだ。
http://msdn.microsoft.com/ja-jp/library/zxk0tw93.aspx
一番最後のExampleでもそうなっている。
0445420
2009/05/24(日) 20:19:30VC++2003を使っていて、今のところ1つのcppファイルからしかインクルードしてないので
inlineを付けても付けなくても問題はなかったのですが、
付けないとcppファイル毎に関数が定義されているとみなされる=>>430や>>434
ということなんでしょうね。
どうもありがとうございました。
0446433
2009/05/24(日) 20:19:42ありがとうございます、無事ビルド通りました
>>436さんも多分同じこと指摘してくれてたんですよね、分からなくて申し訳ないです
みなさんのおかげで先に進めそうです
本当にありがとうございました。
0447デフォルトの名無しさん
2009/05/24(日) 21:06:140448デフォルトの名無しさん
2009/05/24(日) 21:06:410449デフォルトの名無しさん
2009/05/24(日) 21:09:35windowsで使えるものをお願いします
0450デフォルトの名無しさん
2009/05/24(日) 21:10:55よくわからないのでとりあえずぐぐってみます
ありがとうございます
0451デフォルトの名無しさん
2009/05/24(日) 21:13:22WinならMinGW
まあgccなんだけどな
0452デフォルトの名無しさん
2009/05/24(日) 21:13:37Visual C++ Express 2008
http://www.microsoft.com/japan/msdn/vstudio/Express/
0453デフォルトの名無しさん
2009/05/24(日) 21:15:33レスありがとうございます
0454デフォルトの名無しさん
2009/05/24(日) 21:35:250455デフォルトの名無しさん
2009/05/25(月) 01:23:27初めて聞いた。
そしてググってみてちょっと面白かった。
0456デフォルトの名無しさん
2009/05/25(月) 01:28:58しかも全部中国。
0457デフォルトの名無しさん
2009/05/25(月) 02:44:480458デフォルトの名無しさん
2009/05/25(月) 04:02:590459デフォルトの名無しさん
2009/05/25(月) 05:23:12検索したら漢字ばっかで
いじる勇気がでない。
0460デフォルトの名無しさん
2009/05/25(月) 06:40:450461デフォルトの名無しさん
2009/05/25(月) 07:46:16いつもVCの空のプロジェクトにダイアログリソース突っ込んで出してるんだが
ひょっとして空のプロジェクト使わなければC#とかみたいに簡単に扱えるのかな?
空じゃないプロジェクトって最初からコードいっぱい書いてて抵抗あったから今まで触ったこと無いんだ
0462デフォルトの名無しさん
2009/05/25(月) 07:48:250463デフォルトの名無しさん
2009/05/25(月) 08:31:50vcでポトペタできるのはダイアログだけだよ
ウィンドウはムリポ
スケルトンコードは慣れかな
どうせ似たようなコード書くんだし
続きはVSスレかWinAPIスレかMFCスレで
0464デフォルトの名無しさん
2009/05/25(月) 08:46:11覗いてみた感じここの奴は視野が広そうだったから、ここで聞いてしまった
数年前に比べて大して便利になってないという事だな
昔作ったスケルトン掃除して使ってみるよ、ありがとう
0465デフォルトの名無しさん
2009/05/25(月) 19:30:320466デフォルトの名無しさん
2009/05/25(月) 19:46:06C++の言語に関する話としては
blitzというクラスの、Arrayというメンバ。もしくは、blitzという名前空間に含まれる Array というもの。
実際ぐぐってみたところ、Blitz++というライブラリがあるみたいだね。
このライブラリでblitzという名前空間を使っているようだ。
0467466
2009/05/25(月) 19:47:15ttp://www.oonumerics.org/blitz/docs/blitz_2.html
0468デフォルトの名無しさん
2009/05/25(月) 20:11:46回答どうも 軽く読んでみた。
じゃあどうやら 『blitz::Array< int, 2 > A 』 って宣言だと
『中に整数値の入る2次元の行列式の定義をbiltzっていう名前空間でやってる』って感じでいいのかね
Arrayは直訳で行列じゃなくて配列なのが気になるんだけどね・・・
0469デフォルトの名無しさん
2009/05/25(月) 20:15:59細かいとこちょっと違うけど概ねそんな感じ。
0470デフォルトの名無しさん
2009/05/25(月) 20:21:33ごめん Cは前々からやってたんだけどC++は最近独学で始めたばっかりなんだわ…
で、違うところって? (俺の知識が浅いから、伝わらなそうだったらスルーしてくれ)
0471デフォルトの名無しさん
2009/05/25(月) 20:24:23ごめん、ちょっと忙しくなるから、後でまた来るわ
そのときまでに他のレスがついてなかったら書くよ
0472471
2009/05/25(月) 21:07:14blitz::Array< int, 2 > A;
とした場合、(これ自体をblitz名前空間の中に書かない限り)このAはblitz名前空間には入らない。
あと、「行列式」じゃなくて「行列」だな。(似てるけど意味が違う)
0473デフォルトの名無しさん
2009/05/25(月) 21:10:27行列を表すexpressionなんだから
determinantのことを言いたいなら、それは揚げ足取りと言うものだ
感心しない
0474デフォルトの名無しさん
2009/05/25(月) 21:10:55まあ、ちょっと語弊があるけど “blitz::Array<int,2>” で1つのクラス名だと思ってしまってもよい。
int a;
がint型の変数aであるのと同じように
blitz::Array<int,2> a;
は blitz::Array<int,2> 型の変数aだ。
名前空間ってのは、例えばライブラリ作成者がArrayっていう名前のものを提供している場合、
利用者のコードにもArrayってのがあると名前が衝突してしまって不都合だから、
名前がぶつからないように blitz:: という修飾をつけてるんだと思えばよい。
0475デフォルトの名無しさん
2009/05/25(月) 21:12:06そうか? 俺はどうしても気になるし明確に誤りだと思うが、まあ揚げ足取りと取られるならこれ以上は言うまい。
0476デフォルトの名無しさん
2009/05/25(月) 21:14:04アホだろお前。
0477デフォルトの名無しさん
2009/05/25(月) 21:55:280478470
2009/05/25(月) 22:04:48blitz::Array<int,2> 型の変数aって感じは掴めてたんだけど、そもそもblitz::Arrayは何を表現するのかが不明で困ってたのよ
それはそうとプログラム板って初めて来たけどID表示ないんだな、不便じゃない?
0479デフォルトの名無しさん
2009/05/25(月) 22:13:22そういう言い方はたとえ2chでもどうかと思うぞ
まぁでも
行列と行列式は…何と何くらい違うんだろ。ブドウとグレープフルーツくらい?
0480デフォルトの名無しさん
2009/05/25(月) 22:16:39スクリプト書けばID丸わかりだから不便じゃないよ。
0481デフォルトの名無しさん
2009/05/25(月) 22:53:310482デフォルトの名無しさん
2009/05/25(月) 23:01:250483デフォルトの名無しさん
2009/05/25(月) 23:06:440484デフォルトの名無しさん
2009/05/26(火) 10:34:48A(int i) { i = hoge; }
↑ は何をしたいの?
0485デフォルトの名無しさん
2009/05/26(火) 15:55:38「そのメンバ変数のポインタを返すようなメンバ関数を作る」か、
「そのメンバ変数のコピーを返すようなメンバ関数を作る」か、
どちらがオブジェクト指向としてはよろしいのでしょうか?
前者だと、privateなメンバ変数に対して外部からタッチしてしまうことになりますが、
無駄が少ないように思えます。
後者だとprivateなメンバ変数を保護(?)できるというか、そういう考え方に則しているような気がしますが、
無駄にメモリを食ってしまう気がします。
完全に独学のため、ちょっと意味不明な単語が混じっているかもしれませんが、
教えてください。よろしくお願いします。
0486デフォルトの名無しさん
2009/05/26(火) 16:03:49どちらも問題外
クラスの設計をし直せ
0487デフォルトの名無しさん
2009/05/26(火) 16:11:05↑だとintのコピーを返す関数に当たると思うのですが、問題外となると、ちょっと目の前が真っ暗になってきました…。
0488デフォルトの名無しさん
2009/05/26(火) 16:49:15最初からpublicに分類すべき
それで問題が出るなら普通の人なら根本から作り直すね
0489デフォルトの名無しさん
2009/05/26(火) 16:54:31貴重なアドバイスありがとうございます。
0490デフォルトの名無しさん
2009/05/26(火) 16:55:12const なポインタ or 参照を返せば、他から変更はできないけど、
他の部分がそのオブジェクトの構造に依存することになるね
0491デフォルトの名無しさん
2009/05/26(火) 19:08:440492デフォルトの名無しさん
2009/05/26(火) 19:49:43まあ要するに、
クラスのクライアント(使う人)が
privateなメンバ変数(およびprivateメンバ関数)
については何も知らなくても
publicなメンバ関数を見るだけで
使えるように設計すべき
ということだよ。
これはすなわち、public/protectedなメンバ関数以外が変わっても
クライアントが書いたコードには影響がないということ。
ちなみにpublicなメンバ変数なんて大抵はクソ設計の証。
0493デフォルトの名無しさん
2009/05/26(火) 20:06:47>>492
それは基本的にはカプセル化に重点を置いてコードを書いた方が良い、ということで良いんでしょうか?
0494492
2009/05/26(火) 20:41:33そう。基本的にはね。
オブジェクト指向プログラミング (OOP; object-oriented programming)
においてカプセル化はとーーっても大事。
たまにいっそ全部publicにということで構造体structを使うことがあるけど
基本的にはそういうこと。
0495デフォルトの名無しさん
2009/05/26(火) 21:29:310496デフォルトの名無しさん
2009/05/26(火) 21:44:300497デフォルトの名無しさん
2009/05/26(火) 21:47:560498デフォルトの名無しさん
2009/05/26(火) 21:52:340499492
2009/05/26(火) 21:54:08「良いクラス設計」の話に限った場合、フツーはない。
「全部publicにということで構造体struct」
は返り値に複数の情報を持たせたい時とかにありえる。
ただ複数の型を束ねただけ。
0500デフォルトの名無しさん
2009/05/26(火) 21:57:340501デフォルトの名無しさん
2009/05/26(火) 22:00:530502デフォルトの名無しさん
2009/05/26(火) 22:04:41学生の頃作ったプログラム見直してみるとGetとSet多用しててえらいことになってた
今でもうまい設計はできないけど、他で使うならpublicでいいよねって話だよな
0503デフォルトの名無しさん
2009/05/26(火) 23:46:22structでメンバ変数をpublicにするのは
>>499の言うとおり、値を束ねただけのものとして、
構造体を値として扱う場合にだけ許される。
Effective C++やC++ Coding Standards、Google Coding Standardsなんかを
ひとつも読んでいない人間はC++触らないでください
0504デフォルトの名無しさん
2009/05/27(水) 00:14:570505デフォルトの名無しさん
2009/05/27(水) 00:21:020506デフォルトの名無しさん
2009/05/27(水) 00:43:52int a;
public:
int get(){return a;}
void set(int i){a = i;}
};
こういうのはさすがにpublic派のほうが多い気がする
0507デフォルトの名無しさん
2009/05/27(水) 00:53:05距離を置いて厄災に巻き込まれないようにするだけ
0508デフォルトの名無しさん
2009/05/27(水) 01:15:12もし int a を public にする気なら、豆腐の角に頭をぶつけて死ねといいたい
0509デフォルトの名無しさん
2009/05/27(水) 01:27:16C++使う理由がないよ。多分。
0510デフォルトの名無しさん
2009/05/27(水) 01:33:51こんなプリミティブなメンバまで変更しなきゃならない時にはどうせインターフェースも変更入るよ
そこまでいちいちgetset噛ませと言い出すとちょっと原理主義すぎて現実的でない
0511デフォルトの名無しさん
2009/05/27(水) 01:49:080512デフォルトの名無しさん
2009/05/27(水) 01:50:40重いコピーが発生する事を覚悟しなければならない
つまり巨大な配列やクラスはgetterやsetterの対象にはならない
0513デフォルトの名無しさん
2009/05/27(水) 01:55:01返すのがintだからどうだって話じゃないだろ。たとえば
class A{
int a,b,c,d,e,f,g,h,i,j,k,l,m,n;
以下略
};
こんなのの実装をimplイディオムに変えたいと思ったときどうすんだよって話。
0514デフォルトの名無しさん
2009/05/27(水) 01:55:070515デフォルトの名無しさん
2009/05/27(水) 02:00:14「いつでも誰でも見ていいし好き勝手に変えてもいい『何か』を持ってますよ」ということを
外部に向けて大っぴらに公開しているということです
したがって、そのセマンティクスを変更するのはインターフェースの変更なんだから
getとsetを使っている全ての箇所に影響が出てしまいます
これってよく見ると『何か』を変数としてpublicで公開した時と状況はまったく変わりませんね
publicなgetとsetを両方用意するというのは、同じ事を回りくどく書かせるだけであって
可読性も保守性も一切上がりません
intだろうと何だろうと何でもかんでもgetsetというのは罠であり、有害な迷信です
public変数のセマンティクスを持つものはpublic変数でいいんです
0516デフォルトの名無しさん
2009/05/27(水) 02:10:140517デフォルトの名無しさん
2009/05/27(水) 02:13:290518デフォルトの名無しさん
2009/05/27(水) 02:14:45原理主義的には、カプセル化した気分に浸れていい
0519デフォルトの名無しさん
2009/05/27(水) 02:14:47たいてい、ついでにどこかに値の変更を通知したり、
入力値が範囲外なら例外投げるようにしたりしていて、
単純にメンバ変数をpublicにできる場合なんて全然ないと思うんだけど。
そんな場合の話はしていないって?
0520デフォルトの名無しさん
2009/05/27(水) 02:18:110521デフォルトの名無しさん
2009/05/27(水) 02:18:39意味があるのは問題なし。
0522デフォルトの名無しさん
2009/05/27(水) 02:27:02aを防御したくなったらどうするの?
aが頻繁に変更されるようになったので、
毎回最新の値をサーバから取得したくなったらどうするの?
aに連動してbも変更したくなったらどうするの?
正当な値だけ受け付けるようにしたくなったらどうするの?
aが更新されたことをBに通知してあげたくなったらどうするの?
将来行われる変更を全部見通すことができるの?
0523デフォルトの名無しさん
2009/05/27(水) 02:31:06そういう色んなことをする関数は単純なsetではなく、もっと意味のある名前を付けられるはず
なんかの大きさならresizeとか、通知するんだったらnoticeとか
その相方はgetとしか言い様がないこともあるだろうけどさ
両方とも本当にget,setとしか名付けようもないようなものは、その意味合いは内部的にも外部的にも
ただのpublicメンバ変数だと思うんだけどなぁ
>>522
排他制御はともかく、他はgetXXだのsetXXだのという名前を付けるべき操作ではない
0524デフォルトの名無しさん
2009/05/27(水) 02:36:49何を根拠に。
ちょっとした処理付きのgetXX/setXXなんて普通に使うぞ?
0525デフォルトの名無しさん
2009/05/27(水) 02:41:390526デフォルトの名無しさん
2009/05/27(水) 02:46:21アホは黙ってろ
0527デフォルトの名無しさん
2009/05/27(水) 02:54:330528デフォルトの名無しさん
2009/05/27(水) 02:59:26それもpublicメンバ変数じゃできないな。
アクセス違反がせいぜい。
0529デフォルトの名無しさん
2009/05/27(水) 03:00:35例えば「正当な値だけ受け付ける」ようにsetXXを変更したとしようか
そうなると不当な値が入ってきたらエラーなり例外なりを返すんだろうが、
旧バージョンのsetXXを使ったコードは当然そのエラーに対応する処理をしていないので問題が起こる
つまり、この変更はインターフェースの変更であって、全てのsetXXを使用するコードに修正を迫るものであるわけだ
素直にsetXXの呼び出しを全部修正してもいいし、旧setXXとは機能が違う新setXXを(機能に見合った名前で)
新しく別に作って適宜置き換えるのでもいいが、結局はsetXXの呼び出しは全てチェックする必要がある
でも、どうせset箇所を全部見直す必要がある変更なんだから
最初からpublic変数で書いて、必要になってからset関数を書いてもまったく同じだろ?
0530デフォルトの名無しさん
2009/05/27(水) 03:05:45確かに、エラーの追加はインターフェースの変更だ。
そこは全面同意。
でも1つしか答えてないぞ。
0531デフォルトの名無しさん
2009/05/27(水) 03:56:00> 「いつでも誰でも見ていいし好き勝手に変えてもいい『何か』を持ってますよ」ということを
> 外部に向けて大っぴらに公開しているということです
この認識は間違い。
getとsetをpublicで公開するということは誰でも自由に行ってもいいのはただセッタゲッタの呼び出しだけで
その結果は呼び出し側の都合ではなくクラスの都合で決定されます。
クラスの都合を無視してクラスの状態の参照や変更を行うことはできませんということをいっている。
> 例えば「正当な値だけ受け付ける」ようにsetXXを変更したとしようか
> そうなると不当な値が入ってきたらエラーなり例外なりを返すんだろうが、
> 旧バージョンのsetXXを使ったコードは当然そのエラーに対応する処理をしていないので問題が起こる
こうした場合は実装の変更ではなく仕様の変更なのでセッタゲッタによるカプセル化(=実装の隠蔽)のメリットとは無関係。
0532デフォルトの名無しさん
2009/05/27(水) 04:06:47そのクラスの内部設計の自由度が減るのがいやだな
あとは>>519と同じ意見でただ代入するってのはあまりない
たいていマルチスレッド用の排他処理がくっついたりする
0533デフォルトの名無しさん
2009/05/27(水) 08:09:58object.set_value2( object.get_value0()->get_value1() );
こう書くより、
object.value2 = object.value0->value1;
こう書いた方が、見やすいものなぁ。
0534デフォルトの名無しさん
2009/05/27(水) 08:13:32operator =で見やすいほうの書き方にできるのでは?
0535デフォルトの名無しさん
2009/05/27(水) 08:34:4810年前に作られた言語だからな…
>>534
できなくもないけど結構面倒だよ
0536デフォルトの名無しさん
2009/05/27(水) 08:51:13低レベルのインタフェース作るのが間違ってるんだよ。
もっと抽象化された機能のメソッドを作るべき
0537デフォルトの名無しさん
2009/05/27(水) 09:24:08>10年前に作られた言語
wikipediaによると標準化からは10年だが、C++2.0から20年、前身のC with Classesから30年のようだ
D&Eなんかで示された考え方も今では古くなりつつあるのかと思うと少し寂しくなる
0538デフォルトの名無しさん
2009/05/27(水) 09:28:030539デフォルトの名無しさん
2009/05/27(水) 10:04:33get/set全てが低レベルなインターフェースとも限らないけどね
2,3行目は俺も同じ意見だ
0540デフォルトの名無しさん
2009/05/27(水) 12:02:18>>515に対する反論はEffective C++にずばり書かれてる。
ちなみに、Effective C++の著者であるメイヤーは別の書物、
Effective STLの中でそういう連中とは距離を取れと書いている。
まさに>>507の予言どおりだ。
0541デフォルトの名無しさん
2009/05/27(水) 12:26:20議論の冒頭、>>499はちゃんとそういう例外事項があることを認めている。
C++ Coding Standardsの第41項でも例外事項を設けているし、
setとgetの功罪(設計の過ち)についても言及している。
だから、「原理主義」でくくるのは議論の前提を無視している。
0542デフォルトの名無しさん
2009/05/27(水) 12:36:27内容は濃いな
0543デフォルトの名無しさん
2009/05/27(水) 12:54:51やっぱ昔から争ってる内容なのか
0544デフォルトの名無しさん
2009/05/27(水) 13:34:11これもだめなのか?
0545デフォルトの名無しさん
2009/05/27(水) 15:18:29どっちが正解とかいうものではない
0546デフォルトの名無しさん
2009/05/27(水) 15:31:38そういう人間もCoding Standardsを読むべきだな。
高速化が正当化されるには「時期」があることが説明されている。
アジャイルプラクティスとかもあわせて読んでおきたい。
0547デフォルトの名無しさん
2009/05/27(水) 15:59:170548デフォルトの名無しさん
2009/05/27(水) 18:00:17PODにするためだから仕方ない
0549デフォルトの名無しさん
2009/05/27(水) 22:36:05だから詳しく知らないなら断言するなよ。
getter/setterの速度がどうとか言ってる奴は
議論に参加する資格すらないから。
0550デフォルトの名無しさん
2009/05/28(木) 00:07:33>>485の質問からなんでこんな流れになるのかさっぱりわからん。
ここは聞かれてもいない知識をひけらかす似非回答者たちのオナニー相談室ですか?
0551デフォルトの名無しさん
2009/05/28(木) 00:07:560552デフォルトの名無しさん
2009/05/28(木) 00:25:57申し訳ありません。
ここは質問に淡々と答えるだけの
ボランティアたちによる慈善スレでした。
以後気をつけます。
でいいですか?
0553デフォルトの名無しさん
2009/05/28(木) 00:31:45そもそも質問には、public なんて単語すら全く出てきてないよ?
>とてもサイズの大きなメンバ変数があったとき、
>「そのメンバ変数のポインタを返すようなメンバ関数を作る」か、
>「そのメンバ変数のコピーを返すようなメンバ関数を作る」か、
>どちらがオブジェクト指向としてはよろしいのでしょうか?
結局どうすればいいのよこれ?俺も知りたいよ
0554デフォルトの名無しさん
2009/05/28(木) 00:40:02実際には実行速度とかconstnessとかあるだろうが、オブジェクト指向の問題ではないかと。
0555デフォルトの名無しさん
2009/05/28(木) 00:50:44質問者の書き方だと、その巨大なメンバ変数は外部からは readonly にしたいんだと思うけど、
ポインタを返すと write できちゃうってのはオブジェクト指向からすると問題なんじゃないの?
俺の理解不足なのか…すまない
0556デフォルトの名無しさん
2009/05/28(木) 01:08:45その場その場で最も適当(若しくは、それなりに妥当)な方法を選ぶのがC++。
0557デフォルトの名無しさん
2009/05/28(木) 01:12:23オブジェクト指向的には値を返すべきだが、
実行速度が必要な場合などは、オブジェクト指向に捕らわれるよりも処理速度を優先させてもいい
的な答えだと思ってた。そうでもないのか。さんきゅー。
0558デフォルトの名無しさん
2009/05/28(木) 01:19:011. 本当にaを外部に晒す必要があるのかよく考える。
2. Aに処理を任せられないかよく考える。
3. Aの名前を変えてみて、やっぱりAに任せられないかよく考える。
4. aの要素をすべて晒す必要があるのかよく考える。
それでもだめなら、
返却するメンバ変数も安全に作られているなら、
constのポインタか参照を返すようにすればそれで十分。
呼ばれるたびに新たなオブジェクトの生成が必要なら躊躇せずコピーする。
悪意あるプログラムから保護する必要がある場合も躊躇せずコピーするが、
たいていはそれだけでは不十分だと思われ。
90点回答だ。おまいらひれ伏せ。
異論はオカマ言葉で行うこと。
0559デフォルトの名無しさん
2009/05/28(木) 01:23:50あたしの身体はひれ伏してるのに、あたしの息子が……どうしてくれんのよ! もう!
0560デフォルトの名無しさん
2009/05/28(木) 07:46:40>>486が答えだろ
それ以降は雑談
0561デフォルトの名無しさん
2009/05/28(木) 09:38:38イテレータ的なものを使うという案は出ていないようですが
この方法はそれほどスマートな解決策ではないということでしょうか
0562デフォルトの名無しさん
2009/05/28(木) 09:40:030563デフォルトの名無しさん
2009/05/28(木) 09:41:42class Person{
std::string name_;
public:
std::string *name() const { return &name_;} //A
std::string name() const { return name_;} //B
const std::string &name() const { return name_;} //C
const std::string *name() const { return &name_;} //D
};
みたいなのでAにするかBにするかってことだよね。
「とてもサイズの大きな」ってのが曖昧だけど、つまりコピーにコストがかか
るものってことだろう。
つまり回答は>>490だな(C,D)。
もちろんクラスやメンバの意味が変われば>>486もあるだろうけど、頭ごなしに
「問題外」というのは何か勘違いや思い込みがあるのだろう。
0564563
2009/05/28(木) 09:43:56- std::string *name() const { return &name_;} //A
+ std::string *name() { return &name_;} //A
0565デフォルトの名無しさん
2009/05/28(木) 11:37:19そうかな
俺も
「データメンバAがあったとき、それを扱うメンバ関数Bはどう作ればオブジェクト指向っぽいでしょうか」
という質問はおかしいと思う
nameの例はあくまでnameがあってこそのname_でしょ?
0566デフォルトの名無しさん
2009/05/28(木) 11:42:580567デフォルトの名無しさん
2009/05/28(木) 12:22:56「とてもサイズの大きな」ってのが、そもそもおかしいよな。
大きかろうが小さかろうが、オブジェクト指向な振る舞いは同じはず。
0568デフォルトの名無しさん
2009/05/28(木) 15:32:140569デフォルトの名無しさん
2009/05/28(木) 15:46:30古米に違いが出たら
悲しいやね
0570デフォルトの名無しさん
2009/05/28(木) 16:51:430571デフォルトの名無しさん
2009/05/28(木) 18:31:510572デフォルトの名無しさん
2009/05/28(木) 21:12:43http://island.geocities.jp/v_no11/programing/Blitzplusplus.html のページに従ってBlitz++をインストールしようとしたんだけど、
cygwinの場合
"blitz-0.9"フォルダで以下を実行
$ ./configure
$ make install
の最後の行のmake install をコマンドしたら、
延々インストール文流したあとにエラー吐いて止まるのよ。
で、最後のエラー文をググったら、Blitz++のメールサポートページ
http://www.oonumerics.org/MailArchives/blitz-support/2002/12/0599.php
にたどり着いてどうやら俺と同じエラーみたいなんだけど、
回答者は「gccのバージョン古いんじゃねーのー?」みたいなことしか答えてない。
誰か分かるひといたら助けてくれ
0573デフォルトの名無しさん
2009/05/28(木) 22:24:39後何カ所止まるか想像もできないのに
全部この板で聞いて解決するつもり?
無駄な努力はやめてgccバージョンあげとけ。
あと質問の仕方の問題点について20字以内で述べなさい。
0574デフォルトの名無しさん
2009/05/29(金) 01:51:390575デフォルトの名無しさん
2009/05/29(金) 05:03:480576デフォルトの名無しさん
2009/05/29(金) 05:50:52俺はそれ買ってみた。
とても良かった。
0577デフォルトの名無しさん
2009/05/29(金) 07:09:150578デフォルトの名無しさん
2009/05/29(金) 13:43:45改訂2版とか言うのがあるから、どっちにしたらいいのか迷ったんだけど
発売日で比べりゃ一目瞭然だったわ
サンクス
0579デフォルトの名無しさん
2009/05/29(金) 14:37:17というか最初改訂2版しかなくて買ったら次本屋に行ったら
第3版があって俺涙目orz
0580デフォルトの名無しさん
2009/05/29(金) 21:23:58インスコ先にDドラ指定してもCドラを800MBぐらい食うのよ(今Cドラは1.5GBぐらいしか空きない)
スリム版みたいなのってないんですかね
0581デフォルトの名無しさん
2009/05/29(金) 21:59:080582デフォルトの名無しさん
2009/05/29(金) 22:00:410583デフォルトの名無しさん
2009/05/29(金) 22:01:490584デフォルトの名無しさん
2009/05/29(金) 22:14:07アプリケーション更生が正しくないためアプリケーションの開始に失敗しました
マニフェストファイルを参照してエラーの原因を調べてください
と出ます、何がおかしいのでしょうか?DXUTを使っています
0585デフォルトの名無しさん
2009/05/29(金) 22:14:46正直もう消すものないんだけどね 使ってない付属ソフトでも消そうかな・・・
答えてくれた人ありがとう!
0586デフォルトの名無しさん
2009/05/29(金) 22:25:14Dドライブには空きがあるのなら、
ジャンクションやシンボリックリンク使ってDドライブにファイルを移せばいい。
0587デフォルトの名無しさん
2009/05/29(金) 23:20:46ジャンクションやシンボリックリンクって
もしかしてXPだと無理? ググったらなんかVistaで使用可能とかでてきたんだけど
0588デフォルトの名無しさん
2009/05/29(金) 23:37:050589デフォルトの名無しさん
2009/05/29(金) 23:57:220590デフォルトの名無しさん
2009/05/29(金) 23:59:500591デフォルトの名無しさん
2009/05/30(土) 00:11:10たしかできるはずー
EeePC901で容量稼ぐためにがんばったことがあった
0592デフォルトの名無しさん
2009/05/30(土) 00:57:10アラインメント関係がわからない。
とりあえず、現状を書くとある大きい処理がmain関数中に埋まってたんだが、
やたら遅いから(まぁ、処理量もあるんだが)なんとなく関数化してソースの先頭に
移動させたら早くなって、アラインメントが原因だと思うんだ。
で、ものとしては
for(i = 0; i<32*32*32; i++)for(i2 = 0; i2<32*32*32; i2++);
だけなんだが、原因は何だろう?
(関数の位置なのか、変数の位置なのか。
アラインメントがどのように影響するか分からないので、
どの辺に注意したらいいかおしえてほしい)
へたくそな文章でごめんなさい。。。分かる人お願いします。
0593デフォルトの名無しさん
2009/05/30(土) 01:26:05map出力して確かめてみたらどうよ(bcc32なら-M)
0594デフォルトの名無しさん
2009/05/30(土) 01:49:07>移動させたら
レジスタ割付されただけじゃねーの
0595デフォルトの名無しさん
2009/05/30(土) 03:11:59俺もいくつかの入門向けサイトを見て「暗黙の変換を明示的に書くというだけの意味しかないのかな?」
と勘違いしていたが、実際には暗黙の変換が認められないいくつかのケースでもstatic_castができる。
このことってどれくらい知られてるんだろ。
0596デフォルトの名無しさん
2009/05/30(土) 03:20:57static_castはコンパイル時にキャストに問題がないか判断するもの、って覚えてたが
むしろ「暗黙の変換を明示的に書く」って解説してるサイトがあるのか?
それは問題がある解説に見えるなぁ
0597デフォルトの名無しさん
2009/05/30(土) 03:24:330598595
2009/05/30(土) 03:25:480599デフォルトの名無しさん
2009/05/30(土) 08:16:34ttp://www.forest.impress.co.jp/article/2008/12/11/linkshellext.html ここによると、
>また、本ソフトは“ジャンクション”や“ハードリンク”なども作成可能。
>Windows Vistaでは多くの場合、シンボリックリンク以外を利用する必要はないが、
>Windows XP以下のバージョンのWindowsではシンボリックリンクが利用できないので、
>これらで代用しよう。
ってあるからシンボリックリンクはだめだけどジャンクションはいいみたいです
で、つまりCドラのファイルをDドラに移して、CドラにはDドラの移転先へのリンクだけ残しておけばいい
みたいな感じでいいんでしょうかね?
0600デフォルトの名無しさん
2009/05/30(土) 09:47:49std::vector<double> b = a;
この場合って、
コピーコンストラクタが呼ばれるのか、代入演算子が呼ばれるのか
コンパイラによって違うんだっけ?
どこかに書いてあった気がするんだが忘れてしまった。
0601デフォルトの名無しさん
2009/05/30(土) 10:01:08必ずコピーコンストラクタ。
0602デフォルトの名無しさん
2009/05/30(土) 10:01:48reinterpret_cast…ポインタと整数型の変換に使う。
dynamic_cast…略。滅多に使わず事足りる。
static_cast…以上3つ以外
っていう認識でいるわ。
0603デフォルトの名無しさん
2009/05/30(土) 10:04:10カンチガイしているな
std::vector<double> a;//デフォルトコンストラクタ
std::vector<double> b = a;//コピーコンストラクタ
これらは「新しいオブジェクトを作る(construct)」なのだから
呼ばれるのは両方ともconstructor。
そして呼ばれるのは当然
前者はデフォルトコンストラクタ、後者はコピーコンストラクタ。
一方、
std::vector<double> x;//デフォルトコンストラクタ
このとき
x=b;
としたら、これは新しいオブジェクトを作るわけではないのだから
代入演算子operator =
が呼ばれる。
0604デフォルトの名無しさん
2009/05/30(土) 10:15:58ありがと!
0605デフォルトの名無しさん
2009/05/30(土) 15:07:01君はキャストしない方がいい。いつか死ぬ。
0606デフォルトの名無しさん
2009/05/30(土) 15:15:03どこが間違い?
0607デフォルトの名無しさん
2009/05/30(土) 15:27:56>>605ではないが、禿本のキャストに関する部分を読んでこい。
0608デフォルトの名無しさん
2009/05/30(土) 15:40:16禿本持ってないが、今度勉強してみるわ。
んで
>>605さん、>>602のどこが間違い?
0609デフォルトの名無しさん
2009/05/30(土) 15:49:270610デフォルトの名無しさん
2009/05/30(土) 15:53:010611デフォルトの名無しさん
2009/05/30(土) 15:54:560612デフォルトの名無しさん
2009/05/30(土) 15:58:070613デフォルトの名無しさん
2009/05/30(土) 15:59:310614デフォルトの名無しさん
2009/05/30(土) 16:04:060615デフォルトの名無しさん
2009/05/30(土) 16:07:31>そういう状況が多数生まれる
の多数ってのは
>クロスキャストを多用する
の意味なんじゃないの?
なんで分からないの?w
0616デフォルトの名無しさん
2009/05/30(土) 16:22:24自宅のPCで同じことをするにはどういったソフトを使えば良いのでしょうか?
講義も全くわからずコンパイルという意味も全くわからずソフトを探すこともままなりません。どうかご教授ください。
0617デフォルトの名無しさん
2009/05/30(土) 16:22:510618デフォルトの名無しさん
2009/05/30(土) 16:26:17は>>612と同一人物?
そうだとしたら、>>612は誰に対するレス?
0619デフォルトの名無しさん
2009/05/30(土) 16:27:300620デフォルトの名無しさん
2009/05/30(土) 16:30:20お前は誰に対するレス?
安価つけてくれ、分からないから。
0621デフォルトの名無しさん
2009/05/30(土) 16:32:15断る
それ位自分で見抜け
0622デフォルトの名無しさん
2009/05/30(土) 16:34:06いや、それを明らかにしておかないと、
俺が論破してもはぐらかされるだろ。
そういうヤツが多すぎるから、はっきりさせないと不毛な書き込みになる。
0623デフォルトの名無しさん
2009/05/30(土) 16:34:320624デフォルトの名無しさん
2009/05/30(土) 16:36:340625デフォルトの名無しさん
2009/05/30(土) 16:41:110626デフォルトの名無しさん
2009/05/30(土) 16:44:20顔真っ赤
0627デフォルトの名無しさん
2009/05/30(土) 16:47:07鏡見て言ってるんだよね?
0628デフォルトの名無しさん
2009/05/30(土) 17:02:090629デフォルトの名無しさん
2009/05/30(土) 17:02:51const_castなんかいまだに使いどこがわからん
0630デフォルトの名無しさん
2009/05/30(土) 17:08:120631デフォルトの名無しさん
2009/05/30(土) 17:09:15そりゃまずいんじゃね?
木構造が壊れそうだが
0632デフォルトの名無しさん
2009/05/30(土) 17:18:40const_castを使う主なケースは、糞なCのライブラリ関数の引数に
constな変数を渡すときだな。例を挙げるとこんな感じ。
void stupid_func(char *filename); // prototype
void Foo::some_method(const std::string& filename)
{
stupid_func(const_cast<char*>(filename.c_str()));
}
0633デフォルトの名無しさん
2009/05/30(土) 17:22:24もちろん比較に影響及ぼすような変更はダメだぞ
構造体とかを入れたsetで、メンバの一つをキーに使ってるような場合があるだろう
そういう時にキー以外のメンバを変更するために使う
0634デフォルトの名無しさん
2009/05/30(土) 17:30:54なるほど、ライブラリに渡すときなんかに使うのか
いくら糞でもライブラリ側を修正するわけにいかないもんな
0635デフォルトの名無しさん
2009/05/30(土) 17:55:27おまいらはvolatileってどんな時(除く組み込み用途)使っている?
あと、const_castでvolatileを取るとる時ってどんな時?
0636デフォルトの名無しさん
2009/05/30(土) 17:55:44俺はそういうのはmutableでやるなぁ。
const_castでやると、keyも含めて全て変更可能な「状態」になってしまうし。
0637デフォルトの名無しさん
2009/05/30(土) 18:09:49aliceとかいう名前の開発ツールがたくさん入ってるから�_
0638デフォルトの名無しさん
2009/05/30(土) 18:27:09デバイスドライバを書く時には当然使う必要あるよね。
あとは、インラインアセンブリでローカル変数を上書きする時とか。
こんなことめったにやらないが。
0639デフォルトの名無しさん
2009/05/30(土) 18:48:24mutableにすると、本当にキー以外もconstにしたいときに困るだろう
あくまでsetに入れたときの制約であって、そのためにmutableにするのは乱暴すぎる
0640デフォルトの名無しさん
2009/05/30(土) 19:11:35setの要素を変更とかやったことないな
今度やってみるか
0641デフォルトの名無しさん
2009/05/30(土) 21:11:30VC++ではマルチスレッド対策の効果を独自に付加している。
http://msdn.microsoft.com/en-us/library/12a04hfd.aspx
Unixだとマルチスレッドでvolatileなんて使うなボケらしいが。
const_castで外したくなる状況は分からない。
0642デフォルトの名無しさん
2009/05/30(土) 22:40:15Visual C++ Express Editionでぐぐれ
0643デフォルトの名無しさん
2009/05/30(土) 22:44:100644デフォルトの名無しさん
2009/05/30(土) 22:45:14どうも、ほとんどアプリ系じゃ使わんということですな
>>641 の例じゃ普通はmutexやクリティカルセクション使うんじゃないの
それでvolatileを使うメリットがよく分らん,orz. コードが簡単になるがメリット?
0645デフォルトの名無しさん
2009/05/30(土) 23:24:24ttp://ritaz.blog64.fc2.com/blog-entry-66.html
より引用。
class sample
{
public:
...;
const char& operator[](unsigned int position) const
{
...;
return dat[position];
}
char& operator[](unsigned int position)
{
return const_cast<char&>(static_cast<const sample&>(*this)[position]);
}
...;
};
0646デフォルトの名無しさん
2009/05/30(土) 23:32:43blogにも書いてあるが、やりすぎな工夫の一例だな
0647デフォルトの名無しさん
2009/05/30(土) 23:44:12どちらかというと、そういう排他制御の仕組みを自分で作るときに使う。
例えば下のコードをコンパイラが最適化した結果、
ロック確保する前や解放した後にhogeへ読み書きするコードが生成されたらシャレにならない。
MS仕様では、volatileなデータに読み書きするとそこを境界として、それより前後に読み書き処理が
ずらされないように最適化を抑えると言っている。
void f(hoge_t* hoge) //hogeを使うには排他制御でロックが必要とする
{
// ...
ロック確保
hogeを使う
ロック解放
// ...
}
0648デフォルトの名無しさん
2009/05/30(土) 23:48:16意味が分からん。
最適化によって、「hogeを使う」に相当するコードが、「ロック確保」の前や「ロック解放」の後に配置されたらシャレにならないってこと?
0649デフォルトの名無しさん
2009/05/30(土) 23:50:52ああ、ごめん。そういうこと。
携帯から打つのが面倒でいろいろ略した。
0650デフォルトの名無しさん
2009/05/31(日) 00:34:14ありがとうございます。探してみます。
0651デフォルトの名無しさん
2009/05/31(日) 00:44:58それ第何版の何節に書いてあるの?
0652デフォルトの名無しさん
2009/05/31(日) 01:30:20そういう用途にも使えるってだけでWindowsでもマルチスレッドでvolatileなんて使わない
mutexなりクリティカルセクションなりInterlocked-系関数なり使えばそこでフェンス張られるし
(Interlocked-系関数でvolatile使われてるけどね。間接的には使うことになるのかな)
やっぱり組み込みとかドライバ以外で使うことはないと思うな
0653デフォルトの名無しさん
2009/05/31(日) 17:24:40どうも、どうも
>>647
>そういう排他制御の仕組みを自分で作るときに使う
ずばり、自分でそういう仕組みは作ることないです
0655デフォルトの名無しさん
2009/05/31(日) 21:20:51第3版には本当に書いてあるのか?
第4版まであと2年はかかりそうな気がするし、
第3版買ってくるか・・・
0656645
2009/05/31(日) 21:28:28第3版には本当に書いてある。
厳密に同じコードかどうが覚えてないが、
const版をnon-const版にて呼び出してconst_castでconst属性を外す
という方式であることは本当。
俺もそんなことして良いの!?と思ったから信じられなくても無理はない。
0657645
2009/05/31(日) 21:31:01原著第3版(日本語翻訳されているもの)で
15ページから始まる項目にある。
0658デフォルトの名無しさん
2009/05/31(日) 21:48:18対応するんじゃないかなと思うけど、
そこではmutableをサポートしてないコンパイラのための苦肉の策として
「みっともないけど」と前置きした上でconst外しをしている。
これのことじゃないよな?
0659デフォルトの名無しさん
2009/05/31(日) 22:06:17じゃないってば。
少しは俺を信じろ(笑)
他の人も誰か証言してくれ。
0660デフォルトの名無しさん
2009/05/31(日) 22:08:18さっぱり読めなくて意図が分からん。
http://books.google.co.jp/books?id=d-2Im_Ox7qMC&pg=PA24&as_brr=3&source=gbs_toc_r&cad=0_0#PPA41,M1
俺の英語力も落ちたな・・・
0661デフォルトの名無しさん
2009/05/31(日) 22:10:320662デフォルトの名無しさん
2009/05/31(日) 22:10:40すまんwww
明日買ってくる。
0663645
2009/05/31(日) 22:12:21メンバ関数foo()のconst版とnon-const版の定義が
同じようなものになることは多々あるじゃない。
同じような定義を繰り返し書きたくない、そんなあなたにconst_cast
って言うような主旨。
const版をうまく定義することで、non-const版の定義は
それを呼び出してconst性を除去するだけ
で良くなる。
0664デフォルトの名無しさん
2009/05/31(日) 22:13:17俺読めたw
・・・そろそろ天の啓示が来る頃だろうか。
0665デフォルトの名無しさん
2009/05/31(日) 22:14:26もしかして、お兄様なの!
こんなところで巡り合えるなんて。。
0666デフォルトの名無しさん
2009/05/31(日) 22:16:24しょせん、暇をもてあました神々の遊び
0667デフォルトの名無しさん
2009/05/31(日) 22:20:04感覚的にconst側で非constのコードを
再利用したくなりそうなものだけど
それも理由があるのかな。
とりあえず第3版買ってくるよ。
生き別れた妹はいなかった気がするし。
0668645
2009/05/31(日) 22:23:19俺もそう思ったが、
理由としては
const側で非constメンバ関数を呼び出すというのはダメ
ってことらしい。
たとえ実際にはオブジェクトが変更されないとしても。
まあ買ってくる価値はあるかと。
何てったって名著だし、無駄な出費ではないと思う。
0669デフォルトの名無しさん
2009/05/31(日) 22:41:23#define _UNICODE
で定義されたソースコードがあるとします。
それを
#define UNICODE
#define _UNICODE
と定義してはエラーになってしまう、つまりANSI版のソースに混ぜて使いたい場合どの
ようにすればいいのでしょうか?
たとえば
int WINAPI WinMain(…){
…(ANSIソースコード)
sub();
}
int sub(){
#define UNICODE
#define _UNICODE
…(UNICODEソースコード)
}
みたいなことはできるでしょうか?
0670デフォルトの名無しさん
2009/05/31(日) 22:49:300671デフォルトの名無しさん
2009/05/31(日) 22:52:12#define UNICODE
#define _UNICODE
したあと
#undef UNICODE
#undef _UNICODE
すればdefineは消える。
でもWIN32なら、
UNICODE版、ANSI版両方そろってるはずだが。
0672デフォルトの名無しさん
2009/05/31(日) 23:25:45とかやってるんだろ
0673デフォルトの名無しさん
2009/05/31(日) 23:59:32いやできなかった
結論からいうと
原理からいうとその方法でできるのは確かなんだが
UNICODEと_UNICODEは最初の最初で定義しておかなければならならないみたいだ
先にwindows.hとか読み込まれてるからその関係で動作がおかしくなる
>>672
アホすぎ
てか解決法をいうと単純にソースファイルをわければ解決できる
最初からやればよかったけど
0674デフォルトの名無しさん
2009/06/01(月) 00:14:010675デフォルトの名無しさん
2009/06/01(月) 01:15:410676デフォルトの名無しさん
2009/06/01(月) 04:06:410677デフォルトの名無しさん
2009/06/01(月) 14:32:49error C2678: 二項演算子 '*' : 型 'composite_impl<result_type_,arg_type_>' の左オペランドを扱う演算子が見つかりません
とエラーが出ます。どうやって回避すればいいのでしょうか?
0678デフォルトの名無しさん
2009/06/01(月) 14:33:55template<typename result_type_, typename arg_type_>
struct composite_impl{
typedef result_type_ result_type; typedef arg_type_ arg_type; typedef result_type (*fn_type)(arg_type);
static fn_type &fn_holder(){ static fn_type fn; return fn; }
result_type operator ()(arg_type a) const{ return (fn_holder())(a); }
};
template<typename result_type_a_, typename result_type_b_, typename arg_type_b_>
struct composite_impl<result_type_a_, composite_impl<result_type_b_, arg_type_b_> >{
typedef result_type_a_ result_type; typedef arg_type_b_ arg_type; typedef result_type (*fn_type)(arg_type);
static fn_type &fn_holder(){ static fn_type fn; return fn; }
result_type operator ()(arg_type a) const{ return (fn_holder())(composite_impl<result_type_b, arg_type_b_>()(a)); }
};
template<typename result_type, typename arg_type>
inline composite_impl<result_type, arg_type> operator *(composite_type, result_type (*fn)(arg_type)){
composite_impl<result_type, arg_type> a; a.fn_holder() = fn; return a;
}
template<typename result_type_a, typename result_type_b, typename arg_type_b>
inline composite_impl<result_type_a, composite_impl<result_type_b, arg_type_b> > operator *(composite_impl<result_type_a, result_type_b> a, result_type_b (*fn)(arg_type_b)){
composite_impl<result_type_a, composite_impl<result_type_b, arg_type_b> > a; a.fn_holder() = fn; return a;
}
composite_type composite;
#include <iostream>
#include <cstring>
int fn_a(int a){ return a * a; }
char *fn_b(int a){ static char str[0xFF]; std::sprintf(str, "%d", a + 1); return str; }
int main(){ std::cout << (composite * fn_a * fn_b)(2) << std::endl; return 0; }
0679デフォルトの名無しさん
2009/06/01(月) 14:42:39> const側で非constメンバ関数を呼び出すというのはダメ
> ってことらしい。
これって、単純にconstメンバ関数内で非constメンバ関数を呼び出すと
コンパイルが通らないって話。
0680デフォルトの名無しさん
2009/06/01(月) 15:00:03const_castで*thisからconstを外すって話だよ。
0681デフォルトの名無しさん
2009/06/01(月) 15:12:45あーそういうことね。
でも*thisのconst外しが駄目なのも当たり前の話だな。
0682デフォルトの名無しさん
2009/06/01(月) 20:59:19むしろconstメンバ関数を呼ぶために*thisにconstを付けてる
外してるのは戻り値のconst
0683デフォルトの名無しさん
2009/06/01(月) 21:04:09>>667-668
>>679-681
を読みかえしくれ。
0684デフォルトの名無しさん
2009/06/01(月) 21:13:26>>645のことだろ?
static_cast<const sample&>(*this)は明らかに*thisにconstを付けてる
何か間違ってるのか
0685デフォルトの名無しさん
2009/06/01(月) 21:15:12> >>645のことだろ?
否。
>>667-668の事。
それに対し>>679-681というやりとりが行われている。
皆は>>645は理解している。
0686デフォルトの名無しさん
2009/06/01(月) 21:18:480687デフォルトの名無しさん
2009/06/01(月) 22:34:32http://www.sengoku.co.jp/CategoryIndex/wire.htm
個人的には極細より線と鈴メッキ銅線が好きだけど (どうせ趣味だし)、
信頼性からジュンフロン線使う人のほうが多い。
このシリーズのより線はストリッパー必須。
ジュンフロンは苦手です。ええ。
0688デフォルトの名無しさん
2009/06/01(月) 22:36:180689デフォルトの名無しさん
2009/06/01(月) 22:43:04というかハードとソフト両方いけるとかうらやましい
0690デフォルトの名無しさん
2009/06/01(月) 22:45:09全然 なんだかわからないwww
すごいな。
0691デフォルトの名無しさん
2009/06/02(火) 01:02:510692デフォルトの名無しさん
2009/06/02(火) 01:44:25線の被覆を剥ぐための工具だろ
0693デフォルトの名無しさん
2009/06/02(火) 02:19:34struct B:A{B();fun();};
struct C{C(A&b); C problem(A&b);};
C c(B());
c.problem(B()); // no-match function になるのは何故?
C::problem(一時オブジェクト参照)を弾くならコンストラクタでも弾くべきだと思うんだけど
0694デフォルトの名無しさん
2009/06/02(火) 02:57:23しらんがな(´・ω・`)
0695デフォルトの名無しさん
2009/06/02(火) 03:51:45そのクラスのインスタンスが持つHPやMP,攻撃力などのステータス一覧を表示する関数を作るとき、
クラス自信にその関数を持たせるのか、あるいはクラスとは関係のない部分で作るのか、どちらがいいんでしょう?
クラス設計の考え方がまったくわかりません・・。
0696デフォルトの名無しさん
2009/06/02(火) 06:17:21その場合はカプセル化を優先する。
まず、HPやMP,攻撃力などのステータスを格納する変数(intだったりstd::size_tだったりするだろう)のアクセス指定子がどう宣言されているかによって考えを分ける。
1.
もしprivateで宣言されていて、そのステータスをpublicなメンバ関数h_point()で取得するような仕組みにしている場合(むろんそれが望ましい)は、「クラスとは関係のない部分で作る」が正解。
つまり別の関数show_status(〜)を作り、〜の部分にキャラクタのインスタンスを渡すようにする。
2.
もしpublicで宣言されているならば、「クラス自身にその関数を持たせる」ないし「friend指定して外部関数を作る」が正解。しかしステータスを格納する変数がpublic指定されていること自体、そもそも望ましくないことだが。
0697デフォルトの名無しさん
2009/06/02(火) 06:23:39private継承しているからだろ
0698デフォルトの名無しさん
2009/06/02(火) 08:07:42そのコンストラクタで本当に動くか試した?
0699デフォルトの名無しさん
2009/06/02(火) 17:56:43は
C c(B (*)());
という関数宣言に解釈される。
B b0;
C c(b0);
c.problem(b0);
とするとできましたが。
関数の引数のリファレンスの型にconstをつけて
"const B&b"、"const A&b"のようにすると
C c = C(B());
c.problem(B());
でもいけました。
なぜかは僕には分かりませんのでどなたか解説お願いします。
コンパイラはgcc4.2.1で確かめました。
0700デフォルトの名無しさん
2009/06/02(火) 19:02:59一次オブジェクトで初期化できることになっている。
0701693
2009/06/02(火) 20:13:27C c(static_cacst<A&>(B())); に成ってますた。
>>699
C c((B())); でも逝けますね。
0702デフォルトの名無しさん
2009/06/02(火) 21:44:52Effective STL の第1章第6項「C++の最も奇妙な解析に注意しよう」に書かれてるね。
(この本自体はSTLの解説本だけど…)
でも、すべてのコンパイラで成功するとも書かれていない・・・おそろしや。
0703デフォルトの名無しさん
2009/06/03(水) 17:16:04void main(void)
{
char data[3465300]
int idata[3465300];
int KOTAE[3465300/2];
int data1[12032/2][300];
int idata1[300][300];
int i,j,id,a,b,No,day,LDAY,d;
char fnamein,fnameout;
FILE *fin,*fout;
#define LDAY 30 //月ごとに変える
//No=1→ステータス;No=2→交通量;No3=速度;No4=オキュパンシー
#define No 2
for(day=0;day<LDAY;day++){
d=day+1;
printf("%d/%d\n",d,LDAY);
sprintf(fnamein,"D:\\/torakan-Y/R_barashi/Ku0409/Ku0409%02d.dat",d);
sprintf(fnameout,"D:\\/torakan-Y/R_barashi/Ku04/Q_Ku0409%02d.txt",d);
fin = fopen(fnamein,"rb");
fread(&data,1,3465216,fin);
fclose(fin);
if((fout=fopen(fnameout,"w"))==NULL) printf("Cannot open output file\n");
0704デフォルトの名無しさん
2009/06/03(水) 17:17:18なんだこの凶悪なのはっ!!
0705703
2009/06/03(水) 17:19:00出力される結果が同じ数字の繰り返しになってしまいます。
エラーの原因としては、以下の4行が怪しいと思っています。
詳しい方、よろしくお願いします。
sprintf(fnameout,"D:\\/torakan-Y/R_barashi/Ku04/Q_Ku0409%02d.txt",d);
fin = fopen(fnamein,"rb");
fread(&data,1,3465216,fin);
fclose(fin);
0706デフォルトの名無しさん
2009/06/03(水) 17:23:44あんたが勝手に”エラー”って呼んでいるものを,具体的に書き表してごらんよ
少なくとも”出力される結果が同じ数字の繰り返し”になることは具体的に書け
0707デフォルトの名無しさん
2009/06/03(水) 17:29:330708デフォルトの名無しさん
2009/06/03(水) 17:32:390709デフォルトの名無しさん
2009/06/03(水) 17:34:40とりあえず変数を#defineで上書きしているのが分かった
0710703
2009/06/03(水) 17:42:02レスありがとうございます。
出力されたファイルを開くと
526855268552685といった感じで同じ数列がただ繰り返されたファイルが
出力されます。
このプログラムはもともと、膨大なデータの中から
一部分を抽出するプログラムとなっています。
また、その莫大なデータにはそのような数列は見られないので
勝手にエラーと判定してしまいました。
>709様
ありがとうございます。
さっそく そこを修正したいと思います。
0711デフォルトの名無しさん
2009/06/03(水) 17:52:30かんじんのファイルに出力している部分が・・・ねぇwwwwwwさすがにESPじゃない俺にはむり
0712703
2009/06/03(水) 17:57:36idata[i]=int(data[i]);
if(idata[i]<0){
idata[i]=256+idata[i];
}
}
id=0;
for(i=0;i<3465216;i=i+2){
a=idata[i]/16;
b=idata[i]%16;
KOTAE[id]=a*16*16*16+b*16*16+idata[i+1];
id=id+1;
}
id=0;
for(j=0;j<288;j++){
for(i=0;i<12032/2;i++){
data1[i][j]=KOTAE[id];
id=id+1;
}
}
0713703
2009/06/03(水) 18:00:29/*区間データの抜き出し*/
id=0;
//////6号三郷JCT‐江戸橋JCT間////////////
for(j=0;j<288;j++){
for(i=0;i<17;i++){
idata1[id][j]=data1[4*i+(8+4*501+No-1)][j];
id=id+1;
}
id=0;
}
for(j=0;j<288;j++){
for(i=0;i<2;i++){
idata1[id+17][j]=data1[4*i+(8+4*772+No-1)][j];
id=id+1;
}
id=0;
}
0714703
2009/06/03(水) 18:02:01for(i=0;i<15;i++){
idata1[id+19][j]=data1[4*i+(8+4*542+No-1)][j];
id=id+1;
}
id=0;
}
for(j=0;j<288;j++){
for(i=0;i<34;i++){
fprintf(fout,"%d",idata1[i][j]);
}
fprintf(fout,"\n");
}
}
}
0715デフォルトの名無しさん
2009/06/03(水) 18:02:27> for(j=0;j<288;j++){
> for(i=0;i<12032/2;i++){
この辺で悪意を感じた
あと,もし仮に名前を付け替えるのが許可されているなら,ぜひデータ構造と名前を変えるべきだとおもふ
0716デフォルトの名無しさん
2009/06/03(水) 18:10:48それと、
>char fnamein,fnameout;
ここはファイル名格納するバッファじゃなかろうか
0717703
2009/06/03(水) 18:11:01すいません。まったく悪意はないです。
もうしわけないです。
名前は変更できます。
0718デフォルトの名無しさん
2009/06/03(水) 18:16:08codepad
ttp://codepad.org/
せめてここに貼るとかさあ。。
0719デフォルトの名無しさん
2009/06/03(水) 18:19:07どうなれば成功なんだよ
そこが分からないのに何も答えられるわけがないだろ
どうせ宿題なんだろうけど
0720703
2009/06/03(水) 18:26:59説明不足ですいません。
トラカンデータといわれる交通量や平均速度といった
情報が網羅されているデータから
一部分を抽出して、自分たちが調べたい路線の
交通量を抜き取るプログラムです。
数列が同じ数字の繰り返しにならなければ、ほぼ成功だと思います。
宿題ではないです。申し訳ないです。
>718様
さっそく、張ってみようと思います。
0721703
2009/06/03(水) 18:30:03さっそく貼ってみました。
0722デフォルトの名無しさん
2009/06/03(水) 18:32:15ひどすぎて目眩がしてきた
一つ言えるのは、これはCであってC++ではないということだ
だからスレ違い
0723デフォルトの名無しさん
2009/06/03(水) 18:32:56なんだこれは
0724デフォルトの名無しさん
2009/06/03(水) 18:52:090725デフォルトの名無しさん
2009/06/03(水) 19:03:32危険な香りのする文字列がたくさんあるけど大丈夫なのか
0726デフォルトの名無しさん
2009/06/03(水) 19:09:39とりあえず
fread(&data,1,3465216,fin);
↓
fread(data,1,3465216,fin);
0727デフォルトの名無しさん
2009/06/03(水) 19:12:43データ解析部分でデータの構造が合致していないような感じだが?
0728703
2009/06/03(水) 19:18:54あなたは神様です。
あなたのおかげで無事解決しました。
なんてお礼をいえばいいのかわかりません。
0729デフォルトの名無しさん
2009/06/03(水) 20:18:520730デフォルトの名無しさん
2009/06/03(水) 20:22:20I solved the problem, thank you.
What it only has to say the reward is not understood.
0731703
2009/06/03(水) 20:27:36申し訳ないです。
0732デフォルトの名無しさん
2009/06/03(水) 20:39:13どっちをインクルードするほうが望ましいの?
0733デフォルトの名無しさん
2009/06/03(水) 20:41:320734デフォルトの名無しさん
2009/06/03(水) 20:42:12書き直してもいい?
要するにファイルの内容は unsigned short 型のデータが
ビッグエンディアンで 6016x288 個格納されているのを
data1 に代入すれば data も idata も KOTAE も必要ないよね
0735デフォルトの名無しさん
2009/06/03(水) 20:53:56社内で使ってる(であろう)コードをこんなところに晒して、
ただで済むと思ってるのか?
オープンソースじゃないだろうし、上司に知られたらやばいんじゃねーの。
0736デフォルトの名無しさん
2009/06/03(水) 21:21:08もう見限られたのか?
0737デフォルトの名無しさん
2009/06/03(水) 21:58:15なにが解決してないの?
0738デフォルトの名無しさん
2009/06/03(水) 22:40:43ゴミクズだよな。
どこもかわらねえなぁ。
0739デフォルトの名無しさん
2009/06/03(水) 22:48:19社内でコンピュータにちょっと詳しい人(事務職とかバイトのお兄ちゃんとか)に
アホ課長が「エクセルで計算するのめんどいからお前プログラム書けよ」って
仕方なくしこったんじゃない?
どうみてもCで書いたコードを、その人がやめちゃって保守要員がいなくなったので
これまたその辺のちょっとコンピュータ詳しい奴にむりくりやらせてるってところでは。
すごいエスパー。昔、エスパドリューはエスパーが身につける特別な装備だと思っていたのを思い出した。
0740デフォルトの名無しさん
2009/06/03(水) 23:49:15C++では関数が返せる変数の型は1つだけである。
(その型と継承関係によってはその子クラスの型でも返せることもあるが。)
ところが、例外処理におけるthrowは関数から外へ任意の型の例外を投げることが可能である。
これをその関数の返り値(戻り値)とみなして
プログラミングをするという面白い技法が
この世に存在していてもおかしくないのではないか
と思ったのだが、誰か知っている人いない?
例外を使ったプログラミングの話をしている訳じゃ無くて
あくまでthrowによる例外を戻り値として利用するスタイルってことで。
0741デフォルトの名無しさん
2009/06/03(水) 23:55:54無茶しないでください。
0742デフォルトの名無しさん
2009/06/03(水) 23:57:22していないならboost::any返せばいいでしょという話だと思う。
0743デフォルトの名無しさん
2009/06/03(水) 23:57:35実用してる奴がいたら絶対に近づきたくないが
ネタとしてはおもしろそうだな。
はたして意味のあるプログラムを作ることができるのか・・・
0744デフォルトの名無しさん
2009/06/04(木) 00:04:54どういう形か想像もつかないが。
0745デフォルトの名無しさん
2009/06/04(木) 00:10:33じゃあお題は例外でC#で言うところのyield()を作る
でどうよ。
0746デフォルトの名無しさん
2009/06/04(木) 00:17:20さっそく自分で否定しちまった・・・
0747デフォルトの名無しさん
2009/06/04(木) 00:39:24何か可能性を感じる
0748デフォルトの名無しさん
2009/06/04(木) 01:27:32戻り値の型として使いたいものの集合がコンパイル時に決まっていないと
例外使う方法も結局何もできないわけだし
0749デフォルトの名無しさん
2009/06/04(木) 02:00:230750703
2009/06/04(木) 02:02:54先程、プログラミングを回してみた結果
無事解決しました。
727様のおっしゃるとおり
データ解析部分でデータの構造が合致してないことが
原因でした。
もし、お時間があるなら、書き直してくださったプログラムを
見せていただきたいです。
0751デフォルトの名無しさん
2009/06/04(木) 02:36:54そういうのはイベント駆動型とかいうやつじゃないか
0752740
2009/06/04(木) 06:28:37え?
どういうことだい?
よく分からないんだが。。。
みんなありがとう。
俺も絶対やらないと思うけど、
>そのアイデアに「catchされなければ呼出元へ伝播する」という例外の特徴も考慮した?
一応考えてる。
boost::anyやvariantは頭をよぎったが忘れることにした。
うーん、むずかしいよねぇ。
少なくとも俺はやらないけど、きっと誰かが何かすごいことを
やってくれるんじゃないかと思った。
0753デフォルトの名無しさん
2009/06/04(木) 11:11:570754デフォルトの名無しさん
2009/06/04(木) 11:52:00c#でもやっていてください
とくにLINQ
0755デフォルトの名無しさん
2009/06/04(木) 14:00:53例外のキャッチってコストかかるんでパフォーマンス劣化が激しいと思うぞ
0756デフォルトの名無しさん
2009/06/04(木) 14:02:250758デフォルトの名無しさん
2009/06/04(木) 17:20:46むやみやたらにthrow使うのはgotoと大して変わらないので、
普通やらん。
やめとけ。
0759デフォルトの名無しさん
2009/06/04(木) 17:51:570760740
2009/06/04(木) 17:57:29でもまあどこかの変態級のプログラマがうまくこれを生かして…(ry
0761デフォルトの名無しさん
2009/06/04(木) 20:32:06#define return assert(0)
して、throw以外で関数から出るのを禁止してプログラム書いてみたらいい
何かが見えてくるかもしれんぞ
0762デフォルトの名無しさん
2009/06/04(木) 20:42:01retType func(/* ... */){
/* ... */
return foo;
}
↓
function func(/* ... */) throw(retType){
/* ... */
throw foo;
}
そして
class function{private:function();~function();};
と定義すれば、めでたく例外指向プログラミング言語の出来上がり
使うのは遠慮します
0764デフォルトの名無しさん
2009/06/04(木) 23:10:07よくわからんが
0765デフォルトの名無しさん
2009/06/04(木) 23:20:59例外の場合は、帰ってくる型が何であるかは知っておく必要があるよね?
間違ってるかしら・・・
0766デフォルトの名無しさん
2009/06/04(木) 23:47:52一応catch(...)で、何でも受けれる。
受けられるだけだが。
戻り値返しにない例外の機能として、
安全な中間すっとばしがある。
funcA() -> funcB() -> funcC() -> 例外発生
↑-----------------------------」
これを使えば、非常に柔軟な逆フロー制御が実現できる。
つまり、メインルーチンを例外のcatch()ブロックに書くのだ。
これを使って何が出来るかというと、それは次の人どうぞ。
0767デフォルトの名無しさん
2009/06/05(金) 00:11:170768デフォルトの名無しさん
2009/06/05(金) 00:16:15結局そのままどっかに転送するしかないよな
throw;で同じ事が出来そうな気はする
0769デフォルトの名無しさん
2009/06/05(金) 00:19:15#include <iostream>
void fib(int n) {
if (n < 2) { throw 1; }
else {
try { fib(n-1); } catch (int r1) {
try { fib(n-2); } catch (int r2) {
throw r1 + r2;
}
}
}
}
int main() {
try { fib(20); } catch (int ret) {
std::cout << ret << std::endl;
}
return 0;
}
0770デフォルトの名無しさん
2009/06/05(金) 00:21:40標準C++の範囲で例外指向プログラミングはできないようです
0771デフォルトの名無しさん
2009/06/05(金) 00:29:57変態Chain Respinsibility?
void discover() {
switch (random) {
case 0:
throw Chair;
case 1:
throw Human;
case 2:
throw Orange;
case 3:
throw Truth;
}
}
void loop() {
while (1) {
Sitter(Killer(Eater(Philosopher(discover))));
}
}
どうすんだこれ・・・
0772デフォルトの名無しさん
2009/06/05(金) 00:31:460773デフォルトの名無しさん
2009/06/05(金) 00:45:360774デフォルトの名無しさん
2009/06/05(金) 02:23:18visitorで何とかする手はあるよ。
ttp://www.boostpro.com/vault/index.php?action=downloadfile&filename=holder.zip&directory=Data%20Structures&
0775デフォルトの名無しさん
2009/06/05(金) 05:26:42アクティブな例外が2つ以上同時に発生することですか?
それともtry・catchブロックの中にtry・catchブロックがあることですか?
0776デフォルトの名無しさん
2009/06/05(金) 09:32:400777デフォルトの名無しさん
2009/06/05(金) 11:12:551も正しいなら今後1で書こうと思ってます。
template<class T> class X
{
public:
X &Func() // 1
X<T> &Func() // 2
{
return *this;
}
}
0778デフォルトの名無しさん
2009/06/05(金) 11:33:33visual C++を使おうかと思っているのですが。
分厚くてもよいので、一冊で応用まで深く学習出来るのはありませんかね?
0779デフォルトの名無しさん
2009/06/05(金) 11:52:542、テンプレート引数を省略しないといけないのはコンストラクタだけ
0780デフォルトの名無しさん
2009/06/05(金) 12:03:14禿本を買っておけば間違いは無い
0781デフォルトの名無しさん
2009/06/05(金) 13:44:02禿本とは何ですか?
0782デフォルトの名無しさん
2009/06/05(金) 13:53:120783デフォルトの名無しさん
2009/06/05(金) 13:54:120784デフォルトの名無しさん
2009/06/05(金) 14:47:44ていうより、59件ヒットしてその全てがただ禿本とC++を含んでるやつのみで
何の略かも書いてありませんでした。
その本の正式名称がわかりません。
すいませんが、本の正式名称で書いていただけませんか?
0785デフォルトの名無しさん
2009/06/05(金) 15:01:04でぐぐったら一番上におっさんの名前出てきたわw
0786780
2009/06/05(金) 15:04:39正式名称はThe C Programming Language(邦訳はプログラミング言語C++)
著者はC++の設計者である禿ことBjarne Stroustrupだ。
http://www.research.att.com/~bs/ に写真があるからよく拝んでおくように。
日本語訳については色々言われているみたいだが、俺は原著しか使ったことが
ないので分からん。英語に問題ないなら原著をすすめておく。
0787デフォルトの名無しさん
2009/06/05(金) 15:07:13素直に教えて感謝されればいいのに
0788デフォルトの名無しさん
2009/06/05(金) 15:12:09禿本とはそういう意味だったのですか。
教えてくださってどうもありがとうございました。参考にします。
0789デフォルトの名無しさん
2009/06/05(金) 15:37:25英語に問題ないならTC++PL(禿本)よりも先にProgrammingを読んだほうがいいかも
同じようなこと書いてあるけどProgrammingのほうが分かりやすい
TC++PLにしか書いてないこともあるからどのみちTC++PLは読むんだけどね
0790デフォルトの名無しさん
2009/06/05(金) 15:39:18TC++PL(禿本): http://www.research.att.com/~bs/3rd.html
Programming: http://www.research.att.com/~bs/programming.html
0791780
2009/06/05(金) 15:42:31自己レススマソ。原著名間違えた。K&Rじゃないっての。
>>787
まあ2chだから仕方ないね。
禿本ってこのスレでは良く知られてると思ってたけど、意外とそうでもないのかな。
0793デフォルトの名無しさん
2009/06/05(金) 15:45:04スルーで正解だった
0794デフォルトの名無しさん
2009/06/05(金) 16:20:14> 一番、二番目に出てくるならまだしも
Googleを使わせるか否かを考えるのに「一番、二番目に出て来るかどうか」を基準にする、
怠惰な人間をつけあがらせる使命でもあるかのような考え方は理解不能だし、
悪いけど二番目の結果(環境依存OKスレの2スレ目)にこういう文章が出て来るぞ。
> 「プログラミング言語C++」は禿本と呼ぶ。
あ、"C++"と"禿本"をダブルクォーテーションで括る発想に至らないバカは考慮してないけど。
0795デフォルトの名無しさん
2009/06/05(金) 16:27:120796デフォルトの名無しさん
2009/06/05(金) 16:30:53本当にそういう傾向があるのか、自分のバカさを指摘されたバカが
必死にそう見ようとしてるだけなのか判断つかず、回答できないです。
0797デフォルトの名無しさん
2009/06/05(金) 19:26:312でもいいんだけどね。テンプレートパラメータは
宣言された範囲(テンプレートのスコープ)内では省略していいことになっている。
クラス定義の冒頭で template が宣言されていて、その範囲内に入っているので、
この場合のメンバ関数宣言のテンプレートパラメータは省略できる。
(Accelerated C++ p.197などを参照)
template < class T > class foo {
template < class T > foo &bar( foo<T> &t );
};
のような紛らわしい宣言も可能な様子。
0798デフォルトの名無しさん
2009/06/05(金) 19:26:34捻くれものは大抵、過去に何らかの形で虐げられた経験がある
あとはわかるな?
0799デフォルトの名無しさん
2009/06/05(金) 19:29:36C++自体が捻れた言語だからです。
0800デフォルトの名無しさん
2009/06/06(土) 15:12:48全然別人なんだけど割り込んで聞いて良い?
template < class T > class foo {
template < class T > foo &bar( foo<T> &t );
};
ってのは要するに
template < class T > class foo {
template < class U > foo<T> &bar( foo<U> &t );
};
ってことだよね?
0801デフォルトの名無しさん
2009/06/06(土) 20:23:43わかります。
現実の現在で叩きのめされたので、架空の過去を夢想して脳内逆襲ですね?
0802デフォルトの名無しさん
2009/06/06(土) 20:26:59最初の方はgcc 4.2.1ではエラーになった。
0803デフォルトの名無しさん
2009/06/06(土) 21:46:37>>800
Yes。
0804デフォルトの名無しさん
2009/06/06(土) 22:04:24#include <iostream>
using namespace std;
template < class T > class foo {
public:
foo() : x( 0 ) {};
foo( foo *p ) : x( p ) {};
template < class T > foo &bar( foo<T> &t ){
cout << t.member << endl;
return *x;
}
T member;
foo *x;
};
int main() {
foo< int > base;
base.member = 1000;
foo< int > i(&base);
foo< char > c;
i.member = 1;
c.member = 'a';
foo< int > r = i.bar( c );
cout << r.member << endl;
}
0805デフォルトの名無しさん
2009/06/07(日) 05:02:33return *xだから挙動自体は普通だな
0806デフォルトの名無しさん
2009/06/07(日) 05:28:110807デフォルトの名無しさん
2009/06/07(日) 12:07:05読むだけで疲労した。
barメンバ関数が何をやりたいのか意図が分からない
(練習プログラムだから仕方ないことだが。)
のに理解をじゃまされた。
分かって良かった。
0808デフォルトの名無しさん
2009/06/07(日) 12:38:25>>797の再現じゃないの?
0810デフォルトの名無しさん
2009/06/07(日) 13:58:30コンストラクタとデストラクタをどうやって起動したらいいのでしょ?
class AA { int i1,i2; AA(); ~AA(); }
void func()
{
char dat[100];
AA *dat;
dat = (AA *)dat;
}
0811デフォルトの名無しさん
2009/06/07(日) 14:02:17new(dat) AA();
デストラクタ
dat->~AA();
0812デフォルトの名無しさん
2009/06/07(日) 14:11:53delete[] dat;
0813デフォルトの名無しさん
2009/06/07(日) 14:38:59>>881 下記のようにうにエラーになります >>812 100個のインスタンスを作るわけではないです
class AA
{
int a1,a2;
public:
AA() { printf("AA コンストラクタ\n"); }
~AA() { printf("AA デストラクタ\n"); }
};
int _tmain(int argc, _TCHAR* argv[])
{
char buf[100];
AA *datp;
datp = (AA *)buf;
new(datp) AA(); // ここがエラーになる…
datp->~AA();
return 0;
}
エラー 1 error C2660: 'operator new' : 関数に 2 個の引数を指定できません。
0814デフォルトの名無しさん
2009/06/07(日) 14:39:550815デフォルトの名無しさん
2009/06/07(日) 14:41:49http://124.45.27.25:12086/stream.mp3.m3u
IRCNET #CRYBUTSU
0816デフォルトの名無しさん
2009/06/07(日) 14:55:530817デフォルトの名無しさん
2009/06/07(日) 15:12:110818デフォルトの名無しさん
2009/06/07(日) 15:16:19実際のプログラムは、sizeof で確認をしています
0819デフォルトの名無しさん
2009/06/07(日) 16:27:09要件について詳しくまとまってるページない?
0820デフォルトの名無しさん
2009/06/07(日) 16:49:490821デフォルトの名無しさん
2009/06/07(日) 16:55:54要件なんて無いぞ。
0822デフォルトの名無しさん
2009/06/07(日) 17:05:30領域確保時の用件とかを知りたいんじゃろ?
領域確保に new を使っちゃらめとか、
知らないとはまる部分もあるしー。
0823デフォルトの名無しさん
2009/06/07(日) 17:09:05http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2798.pdf
の23.2.6をしっかり読むこと。
SGIのドキュメントはまとまっていて良かったんだが、最新の仕様と乖離してるのかな。
http://www.sgi.com/tech/stl/Vector.html
>>821
馬鹿か?
0824デフォルトの名無しさん
2009/06/07(日) 17:17:18トンクス
0825デフォルトの名無しさん
2009/06/07(日) 17:21:58ちょwww
0826デフォルトの名無しさん
2009/06/07(日) 19:02:35>>775-776
このレスで出てきている多重例外「例外ハンドラで例外が出ること」についてですが、
try
{foo();}//適当な例外を投げる関数
catch(const std::exception& ex)
{throw 42;}//ここが多重例外
ってことですよね?
では
try
{foo();}//適当な例外を投げる関数
catch(const std::exception& ex)
{throw ex;}//ここは?
この様に例外を再送する場合も多重例外となり未定義の動作ですか?
また、再送する場合{throw;}と書いても未定義になりますか?
0827デフォルトの名無しさん
2009/06/07(日) 19:33:06>770や>776は何か勘違いしているような・・・。
例外ハンドラ(catch節)で例外を投げるのは正当。
多重例外というのはもっと異常な事態で、
例外によるスタックの巻戻し中にデストラクタがさらに例外を投げたとか、
値渡しのcatchへ例外をコピー中にコピーコンストラクタが例外を投げたとかのことを言い、
そういう時でも未定義ではなく、terminate()が呼ばれるんじゃなかったっけ?
0828==775==826
2009/06/07(日) 20:20:29>>827
>例外によるスタックの巻戻し中にデストラクタがさらに例外を投げた
は、
私(>>775)の言う
>アクティブな例外が2つ以上同時に発生すること
ってヤツですよね。
この場合は未定義だとEffective C++で紹介されています。
しかし
デストラクタからの例外送出::実装技術
ttp://cppemb.blog17.fc2.com/blog-entry-31.html
ここによると
>デストラクタから例外を送出するクラスAのオブジェクトを自動記憶域で宣言し、
>その生存期間内で他の例外が発生した場合、A::~A()が呼び出されて、
>その中でまた例外が送出されます。これは二重例外と呼ばれ、
>問答無用でstd::teminateが呼び出されます。
>次に、デストラクタから例外を送出するかもしれないオブジェクトを
>静的記憶域期間で宣言した場合を考えてみてください。
>静的記憶域のオブジェクトを監視ブロック(try〜catchの制御文)で囲む構文を
>記述することはできません。すなわち、こちらはデストラクタから例外が発生した
>時点で(std::terminateの呼び出しではなく)未定義の動作になります。
と書いてありますが、果たして何がどうなんでしょうね。
0829デフォルトの名無しさん
2009/06/07(日) 21:16:02受け取った例外を破棄して別の例外を送出するしかなくて、
結局、伝播する例外は1つだけになるので問題ない。
それ以外で例外伝播中に他の例外が発生すると、
2つの例外を伝播させなければならなくなるけど、
それはできないことになってて、かわりにstd::terminate()が呼ばれる。
0830828
2009/06/07(日) 22:14:01・・・としますと
Effective C++の未定義だという記述の方が誤りで、
デストラクタからの例外送出::実装技術
ttp://cppemb.blog17.fc2.com/blog-entry-31.html
の方が正しいと言うことでしょうか?
0831デフォルトの名無しさん
2009/06/08(月) 03:03:480832デフォルトの名無しさん
2009/06/08(月) 05:20:46意味のある(まともな)動作をさせるのが困難というだけ
0833828
2009/06/08(月) 06:59:07Effective C++ 原著第3版
p39末行
〜p40頭の数行
にかけて、はっきりと未定義と書かれています。
>>832
それもEffective C++で上と同じ節に書いてあります。
0834デフォルトの名無しさん
2009/06/08(月) 08:03:12静的記憶域期間を持つオブジェクトがデストラクタで例外送出したらterminateじゃなかったっけ
と思ったら「staticでnon-local」はterminateらしい
「staticでlocal」は記述が見当たらねぇ…
0835828
2009/06/08(月) 16:14:44複雑な例外処理の仕様は、正確には実装されていないと聞いたことがあります。
結局は多重例外になるという状況を作らないように気をつけていくしかないのでしょうかね。
0836デフォルトの名無しさん
2009/06/08(月) 21:14:03そこは仕様書を持ち出すべきだろ。
0838デフォルトの名無しさん
2009/06/08(月) 21:22:440839デフォルトの名無しさん
2009/06/08(月) 21:26:270840デフォルトの名無しさん
2009/06/08(月) 21:55:50興味があるならタダで見られる、日本語で。
http://www.jisc.go.jpから規格番号X3014。
0842デフォルトの名無しさん
2009/06/08(月) 23:40:41ttp://www.kuzbass.ru/docs/isocpp/
15.5.1に
>when the exception handling mechanism,
>after completing evaluation of the expression to be thrown but before the exception is caught,
>calls a user function that exits via an uncaught exception,
>...
>In such cases, void terminate(); is called.
とあるから、terminate()が呼ばれるのは間違いないと思うのだが、
Effective C++には確かに未定義っぽいことが書いてあるし…
英語版でもそうなのかなあ
0843デフォルトの名無しさん
2009/06/09(火) 00:25:07いえ、ごめんなさい。
0844デフォルトの名無しさん
2009/06/09(火) 20:20:17クラステンプレートは型名を指定しないと実体化できないところに不便さを感じます(boost::rangeとか特に)。
何かいい方法はないですかね?
0845デフォルトの名無しさん
2009/06/09(火) 20:26:590846デフォルトの名無しさん
2009/06/09(火) 20:27:220847デフォルトの名無しさん
2009/06/09(火) 21:35:16TMPか。
0848デフォルトの名無しさん
2009/06/09(火) 21:40:37std::make_pairやboost::make_iterator_rangeのように関数テンプレートでラップすればいい。
0849デフォルトの名無しさん
2009/06/09(火) 21:41:43関数テンプレートもインスタンスで指定しているわけじゃないぜ。単に引数の型を推論しているだけ。
#動的な型は対応できない
どうしてもというなら関数テンプレートでラッパー作ればよろし。
0850デフォルトの名無しさん
2009/06/09(火) 22:05:43型指定するのが手間に思えます。型推論してくれないかなと。
>>846
関数の引数をテンプレートに変更してもそのまま使えるのに、クラスのメンバ変数をテンプレートにすると使う側に手間が増えるのが不便に感じます。
>>848
makeXXXの戻り値を受け取るところで結局型指定が必要になってしまいます。
>>849
書き方が悪かったです。
template<class T>
void F(T t);
template<class T>
class C {
T t_;
public:
C(T t):t_(t){}
};
F(hoge);// hogeを簡単に渡せる
C<Hoge> c(hoge);// 型を指定しないと渡せない
この違いを埋めることってできないですか?
rangeを渡す時、後者はめんどくさく感じて仕方ないです。
0851デフォルトの名無しさん
2009/06/09(火) 22:13:14> F(hoge);// hogeを簡単に渡せる
> C<Hoge> c(hoge);// 型を指定しないと渡せない
どう書ければうれしいの?
0852デフォルトの名無しさん
2009/06/09(火) 22:31:30Hogeを書かなくてよくなればうれしいです。
言語の仕様上、Cを非テンプレートクラスにするしかないですかね。
boost::any使っても値を取り出すことができないし、うーん・・・。
0853デフォルトの名無しさん
2009/06/09(火) 22:49:02template<T>class A:B{public:T t_;A(T t);B&fn();};
class C{A&a;public:template<T>C(T t):a(C<T>(t)){};B&fn(){return a.fn();}};
実現しようと思えば物凄く面倒。
0854デフォルトの名無しさん
2009/06/09(火) 22:53:56つまりこういうこと?
C<> c(hoge);
0855デフォルトの名無しさん
2009/06/09(火) 23:04:50F(hoge)のhogeはどのみち静的な型になってるだろ。
C<Hoge>とするのに比べてそんなに汎用性が高くなっているわけじゃないよ。
型を推論してくれるから面倒なことは少ないけど。まあ、素直にC++0xのauto待ちでいいんじゃね?
0856デフォルトの名無しさん
2009/06/09(火) 23:40:44頭がクラクラしてきます。
>>854
そのコードが許されれば大満足です。
>>855
単純に入力の手間の問題ですね。
boost::range使っていて、コードを書いてる時に型を意識しないといけないのはつまらないなーと思いました。
0857デフォルトの名無しさん
2009/06/09(火) 23:54:20Hoge * f(...)
Hoge & f(...)
ってどっちがお得なのでしょうか?
0858デフォルトの名無しさん
2009/06/10(水) 00:00:240859デフォルトの名無しさん
2009/06/10(水) 00:02:270860デフォルトの名無しさん
2009/06/10(水) 01:17:43?
じゃあ1無量大数回なら?
0861デフォルトの名無しさん
2009/06/10(水) 01:24:23マイクロ秒で競ってどうするんだよ…
0862デフォルトの名無しさん
2009/06/10(水) 02:06:29参照なんてのは結局ただのポインタだからね
0863デフォルトの名無しさん
2009/06/10(水) 02:11:09ホンマかいな
0864デフォルトの名無しさん
2009/06/10(水) 02:12:050865デフォルトの名無しさん
2009/06/10(水) 05:24:40絶対じゃないだろうが、その可能性はあるでしょうな。
参照はどう実装しても良いわけで、
別に参照はポインタを用いて実装されているという保証はない。
だが普通ポインタを用いて実装するので、。
0866デフォルトの名無しさん
2009/06/10(水) 18:13:43connectを実行し、接続確認にsendとrecv
を行っているのですが、recvでソケットエラー
が発生し、GetLasterrorでエラーコード
を取得すると「既に使われている(183)」でした。
何故こんなエラーになるのか分からず
困っています。どなたか教えて下さい。
0867デフォルトの名無しさん
2009/06/10(水) 19:08:030868デフォルトの名無しさん
2009/06/10(水) 19:09:460869866
2009/06/10(水) 19:33:58送信先:Windows2003Server
送信元:WindowsXP
開発:VC2005
recv()の戻り値が-1
WSAGetLastErrorでエラーコードを取得したら
183だった。
ということですm(_ _)m
>>868
すまん、WSAGetLastError使ってた。
0870デフォルトの名無しさん
2009/06/10(水) 20:26:54recvのすぐ後でミューテックスをロック/アンロックなどを
しているんではないですか?
0871デフォルトの名無しさん
2009/06/10(水) 23:06:23protected:
struct foo_t{
struct bar_t{
}foo;
};
0872デフォルトの名無しさん
2009/06/10(水) 23:10:14class MyClass {
protected:
enum {NUM = 5};
struct foo_t{
struct bar_t{
}bar[NUM];
}foo;
};
VC6で上記コードをコンパイルすると、NUMにアクセスできないというエラーが出ます。
NUMをpublicで定義すると大丈夫です。
構造体の入れ子になった場合はpublicでないとアクセスできないのでしょうか?
class MyClass {
protected:
enum {NUM = 5};
int foo[NUM];
};
ちなみにこちらは問題ありませんでした。
0873デフォルトの名無しさん
2009/06/10(水) 23:13:49foo_tに適切なコンストラクタを用意すれば良い
0874デフォルトの名無しさん
2009/06/10(水) 23:20:090875デフォルトの名無しさん
2009/06/10(水) 23:20:18fooはPOD型であってほしいので、コンストラクタを用意するのは望ましくないです。
後出しですみません。
bar_tを外で宣言するというのはどういうことでしょうか?
0876デフォルトの名無しさん
2009/06/10(水) 23:21:33VC6なのでenumハックを使っています。
0877デフォルトの名無しさん
2009/06/10(水) 23:39:370878デフォルトの名無しさん
2009/06/10(水) 23:40:35VC6はもうVC6言語だと思った方がいいくらい、標準と違う。
そんなクソ環境、捨ててしまえ。
0879デフォルトの名無しさん
2009/06/10(水) 23:48:190880デフォルトの名無しさん
2009/06/10(水) 23:52:01VC6はリソースの編集専用にすればよろし
0881デフォルトの名無しさん
2009/06/10(水) 23:52:070882デフォルトの名無しさん
2009/06/10(水) 23:54:530883デフォルトの名無しさん
2009/06/10(水) 23:59:410884デフォルトの名無しさん
2009/06/11(木) 00:06:360885デフォルトの名無しさん
2009/06/11(木) 00:11:06int main{
// hpはノードのポインタ型
//--上・省略--
hp = hp->next;
//--下・省略--
}
っていう風にやったら普通にうまくいくんだけど、
これを関数かしてやって
void gotoNextNode(Node* pnode){
pnode = pnode->next;
}
int main{
// hpはノードのポインタ型
//--上・省略--
gotoNextNode(hp);
//--下・省略--
}
ってやったら「pnode = pnode->next;」の部分が効かないみたいなんだけどなんでだろorz?
0886デフォルトの名無しさん
2009/06/11(木) 00:14:280887デフォルトの名無しさん
2009/06/11(木) 00:15:480888885
2009/06/11(木) 00:18:06typedef struct _Node{
int num;
struct _Node *next;
struct _Node *back;
}Node;
ポインタ渡してるからいけるんじゃね?・・・って思ったんだけどさ
0889デフォルトの名無しさん
2009/06/11(木) 00:19:12じゃなくて?
0890885
2009/06/11(木) 00:20:060891デフォルトの名無しさん
2009/06/11(木) 00:20:530892デフォルトの名無しさん
2009/06/11(木) 00:22:51gotoNextNode(Node*& pnode)
0893885
2009/06/11(木) 00:27:08*&なんて使い方初めて知ったわ
0894デフォルトの名無しさん
2009/06/11(木) 00:29:27*pnode = (*pnode)->next;
}
型 & hoge
だから別に特殊なことやってる訳じゃないよ
0895デフォルトの名無しさん
2009/06/11(木) 01:40:37ポインタが仮想変数になったときにポインタじゃなくて値として扱われてしまうとか?
0896デフォルトの名無しさん
2009/06/11(木) 01:46:44myFunc(i);
void myFunc(int a)
{
a = 1;
}
ってやって、iの値が変わらないんだけど!って言ってるのと同じであることはわかった上で、
不満だと言っている?
0897デフォルトの名無しさん
2009/06/11(木) 01:47:44引数に対する変更が呼び出し元に反映されるためには、
変更したいものを指すポインタを受け取るとか、変更したいものを参照で受け取るとか
しないといけない。
>>855の hp = hp->next; というコードは、ポインタの値を変更してるよね。
「変更したいもの」がポインタなんだ。
だから、ポインタのポインタとか、ポインタの参照を受け取らなければならない。
0899デフォルトの名無しさん
2009/06/11(木) 01:52:06{
a = 1;
}
の例はすぐに関数抜けた時点でaが開放されて値が消えるってのは分かるけど・・・
その例と同じってのは分かってないわ・・・スマン
0900デフォルトの名無しさん
2009/06/11(木) 01:59:13typedef Node* PNode;
PNode hp;
void gotoNextNode(PNode pnode){
pnode = pnode->next;
}
int main{
// 略
gotoNextNode(hp);
// 略
}
hpは変更されない。これはほぼ>>896と同じ。
受け取ったPNode値への変更が呼び出し元に反映されるには、PNode* や PNode& で受け取らないと。
0901デフォルトの名無しさん
2009/06/11(木) 01:59:44int型を指すことができるポインタ(int*)、もしくは参照(int&)で受けなければならない
というのはわかっているってことね?
だったら、こう置き換えてみたら?
Node*型の変数である、hpの値を変更したいのであれば
Node*型を指すことができるポインタ(Node**)、もしくは参照(Node*&)で受けなければならない
0902デフォルトの名無しさん
2009/06/11(木) 02:06:48単にポインタで受け取る時は値を変更する時にも使うから、
それと同じ状態になって関数を抜けるから無効になってるということで
ポインタを変更したいときはPNode* や PNode& で受け取らないといけないって感じでおk?
0903デフォルトの名無しさん
2009/06/11(木) 02:17:440904デフォルトの名無しさん
2009/06/11(木) 02:24:21まあ、そういう理解でおk。
typedefなんか持ち出して余計混乱させたらどうしようかと思ったが、たぶんちゃんと通じてると思う。
0905デフォルトの名無しさん
2009/06/11(木) 16:09:30C++ならイテレータクラスを作ってポインタのやり取りそのものを回避(中は結局ポインタだけど)
ダブルポインタを使う時点でもしかしたら設計に問題が^^
0906デフォルトの名無しさん
2009/06/11(木) 20:45:54ディープコピー方式のoperator=を持つshared_ptrがあれば便利だと思うんですが、どうもなさそうです。
0907デフォルトの名無しさん
2009/06/11(木) 20:54:12shared_ptrは浅いコピーだからこそpimplイディオムは生きるのだよ。
でもまあディープコピーにしたいこともあるのかもね。
ディープコピーにしたいってどんな状況?
class MyClass;
class MyClass_impl;
だとして、MyClassのコピーコンストラクタを適切に定義すれば
boost::shared_ptrで十分じゃないかと思うよ。
0908デフォルトの名無しさん
2009/06/11(木) 21:07:50pimplイディオムを使わないでMyClassを実装した場合と同じ挙動にしたいです。
コピーコンストラクタやoperator=を書かない事(コンパイラまかせ)はよくあるので、
そういった場合にpimplで実装した事によって挙動が変わるのは嫌だなと思います。
0909デフォルトの名無しさん
2009/06/11(木) 21:30:54何のためにそんなことするのかは知らないけど、同じようなクラス2つ書いてコード重複するくらいなら
pimplなんか使わない方がいいよ
0910デフォルトの名無しさん
2009/06/11(木) 22:01:04pimpl版と非pimpl版の2つがあるわけではないです。
pimplイディオムで実装することによって、注意しなければいけない事を増やしたくないという意味です。
MyClassのコピーコンストラクタやoperator=を書き忘れて(pimplじゃなければ書かなくてもOKだから忘れやすい)
バグが発生したりしないために自動でディープコピーになってくれた方が便利だと思います。
0911デフォルトの名無しさん
2009/06/11(木) 22:14:55boost::any使いなされ。あれは値のセマンティクスになってるよ。
>774みたいに突っ込むコンテナによってセマンティクスを変える手もあるけど。
0912907
2009/06/11(木) 22:17:10あー、言いたいこと分かった。
要は君自身、今のところは問題無くpimplイディオムを使えてはいるけど、
いつかうっかりしそうだからディープコピーなshared_ptrがあったら
いいなぁ
ってことだよね?
でも
>自動でディープコピーになってくれた方が便利だと思います。
いやいやそりゃ困るよ。
浅いコピーだからこそ生きるpimplイディオムの状況ってかなりあるのだよ。
例えばoperator=で浅いコピーにすることにより超高速なコピーが出来るわけ。
0913デフォルトの名無しさん
2009/06/11(木) 22:29:39deep copyは明示的にclone()を使うっていう決まりを作るとか
0914デフォルトの名無しさん
2009/06/11(木) 22:38:07shallow copyは明示的にdangerous_clone()を使う決まりの方がいいです
0915デフォルトの名無しさん
2009/06/11(木) 22:57:35pimplにboost::anyを使うというのは初めて知りました。
確かに便利ですね。
弱点をあげるなら、速度が若干遅くなりそうなところでしょうか。
>>912,913
>>914の方が私は直感的にわかりやすく感じます。
ありがとうございました。
0916デフォルトの名無しさん
2009/06/11(木) 23:07:55間違えてデータ壊れるか、間違えて処理が遅いか、なら後者の方がいい
0917デフォルトの名無しさん
2009/06/12(金) 00:48:51組み込みでも実際使われている。
それをデフォでdeep copyなんかにされたらたまったものじゃない。
0918デフォルトの名無しさん
2009/06/12(金) 01:09:30deepで困るケースは少ないんだからデフォはdeepでOK。
つーかshallow copyによる高速化とpimpl関係なくない?たまたま一石二鳥になっているだけで。
0919デフォルトの名無しさん
2009/06/12(金) 01:19:44ほかのメンバ関数と同じ調子で、コピーコンストラクタとoperator =を定義するだけのはず。
0920デフォルトの名無しさん
2009/06/12(金) 01:25:56Pimplはdeep copyをデフォにして欲しいと言ってんの
もしかしてアフォ?
0921デフォルトの名無しさん
2009/06/12(金) 02:22:00auto_ptrやscoped_ptrにすれば、コピーコンストラクタと代入演算子を定義し忘れることはない
(定義し忘れるとコピーがコンパイルエラー)。
0922デフォルトの名無しさん
2009/06/12(金) 03:05:27auto_ptrもscoped_ptrも不完全型には使えない。
ttp://d.hatena.ne.jp/Cryolite/20060108 (不完全型によるコンパイラファイアウォールとスマートポインタの両立(その1)以降を参照)
空のデストラクタを書くのも手間だし、コピーコンストラクタと代入演算子を書くのも手間。
deep copyにしたくてshared_ptrを使いたいなんて言ってるやつはいない。pimplにぴったりのスマートポインタないっていう話。
0923デフォルトの名無しさん
2009/06/12(金) 04:03:21まあ、気にする人も結構いるのか。
0924デフォルトの名無しさん
2009/06/12(金) 04:13:300925デフォルトの名無しさん
2009/06/12(金) 06:54:12科学技術とか未踏の分野の開拓なら役に立つかもしれんけど邪魔な存在だな
0926デフォルトの名無しさん
2009/06/12(金) 07:35:040927デフォルトの名無しさん
2009/06/12(金) 08:26:460928デフォルトの名無しさん
2009/06/12(金) 08:27:37ポインタ型があったとして
A a, b;
A *pa=&a, *pb=&b;
pa = pb;
こうしたら、aがbの値に上書きされるってこと?
なんだがおかしいね。
*pa = *pb; だよね普通。
0929デフォルトの名無しさん
2009/06/12(金) 09:52:42全部ソースで定義するのでscoped_ptrで問題なし
0930デフォルトの名無しさん
2009/06/12(金) 10:44:4530,000x30,0000x4程度のbool配列と、30,000x30,0000のint配列を使いたいという思いでいっぱいです。
しかし単純に配列を作ってしまうと、やはりout of memoryです。
どうにかして要素数を減らすのが一番だとは思うんですが、
一般的に、このように膨大な要素の配列を扱わざるをえない場合にはどのような方法を用いるのでしょうか?
0931デフォルトの名無しさん
2009/06/12(金) 10:49:51疎なデータならその部分だけを保持する
0932デフォルトの名無しさん
2009/06/12(金) 10:51:08速度が滅茶苦茶遅くていいならファイルをメモリと見なし
operator[]をオーバーロードするとか
0933デフォルトの名無しさん
2009/06/12(金) 11:09:18質問団?w
そのくらいの量なら、64bitOSで普通にnewでもvectorでも持てると思うけど。
まぁ、swapされるのは覚悟する必要があるな。
処で、それ本当に必要なの? 疎行列として扱うとか、boolではなくcharかbitで保持するとかできない?
0934デフォルトの名無しさん
2009/06/12(金) 11:29:57>64bitOSで普通に
さらっと、OSレベルで条件付け加えんなw
アフォか
0935デフォルトの名無しさん
2009/06/12(金) 11:32:542バイト整数を3万掛ける3万なら、32bitOSでも普通にOK。
今時、Windowsでも2GB位積んでるのが当たり前だしね。
0936デフォルトの名無しさん
2009/06/12(金) 11:38:4730,0000?
0937デフォルトの名無しさん
2009/06/12(金) 11:41:110938デフォルトの名無しさん
2009/06/12(金) 11:43:130939デフォルトの名無しさん
2009/06/12(金) 11:58:11>>931-933
0or1のフラグとして使うつもりでboolを使いました。
やろうと思っていることは、「生物学で使うDNA塩基配列のアライメント」で
int 3マンx3マンを隅から数値を埋めていく一方で、
その数値を確認しながら条件に従って、その要素に対応するboolの配列の要素1-3に1or0を入れていく。
ということを行っています。
intの配列array[i][j]については[i+1][j+1]まで処理した時点で破棄できるのでもっと少なくできると思うんですが、
bool配列についてはすべて埋め終わった後に、もう一度フラグの確認をしていくのですべて残しておく必要があります。
ちなみにbool型が一番サイズが小さいと勝手に思い込んでいました。
0940デフォルトの名無しさん
2009/06/12(金) 12:05:43パソコンでやるなら>>933とか.
でも
> int 3マンx3マンを隅から数値を埋めていく一方で、
> その数値を確認しながら条件に従って、その要素に対応するboolの配列の要素1-3に1or0を入れていく。
これって注意深く行うとすると,今状態[3万×3万]と次状態[3万×3万]が必要になるんじゃないかい?
軽くめんどくさい
0941デフォルトの名無しさん
2009/06/12(金) 12:26:39ストレージに対して、逐次読み出し、逐次書き込みで
いいんじゃねーの。
0942デフォルトの名無しさん
2009/06/12(金) 12:31:2930kx30k 900M
1bit データなら 900M/8 = 112MB
塩基配列なら4種2bit 900M/4 = 225MB
メモリに載せるのは可能っぽい
0943デフォルトの名無しさん
2009/06/12(金) 12:35:52768MBでも仮想記憶があるから屑だなんて言っちゃイヤ!
と言うのはさておいて。
>intの配列array[i][j]については[i+1][j+1]まで処理した時点で破棄できるのでもっと少なくできると思うんですが、
これは、相互参照があるってことなのかな?
だとしても、1行3万点として前後1行ずつで併せて3行がメモリにあれば事が足りるよね。
後は、ディスクをぶん回すことになるけどなんとかなりそうだ。
# 最初は1000x1000くらいに絞って作らないとデバッグの段階で死ねるね。
0944デフォルトの名無しさん
2009/06/12(金) 12:51:270945デフォルトの名無しさん
2009/06/12(金) 15:17:36768MB しかないと CPU も辛そうじゃね?
0946デフォルトの名無しさん
2009/06/12(金) 15:34:020947デフォルトの名無しさん
2009/06/12(金) 17:27:13bool → bit につめて、
array → 3行 にしたら、
なんとかなりそうです!!
0948デフォルトの名無しさん
2009/06/12(金) 22:28:110949デフォルトの名無しさん
2009/06/12(金) 22:35:29MyClass hoge;
for (…) {
hoge = func();
…
}
B案
for (…) {
MyClass hoge = func();
…
}
C案
{
MyClass hoge;
for (…) {
hoge = func();
…
}
}
あなたはどれ?
0950デフォルトの名無しさん
2009/06/12(金) 22:45:17時々Bと同じスコープで宣言位置がforの中に入れてるときがある
ただしjava
0951デフォルトの名無しさん
2009/06/12(金) 23:17:12Cはわからなくもない(スコープ制限つけたかっただけだよね?)
Bってコスト高くつかない?そうでもないのかな?
0952デフォルトの名無しさん
2009/06/12(金) 23:38:28MyClassが小さいならB
0953デフォルトの名無しさん
2009/06/12(金) 23:52:18ただこの例くらいなら気の利いた最適化してくれてコスト気にする必要はなさそうな気もするな。
0954デフォルトの名無しさん
2009/06/13(土) 00:14:020955デフォルトの名無しさん
2009/06/13(土) 00:18:57B一択。jk
0956デフォルトの名無しさん
2009/06/13(土) 00:20:040957デフォルトの名無しさん
2009/06/13(土) 00:30:16ブラジルに電話をかける処理が含まれているんだ。
0958デフォルトの名無しさん
2009/06/13(土) 00:32:300959デフォルトの名無しさん
2009/06/13(土) 00:40:530960デフォルトの名無しさん
2009/06/13(土) 06:09:150961デフォルトの名無しさん
2009/06/13(土) 06:51:57MyClass&hoge;
unsigned begin,end;
operator X(){for (…) {hoge = func();…};return X;}
}OBJ={hoge,BEGIN,END};
return OBJ;
0962デフォルトの名無しさん
2009/06/13(土) 08:00:42言ってることおかしいだろ
>ループ中にfunc()の戻り値が変化しないならA
そんな条件なら誰だってA案じゃなくて
D案(新案)
MyClass hoge;= func()
for (…) {
…
}
にするわ。
func()の戻り値が変化することはもう皆空気を読んで分かっていることだ。
0963デフォルトの名無しさん
2009/06/13(土) 08:07:270965デフォルトの名無しさん
2009/06/13(土) 10:15:500966デフォルトの名無しさん
2009/06/13(土) 10:57:44A 案 : 自主的にこう書く事はない。
B 案 : 基本的にこの方法にする。
C 案 : ループ後に hoge が必要な場合に限定。
A 案のコードは、状況に応じて B、C に直す事もある。
hoge の生成コストが予測不能だから A 案が安全、という主張もあるだろうが、
それは「早すぎる最適化」なので、コストが問題になるまでは、参照範囲を狭
める方向で実装したいな。
0967デフォルトの名無しさん
2009/06/13(土) 11:54:04自分の間違いを素直に認められる奴が一番賢いんだ。
だからお前も自分の間違いを認めて俺と結婚しろ。
0970デフォルトの名無しさん
2009/06/13(土) 17:59:26標準出力演算子とか?
0971デフォルトの名無しさん
2009/06/13(土) 18:01:100972デフォルトの名無しさん
2009/06/13(土) 18:39:28double angle brackets
0974デフォルトの名無しさん
2009/06/13(土) 21:00:56べき、ということで自分のコードを修正しているのですが、
どの程度避けるべきか、避けるとしたら既存のコードをどう変更すべきか悩んでいます。
具体的な話だと、例えば文字列定数は、使っている文字列クラス(string等)の定数
オブジェクトで定義しておきたかったりします。
この場合にグローバルオブジェクトを避けるとしたら、どうしますかね?
例えば「定数文字列はCの文字リテラルで宣言しておいて、使うときに文字列オブジェクト
を生成.」なんてのがありでしょうが、安直にやると毎回オブジェクトを生成することになり
ますよね。かといって一旦生成したオブジェクトは破棄せず再利用、なんて考える
と、コードが煩雑になるような...
似たようなことは文字列以外のオブジェクトでもありまして... いやはや。
0975デフォルトの名無しさん
2009/06/13(土) 21:04:04これじゃダメなん?
0976975
2009/06/13(土) 21:05:42でも同じ。
0977デフォルトの名無しさん
2009/06/13(土) 21:58:02不変なデータとか、本当にプログラムの広い範囲から参照が必要なものをグローバルにするのは問題ない
0978デフォルトの名無しさん
2009/06/13(土) 22:10:290979デフォルトの名無しさん
2009/06/13(土) 22:16:56std::vector<const double*>* に変換するにはどうしたらいい?
全体をコピーする方法以外でたのむ。
0980デフォルトの名無しさん
2009/06/13(土) 22:20:14std::vector<double*>*
と
std::vector<const double*>*
には継承関係とかが全然ないけど、全コピ以外でやる方法なんて存在しうるのだろうか?
0981デフォルトの名無しさん
2009/06/13(土) 22:26:400982デフォルトの名無しさん
2009/06/13(土) 22:28:15hoge->getval()->getval()->getval()->setupdate();
(getvalでメンバ変数として定義されたインスタンスのポインタを呼び出します)
とかいうアホな実装を直すいい方法ないですか?
0983デフォルトの名無しさん
2009/06/13(土) 22:31:37動きそう
0984デフォルトの名無しさん
2009/06/13(土) 23:14:08別にいいじゃん。
ツリーとかそうなるっしょ。
0985デフォルトの名無しさん
2009/06/13(土) 23:17:180986デフォルトの名無しさん
2009/06/14(日) 04:28:211回しか呼ばないならそのままで構わないと思う。
何度も呼び出すようなら
void Hoge::setupdate() { getval()->getval()->getval()->setupdate(); }
を定義して、
hoge->setupdate();
とするのは?
0987デフォルトの名無しさん
2009/06/14(日) 08:31:29これって速度的にどうなんだろ?空の関数でも
呼び出し遅くないのかな?
0988デフォルトの名無しさん
2009/06/14(日) 08:46:33しかしそれ以前に、こんなことをしなければいけない設計に問題がある。
0989デフォルトの名無しさん
2009/06/14(日) 09:21:33なんで?
0990デフォルトの名無しさん
2009/06/14(日) 09:27:06>>988の通りだが、ループ中で読んでなければ無視できるレベル。
0991デフォルトの名無しさん
2009/06/14(日) 09:30:09継承
0992デフォルトの名無しさん
2009/06/14(日) 09:39:30>なんで?
なんでって、俺ならそんなこと無くてもいい設計が普通に簡単に書けるから
0993デフォルトの名無しさん
2009/06/14(日) 09:48:52どんなの?どんなの?
書いてみて?書いてみて?
書けこらぁ
0994デフォルトの名無しさん
2009/06/14(日) 09:53:56直接プログラム打ち込んでるだけじゃないのか?
0995デフォルトの名無しさん
2009/06/14(日) 10:03:45そういうのは書いて叩き台作ってから話してね!ゆっくりしてないよ!
0996デフォルトの名無しさん
2009/06/14(日) 10:06:260997デフォルトの名無しさん
2009/06/14(日) 10:11:390998デフォルトの名無しさん
2009/06/14(日) 10:12:01その前に、設計するための目的の仕様をキッチリ出してもらおうか。
その仕様書がしっかりしてて、暇があったら設計のたたき台を出そう。
今から出かけるから、それまでに出すんだぞ。
0999デフォルトの名無しさん
2009/06/14(日) 10:12:281000デフォルトの名無しさん
2009/06/14(日) 10:13:13# 俺ならそんなこと無くてもいい設計が普通に簡単に書けるから
はあ?できないならできないって言えよ
ところでスレオワタ
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。