スレを勃てるまでもないC/C++の質問はここで 14
1 :
デフォルトの名無しさん :
2010/03/23(火) 00:57:51
iostreamってなんで嫌われてんの?
・printf, scanfでやるみたいな書式指定ができないから嫌い ・>>,<<で入力、出力というのが単に気持ち悪いから嫌い ・中身が複雑すぎて自分の頭では理解できないから嫌い という理由はよく見かける。 ちゃんと使えば標準入出力もファイル入出力も、 あるいは圧縮・展開しながら読み書きとかいうのも ストリームオブジェクト替えるだけでできて便利。 常に標準出力にしか書かないならprintfで十分かも。 書式指定したいときはsprintfで一度バッファに書いてから出力するか、 boost.format使うとかすればOK。
>ストリームオブジェクト替えるだけでできて便利。 ここだろ。 大抵の場合、その恩恵授かる事が少ないから使わなくてもいいやってなる。
>>6 今後のために、必要条件と十分条件の違いを学習した方がいいかも
9 :
デフォルトの名無しさん :2010/03/23(火) 11:45:32
「参照」に関する質問です。 Foo& const GetFoo(); この様な「宣言」は旧式って認識でおkでしょうか? そして現在では Foo& GetFoo(); に「簡略化」されているという認識でおkでしょうか?
いいえ。
12 :
デフォルトの名無しさん :2010/03/23(火) 13:28:12
A a;はいいのに A a();はエラーになるのはなぜですか?
switch(data) { case '+'; k = a + b; break; } でビルドするとエラーになるのはなぜ?
; :
>>13 data, a, b, k が未定義だし、mainもないし
>>15 全部書いたほうがいいのね
#include <stdio.h>
int main(void)
{
int a,b,data,k;
scanf("%d%d%d",&a,&data,&b);
switch(data)
{
case '+':
int k = a + b;
break:
}
printf("%d%d%d",a,data,b);
}
>>17 をビルドしようとするとエラーを吐くって言いたかったんだ。。。すまん
20 :
12 :2010/03/23(火) 13:54:56
>>19 あまりこのスレで暴れないでくれるかな。
君以外にも答えを待っている人が沢山いてだね
チャットみたいに使われるとスルーされるのだよ。
自己中をなおしたまえよ。
>>17 int k = a + b; → k = a + b;
break: → break;
>>13 case '+'; → case '+':
>>17 > #include <stdio.h>
行頭に全角スペース?が入ってる
>int k = a + b;
int は不要 → k = a + b;
>break:
break の後ろがコロンに「:」になっている、セミコロン「;」とすべき
24 :
スレのテンプレート :2010/03/23(火) 18:22:26
配布されてるライブラリを見ると希に->演算子や*演算子がオーバーロードされてたりしますが こういうオーバーロードを行うとポインタ操作で不用意なバグを生み出しそうな気がするのですが大丈夫なのでしょうか?
>>25 それは作り方しだい。
配布するぐらいだからそれなりに作ってんじゃないの。
C++のクラスは、ヘッダに直接実装するのかソースに実装を分けるのか、どちらが良いでしょうか? foo.h class foo { public: foo() {} void var() { cout << "var" << endl; } }; ---- foo.h class foo { public: foo(); void var(); } foo.cpp foo::foo() {} void foo::var() { cout << "var" << endl; } それぞれのメリット、デメリットってありますか? おいらはヘッダに実装しちゃうのが簡単でよいと思ってます。
>>27 好きにすればいいよ。
君の場合はそのヘッダーを他人に見せるわけではないだろうし、
メモリ効率とかパフォーマンスとかも気にするレベルでもなさそうだからね。
>>28 おいらのレベルは置いておいて、一般的な話として
メモリ効率が悪くなり、パフォーマンスも悪くなる、ってことですか?
>>27 クラス定義内で実装すると inline になる。
inline でいいならそれでいいけど、
そうでないものを無理にクラス定義内で実装すると
ちょっと実装を変更しただけで
そのヘッダファイルをインクルードした全てのファイルが
再コンパイルされてしまうので、
inline にするつもりがないなら .cpp で実装した方がいい。
クラステンプレートみたいに全部ヘッダで実装する必要のあるものなら
全部クラス定義内で実装しちゃってもいいと思うけど。
inline になったからって必ずインライン展開されるわけじゃないしね。
>>30 すごい合点がいきました。
時々空っぽ(もしくはメンバの初期化のみ)のコンストラクタだけヘッダに実装してあって
残りがソースに実装してあるコードを見るので、どういう使い分けなんだろう、と
思ってましたが、inlineになるというので氷解しました。
おいらはJava出身なので、理由がなければヘッダに実装も書きたいんだけど
クラスの設計後、実装をソースに移すようにしてみます。
>>30 コンパイル時間を気にするような状況なら、プリコンパイルにするはずだから、
再コンパイルとか気にしなくていい。
template使ったことないことくらい察してやれ
pimplパターンとか考えられるくらい コンパイル時間て重要なのにな partial classが欲しいわあ
後学のためにboostのソース眺めてたんだが namespace detail { struct none_helper{}; } typedef int detail::none_helper::*none_t ; これがなにをやってるんだかよく判らないんだけどこれどういうこと?
>>36 他の型に自動変換されない型を定義してる。
相談室かどっかにも同じ質問あったが同じ人か?
>>37 関係ない人だと思う
>他の型に自動変換されない型を定義してる。
それ以前の問題で
typedef int detail::none_helper::*none_t ;という文法からして何が言いたいのか判らない状態なのです
これってそんなFAQだったのかw 基本的なところから。 typedef A a; は「Aという型をaという名前でも使えるようにします」という意味。 int A::*b は「型Aのint型のメンバ変数へのポインタ b」という意味。 両方合わせて typedef int A::*b; は「『型Aのint型のメンバ変数へのポインタ』の型をbという名前でも使えるようにします」となる。 メンバ変数ポインタはややこしいので使い方はぐぐってみてくれ。 とりあえず、普通のポインタと違ってNULLですら代入できないという性質がある。 このお陰で、例えば引数にNULLを渡したとしてもオーバーロードを誤判定するということがなくなる。
ふと思ってVCで試してみたらNULL代入できたorz NULLも代入できないのってメンバ関数ポインタだったっけ
41 :
デフォルトの名無しさん :2010/03/24(水) 00:28:48
::*って違和感あるんだけど、↓で正しい? class A { int x; int y; float z; } a; class B { int x; int y; float z; } b; int A::* p1 = &a.x; //OK int B::* p2 = &b.x; //OK int A::* p3 = &b.y; //NG int B::* p4 = &a.y; //NG float A::* p5 = &a.x; //NG float A::* p6 = &a.z; //OK なんで、A::int* ではなく int A::* なんだろう。変な感じ。
>>41 struct A { int x; int y; float z; } a;
struct B { int x; int y; float z; } b;
int A::* p1 = &A::x; //OK
int B::* p2 = &B::x; //OK
int A::* p3 = &B::y; //NG
int B::* p4 = &A::y; //NG
float A::* p5 = &A::x; //NG
float A::* p6 = &A::z; //OK
・ &a.xは通常のポインタが取得される、&A::xとしないとダメ
・ privateメンバのアドレスはクラス外からだと取れない
intだと分かりにくいけど、
A::B* と書いた場合「型Aのローカル型Bへのポインタ」と解釈される。
struct A{
struct B{};
};
C言語からの伝統で、「ある型の変数の定義の名前の部分を*に置き換えたもの」
がその型のポインタの型になることになっている。
例: int a→int *
int A::b→int A::*
(後者は見慣れないと思うけど、staticメンバ変数の定義のときにはこう書く)
43 :
デフォルトの名無しさん :2010/03/24(水) 01:05:07
なるほどねー
44 :
デフォルトの名無しさん :2010/03/24(水) 01:49:28
shared_ptrとunique_ptrはどう使い分けますか? 全部shared_ptrじゃ、ダメなんですか。
>>44 実行速度が気にならないなら全部shared_ptrで構わない。
shared_ptrを使った場合はプログラマが1個のshared_ptrからしか参照されないことを知っていたとしても
毎回参照カウンタを生成するため、そのためのオーバーヘッドが生じる。
unique_ptrは参照カウンタを使用しないため、1つからしか参照されないことが予め分かっているなら効率的。
また、shared_ptrの場合、一度ポインタをshared_ptrに格納してしまうとポインタの所有権を奪い返すことができない。
つまり参照するshared_ptrがなくなった時点でオブジェクトがdeleteされるのを止めることができない。
一方で、unique_ptrはrelease()によって所有権を放棄させることができる。
ぱっと思いつくのはこのくらい。
win32でピルドできる?
Google、高速・低メモリ消費の正規表現ライブラリ「RE2」を公開 ...
http://sourceforge.jp/magazine/10/03/15/0331223 もし誰も挑戦してみたいの試行RE2 Windows上でコンパイルするには、パッチを歓迎するだろうなされている。
どのようにre2/re2.hの上部にあるコメントを参照してくださいRE2、使用方法に関するドキュメントしてください。
http://code.google.com/p/re2/wiki/Install No attempt has been made to make RE2 compile on Windows, but if anyone would like to try, patches would be welcomed.
For documentation on how to use RE2, see the comment at the top of re2/re2.h.
endlみたいに空の()を省きたいが、マニピュレータではない関数を作ってみたいんですけど、 分かりやすいサイトもしくはサンプルもしくは検索語無いですかね?
ttp://soudan1.biglobe.ne.jp/qa3450940.html この質問者ではないんだけど、やりたいこととしては
typedef unsigned int UINT;
が定義されていなければ自分で定義したい。
擬似コードとしては以下のような感じ。
#ifndef UINT
typedef unsigned int UINT;
#endif
冒頭の URL は実行時に判定しているけど(それはそれですばらしい)
やりたいのはコンパイル時です。
>>48 OKWaveの回答者はなにやら勘違いしているようだけど、あるかないかはエラーかどうかで判断できる。
なので、コンパイルしてみてエラーになったら定義すればいい。
逆に言えば、汎用的な手段で判定することはできないので悪足掻きするだけ無駄。
template<typename T=unsigned>struct mkUINT{typedef T UINT;}; #define mkUINT() typedef mkUINT<UINT>::UINT UINT; mkUINT()
>>48 そこの回答だと
namespace fuga { typedef unsigned int UINT; }
using namespace fuga;
を加えるとエラーになるよね
>>45 誤解されがちなshared_ptrに補足
引数でshared_ptrを渡したいときは const shared_ptr<hoge>& とすればコピーのオーバーヘッドは発生しないし。
->は参照カウントと変更しないからオーバーヘッドはないよ。
new に対するshared_ptrのコストは無視できる。
まあ、大抵のshared_ptrのコストは無視できるよ。ホントにボトルネックになったときに考えればいい。
>>52 const でもカウントアップされないと困る場合もあると思うけど。
どんなとき?
カウントしておかないと実態が解放されちゃうことがあるよ。 これが起こるはずがないというのは本末転倒。 元々その辺の管理をやらなくていいようにするための物なんだから。
const参照の参照元が掴んでるから平気じゃね。 必要に応じてコピーすればいいし
別スレッドに渡すと死ぬる
スタック上にchar[sizeof]で確保した領域に 別の型のオブジェクトをplacement newするのは危険、と小耳に挟んだんだけど本当?
ヒープであっても危険
>>56 だからずーと掴んでおく必要がないのが shared_ptr でしょうに。
>>58 char[sizeof]を宣言してる関数から抜けたら駄目でしょう。
別に placement new だからというわけでもないと思うけど。
>>61 オブジェクトのメンバにchar[sizeof]で確保されたメンバがあって、オブジェクト自体が自動変数だった場合を想定してます。
>>62 それを呼んでもどういう場合が危険でどう回避すればいいか解らないあたりc++に対する理解度が低いのかなと・・・
>>62 それは処理系から来る制限であり、元の仕様とは関係ない。
問題のある処理系ではそのようなコードを書かないのは当たり前のこと。
逆にメモリ管理を上書きしたいんだから、その辺のことを考慮するのは当然だろ。
>>63 >危険でどう回避すればいいか解らないあたりc++に対する理解度が低いのかなと・・・
わからない人が使うものではないと思いますが、使う理由は何ですか?
char name[MAX_PATH] = ""; nameを\0で、埋め尽くしたい場合にどう記述すれば良いのでしょう。
その書き方で全部'\0'で埋まってないか?
>>67 最初だけで良いなら static を付けて宣言する
それか
memset(name, '\0', MAX_PATH);
で毎回クリアするとか
>>67 char name[MAX_PATH] = {'/0'};
訂正 /0じゃなくて\0ね。
72 :
67 :2010/03/25(木) 10:41:55
初期宣言時 char name[MAX_PATH] = {'\0'}; 変数クリア時 memset(name, '\0', MAX_PATH); 解決しました、ありがとうございます。
Modern C++ Designにpointeeって出てきたんですけどこれって何者なんですか?pointerの誤植じゃないですよね?
employ 【動】雇用する employer 【名】雇用主 employee 【名】従業員 とか言うのと同じ
ポインタが示す先ってこと?
int pointee; int *pointer = &pointee;
>>72 memset(name, '\0', sizeof name); の方がよくない?
マクロ定数で決まってる配列のサイズを、sizeofにわざわざ変える必要はない。
メッセージを表示させて時間が来たら消します i= MessageBox(hwnd, Message, Title, MB_OK); Set timer 時間経過→ SendMessage(?,WM_KEYDOWN,VK_RETURN,0); Killtimer SendMessageでMessageBoxにエンター入力して表示を消すつもりです。 WM_KEYDOWNにVK_RETURNを送るとエンターの入力になりますよね? また、MessageBoxのハンドルをどうやって所得すればよいのか解りません。
スレチ
>>79 MessageBox 使わず、自分で CreateDialog すればいいじゃん。
SendMessage は控えよう!
82 :
79 :2010/03/25(木) 16:18:07
API向けのスレでした…すみません。 CreateDialogも調べてみます。
カンマ区切りの文字列sがあったとして foo(strtok(s, ","), strtok(NULL, ","), strtok(NULL, ",")); なんて呼び出しをしたいんだけど、strtok は第一引数の場所から 順番に呼び出されるって保証がありますか?
無い
ない
ない 実際の実装ではむしろ逆から呼ばれる傾向にある (後ろの引数からスタックに詰むため) これも必ずそうというわけではないが
>>85-87 面倒でもいったん変数に取り出す必要があるんですね。
どうもです。
fopen("1.txt",fp)後に while (fgets(s, 256, fp) != NULL) {Line++}で行数を読み込みます。 Lineが100あり、30行目の内容を読み込みたい時ですが、 int a=30,Line=0; while (fgets(s, 256, fp) != NULL) { Line++ if(Line=a) 適当な関数(s); } 上の記述だと1〜30まで繰り返しますが、ダイレクトに30行目を読み込む方法ってあります? for()
1行の長さが不定なら前から見ていくしかないよ
91 :
デフォルトの名無しさん :2010/03/26(金) 02:40:50
BOOLEAN BOOL boolean bool どれ使えばいいの?(´;ω;`)
BOOLかbool
ありがとう
>>89 そのソースだと全行で関数が呼び出されるぜw
algorithmのstd::remove()について質問です。 std::vector<int> v; v.push_back(0); v.push_back(1); v.push_back(2); std::remove(v.begin(), v.end(), 0); std::remove(v.begin(), v.end(), 1); printf("%d", v.size()); 上記のようにすると、最後のvのサイズは1を期待するのですが3のままです。 でも、v[0]には本来の0ではなく2が入っています。 v[1]もv[2]も2が入っています。 std::remove()の代わりにvector::erase()を使用すれば、 v.size()は1を返します。 std::remove()はそういうモノなのでしょうか? VC2008で確認しています。
>>95 そうです
期待通りの動作をさせるには
v.erase(std::remove(v.begin(), v.end(), std::compose2(
std::logical_or<bool>(),
std::bind2nd(std::equal_to<int>, 0),
std::bind2nd(std::equal_to<int>, 1)))
とする必要があります
あ、ごめん v.erase(std::remove(v.begin(), v.end(), std::compose2( std::logical_or<bool>(), std::bind2nd(std::equal_to<int>, 0), std::bind2nd(std::equal_to<int>, 1)), v.end()) だった removeは残す要素の候補を前に集めるだけで、実際の削除は しませんのでstd::eraseもしくはメンバ関数eraseを使います
>>97 erase 使うのならそんな面倒なことせず
remove を erase に置き換えれば良いだけだと思うけど。
v.erase(std::remove(v.begin(), v.end(), 0), v.end()); v.erase(std::remove(v.begin(), v.end(), 1), v.end()); これでいいね removeは第三引数にリファレンスを取るのでlogical_orが使えないな
使うとしたらremove_ifとboost::bindを組み合わせるかだ
やっと動いた これは読みにくいわ(^ω^;) v.erase( std::remove_if(v.begin(), v.end(), boost::bind( std::logical_or<bool>(), boost::bind(std::equal_to<int>(), _1, 0), boost::bind(std::equal_to<int>(), _1, 1) ) ), v.end());
ちなみにboost::bindを使ったのは、標準C++にはstd::compose2が無いためです
質問は >std::remove()はそういうモノなのでしょうか? であって、そういう汚いコードに興味はありません。
boost使ったからまだ綺麗なんだぞ もっと汚いコードは山ほど書いてきた
>>104 だから、コード書いてくれなんて誰も頼んでないつーの。
オナニーはよそでやってくれ
ときどき void main って書くやついるよね。 なんなんだろうね。馬鹿じゃないかと思うよね。
まともな事には答えられないからって、同じ話題をループさせようとすんなよw
オブジェクト(インスタンス)を生成するときに変数をポインタにするのとしない場合が ある理由を教えてくださいませませ Unko* unko_kusai Chinko chinko_1
>>108 生成パターンを使うと大抵ポインタにならないか?
それから仮想関数で使う場合もポインタにしなければならない
別に参照でもいいよ
>>108 変数にすると、生存期間をコントロールできない。
ポインタなら自由にコントールできる。
けど自由な分手間もかかるし、プログラマが責任を持つ必要がでてくる。
>110 仮想関数の場合な 使う場面は限られるけど 生成パターンでもシングルトンだと参照の場合もあるし
Hoge hoge; { HogeBase &h = hoge; h.vfunc(); } ポインタじゃなくてもvtable参照してくれますよ
>>113 知ってるから
わざわざ書かなくてよろしい
115 :
108 :2010/03/26(金) 23:44:05
レスありがとうございます 今勉強してるサンプルプログラムでポインタあ・なしの両方が出てきて、何故に使い 分けてるのか疑問だったのですが、一方は複雑なことやる必要があるからポインタ、 もう一方はその必要が無いなら安全なポインタ無し という風に使い分けてるという解釈で おkですかね?
>>115 自動で済ませられるなら自動に任せるって琴田
>>99 初回のremove()の結果を二回目のremove()の第二引き数とすればerase()は一回でいいんじゃね?
>>101 だとすればわざわざそんなややこしいbind()するメリットもないんじゃね?
>>115 メモリリークするバグを潰すのは大変だ。と前置きをした上で。
ポインタにしなかった場合、その変数のスコープから抜けるときに
変数の後始末を自動でやってくれる。つまりメモリリークの心配がない。
これは色々処理をする途中で、エラーが発生したら中断、みたいな処理をするときにはとても楽。
ポインタを使った場合、中断するときにnewしたオブジェクトを正しく全てdeleteしないと
メモリリークになるのでよく注意する必要がある。
一方で、
>>109 の言うようにオブジェクトの生存期間を自分で管理したい場合や、
継承を使ったオブジェクトを使いたい場合、
もしくは大きなオブジェクト(大きな配列など)はポインタを使う必要がある。
C++であれば、ポインタでありながら、メモリリークの心配がいらないスマートポインタという
仕組みがよく使われる。(boost::shared_ptrなど)
これを使うと普通のポインタよりも実行速度がやや遅くなるが、普通は気にするほどではない。
速度気にならなければ、動的メモリ確保をすべて乗っ取って ガベージコレクションした方が良い。 ヘッダ変更だけで済む
はじめからnewを使わないという戦略もある STLをうまく使えば、スマートポインタ、ガベージコレクション、new はほとんどいらんだろう。
>>117 >初回のremove()の結果を二回目のremove()の第二引き数とすればerase()は一回でいいんじゃね?
アホ
removeの戻り値は削除候補の先頭だ
前に集められた候補の中に次に削除したい値が含まれているので
その方法はダメ
>だとすればわざわざそんなややこしいbind()するメリットもないんじゃね?
だったらお前が何か書いて見せろや
口だけ出して何もしない奴が一番嫌いだな
>>121 間抜けで頓馬で馬鹿と来ちゃ、どうしようもないな。
・間抜け
削除候補が集められるのは前じゃなくて後ろだよ。
つまり、「後ろに集められた削除候補の先頭」が戻されるって訳。
・頓馬
自分で確認すれば間違いに気付けたのにそれさえしないんだからな。
・馬鹿
その上、何か書いて見せろって自分が書けもしないのによく言うよ。
馬脚を現わした挙句に自ら墓穴を掘ったわけだ。
>>122 間抜けのアホはお前だ
>削除候補が集められるのは前じゃなくて後ろだよ。
>つまり、「後ろに集められた削除候補の先頭」が戻されるって訳。
そんなもん常識だろ
>>121 のどこにこれを否定するような文が書いてある?
>>117 の通りにしたら1が削除されずに残ってしまうだろ
実行して試してみ
それとも図星を突かれて悔しくてファビョったのか?
二人とも言い合いせずに特に
>>122 はプログラム例を書いて示せ
お前さんの言いたい事はこういう事だろ?
std::vector<int> v;
v.push_back(0);
v.push_back(1);
v.push_back(2);
v.erase(std::remove(v.begin(), std::remove(v.begin(), v.end(), 0), 1), v.end());
std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
std::printf("%d", v.size());
>前に集められた候補の中に
>>125 合ってるじゃないか
前に集められた「削除から外される」候補の中にと文脈からは取れるだろ
>前に集められた候補の中に次に削除したい値が含まれているので
これをよく読め
要するに
>>122 はイチャモン付けて喧嘩したいだけなんだよ
相手が誰であろうと構わないわけだ
だったら痛くも痒くもないネット内でのビビリ喧嘩などせずに
街に出てDQNに喧嘩吹っ掛けてボコボコに殴られてこい
128 :
122 :2010/03/27(土) 09:51:16
んじゃ、>123のために私の書いたのを貼っておく。
まぁ、>124と核は同じだね。
--
#include <algorithm>
#include <cstdio>
#include <vector>
int main()
{
std::vector<int> v;
v.push_back(0);
v.push_back(1);
v.push_back(2);
for (int ic = 0; ic < 10; ++ic) {
v.push_back(ic % 5);
}
v.erase(std::remove(v.begin(), std::remove(v.begin(), v.end(), 0), 1), v
.end());
for (std::vector<int>::const_iterator it = v.begin(); it != v.end(); ++i
t) {
printf("%d\n", * it);
}
return 0;
}
--
それはさて。
>
>>121 のどこにこれを否定するような文が書いてある?
>121には「前に集められた候補」とあるんだけどな。
まぁ、「削除候補とは書いてない」と言い出すだろうからまぁいいや。
129 :
122 :2010/03/27(土) 09:59:35
うぉっ、80カラムでぶった切れているから難癖つけられる前に問題の行だけ再掲。 -- v.erase(std::remove(v.begin(), std::remove(v.begin(), v.end(), 0), 1), v.end()); for (std::vector<int>::const_iterator it = v.begin(); it != v.end(); ++it) { -- つーか、書いている間に予想通りのレスがついてて笑えた。 無茶しやがって……
>>126 >removeの戻り値は削除候補の先頭だ
>前に集められた候補の中に次に削除したい値が含まれているので
一行前に削除候補って書いてあるのに、次の行の候補が「削除から外される」候補と
読むのはかなり無理がある
>>131 お前の頭が悪いからだ
その分だとプログラムもバグだらけだろう
>>132 いい加減見苦しい。
説明が下手か勘違いしていたのかは詳らかではないが、
そもそも>117で巧くいくことははっきりしている。
他人を嫌う前に、ご自身の言動を見直してみては如何?
>>133 見苦しいのはお前の方
こちらの説明が間違ってないのに間違って言い張るお前は馬鹿
>>120 STLをうまく使うにはスマポは必須だけどね。
スマポでもshared_ptrならmake_sharedを使えばnewもいらず例外安全性も確保されるようになるし。
STL+shared_ptrでnewもガベコレもいらなくなるね。
>>117 はせっかっく良いことをいったのに、挑発レスを受け流せずに台無しだ。
>>121 > その方法はダメ
見苦しい弁解まだ〜w
的外れな突っ込みをするバカが一番悪いだろw
>>99 これで単純明快なのにケチを付ける奴が一番悪い
141 :
115 :2010/03/27(土) 12:05:39
皆様詳しいレスありがとうございました。 色々まだ自分の知らないワードが出てきたのでググって勉強しますぉ。
SetTimerでタイムアウト後、タイマのプロシージャの中でKillTimerしても良いんでしょうか? プロシージャ外じゃないと駄目なんて事は
>>142 なんのSetTimer?
Win32ならWin32スレで聞くと詳しいぞ
144 :
142 :2010/03/27(土) 22:21:24
SetTimerはWin32でした、すみません。
gnuplotでリアルタイム解析をするクラスを作りたいんだけど参考になるものなにかありますか?
なんのリアルタイムかわからん アクセス解析か
物理の数値計算です 3次元での粒子の位置などを見ます
gnuplotは表示ツールであって解析ソフトではないと思うが。 一応「gnuplot C++」あたりでググればそれっぽいページは出てくるな。 だが、もう少し本当にやりたいことは何なのか考えてみた方がいいと思う
>>147 解析を行いたいのか、解析データはあるからプロットだけしたいのか?による。
パイプ開いてコマンドを出力すればリアルタイムに描画してくれるよ ただ糞遅いから結局のところ違う描画ライブラリ使うことになるだろうけど
>>149 後者です
>>150 別にいいのがあるならどんなのがあるか教えてもらえるとありがたいです
C++とJavaの両方を勉強する意味ってありますか?何か範囲がかぶってる気がしまして。
>>153 英語とフランス語の両方を勉強する意味ってありますか?
意味はあるに決まってるが、 一方を勉強したらもう一方を勉強するのはかなり楽
英語とフランス語というより 英語とドイツ語ってぐらいか
スペイン語とポルトガル語くらいじゃないか
例えが分かりにくくないかw 要するにどっちも覚えたら最強ってことだ
>>153 > C++とJavaの両方を勉強する意味ってありますか?何か範囲がかぶってる気がしまして。
仕事がかぶってないからいいんじゃね?
両方覚えてようやく半人前だと思うぞ。
>>153 C++を学べばjavaもc#も軽い軽い
いや重いよ
163 :
デフォルトの名無しさん :2010/03/29(月) 00:25:58
64bit PCでのドライバの操作を含むアプリを開発する場合。 32bitビルドのアプリ(wow64で動作)と64bitドライバの組み合わせで動作させることは可能でしょうか? DeviceIoControlなどのドライバとのIOなど、その他動作面で問題ないでしょうか?
VisualStudio2008でビルド後にVMware内で起動させてデバッグするにはどうすればよいでしょうか? できればF5キー一発ぐらい自動的な方法でお願いします
>>153 並行して設計できるようにならないと無意味
訂正:設計できるように→設計もできるように
>>165 すみませんが実機でビルドしてVMwareにロードさせる方法を教えてください
実機でビルドしたならそのまま動かせばいいだろ。 開発機でビルドしたというなら話は別だが。
>>169 逆に普段どうやってるんだ?
隣のPCで動かすのと同じだろ。
プロジェクトフォルダごとDVCSのリポジトリにコミットして VMWare上の環境でそれをcheckout
それを自動化すればいいじゃん。
public継承する場合、派生クラスは基底クラスについてよく知っていると考えておk?
ある右辺を有する配列の番号?を得るにはどうしたらいいでしょうか? 例えば配列int x[3]の3つの要素がそれぞれ 1,3,5であるが、どのx[]がそれぞれ1,3,5を有するかわからない場合に、 maxたる5を有するx[?]の?を出力したいのです。 特に、これの2次元配列版の出力方法を教えていただきたいのですが
普通に検索する
配列の要素数がそんなに大きくなければ、for文で先頭から探せばいいんでねーがな。
ユニークなら格納方法を変える ユニークで無いなら考察無意味
>>174 よくではなく、ある程度知っていればOK。
#include "a.h" と書いた場合 ・そのファイルと同じディレクトリのa.h ・コンパイルしたディレクトリのa.h のどっちが選ばれるのかは決まってますか?
未規定
182 :
デフォルトの名無しさん :2010/03/31(水) 01:32:58
C++どれくらいで基本身につきますか? ちなみに今中学生です
perl出身なんだだけど、どうもCが無意味にめんどいように感じてしかたありません。 一言で言うと、制限とか宣言とか制約とか多すぎます。今、1変数1バイトの所まで知ってやる気がなくなってきました。 例えばですけど、こんなふうに処理が書きたいです my %fanc = ( 'fanc_a' => sub{ なんか処理 }, 'fanc_b' => sub{ なんか処理 }, ) my @fanc = ('fanc_a', '引数'); #これ外部から取り入れた文字列 my $code = '??'; #これも外部から取り入れた何かのコード $code =~ s/(変換しますお)/$fanc{"$fanc[0]"}->($fanc[1], $1);/eg; 完全に頭の中がperlに支配されてるんです。perlしかできないから。 Cを始めた理由は「exeなGUIを作りたかった」ってだけなんですが、もしかしてC以外を覚えたほうがいいでしょうか? なんでもいいからなんかお勧めしたり、Cを肯定したり、助言したり、こんな情報みれやとURLを貼ったりしてほしいです。 どうすればいいのか全てを見失ってきそうです。
185 :
デフォルトの名無しさん :2010/03/31(水) 03:05:47
>>183 人によるとしか。すぐできる奴もいれば10年かけてもダメな奴もいる。
数学・英語・料理・ゴルフ・・・なんでも同じだな。
ありがとうございます。 でもperlをexeにしたら、一通りやりましたが何を使ってもバグるんです。 警告なしで関数が動かずにスルーされてたりするんです。ひどいですよね。
ずっとperlだけをやるのが一番いいだろ。
189 :
デフォルトの名無しさん :2010/03/31(水) 03:28:50
perlが得意ならそのライブラリのソース読んで自作すればいいんじゃないのかな? もしくは修正する。 結局、言語部分でしっくりきてないようだけどさ、 どちらにしてもWindowsAPI(exeなgui)などの知識が別途必要になってくる訳だし。
Cの方が文法がシンプルで低級高速でバグが見つけやすくて綺麗に書けます
C++で簡単なゲーム作るのに初心者向けの本ぐらいの知識があれば出来ますか? やっぱりwindowsAPIの知識だとか必要
>>190 嘘付けアホ
泥沼化したらまずバグを見つける事は不可能に近いぞ
195 :
デフォルトの名無しさん :2010/03/31(水) 17:15:55
プログラムの中のプログラムを書く場合にプログラムの中のプログラムの文がStringだと 処理が重いので どうやればいいですか? アイディアが浮かびません。 本とかに乗ってるやり方教えてください。
196 :
デフォルトの名無しさん :2010/03/31(水) 17:23:01
勃起するまでもないまで読んだ
>>195 質問の意味が全然わからねぇ。
プログラムの中のプログラムってどういう意味だ?
デザインパターンのインタープリターパターンみたいなやつです。
構文解析木/抽象構文木というのを作って、それを元に処理する
意訳 関数中で文字列操作をするのだがStringクラスを使うと遅い これを改善する方法はないだろうか? 私は馬鹿だ 信頼性のある方法を教えろ
>>199 なるほど、パーサーがパースした物を初めから作れということですね。
しかし構文解析木の接点はstringじゃないんですか?
>>200 一行目が違います。
202 :
184 :2010/03/31(水) 18:54:50
ありがとうざいます。 他のスレとか見ても、言語に俺のようないちゃもん付けてる人いないので、 どうも俺の脳みその構造が間違ってたみたいです。 少し頭の構造を作り変えるべく勉強してまいります。 ありがとございました。
>>202 C言語はまだマシだがC++は発狂する難しさだから
今のうちに別言語のほうがいいんじゃない?
exeでさえ良ければrubyならexerbとかあったような気がするから
perlでもあるでしょ。
stringクラスの使い方が悪いから遅いってこともあるかと
>>203 C++ってそんなに難しいの?
独学では無理なレベル?
>>206 Cから移行しようかとおもってたんだが何か難しそうですね。
取り合えず全部の機能を使おうとするんじゃなくてbetter Cとして練習してみます。ありがとう
>>207 > 取り合えず全部の機能を使おうとするんじゃなくてbetter Cとして練習してみます。
うん、それが正解だと思うよ。
難しいの使ってる俺SUGEEE
ってなれる性格じゃないとちょっと嫌になりかねないし。
C++は昔からいいところもあれば悪いところも多いって位置付けだったのに、 最近はC++を本気で絶賛してる子が増えてる気がする 怖いね
統計とってから増えてるとか言えよカス てめーの感覚なんざ誰も信用しねぇよ
マジレスすると、Cでも面倒だと感じるなら、C++から手を出すなんてやめとけ C#→C→better CとしてのC++の順にやり、その上で、必要であればC++をやれ
C++よりCで作る方が面倒だって 入門書の例題レベルなら話は別だろうけど
>>212 そういう意味で言ったんじゃないんだけどな
214 :
デフォルトの名無しさん :2010/04/01(木) 03:50:26
ほんとC++はbeter Cがいいよ。
215 :
デフォルトの名無しさん :2010/04/01(木) 03:59:07
217 :
デフォルトの名無しさん :2010/04/01(木) 09:20:10
pimpl等 動的に確保したオブジェクトへのポインタをクラスのメンバとして持つ場合、 普通の生ポインタではなくスマポを使うようにといわれています。 深いコピーを想定しているため共有する必要はないので、必ずしもshared_ptrである必要はありません。 この場合は実際, std::shared_ptr(まだ標準でない) std::unique_ptr(まだ標準でない) std::auto_ptr(標準) boost::shared_ptr(boostが入っていない環境では使えない;準標準) boost::scoped_ptr(boostが入っていない環境では使えない;準標準) と5通りほど考えられると思うのですが 普遍性、速度などの面でどのスマポがいいのでしょうか。 よろしくお願いします。
その場合は生ポで十分
>>217 >普通の生ポインタではなくスマポを使うようにといわれています。
どういう理由でスマートポインタが必要なんだ?
それががわからないのに選択できるわけがない。
そういう言った本人にお伺いを立てる方が100倍速いわ。
何でもかんでもスマポスマポ言う奴は雑魚
まぁ雑魚は大概複数で群がっている
>>217 shared_ptrをpimplで使うのは、不明な型を安全にdeleteできるメリットがある。この理由のためだけにpimplで使っても良いよ。
pimplの為に使うのであれば、shared_ptrの複製を作らない可能性が高く他の方式と速度の差は殆ど無い。
>>218-217 動的に確保したオブジェクトへのポインタをクラスのメンバとして持つ場合、
スマートポインタを用いるのが間違いが起こりづらく可読性も高いという
コンセンサスがC++界にはあるのかと思っております。
>>224 動的削除子により不完全型を持てるというやつですね。
スマートポインタ好きもそうでないのもいると思うが、 あれ可読性は高くないだろ? 見た目はかなり汚い
まじめにCをやることになって VC++2008を入れたら、すっげーめんどくさいことになりました。 今まではサクラエディタとか秀丸とかそんなのを使ってて、ALT+Z を押したら編集中のコードがそのままexeになって勝手に保存されてる仕組みでした。 と言うかプロジェクトってなんですか? 統合環境とやらは使ったほうがいいんですか? 使ったほうがいいなら、VC++2008のサイト教えてもらえないでしょうか?(検索したら記述のサイトばっかり出てくる)
真面目に大規模なコード組むならIDEがあれば楽なことには違いない。 最後の行は何が聞きたいのかイミフ
>>228 makeを書けないなら統合環境使っとけ。
231 :
228 :2010/04/01(木) 22:36:05
今の所、コンビニに行くのにメリーゴーランドに乗って出かけるような気持ちでいっぱいです。 makeのためなら使わないかも・・・ たまたま連休がめぐってきて、なおかつやる気があった日に使い方を調べてみるかもしれません。
エディタ・ビルド・デバッガが融合してるのは便利。もう戻れない。 Edit and Continueを初めて見た時は感動した。
makeをIMEに通したら負けに変換される
>>231 まずは付属のドキュメント読んでチュートリアルやれ
中途半端な知識を応用して手探りで取り組むより遥かに良い
>>228 「まじめにCをやることになって」ということだけど、この意味がわからないね。
まじめにやるのなら統合環境を使えるようになるのは当然のことだと思うし、
その気があれば数時間もあればビルドぐらいできるようになるはず。
Windows に依存したくないとか、趣味のプログラムなら VC 使う必要ないし、
自分が使えるコンパイラでやってればいいんじゃないの。
コードをトレースしてデバッグとかも必要ないんでしょうからね。
最近の子はmakeも書けない
だってautomakeあるもの
A. make は書けるが統合環境は覚えられない B. make は書けないが統合環境いこなせる Bの方が使えるよ
>>238 えー、まじで?
でも統合環境めんどくさくね?
俺の秀丸なんて、改行するたびにデバックモードでコンパイルされるよ。
F5とか押す必要もなければ、使う予定もない大量のファイルが生成されることもない。
ちなみにF5を押した場合に最後にデバックしたときのログが表示される。
>>239 改行する度にコンパイルなんかされたら、まともにコード書けないだろ。意味わかんない。
F5かどうかはともかく、コンパイルや実行の指示ができないんなんてありえない。
大量のファイルとか作成されても見る必要がないから関係ない。
統合環境でないと関数のヘルプも見れないだろうし、インテリセンスも機能しない。
リソースも直接 .rc を編集するの??
デバッグ時はコードのトレースもできないし、コールスタックの確認もできない。
つかブレークポイントも設定できないじゃん。
変数の内容を確認するときにはprintf で出力するのかwww
まともなアプリケーションなら開発効率が10倍ぐらい変わってくるねよ。
けどまぁテキストベースのお遊びのプログラムなら、どっちもで変わらんかもな。
多分そういう世界の話なんだろうな。
デバッグとホットスポットが見られないのは痛すぎるな。 これない環境で同レベルまで自力でやるとなると 10倍どころか100倍やっても追いつかないのでは。 問題点の発見は難しい
えー? eclipseもseve automatically before build がデフォじゃん
書き込みテストうんこ
244 :
デフォルトの名無しさん :2010/04/02(金) 21:49:33
勃起するまでもない質問はここに
stdinを読む場合、キーを押してエンターを押しますが、エンターの押下を待たずにキーが押された時点でstdinを読ませることはできますか?
>>245 できないんじゃね?
Windows かどうかしらんけど、まあAPIを使えばいいじゃないの?
247 :
デフォルトの名無しさん :2010/04/03(土) 18:45:03
VC++6.0について質問です。 VB6.0のdebug.print、VB.NETのConsole.WriteLine()に相当する IDEのウィンドウに結果を出力する方法を教えてください。 宜しくお願い致します。
>>247 ::OutputDebugString()
しかしVC++6とはレトロ趣味ですね
249 :
デフォルトの名無しさん :2010/04/04(日) 00:20:41
VC++2008で、エディタのみ立ち上げてインテリシンクを使いたい のですが出来ますか? VCを立ち上げてプロジェクトを開いた形でならソース編集時にインテリ シンクは動作しますが、できれば軽いエディタのみで編集したいのですが・・・ vs2008 express editoin
250 :
デフォルトの名無しさん :2010/04/04(日) 00:21:43
使えるよ。
タダじゃ教えられねぇな
>>252 教えてやれよ。
「使えるよ」「できるよ」とか一行レスされて、
やりかたを教えてくださいって聞き返してくるやつ珍しいな。
ほかはコミュ力無いから、そのまま黙っちゃうのに。
糞重いIDEに洗脳されてる輩が増えてるな。 開発効率は軽さこそ命なのに。 ブレークポイントだのスタックトレースだのが無いと開発出来ないなんてのは 器具がないと治療できませんとぬかす現代の医者のようだな。 組み込み機で割り込みベクタのデバッグとかやってみ。
アホか 開発速度こそ命の安い案件がどれだけあると思ってるんだ
>>256 ・まず人を見下す
・文意を読み違えている
・憶測をもとにした論拠
君、もう全然ダメ。今日は一日寝てなさい。
ここで聞くほどでもないんだろうけど、FindFirstFile()使ってサブディレクトリ内のファイルまで網羅リストアップしたいんだけど、 サブディレクトリのパスを一時格納するのってvector,list,dequeとかで何がいいんだろう あるディレクトリ内を検索して、サブディレクトリが見つかったらパスを↑のコンテナに入れて、検索が終わったときコンテナに要素が残ってればそいつの中を検索して、ってのを繰り返したいんだ 使ったことがあるのはlistだけなので、別な物も使ってみたい ぶっちゃけstackでも用は足しそうだけど、速さや容量やコードのシンプルさ求めるとどうなのかなあと
そういう目的ならコンテナアダプタStackが良いだろう
幅優先探索はqueue
Aクラスを継承して作成したBクラス( Move()関数のみオーバーライドしている )に Aクラスの情報をすべてコピーしたいんですけど、どうするのが一番良いでしょうか? A obja B objb … objaのいくつかの処理を行う … objb = obja; 仮にこれができるのなら、objaと同じ状態のobjbは出来そうですが…
266 :
265 :2010/04/04(日) 19:15:20
捕捉ですが、コピーしたい情報は手動でおこなうにはかなり莫大です。 そもそも、Bを作らず、BでオーバーライドしているMove()を、 AのMove()とは別にAの中に作り、 A obja,objb; ... objaのいくつかの処理を行う ・・・ objb = obja; として、それぞれのMove()を使い分けする方法は思いつきましたが、 それだと1つのクラスに2つの概念を取り込む形になってしまって気持ち悪いですよねぇ・・・
その膨大な内容を構造体として持っておくとか
単一用途のプログラムをライン工のようにもくもくと作り続けて年取っちゃった古いプログラマと、 プログラミング勉強しててある瞬間にそれまでわからなかった事が急に見え始め、万能感に囚われ、 どうして理解出来たかを自分理論で整理し始めた脱初心者くらいの人は、得てしてプライドが高くなりがち そしてプライドの高さに反比例するように、視野はどんどん狭くなっていきがち
>>268 脈絡がわからない。
どれに対して言ってるんだ。
>>269-270 うはwwww
誤爆だったんだが、タイミング良く書き込みエラーになったから無問題と思ったのにwwww
なんか時間差で書き込まれてたスマソ
272 :
270 :2010/04/04(日) 21:08:01
273 :
265 :2010/04/04(日) 21:38:28
>>267 うーん、それだとprivateとpublicそれぞれに変数がある場合だったり、
Aが派生クラスで、基底クラスの更新が考えられる場合などに、
構造体が1つでなく2つ3つとなったりして、対応しきれないんですよね
「全状態と全関数を引き継いで、その上で異なる動きをさせる」ってのがやりたいんですが・・・
>>266 で書いたようなことをすると、気持ち悪いという以外にも
BがAと共有しているポインタをいじってしまう恐れがあるんですよね。
BにAをコピーした上で、『Bにさせる動きだけ』をBでオーバーライドすれば
Bの中身を見るだけで、危ないことをしてないかどうか管理できるのですが・・・
274 :
265 :2010/04/04(日) 21:59:34
ちょっと分かりにくかったので、やりたいことをもう少し具体的にしておきます。 「Aの "ある時点での" クローンを作成し、そのクローンの動きを監視したい」です ただし、これはあくまで『見えない』クローンであって、一時的な処理に必要なだけなので ・目に見える処理はさせない必要と、 ・Aと共有しているポインタをいじらない必要 があります。 その解決策として、継承→オーバーライドを考えているわけです ポインタに関しては「クローン用のコピーを作成すればいいのではないか」となりますが、 そのポインタ自身(Cというオブジェクト)がさらにポインタを持ってたりして それら全ての「その時点」をコピーする必要があってややこしいので、 「Bの処理だけに着目」させて、ポインタは必要な場合のみコピーを作成する、というようにしたいのです
>>265 何がやりたいのかよく分からないです
コードも使って説明した方がいいよ
>>274 普通にディープコピーすりゃいいんじゃないの?
278 :
265 :2010/04/05(月) 00:05:10
// Aクラス内 class A : public ICloneable{ protected: int m_time; public: virtual void Move(){ m_time++; } ICloneable* A::Clone(){ ICloneable* clone = new A(); *clone = *this; return clone; } } // Bクラス内 class B : public A{ public: void Move(); // オーバーライド } // Cクラス内 A* obja = New A(); obja->Move(); B* objb = A->Clone(); objb->Move(); これだと、「ICloneable*からB*に変換できません」とエラーが出ますが やりたいことは伝わるかなーと思います... Bを独立させて動かすことにより「Aの数F先の動きを読む」というのが狙いです。 実際はBのMove()内でAのMove()でさせている処理をいくつか省いています
279 :
265 :2010/04/05(月) 00:07:20
あ、上から8行目あたりの A:: はいりません・・・
>>279 単に B::B( const A& a) : A(a) {}
があれば十分なんじゃねーの?
B::B( const A& a){} だけならただのコンストラクタってわかるんですが、後ろの「: A(a)」はどういう意味ですか?
入門書を読みましょう
283 :
281 :2010/04/05(月) 02:05:19
すみません、コンストラクタ初期化子ってことはわかりました 参照型のaをBの基底であるAのコンストラクタに渡している・・・ということですよね で、Aに A::A( A& a ) { m_time = a.time; ... } といった感じで値のコピーをするコンストラクタを実装する・・・ ということで合ってるでしょうか
残念ですが違います。質問する前に入門書ぐらいは読んできてくださいね
いけました(*´д`*)
質問です。Windows限定(VC++限定?)かとは思いますが、 #pragma once という一文についてなのですが、ググって調べた所、インクルードガードを1文で行える便利な物と解説があったのですが、 これの有効範囲というのは、「その一文が置かれたそれ以降」に適用になるのか、 それとも「それが書かれているファイルの内容全てが対象」になるのかどちらなのでしょうか。 確認しようと試しにテストコードを書いてみたのですが、あってもなくても違いがよくわからず、はっきりしないため悩んでいます。 よろしくお願いいたします。
#pragma は処理系依存
>>287 Windows限定(VC++限定?) と書いてあるのが見えないの?
馬鹿なの?死ぬの?
>>286 今ちょっと確認できないけど、
#pragma onceをファイルの一番最後に書いてみるとかどうだろう。
「それ以降のみ有効」なら、
インクルードガードが無いときと同じリンカエラーが出るんじゃない?
>>286 >これの有効範囲というのは、「その一文が置かれたそれ以降」に適用になるのか、
以降での適用です。
hoge* a,b; void minsyu(hoge* x) { hoge* manifesuto = new hoge(); x = manifesuto; } void main() { minsyu(a); minsyu(b); } ↑のプログラムを実行したところ、aとbに同じアドレスが入りました スコープから外れたことでポインタ変数(manifesuto)が消されたのはわかるのですが、 このとき、ヒープ領域にはaとb2つ分のhogeサイズが確保されてるのでしょうか? それとも、aはbに上書きされてるんでしょうか?
void minsyu(hoge*& x) { hoge* manifesuto = new hoge(); x = manifesuto; }
>>291 1) hoge *a, *bじゃね?
2) 「ポインタ変数が消された」意味不明。
3) hoge *h = new hoge()した領域を削除するにはdelete hの呼び出しが必要。
4) minsyu(hoge **x)で*x = manifesuto;しなければもとのaにもbにも代入されない。
5) だから、「aはbに上書きされてる」なんてことは永遠に無い。
二回newされて、どこにもポイントされない領域が出来上がって、
それは削除されたりもしていないし、もとの変数aにもbにも何の値も代入されない。
これで間違いなく動くな class hoge { int x; }; hoge* a; hoge* b; void minsyu(hoge*& x) { hoge* manifesuto = new hoge(); x = manifesuto; } int main() { minsyu(a); minsyu(b); std::cout << "Address a = " << std::hex << std::showbase << reinterpret_cast<unsigned>(a) << std::endl; std::cout << "Address b = " << reinterpret_cast<unsigned>(b) << std::endl; delete b; delete a; }
295 :
291 :2010/04/05(月) 22:02:33
んー、長いので無理やり縮めたつもりが全然別物になってました。長いので2回に分けます class aho { int y; }; class puyo { public: int x; aho* m_aho; puyo() { m_aho = new aho(); } ~puyo() { delete m_aho; } puyo puyo::operator=(const puyo& obj) { delete m_aho; memmove( this, &obj, sizeof(puyo) ); aho* w_aho = new aho(); *w_aho = *m_aho; m_aho = w_aho; return *this; } };
296 :
291 :2010/04/05(月) 22:04:20
class hoge { public: puyo* m_puyo1; puyo* m_puyo2; hoge::hoge() { m_puyo1 = new puyo(); m_puyo2 = new puyo(); } ~hoge() { delete m_puyo1; delete m_puyo2; } void minsyu() { puyo* manifesuto1 = new puyo(); puyo* manifesuto2 = new puyo(); *manifesuto1 = *m_puyo1; *manifesuto2 = *m_puyo2; m_puyo1 = manifesuto1; m_puyo2 = manifesuto2; } };
297 :
291 :2010/04/05(月) 22:05:07
int main() { hoge* a = new hoge(); a->minsyu(); std::cout << "Address a = " << std::hex << std::showbase << reinterpret_cast<unsigned>(a->m_puyo1->m_aho) << std::endl; std::cout << "Address b = " << reinterpret_cast<unsigned>(a->m_puyo2->m_aho) << std::endl; delete a; } 3回になってしまった・・・ これで、表示されるアドレスがいっしょになります ※実際に動かすとdeleteがうまくいかずエラーが出ます
>>297 Error 00001. 0x310030 (Thread 0x0ACC):
Reference to freed resource:
delete(0x00BA79D0)
| reference_of_pointer2.cpp line 17:
| }
| ~puyo() {
|> delete m_aho;
| }
| puyo operator=(const puyo& obj) {
Call Tree:
0x00401E5B(=reference_of_pointer2.exe:0x01:000E5B) reference_of_pointer2.cpp#17
0x00401BF0(=reference_of_pointer2.exe:0x01:000BF0) reference_of_pointer2.cpp#39
0x004012BC(=reference_of_pointer2.exe:0x01:0002BC) reference_of_pointer2.cpp#61
0x32AD8D9E(=CC32100MT.DLL:0x01:0D7D9E)
以下省略
山ほどエラーが出るが、大要はフリーした領域に書きこみを行っているな
>>297 void minsyu() {
puyo* manifesuto1 = new puyo();
puyo* manifesuto2 = new puyo();
*manifesuto1 = *m_puyo1;
*manifesuto2 = *m_puyo2;
m_puyo1 = manifesuto1;
m_puyo2 = manifesuto2;
}
これまずいやろ
交換してるんだと思うが、上書きしてしまっていてメモリリークが起きている
これでメモリリークは無くなる 意図した動作かどうかは知らんが class hoge { public: puyo* m_puyo1; puyo* m_puyo2; hoge() { m_puyo1 = new puyo(); m_puyo2 = new puyo(); } ~hoge() { delete m_puyo1; delete m_puyo2; } void minsyu() { puyo* manifesuto1 = new puyo(); puyo* manifesuto2 = new puyo(); puyo* t1; puyo* t2; t1 = m_puyo1; t2 = m_puyo2; m_puyo1 = manifesuto1; m_puyo2 = manifesuto2; manifesuto1 = t1; manifesuto2 = t2; delete manifesuto2; delete manifesuto1; } };
301 :
291 :2010/04/05(月) 22:57:53
puyo::operator=(const puyo& obj) の中でdeleteしてから memmove() してるのがダメなのか...
aho* delaho = m_aho;
delete delaho;
memmove( this, &obj, sizeof(puyo) );
一般的なポインタ重複防止策は知らないけど、これで解決...?
>>300 指摘感謝
302 :
デフォルトの名無しさん :2010/04/05(月) 23:00:14
意味不明だから、先ずはクラス使わないで作れよ。
>>301 いやそれは関係無い
deleteしないとメモリリークするでしょ
>>291 クラス使うの初めてなんだろ?
俺コーディングする前に定石を覚えろ。
まずthisに上書きとか乱暴なテクニックは最後に覚えろ 最初はちまちまいじくってた方がいい
the file だね
ソースやヘッダをディレクトリの中に入れて整理しているのですが インクルード時に #include "Uon/Sanukiudon.h" とすると見つかりませんエラーが出て #include "Sanukiudon.h" にしたらちゃんと見つけてくれました。 (実際にはディレクトリの中に格納されてるのも関わらず) これは一体全体どういうことでしょうか?
>>308 確認。
> (実際にはディレクトリの中に格納されてるのも関わらず)
#include "Sanukiudon.h"としたソースファイル.cppの存在するフォルダと
"Sanukiudon.h"が同じフォルダにあるの?
それともそうでないの?
>>309 両方なんです
例えばルートのmainからディレクトリの中に入れてるファイルをインクルードするときも
ディレクトリの中から同じディレクトリ内のファイルをインクルードするときもどちらも
ディレクトリを取ったパスを書かないと駄目な感じです
参考書にはcppの位置に関わらずヘッダの位置をフルパス(プロジェクトのルートディレクトリ
から見て)書いとけって書いているので真似をしようとしたのですが
https://developer.mozilla.org/ja/C___Portability_Guide#.23include_.e6.96.87.e3.81.ab.e3.81.af.e5.8d.98.e7.b4.94.e3.81.ab.e3.83.95.e3.82.a1.e3.82.a4.e3.83.ab.e5.90.8d.e3.81.ae.e3.81.bf.e8.a8.98.e8.bf.b0.e3.81.99.e3.82.8b なんの理由があってその本はそれを推奨しているんだ? どうせ書いてないだろうが
class Test { template<int T> int func( int val ){ return val; } template<> int func<2>( int val ){ return 2 * val; } }; をコンパイルしようとすると以下のようなエラーが出てしまいます。 test0.cpp:11: error: template-id ‘func<2>’ in declaration of primary template test0.cpp:11: error: ‘template<int T> int Test::func(int)’ cannot be overloaded これは文法的に間違っているのでしょうか? gcc version 4.4.1 です。
>>311 参考書には「プロジェクト内に同じ名前のファイルがある場合の為にフルパスに
しておいた方が間違いが起きにくい」と書いてます
実際サンプルもディレクトリ違いで同じファイル名の別のものがあります。
でもこの参考書のWEBサイトによるとこれはVC2005用なのでVC2008では
異ディレクトリでも同一ファイル名は使えないのでファイル名を変更しなさいと
書いてありましたので…2005では意味があったけど2008では意味が無い
ということになりますね…あれ?
>>308 >#include "Uon/Sanukiudon.h"
>とすると見つかりませんエラーが出て
Uon → Udon にすればいんじゃね?
>>313 ディレクトリ構成を改めて書いてくれ。言いたいことがよく判らんぞ。
例えば、
<project home>/Udon/Sanuki.h
<project home>/Udon/Sanuki.cpp
<project home>/main.cpp
こういう構成ならmain.cppからなら
#include "Udon/Sanuki.h"
で、Sanuki.cppからは
#include "Sanuki.h"
でインクルードできる。
<project home>がディレクトリサーチパスに指定されているのなら、Sanuki.cppからも
#include "Udon/Sanuki.h"
でいい。
<project home>/Udonがディレクトリサーチパスに指定されているのなら、どちらからも
#include "Sanuki.h"でいい。
>>312 理由は兎も角、特殊化版を外に出せばコンパイルできると思う。
template<>int Test::func<2>(int val) {return 2 * val;}
318 :
313 :2010/04/08(木) 13:01:35
∧∧ ヽ(・ω・)/ ズコー \(.\ ノ 、ハ,,、  ̄  ̄
ワロタw
>>317 で、元の書き方は文法的に正しくないということですか?
ところで>313の >異ディレクトリでも同一ファイル名は使えないのでファイル名を変更しなさい ってマジ?
ム板のどっかでも同じことを見たな まあその本の著者の勘違いが原本だろう
C++ってjavaみたいに 親クラス型のポインタに子クラスを入れたとして、そこから子クラス固有のメンバ関数呼べない?
Javaにポインタってあるの?
>>326 Javaでもそれ、キャストしないと呼べないんじゃ
以下のプログラムを 「-Wall -O2」 オプションを付けてコンパイルすると test3.cpp:17: warning: dereferencing pointer ‘<anonymous>’ does break strict-aliasing rules test3.cpp:17: warning: dereferencing pointer ‘<anonymous>’ does break strict-aliasing rules /usr/include/c++/4.4/bits/stl_tree.h:175: note: initialized from here のようなwarningが出ます。 「-Wall」「-O2」どちらかだけでは出ません。 また、「-Wall -O1」では出ず、「-Wall -O3」では出ます。 これはどういう意味のwarningなのでしょうか? ================================================ // a、bは0~9の値をとるとする class Hoge { public: double a, b; Hoge( double a, double b ) : a(a), b(b) { } bool operator<( const Hoge& rhs ) const{ const double l_val = a*10 + b; const double r_val = rhs.a*10 + rhs.b; // <- 17行目 return ( l_val < r_val ); } }; int main(int argc, char* argv[]) { map<Hoge,int> mmm; mmm[ Hoge(0,0) ] = 0; }
壁にぶつかったみたいだな。 Wall だけに。とかいって
【審議中】 ?? (∵) (∵ ) ( ) (∵) ( ∵) (TT) (∵) (∵)y-~ (∵)♪ (∵)…
>>331 g++ 4.1.2 で -O2 -Wall そのコードを試してみたけど、警告は出なかったよ。
g++ 4.4.1で出たけど出る理由は分からない
BUGじゃね
337 :
331 :2010/04/09(金) 21:06:29
書き忘れました。
g++ 4.4.1 です。
全く考えもしませんでしたが、
>>334 、
>>335 さんの結果を見ると
>>336 さんの通りバグなんですかね…
mapに関数オブジェクト渡して見れば?
VC9でもエラー出ないしな
おまえら最適化に失敗したって警告に何馬鹿言ってんだ。 英語の翻訳の仕方くらい勉強しとけよ。
>>340 お前が一番わかってない
そんな内容のメッセージなんか出ちゃいない
type punningでぐぐれ馬鹿
0が数字 or NULLか判断するポイントを教えてください
_
第一引数の文字列の中から第ニ引数の文字を検索して、一番後ろにあるものの位置を返す char* strrchr( const char *s, int c )関数の第二引数は文字列が 変数だった場合どのようにすれば正しい結果が得られるのでしょうか。
>>344 2行目と3行目の日本語がよく分からん。
第二引数を文字じゃなくて文字列にして、一番後ろにある文字列の先頭アドレスを返したいとか?
347 :
344 :2010/04/10(土) 00:46:26
以下がんばって翻訳 自分が調べたものは int c='C'; strrchr(str,c); のように検索したい言葉が文字リテラルの場合しか出てきませんでした。 ですが、検索したい言葉が char str2="あいう"; のように変数で指定できるようにしたかった場合、第二引数はどうすればよいでしょうか。
strstr使えば?
strstrって多バイト文字に対応してるの?
350 :
344 :2010/04/10(土) 01:04:17
どうしても後ろから調べたい理由がありまして。 GetOpenFileNameで取得したファイルパスからファイル名を除くようにしたいもので。 もっといい方法あったら教えて下さい。 (最初からこう書けばよかった('A`))
stringにしてrfind
strsokで一回バラバラにしてまた再結合すればいいじゃん
strrchr()で \\ を探して \0 を書けばいいだけでは?
>>350 SHLWAPIのPathRemoveFileSpec使う。
あるいは、boost::filesystem::pathにて、parent_path()してexternal_directory_string()するなど。
>>354 こういう環境依存のレスする奴ってバカなの?死ぬの?
Boost.FileSystemはPOSIX/Windosで動くから大概の環境で大丈夫だろう。 そもそも元の質問自体が環境依存な件。
unixとWindowsしか知らないカエルごときが偉そうに回答してるわけね、納得
>>357 あ?他になにがあるっつーんだ
まさかLinuxとか答えたりしないだろうなハゲ
ホントに知らないんだwゴメンゴメン、カエルちゃん。
>>359 おい逃げるな
他に何があるか答えてみろカス
swodniW
死ね
VB + GetParentFolderName に相当するVCで使えるAPI知りませんか。
>>360 せっかく井戸の中に居るんだから無理して出ないほうがいいよー(ワラ
こんなくだらん関数くらい作れないでプログラマかよ、泣けてくるぜ。 static void getparentpath(char* parent, const char* fullpath) { strcpy(parent, fullpath); char* ptr = strrchr(fullpath, '/'); if (ptr != NULL) { *ptr = '\0'; } }
あ、まちがえたw static void getparentpath(char* parent, const char* fullpath) { strcpy(parent, fullpath); char* ptr = strrchr(parent, '/'); if (ptr != NULL) { *ptr = '\0'; } }
このスレ見てたらバカが居たから横槍を入れてみたくなった。
>>357 >>359 おい 良いからさっさと答えてみろよ
POSIX/Windows API環境以外で君が知っている環境を答えてごらんよ?
なんという頭の悪い自演
>>368 言うと思った。でもまあ関係ない
さっさと答えろよ
平和ですなぁ
やっぱりIPアドレスを表示させないと 自演か自演じゃないか決着付かないのがやだな。 まあどうせ串通してきたりするだろうけど。
>>373 そこまで自意識過剰なのは、もう病気というべきか。
unixかwindows以外でCを使う環境?そんなん無数にあるじゃんw
>>350 でGetOpenFileNameって言ってんのに、環境依存がどうとかバカじゃね?
よっぽど悔しかったんだね〜
378 :
371 :2010/04/10(土) 14:33:38
>>375 誰もそんなこと言ってない。
良いから早く答えろ。
>>376-377 お前ら同一人物かどうか知らんが
同一だろうがバカの集合だろうが関係ない
誰か答えて見せろよw
376はどっちかって言えば371側だろw
380 :
371 :2010/04/10(土) 14:43:48
良くレスを読んでなかった。
もしそうならゴメン
>>376 でもまあとにかく他のヤツは良いから
俺は
>>357 に答えて欲しいんだ。
POSIX/WindowsでBoost.FileSystemが動かない環境は?
>>375 > unixかwindows以外でCを使う環境?そんなん無数にあるじゃんw
Boost.FileSystemはC++のライブラリなんだけど。無知を晒すなw
なんか意味がどんどんずれてきてるような
boostってインストールしないと動かないんじゃなかったっけ それだとレンタルサーバみたいな自分でインストールできない環境だと動かないんじゃね?
まあ落ち着け。
>>356 ってさあ、
>Boost.FileSystemはPOSIX/Windosで動くから大概の環境で大丈夫
って言ってるけど、
それを否定してる
>>357 って別に
「POSIX/WindowsでもBoost.FileSystemが動かない環境はある」
と言ってるとは限らないのでは。
「POSIX/Windows以外にもC++の環境はあるからBoostの例はよくない」
という可能性もあるわけで。
357はただの低脳煽りだろw まともに相手する価値なんてねーよ
385 :
356 :2010/04/10(土) 15:36:52
>Windos 今さらながらtypoしてた。恥ずかしい。 というか、ファイルパスとかディレクトリという概念自体が環境依存だよね。 デリミタだって'\', '/', ':' いろいろあるし、ダメ文字の問題もあるし。
もうどうでもいいよ お前ら全員あぼんしたいから安価しろ!
ム板の民度の低さは異常 まともな大人が10割もいない
>>387 ネタ?wwwネタだよなwww
まともな大人が10割居るコミュニティなんてこの世に存在しないだろ
0.721割は紳士タイム。
割合と小数点数表記を混ぜたらダメだと思うんだ
>>387 > まともな大人が10割もいない
これは恥ずかしいwwwww
こんな自己言及的な無知レスは久々に見たぜw
"10割もいない"でググったら一件しかかからなかった これは新しいネタだな覚えておこうw
>>387 に聞いてみたい、
自分のレスのどこがおかしかったかって分かってる?
今のVIPにもこんな元気な反応欲しいよな
2割もいない=20%以下だ(だがおおよそ20%は居る) ↓ 10割もいない=100%以下だ(だがおおよそ100%は居る) ↓ まともな人間が10割もいない=ほとんどまともだけど、一部まともじゃない人がいる なんだ正しいじゃないか
何十割とか口が付く名字とかVIPPERの定番ネタ てかスレチだから帰れ
俺はちなみに賢者タイム
>>399 20割もいない
とかだったらまだ分かるけど、
10割もいない
は素でやっちまったんだろうな。
漠然とした質問でアレなのでつが 多数のファイル(クラス)に別れたプログラムを効率的に目で追っていくワザってありますか? 極端に言うファイルごとに全てのコードをプリントアウトして見比べると分りやすいのですが コストがかかるので、エディター上でラクに確認できればと。。。
ソースを目で追って、それで何がしたいのか?? 例えば、関数のcall/retrun をみる。
>>403 VisualStudioなら、変数やらメソッドやらを右クリックして、
宣言に移動とか、すべての参照を検索やらって機能があるんで
それが便利。
eclipse+Javaでも同様の機能が使えたんで、eclipse+C++とか
NetBeans+C++の組み合わせでも同様の機能があるかもしれない。
IDE信者が鬱陶しいな IDE無いと何も出来ないんじゃねえのか
全自動洗濯機信者が鬱陶しいな 全自動洗濯機無いと何も出来ないんじゃねえのか パソコン信者が鬱陶しいな パソコン無いと何も出来ないんじゃねえのか
なんでも信者扱いとか、そんな極端な視点しか持てない脳だと まともなロジックなんか組めないぞ♪
ide使いこなせなくて悔しいのはわかったよ
図星を突かれたらしいな、すごいファビョり方だw
○○が無いと何もできない、というのは○○に対しての評価であったりする。 PerlやRubyでやれば簡単なことを、Cでやってる人がいて、 「PerlやRubyが無いと何もできないんじゃねえのか」と言っても空しいだけ。 マッチやライター持ってる人に原始人がケチつけても空しいだけ。
クソ重いIDEなんぞ有難がって使うものじゃない、他に選択肢が無い時に嫌々使うものだ。 あんなもの有難がるのは駆け出しの素人だけだろ。
emacs暦13年だがそれはそれ。 IDEはIDE。便利なものを、便利に使える時に使う。
>>412 いいから働けよ。Helloworld ばっかり書いててもご飯食べられないんだぞ?
>>414 つまり Hello World をやめてハロワに行けって事ですね
IDEは便利だけど、開発速度で見たらエディタが良いので、 エディタで済ませられる時はエディタで済ますようにして効率向上を図ってるなあ。
>>416 実際、その時都合が良い方で書けばいいだけだもんな
どっちかしかダメとか、どっちかしか使えないとか、そういう事じゃないもんな
>>406 ideじゃなくても、タグジャンプ機能くらいあるだろ?
そういうのも使わんの?
IDEじゃなくて素のエディタを使ったほうが開発早いってのが分からない。 各種機能がシームレスにつながってるIDEのほうが効率いいだろ。
>>419 おまえがそういう開発環境しか知らないだけだってのに
>>419 伝統的に IDE を使わないスタイルが主流な
プラットフォームとか、
高々数百行程度のコードしか書かない人とか、
色々なケースがあるだろ
>>420 IDEより効率いい環境あるよって言っても、
具体的にどういう環境かかけないんだろ?
どうせ2chだし。
>>419 >>422 こういう井の中の蛙でも口は付いてるからな、一丁前な減らず口を叩くのが鬱陶しい。
おまえの狭い世界で何がわかるんだと。
IDEが要らない開発環境なんかいくらもある。組み込み機もそうだし、UNIX上でsocketサーバを作る時もそうだ。
phpとかのwebアプリケーションだってIDEなしで作る人もいるだろうに。
>>423 それって、IDEが使えない仕事ならIDEが効率よくないって当たり前の話だよね。
やっぱIDEが使える環境なら、IDEが効率高いと。
>>425 で、相変わらず、IDEより効率いいって環境の具体的な名前はでてこないと。
>>426 意味不明。
散々説明しただろうに。
それとも、プロジェクト名だか何だかを引き出そうとでもしてるのか?NDAって知ってるか?
>>427 散々っていうか、説明っぽいのって、
>>423 だけじゃん。
それも、IDEが使えない仕事もあるよってだけで。
上のほうを見ると、IDEが使えてもより効率のいい環境があるような
ことを言ってる人がいるじゃん。
機密事項で、名前もだせないような特殊なツールでも使って
環境を構築してるのかね。
そういうのは一般論で語らないでほしいよ。
まあ、屁理屈こねて逃げまわってるのは明らかなんで、IDEより
効率のいい環境ってのは、IDEを使えない人の妄想ってことで決着ですね。
あとは具体的な話がでてくるまで一切相手をしないので、そういうことで。
>機密事項で、名前もだせないような特殊なツールでも使って だからお前はツールがないと何一つ作れないのかとww makeとエディタとgrepとsedかawkあたり、pythonでもいいが、 その辺があればツールなんて自分で作れるだろ。 IDEがあってもなくても作れるものは、例えばWindowsのコンソールアプリケーションなんかがそうだが、 こういうのはコマンドラインのほうが効率いいんじゃないのか? IDEを使うときっていうのは大抵、それがないと作れない=嫌々使う時だよ。 言いたかったのはそんなことじゃない、IDE様様っていってる奴はIDE無い時にモノ作れるのか?ってことだ。 世の中IDEが無い環境はいくらもあるんだからな。
>>429 ええ、ツールって、makeとかgrepとかスクリプト言語のことだったのか。
まじめに相手して損した。
捨て台詞で勝ち誇られても意味わからんだけだぞ
俺はvc++使ってるんだけどこれぐらいインテリセンスがうまく働く普通のエディタって有るの? これがあれば俺もエディタでいいかなって思うんだけど、いままで使ったのは中途半端な感じ
>>429 > こういうのはコマンドラインのほうが効率いいんじゃないのか?
やっぱIDEのほうが効率いいでしょ。
コマンドラインになったらIDEの機能が使えなくなるわけじゃないし。
>>431 makeやらgrepで効率いいって言ってる人って、IDE使ったことの無い人でしょ。
IDE以外と言いながら各種ツールで構築したIDEもどき持ってこられても微妙
>>434 makeやgrepがツールだとは書いてない。(ツールだけどな)
>makeとエディタとgrepとsedかawkあたり、pythonでもいいが、
>その辺があればツールなんて自分で作れるだろ。
自分で作れる、と書いたんだ。
案件ごとにコンバータやら何やらの要件は変わってくる。それらを拾い上げるのには
各種ツールを組み合わせて自前の変換ツールを作るんだよ。
このスレは本当にくだらない事でもめるよな。 レベルがそんな程度なんだろうな。
>>436 それだったらIDEでも作ればいいんじゃね?
逆にIDEの各種機能やら、それがシームレスにつながってるような環境を
非IDEで作るのは難しいだろ。
(このまえrubyでインテリセンスできるツール作ったとかって記事は見たけど)
>>405 ありがとうございます!!
VisualStudioでしたが、こんな機能があるとゎ!
これでダイブ楽になりそうですぅ
>>432 多分ない。
スマートポインタなんかのアロー演算子の解決とか、
コンパイラが統合されているからこそできることだと思うし。
C++は勉強してるんだけど、他にC++とあわせて勉強したら得する言語って有る?
>>442 その本クソミソに言われてるが、なんで勧めるの?
>>441 JavaよりもC#だな。でも、442のいうとおりtemplateやSTLを一通り理解してからでも良いと思う。
>>441 JavaやC#でもいいが、
「C++に挫折しないでちゃんと使いこなせる様になった場合」
どうせこれらの言語を学んでもあんま意味無い気がする。
それよかP言語系(Perl, Python, PHP, Ruby)を学んでおくと、
日頃の作業のお手伝い・自動化系=>P言語系
お手軽開発=>P言語系
ガチ開発=>C++
としっかり棲み分けできて良いと思う。
ちなみに俺はPython使い。
以下のプログラムを、2進数で出力するにはどうしたらいいでしょうか? 進数変換のプログラムは書いたことがあるのですが、ポインタの扱い方がよく分かりません。 よろしくお願いします。 #include <stdio.h> int main(){ double x = 123; unsigned char *p = (unsigned char *)&x+7; for(;p>=(unsigned char *)&x;p--) printf("%x ",*p); printf("\n"); return 0; }
#include <stdio.h> int main(){ double x = 123; unsigned char *p = (unsigned char *)&x+7; int i; for(;p>=(unsigned char *)&x;p--) for(i=7; i>=0; i--) printf("%d", ((*p) >> i) & 1); printf("\n"); return 0; }
私の知能知識不足で申し訳ありません。質問させていただきます。 下のように入力した文字(Y/N)によって分岐して、 Yなら1を返して終了、Nなら0を返してYが入力されるまで入力を繰り返す、 それ以外は2を返してYが入力されるまで繰り返すというものですが、 Yを入力したときは正常に動作するのですが、 Nやそれ以外のときはgetcharの部分がスキップされてしまうのか正常に表示されません。 continueの使い方が間違っているのかもしれません。 どなたかアドバイスいただければ幸いです。 #include<stdio.h> int check(void); int main(void) { int end; while(1){ end = check(); printf("%d\n", end); if(end == 1) break; else continue; } printf("終了\n"); return(0); } int check(void) { char yn; yn = getchar(); if(yn == 'Y') return(1); else if(yn == 'N') return(0); else return(2); }
getchar()で改行文字読んでるだけだろ
>>448 返信ありがとうございます。改行文字ですか・・・
どこの改行でしょうか?またどのような改善策が考えられますでしょうか?
知識不足ですみません。返信お願いいたします。
>>447 エスパー回答だが'n'を入力しているとか?
>>447 getchar()は一文字入力の関数だが、端末は1行単位で入力して使う。
このため、YやNを一文字打っても入力できず、改行キーも打っていることと思う。
この時、改行文字も入力されてしまうので、次のgetchar()の呼び出しで改行文字が得られてしまう。
従って、getchar()だけでやるなら改行文字はスキップしないといけない。
yn = getchar(); while(getchar()!='\n');
Ubuntu9.1のgcc 4.3です。 リンク時に new オペレーターが定義されてない、とか言うエラーを出すんですが・・・ グーグルで「gcc リンクエラー」で検索しても「ライブラリの順序を〜」とかしか見つかりません。 ファイルひとつだけなのでライブラリの順序は関係ないとおもうんです。 同じファイルをVisual C++ Expressではコンパイルできましたしちゃんと動きました。
>>453 gcc foo.c などと実行せず、g++ foo.c などと実行してみてください。
gcc はC++じゃなくて Cのコンパイラだったよな確かw new とかあるわけ無い
そうでもない。拡張子が.cppならc++と判断してくれるし、一定の条件を満たせばランタイムもリンクしてくれる。
>>455 昔はそうだったが今はgnu compiler collectionの略で何でもコンパイルするようになったとか何とか聞いた記憶がある
>>456 大文字のCと小文字のcではなかったか?
459 :
447 :2010/04/12(月) 21:11:42
getcharについて質問させていただいたものです。 みなさんアドバイスありがとうございます。不具合が起こる理由はわかったのですが、 どこをどのように訂正すればいいのかわかりませんでした。 改行文字のスキップとはこのプログラムの場合どのように行えば適切でしょうか?
なんか誘導されたから何か質問して去っていく STL使うと容量が物凄い増えるんだけど 少しは増えないようにしよう! みたいな流れはないの?
462 :
447 :2010/04/13(火) 00:35:56
>>460 やってみました!大丈夫でした。これだけでいいんでしたか・・・
>>461 つエネルギー保存則
STLは容量を犠牲にして書きやすさ、使いやすさを追求しているから不可能
容量を小さくしたいなら自前で全部やるしかない
>>463 > エネルギー保存則
物理 何点だよ。
不思議なんだけど C++STLで出来て、C#のジェネリックで出来ない事って何かあるの? C#のほうは全然容量増えないじゃん
>>464 おまえの頭にはプリミティブな要素しかないのか?
人生、比喩とか応用とか出来ないと余計な苦労が増えるぞ。
ネイティブコンパイラのC++とLL言語のC#を比較するのは無意味
>>467 言語は言語、コンパイラと実行環境は別。
>>468 それ、意味わかって書いてるか?
C系列でSTLのような高速かつ型依存しないコードを実装するには
コンパイル前にコードを型別に展開しなければ不可能。ゆえにコードサイズは膨れ上がる。
LL言語ならそういう縛りが無いから何でもできる。実行時に動的に型に合わせたコードを実行するとかな。
その代わり実行速度は落ちる。
STL使いたい組み込み屋とか居ないのか?
>>407 専門職のツールと白物家電を比較するとかwww
>>469 > C系列でSTLのような高速かつ型依存しないコードを実装するには
> コンパイル前にコードを型別に展開しなければ不可能。ゆえにコードサイズは膨れ上がる。
?? 静的に展開したから高速なのでは?
「型依存しない」の意味がよくわからんが、
動的束縛により具体的な型に依存せずにすむ。
静的に展開しないからサイズも膨らまない。
> LL言語ならそういう縛りが無いから何でもできる。
一向によくわからんが、速度とサイズの問題は一緒では?
>>467 > ネイティブコンパイラのC++とLL言語のC#を比較するのは無意味
そもそもなんだコレ? C#がLL言語だって??
>>473 お互いの言葉の意味が通じないから実例を示す。
std::vector<int> int_array;
std::vector<char> char_array;
std::vector<std::vector<int> > intvec_array;
この3つの変数はコンパイル前にそれぞれ別々のコードに展開される。
int_array.size() と char_array.size() と intvec_array.size() もそれぞれ別のコードの関数が生成される。
それにより、高速性と、型依存しないvectorという高機能性の両方が実現されるが、
トレードオフとしてコードサイズが犠牲になっている。
あと、LL言語の正式な定義にはc#やらjavaは合致しないかもしれない。詳しい定義は知らん。
でもC使いから見たらc#なんてLL言語で充分だよ。
>>474 > お互いの言葉の意味が通じないから実例を示す。
(中略)
>トレードオフとしてコードサイズが犠牲になっている。
んなこと知ってるよ…。どうしたいんだ一体。
>>469 > LL言語ならそういう縛りが無いから何でもできる。
なんでもできる、つってるのは、
STLみたいな静的な展開ができる、つってんの?
LL言語じゃないのに、どんな縛りがあるって?
LL言語じゃないC++にはSTLもあれば、
ポリモーフィズムもあると既に示した。
静的、動的、両方のアプローチを既に持ってる。
修正 > LL言語じゃないのに、どんな縛りがあるって? LL言語じゃない言語には、どんな縛りがあるって?
>>475 >LL言語じゃない言語には、どんな縛りがあるって?
STLは高速かつ高機能を実現するのが目的(=縛り)なので、コードサイズは犠牲になっている。
C#のような中間コード言語で、頑張って高速を実現しても意味がない(=高速を実現せよという縛りがない)から、
動的なアプローチで充分(=何でもできる)。
>>477 > STLは高速かつ高機能を実現するのが目的(=縛り)なので、
だがSTLを使うか否かは縛られてなどない。
LL言語じゃない言語には、そんな縛りは無い。
> C#のような〜意味がない(=高速を実現せよという縛りがない)〜(=何でもできる)。
言わんとすることはなんとなく分かってきたような気もせんでもないが、
「動的なアプローチで充分」というより、静的なアプローチには限度があるだろうし、
そう考えると、「=動的なアプローチしかできない」のではと思ってしまうけど。
>>478 >だがSTLを使うか否かは縛られてなどない。
ちょちょまてまて、この話、もともとは
>>461 >>465 の「STLはコードサイズが膨れ上がるけど、c#のジェネリックではそんなに増えないのはどうして?」
という疑問へのレスだから、STL前提ですよ。
>>479 ごめんw 薄々お気づきのこととは思うけど、
>>467 単体で読んで噛み付いただけなんで、
なんか無意味なレスを連ねてしまったねw
すまぬww
STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 っつぅC++スレのテンプレほぼまんまだなwww
引数として渡したポインタって、いつdeleteすればいいの?
訊いてる状況を推測するとdeleteしなくていい
for(int i = 0; i < 10; i++) { std::cout << "test"; } std::coutをした後にflushをしないと気持ち悪い だから、ループが終わった後に std::endl;を入れたんだけど、エラーが出る 何で?
ループが終わった後に std::cout << std::endl; を入れないとだめなんじゃね
>>486 > std::endl;を入れたんだけど、エラーが出る
そのエラーメッセージをどうして貼らない?
ねぇどうして?
ねぇどうして?
ねぇどうして?
for(int i = 0; i < 10; i++) {
std::cout << "test";
}
std::endl;
もしこうだとしても「エラーは出ない」と思うぞ。
gccのリンクエラーで質問したものです。 gcc foo.cpp でエラーだったのが g++ foo.cpp でちゃんと実行ファイルできました。 ありがとうございます。 gcc は拡張子cppだとg++を呼び出すと思ってたのに、違うみたいですね。
490 :
486 :2010/04/13(火) 22:34:38
>>489 拡張子 cpp は microsoft の方言。昔は大文字の .C が c++ を示すものだったが最近は不明。
.cc じゃん?
>>489 cppに限らず、gccは拡張子で動作を切り替えたりしない
$ cat a.o #include <stdio.h> int main(int argc, char *argv[]) { puts("hoge"); return 0; } $ gcc a.o a.o: file not recognized: File format not recognized collect2: ld returned 1 exit status >493 うそつき
gccのリンカエラーって -lstdc++ をつけたら直るやつかな
Cの入門書一通り読破したけどぜんぜんたいしたことが出来ない。 これでどうやってゲームとかアプリとかが出来るのか分からん
入門書を読んでも何も出来るようになんかなりませんよ。 英語の単語を大量に覚えて文法を理解してもしゃべれるようになれないのと同じ。
アプリ作ってみる本てあるんじゃん
499 :
デフォルトの名無しさん :2010/04/14(水) 21:11:16
>>497 > 英語の単語を大量に覚えて文法を理解してもしゃべれるようになれないのと同じ。
それは嘘。
単語を覚えず、文法が身についていない人間の妄言。
単語を大量に覚えて文法を理解していれば、しゃべれる。
ゲームとかアプリとか作るには 言語だけでなくAPIの知識が必要だからな
英語を理解していなくてもオウムは英語を喋れる。
>>499 じゃあお前今目の前にネイティブのアメリカ人がいたら
ペラペラ会話できるか?できないだろう
単語を覚えるのと喋れるのは全然違う
>>501 でも理解していない
仮想継承の有用な使い方ありますか?
504 :
デフォルトの名無しさん :2010/04/14(水) 23:58:36
単語を大量に覚えて文法を理解していれば、ネイティブのアメリカ人と会話できる。
二次元配列についてなんですがちょっと質問させてください。 string[3][10]という二次元配列があるとして、その2行目に日本語を直接代入するならば 「string[1] = "代入したい文字";」と書けるような気がするのですが、 「左のオペランドが、左辺値になっていません。」というエラーが表示されます。 一体これはどういう意味でしょうか。解決策等あればお教えください。 返信お待ちしています。
506 :
デフォルトの名無しさん :2010/04/14(水) 23:59:56
せめて型を明示してください。
char string[3][10]; string[1] = "代入したい文字";
>と書けるような気がするのですが、 気のせいです
509 :
デフォルトの名無しさん :2010/04/15(木) 00:06:43
>>507 char型の配列に文字列定数は代入できないよ。
=で結べるのは初期化の時だけ。
>>507 こうやればいい
char *string[3];
string[1] = "代入したい文字";
文字を代入しているわけではないけど
>>499 それは嘘。
熟語を覚えず、背景文化が身についていない人間の妄言。
512 :
デフォルトの名無しさん :2010/04/15(木) 00:31:23
英語話せない奴必死すぎるw
英語で情報伝達はできるけど会話らしい会話は難しい
会話らしい会話が難しいのはお前が馬鹿だから。
板違い
Cで文字列扱うのは面倒だけど試練だと思って頑張れよ
文字列は最後の要素が0のchar配列だと最初から理解していればそうでもない エンコードの扱いが確かに面倒だけど stringを言語仕様に持つところからCに来たら泥沼は確実
>>518 > 文字列は最後の要素が0のchar配列だと最初から理解していればそうでもない
そうでもあるって!
const char * a = "mojiretsu!";
これを理解するのに一苦労だったよ!
strcpy( string[1], "代入したい文字" ); とか strncpy( string[1], "代入したい文字", sizeof(string[1]) ); って解決策が解決策にならない罠
なんで、2重インクルードは禁止されているんですか?
524 :
356 :2010/04/15(木) 23:20:48
二重どころか自己循環インクルードしてる変態コードだってあるぜ。 Boost.Preprocessorとか。
>>521 無限にループさせたり、定義が被ることさえなければ、
どうインクルードしようが自由だ
hppファイルって、ヘッダだから、 hppファイルの中に class Test { public: Test( ); }; Test::Test( ) { } のように実装まで書くのは間違いで、 hppの中は宣言、実装は別のcppファイルに書くべきなのでしょうか?
>>527 そんなのが答えと言えるかぼけ
>>526 Cでソースとヘッダがわかれてるのは、別に整理のためでも嫌がらせのためでもなくて、
複数のソースから参照するべきものはコピペするのムダだからヘッダにまとめてあるわけ。
だから、複数箇所で参照するものをヘッダに書いて、一箇所からしか見ないものをソースに
書けばよろしい。
何を言ってるのかわからなければ、まだヘッダとかを触る段階じゃないから、全部ソースに
書けばよい。
ゲッターセッターはヘッダーに書いちゃうな俺
530 :
526 :2010/04/16(金) 17:16:11
>>527 >>528 ありがとうございます。
ヘッダには「宣言」を書くと教わったので、「定義」は別ファイルに書くという決まりがあるだと思ってしまいました。
なので以下の様な書き方もダメだと思っていました・・・
-----------------------------
// hoge.hpp
// 宣言かつ定義
void hoge( )
{
// 何か処理
}
-----------------------------
複数のファイルからインクルードするとhogeが多重定義になる。
インクルードガードぐらいは流石に書くだろう
>>532 そこまでしてヘッダに書くくらいならソースに書けばいい
>>530 ヘッダーに関数の定義を書いても良いが、
関数の定義が書かれたヘッダーは複数のソースで include できなくなる。
ヘッダーの本来の目的は、複数のソースで同じことを何度も書くのが面倒なだから、
その共通部分をヘッダーファイルに書いて置き、複数のソースからはinclude するだけで済ますこと。
よってその目的が失われることをヘッダーに書いたりはしないのが常道。
ああすまん勘違いしてたよ
>>533 そこまでして、っていうけどその言い方だと普段インクルードガード書かないように聞こえるよ
>>537 現実にはインクルードガード書かない方が、
そこまでしてヘッダーの構成考えるのかって言いたくなるなw
>>537-538 >>そこまでして
hogeが多重定義にならないように変なインクルードガードして
>>ヘッダに書くくらいなら
hogeの定義をヘッダに書くなら
>>ソースに書けばいい
hogeの定義はcppに書けば良いって意味じゃないか?
>>539 まず、インクルードガード使ってもhoge関数の多重定義は防げないよ。
hoge関数の定義をcppに書くべきと言うのはそう。
けど、それとは関係ない話になっているわけで、
>>537 が言ってるのは、
インクルードガードが大変みたいなこと言ってるけど、インクルードガードぐらい普通に使うだろ、
それを君は書かずにやってるのか?
という意味だと思う。
>>538 はそれ賛同して
実際にはインクルードガード書かない方が面倒で大変なことだよね。
と言ってる。
という自演でしたとさ
そこまでするなら単一ファイルだな。
そこまではしたくない
>>540 >まず、インクルードガード使ってもhoge関数の多重定義は防げないよ。
メリットがなく混乱の元になるだけなので、使う意味は全くないが、できることはできる。
@ 定義の部分だけガードしてやる
A 呼び出し側の規約として、@で弾かれるように#defineで定義する
→ makeなどで、コンパイル時に自動で定義されるようにするとかでも可
B ヘッダは、定義せずにコンパイルする
inline関数とか
WindouwsXPにて、 VisualStudio2008コマンドプロンプトを使ってclコマンドを使おうとすると、 D:\work>cl reber.c Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. reber.c Microsoft (R) Incremental Linker Version 9.00.30729.01 Copyright (C) Microsoft Corporation. All rights reserved. LINK : fatal error LNK1104: ファイル 'C:\DOCUME~1\佐藤' を開くことができません。 というエラーが出て、オブジェクトファイルはできているのにexeファイルができません。 現在マイコンピュータ→ローカルディスク(D:)→workフォルダに入れています。 ソースプログラムはTeraPadに書いています。 エラーは何が原因なのでしょうか。
>>546 佐藤ってあーた…
まぁ、多分、パスが通ってないんじゃないの?
>>546 何が原因って、ちゃんと書いてあるだろ……
LINK : fatal error LNK1104: ファイル 'C:\DOCUME~1\佐藤' を開くことができません。
↑これが原因だよ。
君のPC環境は全く分からないのでエスパーレスになるが、
C:\DOCUME~1\佐藤 ←このディレクトリ、名字の後に半角SP入って名前が続いてるんじゃないのか?
もし半角SPが入っているなら消さないと駄目だ。
549 :
521 :2010/04/16(金) 21:35:53
入ってるのは全角スペースと名前だけで、消そうとすると Windowsのシステムフォルダで Windowsを正しく実行するのに必要なので名前を変更できないと出ますので、 どうすればいいのか分からない状況です。
>>550 作業フォルダの設定がユーザのフォルダになってるのか…?
まぁ、変更方法とか、興味ないし知らんけど、
取り合えず、そのユーザはあきらめて、新しいユーザを作成して
その新しいユーザで試してみたら?
>>550 スタートメニュー⇒Visual Studio⇒Visual Studio Tools⇒コマンドプロンプト
cl すればいい
とりあえず、ユーザ名変更して試してみます。ありがとうございました。
NtfsDisable8dot3NameCreation=1した後に作ったユーザーだろ ユーザー名変えてもプロファイルフォルダパスは変わらないから無駄だぞ 0に戻して再起動してから新規ユーザー作るか環境変数TMPにスペースの入らないパスを設定しないと ちなみにVC2010の次で直す予定だそうだ
いっそのこと半角スペース禁止にしちゃえばいいのにな
>>554 なんで、新規ユーザ作るのに、またスペースが入ることが前提なんだ?
>>556 いわゆる~/に入れようとしたら
Documents and Settings
とスペースが入っちゃうからじゃない?
>>557 >>546 で
'C:\DOCUME~1\佐藤'
になってるんだから、問題となるのはユーザ名だけなんじゃないの?
>>558 あぁなるほど
じゃぁあるのかどうかは分からないけど
半角スペース以外の問題だね
>>559 >>550 でユーザ名に全角スペースが入ってるのは確からしく、
また、
>>546 で名前が途切れていることからユーザ名がおかしな原因になってると予測される。
さらに、ググってみると、ユーザ名部分は半角スペースがあっても、
ショートファイル名に直さないらしいので、それがNGの原因となることがあるらしい。
つーわけで、ユーザ名の全角スペースを自動的に半角スペースに
読み替えてくれる、素敵機能が、どっかの機能についてると予測
ユーザ名変更で使えるようになりました。 お付き合いいただきありがとうございました。
まぁ別にそうしなきゃいけないルールがあるわけじゃないが、 ディレクトリ名に全角文字は使わない。 ディレクトリ名にスペースは使わない。 ぐらいの暗黙のルールがあるべきだと俺は思う。
暗黙というより明言してていいと思う
問題は、自分でスペースを入れたつもりがなくても、 ユーザ名が、そのままフォルダ名になってしまい、 さらに、その命名ルールを決めたMSの製品で不具合がおきることだな。 さすがだぜ。 つーか、互換性の為にショートファイル名を残しているのに 互換性の無い製品内部でショートファイル名を残してるって、 MSは、ショートファイル名を切り捨てる気はないのだろうか?
ショートファイル名って使われてるの? XP&2008EEの環境で色々試したけど再現しないのだが。
C++ Glossary
http://www.kmonos.net/alang/cpp/glossary.html より
NTP (Named Template Parameter)
名前付きテンプレート引数。
大量にパラメータを指定出来るようなクラステンプレートを作ると、
実際に使うときには、どれをどんな順番で指定しなければならない… ということをいちいち確かめる必要があって、大変。
template<
class Pointee,
class OwnerShip = RefLink,
class CheckNull = NoCheckNull,
class ThreadModel = SingleThread
> class smart_ptr { ... };
typedef smart_ptr<MyClass,
RefCount,NoNullCheck,MultiThread> myptr;
もちろんそれぞれのパラメータにデフォルト値を指定しておけば、 たいていの場合は最初の一つだけ指定して終わり、で済むので楽です。
が、この場合もデフォルト以外を使いたくなったら大変。
そこで、 各パラメータに名前を付けて、順番は適当に指定出来たらいいな、 という気分になります。
typedef smart_ptr< MyClass,
ThreadModel_is<MultiThread>,
OwnerShip_is<RefCount>,
> myptr;
この技法が、です。最近の幾つかのライブラリでは、 NTPでパラメータ指定出来るようになっています。
とありますが、これについてもっと詳しく分かる日本語のWebサイトを教えてください。
よろしくお願いします。
ググれカス
568 :
デフォルトの名無しさん :2010/04/17(土) 17:00:25
佐藤 の検索結果 約 37,200,000 件
>>565 8.3形式の名前の生成を止めるかexFAT使った上でコマンドラインからcl.exeやらないと再現なんか出来ないぞ
570 :
デフォルトの名無しさん :2010/04/18(日) 14:24:06
while(cin >> w >> h, (w||h)) ってどういう意味? どっちが条件文? &&とか||ではなく,なのはなぜ?
>>570 きたねえコードだなおい
オレが上司なら不許可だな
>>570 カンマで区切られた式は、左から順番に評価され、
一番最後に評価された式の値が、その式の値となる。
cin >> w >> h を実行してから w||h を条件式として判定する コンマ演算子でググれ
do { std::cin >> w >> h; } while (w || h);
カンマってそういうコード以外で使い道あんのか?
Boost.Assignとか。
577 :
570 :2010/04/18(日) 14:36:01
みなさんありがとう!よくわかりました. ところでwhile(cin >> w >> h, (w||h)) と while(cin >> w >> h && (w||h)) は同じ意味になりますよね? どっちが望ましい?
>>577 見てすぐわかんないだろ、どっちもダメ。
その文法を使えば、 while()のカッコの中だけに全てのプログラムを書くことも可能じゃないのか?
>>578 え、この程度がわかんないの?
そんなんでよくやっていけるな
>>577 cin >> w >> h の評価が偽だった場合は、w が真でも (w||h) が評価
されないから、同じ意味ではない。
>>575 for でよく使うでしょ
>>582 Cを勉強してない人に分からないから
Cは廃止した方がいいというレベルの事言われても
forの初期化、再初期化以外でカンマ演算子を使う奴は殴り倒す。
>>580 「わかんない」んじゃない。
「見てすぐわかんない」んだ。
じっくり見て、考えて、やっとわかるコードなんか書く奴はダメ。
見てすぐわかるように書かないとデバッグの時にひどい目にあうよ。
Foo* a, b;
>>585 この程度すぐ見て分からないようじゃねぇー
>>586 おれはどっちかというとそれを問題視したいw
ハゲ一派のアスタリスク位置。
>>587 底辺から煽られてもなんかくすぐったいな位しか感じないぞ
なんやお前ら全員低レベルやな って上から見ている気になっているヤツが何人いることかw
#define DECLVAR(TYPE) boost::mpl::identity<TYPE>::type DECLVAR(Foo*) a, b;
>>590 自分を慰めたいと思う人は、
それを自覚しないものさ。
>>592 どうせなら
typedef Foo* LPFoo;
LPFoo a, b;
0xならこれできたっけ。 decltype(int*) a, b;
template<typename T>class A{}; template<typename T>using &rA,*pA=A<T>; //とかできんのかね? template<typename T>typedef class tagA{}A,*pA,&rA; //template typedefsで定義宣言一発を妄想してたのに
つまり何だって言ってるの?
>>595 > A ``typical C programmer'' writes ``int *p;'' and explains it ``*p is what is the int'' emphasizing syntax,
> and may point to the C (and C++) declaration grammar to argue for the correctness of the style.
> Indeed, the * binds to the name p in the grammar.
> A ``typical C++ programmer'' writes ``int* p;'' and explains it ``p is a pointer to an int'' emphasizing type.
> Indeed the type of p is int*. I clearly prefer that emphasis and see it as important
> for using the more advanced parts of C++ well.
どっちが言い悪いの問題じゃないよって言っているってことか?
>>596 decltypeの中に書くのは式なのでそれはできない。
なので上にあるようにboost::mpl::identityを使うのが近い方法。
他で定義したマクロを使いたいんだけど、 どうすればいいの?
>>600 > 他で定義したマクロを使いたいんだけど、
どこで定義したんだよ?
>>600 ヘッダに書いてインクルードしろよ。
そんな事もわからなかったら、お先マっクロだぞ
∧_∧∩))
( ・∀・)彡 パーン!
((⊂彡☆∩ _, ,_
⊂(⌒⌒(;`Д´)
`ヽ_つ ⊂ノ ←
>>602
その他ってやつをコピペすればおk Cではみんな伝統的にこうやってる
PhysXっていうソフトを使うのに C++が必要なんだけど、まず何から勉強したら良い? 今まで勉強した言語はMELってやつしか無くて プログラム経験皆無と言って良いレベルかもしれないんだけど
>>604 だったらその定義している他のヘッダを引き込めば良かろうに。
>>607 まずはC/C++が何なのか知らないと話にならない。
C++ 入門 でぐぐるといい。
>>609 オッス!ありがとうございます!頑張りまっす!
>>607 とりあえず天賦の才を持たない限りCの知識が無い状態からC++を勉強すると
数年越しのプランになるよ。
価値はまああると思うけど。
>>607 >PhysXっていうソフトを使うのに
>C++が必要なんだけど
PhysX はNVIDIAの物理演算用数値計算ライブラリというか、SDKなのでどっちかって言うと、
「C/C++ で PhysXライブラリ を使って何かを作りたい。そのため、C/C++を勉強したい」
って話になると思う。 ソフトを使う、ってニュアンスじゃないぜ。とりあえず年単位くらいで腰すえて勉強してくれ
>>612 Cの知識があってC++初めてから数年経つけど学習プラン終わらないよ…
inlineってどれぐらい効果があるもんなんでしょうか? inline void func(hoge h, const fuga &f) { ・・・; } { func(h, f); } と書いた場合 { hoge h_ = h; const fuga f = f; ・・・; } こんな感じで展開されると考えていいんですか?
>>615 >hoge h_ = h; const fuga f = f;
こんな物が生成されたりはしない
生成されたコード読むのが一番だよ
テストツールとして、指定プロセスのCPU使用率を求めるTOOLを作成しています。 PDH系APIを使用してCPU使用率を取得を考えています。 PdhAddCounter()に特定プロセスを登録した場合と全体を指定した場合(以下の2つ) "\\Process(Hoge#0)\\% Processor Time" "\\Processor(_Total)\\% Processor Time" プロセスを登録した方がCPU使用率が高く表示されたのですが、 _Totalを設定した場合は、全てのプロセスが使用しているCPU使用率を表示してる。 プロセスを設定した場合は、動作中のCPUを100としてその何パーセントを、そのプロセスが 占めいているという考えでよろしいでしょうか?
時刻を取得する時に以下のようにコードを書くわけですが、 time_t t; time(&t); tm* ltm = localtime(&t); localtime( ) の戻り値が tm構造体のポインターなのが気になります。 localtime( )の中で、tm構造体はmalloc/newで取られて それをさすポインターを返しているのでしょうか? malloc/newしないとlocaltime()のスコープ抜けたらポインターが 無効になってしまいますよね?
MSDN より 32 ビット バージョンおよび 64 ビット バージョンの gmtime、mktime、mkgmtime、localtime の各関数はすべて、1 スレッドあたり 1 つの tm 構造体を使用して変換を行います。これらのルーチンを呼び出すたびに、前の呼び出しの結果は破棄されます。
>>619 localtime が持っている static な領域が返されています。
ポインタを保持しておいて後で使う、という場合は、
もう一度 localtime を呼ぶと結果が上書きされてしまうので注意です。
time_t型の「_t」って何?
>>620 >>621 ありがとうございます。
static変数へのポインタを返す、というのは全く思い付きませんでした。
625 :
622 :2010/04/20(火) 22:15:36
>>626 その気合いがあれば大丈夫だ。
C++0xではどうだとか最初は気にしない方が良い。
C言語を2ヶ月かけて色々いじったりして勉強して、
(簡単な文字列関連の処理プログラムを標準Cライブラリの範囲内で作るとか)
次の月からC++をやるのが良いと思うよ。
がんばれ
C覚える C++に手を出す なにかと理由をつけてCに戻る C++に再チャレンジする なんどか繰り返す 才能があればC++に定着する なければC信者になる
629 :
612 :2010/04/20(火) 23:18:53
>>628 俺は
1.C覚える
2.C++に手を出す
->この後ずーっとC++信者になったよ。
でもあんまりにも細かい仕様は覚えたくないので
TMPとかは他人任せ(ライブラリまかせ)にしている。
そのうちC#に手を出す C/C++に戻れなくなりC#信者になる
631 :
612 :2010/04/20(火) 23:29:43
>>630 いや俺は
>>612 でありかつ
>>444 なんだけど、
Pythonに手を出した。
C#はなんだか中途半端なんだもん。
日頃の作業のお手伝い・自動化系=>P言語系
お手軽開発=>P言語系
ガチ開発=>C++
がお薦め。
ちなみに 上で述べられているTMPは Template MetaProgramming の略です。 TeMPlate の略だと思っている人がたまにいるので 冗長ながら申し上げました。。
TeMPorary かと思ってた(;´ρ`)
>>631 スクリプト言語の信者は、記述が少なくて楽って言ってるけど、
動的型の言語は、かえってめんどくさいな。
IDEのサポートがへぼいとか、コンパイル時にぜんぜんエラーを検出
できないとかで。
C#くらいが超楽でいい。
ラップオブジェクト作ってオーバーロード裏表を嬉々とコーディングしている自分をふと振り返って C++やめようかなと
コンストラクタで例外は出さない方がいいんですか?
メンバ変数で大文字って使わない方がいいんですか? gccが文句を言ってきます
>>636 出しても問題ないが、デストラクタが動かないので気をつける事
(派生クラスやコンストラクタの既に実行されているメンバ変数のデストラクタは動く)
>>637 どんな名前使ってんだ
×派生クラスや ○基底クラスや 逆を書いちゃう事ってよくあるよね
640 :
デフォルトの名無しさん :2010/04/21(水) 22:28:39
>>634 案件でC#による開発、とかは費用対効果的に(もちろん要件によるが)素晴らしいとは思うが、
趣味のプログラミングって話だと、C#絶賛してる奴は大抵何も知らない、勘違いしたゆとりって印象。
・・・実際、便利で良く出来てるとは思うけどさ。VC#をIDEに据えると本当にRADって感じだし
642 :
636 :2010/04/21(水) 22:43:58
643 :
637 :2010/04/21(水) 22:53:37
>>638 int testID;ってのを使ってますよ
IronPython使ってみたけど C#でいいと思った
俺もC#使ってみようかな やっつけ仕事でもGUIアプリとか作りたい
>>636 大丈夫。
ちゃんとメモリーリークしたりしないようにできているなら
気兼ねなく例外を投げろ。
Constructorにもし例外を投げないことを強制したら、
うまくConstructできない場合には不完全なオブジェクトが
できることになってしまう。
(例:Googleのコーディング規約ではConstructorでの例外を禁止し、
init()というメンバ関数で初期化するように要請している。)
C#使うならQtでいいだろ
Qtは無いわ。
>>646 class A {
public:
A() : p1(NULL), p2(NULL) { p1 = new char[100]; p2 = new char[100]; }
~A() { delete[] p1; delete[] p2; }
char* p1;
char* p2;
};
で p2 の new で失敗したら p1 がメモリリークする。
こういうことしたいなら、
new を生で使わず vector を使う(vector のデストラクタが動いてくれる)か、
A() 内で一旦例外を catch して p1 を開放する必要がある。
>>641 > C#絶賛してる奴は大抵何も知らない、勘違いしたゆとりって印象。
スクリプト言語絶賛してる連中も中二病くさいやつがよくいる印象。
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) int main (int argc, char const *argv[]) { int* localarray; localarray = (int*)malloc(16 * sizeof(int)); printf("arraysize = %d", ARRAY_SIZE(localarray)); printf("\n"); return 0; } 16って表示させたいんですけど、どうすればいいのですか??
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) int main (int argc, char const *argv[]) { int* localarray[16]; printf("arraysize = %d", ARRAY_SIZE(localarray)); printf("\n"); return 0; }
>>654 いや、確かにそうなんですけど…
mallocやreallocつかったときは、どうやって要素の数を得ることが出来るのかが知りたいです。
>>653 要点は、
>>654 も書いてるが・・・
※ただし int localarray[16];
1.
>>653 の localarray はただの int のポインタ。ただどこかのアドレスを指す為の、ただのポインタ
2.malloc は単に指定されたバイトサイズの領域を確保しただけ。ただそれだけ
3.1と2から、そこには望んだようなサイズの答えは無い
また ARRAY_SIZE マクロの定義はこうなので
#define ARRAY_SIZE(X) (sizeof(X)/(sizeof(X[0])))
sizeof(X) で領域全体のバイトサイズが拾えないと無理。
と言うか、そもそも 「これだけの領域が欲しい」 と確保している時点で自分でサイズは知っている訳だから
それを見ろって話。例えそれが動的配列のつもりであったとしても。
>>655 >mallocやreallocつかったときは、どうやって要素の数を得ることが出来るのか
malloc系統はバイトサイズ指定して確保するだけの物であって、
要素の数なんて無いし、それで得られるポインタが例え確保領域の外に飛び出したとしても
それを丁寧にチェックなどしない。
float *pF;
pF = (float*)malloc(16 * sizeof(int));
float f;
f = pF[1000]; // !
これだって可能だろ?そういう事だ
何もかも忘れてvectorを使えばおk
あ、
>>657 の話は、「"要素"数を得るには型のサイズなど情報も必要だが、
そんな型サイズも"要素"数も malloc は関知なんてしないよ」 って話な
>>658 このスレでそれは禁句。と書こうとしたらここはC/C++のスレだったw
折角だから、C++版のARRAY_SIZE関数でも貼っておこう。
--
template<typename T, std::size_t N> static inline std::size_t numberof(T (&)[N]) {return N;}
ターゲット環境に合わせてlocalarrayをオーバ・アンダーリードして格納情報取り出せばOK
>>660 実行時ではダサいです
コンパイル時にしてください
template typedefsのない今の世じゃ typedef いっぱい作らなきゃならないじゃないか
>>663 >660は普通のコンパイラなら最適化で定数になるよ。
アホか コンパイル時に解決しないと 配列のサイズとかに指定できないだろ template <typename T, std::size_t N> char (&ARRAY_SIZE_(const T(&)[N]))[N]; #define ARRAY_SIZE(a) (sizeof ARRAY_SIZE_(a)) int n[10]; char m[ARRAY_SIZE(n)];
使えない? 普通にコンパイル通ったけど。。 -- int array[5]; double da[numberof(array)]; for (int ic = 0; ic < numberof(array); ++ic) { printf("%d:%g\n", array[ic], da[ic]); } -- 勿論、不定値が出力されたw
669 :
643 :2010/04/22(木) 21:26:03
>>651 メンバ変数がint threadIdって名前なんだけど
何故かダメぽ
threadIDは大丈夫なんだけど、予約されているのかな?
1度も継承は使っていない
標準C++の範囲でお伺いします。 例外安全について書かれた 英語のWebサイトを教えてください。 basic guarantee is *** みたいな感じで、そこそこ詳しく書いてあるところを教えてください。 よろしくお願い申し上げます。
メンバ変数に使われているクラスは、 前方宣言じゃなくて#includeを使わないとダメなんですか? インクルードガード?ってのと何か関係あるの
>>673 要はサイズを知ってればおk
ポインタか参照だったらサイズは固定(たいてい4バイト)だから前方宣言だけでいい
普通の変数だとクラスのサイズを知らないといけないからincludeするなりしてサイズを教えてあげないといけない
ガードとは関係ない
675 :
673 :2010/04/22(木) 22:49:18
>>674 なるほど、だからポインタは#includeしなくてもいいんですか
thx
676 :
70 :2010/04/22(木) 23:02:00
他で質問するべきだとは思うのですが、C言語やってる方なら詳しいと思うので教えてください。 式の演算結果が、その式の持つ情報量(x*yの場合3文字)より多くなるとします。 演算結果はどこかが変数になっていて毎回変わるものというわけではない場合、 情報量を少なく表現するために演算子を用いて書くか、 あるいは解を直接書くかどっちが速度的に早くなるのでしょうか? 演算回数にもよると思うのでなんともいえないとは思いますが、 ちょっと気になったので詳しい方教えてください。
定数の計算式の話なら、コンパイル段階で計算されるから速度的にはかわらない。 計算式に意味があるとか、手計算だと面倒とか言う場合にはそのままでかまわない。
なんだその勝手な定義の情報量は 勝手に言葉を再定義したって誰にも理解できんぞ
情報量というからエントロピーとか圧縮の話かと思った。 まあ情報量が「3文字」なんていう時点でそれはないのな。
文字列 CString (UNICODE)を使用しています。 ここに格納される文字が英語(半角)のみの文字か、 日本語が含まれているかを簡単に判別することはできないでしょうか?
682 :
677 :2010/04/23(金) 17:02:15
レスどうもありがとうございます。
>>678 参考になります。
そのままでもいいとのことなのでケースを吟味して計算式に特に意味がないようならそのままにしたいと思います。
>>679-680 すみません。
なんという言葉が正しいのかわからなかったので・・・
文字数というかバイト数?というとちょっとおかしいですよね?
int i = 3*3;
でiは4バイトということではなく、
この文字列をテキストなんかにSJISで保存した場合、12バイトになるみたいなことです。
コメントを含め大量の文字量が書かれたプログラムだと実行速度が遅くなると思ったので。
エントロピーとか難しい話は分かりません・・・すみません。
まぁ気にすることでもないと思うので気にしないことにします。
変な質問してすみませんでした。
コンパイルしてんだから文字数は関係ないだろ
684 :
677 :2010/04/23(金) 17:25:50
>>683 すみません。
その辺が重要な認識のズレでしたね。
確かにCのようなコンパイラ言語なら関係ないですね。
インタプリタ視点で考えてました。
スクリプト言語でもよほど古い実装でもなければ JITが一般的になってるはずで、コメント云々で実行速度が落ちるとかはまずない。 何度もソースを再ロードしまくるとかなら別かもしれんけど。
名前長くしすぎるとtypeid.name();を使ってなにか処理するときにちょっとコスト増えるかもね
>>686 > 名前長くしすぎるとtypeid.name();を使ってなにか処理するときに
なーるほど。
確かに等価ではないかもしれん。
でもまあ
> typeid.name();を使ってなにか処理する
そんなコードはすべからくクソコードだろう。
ポインタのポインタはヒープに格納されるの?
ポインタのポインタはポインタですよ
はぁ?
void* p = malloc(sizeof(void*)); p = &p;
int a; int*p=&a; int**p2=&p; int***p3=&p2;
マジレスするとポインタだのポインタのポインタだのは本質じゃない。 動的に確保されたメモリはヒープ領域に格納される。 ポインタの指す実体はスタックにある場合もヒープにある場合もある。 それだけの話。
どちらもポインタのポインタ自体はスタックに保持されている件について しかも、ポインタのポインタの直接指す先もスタック ポインタのポインタを二度脱参照した先はヒープとスタックの差があるけども
>>697 >どちらもポインタのポインタ自体はスタックに保持されている件について
何言ってるの?
ポインタってのは変数やそこに格納されている値の事であって ポイント先の領域を指す言葉では無いでしょ
>>693 のヒープ上に記憶されるのはアドレスであってポインターではないんだな。
>>699 その説明は違う。
ポインタってのは変数であって、そこに格納されている値はアドレス。
>>693 のpに格納される値*pは、アドレスであってポインタではない。
じゃあヌルポインタは変数なのかと小一時間
ヌルポインタは値が0のポインタ変数だろ。間違いなく変数だ。
704 :
688 :2010/04/24(土) 17:20:39
ヌルポインタは「ヌルポインタ定数を適当なポインタ型にキャストしたもの」と規格で定義されているが
いや、キャストに限定してるわけじゃなく、 何らかの変換を行ったもの、だな
An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.
If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function.
Welcome to underground.
linuxで遊ぶようなプログラミングをC++でしたいのですが、 何かおもしろそうな事ありませんか?
>>712 MMOのサーバーを作るのが面白そうだな
webから何か情報を取って来て データマイニングするとか
お前らはC++プログラミングをする時に、何を使っていますか?
頭
即答ワロタ
紙もよく使うよ
int型の変数を割ったとき切り上げする方法を教えてください。 int a=100; int b=30 int c; c=a/b; ←cに4が入るようにしたい!
c=(a+b-1)/b;
>>724 こういう発想がパッと出てくるかどうかって、とても大事だよな
/演算の規則覚えたての初心者だとしても、切り上げはどうするんだろうって考え始めてから30秒以上かかるようじゃセンスないよ。定石とかそういうレベルじゃない
定石として知ってるから書ける人間と、知らなくても書ける人間がいんだよな。
>>729 センスの問題じゃなくて数学力・・・というか理系力の問題だろう。
実の無い潰しカキコはヤメレや無能ども 定石とか言ってる間抜けはsize_tでないのに負数とか気に成らんのか?
むしろ /演算の規則覚えたての初心者にこそ 自力で挑戦してもらいたいところだな。
735 :
728 :2010/04/25(日) 09:12:49
>>733 > size_tでないのに負数とか気に成らんのか?
何だ?お前頭おかしいの?
除数か被除数のどちらかが負だと 割り算の商の丸め方向が規格で定義されてないんだっけ C99ではされてるけど
>>733 size_tはunsignedの代わりではありません
738 :
デフォルトの名無しさん :2010/04/25(日) 10:48:54
728は頭おかしい
qtで何も表示されていないwindowを作ったんだけど、 そのメモリ領域だけを壊すコードを作りたい 何でこんな意味の無いコードを書きたいかというと、 面白そうだから
超初歩的な質問で申し訳ないのですが rand関数で1から10までと指定すると 1と10は含まれるのですか?それとも2〜8が選択されるのでしょうか
標準ライブラリのrandはそもそも範囲の指定はできず、0〜RAND_MAXまでの値が返るけど それとは別の話?
入門書読み終わった段階で次何していいか質問したんですが、Qtっていうライブラリーの サンプル読めと言われました これってネタ?マジ? ネタかどうかわからないですが・・・ 最近まで他の入門書とか読んでてやっと次の段階いけるかなってなりました
>>743 言った本人には何か考えがあるのかもしれないが
真面目にレスさせてもらうと、それはもうちょい先にするべきかもしれない
746 :
743 :2010/04/25(日) 21:06:48
いった本人って数人同意してきたからネタかと思ったんですが・・・ 適当にサンプル漁ってみたりしたらいいんですかね?
>>746 Qtだって立派なライブラリーだと思うから覚えて損は
ないと思うけど、おれが、次は Visual C++ 2008 EE
を落としてきて C++/CLI を覚えろ、といったら、お前は
覚えるのか?とか、結局、次に何をしたいかとかは、
自分で決めるしかないだろ?
748 :
743 :2010/04/25(日) 21:39:17
その通りですね 自分で決めます ありがとうございました
(more) effective (c++|stl) を読みなされ 話はそれからじゃ
それってつまり、4冊読めってことですか?
more effective stl なんてなかった気がするから3冊じゃね?
752 :
デフォルトの名無しさん :2010/04/26(月) 20:56:57
()が0個以上という意味なら6冊 (1)effective (2)effective c++ (3)effective stl (4)more effective (5)more effective c++ (6)more effective stl ()が1個以上という意味なら2冊 (1)more effective c++ (2)more effective stl
>>752 C/C++準拠の正規表現で書けよ。
・・・あ、まだ導入されてないんだったか。
0xにregexはあるが
ここの住人のみんなは何ヶ月で、Cをマスターした?? 俺の友達は10日間でマスターしたらしいんだが、そんなに簡単なの?
756 :
デフォルトの名無しさん :2010/04/27(火) 22:49:19
文法だけならセンスがあれば1日
他の言語知ってるなら1日
>>755 > 俺の友達は10日間でマスターしたらしい
それは小学生が言う「俺は幽霊が見えるんだぜ」と同じで眉唾物。
C言語をマスターしているヤツなんて世界に何人だよおいw
てな話になってしまう。
マスターのレベルを下げて、
文法+標準ライブラリをそこそこ使えるってなら
センスありで仕事の傍らで1ヶ月、
センス普通で仕事の傍らだと4ヶ月
センス無しで仕事の傍らだと12ヶ月
ってところじゃないかな。
ちなみにC++になると突然 文法・仕様・概念が変態化し、 仕事の傍らでセンス普通で数年越しのプランになる。
Rubyの文法は3日で覚えたけど Java/C#/Rubyあたり覚えてたらC++も同程度で覚えれるんじゃね
俺はC++を知っている上でPythonやったら 確かに3日ぐらいだった。 だがC++は他とは一千を画す変態仕様だと思うぞ。 センスありでも仕事の傍らでは1年はかかると踏んだ。
>>755 他の人も言ってるが、他言語などを普段使っていて良く慣れていて、だとか
自分のやりたい事をコードに落とすのに、どうしたらいいだとかの地図が見えているような人が、
頭の中で文法を置き換えて、あるいはロジックの組み方を置き換えて、書ける様になるまでだって時間がかかる。
そして 「何日でマスターした」、って台詞にはでっかい欠陥がある。
それは 「何を持ってマスターしたって話なのか」 って事だ。
その友達に 何が出来る?とか、何を作った?とか、これってどうすれば出来る?って聞いてみな。
何を聞いても答えられて、その場でコード書いて見せられるようなら、きっと本当にマスターしたんだと思うぜ
本を読んで理解できたとか、サンプルコードコピペして動かして上手く動かせた、って話だったら
黙って笑顔だけ返してあげればいいよ
嗤えばいいと思うよ
C言語で一つの簡易アプリケーションを作るのでさえ
10日間ぐらいかかりそうだがwww
>>763 eva名言
マスターしたって自称するやつでそれに値するやつ一人も見たこと無い。 CにしろC++にしろ、OOPにしろ、だ。 フツーの感性ならやればやるほど、 正確に理解し切れてない部分があることに気がつく。
766 :
764 :2010/04/28(水) 12:11:47
>>765 > やればやるほど、正確に理解し切れてない部分があることに気がつく。
また名言やな。
お前ら良い事ばっか言うな。
C++はじめて10年以上経つけど 未だに知らないことあるわな
よーし、じゃあ俺から不明瞭部分言っちゃうぞ。 1) constメソッド内での、メンバ変数アクセスはどう制限されているか。 2) *NULLとは何か。 3) リファレンスの使いどころ。[]オーバーロードの返り値しか思いつかない。 4) コンストラクタで例外投げたらどうのこうの。 5) メソッドポインタとその使用。staticなやつじゃなくて。
class A{shared_ptr<X> p;oeprator shared_ptr<X>const()const{return p;}}; weak_ptr<X> w = A; とか?
>>768 >1) constメソッド内での、メンバ変数アクセスはどう制限されているか。
質問の意味がわからんが、constメソッド内でメンバ変数の値を変えるコードを書くと
エラーでコンパイル出来ないけど、これで答えになってる?
>2) *NULLとは何か。
一般保護違反。
>3) リファレンスの使いどころ。[]オーバーロードの返り値しか思いつかない。
関数にオブジェクトを渡すとき、値渡しするとコピーが発生する。大きなオブジェクトだと高コスト。
ポインタを渡すとコード見たとき値かえてるのかって勘違いする。
>4) コンストラクタで例外投げたらどうのこうの。
知らん。
>5) メソッドポインタとその使用。staticなやつじゃなくて。
STLでアルゴリズムにメソッドを渡したいときに使う奴ってこれじゃなかったっけ。
>>770 4)
コンストラクタで例外を投げても問題ない。対応するデストラクタの{}内が呼ばれないだけで、メンバおよび派生元のデストラクタは呼ばれる。newでもdeleteされるのでリークしない。
772 :
デフォルトの名無しさん :2010/04/29(木) 13:34:44
>2) *NULLとは何か。 未定義
>>768 1)はあれだ、内部的にはthisがconstになるとかどうとか。
メンバ変数へのポインタを返したりもできないとかどうとか。
ここで聞くべきなのか分かりませんが コンソール上でfgetcなどで標準入力からの入力を待っている際に、ユーザーが編集可能な文字列をコンソール上に表示させたいのです。 つまりヒストリ機能を実装したいのですが、どういう関数を使えば良いのでしょう。 readline等は使わない本来的なやり方を教えてください。
775 :
デフォルトの名無しさん :2010/04/29(木) 17:42:49
pthread_create
本来的?(゚Д゚)
>>774 実際どうやっているんでしょうね。bash とかみてみようか。
カーソル移動とかバックスペースとかのコントロールコードをコンソールに 出力しているだけだと思うのですが。
779 :
デフォルトの名無しさん :2010/04/30(金) 00:22:10
入力の待ち受けと表示が並列に動いているように見えるけど、どうなってるんだってことでしょ。
class hoge{ .... } として、メイン関数で hoge h; for(i=0;i<100;i++){ h.print(); } return 0; となっているときにデストラクタを設定するとどこで働きますか?
781 :
デフォルトの名無しさん :2010/04/30(金) 00:25:43
return 0;の後、メイン関数を抜けた時。
>>781 ありがとうございます。for回るごとにデストラクタを働かせたい場合はどうしたらいいでしょうか?
783 :
356 :2010/04/30(金) 00:29:21
forの中に入れればいい。 自動変数のデストラクタは、定義されたスコープ(ブロック)を 抜けるときに実行される、と覚えておけばいい。 for(i=0;i<100;i++){ hoge h; h.print(); }
>>786 まさかとはおもうんだが
void mem(str p);
void show(str p);
これ呼び出しのつもりなのか?ww
・C++ならtypedefするまでもないじゃないか。 ・公開したい関数以外は静的にしておきましょうよ。 ・オブジェクトとポインタを1行で宣言するのはやめた方がいい習慣。
>>789 三つ目はどういう事情から来るのでしょうか
前二つは分かるのですが三つ目の意味が分かりません
ちなみに私は元の質問者ではありません
>>790 俺は 788 だけど、こういう事じゃね?
int* a, b; // ← 紛らわしい
ちなみに
>>791 の例は、「1行で宣言する習慣はやめたほうがいい」 の例な。
元の質問者のソースとは形は違うけど、紛らわしさは同じ。
int *a と int b を一緒に書いちゃうと紛らわしい、って話
>>791 なるほどいわれてみれば確かに紛らわしいです
どうもありがとうございました
>>793 ついでに言えば、>788の例なら
--
str data, *p;
p = &data;
--
と書くよりも
--
str data;
str * p = & data;
--
と書いた方がpが不定値である期間が短くて済むと言う利点もある。
オブジェクトの生存期間を短くするためにもその方がいい。
>>794 >str * p = & data;
こんな気持ち悪い書き方教えるな!
質問です。 VC++のコンパイラを使える、軽いIDEに心当たりのある方は居ないでしょうか? EeePCを使って、出先でテストコードとかを使いたいんです。
>>796 IDEにどのくらい機能求めてるの?
エディタ使ったらどうだ?
str data, p = &data; でいいのでは
>>797 最低限、Fキーでコンパイルと実行ができれば・・・。
いちいちコマンドラインからコンパイル・実行するのは面倒で。
CPadとかいいかな、と思ったんですが古いしボーランド潰れてるしでアレですし。
>>799 ならやっぱエディタでいいと思うよ
ショートカットで設定すればそれも実現できるし、有名所は大概できるから何使うかは好みで
規制長すぎて死にそう・・・ 避難所なんで無いんだよ
質問です。 std::string *str = new std::string(); と std::string *str = new std::string; の違いってありますか。
803 :
デフォルトの名無しさん :2010/05/01(土) 00:48:48
ありません。
>>799 面倒ならあきらめて重いIDE使え
軽快な環境を使うには最低限のスキルが要るんだよ
806 :
805 :2010/05/01(土) 08:36:06
一応言っとくと設定すればVCでのコンパイルできるからね
教科書位買えよ。
単に微分が分かってないだけとしか思えないが
>>807 まず微積分は理解できるのか
別にニュートン法等の説明が必要な手法でもなく、
ただ単に微分して傾きをだしてそれを少しづつ伸ばしてく手法なので
Cというより高校物理と数学やりなおせって話だな
一応、数値解析と呼ばれる分野なので、この単語でぐぐって本なりサイトなりを探せばいいよ
いまどきの子供は区分求積法とかそのへん習わないで大学に入れてもらえるのか?
大学によっては名前が書ければOK
変数の前に~がつくとどうなるんでしたっけ? ~の意味を教えてください
変数の型によります
ビット反転
ウワー
817 :
802 :2010/05/01(土) 14:03:15
7zipを解凍したいと考えている /usr/lib/p7zip/7z.soがあるんだけど、*.hじゃないとダメだよね?
おまえが全然ダメ
820 :
デフォルトの名無しさん :2010/05/01(土) 21:21:08
その質問じゃこちらとしても、まさに 解答のしようがない などと申しており
821 :
818 :2010/05/01(土) 21:26:40
822 :
デフォルトの名無しさん :2010/05/01(土) 21:32:21
>>818 > 7zipを解凍したいと考えている
OK
> /usr/lib/p7zip/7z.soがあるんだけど、
OK
>*.hじゃないとダメだよね?
何が?少なくとも.soが.hじゃないのは見ればわかる。
823 :
818 :2010/05/01(土) 21:35:28
>>822 どんな関数があるかとか、わかんないじゃん
#includeする時に*.hでも、大丈夫なのか?
824 :
818 :2010/05/01(土) 21:38:33
>#includeする時に*.hでも、大丈夫なのか? >#includeする時に*.soでも、大丈夫なのか?
825 :
デフォルトの名無しさん :2010/05/01(土) 21:44:10
>>823 includeするのはヘッダーファイルだろ。.hかどうかは分からないが、通常.soではない。
どんな関数があるかは7z.soのマニュアルでも読めばいい。
あるいは
$ nm 7z.so
とか。
>>818 の質問を、他人に伝わるように横から書き直してみる
>7zipを解凍したいと考えている
>/usr/lib/p7zip/7z.soがあるんだけど、*.hじゃないとダメだよね?
↓↓↓
>7zipを解凍する処理をC/C++で書きたいと思っている
>手元にダイナミックリンクライブラリの 7z.so があるんだけど、
>これだけあっても、ヘッダファイルが無いと書けないよね?
多分、こういう質問を言葉端折って書いてて伝わっていない事に気づいてなかったと思われ
827 :
818 :2010/05/01(土) 22:00:30
>>827 おまえがバカだってことを証明したレスに偉そうに「その通り」とかレスしてんじゃねえよアホ
「スレを立てるまでもない」質問をする所で、 質問をしちゃいけないとかwww 何この人wwww
>>829 アンカーつけないとどれに言ってるのかわからん
誰か質問するなとか書いてるっけ?
832 :
818 :2010/05/01(土) 22:21:06
結局、どうやって*.soを使えばいいんですか?
833 :
デフォルトの名無しさん :2010/05/01(土) 22:21:49
リンクしろ
LoadLibrary
835 :
818 :2010/05/01(土) 22:29:22
>>833 #include hogehogeはしなくていいんですね
thx
.soってwinだとdllに相当する また、コンパイルする時のライブラリとしても使われる /etc/ld.so.conf.d/ に実行時に使われるようにPATHを記述したファイルを作って /sbin/ldconfig する
837 :
デフォルトの名無しさん :2010/05/01(土) 22:48:28
>>835 いや、必須ではないが、現実的には普通ヘッダファイルもインクルードするだろ。
develファイルにヘッダーが入ってるとか?
839 :
818 :2010/05/01(土) 23:13:22
>>837 /usr/includeにヘッダファイルが見当たらないもので
>>838 develってredhat系のディストリでは見るけど
今はgentooを使っているから、そんなの無いよ
gentooが手抜きしてるだけだよ。
7zip単体で使うような構成みたい その知識で7zip使って何やりたいんだか?
842 :
818 :2010/05/01(土) 23:46:31
>>841 *.zipと*.rarを解凍したいんだよ
testってディレクトリを作って、さらにディレクトリを作り
その中にエロデータを解凍したいわけ
843 :
デフォルトの名無しさん :2010/05/01(土) 23:48:38
execでいいじゃん
もしかしてそれは、シェルスクリプトをちょろちょろっと組めば いいだけかもしれない。
845 :
818 :2010/05/01(土) 23:58:16
>>844 前にperlで作ったことがあるから、機能強化版をC++で作りたいわけ
その時は外部コマンドの呼び出しをしたので、
今回はちゃんとライブラリを使って書きたいな〜と
>>843 それって、外部コマンドの呼び出しでおk?
846 :
デフォルトの名無しさん :2010/05/02(日) 00:03:38
おk
847 :
818 :2010/05/02(日) 11:01:21
C++でマクロを定数代わりに使っているコードがあるんですが これって禁じ手じゃないんですか?
>>847 たまたま同名のマクロが宣言されてたらマズいからって事?
849 :
847 :2010/05/02(日) 11:08:47
>>848 データ型が保証されていないんじゃないかな〜と
>>849-850 それ右辺の型の問題であって、マクロの話じゃないじゃん
マクロってプリプロセッサで置き換わるだけのものだから
Cと互換性持たせたいコードの場合はマクロ使う そうでない場合は積極的にconst使った方がいい 禁じ手は言いすぎだが、 使わなくて済むならマクロは使わない方がいいし、使うべきではないと思う 型もそうだけど、名前空間の概念が無いとか、同名の定義したらアウツとか 色々問題あるからねえ
何でわざわざ、namespace test { class Hoge {}}なんて事をするんですか? クラスの名前くらいなら、名前が衝突する可能性が低いと思うんですが
854 :
356 :2010/05/02(日) 15:53:10
そりゃ数百行で済むくらいのコードなら衝突しないだろう。 数十万行を越えると衝突しないはずがない。 機能の分類を明確にする意味もある。
そんな事を言ったら、linuxとか作れないと思うんだけど
OS様は一番えらいから大丈夫 名前被ったらOS様と被る名前をつけていた方が悪い
linuxのインターフェース(システムコール)は「名前」で結合していない。 被るもヘチマもない。
>>856 そうゆう意味じゃないだろ
数えたことないけど, どんだけシンボルがあるか > Linux
# Linux に限ったことではない
ダウンロードしてzip開くなんて面倒だからオレはパス。 codepadやpastebinなら見るけど。
861 :
859 :2010/05/02(日) 19:31:44
関数ぬけたら消える変数のアドレスなんか使ってるからだろ
>>861 >>862 も言ってるが・・・
void init(str *p)
{
str DATA; // static にするか、グローバルにするかしないと関数抜けたら捨てられる領域
〜省略〜
p=&DATA; // 抜けて捨てられる領域を返している
}
怖い処理するなw
仮引数に代入してるから何も変化してないの方だと思う
その後のアクセスで落ちてる
まぁ
>>862 の指摘してる勘違いも持ってはいるなそうだが・・・・・・
だだ
>>862 の指摘はおかしい、代入した変数も消滅してるからなwwwww
>>863 その関数は怖くないよ
無意味なだけでwww
そうだ・・ これ仮引数への代入じゃん・・・ ポインタポインタじゃなかった 俺も釣ってくるwwwwwwwwwwwwwwwwwwwwwwwwwww 恥ずかしいわ
具体的にどうすればこの形を保ったまま動きますか?
関数の宣言を保ったままって意味なら無理じゃね void init(str **p) { static str DATA; *p = &DATA; } とかしなきゃ無理じゃね。で、メインはこう int main(int argc, char** argv) { str *p; init(&p); }
ありがとうございます main関数に入れたほうが見やすくなりそうですね
「全てのメソッドはクラスの属する」考えのjavaを勉強したわけですが C++でもほぼ全ての関数をクラスに属させようとしている俺はバカですか? Qtはほとんどの関数がクラスに属しているので、C++でもおkな気がする
>>871 > C++でもほぼ全ての関数をクラスに属させようとしている俺はバカですか?
バカとは言わん。別に良いと思うよ。
ただ、カプセル化という考え方を知っているか?
そしてメンバ関数とメンバでない関数でどっちでも同じ事ができるから
どっちにしようか迷った場合は、メンバでない関数を選ぶべきと言うのが
一応のC++の推奨される考え方。
(『Effective C++』 Scott Meyers著 参照ね。)
>>871 別にいいんじゃない?
ほぼってのが、メンバ関数にしない方が良いケースならそうするって意味ならいいが
限界まで無理やり所属させる気でいるならすこし問題がある
874 :
873 :2010/05/02(日) 22:00:57
なんという劣化説明・・・・・・・
875 :
872 :2010/05/02(日) 22:01:05
追記
>>871 メンバ関数でしかできない処理の場合はもちろんメンバ関数にすべきであるがね。
あと、C++には
オブジェクト指向のC++(クラス, 継承, etc)
といった使い方以外にも、
TemplateのC++(STLやTemplate MetaProgrammingとか)
という側面もあったりするので、色々勉強なさってください。
876 :
デフォルトの名無しさん :2010/05/02(日) 22:01:23
int型の変数を直接ビット演算子使って操作するのと、 C++のbitsetを使うのでは速度に差が出たりしますか? それとも内部的にはやってることが同じなのでほとんど変わりませんか? 同様に連結リストとvectorでは速度に差が出たりしますか?
あなたはなぜ実測しないのか?
めんどいからと、実測するのに効率的なサンプル構文の書き方が分からないから
では死んでください
>>876 前半はともかく
後半みたいな質問するとか、list と vectorで何が違うのかを知らないのか?
Visual C++ で普通にフォームを作って ボタンなど配置すると、 コードの中に this -> が、たくさんでてきます。 一応オブジェクト指向はすこし理解していますが、 このThisってどこで定義されているんでしょうか?またthisの意味を教えてください
>>881 それよりC++の本でも読んでC++の仕様を理解して下さい
そのインスタンスのアドレスです、thisの定義文はどこにもありません
「thisポインタ C++」でググったら?
>>882 >>インスタンスのアドレス
ありがとうございました!!
整数値を3つ持つ配列(「整数値を3つ持つ構造体」の配列?)をソートしようとしたら、 比較関数を自分で作れと言われて大変なショックを受けました。 なんでC++はこんなに面倒くさいんですか? Pythonなら簡単に書けるのに‥。 ちなみにPythonではなくC++を使う理由は、modを作りたいゲームが C++を採用していて、選択の余地がないからです。
C++からPython呼べばいいんじゃないですか?
889 :
871 :2010/05/03(月) 11:01:13
>>887 C++が面倒くさいんじゃなくて、Pythonが簡単過ぎると気づいて欲しい
>>887 ソートについても比較関数を使って比較方法を変更できるようにしてある。
そういう風に、できる範囲が広いぶん面倒になっている。
>>887 そのめんどくささも少し慣れれば、std::less<int>()とか体が自然に入力してくれるようになるから問題ない。
>>887 は、C/C++でのコーディングはPythonでコーディングする人の立場よりも、
Python.exe を作る人の立場に近いって事に気づいていない様子。
同じ立場の言語じゃないんだぜ。
Python言語を作ったベンダが、その面倒くさい処理をPythonユーザの代わりにやってくれてるから簡単なだけ。
C/C++でのコーディングは、その辺を全部自分でやらないといけないけど・・・ 探せば
>>892 も言うようなライブラリもあるんだぜとヒント。
探すっていうか、標準だけど。 ただ、まったく何も知らない状態だったら、それ自体勉強して理解しないと多分無理
>>888 失礼しました。
それをやると遅くなるし、そもそもこんな基本的な操作で外部処理を呼び出すというのは
スマートではない気がして、できればやりたくありません。
ほとんど自己流の日曜プログラマなので、とりあえずC++での一般解はどうなのか
知りたくてここにやってきました。
>>890-893 ふむう〜。
低級言語と高級言語の違いってことでしょうか。
とりあえずstd::lessというのを調べてみます。
ありがとうございました。
イラっとするわ
C++でもjavadocみたいな感じでコメントを書いていますが、 お前らは*.hと*.cppのどちらにコメントを書いていますか? やっぱり、doxygenとかを参考にしたほうがいいのかな〜
>>887 VC++2010ならラムダ式が使えるよ
ヘッダファイルに変数を定義しないで、*.cppの上部に変数を宣言しているコードがあります。 何でヘッダファイルに定義をしないで、*.cppだけに宣言して大丈夫なんですか?
#includeが何をするものなのか理解しているのか
なんでヘッダに変数定義しちゃうんだ
ヘッダファイルをヘッダと略すな
宣言と定義が逆になってるのかな?
ifの || ってキーボードの何処押せばよいんでしょうか? 毎回コピペしてますんで直接打ちたい
backspaceの左らへん
>>904 Shift押して\マークですか…
キーボード上じゃ線が真中で切れてるから解りませんでした。
コピペ卒業できました、ありがとう。
STLで、 vector<int> IntA; vector<int> IntB; // 各vector配列に要素を追加 ・・・ IntA = IntB; とした場合、IntBの各要素がIntAの各要素にハードコピーされるのでしょうか? それとも、ポインタ的な交換が行われるだけで、要素の多少に関わらず、代入のコストは同じなのでしょうか??
バッファサイズが足りてれば各要素の代入 足りてなければリサイズして各要素の代入
ハードコピーというかディープコピー?
910 :
906 :2010/05/03(月) 22:21:35
>>908 失礼しました(汗)
おっしゃる通り、ディープコピーのことです。
>>907 >>909 ありがとうございました。
スッキリしました。
(そのサイト、便利ですね!)
0が数値かNULLかを区別する方法を教えてください
ない
int *i = NULL; int x = 0; i = &x; の時、 if(i==NULL) { // i はNULL } else if((*i)==0) { // i(の示す先の値)は0 } 単に 「0が数値かNULLか」 って質問だと解無し。(NULL=値0)
0は数値でありヌルポインタ定数でもある どちらとして扱われるかは、代入や比較の対象によって決まる
915 :
911 :2010/05/04(火) 11:53:43
数値の0とヌルポインタ定数はあくまでも全く別の概念であって、 コード上の表記のやり方がたまたま同じになってるだけ (けど賢いコンパイラが文脈から判断して峻別している) ってこと?
0 だけじゃなくて 1-1 だってヌルポインタ定数だし 4*0 だって (9+4*5)/300 だってヌルポインタ定数だぜ
>>916 C FAQのヌルポインタの項とか読んどけ
class AnimDraw{ struct animpat{ vector<int> ghlist; int anigap; anipat(){anigap=1;}//コンストラクタ } vector <anipat> aplist; public: animDraw(){ aplist.push_back(anipat());//ひとつめのanipatをセット } }; とある本に載ってるコードなのですが push_back()って一番最後に要素を追加するって関数ですよね? なぜanipat()というコンストラクタを入れて機能するんでしょうか? 返り値ないですよね?
関数中でその表記を見かけたら それはコンストラクタを関数として呼んでるんじゃなく 一時オブジェクトを生成しているんだお 偉い人がそう書けって決めたんだお 一時オブジェクトとかテンポラリオブジェクトでググれば詳しく出てくるお
なるほど、そんな機能があったんですね ありがとうございました 勉強になりました
GUIアプリをC++で作れるかと思い調べていたのですが WIN32API / MFC / .NET という種類がある中でどうも違いが分からず。 .NETで、C++のコードを組み合わせて作れそうだとおもったのですが これらの入門的なサイトなどありましたら教えていただけますか
>>921 そんな機能って、別に特別な訳じゃないぜ
int a = 123; // ← 普通の代入
int b(123); // ← コンストラクタ
int(123); // ← 名前の無い一時オブジェクト
int c = int(123); // ← 一時オブジェクトを生成してコピー
int *d = new int(123); // ← int でも new 演算子で
>>922 windowsの話だとして
win32API … OSが持っている膨大な関数群。Windowsのソフトウェアにとって全ての大本
MFC … win32API関数群をラッピングしたマイクロソフト謹製のクラス集。VC6時代を最後にほぼ廃れている。
.NET … 上記2つと全然別物。上2つがネイティブコード、C/C++の世界だとすると .NET は管理された中間言語の世界。
VMによって管理され実行される Javaに似た世界。 まったく別物。
>.NETで、C++のコードを組み合わせて作れそうだ やろうと思えば出来ると言えば出来るけど、それは C++ と言うより C++/CLI という別言語を使う事になるので誤解しないように。 .NET使ったCLIによる実装は、よっぽど何か事情がある場合か、 あるいは予めそれが普通のC++ でない事を知った上で物好きが使う物。
第三者だが、これは分かり易い説明で感謝。 これからは.NETが主流になるのかな。 しかし、C++/CLIは分かりにくかったぞ・・・
C++/CLI はC++と言うよりむしろ C# のコードを C++風に書けるだけ コンパイルして出来る exe 自体、ネイティブじゃない
.NET+C#で、早くしたいところはDLLとかで補う感じ?
>>928 最終的にネイティブDLLとのやりとりで間にマーシャリングが必要になるから、
単純にそうすれば早くなるとは言えない。 というか、もうその辺の話はスレチ
.NetやるならくらいならQt使うわ
>>924 -
みなさんありがとうございました。
openglを使ったGUIアプリを作ろうと思っていたので
C++ということしか頭にありませんでした。
違いがよくわかりました。
openglでお絵かきソフト的なIFつけるとなると…どうしたらいいんだろうか…
>>931 glut でも使えば?と言うかOpenGLはただの C向け3D描画関数群なので
ソフトのUI なんて話になると、そもそもOpenGL以前にそのターゲットプラットフォーム上で何らかの手段で
それが構築出来ないと話にならないので、自分で動き理解した上で考えてググった方がいい
>>932 なるほど。仰るとおりですね。
glutは以前使っていたのですが、コンソールでの利用しかしておらず
windowsしか考えていないのでwindows上でいかに構築して
そこにopenglをぶち込めるかで検討しろということですよね。
そういう事。win32でボタンクラスをCreateWindowして張り込んでウィンドプロシージャでさくっと処理してもいい、 ごちゃごちゃして面倒だったり、物量多そうなら Qt だとか wxWidget だとかを利用してもいいしって感じ
strlenはなぜextern "C"をしなくても、C++で使えるのですか?
string.h にはちゃんと extern "C" って書いてあるよん
937 :
935 :2010/05/05(水) 22:47:45
std::priority_queueでポインタを格納:ポインタの指す先の優先度でソートしたいんですが、どう書けば良いでしょうか?
>>939 ポインタの指す先で調べたいのでどうにも・・・。
リンク先の情報を応用すれば大丈夫なんでしょうか?
コードで言うと、
std::priority_queue< Object* > Queue;
Queue.push( new Object() );
といった感じで・・・。
オペレータオーバロードがソートの鍵なんだから そこ応用すれば普通に出来ると思うけど
struct Comp : std::binary_function<Object *, Object *, bool>{ bool operator () (const Object *a, const Object *b) const{/*比較*/}; }; std::priority_queue<Object *, std::vector<Object *>, Comp> q;
構造体のアドレスを表示するにはどうしたらいいですか? ためしに struct a; struct *b; b=&a; とやってbと&aを確認しても違うアドレスが出てきます。 そもそも構造体なのでアドレスはひとつではないと思うのですが一つしか出てこないため確認の仕方が間違ってるようなきがします。
944 :
943 :2010/05/07(金) 00:51:22
上のstructは適当な構造体です
どういう風に確認してるんだ?
946 :
943 :2010/05/07(金) 01:02:22
>>943 は多分勝手な思いこみで目が見えなくなってる
950 :
デフォルトの名無しさん :2010/05/07(金) 08:39:16
>>950 >>944 で struct は適当な構造体と書いてあるので、
もし違う構造体なら、&a と b は同じになるとは限らないよ。
952 :
デフォルトの名無しさん :2010/05/07(金) 11:11:52
>>943 これなら同じになるんじゃない?
/* Cなら */
struct st;
struct st a;
struct st *b;
b = &a;
// C++なら
struct st;
st a;
st *b;
b = &a;
>>952 いや、違う型の構造体へのポインタへ代入する場合ね
954 :
デフォルトの名無しさん :2010/05/07(金) 18:42:41
>>953 どういう意味?
struct st1;
struct st2;
struct st1 a;
struct st2 *b;
b = (struct st2*)&a;
ってこと?
それでもbと&aは同じだよね?
struct st{}; main(){ struct st a; struct st *b; b=&a; }
struct{}a,*b; main(){ b=&a; }
>>954 struct A {
int a;
};
struct B {
int b;
};
struct AB : public A, B {
}
AB ab;
B* b = &ab;
// b != &ab となる
アップキャストとか壮大な話になってきたな。
hogeというclassで friend ostream& operator<<(ostream& out, hoge h); のように宣言して、関数の中身はクラスの外に別書きする場合、書き始めはどうなりますか?
friend ostream& hoge::operator<<(ostream& out, hoge h);
<<960 ありがとうございます
959 ですが、960で書き始めるとfriendがクラスの外にあるって内容の警告が出ます。 あと、must exactry take one argumentってエラーも出ました。 関数の宣言オンリーではなく、関数の中身をクラスの外に書く場合の書き方がわかる方お願いします
friend書いちゃだめ
>>963 そうそう頭ごなしに否定しなくても friendがかわいそうじゃないか
たとえばlhsが自クラスでは無い場合。
complex& operator+(double lhs,const complex& rhs);
たとえばlhsとrhsが対称な場合
void swap(hoge& lhs,hoge& rhs);
friendを使うのは、こんな場合にメンバを外部に晒さずに実装できること。
>>962 クラスの外がだめならクラスの中に書けばいいじゃない。
class hoge
{
friend void func1(int);
};
void func1(int)
{
}
>>966 ,965
ありがとうございます
クラスの外に書くときにフレンドは要らないとわかったのですが、
voidではなく、istreamやostreamなどの場合も有効でしょうか?
must take exactly one argumentというエラーが出てしまいます。。
>>964 その場合もfriend使わないだろ普通
そうさ・・・俺らは誰ともフレンドにはなれないのさ・・・
俺は孤高の戦士
孤高のプログラマはフレンドなど当てにせん
つまり、プライベートは見せられない、って事ですね。 非リア充だけに
#define private public
>>975 だからそう言う未定義動作をだな…(ry
ヘッダファイルの先頭に #if defined(private) || defined(protected) || defined(public) || defined(class) || defined(struct) #error you must die! #endif って書くべきだろうか。
>>975 みたいなのやるルーピー現実に存在するのか?
その手の小細工するより、エディタの置換機能で private を public に置き換えたほうがいいかと
singletonでgetInstanceをstaticなメンバ関数ではなく、 namespaceに属する関数で実装しているコードを発見しますた お前らはどう思いますか? namespace hoge { Test getInstance(); } class Test { public: Test(); ~Test(); }
>>980 諸般の事情からfriend関数で実装したのかな?と思った
singleton の意味ねーなーとしか でも理由は何かあるんだろうな 何だろう?
>>983 別にこのまま書かれてた、って話じゃないと思うの
え、
>>980 はSingletonにならないだろ…
つまり・・・・・どういうことだってばよ?
なんかVIPPERが紛れ込んでる予感ェ・・・
992 :
983 :2010/05/09(日) 03:35:06
>>987 それは分かるけど、
>>980 を見る限り、発見したというコードが
本当にシングルトンだったのかすら疑問に思えるのよ。
唯一のオブジェクトしか扱ってないならシングルトンなんだろうと思うけど
>>992 >本当にシングルトンだったのかすら疑問に思える
俺もうっすらそんな気はしてるw でもそれはそれとして、
質問は単にどう思うかってだけなのでどう思うかだけ答えればいいかなとw
あ、なるほど 戻り値の型が参照でもポインタでもないわなw
乙乙
乙
梅
梅完
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。