■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part48
251 名前:デフォルトの名無しさん :2006/03/24(金) 13:45:39
vectorのような使い勝手で元から確保していた配列のサイズを
オーバーしてしまった時に自動でリサイズしてくれるような
クラスを作りたいのですが、

x[i] = x[i-1] + vx[i] * dt;

と言うような感じのコードを実行したときに、
「x[i]」でリサイズが必要になった場合、
「x[i-1]」の参照が無効になってしまうと言う状態になってしまいました。
なにかこう言った状態を解決する方法はないのでしょうか?
よろしくお願いします。


252 名前:デフォルトの名無しさん :2006/03/24(金) 13:49:02
>>251
operator [] の戻り値を参照型じゃなくて値型にしていれば
そういった状態にはならない。

配列クラスへのポインタとインデックスの組み合わせを持った
プロキシオブジェクトを返すことでも解決できるかもしれない。

253 名前:251 :2006/03/24(金) 13:57:18
>>252
値の代入は何かほかの方法を用意しておくしかないということでしょうか?
プロキシオブジェクトについてはしらなかったので調べてみます。
ありがとうございました。


254 名前:デフォルトの名無しさん :2006/03/24(金) 14:06:31
>>249

bool hoge = true;

void hige() {
while(hoge);
}

大域スコープにあってもループ中にhogeを変更する明示的なコードが無いから>>221
↓のように置き換えるコンパイラがあってもおかしくない。つかstrength reduceとかあたりまえ。

void hige() {
if (hoge)
for (;;)
;
}

autoだと変数がレジスタにしか割り当てられない可能性高いけどそれはまた別の話。

はいはいワロスワロス

255 名前:デフォルトの名無しさん :2006/03/24(金) 14:09:48
どうやっても効率悪そうだな。
事前にresizeするか、↓じゃだめなの?

prev = x[i-1];
x[i] = prev + vx[i] * dt;

256 名前:デフォルトの名無しさん :2006/03/24(金) 14:18:17
>>255
それだったら、STLのvector使っても、あまり変わらないだろう。

257 名前:251 :2006/03/24(金) 14:28:56
>>255
自分で使うだけなら事前にresizeするだけでもよかったんですが、
C言語もほとんどしらないような友人も使うので
できる限り単純にしておいておきたかったんですよね。
かといってデータの量もかなりあるので余り無駄なメモリも負担も増やせなくて…


258 名前:251 :2006/03/24(金) 15:02:28
度々申し訳ないです。
一度も値が代入されていない変数の値を使う事は普通は無いと思うので、
リサイズする可能性があるのは代入演算子の左側の「x[i]」だけだと考えて、
x[i] = x[i-1] + vx[i] * dt;
と言うような命令があったときに「x[i]」でリサイズして
配列をdeleteするのを、次に「operator[]」が呼ばれた時にする
というのはありなのでしょうか?
なにか問題が起きそうな気もしなくもないですが


259 名前:デフォルトの名無しさん :2006/03/24(金) 15:03:50
副作用完了点をもう一度熟読した方がいいな。

260 名前:251 :2006/03/24(金) 15:13:58
>>259
確かによくわかっていなかったです。
一度詳しく調べてみます。


261 名前:デフォルトの名無しさん :2006/03/24(金) 15:36:21
移植性がなくなってもよいのなら、>>251の言うような事はできるかも
しれんが、少なくとも式の評価順序について曖昧な部分は、その
処理系の説明書にも書いてないだろう。

規格はそこまで縛ってないのだから。自分で調べるというのならそれでも
いいのだが。

262 名前:デフォルトの名無しさん :2006/03/24(金) 15:50:24
STLでツリーって、どーつくるんですか?

263 名前::2006/03/24(金) 15:55:15
Boost Graph Library を使う。

264 名前:デフォルトの名無しさん :2006/03/24(金) 15:56:59
「STL」でって言ってるだろうが、このカス

265 名前:デフォルトの名無しさん :2006/03/24(金) 15:58:11
>>261
operator=のPOD型に関する評価順序は右から左と決まっているので、
右辺を評価した後で左辺を評価した時に配列やvectorの参照アドレス
が変わるのがまずいって話でしょう。

あとoperator+とかは左から右なので、例えばx[i} + x[i + 1]という式が
あったとして、x[i + 1]がxの参照を変更してしまうような操作であった場合、
x[i]が参照で返されているとアクセスエラーが出る可能性があります。
だから>>252さんのおっしゃられる通り、値返しにすれば、アドレスが変化
しても問題がないように思います。

266 名前:デフォルトの名無しさん :2006/03/24(金) 16:01:17
配列でつくって、インデックスの差で構築するのが無難ですかー?

267 名前:デフォルトの名無しさん :2006/03/24(金) 16:04:33
>>265
いやいや、今の話はPOD型ではなくて、自前のクラスの話では。
まあクラスにしても同じなんだが。

268 名前:デフォルトの名無しさん :2006/03/24(金) 16:34:23
>>251
いっそstd::map使え。キーにstd::size_tを指定してしまえ。

269 名前:デフォルトの名無しさん :2006/03/24(金) 16:48:13
>>262
漏れは、各ノードに「親ノードへのポインタ」と「子ノードへのポインタのリスト」を持つようにした。
struct tree {
  tree* parent;
  std::list<tree*> children;
  T value;
};
実際にはstructではなくclassで、各メンバはprivateにした上でアクセサを定義。
イテレータとして
1. 子ノードイテレータ
 typedef std::list<tree*> children_type;
 typedef typename children_type::iterator children_iterator;
2. preorder_iterator(begin()、end()で先頭・末尾の次を取得でき、全ノードを前置順走査する)
3. postorder_iterator(rbegin()、rend()で先頭・末尾の次を取得でき、全ノードを後置順走査する)
を用意。tree::iteratorにpreorder_iteratorをtypedefしておく。
子ノードの追加はoperator+, +=、削除はoperator-, -=

これにストリーム入出力つけて300行くらい。でもコード見たらboost::iterator_facade使ってた。


270 名前:デフォルトの名無しさん :2006/03/24(金) 16:54:27
「STL」でって言ってるだろうが、このカス

271 名前:デフォルトの名無しさん :2006/03/24(金) 17:02:57
なんか変なのが混じってるようだが、マジレスすれば、

STLにツリーは用意されてません。
もしSTLっぽいツリーを実装したいなら、「tree.hh」でググるべし。

272 名前:デフォルトの名無しさん :2006/03/24(金) 17:03:16
>>269
始めはこの形を検討しました。
ただ怖いのは、ポインタが無効になることなんですよね。。

やっぱり配列かなぁ。。
Cらしくない。。

273 名前:デフォルトの名無しさん :2006/03/24(金) 17:05:53
>>271
おぉ。
面白そうなので、ソースを見てみます。

274 名前:デフォルトの名無しさん :2006/03/24(金) 17:10:04
>>273
ここが C++相談室 ならお前の言うことは正しい。
しかし、ここは 【初心者歓迎】C/C++室 Ver.25【環境依存OK】 なのであった。


275 名前:デフォルトの名無しさん :2006/03/24(金) 17:11:18
今後このスレは【初心者歓迎】C/C++室 Ver.25【環境依存OK】 となりますた


276 名前:デフォルトの名無しさん :2006/03/24(金) 17:15:39
うおっ
すまん。素でまちがえた。


277 名前:デフォルトの名無しさん :2006/03/24(金) 17:16:18
>>274
なにその誤爆系ギャグ


278 名前:デフォルトの名無しさん :2006/03/24(金) 17:17:20
>>272
ポインタが無効になる、というのはどういうこと?
見落としてるのかな。

279 名前:デフォルトの名無しさん :2006/03/24(金) 17:21:02
>>278
コピーした場合とかですね。
イテレータに詳しい方ならわかるはず。

280 名前:デフォルトの名無しさん :2006/03/24(金) 17:39:36
>>279
ううん…?
要素追加時にnew、要素削除時に子要素もろともdelete。
treeのデストラクタで全要素delete。
コピーコンストラクタでは構造通り全要素追加。
std::list<>で持っているのはノードへのポインタだから、deleteされるまで無効にはならないはず。
各イテレータは、直下の子要素追加・削除時に無効になるけれど、それはSTLでも同じことじゃないかい?

それとも見当はずれのことを言ってるのかな('A`)

281 名前:デフォルトの名無しさん :2006/03/24(金) 17:42:39
要素を管理しきれないなら木なんか作るな

282 名前:デフォルトの名無しさん :2006/03/24(金) 17:44:56
>>254
>関数呼び出しの前には値をストアするだろうし、後で参照すれば値をロードしなおす
 ^^^^^^^^^^^^^^^^^
目の不自由な人乙
それとも理解力ないのか?

283 名前:デフォルトの名無しさん :2006/03/24(金) 17:58:51
>>280
気にしていたのは、

tree<...> x, y;
xつりーを構築;
y = x; //yは有効なつりー?

とかです。

よく考えてみたら、yの木を根から再構築すればいいだけの話ですね。。


284 名前:デフォルトの名無しさん :2006/03/24(金) 18:00:56
>>283
日本語おかしいですね。
"y" -> "x"
もしくは、
"yの木を"->"yの木は"

285 名前:デフォルトの名無しさん :2006/03/24(金) 18:03:55
>>283
日本語おかしいですね。
"y" -> "x"
もしくは、
"yの木を"->"yの木は"

286 名前:デフォルトの名無しさん :2006/03/24(金) 22:47:25
251じゃないけど、勉強中なので練習がてら>>251の作ってみました

operator[]が返すのは参照型がダメだけど代入はできるようにする
っていうのを意識して内部クラス作ってみた

とりあえず最小限のことしか用意してませんが、なにかあれば添削とか批評お願いします
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1706.txt

>>252
プロキシオブジェクトのことなんも知らず作ったけど、もしかしてこういうやつのこと?

287 名前:デフォルトの名無しさん :2006/03/24(金) 23:06:05
>>286
ひえーBCCだとコンパイルできない。
BCCぜってー変だよこれ。
VC7.1だと通るね。

288 名前:デフォルトの名無しさん :2006/03/24(金) 23:33:25
BCC なんて時代遅れだ。

289 名前:デフォルトの名無しさん :2006/03/24(金) 23:48:27
C++が読めないので教えください。
宣言の初期化みたいなんですけど、
コメントの 1、2、3 と return文 4 の
ところです。

#include <stdio.h>
class test {
public:
test() {};
~test() {};
static test* ins();
static test ins1;
static test* ins2;
static test* ins3;
};

test test::ins1; // 1
test* test::ins2 = test::ins(); // 2
test* test::ins3 = (test*)NULL; // 3

test* test::ins() {
return new test(); // 4
}

290 名前:デフォルトの名無しさん :2006/03/24(金) 23:53:18
>>289
1から3は静的変数の定義。
クラスの静的変数は、クラス内の宣言とは別にどこかcppファイルで定義が必要。
普通のグローバル変数がヘッダで宣言し、どこかで定義するのと同じこと。

2と3は初期化子を指定している。

4は動的にオブジェクトを作っている。誤解を恐れず言えばmallocのC++版と言ったところ。

これくらい自分で何とかしろよ。

291 名前:デフォルトの名無しさん :2006/03/24(金) 23:56:43
>> 290
ありがとうございます。感謝です。
C++は暗号みたいで難しいです。

292 名前:デフォルトの名無しさん :2006/03/25(土) 00:18:05
ついでに言うと、こんなコード参考にしちゃいかんよ。
このコードだとメモリリークする危険がありますな。

293 名前:デフォルトの名無しさん :2006/03/25(土) 00:30:20
289ではないけど

freeがないからリークの可能性って事

C言語はまだ良く分からないけど

294 名前:由美子 :2006/03/25(土) 00:32:26
コマンドプロンプト-bcc32 kon.c
NTVDM CPUは不正命令を検出しました。
CS:270c IP:0103 OP:63 3a 5C 42 6f アプリケーションを終了するには[閉じる]を選んでください。
と表示され.odjファイルしか作れません。三つファイルが出来るのですよね?
かれこれ2時間格闘しています。
誰か、何が悪いのかわかる方いらっしゃいますか?
よろしくお願いします。かなりの初心者で申し訳ありません

295 名前:デフォルトの名無しさん :2006/03/25(土) 00:57:53
core吐いてないか?
それを見てなんとか汁

296 名前:デフォルトの名無しさん :2006/03/25(土) 01:21:03
本物のプログラマはコアダンプを読める。

297 名前:デフォルトの名無しさん :2006/03/25(土) 01:58:29
本物のプログラマはechoとリダイレクトでプログラムする。

298 名前:由美子 :2006/03/25(土) 02:44:13
core?ですか?わかりません。初心者で申し訳ないです。どーやって調べれば見つかりますか?
ホントお願いします。泣

299 名前:デフォルトの名無しさん :2006/03/25(土) 02:47:59
>>265
'=' も '+' も評価順序は決まってないよ。

300 名前:デフォルトの名無しさん :2006/03/25(土) 02:54:45
NTVDM つってるのに core かよ・・・ 何ともご立派なセンセイだな

301 名前:デフォルトの名無しさん :2006/03/25(土) 03:10:13
あるクラスのインスタンスが、状態遷移を持っていて、
その状態によって、使えるメソッドが決まる、という設計は
やっぱ糞かなw

302 名前:デフォルトの名無しさん :2006/03/25(土) 03:11:51
>>301
糞かどうかはわからないが、バグの元になることは確かだ。

303 名前:デフォルトの名無しさん :2006/03/25(土) 05:51:56
asshole->*

304 名前:デフォルトの名無しさん :2006/03/25(土) 09:40:59
屁みたいな質問内容だと思うけど出来れば教えてください
以下のソースで動かしました
#include <iostream>
using namespace std;
class Test{
public:
char *ary;void print(char *ary);Test(char *ary);~Test();};
Test::Test(char *ary){cout << "コンストラクタ\n";cout << ary << '\n';}
Test::~Test(){cout << "デスクトラクタ\n";cout << ary << '\n';}
void print(Test *obj){obj->ary = "print()\n";}
int main(){Test obj("Hello");print(&obj);return 0;}
で、デスクトラクタは、オブジェクト破棄の後に出る関数と捉えているんですが
結果、print()という関数の前にデスクトラクタが出てきました
objが破棄されたにもかかわらず、objの参照渡しがなされてるようで
不思議です。まだまだクズの初心者なんで、学習量が少ないんですが
出来れば教えてください

305 名前:デフォルトの名無しさん :2006/03/25(土) 09:54:22
>>304
>結果、print()という関数の前にデスクトラクタが出てきました
どうやってこれを確認した?

306 名前:デフォルトの名無しさん :2006/03/25(土) 09:57:01
>>304
コンストラクタ
Hello
デスクトラクタ
print()
と出力されて何も問題ないようだが。
ちなみにprint関数の中では代入しているだけで画面への出力はぜんぜん行っていないからな。

307 名前:デフォルトの名無しさん :2006/03/25(土) 11:39:15
>>288
何を言う!BCCと言っても、現時点では最新バージョンの5.8.1だぞ!
(タイムスタンプ 05-12-01 10:01)

・・・・・と言ってもむなしいだけだよな。氏ねよBCC・・・・

308 名前:デフォルトの名無しさん :2006/03/25(土) 16:32:58
早見優!

309 名前:デフォルトの名無しさん :2006/03/25(土) 19:10:32
>>304
挙動については>>306だと思うが、気になったので老婆心から一言言わせてくれ。
クラスTestのメンバにvoid print(char* ary)があり、かつ、クラス外にもvoid print(char* ary)がある。
こういうケースでは、クラスメンバの方だけを使う方がいいと思う。
あと、メンバ変数char* aryと、コンストラクタの引数char* aryが同名だけど、ちゃんと混乱せず使えてる?
挙動がわからない状況では、まぎらわしい記述は避けた方がいいよ。


310 名前:デフォルトの名無しさん :2006/03/25(土) 19:11:40
>>309の「クラスメンバの方だけを使う方がいい」というのは無視してくれ。
すまんこ

311 名前:304 :2006/03/25(土) 20:34:31
まだ、勉強中なので、混乱した状態での把握をしておこう
と思っています。さすがに、長いプログラム書くときに
こんな同名の変数やら、メンバやらは区別しようと
思ってます。

312 名前:デフォルトの名無しさん :2006/03/25(土) 21:03:46
>>304
これやってみな
main()
{
cout << "--------------" << endl;
Test obj("Hello");
cout << "--------------" << endl;
print(&obj);
cout << "--------------" << endl;
}

313 名前:デフォルトの名無しさん :2006/03/25(土) 21:05:57
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
     筑紫23の偏向報道にはもう我慢できない!!!
   スポンサー「キリン」に対して抗議の不買運動実施中!!!
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆

一向に偏向報道をやめない筑紫23に対して抗議の不買運動を実施中です。

・偏向報道って具体的にどんななの?
→★TBSで放送された、ナヌムの家の動画
  --- 動画抜粋 ---
  動画1
  http://youtube.com/watch?v=AlPQUhb7GDI
  動画2
  http://youtube.com/watch?v=lHEDn2CMTYg
  そんなに長くありません。1回見ればその悪質さが理解できます。
(これは一部です。本スレにすべてのリンクがあります)

・なんで不買?直接抗議すれば?
→電話やEメールなどで抗議では、聞き流されるか不遜な応対をされます。
 不買運動は元法務大臣も推奨する合法的な活動です。

・何でキリンだけなの?
→みんなでまとまって一つの企業に対してやらないと力が分散し、あまり効果が望めません。
 特に偏向・捏造・隠蔽の酷かった「ナヌムの家」の回のスポンサーであったキリンに白羽の矢が立っただけです。

 詳しくは本スレまで
【キリンから】筑紫23偏向報道・スポンサーに抗議の不買★30
http://live22x.2ch.net/test/read.cgi/news/1143280975/



314 名前:デフォルトの名無しさん :2006/03/25(土) 22:12:11
>>311
> こんな同名の変数やら、メンバやらは区別しようと
これは、ちょっと違う
変数名は別に同じでも構わない
初心者は別だが

315 名前:デフォルトの名無しさん :2006/03/25(土) 22:38:27
あるクラス定義ヘッダ中で、

int getHoge(int a) const;

とかかれていた所があったのですが、このconst はどういう意味なのでしょうか?


316 名前:デフォルトの名無しさん :2006/03/25(土) 22:39:24
クラスのメンバ変数を書き換えません。

317 名前:デフォルトの名無しさん :2006/03/25(土) 22:40:56
俺も数日前同じ質問したな
おまいらありがと

318 名前:デフォルトの名無しさん :2006/03/25(土) 22:43:17
static int getHoge(int a);
とどう違うの?

319 名前:デフォルトの名無しさん :2006/03/25(土) 22:47:00
比較するなんて考えたくないほど全く違う

320 名前:デフォルトの名無しさん :2006/03/25(土) 23:35:42
>>318
端的に言えばthisポインタの有無。

だめな説明だな、これじゃ。

321 名前:デフォルトの名無しさん :2006/03/25(土) 23:36:57
>>318だとgetHoge()の中でメンバー変数に一切アクセスできない。
>>315だとgetHoge()の中でメンバー変数を読むことだけはできる。

322 名前:デフォルトの名無しさん :2006/03/26(日) 00:40:35
ヘッダファイルにインクルードしたくないから
ポインタでかまわない場合は、

class CFoo;

class CAAA
{

protected:
CFoo *pFoo;
};

こんなふうによくやりますけど、
このCFooってクラスがnamespace付きの場合って、
無理なんでしょうか。




class hoge::CFoo;

class CAAA
{

protected:
hoge::CFoo *pFoo;
};


こういうのは怒られてしまうんですけど、
ヘッダにインクルードする以外手はないんでしょうか


323 名前:デフォルトの名無しさん :2006/03/26(日) 00:44:41
namespace hoge
{
class CFoo;
}

じゃだめか?

324 名前:デフォルトの名無しさん :2006/03/26(日) 02:50:33
素朴な疑問だが、コンストラクタが複数ある場合に初期化リストって
めんどくね?
俺はパフォーマンス多少悪くなるけど、共通関数作って呼んじゃってる
けど、みんなどうしてる?


325 名前:デフォルトの名無しさん :2006/03/26(日) 04:52:05
そうしてる。

326 名前:デフォルトの名無しさん :2006/03/26(日) 04:53:24
がんばって初期化リスト使う

極まれにマクロつかったりする

327 名前:デフォルトの名無しさん :2006/03/26(日) 05:48:12
>>324
メンバ多すぎるんじゃね?
private にネストしたクラス作るとうまくいったりする。

328 名前:デフォルトの名無しさん :2006/03/26(日) 07:57:58
>>324
クラスをインターフェイスと実装に分離し、非公開継承する

329 名前:デフォルトの名無しさん :2006/03/26(日) 08:34:46
pimpl

330 名前:デフォルトの名無しさん :2006/03/26(日) 10:41:17
>>324
どんなにきつくても悪魔のささやきには負けない

331 名前:デフォルトの名無しさん :2006/03/26(日) 12:16:20
俺はデータブロックとみなすかインターフェースとみなすかで
早めにPODとクラスに分けちゃってクラスの書き方は速度をあんまり考えてない。

332 名前:デフォルトの名無しさん :2006/03/26(日) 12:53:50
>>331 お前さん、 POD の意味わかってる?

333 名前:デフォルトの名無しさん :2006/03/26(日) 12:56:21
plain old dataだろ?ハゲを舐めるなよ

334 名前:デフォルトの名無しさん :2006/03/26(日) 12:57:01
そうなると >>331 の意味がわからんわけだが。

335 名前:デフォルトの名無しさん :2006/03/26(日) 13:04:57
別にフサフサはムリして理解しようとしなくていいぞっと

336 名前:デフォルトの名無しさん :2006/03/26(日) 13:08:17
いや、ハゲが言葉の意味を誤解してるんだろ。
struct S { std::string s; }; この S はデータブロックだが POD じゃないぞ。

337 名前:デフォルトの名無しさん :2006/03/26(日) 13:11:13
>>321ありがdd

338 名前:デフォルトの名無しさん :2006/03/26(日) 14:23:56
>>323

おお、なるほど!!
ありが`

じゃあついでにもう1こ。

クラス内クラスを別ヘッダから宣言だけしたい場合はどうすればよいんでしょ。

class CFile
{
class CHandle
{
int a;
};
};

こういうクラスがあったとして、CHandleを別のヘッダで


class CFile::CHandle;

ってやると怒られてしまいますが、
これって、

class CFile
{
class CHandle;
};

こんなことやってもダメですよね?


339 名前:デフォルトの名無しさん :2006/03/26(日) 14:31:51
>>338
その問題は避けられないので、ネストされたクラスは
インターフェースに使わないほうがいい。
逆に言うと、インターフェースに使うクラスは
ネストされたクラスにしないほうがいい。

340 名前:デフォルトの名無しさん :2006/03/26(日) 20:40:49
includeのヘッダファイルなどの書き方について
よくわからないところがあったので質問させてもらいました。
「*.h」というようなファイルには極端な話し
外部のファイルからアクセスする必要があって、
実体の無い物のみ書き込むと言うような考え方で良いのでしょうか?
またサブフォルダなどを使ってはいけないと言う話しをどこかで聞きました。
#include "./test/test.h"
#include "../test.h"
などとすると問題が起きることがあるのでしょうか?
ヘッダファイルの中では極力インクルードを使わないようにした方が良い
なんて言う話しも聞いたことがあります。
なにかこう言ったようなやってはいけない的な事があれば
教えてもらえませんでしょうか?
基本的な質問で申し訳ないですが、よろしくお願いします。


341 名前:デフォルトの名無しさん :2006/03/26(日) 20:50:52
Cの時代なら、基本的にはヘッダファイルにはプロトタイプ宣言を、
*.c ファイルには関数の定義を書くんだよ、って言えたんだけどなぁ。
クラスの定義はヘッダファイルに書くし、テンプレートの定義も
ヘッダファイルに書くし、ヘッダファイルって大活躍だよね。

ごめん、ぜんぜん質問の答えになってなかった。寝るわ。

342 名前:デフォルトの名無しさん :2006/03/26(日) 21:09:00
>>341
確かに言われてみればクラスやテンプレートを勉強し始めてから
よくわからなくなってきたような気がします。
ありがとうございました、お疲れさまです。

343 名前:デフォルトの名無しさん :2006/03/26(日) 22:44:36
>>340
ヘッダの変更は利用側の再コンパイルを必要とするので、
内容は必要最小限にしておいたほうがいい。

ヘッダファイルの検索方法は標準で定義されていないので
コンパイラ間で移植を行うときに問題になることがある。
個人的には、 . や .. などソースファイルの位置に依存する書き方は
問題になりやすいのでお勧めしない。
ただ、コンパイルオプションの設定でどうにかなることがほとんど。

ヘッダファイルの中でのインクルードは依存関係を累積的に増やす事になる。
これも必要最小限にするべきだろう。


344 名前:デフォルトの名無しさん :2006/03/26(日) 23:33:12
 public:
typedef enum A {
a,
b,
c,
: (20個ぐらい続く)
} TypeA;


こういうクラスの中にtypedefされたenum定義とかって、別のヘッダファイルにしておいて
public:
include A.h;

みたいにかけないですかね?


345 名前:デフォルトの名無しさん :2006/03/26(日) 23:35:22
>>344 かけるよ。

346 名前:デフォルトの名無しさん :2006/03/26(日) 23:35:27
>>344
普通に書けるよ。
class something {
public:
#include "A.h"
};

347 名前:デフォルトの名無しさん :2006/03/26(日) 23:59:21
#include <a.h>で出来るだろ。

348 名前:344 :2006/03/27(月) 00:04:54
orz

349 名前:デフォルトの名無しさん :2006/03/27(月) 00:37:40
class A, B, C というのがあり、BもCもAを継承するのですが、Aの一部の
メソッドは、Bの方には継承したくありません。こういう場合、一般的にはどうするのが
うまい設計でしょうか?

単純にAの一部のメソッドを別クラス(A’)にしてCの方は、AとA’
を多重継承させるのが簡単かと思いますが、この場合A’は引数にAの
メンバ変数を取る単なる関数の集合体になります。まぁこれでもいいの
ですが、何かもうちょっとオブジェクト指向的な?よい方法はありますか?

350 名前:デフォルトの名無しさん :2006/03/27(月) 00:43:05
>>349
> この場合A’は引数にAのメンバ変数を取る単なる関数の集合体になります
ここの意味がわからん。

不満が無いならそれでいいだろう。
何が不満なのかわかるように書いてくれれば、
回避方法もあるかもしれんが。

351 名前:デフォルトの名無しさん :2006/03/27(月) 00:45:07
>>349
Aの一部のメソッドを外したものをBaseAとして定義してその一部のメソッドだけの集合をOptAにつっこんでCはOptAを継承してBはBaseAを継承じゃだめなのか?
というかAが基底になりきってないだけじゃないの?

ライブラリ提供のAだってならどうしようもないけどな。

352 名前:デフォルトの名無しさん :2006/03/27(月) 00:49:14
>>349
「オブジェクト指向的」に言うと、Aの持つインターフェースを全て持たないなら
BはAをpublic継承すべきではない。
C++の観点から言うと、usingを使って継承されたメンバのpublic/privateを自由に変更できる。

353 名前:デフォルトの名無しさん :2006/03/27(月) 00:49:29
BでAから継承したくない関数と同名で引数を変えたメンバ関数を
プライベートに宣言しとくとか


354 名前:デフォルトの名無しさん :2006/03/27(月) 00:51:56
>>352
>C++の観点から言うと、usingを使って継承されたメンバのpublic/privateを自由に変更できる。
できなくね?


355 名前:デフォルトの名無しさん :2006/03/27(月) 00:55:02
>>354
#include <iostream>

struct a
{
  void f(){std::cout << "f\n";}
  void g(){std::cout << "g\n";}
};

struct b : public a
{
private:
  using a::f;
};

int main()
{
  b x;
  x.f(); /* エラー: b::fはprivate */
  ((a &)x).f(); /* ok */
}

356 名前:デフォルトの名無しさん :2006/03/27(月) 00:58:14
>>355 うは、使えねぇ。

357 名前:354 :2006/03/27(月) 00:59:04
>>355
g++ 3.3.5では通るのであった
355の方が自然だとは思うけど,さて規格ではどっち?


358 名前:349 :2006/03/27(月) 01:01:09
みなさんアドバイスありがとうございます。
その中で、

>>352
>「オブジェクト指向的」に言うと、Aの持つインターフェースを全て持たないなら
BはAをpublic継承すべきではない。

まさにここをお聞きしたかったのですが、全てもたないけど一部は持つ(その一部
は実装が共通のメソッド)
という場合はどのようにすべきなのでしょう? 個人的にはこれってmix-inの問題
なのかなと思ったりするのですが。う〜ん


359 名前:349 :2006/03/27(月) 01:02:17
あ、public継承にしなければいいのかな

360 名前:デフォルトの名無しさん :2006/03/27(月) 01:03:04
>>357
g++3.5.4
test.cpp: In function `int main()':
test.cpp:5: error: `void a::f()' is inaccessible
test.cpp:18: error: within this context

361 名前:デフォルトの名無しさん :2006/03/27(月) 01:03:36
>>349
そもそもなんでAを継承したい?

362 名前:360 :2006/03/27(月) 01:04:08
3.4.5ね。

363 名前:デフォルトの名無しさん :2006/03/27(月) 01:04:53
>>358
どうするべきかって言ったら、きっちりインターフェースを切るべきに決まってるだろ。
何が不満なのかわかんないままだし。

364 名前:デフォルトの名無しさん :2006/03/27(月) 01:05:36
>>343
なるほど・・・ありがとうございます。
参考になりました。

365 名前:デフォルトの名無しさん :2006/03/27(月) 09:59:23
なんだっけ。
「ペンギンは鳥。鳥は空を飛べる。従ってペンギンは空を飛べる。あれれ?」問題だっけ。
鳥クラスにfly()メソッドがあり、鳥クラスを継承したペンギンはfly()が呼び出せる。
fly()をprivateにしたり例外投げたりすることで、ペンギンは空を飛べなくなる。
しかし、これは、ペンギンは空を飛べるが、空を飛ぼうとしたら必ず失敗する、ということにすぎない。
それが嫌なら、flyable_birdクラスとnon_flyable_birdクラスあたりに分離する。

というのをどこかで昔読んだ。

366 名前:デフォルトの名無しさん :2006/03/27(月) 10:58:14
>空を飛ぼうとしたら必ず失敗する、ということにすぎない。

実際、そうだけどね
バージョン化したプログラムに退化器官はつきものだし
退化ではなくもともと翼のない鳥なんておかしなものを後付で作るほうがどうかしてるよ

367 名前:デフォルトの名無しさん :2006/03/27(月) 11:19:42
>>365
なんかすごい納得。いいなその説明。
メモっとこ。

368 名前:デフォルトの名無しさん :2006/03/27(月) 11:28:56
飛ぶ概念クラスを作ってその鳥クラスに継承させるか否か決めればいんじゃね?

369 名前:デフォルトの名無しさん :2006/03/27(月) 11:32:40
そこで、テンプレートですよ。

struct typelist_tag{};

template< typename Signature > struct inherits;
template< typename T1 >
struct inherits< typelist_tag ( T1 ) > : public T1 {};
...

/* 鳥テンプレート */
template< class Polices >
class bird : public inherits< Polices >
{
 ...
};

struct flyable { virtual void fly()=0; };
struct swimable { virtual void swim()=0; };

// カラス
class crow : public bird< typelist_tag( flyable ) >
{
 /* fly を実装するとか */ ...
};

// ペンギン
class penguin : public bird< typelist_tag( swimable ) >
{
 /* swim を実装するとか */ ...
};

370 名前:デフォルトの名無しさん :2006/03/27(月) 11:40:33
それって多重継承で良くね?
// 鳥
class bird
{
 ...
}; 

struct flyable { virtual void fly()=0; }; 
struct swimable { virtual void swim()=0; }; 

// カラス 
class crow : public bird,public flyable

    /* fly を実装するとか */ ... 
}; 

// ペンギン 
class penguin : public bird,public swimable

    /* swim を実装するとか */ ... 
};

371 名前:デフォルトの名無しさん :2006/03/27(月) 11:41:08
>>368の言うとおり、「鳥は空を飛べる」の時点で間違ってるんだけどな

372 名前:デフォルトの名無しさん :2006/03/27(月) 11:45:25
あの鳥はまだうまく飛べないけど〜
いつかは風を切って知る〜

373 名前:デフォルトの名無しさん :2006/03/27(月) 12:01:20
>>372
空気嫁

374 名前:デフォルトの名無しさん :2006/03/27(月) 12:04:30
空を〜
飛べるはず〜

375 名前:デフォルトの名無しさん :2006/03/27(月) 12:04:58
>>365
EffectiveC++の
「publicに継承するときはis-a関係にあるか確認しよう」
に出てた。これが最初かしらんけど。

   bird
  /   |
flying non flying
      |
     penguin

こんな感じででてたね。
私自身、この設計が間違ってるとは思わないけど、
本の中で、例を出すにはいい解説だったと思うよ


376 名前:デフォルトの名無しさん :2006/03/27(月) 13:15:25
class hoge{
hoge();
}
hoge::hoge(){
class piyo{
piyo();
int piyovalue;
}
}
piyo::piyo(){
piyovalue=0;
}

見たいな事できる?
変なところがあったらダメだし求む。

377 名前:デフォルトの名無しさん :2006/03/27(月) 13:28:15
>>376
試すって発想は無いのか?

378 名前:デフォルトの名無しさん :2006/03/27(月) 13:31:04
無いが何か?

379 名前:デフォルトの名無しさん :2006/03/27(月) 13:35:54
なら回線切って首吊って氏ね

380 名前:デフォルトの名無しさん :2006/03/27(月) 13:39:59
お前が氏ね

381 名前:デフォルトの名無しさん :2006/03/27(月) 14:14:37
みんなはさーん

382 名前:デフォルトの名無しさん :2006/03/27(月) 17:07:53
>>379
相談のマナーがなってなけりゃスルーでええやん。


383 名前:デフォルトの名無しさん :2006/03/27(月) 17:46:41
>>376
どうでもいいけど、classの宣言・定義は、ブロック {} のあとに ; が必要だ。
piyoのコンストラクタはprivateなので、
hogeと明示的にfriend関係にするか、piyoをpublic継承しないと
このままではpiyoのインスタンスを生成できない。
コンストラクタで例外が投げられないよう気を付けておく。


384 名前:デフォルトの名無しさん :2006/03/27(月) 18:07:56
newした配列をdeleatするときに、deleat [] arrey;といった様に、これからdeleatするオブジェクトを明示的に指定しなければならない理由とは何でしょうか。
もしくは、どんなオブジェクトでも無差別に開放するスマートな方法はありますか?

385 名前:デフォルトの名無しさん :2006/03/27(月) 18:20:27
C++でオブジェクトの配列は忌み子だから、おとなしく
std::vectorでもつかっときなさい

386 名前:デフォルトの名無しさん :2006/03/27(月) 18:23:17
え?じゃあ文字列はどうすればいいんですか?
これも有効な方法があるんですか?

387 名前:デフォルトの名無しさん :2006/03/27(月) 18:33:04
文字列にはstd::stringがあるだろう。

388 名前:デフォルトの名無しさん :2006/03/27(月) 18:33:10
>>384
通常は auto を使えば構築と破壊の対をコンパイラに作ってもらえる
それをわざわざ違う方法で扱うからには構築と破壊の対を特殊な形にする動機が必ずあるはず

よって、この質問はシュールと言わざるを得ない
>もしくは、どんなオブジェクトでも無差別に開放するスマートな方法はありますか?

389 名前:デフォルトの名無しさん :2006/03/27(月) 18:41:17
>>388
無差別にオブジェクトを削除したければ、ステートメントブロックを作ってその中に記述すれば良いんですか?

390 名前:デフォルトの名無しさん :2006/03/27(月) 18:46:54
>>389
詩的な表現をされている部分の真意を測りかねるが
ブロックからの逸脱を削除と解釈してはならないオブジェクトを指定する方法が new や static だ

391 名前:デフォルトの名無しさん :2006/03/27(月) 19:08:05
autoだと(ブロックの中で)無差別に殺す事が出来る
でもスマートじゃない。

392 名前:デフォルトの名無しさん :2006/03/27(月) 19:22:02
>でもスマートじゃない。

え???

393 名前:デフォルトの名無しさん :2006/03/27(月) 19:37:21
しゃべり過ぎは禁物
このへんでやめとこう

394 名前:デフォルトの名無しさん :2006/03/27(月) 20:41:52
まとめると、オブジェクトはステートメントブロック内でしか生きられないから、deleatとかを使って
コツコツオブジェクトを殺すんじゃなくて、ステートメントブロックを活用して一気にオブジェクトを殺せば良いと。
でもそれだと複雑なコードが組めないし、トリッキーになるから素直にdeleatするか、この話はこのへんで止めておこうと。

395 名前:デフォルトの名無しさん :2006/03/27(月) 21:04:42
deleteも綴れない無能は何言っても無駄

396 名前:デフォルトの名無しさん :2006/03/27(月) 21:07:54
deleatと打ちたくなる気もわからなくはない

397 名前:デフォルトの名無しさん :2006/03/27(月) 21:20:01
そこは敢えてスルーしてたのに…


398 名前:デフォルトの名無しさん :2006/03/27(月) 21:30:45
くだらんつっこみで、流れを壊してる奴、空気読め。


399 名前:デフォルトの名無しさん :2006/03/27(月) 21:34:09
このへんでやめておこう

という気持ちもわかるが、最後の締めがdeleatじゃねぇ・・・

400 名前:デフォルトの名無しさん :2006/03/27(月) 22:59:54
女にもてない奴は、空気が読めない。

401 名前:デフォルトの名無しさん :2006/03/27(月) 23:12:28
逆も成り立つ。
空気が読めない奴は、女にもてない。

402 名前:デフォルトの名無しさん :2006/03/27(月) 23:15:10
う ほ や ら な い か と言われた俺は?

403 名前:デフォルトの名無しさん :2006/03/27(月) 23:17:09
>>400は多くの場合誤り
>>401はまぁまぁ正しい

404 名前:デフォルトの名無しさん :2006/03/28(火) 00:01:41
>>402
同類なので憐れんであげる。             orz


405 名前:デフォルトの名無しさん :2006/03/28(火) 01:16:25
同類憐れみの令

406 名前:デフォルトの名無しさん :2006/03/28(火) 02:20:47
.exe

407 名前:デフォルトの名無しさん :2006/03/28(火) 05:20:35
>>384
配列arrayの先頭アドレスは、しばしばポインタで表される。

あるポインタ変数が与えられたとき、それはオブジェクトへのポインタを指すのか?
T* X = new T;
それとも、配列の先頭アドレスなのか?
int array[N];
int* Y = &array[0];
両者を区別することは難しい。
そこで、オブジェクト用のdeleteと、配列用のdeleteを用意して、
判断をプログラマにまかせているのだと思われ。
delete X;
delete[] Y;


408 名前:デフォルトの名無しさん :2006/03/28(火) 05:22:42
delete p == delete[1] p は結果的にボツったけど案は出てたね

409 名前:デフォルトの名無しさん :2006/03/28(火) 15:47:17
C++で
エラー処理を一箇所でまとめたいとき
try ~ catchって使っていいの?
gotoや、do{ break }while(0);とか使うべき?

エラーと例外は別物とか聞いたし

410 名前:デフォルトの名無しさん :2006/03/28(火) 15:59:56
ケースバイケース

411 名前:デフォルトの名無しさん :2006/03/28(火) 16:02:28
>>409
まさにそのために例外がある。

ただし、例外を使うのは例外的な状況に限ったほうがいい。

412 名前:デフォルトの名無しさん :2006/03/28(火) 16:04:02
>>409
このスレに張られているURLは参考になるものが多いと思う。
http://pc8.2ch.net/test/read.cgi/tech/1142667446/l50


413 名前:デフォルトの名無しさん :2006/03/28(火) 17:48:10
>>412
ほんとだ、参考になる。じっくり読んでみるよ。

414 名前:デフォルトの名無しさん :2006/03/28(火) 18:40:50
あれ?
また例外処理のスレが立ったのか。

415 名前:Defaultの名無しさん :2006/03/28(火) 21:45:51

ちょっと変わったfunctorが作りたいです。

普通はresult operator(arg1,arg2, ...)といった感じで実行ですが、
すべての関数は,void Execute()で実行します。

このとき引数の値を事前にfunctorに保持させるようにします。
戻り値もExecute()実行後にfunctorに保持し、適宜,rerult GetResult()みたいな感じで取り出すとします。

ここで問題となるのが、引数argN型や戻り値result型の保持の問題です。
argやresultが参照の場合はやっかいです。メタプログラムして値型にすれば容易に解決できると思いますが、
Execute()実行まえに参照先が変化している場合(マルチスレッドが理由とかで)もあるので、
やっぱり参照で保持したい・・・ポリモルフィズムしてほしい・・・

なにか良い知恵をご教示願います。


416 名前:デフォルトの名無しさん :2006/03/28(火) 21:50:34
ポインタで持てよ

417 名前:Defaultの名無しさん :2006/03/28(火) 22:10:27
どうもありがとうございます。

でも、
保持している関数ポインタ(func_ptr)の引数がarg&だった場合はarg*で保持するとします。
このとき、Execute()実行時はfunc_ptr(*arg)が起動するわけですが、
argが抽象クラスの場合はコンパイルされません・・・

418 名前:デフォルトの名無しさん :2006/03/28(火) 22:49:57
コンパイルされません、って何だよ。
cc1:error:sorry unmplemented.か?

419 名前:デフォルトの名無しさん :2006/03/28(火) 22:55:06
#include <stdio.h>
struct IHoge{ virtual void hoge()= 0;};
struct CHoge : IHoge{ void hoge(){printf("h\n");} };
int f(IHoge &i){ i.hoge(); return 0;}
struct ce { IHoge *arg; int ret; int (*func)( IHoge & );
void Execute(){ ret = func( *arg ); }
};
int main(){
CHoge ch;
ce e; e.arg =&ch; e.func = f;
e.Execute();
printf("%d\n", e.ret );
}
こういうことだろ。

420 名前:デフォルトの名無しさん :2006/03/28(火) 23:10:16
普通にコマンドパターンだよね

421 名前:デフォルトの名無しさん :2006/03/29(水) 00:58:59
メソッドと関数の違いってなんですか?
ほとんど同じとは聞くけど正確な違いとか定義とかあるんでしょうか?

422 名前:Defaultの名無しさん :2006/03/29(水) 01:00:01
415です。みなさんありがとう!
自宅に帰ってきました。
とりあえず、こんな感じで使えればなあと思ってます・・・
class FunctorBase{
public: virtual void Execute(const long& arg)=0;
...};
template<typename Result,template Argument> class Functor
{
public:
typedef typename FuncPtrCreate<Result,Argument>::FuncPtr FuncPtr;//関数ポインタの型
typedef typename FuncPtrCreate<Result,Argument>::ResultType ResultType;
typedef typename FuncPtrCreate<Result,Argument>::Argtype Argtype;
private:
typedef typename FuncPtrCreate<Result,Argument>::ResultHolder ResultHolder;
typedef typename FuncPtrCreate<Result,Argument>::ArgHolder ArgHolder;
public:
explicit Functor(FuncPtr func) : FuncPtr_(func) { }
virtual void Execute() { ResultHolder_.Set( FuncPtr(ArgHolder_.Get()) ); }
void SetArg(Argtype arg) { ArgHolder_.Set(arg); }
ResultType GetResult() { return ResultHolder_.Get() }
private:
FuncPtr FuncPtr_;
ResultHolder ResultHolder_;
ArgHolder ArgHolder_;
...
};
つづく


423 名前:Defaultの名無しさん :2006/03/29(水) 01:01:29
つづき
使い方は・・・

Strung Func(long& arg);

int main()
{
Functor<String,long& arg> functor(&Func);
functor.SetArg(10);
functor.Execute();
Functor<String,int&>::ResultType rerult=temp1.GetResult();
} とりあえず寝ます。

424 名前:デフォルトの名無しさん :2006/03/29(水) 01:03:57
>>421
http://e-words.jp/w/E383A1E382BDE38383E38389.html
http://e-words.jp/w/E996A2E695B0.html

425 名前:Defaultの名無しさん :2006/03/29(水) 01:04:05
あっまちがい
最下段temp1.GetResult(); はfunctor.GetResult();
めんご

426 名前:デフォルトの名無しさん :2006/03/29(水) 01:11:47
>>422-423
せめてコンパイルできるかどうかぐらいチェックしてから貼れよ。
使われてない FunctorBase とか宣言されてない FuncPtrCreate とかボロボロだぞ。

427 名前:デフォルトの名無しさん :2006/03/29(水) 05:44:28
__DATE__ および __TIME__ の文字列のフォーマットって、
処理系依存ですか?それとも規格で厳密に決まっていますか?

428 名前:デフォルトの名無しさん :2006/03/29(水) 07:37:51
16.8 Predefined macro names
The following macro names shall be defined by the implementation:
...
_ _DATE_ _ The date of translation of the source file (a character string literal of the form
"Mmm dd yyyy", where the names of the months are the same as those generated by the asctime
function, and the first character of dd is a space character if the value is less than 10). If the date of
translation is not available, an implementationdefined valid date is supplied.
_ _TIME_ _ The time of translation of the source file (a character string literal of the form "hh:mm:ss"
as in the time generated by the asctime function). If the time of translation is not available, an
implementationdefined valid time is supplied.

429 名前:デフォルトの名無しさん :2006/03/29(水) 07:43:50
6.10.8 あらかじめ定義されたマクロ名 次に掲げる七つのマクロ名は,
処理系によって定義されていなければならない。
_DATE__
前処理翻訳単位の翻訳の日付("Mmm dd yyyy"の形式をもつ単純文
字列リテラルで, 月の名前はasctime関数で生成されるものと同じ
とする。dの値が10より小さいときは, その最初の文字は空白とす
る。)。翻訳の日付が得られない場合, 処理系定義の正しい日付を提供
しなければならない。
(略)

430 名前:デフォルトの名無しさん :2006/03/29(水) 08:46:10
>>421
メソッドはJava/C#などの言葉。
C++ではメンバ関数。

431 名前:デフォルトの名無しさん :2006/03/29(水) 12:22:15
_DATE__
とか使ってログを取ろうと思ってログ関数作ったけど
その関数の中で呼んでも意味無いんだね。当たり前だけど。
使えないと思った。
bindとか使ったら使いやすくなるだろか。

432 名前:デフォルトの名無しさん :2006/03/29(水) 12:30:33
>>431 bind ってなんですか?

433 名前:デフォルトの名無しさん :2006/03/29(水) 12:41:45
VC++6では、もしかしてstdのalgorithmって使えないんですかね?

434 名前:デフォルトの名無しさん :2006/03/29(水) 12:44:40
>>433
使えるよ。 STLport 使うとだいぶマシになるよ。

435 名前:デフォルトの名無しさん :2006/03/29(水) 12:50:39
.netでは普通に動くんですが、
vc6だとmaxは定義されていないとでるんですが
#include<algorithm>
#include<iostream>

using namespace std;

void main(){
int a,b,c;
a = 0;
b = 1;
c = max(a,b);
cout << c << endl;
cout << a << b << endl;
}

436 名前:デフォルトの名無しさん :2006/03/29(水) 13:26:04
>>435
エラーメッセージはコピペが基本。

437 名前:デフォルトの名無しさん :2006/03/29(水) 13:53:47
.netでは普通に動くんですが、
vc6だとmaxは定義されていないとでるんですが

#include<algorithm>
#include<iostream>

using namespace std;

void main(){
int a,b,c;
a = 0;
b = 1;
c = max(a,b);
cout << c << endl;
cout << a << b << endl;
}

error C2065: 'max' : 定義されていない識別子です。

438 名前:デフォルトの名無しさん :2006/03/29(水) 14:04:43
過去ログ読んだか?
同じ質問があった気がする

439 名前:デフォルトの名無しさん :2006/03/29(水) 14:18:28
過去ログ多すぎて読めませんwww

440 名前:デフォルトの名無しさん :2006/03/29(水) 14:48:53
b馬鹿だな、ここで質問してググりながらここを見て放置しとくんだよ

441 名前:デフォルトの名無しさん :2006/03/29(水) 15:10:22
そうしてますね。
ていうか、
「過去ログ呼んだか?」の一行をぜひ、
「できないよ」「できるよ」の答えの一行にしてほしい質問者です

442 名前:デフォルトの名無しさん :2006/03/29(水) 15:34:43
>>437は質問の体をなしていないから答えようがないんだが。
std::maxが使えるか、という質問ならたぶん「使えない」でいい。
algorithmの各関数が使えるか、という質問なら、「使えるものもある」で。

443 名前:デフォルトの名無しさん :2006/03/29(水) 16:00:17
「使えるものもある」ですか。
ありがとうございます。

444 名前:デフォルトの名無しさん :2006/03/29(水) 17:17:03
w

445 名前:デフォルトの名無しさん :2006/03/29(水) 17:53:29
過去ログ読んだか?1〜47まであるぞ、気合い入れて読め。

446 名前:デフォルトの名無しさん :2006/03/29(水) 18:05:41
過去ログにgrepかければ一瞬です。

447 名前:デフォルトの名無しさん :2006/03/29(水) 18:40:27
犬糞環境なんて整えられません><

448 名前:デフォルトの名無しさん :2006/03/29(水) 18:50:53
>>430
>C++ではメンバ関数。

非公開メンバ関数をメソッドとは呼ばないと思う。

449 名前:デフォルトの名無しさん :2006/03/30(木) 00:17:53
過去ログが落ちてしまって残ってない場合はどうやれば…


450 名前:デフォルトの名無しさん :2006/03/30(木) 01:01:49
>>449
●を買う。鯖代への貢献にもなって一石二鳥。
それでも拾いきれないものについては、保存している人を探して、拝み倒して
どこかにうpしてもらう。その後、君がまとめサイトを作れば完璧だ。

451 名前:デフォルトの名無しさん :2006/03/30(木) 01:31:10
にく

452 名前:デフォルトの名無しさん :2006/03/30(木) 01:37:34
>>437
エラーメッセージで Google も基本。
http://www.google.co.jp/search?q=C2065+max+%E5%AE%9A%E7%BE%A9%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E8%AD%98%E5%88%A5%E5%AD%90

453 名前:デフォルトの名無しさん :2006/03/30(木) 09:37:06
C++初心者の者ですが、
http://www.asahi-net.or.jp/~yf8k-kbys/newcpp17.html
を見ながら勉強していたら、最後のwhile文からを
while(1){
int ans;

cout << "1 鳴かす 2 年収を表示 3 昇給 4 やめる"<<endl;
cin >> ans;
if(ans == 1)
dora.naku();
else if(ans == 2)
cout<<dora.get_nensyu();
else break;
}

}

こう書くと年収の表示がおかしくなります。
自分で色々書き方を変えても原因がどうにも分かりません。
どなたか何処がダメなのか教えてください。

454 名前:デフォルトの名無しさん :2006/03/30(木) 09:47:59
>>453
endl が抜けてるせいで改行が入らない上にでバッファリングされてるんじゃね?

そうじゃないなら、「おかしくなる」って言われてもわかんねーよ。
ちゃんと症状書け。

455 名前:デフォルトの名無しさん :2006/03/30(木) 10:05:22
C++はじめたばっかりの初心者なんですが

//hello3.cpp
#include <iostream>
#include <string>
using namespace std;

int main()
{
string name;
int tosi;

cout << "こんにちは。私はコンピュータです。" << endl;
cout << "あなたの名前を入力してください。" << endl;
cin >> name;

cout << name "さん。よろしく。" << endl;

cout << "ところで、" << name << "さん。失礼ですがお年はいくつですか?" <<endl;
cout << "(入力は必ず、半角の数字でお願いします。)" << endl;
cin >> tosi;

cout << "なるほど。" << tosi << "歳ですか。" << endl;
cout << "私はもうすぐ2歳のマシンです。"<<endl;
}

この例文を実行すると
エラー E2379 hello3.cpp 15: ステートメントにセミコロン(;)がない(関数 main() )
とか出ます・・・
セミコロンちゃんとつけてるんですが・・・・どこが悪いのかわかりません、教えてください。

456 名前:デフォルトの名無しさん :2006/03/30(木) 10:14:29
>>455
× cout << name "さん。よろしく。" << endl;
○ cout << name << "さん。よろしく。" << endl;

つか、エラーが出たら、その箇所を見て間違いを探す練習をした方がいいと思うぞ。

457 名前:デフォルトの名無しさん :2006/03/30(木) 10:17:02
コンパイラのエラーメッセージはエラーを起こした行番号の参考程度にし、
エラーメッセージの内容は無視して、まず該当行から自力で間違いを探す方がいいな

458 名前:デフォルトの名無しさん :2006/03/30(木) 10:31:17
うっひょう!できました!
>>456-457
ありがとうございました!いままで○○Pとかにいたんでここの優しさがしみる・・・・

459 名前:デフォルトの名無しさん :2006/03/30(木) 10:31:38
>>457
いや、内容を無視するのはまずい。先に内容を考えた後で、
原因と直結しないメッセージである可能性も考慮するのが正解だろう。
慣れてくればそういうメッセージは見分けられるようになる。

460 名前:453 :2006/03/30(木) 10:43:00
>>454
おかしくなるというのは、関数から返ってくる年収の値が100のはずなのに
実行すると1401とか表示されるということです。

>endl が抜けてるせいで改行が入らない上にでバッファリングされてるんじゃね?
これってどういうことでしょうか?
確かにdora.get_nensyu()<<endl;と直すとちゃんとした値が表示されるのですが
改行がないと何がまずいのでしょうか。

461 名前:デフォルトの名無しさん :2006/03/30(木) 10:58:20
>>460
endl ぐらい Google でも使って自分で調べろ。
あと標準出力のバッファリングもな。

で、 endl 入れると「ちゃんとした値」ってことで 100 と表示されるのか?
「1401とか」って何だよ?実行するごとに変わるのか?
改行が無いのがまずいと思わないならそれはお前の勝手だ。気にするな。

書き込む前によく読みなおして、自分以外の人が読んでも
理解できるかどうか確認してください。

462 名前:デフォルトの名無しさん :2006/03/30(木) 10:59:27
>>460
改行を入れるまで、文字列を出力しないでバッファにためこむ環境があるってことさ。
つまり、std::endl(もしくは'\n')を入れないと文字列が出力されないことがあるので、必ず入れましょう、ということ。

463 名前:デフォルトの名無しさん :2006/03/30(木) 11:03:53
>>462
'\n' をいれてもバッファのフラッシュはかからない。
「必ず入れましょう」ということで汎用のコードに endl ばら撒かれてもフラッシュしまくりで困る。

きちんと使い分けましょう。

464 名前:デフォルトの名無しさん :2006/03/30(木) 11:08:27
フラッシュしたかったらstd::flushマニピュレータ突っ込めばOK

465 名前:453 :2006/03/30(木) 11:20:21
>>461-462
ありがとうございます。おかげでやっと意味が分かりました。
この手のエラーは初めてで何が原因だったか全く分からなかったため
言葉足らずな質問になってしまいすいませんでした。

466 名前:デフォルトの名無しさん :2006/03/30(木) 11:49:10
>>455
× cout << name "さん。よろしく。" << endl;
○ cout << name << "さん。よろしく。" << endl;


467 名前:デフォルトの名無しさん :2006/03/30(木) 11:52:45
>>466
>>456

468 名前:デフォルトの名無しさん :2006/03/30(木) 11:54:54
>>448
非公開だろうと何だろうと、メンバ関数をメソッドと呼ぶのは誤り。

469 名前:デフォルトの名無しさん :2006/03/30(木) 12:00:09
メンバ関数という用語も標準規格で定義されているのですか?

470 名前:466 :2006/03/30(木) 12:06:11
>>467
orz

471 名前:デフォルトの名無しさん :2006/03/30(木) 12:07:47
>>466-467
すいません、ありがとうございます。

472 名前:デフォルトの名無しさん :2006/03/30(木) 12:25:58
だれかが言う前に俺が言ってやる





473 名前:デフォルトの名無しさん :2006/03/30(木) 13:21:40
>>472
あ、言おうと思ったら既に言われてたw


474 名前:デフォルトの名無しさん :2006/03/30(木) 15:19:58
>>469
つ[JIS X3014]
つ[google]
つ[自助努力]

475 名前:デフォルトの名無しさん :2006/03/30(木) 15:35:26
>>469
Functions declared in the definition of a class, excluding those declared with a friend specifier,
are called member functions of that class.


476 名前:デフォルトの名無しさん :2006/03/30(木) 19:27:08
感情クラスから怒りクラスを派生させて、怒りクラスから憎しみクラスを派生させて…
ってやっていったら人工知能つくれませんか?

477 名前:デフォルトの名無しさん :2006/03/30(木) 20:09:00
>>476
こっちいけ
ttp://anime.2ch.net/test/read.cgi/ranime/1141404494/


478 名前:476 :2006/03/30(木) 23:00:16
僕は馬鹿にされて軽くあしらわれたのですか?

479 名前:デフォルトの名無しさん :2006/03/30(木) 23:37:56
MFCてなによ?
C++の書き方覚えても
あまり意味ないわけ?

裏切られた気分・・・・

480 名前:デフォルトの名無しさん :2006/03/30(木) 23:53:25
>>479
MFCはWindows アプリケーションを作るためのフレームワーク。
Winアプリを作るのが少しは楽になるかもしれない。ただ最近は下火。

C++の高度なことはあまり要求されないので、
MFCを使いたいがためにC++を学んだのであれば、
たしかに裏切られた気分になるかもしれない。

481 名前:デフォルトの名無しさん :2006/03/31(金) 09:56:08
お前ら、Windows で開発するとき、
各種ライブラリってどこに置いてますか?
C:\ に置いてます?たとえば C:\boost\lib\ みたいに。
その辺、Windows ってコンセンサスって無いですよね?

ルートに全部置くのもなんか汚い(?)気がするし、
かといって C:\Document and Settings\以下略
みたいな長ったらしい、かつ、空白を含むパスに置くのも嫌だしなぁ。
Vista では長ったらしいパスをやめた、って話だけど。

482 名前:デフォルトの名無しさん :2006/03/31(金) 10:02:25
Windows Vistaにはシンボリックリンクがいっぱい
http://eside.homeip.net/columns/winvista_fs.html

483 名前:デフォルトの名無しさん :2006/03/31(金) 11:43:13
>>481

普通は、libpathにパス指定して好きなとこに置くだろ。
パス指定されると、コンパイルが遅いとか言っていた時代と違うんだから。


484 名前:デフォルトの名無しさん :2006/03/31(金) 12:39:44
長ったらしくて空白を含むパスにLib置いて挙動がおかしくなるコンパイラは
Win32対応って言わないと思うんだけどなぁ。

485 名前:デフォルトの名無しさん :2006/03/31(金) 12:43:32
スレ違いだが、 make のリスト区切りがスペースなのが困る。

486 名前:デフォルトの名無しさん :2006/03/31(金) 12:45:08
>>481
/usr/lib の下にまとめてラクになっちゃえばOK。
Document and Setting も Vista では /user/ だし。

487 名前:デフォルトの名無しさん :2006/03/31(金) 12:45:08
>>483
やっぱそんなものなのか
おいらは普段はLinuxでやってるんだけど
ときどき頼まれてWinで開発するときに
どこに置いたらいいものか悩む


488 名前:487 :2006/03/31(金) 12:50:35
ちなみにUNIXの場合も決め打ちされてる訳ではない


489 名前:デフォルトの名無しさん :2006/03/31(金) 12:57:58
>>485
GNU makeだと\でエスケープできるよ


490 名前:デフォルトの名無しさん :2006/03/31(金) 20:17:34
eclipse/cdt 以外でリファクタイングできるツールないのかな?

javaぽい書き方してjavaのリファクタイングツールを流用するしかない?

491 名前:デフォルトの名無しさん :2006/03/31(金) 21:47:18
>>487
適当にどっかにライブラリ用のフォルダ作ってまとめとくのが普通でしょ

こんなの、落としてきたインストーラ無しのソフトを
どこに解凍して置いておこうかな、っていうレベルの問題だと思う

linuxでもそういうことあるし同じでしょ・・・
全体的なフォルダ構成が違うけど

492 名前:デフォルトの名無しさん :2006/03/31(金) 22:58:05
最近話題のstatic_castってなんだよ
エロイのか?

493 名前:デフォルトの名無しさん :2006/03/31(金) 22:59:02
エロくはないけど、大流行だよ!
ナウなヤングにバカウケ

494 名前:デフォルトの名無しさん :2006/03/31(金) 23:00:48
バカウケの部分をもっと
ナウでヤングに出来ないかな?

495 名前:デフォルトの名無しさん :2006/03/31(金) 23:01:57
>>491
適当に置くこともできるけどUNIXではコンセンサスみなたいなものはあるよ
手元に環境あれば
$ man hier
してみれば解説されている


496 名前:デフォルトの名無しさん :2006/03/31(金) 23:47:13
>>492
ttp://www.s34.co.jp/cpptechdoc/article/newcast/

497 名前:デフォルトの名無しさん :2006/03/32(土) 03:07:42
>>489
関数に渡したときもうまくいく方法があれば教えてほしい。(あっちのスレでね)
http://pc8.2ch.net/test/read.cgi/tech/1029599472/358-360

498 名前:デフォルトの名無しさん :2006/04/02(日) 00:02:47
static_castと普通の(char*)みたいなキャストって何が変わるの?

499 名前:デフォルトの名無しさん :2006/04/02(日) 00:09:54
>>498
static_cast のほうができることが少ない。そのぶん安全。
また、検索しやすいという効果もある。

500 名前:デフォルトの名無しさん :2006/04/02(日) 00:21:14
従来のキャストはできることが多すぎたから,
static_cast と const_cast と reinterpret_cast に分割した,
と思っておけば大体おk.

static_cast: 暗黙にできる型変換を明示的にやるために使う.
const_cast: const/volatile をつけたりはずしたりするために使う.
reinterpret_cast: 実装に依存するような型変更のために使う.


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.