C++相談室 part80
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2010/04/18(日) 20:51:28ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part79
http://pc12.2ch.net/test/read.cgi/tech/1268846738/
0002デフォルトの名無しさん
2010/04/18(日) 20:51:46[C++ FAQ]
http://www.parashift.com/c++-faq-lite/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
http://www.cppreference.com/ (英語)
http://www.cppreference.com/wiki/jp/ (↑の日本語訳だけどまだ未完)
[禿 Stroustrup]
http://www.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?id=15868
ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
0003デフォルトの名無しさん
2010/04/18(日) 20:51:56[Boost]
Boost http://www.boost.org/
(日本語) http://www.kmonos.net/alang/boost/
(日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
SGI-STL http://www.sgi.com/tech/stl/
STLport http://stlport.sourceforge.net/
GNU libstdc++ http://gcc.gnu.org/libstdc++/
Apache C++ Standard Library (STDCXX) http://stdcxx.apache.org/
STLFilt http://www.bdsoft.com/tools/stlfilt.html
(日本語) http://episteme.wankuma.com/stlprog/ (※1999年発行注意)
[Loki]
http://sourceforge.net/projects/loki-lib/
LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
0004デフォルトの名無しさん
2010/04/18(日) 20:52:03amazon.com C,C++関連書籍
http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
The C++ Programming Language
http://www.amazon.com/exec/obidos/ASIN/0201700735/
http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
http://www.amazon.com/exec/obidos/ASIN/0201824701/
http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
http://www.amazon.com/exec/obidos/ASIN/0201379260/
http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
http://www.amazon.com/exec/obidos/ASIN/0201924889/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
http://www.amazon.com/exec/obidos/ASIN/020163371X/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/0201615622/
http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/020170434X/
Exceptional C++ Style
http://www.amazon.com/exec/obidos/ASIN/0201760428/
0005デフォルトの名無しさん
2010/04/18(日) 20:52:10Effective 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/
■長いソースを貼るときはここへ。■
http://codepad.org/
0006デフォルトの名無しさん
2010/04/18(日) 20:52:16環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0007デフォルトの名無しさん
2010/04/18(日) 20:52:22ミ ヽ○ノ
 ̄ ̄7 ヘ/
/ ノ
|
/
|
/
テンプレは以上です。
0008デフォルトの名無しさん
2010/04/18(日) 21:02:15http://www.gotw.ca/publications/xc++-errata.htm
http://www.pej-hed.jp/tools/file/download.cgi/1121/Exceptional%20C++%20Errata.htm
0009デフォルトの名無しさん
2010/04/18(日) 21:04:24ダイナミックリンクなんてしないでね
0010デフォルトの名無しさん
2010/04/18(日) 22:26:14について
ttp://codepad.org/
もいいけど
Ideone.com | Online IDE & Debugging Tool
ttp://ideone.com/
これもなかなか良いよ。
ただ俺はcodepadの方が慣れているしそっち使うけど。
0011デフォルトの名無しさん
2010/04/18(日) 22:42:09それをprivate継承すると実行ファイルのサイズとかコンパイルコストが減るようなんですが
実際そこまでこだわるほどの価値ってありますか?
0012デフォルトの名無しさん
2010/04/18(日) 23:08:180013デフォルトの名無しさん
2010/04/18(日) 23:10:24必要になってからやる。
構造の簡素化とか汎用化、一貫性を優先した方が良い。といってもこっちも必要にならなきゃやらんかも。
0014デフォルトの名無しさん
2010/04/19(月) 06:40:58{
std::string name;
public:
const std::string& GetName() const{return name;}
};
ってクラスがあり、そのクラスのインスタンスへのポインタを
抱いてるvectorが下記のようにあります。
std::vector<Hoge*> vecString;
このvecStringの中にあるHogeのnameの長さが5以上の数を
C++らしくcount_ifで数えるにはどうなりますか?
0015デフォルトの名無しさん
2010/04/19(月) 07:10:360016デフォルトの名無しさん
2010/04/19(月) 10:01:36using boost::bind;
std::count_if(vecString.begin(), vecString.end(),
bind(std::greater_equal<std::string::size_type>(), bind(&std::string::size, bind(&Hoge::GetName, _1)), 5))
0017デフォルトの名無しさん
2010/04/19(月) 10:03:28それだとぬるぽの可能性が
0018デフォルトの名無しさん
2010/04/19(月) 10:04:260019デフォルトの名無しさん
2010/04/19(月) 21:47:270020デフォルトの名無しさん
2010/04/19(月) 22:45:31[](Hoge* h){return h->GetName().size()>=5;})
あまり楽になった気がしないのは何故だろう
0021デフォルトの名無しさん
2010/04/20(火) 01:17:300022デフォルトの名無しさん
2010/04/20(火) 17:48:03いけない度合い」が他の言語より相当強いよね。
標準C++の仕様ってのがつまりは"広義のコンパイラ"の動作なわけだけど。
前スレのfriend議論もそうだけど、なかなか強烈な議論だった。
0023デフォルトの名無しさん
2010/04/20(火) 19:11:50禿の思惑とは反対方向にC++はどんどん肥大化してしまったからな
PL/Iの二の舞になっとる
0024デフォルトの名無しさん
2010/04/20(火) 22:02:33行きがけ順、帰りがけ順、などを切り替えて巡回する方法って用意されてますか?
0025デフォルトの名無しさん
2010/04/20(火) 22:12:21a-> ## b
って記述したいんですけどプリプロセッサエラー
出ちゃうなんとかして困った
0026デフォルトの名無しさん
2010/04/20(火) 22:16:190027デフォルトの名無しさん
2010/04/20(火) 22:16:320028デフォルトの名無しさん
2010/04/20(火) 22:18:58要素の並び順が規定されてるだけ(ISO の 23.1.2)だから、二分木を想定した方法はないような
0029デフォルトの名無しさん
2010/04/20(火) 22:19:19C++ってこんなの作れないのかな?
スクリプト言語なら出きるのになんでC++はできないの?
なんでなの?
0030デフォルトの名無しさん
2010/04/20(火) 22:21:530031デフォルトの名無しさん
2010/04/20(火) 22:23:20特殊な技法を駆使すればできるよ
0032デフォルトの名無しさん
2010/04/20(火) 22:33:13C++ができないんじゃなくてお前の頭じゃできないだけ。
0033デフォルトの名無しさん
2010/04/20(火) 22:51:48つかさ〜
素直にforでまわして、Hoge*へのポインタにlengthじゃダメなの?
>>16の回答があってるかどうかはわからんが、それを書くのに2,3分でかけるならいいけど
20分も30分も悩んでたら、どんだけ工数あっても足らないし、しかもぱっと見わかりづらい・・・
0034デフォルトの名無しさん
2010/04/20(火) 23:07:01boost::bind にかけられた叡智と努力を無視してるから
0035デフォルトの名無しさん
2010/04/20(火) 23:16:10boost::bind を理解してれば2、3分も掛からない
掛かるのはタイプにかかる時間だけ
std::count_if(v.begin(), v.end(), bind(&std::string::size, bind(&Hoge::GetName, _1)) >= 5);
確かに見づらいね
でも、 for 文だと余分なローカル変数を導入するし、for 文の方が間違いやすいと思う
0036デフォルトの名無しさん
2010/04/20(火) 23:20:48実行コストは…これも大差ねーか?
0037デフォルトの名無しさん
2010/04/20(火) 23:45:56TMPを見てみろあの変態共は…(ry
0038デフォルトの名無しさん
2010/04/21(水) 00:13:55あの手のコードをタイプ時間のみで書ける、あなたのようは人は多くいはいないでしょ?
0039デフォルトの名無しさん
2010/04/21(水) 01:46:28#define test(a, b) a-> b = 100
で何がいけないのか
話はそこからだ
0040デフォルトの名無しさん
2010/04/21(水) 02:37:44Token-Pasting Operator (##)
the tokens preceding and following it are concatenated.
White space preceding or following the operator is optional.
MSDNからの抜粋だが、そのような結果にはならないのでは?
0041デフォルトの名無しさん
2010/04/21(水) 03:00:42##の意味くらいみんな知ってるから下らない茶々入れるな
0042デフォルトの名無しさん
2010/04/21(水) 05:48:30ちょっとなにいってるか分からない
bが*で始まるという表現のひどさはさておいても、それがプリプロセスエラーになると思えるのはどういう考え?
0043デフォルトの名無しさん
2010/04/21(水) 07:03:27トークン連結の結果は、ひとつのトークンを成していなければならない。
"->" と何かを連結してひとつのトークンを成すとすれば、当てはまる結果は "->*" しか
存在せず、したがって b は "*" で始まるほか無い。
この制約を満たさない場合の動作は未定義。コンパイラによってはエラーになったり、
何もメッセージは出なかったりする。
0044デフォルトの名無しさん
2010/04/21(水) 07:12:31ttp://www.nikkeibp.co.jp/article/news/20100204/208938/
今更かもしれないけど俺は驚いた。
0045デフォルトの名無しさん
2010/04/21(水) 07:19:190046デフォルトの名無しさん
2010/04/21(水) 10:48:25std::sort(vec.begin(),vec.end(),std::less<Test>());
の為にoperator <をTestクラスのメンバに書きましたが
「二項演算子 '<' : 型 'const Test' の左オペランドを扱う演算子が見つかりません 」
とのエラーメッセージが出たんで
クラスの外に定義したら問題なく動作しました。
が、なぜクラスのメンバではダメなのでしょうか?
0048デフォルトの名無しさん
2010/04/21(水) 10:55:55constつけ忘れたんじゃね
0049デフォルトの名無しさん
2010/04/21(水) 11:02:29ありがとうございます。
解決しました。
0050デフォルトの名無しさん
2010/04/21(水) 16:22:55eclipseだとIDEから簡単に使えたんだけどそういうサポートはされてますか?
0051デフォルトの名無しさん
2010/04/21(水) 16:28:190052デフォルトの名無しさん
2010/04/21(水) 16:46:09シンボルって言うのは関数とグローバル変数を指すの?
どの範囲を指すのかが良く解らん
0053デフォルトの名無しさん
2010/04/21(水) 17:08:01nmake か msbuild のどっちか。VCのバージョンによるからお好きなほうで。
0054デフォルトの名無しさん
2010/04/21(水) 17:58:18C++についての話をしようぜ。
0055デフォルトの名無しさん
2010/04/21(水) 22:45:27例えばvectorの特定の要素を見つける(条件は少し複雑)場合に
1.for文をbegin〜endまでまわす(なんかかっこ悪い?)
2.find_ifを使う(別途関数つくるのがうざい)
3.boostでラムダとか使う(使い方もう忘れたよ><)
4.VS2010が出るまで寝る
の四択があるのですが一般的またはお勧めとされるのはどれですか?
ちなみに完全趣味利用です。
0056デフォルトの名無しさん
2010/04/21(水) 22:46:480057デフォルトの名無しさん
2010/04/21(水) 22:49:570058デフォルトの名無しさん
2010/04/21(水) 22:53:57それって、普通のC++でも可能なんですか?
MSが開発したヘンテコなC++だけじゃなくて?MC++でしたっけ?
0059デフォルトの名無しさん
2010/04/21(水) 22:54:210060デフォルトの名無しさん
2010/04/21(水) 22:54:520061デフォルトの名無しさん
2010/04/21(水) 22:57:09boostで使うだろ
いちいちboost::mpl::とかタイプしたいのか
0062デフォルトの名無しさん
2010/04/21(水) 22:59:13C++0x
0063デフォルトの名無しさん
2010/04/21(水) 23:00:26それどころかusing使わないとできない大事な技法もあるだろ
using std::swap;
とかまさか意味が分からないなんてヤツはいないよなw
0064デフォルトの名無しさん
2010/04/21(水) 23:01:27C++0xなら可能。
gccの最新やvc10なら実装されてる。
std::find_if( first, last, [](int v) { return ...; } ); みたいな。
0065デフォルトの名無しさん
2010/04/21(水) 23:04:270066デフォルトの名無しさん
2010/04/21(水) 23:18:01いや元の質問がごっちゃになっているから、
>>60わざと使わないと言った(using directiveを意識している?)
>>61反例を挙げた(using directiveについて)
>>63あえて別例を挙げた(using declarationについて)
要するに元の質問者をおちょくっているだけだろう。
006766
2010/04/21(水) 23:19:18using declarationとusing directiveの違い
ttp://cpplover.blogspot.com/2009/06/using-declarationusing-directive.html
これでも読んでください。
0068デフォルトの名無しさん
2010/04/22(木) 00:33:16ごめんなさい、そうしないとできない大事な技法というのが分かりませんでした
006955
2010/04/22(木) 01:09:18と思ったら20日に公開されてたんですね
早速落としてみるか
0070デフォルトの名無しさん
2010/04/22(木) 07:06:52例外安全とかCopy & Swapを知らないの?
なら勉強不足なだけ。
0071デフォルトの名無しさん
2010/04/22(木) 07:12:17usingなんていらねーよカス
0072デフォルトの名無しさん
2010/04/22(木) 07:20:26いらないなら何のためにあるの?
その論でいくとtypedefも不要になりそうだが
0073デフォルトの名無しさん
2010/04/22(木) 07:26:07namespace A {
class N { };
void swap(N& a, N& b) { std::cout << "swap N" << std::endl; }
}
int main() {
using std::swap;
A::N a, b;
int c, d;
swap(a, b); // A::swap が呼ばれる
swap(c, d); // std::swap が呼ばれる(using が必要)
}
名前空間関連のC++の仕様は複雑だよなあ
0074デフォルトの名無しさん
2010/04/22(木) 08:38:270075デフォルトの名無しさん
2010/04/22(木) 08:53:550076デフォルトの名無しさん
2010/04/22(木) 09:00:54結局のところ適切なswapを呼び出してくれるんでしょ
0077デフォルトの名無しさん
2010/04/22(木) 13:07:15いびつになってる
007868
2010/04/22(木) 13:32:57知ってますが、usingを使わなければならないと思ったことがありませんでした。
usingはコードの記述量を減らす為にしか使ったことがありません。
0079デフォルトの名無しさん
2010/04/22(木) 13:55:13swapで出来ない、というかちょっと無駄になるような処理も
効率的に表現出来るお
0080デフォルトの名無しさん
2010/04/22(木) 15:56:152つ目のconstが無いとSTLがうまく動かないのですが。
これはどのような効果があるんでしょうか?
bool operator < (const classdata &x) const { return (n<x.n) ; }
0081デフォルトの名無しさん
2010/04/22(木) 16:00:590082デフォルトの名無しさん
2010/04/22(木) 16:01:30エラーならエラーメッセージを貼るべきだし、メンバ関数ならそう断ろうよ。
で、2番目のconstはメンバ関数が静的である。
つまり、メンバの変更は行なわないことを表明している。
ということは、静的なインスタンスからでも呼べるということ。
逆に言うと、静的でないメンバ関数は静的なインスタンスからは呼べない。
0083デフォルトの名無しさん
2010/04/22(木) 16:17:29このようなクラスがあったとき、x.nもnも変更しないという宣言なんでしょうか?
class classdata {
public:
int n;
bool operator < (const classdata &x) const { return (n<x.n) ; }
};
0084デフォルトの名無しさん
2010/04/22(木) 17:05:320085デフォルトの名無しさん
2010/04/22(木) 17:09:100086デフォルトの名無しさん
2010/04/22(木) 17:11:09一個目のconstはxの参照先が変更不可。
二個目のconstはそのクラスのメンバが変更不可。
従って、nもx.nも変更不可。
0087デフォルトの名無しさん
2010/04/22(木) 17:21:33>>83では2個目のconstに限っていなかった
008870
2010/04/22(木) 18:13:32まず>>67のusing declarationとusing directiveの違いは理解している?
もしご存じなければリンク先を熟読してください、
>>71お前本当にC++でプログラミングしてんのかよ。
無知を曝してる割に一切恥じないとはなかなかのツワモノだな。
言っとくがそうやって煽られてもお前に教える気はないよ。
…………………………
と思ったのだが、ROMってる純真な初学者さんが>>71の言うことを真に受けてしまうと
可哀相なのでヒントだけ書いておく。
上で述べられているstd::swapの特殊化は可能な限りしておくべきだが、クラステンプレートに対しては(部分特殊化となるため)できない。
そこで
using std::swap;
が活躍する事になるのだが、その辺のconsensusについては
かの名著『Effective C++第3版』
にも記載があるので未読or忘れた人は読んでおきましょう。
ちなみにまさにこういった事を知らない>>71のような無知プログラマが万一プロジェクトに
居た場合の対策についても『Effective C++第3版』は言及しているという名著っぷり。
他にもusingは
基底クラスのメンバを可視にするとか
CRTP関連の変態イディオムとか
いろいろ出番あるじゃないか。
0089デフォルトの名無しさん
2010/04/22(木) 18:18:430090デフォルトの名無しさん
2010/04/22(木) 18:30:26そんなに凄まなくていいのにな
009168
2010/04/22(木) 18:44:10はい、その違いについては理解しているつもりです。
そもそも、using directiveしか知らない方は見かけますが、using declarationの存在を認識していて
それらの違いを理解していない方はあまりいないのではないかと思っています。
起こり得がたい状況にも思えます。
閑話休題しますと、例外安全にするためにswapを使う、その際にstd::swapと記述するのでは
だめなのでしょうか?
繰り返しになってしまって申し訳ないのですが、usingを使わなければならない、逆に言えば、
usingを記述しなければ実現できないという状況をまだ知らないのです。
0092デフォルトの名無しさん
2010/04/22(木) 18:44:15std:: を書くようになると、swap の引数が何かによって
std:: をつけるかつけないかが変わってしまうので、
swap の中身を変えたら swap できなくなった、とかの問題が起こる事がある。
swap(a, b); で A::swap が呼ばれるのは、
引数の a と b の型が名前空間 A に属しているので、
勝手に名前空間 A の中に swap が無いか探して、
あればそっちを優先してくれるから。
このあたりのことは Effective C++ に書いてあるから、
この重要性が分からない = Effective C++ すら読んでないヘボPGだと声高に叫んでる
ということになる。
0093デフォルトの名無しさん
2010/04/22(木) 18:53:36メンバswapにもSwapにもPODの最適化にも対応出来る
0094デフォルトの名無しさん
2010/04/22(木) 18:59:35その結局のところというのは完全合法なのかなぁとか適当に言ってみるんだけどどうなの?
0095デフォルトの名無しさん
2010/04/22(木) 19:06:15swap技法について言ってるのなら、ちょっと意味が分からない。
0096デフォルトの名無しさん
2010/04/22(木) 19:15:50最適なスワップを呼び出してくれる関数をtmp使って書いて
{using std::swap; swap(a, b);}
の代わりに
saikyo::swap(a, b);
って使うんだよ
0097デフォルトの名無しさん
2010/04/22(木) 19:18:010098デフォルトの名無しさん
2010/04/22(木) 19:19:08saikyo::swapはどうやって書くのさ
まさか、必要な型のぶんだけ全部オーバーロード(もしくは特殊化)するの?
009988
2010/04/22(木) 19:38:28> using が絶対に必要な例を1つでも示せれば
> そんなに凄まなくていいのにな
上で述べられているstd::swapの特殊化は可能な限りしておくべきだが、クラステンプレートに対しては(部分特殊化となるため)できない。
って一行で済ませているだろ
なんでそれが分からないんだよ
なんでEffective C++すら読んでないんだよ
0100デフォルトの名無しさん
2010/04/22(木) 19:39:49まあ悪くはないように見えるが、std::swap でなくそちらを使うよう周知させる必要がある点が微妙
0101デフォルトの名無しさん
2010/04/22(木) 19:40:03お前の言っているテンプレートはC++のテンプレートとは思えんくらい
あり得ない動きを期待しているようだが。
頼むからEffective C++を最低2回は熟読しろ。
010288
2010/04/22(木) 19:41:12> std 名前空間内じゃないから規格を気にせず好き勝手特殊化できる、という事なのだろう
できないっつーの。
なんでお前までも Effective C++ を読んでないんだよ!
> クラステンプレートに対しては(部分特殊化となるため)できない。
って俺が>>88で述べただろうが!
0103デフォルトの名無しさん
2010/04/22(木) 19:45:03tmp勉強すればわかる
0104デフォルトの名無しさん
2010/04/22(木) 19:47:43tmpがテンプレートメタプログラミングの略だとしたら
知ったかぶりもいいところだな。
こんなにテンプレートに関してうるさい俺が
Template MetaProgrammingを知らない訳ねえじゃねぇか。
0105デフォルトの名無しさん
2010/04/22(木) 19:51:55実際わからねぇんなら勉強不足なんじゃない?
0106デフォルトの名無しさん
2010/04/22(木) 20:00:520107デフォルトの名無しさん
2010/04/22(木) 20:03:020108デフォルトの名無しさん
2010/04/22(木) 20:03:300109デフォルトの名無しさん
2010/04/22(木) 20:05:52・メンバswapやSwapが存在するかなどSwappableを判定するtraitsでできる限り網羅的に定義する。
・それ以外のものは実装者自身またはサードパーティが適宜saikyo::swapまたはtraitsを特殊化。
というか俺lexical_castを作るのにこういう実装でやったことがある。
swapに関して言えば、どう考えてもusing std::swap(またはboost::swap)のほうが綺麗で便利。
もっと本当に最強な実装があるというなら教えてくれ。まじで。
0110デフォルトの名無しさん
2010/04/22(木) 20:07:34宿題スレではhttpはtelnetプロトコル以降に生まれたから互換性があると断言してる人もいるし
ここはここでこんなだしw
0111デフォルトの名無しさん
2010/04/22(木) 20:39:54特定の書籍をどうするかは他人の勝手だよ
話が通じてないと思うなら、おまえが自分の言葉で語らないことを省みたらどうなんだ
#include <algorithm>
#include <iostream>
namespace A {
struct B {};
void swap(B&, B&) { std::cout << 1; }
}
main()
{
A::B x, y;
swap(x, y);
}
くらいのことを自慢できる相手が2ちゃんしかないんじゃないか?
0112デフォルトの名無しさん
2010/04/22(木) 20:50:540113デフォルトの名無しさん
2010/04/22(木) 20:55:050114デフォルトの名無しさん
2010/04/22(木) 20:56:03何がしたいのか分からない
0115デフォルトの名無しさん
2010/04/22(木) 21:08:54C++ならC++でどんな目的に使ってどのくらい達成できたかに過ぎないのを
わざわざ礼を失した表現を選ぶ者こそ何がしたいのか理解に苦しむ
# スレッドフロートという掲示板の仕様が気に入らないのを一般ユーザに八つ当たりするバカも同類
0116デフォルトの名無しさん
2010/04/22(木) 21:13:02# スレッドフロート型を拡張した掲示板の慣例を守っていないことに対する指摘は八つ当たりではない、と書いたところでsage進行スレじゃないことを知る
0117デフォルトの名無しさん
2010/04/22(木) 21:16:43強制と任意の区別がつかない知恵遅れに出る幕はない
0118デフォルトの名無しさん
2010/04/22(木) 21:16:50デザパタの名前を知らないからヘボと決めてはならないし、特定の書籍を
読んでないことについてももちろん同様。
共通認識としての情報が使えない場合、相手に対して正しく伝えられるかどうかが
ヘボかどうかの基準といえる。
まとめると、この本読んでないからお前アウト、という考えをしてる人はヘボ。もしくはヘボではないが短気。
0119デフォルトの名無しさん
2010/04/22(木) 21:20:02Effective C++を読んでないからお前アウトとは言っていない。
Effective C++を読んでなくてもそれに相当する最低限の知識を持っていれば
アウトではないし、別にEffective C++を読む必要すらないレベルの方々だということだ。
だが
「それに相当する最低限の知識」を持ち合わせていない
ようなので、お前アウトと申し上げたとおりだ。
0120デフォルトの名無しさん
2010/04/22(木) 21:22:25全然関係ない質問として
swapについて質問をさせてください。
他人の作ったクラスOther_s_Classを利用したクラスMy_Classを作る時、
Other_s_Classの仕様のせいでどうしても
swap(const My_Class&, const My_Class&, )
を例外を投げないように実装できない
(頑張っても不可能)ということは
実際にあるのでしょうか?
ありましたら例を教えてください。
よろしくお願い申し上げます。
0121デフォルトの名無しさん
2010/04/22(木) 21:28:27ただ、例外を投げない例外安全性を求めるのならずいぶん難しいと思う。
0122デフォルトの名無しさん
2010/04/22(木) 21:29:06(たとえばLib+ヘッダのみ公開されていて仕様にも記載がない)なら事実上無理だわね。
throw()で握り潰せば何でもありだけど。
0123デフォルトの名無しさん
2010/04/22(木) 21:29:12常にポインタの交換で実装できるんじゃない?
swap のためだけにポインタにする、というのが嫌ならアレだが
0124120
2010/04/22(木) 21:31:32> swap のためだけにポインタにする、というのが嫌ならアレだが
swap のためだけにポインタにするのも厭いません。
例外を投げるswapを認めないということは常に実装可能なのかと
疑問に思いまして。
0125デフォルトの名無しさん
2010/04/22(木) 21:33:10何の話だよいったい・・・
知らなければ論外だと思うならそもそも相手すんな
自分が論内に引っぱってるんだろうが
0126デフォルトの名無しさん
2010/04/22(木) 21:41:56123 のレスが全てでしょ
0127デフォルトの名無しさん
2010/04/22(木) 21:44:35なんにも制約をつけないとなるとswapってなんだろうという哲学的な問いのような気がしてきた
たとえば連結リストの一つのノードに対する
struct node_t{
node_t *prev; node_t *next; int v;
};
void swap(node_t *n1, node_t *n2);
という関数は必要なのか?
どういう実装にすべきか?
0128デフォルトの名無しさん
2010/04/22(木) 21:49:35値だけの交換と前後の交換の二種類あるけど、
テンプレートだと値が交換可能である保証が無いから
前後の交換で実装するのが無難かと
これはintだから値の交換でもいいと思うが
前後の交換だと、n1, n2 が連続している時に少し考慮が必要かな
0129デフォルトの名無しさん
2010/04/22(木) 21:54:31なんでコンパイル出来ないんですか?
0130デフォルトの名無しさん
2010/04/22(木) 22:06:19intからhoge<T>::typeのTを類推できないので
typedefされた型は元の型と同じように扱われて、
xには既にhoge<T>::typeという情報は残らない
0131デフォルトの名無しさん
2010/04/22(木) 22:16:35引数からの類推って結構制限きついんですね
最終的にその型になればなんでもいいのかと思ってました
0132デフォルトの名無しさん
2010/04/22(木) 22:55:08>>35
それだと5uにしないと警告の嵐
0133デフォルトの名無しさん
2010/04/22(木) 23:17:540134デフォルトの名無しさん
2010/04/22(木) 23:28:39それがC++さ!
0135デフォルトの名無しさん
2010/04/22(木) 23:35:29warning: comparison between signed and unsigned integer expressions
0136デフォルトの名無しさん
2010/04/22(木) 23:48:46オレのVCで試したら40行近く出たぜ
0137デフォルトの名無しさん
2010/04/23(金) 07:04:49わかりやすく細かい仕様を解説してるサイトとか書籍ってある?
0138デフォルトの名無しさん
2010/04/23(金) 07:22:52template metaprogrammingをやりたいの?
それとも初めてtemplateに触れるの?
0139デフォルトの名無しさん
2010/04/23(金) 07:27:24知識をよりまとまった強固なものにしたい
0140デフォルトの名無しさん
2010/04/23(金) 07:39:58なら回り道せずに規格読むのが最善手。
他の人の解説では間違いや省略が混ざる可能性が出てくるので、強固な知識とは言いがたい。
0141デフォルトの名無しさん
2010/04/23(金) 09:05:11C++テンプレート完全ガイドとか
0142デフォルトの名無しさん
2010/04/23(金) 16:02:55C++とDirectXでFlashのようなツールを作っています。
Flashはレイヤーの数やフレームの数が限りなく作れたり、「戻る」もかなりの回数を使うことが出来ますが
編集中のデータは一体どこに保存しているのでしょうか。
自作プログラムでメモリに1分ほどのアニメーションを保持させると
レイヤーの枚数や同時に開いているアプリケーションによってはメモリ不足になります。
ファイルに保存しているのかなと思いましたがファイルアクセス?に若干時間がかかり、
レイヤーやフレームの増減や現在見ているフレームを切り替えたときにカクカクしました。
他に方法があるのかと考えましたが思いつかず・・・何か参考になりそうなことがありましたら教えて頂けると有難いです。
そもそもこういった処理に何か名称があるのでしょうか?
0143デフォルトの名無しさん
2010/04/23(金) 16:06:300144デフォルトの名無しさん
2010/04/23(金) 16:43:550145デフォルトの名無しさん
2010/04/23(金) 17:58:01描画につかったパラメータとかプロパティとかを構造体かなんかでバックアップしといて、
必要になったらそれ使って再描画ってかんじじゃないの??
面データとかはなるべくフラグに落としたり出来ないか考える。
もしくは、ランダムアクセスできるような数式を考えて逆側に進めるとか。
初心者だからよく解らんけど。
0146デフォルトの名無しさん
2010/04/23(金) 19:01:37参考になるかもしれないキーワード
・ベクターアニメーション
・Mementoパターン
・Commandパターン
0147142
2010/04/23(金) 19:03:37前後のフレームをバッファリングするにしても再生すると毎フレーム必要になることを考えたら変わりがないような気も。
情報量を圧縮するにも限界があるので根本的な解決にはならなさそうですね。
「アニメーションの巻き戻しをしない」が前提であれば差分データだけでいいので若干良くはなりそうですが・・。
0149デフォルトの名無しさん
2010/04/23(金) 19:10:16ああ、編集じゃなくて再生のことも書いてたのか
それにしてもバッファリングを否定されるとつらいな。バッファリングなしで動画を描画している例って今あるのかね
0150デフォルトの名無しさん
2010/04/23(金) 23:51:24パーサー作ってみたら?
() や typename あたりのどたばたまで引っくるめて
C++ を愛せるかどうかも「強固」には必要だろ
0151デフォルトの名無しさん
2010/04/24(土) 04:27:44「三角形を左へ100ドット、100フレームかけて移動せよ」
みたいなデータの集合だから、
よほど複雑なアニメーションでもなけりゃ、10分でもオンメモリ余裕だと思う。
0152デフォルトの名無しさん
2010/04/24(土) 06:29:10もしくは、("aaa", "bbb", "ccc")が自動で
vector<string> へ変換させられる方法とか。
0153デフォルトの名無しさん
2010/04/24(土) 06:38:01#define tovecstring(...) tovecstring_sub(__VA_ARGS__, NULL)
std::vector<std::string> tovecstring_sub(char *p, ...){
va_list L;
va_start(L, p);
L = (char *)L - sizeof(char*);
char *ch;
std::vector<std::string> x;
while((ch=va_arg(L, char*))!=0) x.push_back(ch);
va_end(L);
return x; }
0154デフォルトの名無しさん
2010/04/24(土) 07:19:59#define tov(...) tovecstring_sub( "",__VA_ARGS__, NULL)
std::vector<std::string> tovecstring_sub(char *tmp, ...){
std::vector<std::string> x;
char *p;
va_list L;
va_start(L, tmp);
while((p=va_arg(L, char*))!=0) x.push_back(p);
va_end(L);
return x; }
0155デフォルトの名無しさん
2010/04/24(土) 07:44:440156デフォルトの名無しさん
2010/04/24(土) 08:46:480157デフォルトの名無しさん
2010/04/24(土) 12:28:250158デフォルトの名無しさん
2010/04/24(土) 12:35:07あるよね。
O(n^2)のはずなのにO(n)より早えぇよとか。
たぶんnがでかけりゃ逆なんだろうが。
0159デフォルトの名無しさん
2010/04/24(土) 14:20:39Fast Fourier Transformは実はそこまで早くないとかあるらしいね。
nがそこそこなうちはカラツバ法が良いとか。
0160デフォルトの名無しさん
2010/04/24(土) 14:44:29string str[]={"aaa", "bbb"}; を
関数を使ってvector<string>にするにはどうすればいいですか。
string*を引数にするとサイズデータが無くなるんですが。
0161デフォルトの名無しさん
2010/04/24(土) 14:58:14{
return vector<string>(a, a + N);
}
0162デフォルトの名無しさん
2010/04/24(土) 15:01:260163デフォルトの名無しさん
2010/04/24(土) 15:01:48#include <iterator>
#include <algorithm>
#include <boost/range.hpp>
string str[]={"aaa", "bbb"};
vector<string> v;
std::copy(std::back_inserter(v), boost::begin(str), boost::end(str));
0164デフォルトの名無しさん
2010/04/24(土) 15:02:50std::copy(boost::begin(str), boost::end(str), std::back_inserter(v));
0165デフォルトの名無しさん
2010/04/24(土) 15:07:17template <unsigned N> vector<string> make_strvec( string (&a)[N] )
{
int n;
vector<string> x;
for(n=0; n<N; n++) x.push_back(a[n]);
return x;
}
0166デフォルトの名無しさん
2010/04/24(土) 15:15:01コンパイル出来なかったか
何がダメなんだろう
0167デフォルトの名無しさん
2010/04/24(土) 15:19:38@VC9
0168デフォルトの名無しさん
2010/04/24(土) 15:37:35BCC6.2.1だがコンパイルして走ったよ
0169デフォルトの名無しさん
2010/04/24(土) 15:51:23size_t num_str = sizeof(str_table) / sizeof(str_table[0]);
vector<string> v( str_table, str_table + num_str );
v.assign( str_table, str_table + num_str );
0170デフォルトの名無しさん
2010/04/24(土) 17:03:55例えば>>169で文字列の長さが違っていても動くかな
0171デフォルトの名無しさん
2010/04/24(土) 17:08:310172デフォルトの名無しさん
2010/04/24(土) 17:09:38可変長構造体でもあるまいし
0173デフォルトの名無しさん
2010/04/24(土) 17:47:110174デフォルトの名無しさん
2010/04/24(土) 17:49:160175デフォルトの名無しさん
2010/04/24(土) 20:28:520176デフォルトの名無しさん
2010/04/24(土) 20:39:080177デフォルトの名無しさん
2010/04/24(土) 23:15:350178デフォルトの名無しさん
2010/04/24(土) 23:20:050179デフォルトの名無しさん
2010/04/24(土) 23:21:460180177
2010/04/24(土) 23:30:410181デフォルトの名無しさん
2010/04/24(土) 23:32:320182デフォルトの名無しさん
2010/04/24(土) 23:34:36どんなふうに使うんだろうね
0183デフォルトの名無しさん
2010/04/24(土) 23:39:06使わないな
0184デフォルトの名無しさん
2010/04/25(日) 00:01:020185デフォルトの名無しさん
2010/04/25(日) 00:09:48extern "hogehoge"じゃなくて、独自の指定子だったからな。
VCの__stdcallとか
0186デフォルトの名無しさん
2010/04/25(日) 00:11:160187デフォルトの名無しさん
2010/04/25(日) 00:44:42配列の演算子をオーバーロードしたいのですが、
T & foo::operator[](int idx)
とかやってるとします。
ここでidxがむちゃくちゃで返すべきTの参照が無い場合、何を返せばよろしいのですか?
例外を投げる?
カラッポのTをつくって返す?っていっても無理矢理なんか帰しても無意味だから
やっぱり例外かな。。
0188デフォルトの名無しさん
2010/04/25(日) 00:46:230189デフォルトの名無しさん
2010/04/25(日) 00:47:18俺は基本的にはstd::out_of_rangeすろーかな。
0190デフォルトの名無しさん
2010/04/25(日) 00:48:55例外投げます!
0191デフォルトの名無しさん
2010/04/25(日) 00:50:20かのScott Meyersの名言
「intの様に振る舞え」
って知らない?
> ここでidxがむちゃくちゃで返すべきTの参照が無い場合、何を返せばよろしいのですか?
intの配列でそれをやったら未定義の動作だから、
基本的にはその状況は考えないで何をやっても責められないとは思うが、
> 例外を投げる?
現実的にはそれが親切だと思う。
投げるクラスはstd::out_of_rangeまたはそれを継承したクラスを投げましょう。
> カラッポのTをつくって返す?
それは最悪の選択。
返却値の型は T & なんだろ?
テンポラリオブジェクトへの参照を返すつもりなの?
0192デフォルトの名無しさん
2010/04/25(日) 00:56:20std::vector とかだと、operator[] は例外投げず、at() は例外投げる、と使い分けてるね
0193デフォルトの名無しさん
2010/04/25(日) 01:15:22http://shota356.blog91.fc2.com/blog-entry-707.html
0194191
2010/04/25(日) 01:24:49> 俺ならassertするかも
俺もそれ言おうとしたが、
assertはデバッグビルドで削除されるってことを
思い出して止めた。
> std::vector とかだと、operator[] は例外投げず、at() は例外投げる、と使い分けてるね
うむ。
たぶんSTLに準拠すると喜ばれると思う。
0195デフォルトの名無しさん
2010/04/25(日) 01:28:52そう・・・かな・・・ぁ。
まあ説明は人によってウケが違うしな。
0196デフォルトの名無しさん
2010/04/25(日) 02:17:240197デフォルトの名無しさん
2010/04/25(日) 10:00:53逆!逆!
リリースビルドで削除だ
0199デフォルトの名無しさん
2010/04/25(日) 11:26:260200デフォルトの名無しさん
2010/04/25(日) 11:27:37かといって、クラスレベルでポリシー設定したんじゃ粗すぎるし
0201デフォルトの名無しさん
2010/04/25(日) 12:13:48なんで?
0202デフォルトの名無しさん
2010/04/25(日) 12:31:430203デフォルトの名無しさん
2010/04/25(日) 12:33:110204デフォルトの名無しさん
2010/04/25(日) 14:30:31クソ設計だけど、もうそうするしかないほど追い詰められている時に
「とりあえず動けばいいんだよ!早く作り終えないとけないし!」
ってなった結果じゃないかな?
0205デフォルトの名無しさん
2010/04/25(日) 14:44:080206デフォルトの名無しさん
2010/04/25(日) 15:10:07あー、なるほどね。
・・・その場合、Boostとか使えないの?
例えばboost::lexical_cast<std::string>()とかどうするの?
例外を投げないオプションとかあるのかな?
0207デフォルトの名無しさん
2010/04/25(日) 15:15:53goっぽくtupleでも返すとか
0208デフォルトの名無しさん
2010/04/25(日) 15:16:02bad_allocとかout_of_rangeとか投げるから
そういうとこだと完全に独自ライブラリ
0209デフォルトの名無しさん
2010/04/25(日) 15:19:21よく聞く話だけど、そこら辺まで考えての判断なのか疑問だね。
0210デフォルトの名無しさん
2010/04/25(日) 15:22:040211デフォルトの名無しさん
2010/04/25(日) 15:30:48まじかよ
boostやSTLを廃止したら生産性が下がるだろ。
Googleの躍進を見ていると、それを感じさせないほどの
Google独自ライブラリがあるのだろうかね。
0212デフォルトの名無しさん
2010/04/25(日) 15:32:01完成度の高いライブラリでも持ってんじゃない
0214デフォルトの名無しさん
2010/04/25(日) 15:52:57> 例外禁止って、さらに new が禁止で2段階初期化が強制になるんだろ?
なるほど。
newは当然のごとく禁止ってのはわかる。
さらにConstructorで失敗した時に例外禁止だとどうしようもないから
init()
メンバを用意する訳か。
ほー。
0215デフォルトの名無しさん
2010/04/25(日) 15:59:180216デフォルトの名無しさん
2010/04/25(日) 16:02:050217デフォルトの名無しさん
2010/04/25(日) 16:10:44初期化済みフラグをいちいち導入する必要があったりとか
0218デフォルトの名無しさん
2010/04/25(日) 16:13:27まぁね。
new(nothrow) した後 valid じゃない場合は即座に delete するファクトリメソッドを
用意すれば使う側の負担にもならない。これが害の最も少ない対処法だと思う。
例外使ったほうがずっと良いんだけどね。
0219デフォルトの名無しさん
2010/04/25(日) 16:23:180220デフォルトの名無しさん
2010/04/25(日) 16:31:19なんのこっちゃ?
0221デフォルトの名無しさん
2010/04/25(日) 16:32:59逆に言えばbool メンバが一つ必要になる反面、
いかなる状況でもis_validを呼び出せば初期化済みかどうか
確認できるってメリットにもなるよな。
init()で初期化する方式だとそれはできない。
でも例外を使うべきだと俺は思うけどね。
0222デフォルトの名無しさん
2010/04/25(日) 16:36:520223デフォルトの名無しさん
2010/04/25(日) 16:46:54>ちゃんと管理されてればな
そんな手間じゃないでしょ。
メンバの
bool 初期化済みflag;
をConstructorでfalseに設定して、initでtrueにするように設定して、
他のメンバからはいじれないようにすれば大丈夫さ。
0224デフォルトの名無しさん
2010/04/25(日) 16:54:590225223
2010/04/25(日) 16:57:39自分で言っててそれはつまりどうする気だと思ってきた。
初期化済み flag をメンバに持つそのためだけの基底クラス class InitFlagImpl を用意して
InitFlagImpl 中で派生クラスの init() を一個一個全て friend 指定する。
また InitFlagImpl の Default Constructor は初期化済み flag を false にセットするようにしておく。
そして派生クラスは InitFlagImpl を private 継承してやれば
派生クラスの Constructor では自動的に InitFlagImpl の Default Constructor が呼ばれるので
自動的に初期化済み flag が false にセットされ、
派生クラスの init() だけに気を配れば良い事になる。
>>224
それは初期化済みフラグには関係ない話だ。
0226デフォルトの名無しさん
2010/04/25(日) 16:59:26is_valid は false を返すべきだと思う
0227223
2010/04/25(日) 17:01:59うむ。おっしゃるとおり。
だがそれは本質的な問題じゃないから解決は簡単だ。
上述の is_valid を is_初期化済み として読み替えてくれ。
0228デフォルトの名無しさん
2010/04/25(日) 17:07:23まあコンストラクタのエラーに対してのみ使う、という規約を周知するのなら
0229デフォルトの名無しさん
2010/04/25(日) 17:13:15ちゃんとチェックメソッド書いた方がいいよね
0230デフォルトの名無しさん
2010/04/25(日) 17:17:37flagの前後にメモリとって
そこが破壊されてるかチェックしたのでいいと思うの
0231デフォルトの名無しさん
2010/04/25(日) 17:17:49bool is_初期化済み()
と
bool is_valid()
があれば自信を持って言っていいと思うぜ。
>>229
>>225方式ならflagは破壊されないんじゃね?
0232デフォルトの名無しさん
2010/04/25(日) 17:18:08Google みたいな事情がおまいらのところでもあるのか?
0233デフォルトの名無しさん
2010/04/25(日) 17:19:46今は
1.「例外を禁止したが故に生じる問題点とその解決策」
について論じているんじゃないのか?
なのに不法なメモリー破壊の話とか、
2.「例外を禁止していようがいまいが生じる問題点」
じゃないか。
1.と2.を混同してないかい?みんな。
0234デフォルトの名無しさん
2010/04/25(日) 22:52:230235デフォルトの名無しさん
2010/04/25(日) 23:19:53Intel製 CPUを搭載しているPCでなぜ動作するのですか?
コンパイラはネイティブコードを出力するとすると、動作しないのでは?
0236デフォルトの名無しさん
2010/04/25(日) 23:23:45動作するように互換性を持たせてるからです。
http://ja.wikipedia.org/wiki/X86
http://ja.wikipedia.org/wiki/AMD64
0237デフォルトの名無しさん
2010/04/25(日) 23:25:00ほかのCPUでは動かなくなる
0238デフォルトの名無しさん
2010/04/26(月) 01:06:470239デフォルトの名無しさん
2010/04/26(月) 01:14:590240デフォルトの名無しさん
2010/04/26(月) 01:19:550241デフォルトの名無しさん
2010/04/26(月) 02:10:120242デフォルトの名無しさん
2010/04/26(月) 02:13:020243デフォルトの名無しさん
2010/04/26(月) 02:43:51今使い倒してみました
高が知れてますね
0244デフォルトの名無しさん
2010/04/26(月) 02:50:190245デフォルトの名無しさん
2010/04/26(月) 02:57:440246デフォルトの名無しさん
2010/04/26(月) 06:25:02下手にある側が、上手にある側にいやいやでも合わせて互換性を持たせる
なんてことは良くある話だ。
0247デフォルトの名無しさん
2010/04/26(月) 06:26:30> 私が知りたいのは、ファンクタは無理に使う必要は無いか?ということです
無理に使う必要は無い。
だが使わない方が無理とは言わないまでも、不便だし
デザパタ上もまずいと思いませんか
0248デフォルトの名無しさん
2010/04/26(月) 06:49:06http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200309/03090053.txt
0249デフォルトの名無しさん
2010/04/26(月) 08:23:040250デフォルトの名無しさん
2010/04/26(月) 08:34:55見本となる人がこの程度の事で手を抜いてどうするの?
0251デフォルトの名無しさん
2010/04/26(月) 08:39:380252デフォルトの名無しさん
2010/04/26(月) 08:41:300253デフォルトの名無しさん
2010/04/26(月) 08:54:160254デフォルトの名無しさん
2010/04/26(月) 11:54:35char value[] = {1,2,3,4};
vallue = {5,6,7,8};
0255デフォルトの名無しさん
2010/04/26(月) 12:02:20static char const next_value[] = {5,6,7,8};
std::copy(next_value, next_value + 4, value);
さぁ不満なところを列挙してもらおうか?
0256デフォルトの名無しさん
2010/04/26(月) 12:14:440257デフォルトの名無しさん
2010/04/26(月) 12:44:56std::fread()のことならC標準関数のそれと同じものです。
つまり、ストリームから指定バイト数の要素を指定個数読み取る関数ですね。
0258デフォルトの名無しさん
2010/04/26(月) 12:55:020259デフォルトの名無しさん
2010/04/26(月) 13:42:35コンパイル通るんかいな。
0260デフォルトの名無しさん
2010/04/26(月) 15:04:06すべて純粋仮想関数のメソッドを持つクラスを基底として、
継承したクラスをdeleteした際、デストラクタが呼ばれないようです。
テストは下記のように作りました。
class ITest {
public : virtual ~ITest(){};
public : virtual void Print() = 0;
};
class TestOne : public ITest {
private : char* str;
public : TestOne( char* str_ ){
str = str_;
};
public : virtual ~TestOne(){
printf( str );
str = NULL;
};
public : virtual void Print() {
printf( "ONE " );
printf( str );
};
};
0261デフォルトの名無しさん
2010/04/26(月) 15:04:53private : char* str;
public : TestTwo( char* str1_, char* str2_ ) : TestOne( str1_ ){
str = str2_;
}
public : virtual ~TestTwo(){
printf( str );
str = NULL;
}
public : virtual void Print() {
printf( "TWO " );
printf( str );
}
};
int _tmain( int argc, _TCHAR* argv[] ){
TestTwo* _two = new TestTwo( "1111","2222" );
TestOne* _one = _two;
ITest* _ites = _two;
_two->Print();
_one->Print();
_ites->Print();
delete _ites;
return 0;
}
0262デフォルトの名無しさん
2010/04/26(月) 15:06:56呼ばれることを期待しましたが、呼ばれないようです。
コンパイラはVC++2008でPSはXPのSP3です。
_oneや_twoをdeleteした場合は、
期待したとおりにデストラクタが呼ばれております。
この挙動はC++の仕様なのでしょうか?
0263デフォルトの名無しさん
2010/04/26(月) 15:08:07class ITest は下記の物と差し替えてください。
class ITest {
public : virtual void Print() = 0;
};
0264254
2010/04/26(月) 19:01:26>>255
代入するのに2行必要なのが不満です。
その後必要ない変数next_valueが残るのが不満です。
そうではなく下のように1行で書きたいです。
value = {5,6,7,8}
どうにかして書けませんか?
0265デフォルトの名無しさん
2010/04/26(月) 19:05:230266デフォルトの名無しさん
2010/04/26(月) 19:27:53あと1年くらいでそれがコンパイル通るようになるから
しばらく待てない?
0267デフォルトの名無しさん
2010/04/26(月) 19:50:300268デフォルトの名無しさん
2010/04/26(月) 19:52:060269デフォルトの名無しさん
2010/04/26(月) 19:52:13strcpy(vallue,"1234")
0270デフォルトの名無しさん
2010/04/26(月) 19:53:00value = {5,6,7,8}
はできるはずだ。
0271デフォルトの名無しさん
2010/04/26(月) 20:07:00それを書くなら、memcpy(value, "\x5\x6\x7\x8", 4)だろ。
0272デフォルトの名無しさん
2010/04/26(月) 20:11:22平気でメモリ破壊するということが分かったな
0273デフォルトの名無しさん
2010/04/26(月) 20:12:190274デフォルトの名無しさん
2010/04/26(月) 20:12:490275デフォルトの名無しさん
2010/04/26(月) 20:13:590276254
2010/04/26(月) 20:49:59C++0xって奴ですか(本当に出るの?)
今すぐにできないならあきらめます。
全く使えない言語だ
0277260
2010/04/26(月) 20:55:460278デフォルトの名無しさん
2010/04/26(月) 21:06:38基底クラスのデストラクタしか呼ばれない。
0279デフォルトの名無しさん
2010/04/26(月) 21:10:13> 全く使えない言語だ
あきらめろ。お前には無理だから。
0280デフォルトの名無しさん
2010/04/26(月) 21:22:58レスありがとうございます。
そのような挙動でしたか。
インターフェースにもvirtualのデストラクタをつけなければ、
継承した子のデストラクタもよばれないのですね・・・。
お手数おかけいたしました。
0281デフォルトの名無しさん
2010/04/26(月) 21:51:31deleteを独自に定義とかしていない限り、
struct Derived : Base
{};
Base * p = new Derived;
delete p;
としたとき、BaseがvirtualなDestructorを持っていない場合の
動作は、標準C++では未定義の動作である。
//////////////////////////////////////////////////
struct MyContainer : std::vector<int>
{};
でも
std::vector<int> * p = new MyContainer;
で未定義の動作になるのは
delete p;
とした時だけで、例えば
delete (MyContainer*)p;
だったら未定義の動作にはならない。
あるいは
boost::shared_ptr< std::vector<int> > * p(new MyContainer);
としても未定義の動作にはならない。
そもそもMyContainerを基底クラスのポインタに入れるということをしなければ
全然問題ないし。
0282デフォルトの名無しさん
2010/04/26(月) 21:54:18つ GCC4.4以上
0283254
2010/04/26(月) 22:48:03>>282 まじっすか。
なら4/29発売のUbuntu10.04がgcc4.4.3らしいので使えそうですね。
これは楽しみだ。gcc最高
0284デフォルトの名無しさん
2010/04/26(月) 22:49:12Ubuntuが売ってたらびっくりだわ。
・・・じゃねぇや、gccのバージョンなら今でも自分で上げられるんでは?
0285デフォルトの名無しさん
2010/04/26(月) 22:52:430286デフォルトの名無しさん
2010/04/26(月) 22:55:44お前ら優しいな。
0287デフォルトの名無しさん
2010/04/26(月) 23:05:38そのソースを使う人のことを考えないなら確かに「全然問題ない」ね
0288260
2010/04/26(月) 23:42:39詳しい説明ありがとうございます。
動作未定義でしたか・・・。
Webの入門系しか見てなかったもので、
こういう所の動作は知りませんでした。
確かに基底クラスのポインタに入れなければ問題ないですね。
外部に提供する時にすべてvirtualのインターフェースを
返していたため、その型で保存しておりました。
考えてみれば、元の型で保存しておいて、getXXで返す型を
すべてvirtualの基底クラスにしておけばよかった事にいまさら気づきました。
0289デフォルトの名無しさん
2010/04/27(火) 00:14:10問題ないと思うけどな。
仮想デストラクタを持たないクラスを継承するなんて、
stlでもboostでも普通に使われてるじゃない。
0290デフォルトの名無しさん
2010/04/27(火) 00:27:56> そのソースを使う人のことを考えないなら確かに「全然問題ない」ね
いや、普通におかしくないだろ。
もしかして
「多態的にデザインされていないクラスのデストラクタは仮想にしない」
ってのを知らない?
デストラクタが仮想になっていたら多態的に使ってください!って言ってるようなもんじゃん。
0291290
2010/04/27(火) 00:29:20正確な日本語で言えば
×「多態的にデザインされていないクラスのデストラクタは仮想にしない」
○「継承されて基底クラスとして多態的に使用することを想定して作られていないクラスのデストラクタは仮想にしない」
だな。長いけど。
0292デフォルトの名無しさん
2010/04/27(火) 00:49:32stlは見た事無い気がするけどboostでなら当然のようにあるよ。
polymorphicに使わない基底クラスでDestructorをvirtualにするのは間違いで、
無駄にオーバーヘッドが出るだけ。
0293デフォルトの名無しさん
2010/04/27(火) 01:05:32std::unary_functionとかste::iteratorとか。
でもまあ、普通はstd::vectorから派生なんてしないよな。大抵は包含すりゃ済むし。
>>281は単なる例だと思うから気にしなかったが、
そういう意味では>>287の言うこともわかる。
0294293
2010/04/27(火) 01:07:060295290
2010/04/27(火) 01:12:37あー、そっか。それがあったね。
> まあ、普通はstd::vectorから派生なんてしないよな。大抵は包含すりゃ済むし。
うむ。おっしゃる通りで、大抵は包含すれば, だめでもprivate継承すれば十分だ。
俺は確かに例としてのためだけにstd::vectorを継承したんだけど、
>>287はそうは取らなかったってわけか。
なるほど。
0296デフォルトの名無しさん
2010/04/27(火) 01:20:47そのデストラクタはprotectedにすべしと、C++ Coding Standardsに書いてあったはず。
それを守ればいい。
0297デフォルトの名無しさん
2010/04/27(火) 14:05:55それだと継承してない場合にその基底クラスを使えないんじゃないか?
0298デフォルトの名無しさん
2010/04/27(火) 14:10:54「継承を前提とするクラス」
むしろ使えないようにしといた方がいいという場合のこと
0299デフォルトの名無しさん
2010/04/27(火) 15:01:510300デフォルトの名無しさん
2010/04/27(火) 15:19:28結構いるかはしらないけど俺の周囲には俺も含め3人いる
皆別々の作品を作っているよ
0301デフォルトの名無しさん
2010/04/27(火) 15:25:01俺の周囲・・・っていうとサークル所属か何かかな?
もし良かったら、各々が作ってるジャンルと深さ(エンジンまで作ってるとか、そこまでじゃないけど制作用ツールは作ってるとか色々)を教えて欲しいな
0302デフォルトの名無しさん
2010/04/27(火) 15:30:420303デフォルトの名無しさん
2010/04/27(火) 15:33:02なんかもっと、こう 簡単に作れそうなframeworkとかないのかね。
0305デフォルトの名無しさん
2010/04/27(火) 15:36:50俺->日曜プログラマー MMORPGのサーバサイドの処理をC++で作成中
友人->趣味としてWindowsのシューティングを作っている 本職もゲーム屋さん
友人の友人(俺の知人)->大学生 今は3D関連のライブラリーだかエンジンだか作っている。俺3D弱いから彼が何言っているかよく理解出来ないw
0306301
2010/04/27(火) 15:44:00THX
っていうか凄い人達だな。何だその繋がりwwどこで知り合ったんだ?
俺も大学生だけど経済学科だし、3Dのライブラリとかエンジン作るとか夢のまた夢って感じだ・・・・
0307デフォルトの名無しさん
2010/04/27(火) 17:11:33>>306
まあもしゲームをC++で作りたい場合でも別に3Dライブラリを作る必要まではないんじゃないの?
3Dライブラリは日進月歩だし、自分でライブラリレベルから作ってたらたぶんゲームが完成しないw
既にある優秀なライブラリを借りればいいじゃないの。
0308デフォルトの名無しさん
2010/04/27(火) 18:58:41必要ないの?
0309デフォルトの名無しさん
2010/04/27(火) 18:59:16普通に定義したものの { } をなくせばいいだけ
0310デフォルトの名無しさん
2010/04/27(火) 19:16:27サンクス
0311デフォルトの名無しさん
2010/04/27(火) 19:26:20DXやGLレベルのことじゃなくて、それらを使った便利オレオレラッパーとかのことじゃねえかな。
0313デフォルトの名無しさん
2010/04/27(火) 20:19:25膨大なだけで根性さえあればかけると思われ・・・
0314デフォルトの名無しさん
2010/04/27(火) 20:21:160315デフォルトの名無しさん
2010/04/27(火) 20:21:47時間さえあれば
0316デフォルトの名無しさん
2010/04/27(火) 20:27:43やるならもちろんソフトウェアレンダでしょうね。
15年昔ならアセンブラで手書きとかがあったよね。
グラボ会社も資料出してくれてたこともあったし。
0317デフォルトの名無しさん
2010/04/27(火) 20:32:45どれくらい意味があるかは分からんが。
0318デフォルトの名無しさん
2010/04/27(火) 20:56:35とか考えると、やっぱり便利なラッパを書いてくれる方がうれしいな。
0319デフォルトの名無しさん
2010/04/27(火) 23:07:14標準入力から読み込んだ英文を単語毎に分解する目的で、
よく以下のようなコードを見かけるし使うのですが、
cout << "Please input strings : ";
istream_iterator<string> start(cin);
istream_iterator end;
vector<string> v(start, end);
これを複数回繰り返す方法がよくわかりません。
#正確に書くとこのコードの後に普通にcinから読み込ませる方法を知りたい
上記コードに続けて、
cout << "Please input strings again : ";
cin.clear();
vector<string> v2(++start, end);
とするとWindowsXP(MinGW)の環境では意図した通りに再度入力できるのですが、
FreeBSD上のgcc環境で試したところcinから何も読み込まずにv2に空vectorが出来ます。
#cin.clear()が無いときと同じ動作
何とか移植性のある方法は無いものでしょうか。
0320デフォルトの名無しさん
2010/04/27(火) 23:37:00gcc-4 では、教科書の次のコードがコンパイルできません。
(bcc32 ではコンパイル・実行とも問題がありません。)
コード上で問題はありますでしょうか?
http://codepad.org/SyLoUb14
よろしくお願いいたします。
0322デフォルトの名無しさん
2010/04/27(火) 23:47:34どれを使っていいのか分からないというエラーになる
目的の関数ポインタ型でキャストするか、
テンプレート引数を明示的に与えるといいのだが、
transformでテンプレート引数を明示的に与えるのは面倒臭いので、キャストがベスト
0323デフォルトの名無しさん
2010/04/27(火) 23:50:17ご丁寧に unresolved overloaded function type って書かれてます
つまり、sinがオーバーロードされてるのでどれを使ったらいいか分からないということ
0324デフォルトの名無しさん
2010/04/27(火) 23:58:55'transform(
__gnu_debug::_Safe_iterator<__gnu_norm::_Deque_iterator<double, double&, double*>,
__gnu_debug_def::deque<double, std::allocator<double> > >,
__gnu_debug::_Safe_iterator<__gnu_norm::_Deque_iterator<double, double&, double*>,
__gnu_debug_def::deque<double, std::allocator<double> > >,
__gnu_debug::_Safe_iterator<__gnu_norm::_Deque_iterator<double, double&, double*>,
__gnu_debug_def::deque<double, std::allocator<double> > >,
<unresolved overloaded function type>
)'
compilation terminated due to -Wfatal-errors.
まだ悪夢には程遠いけど、やっぱ見づらいな
0325デフォルトの名無しさん
2010/04/28(水) 00:00:16>>322
ありがとうございます。これでコンパイル・実行ともできました。
transform(radians.begin(), radians.end(), sines.begin(), (double(*)(double))sin);
0327デフォルトの名無しさん
2010/04/28(水) 00:02:42>>322-323
sin(0.3)とかはstd::sin(double)が他より優先的にマッチするから
オーバーロード解決が問題じゃないのでは?
VC2008ではコンパイル&リンクできて
C:\>aaaaa.exe
0.1:0.0998334
0.2:0.198669
0.3:0.29552
0.4:0.389418
0.5:0.479426
ってなったよ?
0328デフォルトの名無しさん
2010/04/28(水) 00:06:22Comeau C++では
Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for ONLINE_EVALUATION_BETA2
Copyright 1988-2008 Comeau Computing. All rights reserved.
MODE:strict errors C++ C++0x_extensions
"ComeauTest.c", line 19: error: no instance of overloaded function "transform"
matches the argument list
The argument types that you used are: (std::_Deque_iterator<double, double &, double
*>, std::_Deque_iterator<double, double &, double *>,
std::_Deque_iterator<double, double &, double *>,
<unknown-type>)
transform(radians.begin(), radians.end(), sines.begin(), sin);
^
"ComeauTest.c", line 9: warning: variable "n" was declared but never referenced
double n;
^
1 error detected in the compilation of "ComeauTest.c".
ってなったわ。
つまりなんなんだ????
0329デフォルトの名無しさん
2010/04/28(水) 00:10:10テンプレート引数は
関数テンプレートの引数のみの情報から推論できないといけない
関数テンプレートの中の処理なんて一切見ない
transformのテンプレート引数を見れば、推論不可能なことが分かる
0330デフォルトの名無しさん
2010/04/28(水) 00:12:53http://codepad.org/XutU6qLk
0331327
2010/04/28(水) 00:17:48ほー、ありがとう。
今 gcc と VCの<algorithm>を漁って定義を確認してきたところ。
おっしゃる通りでございました。
ありがとうございました。
0332デフォルトの名無しさん
2010/04/28(水) 00:31:29イテレータ使ってるってのがポイントなのよね
0333デフォルトの名無しさん
2010/04/28(水) 00:33:38って関数ポインタにキャストしているように見えるんだけど、
最適化の障害になったりはしないの?
0334デフォルトの名無しさん
2010/04/28(水) 00:35:02テンプレート引数の推論の問題であって
Overload Resolutionの問題ではないということか。
ややこしや
0335デフォルトの名無しさん
2010/04/28(水) 00:37:41関係ないよ
http://codepad.org/yT2ckp7t
0336デフォルトの名無しさん
2010/04/28(水) 00:41:430337デフォルトの名無しさん
2010/04/28(水) 00:43:38double(*p)(double) = sin;
のpと同じ一時オブジェクトを作る意味になるから
やってることはオーバーロードの選択
0338デフォルトの名無しさん
2010/04/28(水) 00:49:25長くなるし、いちいち typedef するのもめどい
0339デフォルトの名無しさん
2010/04/28(水) 00:53:04while(1) {
Hoge h;
func(&h);
}
funcに渡されるアドレスって毎回同じインスタンスですよね?
0340デフォルトの名無しさん
2010/04/28(水) 00:54:070341デフォルトの名無しさん
2010/04/28(水) 00:54:53普通は同じアドレスだろうけど、そう保証されているわけではない
とりあえずコンストラクタとデストラクタはループごとに毎回呼ばれる
0342デフォルトの名無しさん
2010/04/28(水) 01:00:44なぜそう思う。
むしろ違うと思うのが自然では?
例えば
while(1) {
Hoge h;
hをいじる。
func(&h);
}
だったとして、次のループのhが前回hをいじった結果を継承していたらおかしいでしょ?
なぜおかしいかというと、}のところで一回スコープから外れているんだから
hはデストラクトされているわけだ。
0343デフォルトの名無しさん
2010/04/28(水) 01:02:32C言語だと同じなのですが....
0344デフォルトの名無しさん
2010/04/28(水) 01:06:100345デフォルトの名無しさん
2010/04/28(水) 01:06:46C言語で同じ事が規格で保証されているってこと?
そんなこと無いでしょ。
C++だって同じになるかもしれないけど、同じにならないかもしれない。
規格ではどっちでも良い事になっている。
0346デフォルトの名無しさん
2010/04/28(水) 01:08:21規格ではどっちでもいいけど
実装は同じになるのですが
0347デフォルトの名無しさん
2010/04/28(水) 01:13:37結局何を聞きたいの?
> 規格ではどっちでもいいけど
> 実装は同じになるのですが
そういう実装なんだろ?
コンパイラのマニュアルでそう保証されているの?
それとも今のところ一緒ってだけ?
0348デフォルトの名無しさん
2010/04/28(水) 01:17:39こうゆう書き方ってまずいのか
よくわからなくて
こまってます
0349デフォルトの名無しさん
2010/04/28(水) 01:19:21Hoge h;
while(1) {
func(&h);
}
でいいじゃないか
0350347
2010/04/28(水) 01:23:41まずいかどうかはfuncを君がどう定義しているかによる。
funcはhが次の4パターンのどれを期待しているの?
1.常に同じオブジェクトかつ同じアドレスが必要 -> >>349が言っている通り。
2.常に同じオブジェクトかつ違うアドレスが必要 -> 言ってる事が矛盾している。
3.毎回新しいオブジェクトが必要かつアドレスは同じでも違ってもいい。 -> 君のコードのままでおk。
4.毎回新しいオブジェクトが必要かつアドレスは同じでないとやだ。 -> 配置構文newを使うしかないと思う。
0351347
2010/04/28(水) 01:24:57もしパターン4を期待しているなら誰かが 配置構文newを教えてくれるよ。
0352デフォルトの名無しさん
2010/04/28(水) 01:28:380353デフォルトの名無しさん
2010/04/28(水) 01:28:513が保証できればそれでいいのですが
例えば、funcの中でスレッドを生成し
hを渡す場合も保証できるのかなぁって
心配です。
0354デフォルトの名無しさん
2010/04/28(水) 01:29:270355デフォルトの名無しさん
2010/04/28(水) 01:33:270356347
2010/04/28(水) 01:35:08最近のCはできる。
>>353
>>354
Hogeの作者が作ってくれていればそれでOKだね。
あるいはHoge h = Hoge()で初期化同然に動作する仕様になっていればそれでもOKか。
0357347
2010/04/28(水) 01:37:21> 3.毎回新しいオブジェクトが必要かつアドレスは同じでも違ってもいい。
は保証できるだろ。
だが君が言っている
> funcの中でスレッドを生成しhを渡す場合
ってのが謎だが、
while(1) {
Hoge h;
func(&h);
}<-制御がココに達した瞬間にhは破棄されるため別スレッドがこの&hにアクセスしないこと
っていう条件が必要。
0358デフォルトの名無しさん
2010/04/28(水) 01:38:36規格と実装の区別も付かないどころかスコープも理解していないのに
スレッドとか言っちゃうやつにC/C++プログラミングは不可能!
これ、結論でOK。↑↑
0359デフォルトの名無しさん
2010/04/28(水) 01:46:18良く良く突っ込んでみると確かにC言語すらあやしいようだしな。
0360デフォルトの名無しさん
2010/04/28(水) 01:47:28知識では某書で見た事ある程度だが使った事ねぇw
0361デフォルトの名無しさん
2010/04/28(水) 01:48:19ローカル変数のアドレスをスレッドに渡すのはやめとけ。
グローバル変数か、newで確保したオブジェクトか、どっちかのアドレスを渡すほうがいい。
newで確保することにした場合はdeleteを忘れないように。
0362デフォルトの名無しさん
2010/04/28(水) 02:02:130363デフォルトの名無しさん
2010/04/28(水) 02:03:55今回の記述が許されないCってどのC?
0364デフォルトの名無しさん
2010/04/28(水) 02:19:06↓
> 最近のCはできる。
↑のC99?の話と
>>339のブロックの先頭で変数を宣言するってのは別件でしょ
>>352がC言語の事あまり詳しく知らないだけなんだと思うけど
0365デフォルトの名無しさん
2010/04/28(水) 14:05:59C++編(言語解説) 第36章 placement new
ttp://www.geocities.jp/ky_webid/cpp/language/036.html
うへぁ
0366デフォルトの名無しさん
2010/04/28(水) 15:29:500367デフォルトの名無しさん
2010/04/28(水) 15:36:50それは分かった事にならんだろ。
自前で定義したnewとは違う意味ですよ?
0368デフォルトの名無しさん
2010/04/28(水) 17:34:55普通のnewはメモリ確保も込みだけど、既に確保されている領域に
インスタンスを構築するのがplacement newってだけだよ。
0369デフォルトの名無しさん
2010/04/28(水) 17:45:22newのオーバーロードで配列プールを返すようにしてるんだけど
やっぱりplacement newを使った方がいいんだろうか
0370デフォルトの名無しさん
2010/04/28(水) 18:07:240371デフォルトの名無しさん
2010/04/28(水) 20:06:24まあ、規格的には 引数付きのnew=配置new なんだけどな
コンストラクタを呼ぶだけのものを指す事が多いし、それが語源なんだろうけど
0372デフォルトの名無しさん
2010/04/29(木) 01:40:31いや走るだろ。
配列プール作成したときと、newされたときで、2回走ることになるが。
0373デフォルトの名無しさん
2010/04/29(木) 02:06:050374デフォルトの名無しさん
2010/04/29(木) 02:31:31普通型無しのメモリ領域に対して使うんだが
void* p = operator new(n * sizeof(A));
A* pa = (A*)p;
for (int i = 0; i < n; ++i) {
new(&pa[i]) A; // ここでのみコンストラクタが呼ばれる
}
...使う...
for (int i = 0; i < n; ++i) {
pa[i].~A(); // ここでのみデストラクタが呼ばれる
}
operator delete(p);
0375デフォルトの名無しさん
2010/04/29(木) 18:19:00>new(&pa[i]) A;
これってplacement newじゃないの?
0376デフォルトの名無しさん
2010/04/29(木) 22:24:07このスレで過去に出て来たのはいつだろうと思うくらい前だろうに。
0377デフォルトの名無しさん
2010/04/30(金) 03:27:350378デフォルトの名無しさん
2010/04/30(金) 03:31:02メモリ節約したいならC言語使えばいいじゃん
オブジェクト指向の恩恵を受けるんだから多少のオーバーヘッドとか無駄とか我慢しろよ!
と無駄に煽ってみるテスト
0379デフォルトの名無しさん
2010/04/30(金) 03:33:23というか配置構文newのどこがだめなの?これ使ってもオブジェクト指向の恩恵を十分受けられるだろ。
0380デフォルトの名無しさん
2010/04/30(金) 03:46:530381デフォルトの名無しさん
2010/04/30(金) 11:14:280382デフォルトの名無しさん
2010/04/30(金) 11:24:25newって速いの?
0383デフォルトの名無しさん
2010/04/30(金) 11:40:04わざわざ{ return メンバ変数;}なんてメソッド呼んでたら
遅くなりませんか?
0384デフォルトの名無しさん
2010/04/30(金) 11:42:260385デフォルトの名無しさん
2010/04/30(金) 11:52:350386デフォルトの名無しさん
2010/04/30(金) 12:34:12速度のために使うこともあるだろうけど。
>>381
考慮されないよ。メモリを正しく確保するのは呼び出し側の義務。
0387デフォルトの名無しさん
2010/04/30(金) 12:45:34そのメンバ関数を別の翻訳単位にしていなければ、
コンパイラの最適化でインライン展開されて事実上、
全く同じコードになる。
おまけに、デバッグ時にはメンバ関数でトラップを張ったり
ログ出力したりと、効率よく対処できる。
それなりに大きなクラスならpublicメンバをデバッグするより
トータルコストが抑えられる場合が多いと思われる。
もし仮に、ほんの僅かなパフォーマンスさえ気にするのであれば、
一旦完成させた後に実測した上で、必要に応じてpublicにすればいい。
0388デフォルトの名無しさん
2010/04/30(金) 12:50:14>>381
例えばMSVCのnewの実装を見てみるといい。あれは中でmallocをOSから応答があるまでwhile(true)で待ってるだけだから。(マルチスレッドでコンパイルしたプログラムは知らん)
そういう意味で確保済みのメモリ領域をOSの処理にまで委ねなくても再利用できる点では優秀だし、カスタムアロケータを使っている場合はプールで高速化を図る時に
統計的な裏づけを元にOSではなくプログラムがメモリを管理するのだから配置newがあって当然だと言える。
0389デフォルトの名無しさん
2010/04/30(金) 13:37:410390デフォルトの名無しさん
2010/04/30(金) 15:05:500391デフォルトの名無しさん
2010/04/30(金) 15:25:12基本らしいですが何故節約になるのかわかりません。
0392デフォルトの名無しさん
2010/04/30(金) 15:26:440393デフォルトの名無しさん
2010/04/30(金) 15:29:34new(ptr) HogeHogeType; ← HogeHogeTypeのコンストラクタしか走らないので余裕がなくてもそれなりに使える。ただしHogeHogeTypeの中でスタック浪費してると論外
0394デフォルトの名無しさん
2010/04/30(金) 15:33:210395デフォルトの名無しさん
2010/04/30(金) 16:06:060396デフォルトの名無しさん
2010/04/30(金) 16:24:57普通のnewが何をするか分かってる?
ネックになってるのはメモリ管理だからplacement newみたいに既存のメモリ空間にコンストラクタを走らせるだけなら速くも遅くもないけど。
0397デフォルトの名無しさん
2010/04/30(金) 16:27:050398デフォルトの名無しさん
2010/04/30(金) 16:41:41普通のnewの作業
=メモリアロケート作業+配置構文newの作業
である以上、そりゃもちろん配置構文newのが
普通のnewよりずっと早いさ。
だが仕事の内容が違う以上、どっちが早いとか論じるのはおかしい。
0399デフォルトの名無しさん
2010/04/30(金) 16:43:18> 基本らしいですが何故節約になるのかわかりません。
節約にはならないだろう。
普通にコンストラクタを起動するだけなのだから。
もしかしたら>>377を読んで思ったのかもしれないが、
誰も指摘していないだけで>>377は普通に間違っているから
鵜呑みにしてはならない。
0400デフォルトの名無しさん
2010/04/30(金) 18:12:29頻繁にnewする必要がある場合、どうしたら早くなるだろうか。
0401デフォルトの名無しさん
2010/04/30(金) 18:18:27のコードに
#include <stdio.h>
こんなのがあったんですが、どういう意味デツカ
0402デフォルトの名無しさん
2010/04/30(金) 18:19:16その部分にstdio.hの内容をコピペするって意味。
0403デフォルトの名無しさん
2010/04/30(金) 18:26:41配置newしたら、対応したdelete呼ばないと悪い意味で破壊されるんじゃね。
new(GlobalPool)->delete(Pointer,GlobalPool)->new(GlobalPool)->dele...
の順じゃないとだめじゃね?
利点はメモリを確保するという動作を放棄できる。
0404デフォルトの名無しさん
2010/04/30(金) 18:31:42昔からある、仕様なのでしょうか?それとも最近のC++0x 9の仕様ですか。
0405デフォルトの名無しさん
2010/04/30(金) 18:33:410406デフォルトの名無しさん
2010/04/30(金) 18:37:37ごめんなさい、firefoxのバグなのでしょうか
IE で見ると
#include <stdio.h>なのですが、firefoxでは
#include <stdio.h&gt;
&gt;この部分は半角
こうなってた、ソースコードがあったんでびっくりして聞いてしまいました。
0407デフォルトの名無しさん
2010/04/30(金) 18:45:19HTMLスレかFirefoxスレ逝け。
0408デフォルトの名無しさん
2010/04/30(金) 18:48:160409デフォルトの名無しさん
2010/04/30(金) 18:49:54> >が&gt;になってたんじゃね
のまちがい
0410デフォルトの名無しさん
2010/04/30(金) 20:20:29#include <cstdio>
じゃないのが納得いかないという雰囲気でもない?
0411デフォルトの名無しさん
2010/04/30(金) 20:21:50具体的にどのファイルか教えてもらえると助かる、、、わけでもないけど興味がある
0412デフォルトの名無しさん
2010/04/30(金) 20:29:37それは知らん。
人によって違うから。
#includeのルールに則って考えて見て。
普通はコンパイラのパスの通っているディレクトリで、
stdio.hって名前のヘッダを探せば一つしか無いと思うけど。
0413デフォルトの名無しさん
2010/04/30(金) 20:58:010414デフォルトの名無しさん
2010/04/30(金) 21:29:49?何??
まあいいや。
0415デフォルトの名無しさん
2010/04/30(金) 21:59:430416デフォルトの名無しさん
2010/05/01(土) 00:28:26>>401を読めばGCCのソースコードであることは明らか
どのファイルか教えてもらえてもよかろ
0417デフォルトの名無しさん
2010/05/01(土) 02:08:31最初の引数に総数を自分で渡すとか、"%d"とか、総数が分かるような情報を与えないとだめなんでしたっけ?
勝手にスタックから自動計算して、”あ、引数はこんだけだな”って分かってくれるマクロとか無いんでしたっけ??
0418デフォルトの名無しさん
2010/05/01(土) 02:19:170419デフォルトの名無しさん
2010/05/01(土) 02:25:26可変引数は使わないほうが良いよ。
0420デフォルトの名無しさん
2010/05/01(土) 03:50:04そのときはどうだったの
0421デフォルトの名無しさん
2010/05/01(土) 04:10:07なんかあったような錯覚を覚えなくもないが、少なくとも標準ではないはず。
0422デフォルトの名無しさん
2010/05/01(土) 04:55:41可変引数ってもしかして人気ないんですか?
過去に使ったのは・・・va_list apをそのままvsprintf系に食わせていたので、
それ以外は使ったこと無いかも。。
0423デフォルトの名無しさん
2010/05/01(土) 05:16:44選択肢が限られるCならともかく、C++では完全にいらない子です。
たぶんregisterさんと同じぐらいかわいそうな子です。
0424デフォルトの名無しさん
2010/05/01(土) 05:21:03まじですか。
C++だとどんな風にやるのがトレンドなんですか?
0425デフォルトの名無しさん
2010/05/01(土) 05:38:20Cならオーバーロードもデフォルト引数ないから、そういう用途で使われることがあったようだが、
それも「シンボル名は8文字まで」とかの制限があった時代の話だし。
あとはprintf,scanf系列くらいしか思いつかないが、streamで代替できるし。
0426デフォルトの名無しさん
2010/05/01(土) 05:51:06std::ostreamだと、
std::cout << a << b << c;
書式ありのboost::formatだと、
std::cout << boost::format("%d %d %d") % a % b % c;
とか、演算子オーバーロードによる連結で
可変個引数的なことをやってる。
0427デフォルトの名無しさん
2010/05/01(土) 05:57:31myclassのコピーコンストラクタがへんな引数で呼ばれるのはなんで?
myclass fuck()
{
myclass x("hello");
return x;
}
class myclass
{
public:
myclass(const char * p){ppp = new char[strlen(p) + 1]; strcpy(ppp, p);}
~myclass();
myclass(const myclass & x)
{
ppp = new char[strlen(x.ppp) + 1]; //ここでx.pppが0xCDCDCDCDなんですけど。。
memcpy(ppp, x.ppp, strlen(x.ppp) + 1);
}
private:
char * ppp;
};
デストラクタにブレーク張ってるけど呼ばれてないし。。
0428デフォルトの名無しさん
2010/05/01(土) 06:58:43・再現しない、ちゃんと "hello" が返る@VC6SP6
・0xCD は、VC の Debug ビルドで新しく malloc()・new した時にそう初期化される仕様で、未初期化領域を検出する目安になる
・というか strdup() 使え
・ブレーク張ってるデストラクタとやらは何処だ
0429デフォルトの名無しさん
2010/05/01(土) 09:39:17ありがとうございます。
breakは~myclass()ではっています。
なので解放はされてないと思ってるんですが。。
もう一度良く見てみます。
0430デフォルトの名無しさん
2010/05/01(土) 09:46:05すみません、超ド単純なミスでした
myclass(const char * p){ppp = new char[strlen(p) + 1]; strcpy(ppp, p);} じゃなくて
myclass(const char * p){char * ppp = new char[strlen(p) + 1]; strcpy(ppp, p);} ってやってました・・
0431デフォルトの名無しさん
2010/05/01(土) 09:48:12> breakは~myclass()ではっています。
> なので解放はされてないと思ってるんですが。。
え、意図的にメモリリークしてるの?
意図は分からんが、そうしたいなら ~myclass(); じゃなくて ~myclass() {} と書くべき
~myclass(); だけじゃただの宣言で、定義になってない
0432デフォルトの名無しさん
2010/05/01(土) 09:49:20知識もないとバグだらけにもなりそうだし素人にはお薦め出来ないな
0433デフォルトの名無しさん
2010/05/01(土) 09:58:46はしょってるだけです。
あとホントの開発コードは貼れないんで意味的に同じになるようにサラっと書いたコード(myclass)なんで
あまり深く突っ込むのは勘弁してください。。
0434デフォルトの名無しさん
2010/05/01(土) 10:12:27そのループは new_handler を呼び出すループじゃないのか?
OSからの応答をループで待つとか間抜けなコードが使われてるとはにわかに信じがたいな。
0435デフォルトの名無しさん
2010/05/01(土) 10:13:30問題の発生する最低限のコードを書き出すくらいはできるだろ
っていうか、それが質問者のマナーであり常識
でないと本来1レス程度で解決できる問題が今回の様にだらだら長引く事になる
0436デフォルトの名無しさん
2010/05/01(土) 10:27:530437デフォルトの名無しさん
2010/05/01(土) 10:36:01小言言ってないで無視すればいいのに
0438デフォルトの名無しさん
2010/05/01(土) 10:42:110439デフォルトの名無しさん
2010/05/01(土) 10:49:230440デフォルトの名無しさん
2010/05/01(土) 11:54:12可変長引数は、引数の個数も型もコンパイル時にチェックできないから危険なのね。
>>426のほうほうなら型がコンパイル時にチェックされる。
0441デフォルトの名無しさん
2010/05/01(土) 11:54:59自分以外の読者がいるという事実は気に留めておけば良いと思う。
0442デフォルトの名無しさん
2010/05/01(土) 12:47:34静的型の言語だと、簡単に可変長引数を実装できる構文って作りにくいのかな
C++0xのinitializer_listでも単一型しか受けられないし
JavaもObject[]で型チェックなしだし
0443デフォルトの名無しさん
2010/05/01(土) 12:49:560444デフォルトの名無しさん
2010/05/01(土) 12:50:330445デフォルトの名無しさん
2010/05/01(土) 13:24:230446デフォルトの名無しさん
2010/05/01(土) 13:39:42そのとおりです。f(...) はできない。
0447デフォルトの名無しさん
2010/05/01(土) 14:40:29true false
しかないのに、なぜに1バイトも占有するのでしょうか?
0448デフォルトの名無しさん
2010/05/01(土) 14:42:100449デフォルトの名無しさん
2010/05/01(土) 14:58:240450デフォルトの名無しさん
2010/05/01(土) 14:59:140451デフォルトの名無しさん
2010/05/01(土) 15:07:18C++03まで限定の命だがな
0452デフォルトの名無しさん
2010/05/01(土) 15:11:410453デフォルトの名無しさん
2010/05/01(土) 15:12:110454デフォルトの名無しさん
2010/05/01(土) 15:13:28勢いの速いスレを自動更新にしながらモニタの前に本を置いて読むに限る
0455デフォルトの名無しさん
2010/05/01(土) 19:34:45アルゴリズム?デザインパターン?に進めばいいの?
0456デフォルトの名無しさん
2010/05/01(土) 19:42:46とにかくコードを書け。アルゴリズムもデザパタも書かなきゃ理解できない。
0457デフォルトの名無しさん
2010/05/01(土) 19:43:370459デフォルトの名無しさん
2010/05/01(土) 20:03:57今Visual Studio 2008 Express版持ってる人は2010に乗り換えた方が良いってこと?
割と最近このスレで2008EX版勧められて導入したばかりなんですけど・・・・
0460デフォルトの名無しさん
2010/05/01(土) 20:11:08欲しい新機能がなければ急いで替える必要はないなって言うのが、俺の率直な印象。
時々IDEが黙るし、マウスのホイールの移動量がおかしいし、早くSP1が出ないかなと思う。
0462デフォルトの名無しさん
2010/05/01(土) 20:16:21逆だろ?
コーディングなんて猫でもできる
仕事できない奴の典型、アルゴリズムが頭に浮かんでないのに
行き当たりばったりでコーディングを開始する奴
0463デフォルトの名無しさん
2010/05/01(土) 20:24:060464デフォルトの名無しさん
2010/05/01(土) 20:29:20設計仕様 5
コーディング 2
デバック 3
位だろ。
0465デフォルトの名無しさん
2010/05/01(土) 20:29:410466デフォルトの名無しさん
2010/05/01(土) 20:39:450467455
2010/05/01(土) 20:40:38そういう意味では知識と組み立て(段取り)が頭の中にあらかじめ入ってないと意味内ですよね。
0468デフォルトの名無しさん
2010/05/01(土) 20:40:520469デフォルトの名無しさん
2010/05/01(土) 20:42:550470デフォルトの名無しさん
2010/05/01(土) 21:18:560471デフォルトの名無しさん
2010/05/01(土) 21:43:13仕様なんて最初の段階じゃ良くて7割しかきまらないような・・・
作っているうちにより良い手立てがあることに気づくことってざらだよね?
おれが設計素人なだけかもしれんが・・・。
そもそも顧客自体もほしい物がわかって人っていないよね?
C++以外のことですまねえ。
0472デフォルトの名無しさん
2010/05/01(土) 21:54:250473デフォルトの名無しさん
2010/05/01(土) 21:54:53仕様なんて決まらないじゃない、決めるんだよ
確かに、顧客自体もほしい物がわかって担当がいるが
そういう時はラッキー、こっちの言いなりで決めれてしまう。
後で変更になったら、追加を請求できるし。
>作っているうちにより良い手立てがあることに気づくことってざらだよね?
まず、ない
それは設計自体に問題がある。深く考え込まれていない証拠。
まぁ、数十人程度でやってるなら、それでもいいが、100人以上で
開発しているプロジェクトだと、コーディング途中に設計変更なんて
考えられない
0474デフォルトの名無しさん
2010/05/01(土) 21:56:59こういう場合はスパイラルモデル?っていうのがいいのかな?
0475デフォルトの名無しさん
2010/05/01(土) 22:02:37残り三割を決めるためのスケジュールを
「最初から」全体計画に盛り込めないことは多々あるな
下請けの辛い所だよ
俺のノートPC、1024x768なんだよね…
VS2010のバカタレ
0476デフォルトの名無しさん
2010/05/01(土) 22:02:44どかたの方にわかりやすく言うと、道路工事中に水道等をぶち破ったら、
あなたはどう思います?普通は
「設計!、調べんだろ普通!!」って感じで怒鳴りつけるでしょ
それと一緒、コーディングなんて、やってる最中に、これじゃ成り立たない
なんてわかったら、設計者として無能
0477デフォルトの名無しさん
2010/05/01(土) 22:07:020478デフォルトの名無しさん
2010/05/01(土) 22:11:02いつの間にかエンジンの方ばかり変更してしまってスクリプトを全然弄らないという事が結構あるなー
0479デフォルトの名無しさん
2010/05/01(土) 22:39:09うむ、正しいな
数十人どころか数人でやっていても金と工数を貰わない限り設計変更なんてお断りだぜ
0480デフォルトの名無しさん
2010/05/01(土) 22:39:590481デフォルトの名無しさん
2010/05/01(土) 22:42:290482デフォルトの名無しさん
2010/05/01(土) 22:46:37設計なんてなくて、いきなりVC++立ち上げるような連中だろうからなw
0483デフォルトの名無しさん
2010/05/01(土) 22:50:210484デフォルトの名無しさん
2010/05/01(土) 22:56:52だから、コードを書くか書かないの問題ではない、ソフトウェア工学を理解できるか否か
が重要であって、プログラムを書くなんてのは仕様さえ決まれば、なんてことないんだよ
まぁ、商用に耐えうるプログラムを書いたことがない君には分からないだろうけどねw
0485デフォルトの名無しさん
2010/05/01(土) 22:58:11仕様変更つったって、ほとんどはコードの極一部にしか影響しない変更ばかりだよ。
全体に波及するような変更は、たとえやりたくても予算と納期が許さない。
かくして、初期の的外れな仕様のままマスターアップを迎え、
世には箸にも棒にもかからない駄ゲーがあふれることになるのだが、それはまた別のおはなし。
0486デフォルトの名無しさん
2010/05/01(土) 22:59:010487デフォルトの名無しさん
2010/05/01(土) 22:59:130488デフォルトの名無しさん
2010/05/01(土) 23:29:15コード書くのはコーダーの仕事で技術者がなんで
そんなことするのって感じだからな。
0489デフォルトの名無しさん
2010/05/01(土) 23:32:57結局下請けに丸投げで客と下請けの連絡係なんてしてるから仕事の効率が悪いんだ。
0490デフォルトの名無しさん
2010/05/01(土) 23:35:020491デフォルトの名無しさん
2010/05/01(土) 23:41:210492デフォルトの名無しさん
2010/05/01(土) 23:41:46悔しかったら晒しみ
0493デフォルトの名無しさん
2010/05/01(土) 23:52:270494デフォルトの名無しさん
2010/05/02(日) 00:07:29日本人なら普通じゃないの?
で、いまや人売り派遣がないと困る下請け多いんじゃないの?
0495デフォルトの名無しさん
2010/05/02(日) 00:10:170496デフォルトの名無しさん
2010/05/02(日) 00:56:100497デフォルトの名無しさん
2010/05/02(日) 01:00:360498デフォルトの名無しさん
2010/05/02(日) 01:56:25そういう趣味ならいいけど、必要だと思ってるなら救いようのないヴァカ。
0499デフォルトの名無しさん
2010/05/02(日) 05:36:470500デフォルトの名無しさん
2010/05/02(日) 08:28:16職場環境相談室じゃねーんだよ。
0501デフォルトの名無しさん
2010/05/02(日) 09:56:20・・・という話を続けるのもスレチではあるのだが
0502デフォルトの名無しさん
2010/05/02(日) 11:12:05class Test;
}
class Test;とするとclass Test{}と同じ意味になるのですか?
0503デフォルトの名無しさん
2010/05/02(日) 11:14:310504デフォルトの名無しさん
2010/05/02(日) 11:16:130505502
2010/05/02(日) 11:17:24class Test;
namespace hoge{}
って、普通なら書く気がすんだけど
0506デフォルトの名無しさん
2010/05/02(日) 11:18:230507デフォルトの名無しさん
2010/05/02(日) 11:34:25hoge::Test を宣言したかったんでしょ
0509デフォルトの名無しさん
2010/05/02(日) 14:35:56この関数をDLLにしてエクスポートするにはどうすればいいんですか?
0510デフォルトの名無しさん
2010/05/02(日) 14:48:15DLLって何ですか?
ここはC++相談室ですけど。
0511デフォルトの名無しさん
2010/05/02(日) 14:59:36使ったことある?
0512デフォルトの名無しさん
2010/05/02(日) 15:27:51メンバ変数をpublicにしているようですが、お前らだったらprivateにする?
0513デフォルトの名無しさん
2010/05/02(日) 15:38:14外から書き込まれるのを禁止したかったら、コメントを入れておけば十分
privateにして、わざわざアクセサ書くの面倒だし、無駄なオーバーヘッドあるし。
0514デフォルトの名無しさん
2010/05/02(日) 15:43:42と思いつつも面倒だからpublicにしてしまう
0515デフォルトの名無しさん
2010/05/02(日) 15:47:56実装するのが普通だろうが、一人でやってるようなものはすべてpublicでOK
0516デフォルトの名無しさん
2010/05/02(日) 15:56:330517デフォルトの名無しさん
2010/05/02(日) 15:59:380518デフォルトの名無しさん
2010/05/02(日) 16:10:26中途な知識でinlineなんて言葉使うと突っ込まれるぞ
ちなみに、inlineとしてコンパイラからみえないこともあるんだぞZ
0519512
2010/05/02(日) 16:10:38get/setだらけのクラスが出来上がって気持ち悪いことになりました
でも、publicだらけにするのも気持ち悪い
0520デフォルトの名無しさん
2010/05/02(日) 16:15:04後でエラーチェックが必要になったときとかにその変数にアクセスしてる全ての箇所を
修正するのとget/setの中だけ修正するのとどっちが仕様変更に強い良いプログラムかってことだな。
0521デフォルトの名無しさん
2010/05/02(日) 16:31:10どういう意味か教えてほしい
0522デフォルトの名無しさん
2010/05/02(日) 16:38:43inlineとしても展開されないことがあるといいたいんだろう。
でも展開されないアクセサはまずないだろう。
0523デフォルトの名無しさん
2010/05/02(日) 16:40:39そのような値を持つだけで機能が無いものは構造体にしてもいいと思うよ。
機能を持ち、メンバー変数を隠蔽するのはclassでと使い分けるのもいいと思う。
0524デフォルトの名無しさん
2010/05/02(日) 17:23:09「GetER()->AddErrorMessage("エラー")」という箇所がありました。
エラーを処理しているメンバ関数みたいなのですが
なぜ関数にアロー演算子がついているのでしょうか?
GetER->AddErrorMessage("エラー");
ならオブジェクトポインタから関数にアクセスしていると分かるのですが・・・
0525デフォルトの名無しさん
2010/05/02(日) 17:25:53ヒント: 戻り値
0526デフォルトの名無しさん
2010/05/02(日) 17:28:02CFoo* GetER();
ってな、感じで宣言されていませんか?
0527デフォルトの名無しさん
2010/05/02(日) 17:31:25はい、されてます!
こんな感じになってます。
static CErrorReport* GetER(){return &m_ErrorReport;};
ちなみにm_ErrorReportは下記です
static CErrorReport m_ErrorReport;
0528デフォルトの名無しさん
2010/05/02(日) 17:34:55GetEDがCErrorReportへのポインタを返すんですよね
だから、その戻値をアロー演算子で参照して、AddErrorMessageメソッドを呼んでる
って感じですね
0529デフォルトの名無しさん
2010/05/02(日) 17:43:49ありがとうございます。
戻り値をアロー演算子で参照ですか・・・。
やっている事は何となく分かったのですが、どうしてそんな間接的な方法を取るのでしょか?
直接オブジェクトから呼び出してはダメなのでしょうか?
0530デフォルトの名無しさん
2010/05/02(日) 17:57:37簡単に書くと(クラスの中)
CErrorReport* errorReport = GetER();
errorReport->AddErrorMessage("エラー");
と2行で書いていもいいんですよ
GetER()->AddErrorMessage("エラー");
と書いたほうが1行でかけますよね?
ただ面倒でかつ、errorReportの使い道がそこしかないなら、
0531デフォルトの名無しさん
2010/05/02(日) 17:57:590532デフォルトの名無しさん
2010/05/02(日) 17:59:25あら、日本語がおかしくなっちゃったw
ただ面倒でかつ、errorReportの使い道がそこしかないなら、
GetER()->AddErrorMessage("エラー");
と書いたほうが1行でかけますよね?
0533デフォルトの名無しさん
2010/05/02(日) 18:05:15static CErrorReport* GetER(){
return m_ErrorReport.isValid()
? &m_ErrorReport
: m_ErrorReport2.isValid()
? &m_ErrorReport2
: 0
;
};
みたいなことができるから。
0534デフォルトの名無しさん
2010/05/02(日) 18:14:580535デフォルトの名無しさん
2010/05/02(日) 18:15:420536デフォルトの名無しさん
2010/05/02(日) 18:24:26>>531>>533 は関数の実装側にとってのメリットの話。
>>530>>532>>534 は関数を呼び出す側の記述スタイルの話。
0537デフォルトの名無しさん
2010/05/02(日) 18:28:540538デフォルトの名無しさん
2010/05/02(日) 18:31:10この値は開放しなくていいのかなとか
なんか気になるんですけど
みなさんはそうでもないんですか?
0539デフォルトの名無しさん
2010/05/02(日) 18:35:240540デフォルトの名無しさん
2010/05/02(日) 18:35:42普通、例外処理でしょ
0541デフォルトの名無しさん
2010/05/02(日) 18:38:26わざわざポインタで返すってことは暗に無効値を返すぜって言ってるようなもんだろう
0542デフォルトの名無しさん
2010/05/02(日) 18:52:11参照を返した場合それの解放ってどうするんでしょうか?
ちなみにあまり一連の質問応答にはついていけてません
ただ、参照を返すという一言を見て生じた疑問です
0543デフォルトの名無しさん
2010/05/02(日) 19:02:29よほど変な設計になっていない限り、呼出元は解放処理を気にする必要はない。
Foo& foo = obj.GetFoo();
delete &foo; // obj < おいやめろ馬鹿!
0544デフォルトの名無しさん
2010/05/02(日) 19:04:25値を取得できたってことは,そのクラスでつくったってこと
あとはわかるよな?
0545デフォルトの名無しさん
2010/05/02(日) 19:26:07{
int x;
};
class sub1 : public base
{
};
class sub2 : public sub1
{
};
・・・
class sub10 : public sub9
{
};
みたいな感じで継承を繰り返すときに
sub10から一発でxを初期化する方法はある?
仮想継承はコストがかかるので無し
引数でリレーするのは書くのがめんどくさいです
0546デフォルトの名無しさん
2010/05/02(日) 19:33:20そもそも、アプリの上位のレベルでdeleteを書かなくちゃ
いけない様な設計は危険すぎると思います。
0547デフォルトの名無しさん
2010/05/02(日) 19:36:060548デフォルトの名無しさん
2010/05/02(日) 19:38:24そういうインターフェースがごろごろ転がってるから油断ならない
0549デフォルトの名無しさん
2010/05/02(日) 19:40:14ご回答ありがとうございます
そういうケースでは参照で返したらいいんじゃないかっていう話だったんですね
関数、参照で返すしか見てなかったためにあほな質問してすいませんでした
0550デフォルトの名無しさん
2010/05/02(日) 20:15:27sub10::sub10() { x = 1; }
0551デフォルトの名無しさん
2010/05/02(日) 20:17:100552デフォルトの名無しさん
2010/05/02(日) 20:21:520553551
2010/05/02(日) 20:25:54見なかったことにして下さい
0554デフォルトの名無しさん
2010/05/02(日) 20:34:43class sub10 : public sub 9{ public: sub10(){ new(base::px) int; } }: //初期化リストは使えないけど関数内部でplacement new
そういえば仮想継承しないのはコストが嵩むからだったな。
pxに動的なメモリ空間を入れるのも気に食わないだろう。boostのalignment_storageでメンバに持つように書くといい。
0555デフォルトの名無しさん
2010/05/02(日) 20:39:090556デフォルトの名無しさん
2010/05/02(日) 20:43:52遙か彼方の派生クラスからいじくろうと思うこと自体が間違い
設計に問題がある
0557デフォルトの名無しさん
2010/05/02(日) 20:57:02メンバ変数mTestobj、sTestobj
クラスClassTest
って感じの命名規則でおk?
0558デフォルトの名無しさん
2010/05/02(日) 21:00:040559デフォルトの名無しさん
2010/05/02(日) 21:00:080561デフォルトの名無しさん
2010/05/02(日) 21:33:340562デフォルトの名無しさん
2010/05/02(日) 21:37:44int n=func(a(x),b(y),c(z)); //関数
int n=a(x),b(y),z(z); //,演算子
hoge(int x,int y,int z):m1(a(x)),m2(b(y)),m3(c(z)){} //初期化子
0563デフォルトの名無しさん
2010/05/02(日) 21:39:58カンマ演算子は左から順番に評価されると規格で決まっています
初期化子はその並び順は無視して、そのメンバ変数(メンバ変数と決めつけちゃったけど)の宣言の順番で行われます
0564デフォルトの名無しさん
2010/05/02(日) 21:51:33カンマ演算子はオーバーライドしたやつ(boost::assignとかの)は違うんだっけ?
あと、関数の評価順序が不定っていうのはa(),b(),c()に副作用がなければ関係ないんだっけ?
0565デフォルトの名無しさん
2010/05/02(日) 21:54:10初期化子の評価順に従えばメンバーを参照して初期かも可能なのでしょうか?
たとえばこんなかんじ。
class hoge
{
int m1;
int m2;
int m3;
public:
hoge(x)
:m1(a(x)
,m2(m1+b(x))
,m3(c(m2))
{
}
};
0566デフォルトの名無しさん
2010/05/02(日) 21:55:42> カンマ演算子はオーバーライドしたやつ(boost::assignとかの)は違うんだっけ?
オーバーロード?
> あと、関数の評価順序が不定っていうのはa(),b(),c()に副作用がなければ関係ないんだっけ?
関係無いって何?関係はあるだろうが、結果には影響が無いね。
不定なだけで、順番は処理系依存ではあるが、実行はされるから。
0567デフォルトの名無しさん
2010/05/02(日) 21:56:52その例はアプリケーションハンガリアンだと思うよ。
メンバーを示すためにプリフィックスmをつけるのは有益だと思う。
記憶クラスの間違いは型チェックだではコンパイルでチェックできないからね。
0568デフォルトの名無しさん
2010/05/02(日) 22:29:33staticとかならいっそのこと、変数名にそのままstatic_hogehoge_valueという風に組み込んでしまった方が分かりやすいし。
0569デフォルトの名無しさん
2010/05/02(日) 22:30:19いいけど注意して書けよ
0570デフォルトの名無しさん
2010/05/02(日) 23:13:210571デフォルトの名無しさん
2010/05/02(日) 23:22:12VC++2008でやってみたら 初期化の場合は宣言されてる変数順っぽいかもよ
初期化部分が
hoge:m1(1), m2(m1+1), m3(m2+1)
として
int m1,m2,m3
と
int m2,m1,m3
だと結果が異なった
0572デフォルトの名無しさん
2010/05/02(日) 23:26:31>>563の人が
>初期化子はその並び順は無視して、そのメンバ変数(メンバ変数と決めつけちゃったけど)の宣言の順番で行われます
とすでにいっているんだけど
0573デフォルトの名無しさん
2010/05/02(日) 23:29:53ごめんなさい。>>565に驚いちゃって見落としてました。
0574デフォルトの名無しさん
2010/05/02(日) 23:43:39宣言順でもいいけど意図が伝わらないと困るかもしれない
0575デフォルトの名無しさん
2010/05/03(月) 00:29:590576デフォルトの名無しさん
2010/05/03(月) 00:47:14エスパーしたんで要点がズレてたらすまんが、機能的には同じ。
もともと、C言語では
enum Hoge {
ABC,
};
と書いたら、使うときも
enum Hoge h = ABC;
~~~~~
みたく、明示的に enum を書かないといけなくて、長ったらしくて面倒なのでtypedefしてた。つまり、
typedef enum Hoge {
ABC
} Hoge;
と書いておくと、enum Hoge に Hoge という名前がつくので、
Hoge h = ABC;
と書けるようになって便利だった。
C++では明示的に enum と書かなくてもいいよ、という風に規約が変わったので、typedefは不要になった。(文法的には正しいので使えるけど)
typedef struct ... も同様の理由。
C++で書くなら typedef は不要、と考えていいとオモ。
0577デフォルトの名無しさん
2010/05/03(月) 00:56:15ありがとうございます。スタイルの問題なんですね
0578デフォルトの名無しさん
2010/05/03(月) 02:31:54信じがたいというかタダの嘘だよ
シングルスレッドでそんなの間抜けなコードじゃなく不可能なコードだし。
0579デフォルトの名無しさん
2010/05/03(月) 13:21:05>>576
みたいな初心者に優しい方ばっかならいいのにな
0580デフォルトの名無しさん
2010/05/03(月) 13:23:09{
hoge(int x) : m_x(x), m_y(get_x())
{
}
int get_x(void) const
{
return m_x;
}
int m_x, m_y;
};
これって未定義?
get_xの時点で暗黙にthisを使ってるからアウツだよね?
0581デフォルトの名無しさん
2010/05/03(月) 13:24:31分かって使うならいいんじゃね?
0582デフォルトの名無しさん
2010/05/03(月) 13:28:170583デフォルトの名無しさん
2010/05/03(月) 13:29:16初期化式でthisを使うのは警告出る場合もある
0584デフォルトの名無しさん
2010/05/03(月) 13:31:22VCは警告出るね。抑制してるけど。
0585デフォルトの名無しさん
2010/05/03(月) 13:31:29お前らなら「singleton」 or 「staticだけのクラス」 or 「クラスに属していない関数」 or その他
のどれを使いますか?
0586デフォルトの名無しさん
2010/05/03(月) 13:33:050587デフォルトの名無しさん
2010/05/03(月) 13:33:39singletonが使えるならsingleton。後は気分
0588デフォルトの名無しさん
2010/05/03(月) 13:34:39読み込むタイミングと書き戻すタイミングを制御したい時は
どうせInitialize,Finalizeみたいな関数用意することになるからmonostateにしてまうかも。
0589デフォルトの名無しさん
2010/05/03(月) 13:37:24使わないでいいなら使わないに越したことは無い
0590デフォルトの名無しさん
2010/05/03(月) 13:42:160591デフォルトの名無しさん
2010/05/03(月) 13:48:190592デフォルトの名無しさん
2010/05/03(月) 16:50:010593デフォルトの名無しさん
2010/05/03(月) 18:00:29全部staticなクラスはシングルトンの代替にはならない
0594デフォルトの名無しさん
2010/05/03(月) 18:02:350595デフォルトの名無しさん
2010/05/03(月) 18:09:490596585
2010/05/03(月) 18:12:59お前らやさしいな、ありがとうよ
0597デフォルトの名無しさん
2010/05/03(月) 18:15:240598デフォルトの名無しさん
2010/05/03(月) 18:21:42なかったら只の関数でも十分。
0599デフォルトの名無しさん
2010/05/03(月) 20:38:57どうせインスタンス作らないんだからclassじゃなくてもいいだろって考えなんだけど
0600デフォルトの名無しさん
2010/05/03(月) 20:45:210601デフォルトの名無しさん
2010/05/03(月) 20:48:19実装側に無名namespaceで書けばヘッダ書き換えなくていいから楽だなーと
テンプレートは全然考えてなかった
というかまだ使いこなせない
0602585
2010/05/03(月) 20:53:00意味もなくインスタンスを生成するのはキモいですね
クラスはnamespaceに属させないで、>>599のやり方の時だけnamespaceを使うのは非常識ですかね?
テンプレートは全然わからない & わからないので、使うつもりは無いです
0603デフォルトの名無しさん
2010/05/03(月) 20:53:08用途にあった方を使えばいいんでね?
0604デフォルトの名無しさん
2010/05/03(月) 20:57:02そして隠蔽しなくてもクラスにした方ができることが多い
継承したりtemplate引数に渡したり
0605デフォルトの名無しさん
2010/05/04(火) 02:21:34実装は
var * operator[](int idx){return parray[idx];}
ここでparrayはメンバで、以下の様にします。
var * parray;
使う側が
var x[2][3]とかやります。
次に
var v = x[0][1];
とかやります。
するとまずoperator[]が引数idx=0で呼ばれて、var*を返し、次にvar*の一時オブジェクトに対して->operator[](1)が
コールされるとかそんな感じに動きますか?
0606デフォルトの名無しさん
2010/05/04(火) 02:24:48>ここでparrayはメンバで、以下の様にします。
×var * parray;
○var ** parray;
0607デフォルトの名無しさん
2010/05/04(火) 02:28:39分かりづらいから
やらないほうがいいと思う
0608デフォルトの名無しさん
2010/05/04(火) 02:51:18>var x[2][3]とかやります
この時点で多次元配列なわけだが…
0609デフォルトの名無しさん
2010/05/04(火) 02:54:50C/C++に多次元配列は無いわけだが…
0610デフォルトの名無しさん
2010/05/04(火) 03:32:230611デフォルトの名無しさん
2010/05/04(火) 04:46:08配列の[]とoperator[]って別モンなんですかね??
0612デフォルトの名無しさん
2010/05/04(火) 09:43:11var x(2, 3); とかやって x[1][2] みたいなことはできる。
ちなみに返すのはポインタ(var *)じゃなくて参照(var &)な。
0613デフォルトの名無しさん
2010/05/04(火) 10:21:38これで2次元配列だ。
std::vector<std::vector<var>> array;
0614デフォルトの名無しさん
2010/05/04(火) 10:28:14var x = A[i][j]; や var x = B[i][j][k]; を実現する
operator[]ってどうするんですか?
0615デフォルトの名無しさん
2010/05/04(火) 10:31:15返り値にまたoperator[]する感じ
つまりすごいめんどくさい
0616デフォルトの名無しさん
2010/05/04(火) 10:35:07考え方としては>>613が基本。
var& var1::operator[](int ind);
var1& var2::operator[](int ind)
var2& var3::operator[](int ind)
好きな次元だけ繰り返す。
0617デフォルトの名無しさん
2010/05/04(火) 10:41:00えっ、次元の数だけ型に合わせたoperator[]を用意するんですか><
力任せじゃなく賢い方法無いですか
0618デフォルトの名無しさん
2010/05/04(火) 10:43:170619デフォルトの名無しさん
2010/05/04(火) 10:44:16っMoreEffectiveC++
0620デフォルトの名無しさん
2010/05/04(火) 10:46:180621デフォルトの名無しさん
2010/05/04(火) 10:50:170622デフォルトの名無しさん
2010/05/04(火) 10:53:30そんなあなたにテンプレート。
つ>>613
つboost multi array
0623デフォルトの名無しさん
2010/05/04(火) 10:54:030624デフォルトの名無しさん
2010/05/04(火) 10:54:100625デフォルトの名無しさん
2010/05/04(火) 10:57:280626デフォルトの名無しさん
2010/05/04(火) 10:59:580627デフォルトの名無しさん
2010/05/04(火) 11:08:12どんなフローチャートで勉強したら良いか、の参考にしたいから是非勉強した順に教えて欲しいな
0628627
2010/05/04(火) 11:09:36○お前ら
0629デフォルトの名無しさん
2010/05/04(火) 11:10:560630デフォルトの名無しさん
2010/05/04(火) 11:12:320631デフォルトの名無しさん
2010/05/04(火) 11:13:500632デフォルトの名無しさん
2010/05/04(火) 11:23:01猫でもわかるC言語
Windowsゲームプログラミング
C++ 入門書の次に読む本
Boost C++ Libraries プログラミング
Modern C++ Design
Effective C++
More Effective C++
Exceptional C++
Exceptional C++ Style
0633デフォルトの名無しさん
2010/05/04(火) 11:27:56C++の入門書がねーじゃん
0634632
2010/05/04(火) 11:33:360635デフォルトの名無しさん
2010/05/04(火) 11:44:090636627
2010/05/04(火) 11:53:10THX
やっぱ猫でもわかる〜で導入の後、WinAPI(?)か・・・、俺は今「基礎からのC」で勉強中なので先が長いなあ。
他の人達も>>632みたいな感じで書いてくれると助かる。
0637デフォルトの名無しさん
2010/05/04(火) 11:54:190638627
2010/05/04(火) 11:55:48貴重な情報の一つだけどネットには中々転がってない情報でもある気がする
0639デフォルトの名無しさん
2010/05/04(火) 11:57:11C++の昔の本は仕様が古い場合があるとか(iostream.hとか)
Cを長く使った上でC++を適当に覚えたとかあるから、
今の人には役に立たない事も多いと思う
0640デフォルトの名無しさん
2010/05/04(火) 12:10:31プログラミングの本って面白くないよな
例えば、例題が「女性の平均バストを求めよ」とか少しやる気出るのに
「結城浩」はわかりやすくていいよな
でも、俺は絶対に本でプログラミングの勉強をしたいと思わないな〜
オライリー本は高い&難しいからやめといた方がいいよ
0641デフォルトの名無しさん
2010/05/04(火) 12:12:310642デフォルトの名無しさん
2010/05/04(火) 12:17:31だったりピクチャボックスが自作の萌え絵だったりする本でVC++(C++/CLI)勉強したけど糞も面白くなかったぞ。
0644デフォルトの名無しさん
2010/05/04(火) 12:19:46ぶっちゃけPC覚えた理由ってエロ目的じゃん俺らって
あれと同じノリで簡単なエロツールを作るのを目的に
プログラミングを勉強していくのっていいんじゃないだろうか
0645デフォルトの名無しさん
2010/05/04(火) 12:21:42おっと赤坂玲音さんの悪口はそこまでだ。
0646デフォルトの名無しさん
2010/05/04(火) 12:26:22エロが目的でコンピュータ&プログラミングを覚えたわけではないが、
エロのためにコンピュータ&プログラミングを使っている点では俺と同じ
0647デフォルトの名無しさん
2010/05/04(火) 14:56:21scanf関数が飛ばされて(?)、printf関数が2連続で並んじゃって意味不明になってしまう・・・・・
あと、2つめのwhileループでも、アルファベットで入力すると無限ループになってしまう・・・・・orz
何が原因なのでしょうか。どなたかご助力をお願いします。
※#include<stdio.h>、#define TSUUJOU 0、#define URUUDOSHI 1です。
※main(void)や配列の初期化や、最後の文字表示の部分は簡単なので飛ばしています。
while((which!='y')&&(which!='n')){
printf("通常の年ならyを、閏年ならnを入力してください。");
scanf("%c",&which);
if((which!='y')&&(which!='n')){
printf("入力ミスです!\n");
}
}
while((month<=0)||(12<month)){
printf("何月についての日数を見ますか?");
scanf("%d",&month);
if((month<=0)||(12<month)){
printf("入力ミスです!\n");
}
}
0648デフォルトの名無しさん
2010/05/04(火) 14:57:14↑これは余計でした。すみません。
0649デフォルトの名無しさん
2010/05/04(火) 15:07:29while (which != 'y' && which != 'n') {
printf("通常の年ならyを、閏年ならnを入力してください。");
scanf("%c", &which);
if (which != 'y' && which != 'n') {
printf("入力ミスです!\n");
}
}
while (month <= 0 || 12 < month) {
printf("何月についての日数を見ますか?");
scanf("%d", &month);
if (month <= 0 || 12 < month) {
printf("入力ミスです!\n");
}
}
>printf関数が2連続で並んじゃって意味不明になってしまう
2度目は which に改行が渡されるから
>アルファベットで入力すると無限ループになってしまう
%d に対してアルファベットを入力すると
scanf が失敗して永遠に %d が出てこないので無限ループになる
scanf の戻り値を確認して、失敗したら1文字飛ばしてもう一回 scanf するといった処理が必要になる
0650648
2010/05/04(火) 15:17:37>戻り値を確認して、失敗したら1文字飛ばしてもう一回scanf
すみませんこれがよく分かりません・・・・いや言ってることは分かるのですが方法が全く浮かばなくて・・・・
0651デフォルトの名無しさん
2010/05/04(火) 15:22:000652デフォルトの名無しさん
2010/05/04(火) 15:23:06まず、EOFが返されたらループは終了しないといけない
入力があっても、%d に相当する入力(要するに数値)でないと失敗して 0 を返すので
この場合は1文字読み飛ばす(要するに getchar する)必要がある
0653デフォルトの名無しさん
2010/05/04(火) 15:27:26その場合は
\n が出てくるまで fgets しても良いし、
\n が出てくるまで getchar しても良い
0654648
2010/05/04(火) 15:31:31ありがとうございます。
今読んでる本の索引で調べてみたんですけど、この本(基礎からのC)だとgetcharとかsscanfの使い方が載ってなかったですorz
で、fgetsについてはまだ読んでない関数・構造体・ポインタのページで解説されてるようですし、
皆さんのレスを読んでいると、恐らく1文字読み飛ばしたりするのは自分にとって未習の知識なのではないかと思いました。
なので、せめて読み通すまではオリジナルのコードを書くのはあまりしないようにしておきます。
すみませんでした。
0655デフォルトの名無しさん
2010/05/04(火) 15:53:25勉強でやってるならあんまりそこで詰まらない方がいいよ
もっと大事なことがいっぱいある
0656648
2010/05/04(火) 16:05:58その後で辿ってきた道のりを概観してみろ、ってことですよね
0657デフォルトの名無しさん
2010/05/04(火) 16:14:56後で分かる事もあるし
0658デフォルトの名無しさん
2010/05/04(火) 16:23:060659デフォルトの名無しさん
2010/05/04(火) 16:27:09はっきり言ってC/C++の入出力ライブラリって出来悪いしな
どうしても標準出力に吐く所から勉強が始まるもんで
それだけ見てプログラムとはこういうもんなのかと嫌いになる初心者が結構いるから
0660デフォルトの名無しさん
2010/05/04(火) 16:29:49ios_stateなんてのが出てくる時点で欠陥品
0661デフォルトの名無しさん
2010/05/04(火) 16:30:240662デフォルトの名無しさん
2010/05/04(火) 16:31:060663デフォルトの名無しさん
2010/05/04(火) 18:00:20class T1{
public:
void* operator new(size_t size) { return malloc(size); }
void* operator new(size_t size, size_t n) { return malloc(size); }
};
class T2 : public T1{
public:
void* operator new(size_t size) { return malloc(size); }
};
int main(){
T1 *t2 = new(1000) T2;
return 0;
}
これを実行すると、
「error C2660: 'T2::operator new' : 関数に 2 個の引数を指定できません。」
というエラーが出るのですがなぜでしょうか?
T1の「 new(size_t size, size_t n) 」が継承されているはずなので、エラーにならないと思ったのですが…
0664デフォルトの名無しさん
2010/05/04(火) 18:02:300665デフォルトの名無しさん
2010/05/04(火) 20:27:04だからこそ意義があるんじゃない?
例えば広く使えるライブラリの文字列処理とか。
0666デフォルトの名無しさん
2010/05/04(火) 21:09:10operator>=も自動でオーバーロードしてくれるんですか?
0667デフォルトの名無しさん
2010/05/04(火) 21:11:090668デフォルトの名無しさん
2010/05/04(火) 21:11:510669デフォルトの名無しさん
2010/05/04(火) 21:17:17それをやられると困るシチュエーションが考えられるから
(思い浮かばないけど理論上はね。)
それはない。
自動化させるテクニックはあるよ。
boost operator
でggr
0670デフォルトの名無しさん
2010/05/04(火) 22:08:500671デフォルトの名無しさん
2010/05/04(火) 22:11:450672デフォルトの名無しさん
2010/05/04(火) 22:16:50int main(void){
int a,b,c,max,mid,min;
printf("異なる3つの整数型データをお入力してください");
scanf_s("%d%d%d",&a,&b,&c);
if(a>b){
max=a; min=b;
}
else {max=b; min=a;}
if(c>max){
mid=max; max=c;
}
else if(c>min) mid=c;
else mid=min; min=c;
printf("大-->%d\n中-->%d\n小-->%d\n",max,mid,min);
return 0;
}
異なる3つの整数を入力して大中小を判定するプログラムです。
これでコンパイルにはエラーがないのですが、実行結果が大と小が同じ値になってしまいます。
どこが間違っているでしょうか?
0673デフォルトの名無しさん
2010/05/04(火) 22:18:460674デフォルトの名無しさん
2010/05/04(火) 22:19:270675デフォルトの名無しさん
2010/05/04(火) 22:19:59else { mid=min; min=c; }
0676デフォルトの名無しさん
2010/05/04(火) 22:20:23を
else mid=min, min=c;
か
else{ mid=min; min=c; }
に書き換えよう!
中括弧で囲まずにステートメントを「;」で終了するとif分のelse分が最初のひとつで終わってしまうぞ!
0677デフォルトの名無しさん
2010/05/04(火) 22:21:470679デフォルトの名無しさん
2010/05/04(火) 22:23:490680デフォルトの名無しさん
2010/05/04(火) 22:32:22>>672のメッセージも「お入力してください」になってるし。
流行ってるの?
0681デフォルトの名無しさん
2010/05/04(火) 22:36:50mid=max;
これはmaxにcを格納して、maxをmidに格納するといういみですが、イメージとしては
|| c ||
||___||
|_____| 大きい箱がmid 小さい箱がmax
こんな感じでいいでしょうか?
0682デフォルトの名無しさん
2010/05/04(火) 22:38:11ただのミスですw
0683デフォルトの名無しさん
2010/05/04(火) 22:38:34イメージとか言われても全然分からん。
どこの言語 出身の方?
少なくともC系列じゃないよね?
0684デフォルトの名無しさん
2010/05/04(火) 22:40:020685デフォルトの名無しさん
2010/05/04(火) 22:41:400686デフォルトの名無しさん
2010/05/04(火) 22:41:54宣言を書いてくれないと分からん
0687デフォルトの名無しさん
2010/05/04(火) 22:50:39a = b という代入は、
aという箱の中にbという箱を入れているのではなく
aという箱の中にbという箱の中身を入れている。
0688デフォルトの名無しさん
2010/05/04(火) 22:52:14日本語を誤って使ってしまっては元も子もありませんが、言葉遣いを丁寧にするというのに流行などは関係ありません。
普通です。
0689デフォルトの名無しさん
2010/05/04(火) 23:02:03細かいこと言うと、複製してるだね、
中身を入れるだと移動と取られかねない
0690デフォルトの名無しさん
2010/05/04(火) 23:02:48C系列なのにその誤解は・・・
と思ったら>>687「変数は箱だ」と教わったという事か。
そんなクソみたな例えは止めて、
C/C++でプログラミングしたければ
「メモリ」っていうものについてちゃんと真っ向から向かい合った方がいいよ。
0691デフォルトの名無しさん
2010/05/04(火) 23:26:05「箱」の例えでいいのはBASICだな
C/C++は箱の概念だと間違いなくポインタでつまずく
0692デフォルトの名無しさん
2010/05/04(火) 23:26:370693デフォルトの名無しさん
2010/05/04(火) 23:28:32メタトロンはそのまま移動だよ。
0694デフォルトの名無しさん
2010/05/04(火) 23:57:09苦しめ苦しめ
0695デフォルトの名無しさん
2010/05/05(水) 00:04:380696デフォルトの名無しさん
2010/05/05(水) 00:19:510697デフォルトの名無しさん
2010/05/05(水) 01:12:52ポインタは箱にそれぞれ異なった内容のラベルが貼ってあってそれを書いた紙で考えればいいんじゃないの?
ポインタへのポインタは、「ラベルの内容が書いてある紙が入った箱」のラベルが書いてある紙、で。
0698デフォルトの名無しさん
2010/05/05(水) 01:14:350699デフォルトの名無しさん
2010/05/05(水) 04:19:38関数Aで「obj.table = new int[ 10 * 10 ];」ってやって、
それを関数Bに渡して「delete[] &obj->table;」とやるのはどうなのでしょうか?
0700デフォルトの名無しさん
2010/05/05(水) 05:32:080701デフォルトの名無しさん
2010/05/05(水) 06:51:09大丈夫だけど、確実にdeleteされる保証がもてないならしないほうが良い。
それと、なんで delete[] obj.table; じゃないのだろうかと思う。
というかコンパイルエラーになると思うんだが。
どうしてもやるなら delete[] (&obj)->table; だと思うな。
0702デフォルトの名無しさん
2010/05/05(水) 07:28:48T2::operator new で T1::operator new が隠されている。
http://www.fides.dti.ne.jp/~oka-t/cpplab-hide-overload.html
0703デフォルトの名無しさん
2010/05/05(水) 10:46:49できるけど std::vector<int> を使っとけ
0704デフォルトの名無しさん
2010/05/05(水) 11:08:18{
void *operator new (std::size_t size) { return ::operator new (size); }
};
class Y
{
static void *operator new (std::size_t size) { return ::operator new (size); }
};
動作を見た感じは同じなんですが、上下で違いはありますかね?
0705デフォルトの名無しさん
2010/05/05(水) 11:16:45static付けても付けなくても同じ。
0706デフォルトの名無しさん
2010/05/05(水) 11:19:430707デフォルトの名無しさん
2010/05/05(水) 12:39:33リンク時に関数が外に見えるかどうか、だったかと。
0708デフォルトの名無しさん
2010/05/05(水) 12:41:170709デフォルトの名無しさん
2010/05/05(水) 12:41:510710デフォルトの名無しさん
2010/05/05(水) 12:50:580711デフォルトの名無しさん
2010/05/05(水) 19:54:34これはプログラマーが任意に作成することができるオプションなのでしょうか?
これをコンパイルすると、マクロが定義され機能のON/OFFが出来るってことでおk?
>--with-gthread
> pthreadの代わりにgthreadを使用する。
>--with-[native|core2duo|athlon64|atom|ppc7400|ppc7450]
> CPUに合わせた最適化
他にはalsa、pangoの設定等など
0712デフォルトの名無しさん
2010/05/05(水) 19:55:400713デフォルトの名無しさん
2010/05/06(木) 06:20:48クライアント領域がサイズ変更可能で境界線を持たないウインドウはどうすれば作成できますか?
0714デフォルトの名無しさん
2010/05/06(木) 06:26:150715デフォルトの名無しさん
2010/05/06(木) 12:51:22循環参照が生じていないように気をつけてしようしているつもりではありますが、
もし生じていた場合にそれを検出する方法はありませんでしょうか?
(デバッグビルドでだけ検出できれば十分です。リリースビルドで検出できなくても諦めます。)
よろしくお願いいたします。
0716デフォルトの名無しさん
2010/05/06(木) 12:57:36丁度話題になっているようだ。
Boost総合スレ part8
http://pc12.2ch.net/test/read.cgi/tech/1251446016/912
0717715
2010/05/06(木) 13:06:09その話題を投稿したのは私です・・・。
boost::shared_ptrの循環参照について調べていて例えが分かりやすい
と思ったのでBoostスレで例のURLを紹介しました。
一方、"循環参照が生じているかどうかを検出する方法"については
boost::shared_ptrに限らずstd::tr1のものも含むという事と、
Boostには"循環参照が生じているかどうかを検出する方法"がない事を私は知っているので、
一般のC++スレで聞くべきと思いこちらで聞きました。
0718デフォルトの名無しさん
2010/05/06(木) 13:14:28ここらへんから使えそうなの拾い出してもらえないかい?
http://stackoverflow.com/search?q=shared_ptr+detect+cycle
0719デフォルトの名無しさん
2010/05/06(木) 13:17:19これでどう?
http://lists.boost.org/boost-users/2006/11/23527.php
0720デフォルトの名無しさん
2010/05/06(木) 13:25:19ありがとうございます。
There is an example in libs/smart_ptr/test/collector_test.cpp that shows how
to use libs/smart_ptr/src/sp_collector.cpp to detect (and optionally
reclaim) shared_ptr cycles. You have to #define BOOST_SP_ENABLE_DEBUG_HOOKS
for your project and add sp_collector.cpp to it.
実は既にBoostにあるんですね。
全然分かりませんでした。
ありがとうございました。
0721デフォルトの名無しさん
2010/05/06(木) 15:34:330722デフォルトの名無しさん
2010/05/06(木) 15:39:25非constメンバ関数からもconstメンバ関数からも呼べるように多重定義してある
本当はmutableを使うとconstメンバ関数一個で済むんだけど、mutableは
出来るだけ使わないようにって不文律があるんでな
そうしたければそうしてもいい
0723デフォルトの名無しさん
2010/05/06(木) 15:41:44両方あると便利だから。
--
Ex.:
class Foo {
int get() const {return x;}
int get() {return x;}
};
Foo a;
Foo const & b = a;
a.get(); // 非const版が呼ばれる
b.get(); // const版が呼ばれる(非const版は呼べない)
0724デフォルトの名無しさん
2010/05/06(木) 15:44:40ありがとうございました
0725デフォルトの名無しさん
2010/05/06(木) 15:47:10おまえ、その説明で満足なんか?
0726デフォルトの名無しさん
2010/05/06(木) 15:57:04class Foo {
MyClass mem;
public :
const MyClass& get_raw_data() const {return mem;}
MyClass& get_raw_data() {return mem;}
};
これで意義が分かるのでは。
0727デフォルトの名無しさん
2010/05/06(木) 16:06:30あほかwwww
0728デフォルトの名無しさん
2010/05/06(木) 16:09:170729デフォルトの名無しさん
2010/05/06(木) 20:26:17{
// ストリームを使って何か処理
}
これって引数がテキストモードなのかバイナリモードなのか判断する方法はありますか?
0730デフォルトの名無しさん
2010/05/07(金) 16:15:510731デフォルトの名無しさん
2010/05/07(金) 16:32:590732デフォルトの名無しさん
2010/05/07(金) 16:33:53>class BBB : public AAA {
>}
こういう形だと見覚えないかな?
0733デフォルトの名無しさん
2010/05/07(金) 18:04:27ttp://journal.mycom.co.jp/articles/2008/06/03/bsdcan6/index.html
0734デフォルトの名無しさん
2010/05/07(金) 18:57:091/pow(n, x)を高速で計算するにはどうすればいいですか?
誤差はあってもいいです。実値より大きくずれなければ。
1 < n < 3000000 、 0 < x < 1
0735デフォルトの名無しさん
2010/05/07(金) 18:59:56>誤差はあってもいいです。実値より大きくずれなければ。
これが難しいんだよ
nの値によってズレ方が変わるからな
条件分けが必要
0736デフォルトの名無しさん
2010/05/07(金) 19:23:49例えば2重のループでnとxを繰り返すなら、ln(n)を配列に保存してexp(ln(n)*x)の式で再利用する。
0737デフォルトの名無しさん
2010/05/07(金) 19:27:21pow関数はexpに展開するのが標準って事ですか。
0738デフォルトの名無しさん
2010/05/07(金) 19:36:20それくらい試せば良いじゃん。
0739デフォルトの名無しさん
2010/05/07(金) 19:38:09expをマクローリン展開して上位のこうだけ使うのもありげてすが。
実測がいいですね。
0740デフォルトの名無しさん
2010/05/07(金) 19:45:04> expをマクローリン展開して上位のこうだけ使うのもありげてすが。
それはexpの実装で既に行なわれていそうな気がしてならないけど。
まあ誤差がどのくらいまで許せるのかってことに大いに依存するよね。
0741740
2010/05/07(金) 19:47:03あとxの絶対値が1未満ってのはマクローリン展開において
すごい収束がよくなりそうだけど、それでもn=3000000は
巨大すぎて誤差がデカめになりそうだ。
まあ実際にやってみてよ!
0742デフォルトの名無しさん
2010/05/07(金) 19:49:400743740
2010/05/07(金) 19:58:13どういう数列を想定しているのかしらないけど、普通はないよ。
例えば数列{log(n)|n=1, 2, 3, 4, ・・・}であれば漸化式はない。
しかしながら
log(2), log(4), log(8), log(16), ・・・
すなわち
{log(2^n)|n=1, 2, 3, 4, ・・・}
のような数列だったりすれば
log(2^n) = n * log(2)
と変形する事で容易に計算できる。
0744デフォルトの名無しさん
2010/05/07(金) 21:56:00こういう奴って馬鹿でしょ?
試さないとわからないのか?
しかも、
FuncA FuncBを比較したとき
FuncAの実行時間が短かったとしたとしても、今後永続的に
FuncAの実行時間がFuncBの実行時間よりも短いなんてどうしたらいえる?
0745デフォルトの名無しさん
2010/05/07(金) 22:05:210746デフォルトの名無しさん
2010/05/07(金) 22:20:38同感
具体的にどこでどんなアルゴリズムが使われていて、
それがどのくらい一般的かを示したうえで
定量的な考察を述べるならともかく、
そのへん全然わかんねークルクルパーが態度だけでかいのは許し難いね
直列を前提とした場合に遅いと言われていたアルゴリズムが、
並列もありになったら話が違ってきたとかなら読み応えがあるのに
そういう内容がないよう
0747デフォルトの名無しさん
2010/05/07(金) 22:30:37結局のところ測るしかないんだよ
0748デフォルトの名無しさん
2010/05/07(金) 22:43:14無視可能な係数の範囲は分かるけどね
0749デフォルトの名無しさん
2010/05/08(土) 08:58:000750デフォルトの名無しさん
2010/05/08(土) 10:28:58ぐぐっても1文字のデミリタ用のしかでてきませんでした。
boostも試してみましたが1文字分割しかできません。
0751デフォルトの名無しさん
2010/05/08(土) 12:41:10割と使われそうな内容なのになんでグーグルででてこないんだろう・・・検索の仕方悪いのかな・・・
グーグルで出てくるのは全部find_fist_ofでデミリタ検索してるから"abc"って渡すとaとbとcで区切るんですね。
単にそれをfindにするだけでした。
0752デフォルトの名無しさん
2010/05/08(土) 12:59:19デリミタです><
0753デフォルトの名無しさん
2010/05/08(土) 13:02:000754デフォルトの名無しさん
2010/05/08(土) 17:40:32謝罪の心が感じられるので特別に許してあげる。
0755デフォルトの名無しさん
2010/05/08(土) 17:52:28regex_token_iteratorってのがあるみたいだけど、わざわざ正規表現使うのもアレだな
0756デフォルトの名無しさん
2010/05/08(土) 18:02:26~instance()を呼び出すだけじゃダメなの?
0757デフォルトの名無しさん
2010/05/08(土) 18:12:140758デフォルトの名無しさん
2010/05/08(土) 19:12:090759デフォルトの名無しさん
2010/05/08(土) 19:16:25ライブラリ自作して満足してるな。
具体的に作りたいものあるけど、毎日気が乗らない。
0760デフォルトの名無しさん
2010/05/08(土) 19:28:060761デフォルトの名無しさん
2010/05/08(土) 19:43:09deleteから~instance()が呼び出されるわけであって
~instance()がメモリを開放するわけでもない
0763デフォルトの名無しさん
2010/05/08(土) 20:09:10boostは遅いからやめておけ
自作したほうがいい
0764デフォルトの名無しさん
2010/05/08(土) 21:34:49俺的には HDL のウイザードとジェネレータが最高傑作かな
俺自身がそのコードを触れなくなってしまったのが悲しい
0765デフォルトの名無しさん
2010/05/08(土) 21:53:11噴いたw
大風呂敷にもほどがあんだろ?w
0766デフォルトの名無しさん
2010/05/08(土) 22:16:36十分な速度が出ていると思うが。
自作とか不可能です。
0767デフォルトの名無しさん
2010/05/08(土) 22:19:44あの程度の速度で十分なら使えば?
0768デフォルトの名無しさん
2010/05/08(土) 22:27:46ああ、いや俺は別人だ。
まあ十分だろ。
boost::xpressiveね。
0769デフォルトの名無しさん
2010/05/08(土) 22:29:05そう居ないと思うが。
0770デフォルトの名無しさん
2010/05/08(土) 22:31:52boostの凄さは速度じゃないぞ
あの、汎用性だぞ
確かに、あそこまで汎用的なクラスライブラリを自作できる奴
少ないだろが、特定の処理だけの速度なら超えれるぞ
0771デフォルトの名無しさん
2010/05/08(土) 22:34:15にここをこうすれば良いッスよってレクチャーしてくださいよ
0772デフォルトの名無しさん
2010/05/08(土) 22:38:44実際にそれより速くて色々と安全なスマポを
自作できるやつって少ないんだよね。
Loki Libraryのスマポにすら遅いとか
言うやついるしなぁ。
0773デフォルトの名無しさん
2010/05/08(土) 22:41:55それぐらいできてもらわないと困るわ
0774デフォルトの名無しさん
2010/05/08(土) 22:43:12VISTAが遅いと評判だったが、VISTAを自作できる奴が多いとは
とても思えんが?
0775デフォルトの名無しさん
2010/05/08(土) 22:44:190776デフォルトの名無しさん
2010/05/08(土) 22:45:38俺って頭いいなぁ
0777デフォルトの名無しさん
2010/05/08(土) 22:47:32遅いというなら自作ができるのがC++のメリット。自由ね作ればいい。
だけどshared_ptrより速い同等な機能のスマポはまず作れないということ。
機能制限版を作ったとしてもshared_ptrよりわずかに速いだけ。
0778デフォルトの名無しさん
2010/05/08(土) 22:52:09C++屋なら、どこで破棄されるか分からないのは気持ち悪く感じるはず
そうでないなら、JAVAやC#なんてオコチャマ言語でも使ってればw
0779デフォルトの名無しさん
2010/05/08(土) 22:55:340780デフォルトの名無しさん
2010/05/08(土) 22:55:370781デフォルトの名無しさん
2010/05/08(土) 22:58:50shared_ptrを何だと思ってるんだろう
0782デフォルトの名無しさん
2010/05/08(土) 22:59:14コンテナにポインタ入れてポリモーフィズムやらせたくないの?
0783デフォルトの名無しさん
2010/05/08(土) 23:02:20コンテナにポインタ入れるのになぜshared_ptr?
お前はまずC++を勉強してからレスしろ
0784デフォルトの名無しさん
2010/05/08(土) 23:04:32楽で安全だからだろ?
0785デフォルトの名無しさん
2010/05/08(土) 23:05:54shared_ptr 使ったらどこで破棄されるか分からなくなる、などということはない。
実行時に決まるようになるだけ。
0786デフォルトの名無しさん
2010/05/08(土) 23:14:01>>778
> C++屋なら、どこで破棄されるか分からないのは気持ち悪く感じるはず
うむ。だからshared_ptrを使うんだけど。
0787デフォルトの名無しさん
2010/05/08(土) 23:28:190788デフォルトの名無しさん
2010/05/08(土) 23:31:49右辺値参照があれば話は変わるが
0789デフォルトの名無しさん
2010/05/08(土) 23:32:42ヘンテコな名前の方じゃないですよねw
0790デフォルトの名無しさん
2010/05/08(土) 23:36:03え?
コンテナに生はいかんでしょ
0791デフォルトの名無しさん
2010/05/08(土) 23:36:200792デフォルトの名無しさん
2010/05/08(土) 23:37:09なぜ?
0793デフォルトの名無しさん
2010/05/08(土) 23:39:580794デフォルトの名無しさん
2010/05/08(土) 23:40:420795デフォルトの名無しさん
2010/05/08(土) 23:40:450796デフォルトの名無しさん
2010/05/08(土) 23:43:34循環参照以外の問題ってあるっけ?あれも対策あるし。
0797デフォルトの名無しさん
2010/05/08(土) 23:44:37std::vector<int*> v(10);
v[3]=new int(4);
delete v[3]; //更新前に削除しないとね。あーめんどくせ
v[3]=new int(3);
v.clear(); //盛大にリーク
スマポなら
std::vector<shared_ptr<int>> V(10);
v[3]=make_shared<int>(4);
v[3]=make_shared<int>(3);//スマポは更新前の値なんて気にしません。
v.claser();//きれいに削除
0798デフォルトの名無しさん
2010/05/08(土) 23:48:00× v.claser();//きれいに削除
○ v.clear();//きれいに削除
0799デフォルトの名無しさん
2010/05/08(土) 23:49:460800デフォルトの名無しさん
2010/05/08(土) 23:49:52JAVAでもやれば
0801デフォルトの名無しさん
2010/05/08(土) 23:51:490802デフォルトの名無しさん
2010/05/08(土) 23:52:03選択肢が広いという利点がある
0803デフォルトの名無しさん
2010/05/08(土) 23:52:480804デフォルトの名無しさん
2010/05/08(土) 23:55:180805デフォルトの名無しさん
2010/05/09(日) 00:00:250806デフォルトの名無しさん
2010/05/09(日) 00:25:39ムーブかスワップでソートを実装すればできるんじゃね?
0807デフォルトの名無しさん
2010/05/09(日) 00:45:59自分のコードだけで使うなら勝手に削除してくれるのはわかるんだけど
ライブラリに生ポインタ渡さないといけない場合、まだライブラリが使ってるのに削除しちゃったりしないか考えてると
よくわからなくなってくる
0808デフォルトの名無しさん
2010/05/09(日) 00:46:120809デフォルトの名無しさん
2010/05/09(日) 00:48:32事実 std::sort などはそう要求している(C++0xで)
0810デフォルトの名無しさん
2010/05/09(日) 00:49:54ライブラリを使う時に shared_ptr を複製して、
ライブラリの後始末をする時に破棄すればいい
0811デフォルトの名無しさん
2010/05/09(日) 00:51:05ライブラリのドキュメントを読めばすむ問題。
0812デフォルトの名無しさん
2010/05/09(日) 00:54:35なるほど
そういうことをするラッパークラスを作るのがいいのかなぁ
0813デフォルトの名無しさん
2010/05/09(日) 02:42:53std::vector<MyClass> vecと
std::vector<MyClass*> vec
ってどっちがいいの?
0814デフォルトの名無しさん
2010/05/09(日) 02:45:410815デフォルトの名無しさん
2010/05/09(日) 02:53:16後者はboost::ptr_vectorに入れた方が何かと都合がいい
0816デフォルトの名無しさん
2010/05/09(日) 02:54:10あと前者はそもそもポリモーフィズムできんぞ
コンテナに入れるオブジェクトのサイズは一定でないと
0817デフォルトの名無しさん
2010/05/09(日) 02:56:38この手の質問する馬鹿がポリモーフィズムなんて分かるかよ、ボケ
0818デフォルトの名無しさん
2010/05/09(日) 03:47:340819デフォルトの名無しさん
2010/05/09(日) 05:09:02ポインタとセックスは生が最高なんだよ
0820デフォルトの名無しさん
2010/05/09(日) 05:11:120821デフォルトの名無しさん
2010/05/09(日) 08:55:30> セックスは生が最高
そんなでもないんだぜ、案外
0822デフォルトの名無しさん
2010/05/09(日) 09:11:040823デフォルトの名無しさん
2010/05/09(日) 09:13:40メソッドじゃなくてメンバ関数ね。
メリットも何もないと死ねる。
例えば
int foo(const MyClass& arg)
{
return arg.m_func();
}
でm_func()がconstメンバ関数じゃないとコンパイルエラー。
0824デフォルトの名無しさん
2010/05/09(日) 09:16:11コピーや変態キャストに伴うメモリ状態同一性が問われる気持ち悪いコードを書いているときも結構諜報する。
0825デフォルトの名無しさん
2010/05/09(日) 09:17:13int foo(MyClass& arg)
{
return arg.m_func();
}
とすれば、いいのでは?
0826デフォルトの名無しさん
2010/05/09(日) 09:18:53,、 '";ィ'
________ /::::::/l:l
─- 、::::;;;;;;;;;`゙゙''‐ 、 __,,,,......,,,,_/:::::::::/: !| またまたご冗談を
. : : : : : : `゙'ヽ、:::゙ヾ´::::::::::::::::::::::`゙゙゙'''‐'、. l|
、、 . : : : : : : : : r'":::::::::::::::::::::::::,r':ぃ::::ヽ::::::::ヽ! ,、- 、
.ヽ:゙ヽ; : : : : : :ノ:::::::::::::::::::::;;、-、、゙::: rー-:'、 / }¬、
. \::゙、: : : :./::::::::::::::;、-''":::::::::: ,...,:::,::., :::':、 _,,/,, ,、.,/ }
ヽ:ヽ、 /::::::::::::::::::::::::: _ `゙''‐''" __,,',,,,___ /~ ヾ::::ツ,、-/
`ヽ、:::::::::;;;、、--‐‐'''''',,iニ- _| 、-l、,},,  ̄""'''¬-, ' ''‐-、 .,ノ'゙,i';;;;ツ
_,,,、-‐l'''"´:::::::' ,、-'" ,.X,_,,、-v'"''゙''yr-ヽ / ゙゙'ヽ、, ,.' j゙,,, ´ 7
,、-''" .l:::::::::::;、-''" ,.-' ゙、""ヾ'r-;;:l 冫、 ヽ、 / __,,.ノ:::::ヽ. /
l;、-'゙: ,/ ゞ=‐'"~゙゙') ./. \ / '''"/::::;:::;r-''‐ヽ
,、‐゙ ヽ:::::..,.r'゙ ,,. ,r/ ./ ヽ. ,' '、ノ''" ノ
,、‐'゙ ン;"::::::. "´ '゙ ´ / ゙、 ,' /
' //::::::::: {. V /
/ ./::::::::::::: ', / /
. / /:::::::::::::::::. ',. / ,.、 /
0827デフォルトの名無しさん
2010/05/09(日) 09:19:08fooの中で引数に渡したオブジェクトが変更されてたら困るだろ。
0828デフォルトの名無しさん
2010/05/09(日) 09:20:520829デフォルトの名無しさん
2010/05/09(日) 09:22:260830デフォルトの名無しさん
2010/05/09(日) 09:22:390831823
2010/05/09(日) 09:25:26一体全体どこの言語ご出身の方かしりませんが、
まあ適当な書籍、『Exceptional C++』とかを熟読して
constの有用性について学んでください。
それで納得できないならC++は使えない。間違いなく。
0832デフォルトの名無しさん
2010/05/09(日) 09:28:59それはわかりますが、fooの中では、”オブジェクトの変更をしない”と覚えておけばいいだけでは?
0833デフォルトの名無しさん
2010/05/09(日) 09:32:28constが導入されていない時代はまさにそれだった。
それを明示的に示し、違反が合った場合にはコンパイラが自動的にエラーを出せる様にした
システムがconstとconstメソッド。
0834デフォルトの名無しさん
2010/05/09(日) 09:32:58const 付いていれば、変更されないのが誰にでも理解できるし。
0835デフォルトの名無しさん
2010/05/09(日) 09:33:44ちなみにfooにがconstメンバ関数でもnon-constメンバ関数でも、
普通にconst MyClass& argのargから呼び出す事は可能なので、
毎回const版とconstじゃない版を用意する必要はない。
0836デフォルトの名無しさん
2010/05/09(日) 09:34:40変更されないことをコンパイラはどうやって知ればいい?
関数の中の処理を全て検査した後に「このポインタ(参照)の先にあるメモリは変更されない」と分かるというのなら、実用性がなさ過ぎて最適化の阻害になる。
0837デフォルトの名無しさん
2010/05/09(日) 09:34:54constの目的を理解できないアホでも間違いを起こさないようにするのがconstの意義。
mutableやconst_cast使いまくりでconstの意義を破壊するのが基地外。
0838デフォルトの名無しさん
2010/05/09(日) 09:35:070839デフォルトの名無しさん
2010/05/09(日) 09:36:52それにfooの中では”オブジェクトの変更をしない”と覚えておいても、
そのfooが呼び出す別のメンバ関数がオブジェクトを変更してしまう可能性も考えられる。
小さなコードなら良いけど、そのすべてを記憶だけでやると危険なことになりかねない。
0840デフォルトの名無しさん
2010/05/09(日) 09:37:54そうですか
なぜこのようなことを聞いたというと
例えば、std::vectorでも
iterator begin()
const_iterator begin() const
と2つも実装してるみたいだし、面倒では?
と思ったからです。使う側は面倒ではないですけど。
0841デフォルトの名無しさん
2010/05/09(日) 09:42:010842デフォルトの名無しさん
2010/05/09(日) 09:44:16面倒依然に、その二つは機能が違う。
非constのbegin関数はコンテナの中を変更することが可能なiteratorを返すが、begin() constはコンテナの中を変更できないわけで。
0843デフォルトの名無しさん
2010/05/09(日) 09:56:47いや、だからその変更できないようなiteratorをあえて使う必要があるか?ということです。
変更できるiteratorを取得しても、変更しなければいいだけの話では?
0844デフォルトの名無しさん
2010/05/09(日) 10:00:140845デフォルトの名無しさん
2010/05/09(日) 10:00:26未来永劫それが徹底できるならね
0846デフォルトの名無しさん
2010/05/09(日) 10:03:250847デフォルトの名無しさん
2010/05/09(日) 10:08:26関数の内部で非constの操作がコンパイルエラーになる
要するにうっかり防止、人間はミスをする前提で考えるのが常識
拳銃についてるセーフティみたいなもんだよ
あとconst参照にしてればテンポラリオブジェクトを渡すのが合法になるがこれも結構大きなメリットになる
iteratorに関しては色々理由があってconst_iteratorを選択するメリットはあまり無いんじゃなかったか?
0848デフォルトの名無しさん
2010/05/09(日) 10:09:13上のレスをみてると、じゃあ、なぜconst_castなるものが存在するのでしょうか?
0849デフォルトの名無しさん
2010/05/09(日) 10:11:29const_iteratorかconst_reverse_iteratorしか選択肢ないだろ
constじゃなくてもsetはconst_iteratorしかない
0850デフォルトの名無しさん
2010/05/09(日) 10:12:12constのない、古いコードやバカの書いたコードに渡すため
0851デフォルトの名無しさん
2010/05/09(日) 10:12:28自前で用意したクラス、インスタンスなら必要ないかもしれない
けど、他人が用意したものでconstなインスタンスしか参照できないとき
const使わないと何もできないぞ
0852デフォルトの名無しさん
2010/05/09(日) 10:13:33あたなのいうところのバカが書いたコードをバカではないあなたが利用する理由は?
0853デフォルトの名無しさん
2010/05/09(日) 10:14:190854デフォルトの名無しさん
2010/05/09(日) 10:14:48会社の自前ライブラリの使用を強制される場合は
そういうことがいくらでもある。
0855デフォルトの名無しさん
2010/05/09(日) 10:15:30const_castを使う
あと、COMを利用するときとか(COMにconstがないので)
constありの関数となしの関数を実装する時に、
const_castを利用して実装をまとめることもある
0856デフォルトの名無しさん
2010/05/09(日) 10:16:54ということは、あなたがいうバカが存在する会社と勤務乃至付き合いがある理由は?
0857デフォルトの名無しさん
2010/05/09(日) 10:17:460858デフォルトの名無しさん
2010/05/09(日) 10:17:590859デフォルトの名無しさん
2010/05/09(日) 10:18:280860デフォルトの名無しさん
2010/05/09(日) 10:18:300861デフォルトの名無しさん
2010/05/09(日) 10:18:40あるインスタンスのconst参照を渡す関数の前後でそのインスタンスは同値であることが期待できる。
従って、それ故の最適化が可能。これが非const参照を要求する関数であれば、その最適化はできない。
従って、const参照によるパフォーマンスの向上の可能性がある。
const参照がconstメンバ関数であっても理屈は同じこと。
0862デフォルトの名無しさん
2010/05/09(日) 10:19:04論破されたからって関係ない話を持ち出し始めるなよクズ
0863デフォルトの名無しさん
2010/05/09(日) 10:22:52なくてもいいんじゃない?と思う人がいるのは分からなくもない
0864デフォルトの名無しさん
2010/05/09(日) 10:22:53const外しをした場合の動作が未定義なことくらい知っておけよ
0865デフォルトの名無しさん
2010/05/09(日) 10:24:26const int n = 0;
const_cast<int&>(n) = 1;
は未定義だが
0866デフォルトの名無しさん
2010/05/09(日) 10:24:49結局constの有用性を説明できたのごく小数だったなw
0867デフォルトの名無しさん
2010/05/09(日) 10:25:55そのままおまえに返すよw
論破されたからって関係ない話を持ち出し始めるなよクズ
0868デフォルトの名無しさん
2010/05/09(日) 10:27:420869デフォルトの名無しさん
2010/05/09(日) 10:28:260870デフォルトの名無しさん
2010/05/09(日) 10:28:27二言目には「〜の理由は?」って奴、アフォかと
話もしたくない
0871デフォルトの名無しさん
2010/05/09(日) 10:28:39最後には逃げる奴
0872デフォルトの名無しさん
2010/05/09(日) 10:29:29自分自身だったりしてw
0873デフォルトの名無しさん
2010/05/09(日) 10:30:390874デフォルトの名無しさん
2010/05/09(日) 10:30:57↓
面白い人が集まってきて、面白いことをはじめる。
↓
面白くない人も大勢見に来る。
↓
面白くない人が面白い人の真似をしはじめる。
↓
面白くない人がやっても面白くない。
↓
面白くない人のほうが多いので、面白くないものの比率があがる。
↓
掲示板が面白くなくなって、面白い人がいなくなる。
↓
緩やかに過疎。
0875デフォルトの名無しさん
2010/05/09(日) 10:32:050876デフォルトの名無しさん
2010/05/09(日) 10:34:30こういうコンパイル時に決まる静的な値だけで初期化された定数のことを指す用語ってあんの?
0877デフォルトの名無しさん
2010/05/09(日) 10:36:17それは無い。
定義時の const であれば別だけど、参照への const の有無だけでは
エイリアスの可能性(最悪グローバル変数経由とか)が消えないので、
コンパイラは変更されていないことを前提にできない。
参照への const の有無で最適化の結果が変わるようなコード、作れる?
0878デフォルトの名無しさん
2010/05/09(日) 10:51:24そのまんま。
コンパイル時定数(Compile-time constant)
0879デフォルトの名無しさん
2010/05/09(日) 10:53:45そのまんまだな。ありがとう。
0880デフォルトの名無しさん
2010/05/09(日) 10:57:41思考停止じゃ答えになってねーだろ。
0881デフォルトの名無しさん
2010/05/09(日) 11:01:16んなこと誰も言ってねーだろ死ねば?
0882デフォルトの名無しさん
2010/05/09(日) 11:01:220883デフォルトの名無しさん
2010/05/09(日) 11:02:350884デフォルトの名無しさん
2010/05/09(日) 11:05:23ゆとりでも使える高級言語で満足して帰ってくれ
0885デフォルトの名無しさん
2010/05/09(日) 11:08:33constはあまり重要なものでないと分かる
0886デフォルトの名無しさん
2010/05/09(日) 11:10:450887デフォルトの名無しさん
2010/05/09(日) 11:11:05すなわち、今まで危ない橋をいかに多く渡ってきたのが明確になってぞっとする。
そうなるとconst1を丁寧につけて、機械的に検出できる部類のバグはコンパイル時に解決してするありがたさが分かる。
0888デフォルトの名無しさん
2010/05/09(日) 11:20:22constもtypedefもないC#はVMの都合のような気がする。もしC#にconstを採用したら、VB.netで悲鳴が上がるんじゃないか?
まあいまさら追加できないだろうけど
0889デフォルトの名無しさん
2010/05/09(日) 11:28:220890デフォルトの名無しさん
2010/05/09(日) 11:31:00わかる
0891デフォルトの名無しさん
2010/05/09(日) 11:31:580892デフォルトの名無しさん
2010/05/09(日) 11:32:02最新の言語といってもスクリプトだからな。
0893デフォルトの名無しさん
2010/05/09(日) 11:33:01ああいった言語は安全性より手軽さだからそれでいいけど
0894デフォルトの名無しさん
2010/05/09(日) 11:35:09readonlyは参照を変更できないだけで、参照先のオブジェクトを変更できないわけではない。 const T&やconst T*とは意味が異なるので今の議論とは関係ない。
0895デフォルトの名無しさん
2010/05/09(日) 11:37:150896デフォルトの名無しさん
2010/05/09(日) 11:38:49const相当のgetterのみの使用に一時的な限定する機構があるならばね。
0897デフォルトの名無しさん
2010/05/09(日) 11:39:480898デフォルトの名無しさん
2010/05/09(日) 11:45:30kwskと言いたいとこだが、C++スレなんで3行でお願い
0899デフォルトの名無しさん
2010/05/09(日) 11:50:080900デフォルトの名無しさん
2010/05/09(日) 11:52:46constがあればreadメソッドにつけるだけで簡単だろ。
0901デフォルトの名無しさん
2010/05/09(日) 11:57:02いや、今は無い言語の話をしてんじゃねーの?
0902デフォルトの名無しさん
2010/05/09(日) 14:11:390903デフォルトの名無しさん
2010/05/09(日) 14:25:41いつから使い始めれば良いか、タイミングが難しいけど・・・・いつからやりゃあいいんだ?
最初から他のエディタ使ってると永遠に使わなさそう
0904デフォルトの名無しさん
2010/05/09(日) 14:26:550905デフォルトの名無しさん
2010/05/09(日) 14:28:040906デフォルトの名無しさん
2010/05/09(日) 14:31:050907デフォルトの名無しさん
2010/05/09(日) 14:33:55WinAPI的に考えるなら前者
じゃね?
0908904
2010/05/09(日) 14:39:540909デフォルトの名無しさん
2010/05/09(日) 14:42:11どういうことがしたいんだ
0910904
2010/05/09(日) 14:46:36void hoge(char** dst, char* src, size_t size)
{
memcpy(*dst, src, size);
*dst += size;
}
void hoge(char*& dst, char* src, size_t size)
{
memcpy(dst, src, size);
dst += size;
}
0911デフォルトの名無しさん
2010/05/09(日) 14:52:37vector使おうぜ
0912デフォルトの名無しさん
2010/05/09(日) 14:53:230913デフォルトの名無しさん
2010/05/09(日) 14:54:34たぶん dst をメンバに持つクラスを作ったほうがいい。
0914デフォルトの名無しさん
2010/05/09(日) 14:58:38いくらオーバーしても我関せずだな
0916デフォルトの名無しさん
2010/05/09(日) 15:31:240917デフォルトの名無しさん
2010/05/09(日) 15:38:220918デフォルトの名無しさん
2010/05/09(日) 15:47:09vector<char>に__attribute__((aligned))付けたら良きに計らってくれるの?
0919デフォルトの名無しさん
2010/05/09(日) 15:47:550920デフォルトの名無しさん
2010/05/09(日) 15:55:240921デフォルトの名無しさん
2010/05/09(日) 15:58:13・・・はず
0922デフォルトの名無しさん
2010/05/09(日) 15:59:35じゃあやっぱりvectorを本物の配列の代わりに使うなんて無理なんだね
0923デフォルトの名無しさん
2010/05/09(日) 16:02:22どうしてそう言う結論になるん?
0924デフォルトの名無しさん
2010/05/09(日) 16:02:33メニュー探してもボタン探してもコンパイル機能らしきものがない
0925デフォルトの名無しさん
2010/05/09(日) 16:05:120926デフォルトの名無しさん
2010/05/09(日) 16:05:18ビルドメニューの中にコンパイルって無い?
0927デフォルトの名無しさん
2010/05/09(日) 16:08:25cファイル開いたんだけど
0928デフォルトの名無しさん
2010/05/09(日) 16:12:44dstのサイズくらい渡しとけ
バッファオーバーフロー攻撃のいい餌食だ
0929デフォルトの名無しさん
2010/05/09(日) 16:14:082010のeeだったらメニュー項目が隠されている。
ツールのどっかにチェックがる。
0930デフォルトの名無しさん
2010/05/09(日) 16:14:28制約が厳しい場面では代わりにならないこともある、というだけのこと。
多くの場面では代わりに使える。無理じゃない。
0931デフォルトの名無しさん
2010/05/09(日) 16:18:54バイトストリーム扱う時に全く役に立たないって結構致命傷だと思うんだけど
特にC/C++の得意分野を考えると
0932デフォルトの名無しさん
2010/05/09(日) 16:21:370933デフォルトの名無しさん
2010/05/09(日) 16:23:26ご冗談でしょう
0934デフォルトの名無しさん
2010/05/09(日) 16:23:480935デフォルトの名無しさん
2010/05/09(日) 16:26:00「バイトストリーム扱う時」というのが何のことかさっぱりわからない。詳しく。
0936デフォルトの名無しさん
2010/05/09(日) 16:26:210937デフォルトの名無しさん
2010/05/09(日) 16:27:02vector が使えなくても代わりの手段があるだろ。
なんで vector が使えなかったら致命傷になるんだ?
0938デフォルトの名無しさん
2010/05/09(日) 16:27:28stringstreamじゃないの?
0939デフォルトの名無しさん
2010/05/09(日) 16:30:17const_castがあるじゃないか
0940デフォルトの名無しさん
2010/05/09(日) 16:30:560941デフォルトの名無しさん
2010/05/09(日) 16:34:040942デフォルトの名無しさん
2010/05/09(日) 16:43:14> コンパイル時定数のconstをconst_castで外したときの動作は未定義です
そうなの?外すだけでだめ?
int foo(const MyClass& arg)
{
return const_cast<MyClass&>(arg).m_func_argを変更するメンバ関数();
}
は
MyClass x;//これがconstでないという前提の下で、
foo(x);
としても未定義の動作ではないんだよね。
いや普通はfooの作者を殴りに行く所だけど、文法的な話で。
0943デフォルトの名無しさん
2010/05/09(日) 16:45:09"コンパイル時定数"じゃないじゃん
0944デフォルトの名無しさん
2010/05/09(日) 16:45:480945デフォルトの名無しさん
2010/05/09(日) 16:48:23const int n = 0;
int main() {
const_cast<int&>(n) = 1;
std::cout << n << std::endl;
}
1 と出力されるか 0 と出力されるかは規格では定義されていない
0946デフォルトの名無しさん
2010/05/09(日) 16:49:38コンパイル時定数の const を外しても書き込んでなければ未定義動作にはならない。
その例の x については書き込んでも未定義動作にはならない。
0947デフォルトの名無しさん
2010/05/09(日) 16:50:49その場合は未定義動作だから、 1 と 0 のどちらかが出力されるとも決まっていない。
0948デフォルトの名無しさん
2010/05/09(日) 16:51:27理解。
俺のレスの後半部分はあんま関係ない例だったっぽいな。
そしてコンパイル時定数でもconst_castするだけならOKなのか。
書き込まなければ。
>>945
> 1 と出力されるか 0 と出力されるかは規格では定義されていない
不定?それとも未定義の動作?
0949デフォルトの名無しさん
2010/05/09(日) 17:01:43まあそうか
>>948
undefinedだったと思う
0950デフォルトの名無しさん
2010/05/09(日) 17:09:53サンクス。undefinedか。じゃあ致命的だな。
0951デフォルトの名無しさん
2010/05/09(日) 17:13:340952デフォルトの名無しさん
2010/05/09(日) 19:57:120953デフォルトの名無しさん
2010/05/09(日) 20:09:13あれって関数オブジェクトを引数に受け取るときはconst参照じゃなくてオブジェクトの複製になってるのは規格や規則で指定されてるんですか?
自分でファンクタを作るときにどっちを前提で書けばいいのか迷ったので質問しました
0954デフォルトの名無しさん
2010/05/09(日) 20:12:12それならconstも何もないってことなんじゃないの?
0955デフォルトの名無しさん
2010/05/09(日) 20:13:35どういうこと?
0956デフォルトの名無しさん
2010/05/09(日) 20:14:550957デフォルトの名無しさん
2010/05/09(日) 20:17:34結果が引数のみに依存する関数ってこと
内部状態を持ってる関数だとアルゴリズムに渡したときおかしなことになるから
0958デフォルトの名無しさん
2010/05/09(日) 20:19:17便利なのは知っているが、そのシチュエーションに遭遇したことがない。
0959デフォルトの名無しさん
2010/05/09(日) 20:24:48thxです
0960デフォルトの名無しさん
2010/05/09(日) 20:28:040961デフォルトの名無しさん
2010/05/09(日) 20:32:31最初にその値を取得するconstメンバ関数を読んだ時に初めて計算して欲しい時とか
0962デフォルトの名無しさん
2010/05/09(日) 20:33:070963デフォルトの名無しさん
2010/05/09(日) 20:34:36あとは参照カウントとか。
0964デフォルトの名無しさん
2010/05/09(日) 20:37:32キャッシュなど呼び出し側からはオブジェクトの変更を意識する必要が無い場合とか。
const_castを駆使するより、constでも値を変えることができる事を明示するぐらいのメリット。
class hoge
{
mutable bool cached;
mutable int cachevalue;
public:
hoge()
:cached(false)
{
}
int getValue()const
{
if(!cached)
{
cachevalue=func();//すごい遅いけど同じ値が帰ってくることが分ってる関数。
cached=true;
}
return cachevalue;
}
};
0965デフォルトの名無しさん
2010/05/09(日) 20:39:510966デフォルトの名無しさん
2010/05/09(日) 20:40:33実際そんな使わないけど
0967958
2010/05/09(日) 20:40:42丁寧にありがとう!
ただ、それって単にmutableとメンバ関数のconst指定を消したらダメなのですかい?
・・・あ、それだと
void foo(const hoge&)
に渡せないってことか。
0968デフォルトの名無しさん
2010/05/09(日) 20:41:280969デフォルトの名無しさん
2010/05/09(日) 20:41:46mutableいらなくないっすか?
0970デフォルトの名無しさん
2010/05/09(日) 20:42:53constなのが自然
0971デフォルトの名無しさん
2010/05/09(日) 20:44:150972デフォルトの名無しさん
2010/05/09(日) 20:44:28おまいはいちいちmutable回避のためだけに、普段からそんなコードを書いてるのかと小一時間問い詰めたい。
0973デフォルトの名無しさん
2010/05/09(日) 20:44:50mutableだとキーワードひとつで済む上、目的が一目瞭然なのがメリット
0974デフォルトの名無しさん
2010/05/09(日) 20:46:21気持ち悪いからやらないけど
0975デフォルトの名無しさん
2010/05/09(日) 20:52:030976デフォルトの名無しさん
2010/05/09(日) 20:52:55他のメソッドからうっかりアクセスして壊れたらどうすんだよ
0977デフォルトの名無しさん
2010/05/09(日) 20:53:290978デフォルトの名無しさん
2010/05/09(日) 20:54:000979デフォルトの名無しさん
2010/05/09(日) 20:54:49const_castの対象がメンバ変数なら
設計の段階でconstじゃない事はわかりきっているから、
未定義の動作にはならないのでは・・・?
0980デフォルトの名無しさん
2010/05/09(日) 20:55:200981デフォルトの名無しさん
2010/05/09(日) 20:58:500982デフォルトの名無しさん
2010/05/09(日) 20:59:52ラムダでキャプチャした変数を変更したい時に使うというあれか
0983デフォルトの名無しさん
2010/05/09(日) 20:59:58export, registerあたりは全く仕事してないと言って良いから
何か有用な使い道を考えてくれ誰か、
0984デフォルトの名無しさん
2010/05/09(日) 21:01:050985デフォルトの名無しさん
2010/05/09(日) 21:02:11予約語としては残るが
0986デフォルトの名無しさん
2010/05/09(日) 21:04:10予約語としては残るが
0987デフォルトの名無しさん
2010/05/09(日) 21:04:22むしろ新たな旅立ちと考えるべきでは。
何に使うのか知らんが、きっと良い案を誰かが考えてくれる。
0988デフォルトの名無しさん
2010/05/09(日) 21:15:090989デフォルトの名無しさん
2010/05/09(日) 21:19:28もう本業になっちゃってるよな。
0990デフォルトの名無しさん
2010/05/09(日) 21:19:380991デフォルトの名無しさん
2010/05/09(日) 21:21:29激しく同意
0992デフォルトの名無しさん
2010/05/09(日) 21:22:500993デフォルトの名無しさん
2010/05/09(日) 21:23:330994デフォルトの名無しさん
2010/05/09(日) 21:24:310995デフォルトの名無しさん
2010/05/09(日) 21:24:47「結局」どころかこの場にいるほぼ全ての人が
最初から知っていることだが。
大丈夫なのは元がconstじゃないのにconst属性が付いている時。
>>942の例のコードでわかるんじゃね。
0996デフォルトの名無しさん
2010/05/09(日) 21:26:17コンパイル時定数以外の定数もだめなんだっけ?
0997デフォルトの名無しさん
2010/05/09(日) 21:27:01http://pc12.2ch.net/test/read.cgi/tech/1273407971/
0998992
2010/05/09(日) 21:27:32次スレ
http://pc12.2ch.net/test/read.cgi/tech/1273407971/
テンプレは今から貼る。
0999デフォルトの名無しさん
2010/05/09(日) 21:31:121000デフォルトの名無しさん
2010/05/09(日) 21:32:5010011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。