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


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

C++相談室2
501 名前:おでん屋 :01/09/28 06:46
>>500
~AbstructFile() で純粋仮想なはずの Close() を呼んでおりますが
そこは何やら仕掛けで派生の Close() が呼ばれるようになっています。
本質はそこではないので省略いたします...

502 名前:おでん屋 :01/09/28 06:49
蛇足です。(^^;
一見、最も派生した AbstructFile のデストラクタでやればと思うのですが
さらに派生したとき、問題に...ということなので...

503 名前:デフォルトの名無しさん :01/09/28 06:57
>>498
> class A
> class B : public A
> class C : public A, public B

こういう継承は出来ないんでは?

(1) 基底クラスのデストラクタでファイルの後始末処理をする
(2) 基底クラスのデストラクタから派生クラスの関数を呼びたい

ってことだろう。しかし (2) ってことは、実際にファイルの後始末を処理するのは、基本クラスでなくて派生クラスなのか?それなら単に派生クラスのデストラクタで後始末処理をすれば良いと思うが。どうでせう。

504 名前:デフォルトの名無しさん :01/09/28 07:00
>>502
さらに派生したときに新しい処理が加わるなら、派生デストラクタで新しい処理だけやれば良いのでは?

505 名前:デフォルトの名無しさん :01/09/28 07:09
>>500
私ならインターフェースの継承と実装の継承を分離するかなぁ。

struct FileBase
{
  virtual Open() = 0;
  virtual Close() = 0;
  virtual Read() = 0;
  virtual Write() = 0;
  virtual ~FileBase() {}
};

struct FileA : public FileBase
{
  virtual Seek() = 0;
};

struct FileB : public FileBase
{
  virutal Undo() = 0;
};

たとえば、こんな感じでまずインターフェースの階層を作っておく。実装はコンストラクタと
仮想デストラクタ以外は一切無しね。次に、これを継承して実装を作る。

struct FileAImp : public FileA
{
  Open();
  Close();
  ...
  ~FileAImp() { Close(); }
};

struct FileBImp : public FileB
{
  Open();
  Close();
  ..
  ~FileBImp() { Close(); }
};

実装を継承したい場合には、どこかで Close() を書くわけだよね。もし末端のクラスではなく、
途中のクラスで Close() を書いたのなら

- Close() をその先のクラスでオーバーライドしないことに「決め」て、途中のクラスのデストラ
 クタで Close() する
- 途中に挟んだクラスのデストラクタでは Close() せずに必ず末端のクラスでのみ Close() する
 (ついでに途中に挟んだクラスのデストラクタを protected にして、直接はコンストラクトできない
 ように細工)

どちらか好きなほうを選択。どちらにしても、ドキュメントを書いておく。

506 名前:デフォルトの名無しさん :01/09/28 07:14
>500
> 閉じ忘れ防止にデストラクタでファイルを閉じる処理はしておきたいです

これを基本クラスでなく派生クラスのデストラクタでやれば済むんでは?

507 名前:おでん屋 :01/09/28 09:17
皆さんありがとうございます。500です。

>>503,504,506氏
はい。それで解決です。(^^;
でも、これで解決しても、派生をさらに派生すると Close() はまた、
その派生先に入れる必要がありますよね・・・
こうなると延々といれる作業を繰り返すわけで・・・
このあたりスマートに処理したいのですが・・・。

>>505
ありがとうございます。
Javaでいうfinallyを決めてしまうのでしょうか。(間違っていたらすみません)
最終の派生クラスを定義できればいいのですが
できればさらに派生させたい場合もあるかもしれないので...

仮想関数のようなデストラクタもどきがあればいいのですが・・・

508 名前:デフォルトの名無しさん :01/09/28 09:24
各クラスごとでクローズの仕方が違うんですか?
つまり、AbstructFileの閉じ方とAbstructFile2の閉じ方は違うんですか?
もし違うなら継承にする意味がないような?

あとどうでもいいけど、正しいつづりはabstr「a」ctな。

509 名前:デフォルトの名無しさん :01/09/28 10:23
>>507
> できればさらに派生させたい場合もあるかもしれないので...
汎用的なクラスライブラリを作っているのなら別ですが、そうでなければクラス階層は
設計段階ですべて見えてると思います。そうでなければ、まだ設計の煮詰め方が甘い。

それと上のほうでも書きましたが、インターフェースの階層だけ決めておいて、実装継
承はとりあえず忘れる(コードを共有しようとしない)方が良いと思います。実装継承は
強力な手法ですが、強力さゆえに使い方を誤ると簡単に泥沼に入りますから。

510 名前:おでん屋 :01/09/28 14:51
皆さんのご意見と設計を熟読いたしました。
やはり私の設計が全面的に間違っていますね。設計才能の無さを痛感しております。
勉強してもう少しまともな設計ができるようにしたいと思います。
皆さまありがとうございました。

>>508,509氏
>あとどうでもいいけど、正しいつづりはabstr「a」ctな。

>設計段階ですべて見えてると思います。そうでなければ、まだ設計の煮詰め方が甘い。

その通りです。(^^;

>それと上のほうでも書きましたが、インターフェースの階層だけ決めておいて、実装継
>承はとりあえず忘れる(コードを共有しようとしない)方が良いと思います。実装継承は
>強力な手法ですが、強力さゆえに使い方を誤ると簡単に泥沼に入りますから。

はい。はまってしまいました。
仰る事を心がけてがんばってみます。

511 名前:デフォルトの名無しさん :01/09/28 17:09


512 名前:デフォルトの名無しさん :01/09/28 21:15
ヌルポインターって作れないんでしょうか?

513 名前:デフォルトの名無しさん :01/09/28 21:19
すみません、この板来るの初めてで、違うスレに書いてしまいました

C++の問題です、なにぶん初心者でして
参考になる本などあれば教えて頂きたいです・・・。

1.二つの数をインプットしそれをx,yの読み込んで
和差積商を計算するプログラム

2.1つの数をインプットし読み込んで
その数の二乗、三乗を計算するプログラム

514 名前:デフォルトの名無しさん :01/09/28 21:22
>>513
宿題はこっちで聞け。

お兄ちゃんの宿題、私が答えるよ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=982853418

515 名前:デフォルトの名無しさん :01/09/28 21:58
>>512
ヌルポインターを「作る」とは何??

516 名前:デフォルトの名無しさん :01/09/28 22:16
void* p=(void*)NULL;
終了。

517 名前:出馬鹿ー :01/09/28 22:21
classへのポインタってありますか?

518 名前:デフォルトの名無しさん :01/09/28 22:22
class A{};
A* a;
終了。

519 名前:デフォルトの名無しさん :01/09/28 22:23
>>518 それはオブジェクトへのポインタ
クラスへのポインタではありません

520 名前:デフォルトの名無しさん :01/09/28 22:30
>>517
こういう感じのコードを書きたいのかな?

class A;
class_ptr X = A;
X* p = new X();
// 擬似コードなんで、コンパイル通りません。悪しからず。

C++ ではクラス自体を指す変数は定義できません。ただし template クラス/メソッドの
引数としてクラス名を渡すことは可能です。

521 名前:出馬鹿ー :01/09/28 22:49
>>520そういうことっす。ネタでした。

522 名前:出馬鹿ー :01/09/28 22:57
ネタとはいえ先ほどは非常に簡潔でいいレスをいただきありがとうございました。
御礼にもう1題
templateメソッドって可能ですか?(template関数ではない)

523 名前:デフォルトの名無しさん :01/09/28 23:05
>>522
無理。

コンストラクタを書けない。
継承ができない。
明示的な呼び出しができない。

その前にインスタンスを作れない。

524 名前:出馬鹿ー :01/09/28 23:09
>>523 ありがとうございました。疑問は晴れました成仏します。
逝ってきまーす

525 名前:デフォルトの名無しさん :01/09/28 23:24
>>517

これが「クラスを指すポインタ」に一番近いかな
type_info* p = typeof(class A);

526 名前:デフォルトの名無しさん :01/09/28 23:25
>>522
テンプレートメンバ関数って意味なら、可能です。

class A{
  template<typename T> void f(T);
};

527 名前:デフォルトの名無しさん :01/09/28 23:27
>>525
間違えた。鬱だ・・・

const type_info* p = typeid(class A);

528 名前:デフォルトの名無しさん :01/09/28 23:28
>>527

さらに間違い。逝ってきま・・。

const type_info& p = typeid(class A);

529 名前:出馬鹿ー :01/09/28 23:28
>>525 うを〜そんな手が〜あったか〜。早速やってみよ〜。
でっきるかなでっきるかな〜さてさてほほ〜。

530 名前:出馬鹿ー :01/09/28 23:45
>>526 >>528 できました〜。ありがとうございました〜迷わず成仏できます。

531 名前:デフォルトの名無しさん :01/09/29 00:47
>>void* p=(void*)NULL;
この場合NULLは
stdio.hのマクロ定義かなんかじゃないんですか?
void* p=(void*)0;
とか
int* p=(int*)0;
これでいいのでしょうか?

532 名前:デフォルトの名無しさん :01/09/29 00:49
テンプレートってヘッダファイルに書くの?
どこに書いたらいいのかよくわからん。

533 名前:デフォルトの名無しさん :01/09/29 00:51
>>530
C++ の type_info は、そこからメソッド一覧を取得したりインスタンスを作ったり
できないので、あまり実用性は無いですけどね。

534 名前:デフォルトの名無しさん :01/09/29 00:58
>>531
単に
void* p = 0;
とか
int* p = 0;
で善し

535 名前:デフォルトの名無しさん :01/09/29 00:59
>>532
使う場所から見えるところ。一般的にヘッダに書く。

536 名前:デフォルトの名無しさん :01/09/29 01:11
>>533
同意。何のためにあるのかさっぱりですな。
誰か有効な利用法プリーズ

537 名前:デフォルトの名無しさん :01/09/29 01:25
>>536
ダウンキャストする時に使ってたんじゃない?
その昔は。

538 名前:デフォルトの名無しさん :01/09/29 02:16
>>533
C++はObjectを作る方法として、ポインタにnew使う奴と、変数埋めこみで直接作る奴とが有るが、
C++が痛いのは、その両方に対して使える機構しか、提示しない、ということだな。

メタクラスの方向性を否定してるんで、「つみかさねる」ようなプログラミングを
ちまちま手作業で書かないとならないんで、辛い。

539 名前:デフォルトの名無しさん :01/09/29 02:22
>>538
すまん。日本語が難しすぎてよく分からんので、もうすこし C++ プログラマに
わかりそうな言葉でしゃべってもらえると、ありがたい。

540 名前:デフォルトの名無しさん :01/09/29 02:35
>>535
ヘッダにソース書くのやだなー。
って思う人はどうしてるの?

541 名前:デフォルトの名無しさん :01/09/29 02:37
>>540
ヘッダに宣言だけ書いて *.cpp ファイルに実装書くこともできますよ。
でもヘッダに書くのが主流。

542 名前:デフォルトの名無しさん :01/09/29 02:51
>>541
そうなんだ。ありがとうございます。
思い切ってヘッダに書いてみます。

昔はよく、「ヘッダにコードを書くな」って怒られたものです。
(それはインクルードするだけで実体化するからですけど〜。)

543 名前:デフォルトの名無しさん :01/09/29 02:53
>>540
昔、ミカカ子会社提供のミドルウェアの一部であるテンプレート
ライブラリ(ヘッダに実装かいてあった)に間抜けなバグがある
のを発見した事がある。

ソース完全公開状態だからな。恥さらしだと思った。
(問題は、そこがバグっているとそもそもそのライブラリが
役立たずなものになるという致命的なものだったのだが、誰が
どう試験していたんだろうか…)

544 名前:デフォルトの名無しさん :01/09/29 02:56
>>542
ヘッダに書いても、使わない template クラス/関数に対してはコードが生成
されませんから、気にしなくて大丈夫です。

545 名前:デフォルトの名無しさん :01/09/29 03:44
>>536
typeidバトラー

#include <iostream>
#include <typeinfo>
#include <stdlib.h>
struct Player {
 int getPower() { srand((int)&typeid(*this)); return rand(); };
 const char *getName() { return typeid(*this).name(); };
 virtual char* say() = 0;
 static Player& battle(Player& a, Player& b) {
  int ap = a.getPower();
  int bp = b.getPower();
  cout << a.getName() << " power : " << ap << endl;
  cout << b.getName() << " power : " << bp << endl;
  Player& winner = (ap > bp) ? a : b;
  cout << "..." << winner.getName() << " win." << endl;
  cout << "『" << winner.say() << " 』" << endl;
  return a;
 };
};
struct Monar : Player {
 char* say() { return "モナー"; };
};
struct Giko : Player {
 char* say() { return "ゴルァ"; };
};
int main() {
 Monar m;
 Giko g;
 Player::battle(m, g);
}

546 名前:545 :01/09/29 03:46
>>545
どうさ保証なし。実行例。

>gcc -v
Reading specs from /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/specs
gcc version 2.95.3-5 (cygwin special)
>a.exe
5Monar power : 621329674
4Giko power : 707264478
...4Giko win.
『ゴルァ 』

547 名前:デフォルトの名無しさん :01/09/29 08:07
>>545
やべーワラタ。

548 名前:デフォルトの名無しさん :01/09/29 10:55
すいません、C++の、ポインタとかクラスとかSTL」とかはぜんぶやったんですが、enumだけ覚えずにここまできてしまいました。
enumってなんでしょう。

549 名前:デフォルトの名無しさん :01/09/29 11:19
>>548
const や #define に代わる、定数宣言の最適な手段です(整数に限る)

例:
enum N_{
 N = 32
};

550 名前:デフォルトの名無しさん :01/09/29 11:37
enum(enumerate: イニューメレイト)ってのは、文字どおり「列挙型」です。
大抵の言語に備わっています。

たとえば
#define ONE 1
#define TWO 2
#define THREE 3
#define NINE 9
#define TEN 10

enum 《ここで列挙型の名前を定義できる》{
ONE,
TWO,
THREE,
NINE = 9,
TEN
};
と書けます。

違いは、ONE/TWO/…などが #define だとプリプロセッサで展開される(コンパイラには見えない)のに対して、
enum だとそれらを識別子としてコンパイラが認識する…ってことかな。

これはコンパイラが型チェックできることを意味しています。
型チェックの結果は C と C++ で違います。
たとえば、どちらの場合も変数の型は int 類になるけど、
#define だとそこに定義されていない値を入れても、
コンパイラは「あれっ?」とも思いません。

でも enum だとコンパイラがそれを型として認識できるので、
これが C++ だと、明示的に型キャストしない限り、
コンパイラが「あれっ?」と思ってくれます。

551 名前:デフォルトの名無しさん :01/09/29 11:43
>>550
enum は 0 からじゃ…。

552 名前:デフォルトの名無しさん :01/09/29 12:56
enum型変数ってどうやって書くの?

553 名前:うろ覚え :01/09/29 12:59
基本
enum {...} x;

一般的
typedef enum {...} type;
type x;

554 名前:  :01/09/29 13:24
>>551
値入れても良いんだよ。

555 名前:デフォルトの名無しさん :01/09/29 13:29
>>554
いや、>>551は、それじゃあONEが0になってるってつっこんでるんだよ。

556 名前:550 :01/09/29 13:49
>>551
あっ、…。(鬱氏)
>>552
C なら
enum type {...};
enum type x;

C++ ならそれ以外に
enum type {...};
type x;
とも書ける。

(今度こそ!)

557 名前:553 :01/09/29 14:11
>>556
そういや、構造体と同じで普通に名前付けられるのだったね…。

558 名前:デフォルトの名無しさん :01/09/29 15:58
boolが仕様に入るまではこうしてた
typedef enum{
false=0;
true=1;
} bool;

559 名前:デフォルトの名無しさん :01/09/29 15:59
セミコロンじゃなくてカンマだっけ

560 名前:デフォルトの名無しさん :01/09/29 16:27
汎用性のある参照カウンタ付きのクラスを継承して使いたいのですが、
自作したほうがいいですか?
それとも既にライブラリが存在し、それ使った方がいいですか?

561 名前:デフォルトの名無しさん :01/09/29 18:28
C++で動的配列を作りたいのですが、new [ ] で作成した配列
のサイズをあとで変更するにはどうすればいいですか?

int *a = new int[100]; /* とりあえず100確保 */

...途中でサイズを50にしたい

delete a[ ];


562 名前:デフォルトの名無しさん :01/09/29 18:31
STLのVector使え。

563 名前:デフォルトの名無しさん :01/09/29 18:33
        
>>561
realloc

564 名前:デフォルトの名無しさん :01/09/29 18:40
>>563
newしたやつにreallocするのは止めろ。
ビットコピーされたらどうするつもりだ?

565 名前:デフォルトの名無しさん :01/09/29 18:44
>>563 バカ?
素直にmalloc使えよ

566 名前:デフォルトの名無しさん :01/09/29 18:46
s/>>563/>>564/

567 名前:デフォルトの名無しさん :01/09/29 20:16
>>561
#include <vector>

void foo(void)
{
 vector<int> a(100);
 a.resize(50);
 //delete不要
}

568 名前:561 :01/09/29 20:49
eMbedded Visual C++ なので、STL 使えないのです…
realloc 使うことにします。

569 名前:デフォルトの名無しさん :01/09/29 20:49
>>561
小さくするだけなら、そのままにしとけ。

570 名前:sage :01/09/29 22:15
VCスレに行った方がいいかもね。
STLportとか、つかえねーのかな。

571 名前:デフォルトの名無しさん :01/09/29 22:57
おはようございますよろしくお願いします。

えーっと、APIでまずは自分用のテキストエディタを
作成しようと思っているところです。

今はメモ帳がエディタ代わりです。
検索をいちいちダイアログで出すのは面倒なので、
まずデフォルトで検索窓の付いたものを作ります。

当初CreateWindowまたはExで(検索入力用の)エディットボックスを作り、
貼り付けて・・・と構想していました。すると、多分カーソルの
位置とか反転、カーソルの移動・・とかいちいち構造体を調べて・・
と、なにかと面倒そうだ、と思っていましたところ、FindTextと
ReplaceTextっていうのを発見しました。多分構造体が設定されていて
その面倒くささをやってくれるんですよね?っていうか、題意がそれてるんです
けど、
FindTextたちを使わず敢えて自前で組むのと、利用するのでは、
計算効率は違うのでしょうか、僅かでも。

貧乏性な上に、メモリ不足でカリカリいうといつもびくびくしてしまう
性分なので、メモリを食わない路線で処理の最適化を徹底したいと思っとります。
おしえてクダサイ。

572 名前:デフォルトの名無しさん :01/09/29 23:01
ねえ、new使うときって
int *a=new int;
より
auto_ptr<int> a;
a=new int;
のほうがいいの?

573 名前:デフォルトの名無しさん :01/09/29 23:06
>>571
2行目まで読んだ。
フリーのテキストエディタを探してきて使え。
そしてプログラム書くの止めるか、本買って勉強しなおせ。

574 名前:デフォルトの名無しさん :01/09/29 23:09
>>572
別にいいってことはない。
auto_ptrを使った変数などを関数に渡すときに
どういう動作するか考えるとうかつに使うのは
止めた方がいい。

auto_ptrの使い方としては、例外処理が起こって
途中でリターンしなくてはいけなかったりするときに、
開放の処理をやるのが困難な場合など。
あと、一般的にはコレクション系かしら。

575 名前:デフォルトの名無しさん :01/09/29 23:10
ダメ雄に言われたくない>>573

576 名前:デフォルトの名無しさん :01/09/29 23:10
自分で書くんだったら、良く書けば効率は良くなるし、
クソに書けばクソになる。
既存APIは中がどうなってるのか知らんから一概に比較はできんが、
いいアルゴリズムで書けるなら書いてもいいんじゃないの?

577 名前:デフォルトの名無しさん :01/09/29 23:11
>>576>>571へのレスね。

578 名前:デフォルトの名無しさん :01/09/29 23:11
>>571
ここはC++のスレだぞ。APIについては他所でやれよ。
ついでにいっとけばエディタを作るのにWindowsのEditBox使うのは止めろ。

579 名前:デフォルトの名無しさん :01/09/29 23:13
>>574
コンポジションを使う場合にも、メンバ変数も auto_ptr で持つかな。
直接

struct Foo
{
  X x;
};

と書いてしまうと、このヘッダをコンパイルするためだけにクラス X のヘッダを
include する必要が出てきてしまうので。

580 名前:デフォルトの名無しさん :01/09/29 23:14
コモンダイアログを使うと、
どのみちHWND型だから使うメモリはCreateWindowと
変わらないだろうけど、代入演算が余計に起こって
処理が最適ではなくなってしまうことを心配している者です。

581 名前:デフォルトの名無しさん :01/09/29 23:14
>578
なじぇ?

582 名前:デフォルトの名無しさん :01/09/29 23:15
>>579
includeしたくないだけにauto_ptr使うか?
そんなこと言ったら
struct Hoge {
auto_ptr<string*> m_str;
}
か?

583 名前:デフォルトの名無しさん :01/09/29 23:22
>>581
EditBoxを使った時点でメモ帳以上の物ができないことが保証されるから。

584 名前:デフォルトの名無しさん :01/09/29 23:23
>>579
Fooの定義の前に
class X;
と書いとくだけで大丈夫だと思うが?

585 名前:デフォルトの名無しさん :01/09/29 23:35
>>584
いや、それじゃだめでしょ。

586 名前:デフォルトの名無しさん :01/09/29 23:37
全然知りません

587 名前:デフォルトの名無しさん :01/09/29 23:45
>583
では何を使えば?

588 名前:デフォルトの名無しさん :01/09/29 23:51
Win98のメモ帳はなぜ大きいファイルを開けないのですか?
エディタソフトハウスから賄賂もらってるから?

589 名前:デフォルトの名無しさん :01/09/29 23:54
>588
char[固定]だからです

590 名前:デフォルトの名無しさん :01/09/29 23:56
>>588
MSDN読め。

591 名前:デフォルトの名無しさん :01/09/29 23:58
>>588
仕様です

592 名前:デフォルトの名無しさん :01/09/29 23:59
>>589
それが真実ならマイクロソフトさんって思ったより知能低いですね
速答ありがとうございます

593 名前:デフォルトの名無しさん :01/09/29 23:59
>>587
自分で作るか他のエディトコンポーネントを探すか

594 名前:デフォルトの名無しさん :01/09/30 00:01
>>582
ヘッダファイルの相互依存関係は、ちょっとソフトウェアの規模が大きくなると
辛いです。一つのヘッダを修正するだけで、ほとんどすべてのソースを再コン
パイルすることになりかねません。

標準ライブラリのヘッダは原則として修正しませんから、さすがにメンバ変数
とはいえ参照やポインタにはしません。

>>584
いや class X の「サイズ」が決まらないと class X をメンバとして持つクラスの
「サイズ」も決まらないので、ダメです。

595 名前:デフォルトの名無しさん :01/09/30 00:01
>593
自分で作るって、どういうことですか?CreateWindowの引数でどうにかできるのですか?

596 名前:デフォルトの名無しさん :01/09/30 00:04
>595
悪い事いわんから開発やめとけ。

597 名前:デフォルトの名無しさん :01/09/30 00:11
>>595
ネタとマジレスの区別も付かない、自分で一切調べないような奴には
一生かかっても無理だ。

598 名前:デフォルトの名無しさん :01/09/30 00:34
>>592
っていうか、「メモ帳」だぞ。
そんなおっきいファイル開く方が間違ってるYO。
エディタじゃねーよ。メモって意味考えろ。

599 名前:  :01/09/30 00:49
CEditView(ファイルサイズ64Kまで)かCRichEditViewつかいませう。
CRichEditViewで挫折したらまた質問下さい。

600 名前:デフォルトの名無しさん :01/09/30 01:05
リッチエディットをエディタに使うバカはいません。

601 名前:デフォルトの名無しさん :01/09/30 02:06
>>600
はあ? じゃあ何使うっつうの?

602 名前:  :01/09/30 02:08
64K以下ならCEditView,64K以上ならCRichEditView。
これ常識。


603 名前:デフォルトの名無しさん :01/09/30 02:19
普通のEDIT→メモ帳
リッチエディット→ワードパッド

になるぞ?

604 名前:デフォルトの名無しさん :01/09/30 02:22
っていうか本気で作るんだったら、
MFCのクラスなんか使わないでしょ。普通。

でも、元ねたが「メモ帳のかわり」とか言ってるから、
りっちえでぃっとでいいんじゃないかい?

605 名前:デフォルトの名無しさん :01/09/30 02:22
良く判らんが、単独で使いたいんじゃなくて、プログラムに
組みこむ形で使いたいんなら>>602で合ってる。

606 名前:デフォルトの名無しさん :01/09/30 02:36
>>605
俺もそう思う。胴衣

607 名前:デフォルトの名無しさん :01/09/30 02:38
>っていうか本気で作るんだったら
>MFCのクラスなんか使わないでしょ。普通。

さすがにそれは普通じゃないと思われ。

608 名前:デフォルトの名無しさん :01/09/30 04:11
>>604
MFC使わないやつは
1 完全にオリジナルのUIを構築するやつ(移植性とかなんとか
2 アンチMFC
3 MFCが分からないやつ

で、比率で言えば、1:10:89こんなものかな

609 名前:デフォルトの名無しさん :01/09/30 04:43
>>608
604は「エディタのビューとして」の話だと思う所存。
エディタのビューとしてCEditやCRitchEditを使う奴はDQNだと思うナリよ

610 名前:デフォルトの名無しさん :01/09/30 04:58
MFC相談室になっているゆえ、Qt使えとか言ってみる。

.>>609 MVCの話なら歓迎〜。

611 名前:デフォルトの名無しさん :01/09/30 05:03
メーラーとかの編集窓でRicheditは多いと思うが

612 名前:デフォルトの名無しさん :01/09/30 08:16
Win2000ならメモ帳のサイズ制限はないよ。

613 名前:デフォルトの名無しさん :01/09/30 08:17
>>611
俺の知る限りはAL-Mailぐらいだな。

614 名前:デフォルトの名無しさん :01/09/30 09:17
>>611
メーラーなんかプレーンテキストで十分だ。
よってCEditで十分だと思うが、どうか?

>>608
禿同。

615 名前:デフォルトの名無しさん :01/09/30 09:30
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342
ruby撲滅スレ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=1001125342

616 名前:デフォルトの名無しさん :01/09/30 10:30
RichEditなんて遅くて重いの使ってられるかよ。
つーかエディタを作るってのはエディトコントロールを自分で作るって事じゃないの?
そこがエディタの命なんだからさ。
秀丸がリッチエディット使ってたら誰も買わないだろ。

617 名前:デフォルトの名無しさん :01/09/30 10:55
すいません、vector< vector<int> > a;で、
stringのc_str()みたいに配列全体を得たいのですが、どのメソッドを使えばよいのでしょう。

618 名前:デフォルトの名無しさん :01/09/30 11:56
vector<>::begin

619 名前:デフォルトの名無しさん :01/09/30 11:57
>618
ありがとうございました。

620 名前:デフォルトの名無しさん :01/09/30 13:08
>>616
エディタだけ組みこんだソフトなんか誰が作るかよ 阿呆。

621 名前:デフォルトの名無しさん :01/09/30 13:16
>>612
こいつも阿呆だな。

622 名前:デフォルトの名無しさん :01/09/30 13:30
>>621 氏ね。
>>612 は正しい。

623 名前:デフォルトの名無しさん :01/09/30 13:32
>>620
いや、エディタの話をしてたんじゃないのか?

624 名前:デフォルトの名無しさん :01/09/30 14:16
>>622 ソフトウエア版行けや。
ライブラリではCEditViewのサイズはshortで定義されてるから駄目。
WIN2000のメモ帖とか言ってるのはPC厨房。

625 名前:デフォルトの名無しさん :01/09/30 14:19
>>624
帖って間違ってるYO

626 名前:デフォルトの名無しさん :01/09/30 23:57
VC++で
int a[100];
b=99;
cout<<a[b++];
ってやると、エラーになります?

627 名前:デフォルトの名無しさん :01/10/01 00:03
>>626
試したら?

628 名前:デフォルトの名無しさん :01/10/01 00:04
いいね

629 名前:デフォルトの名無しさん :01/10/01 00:14
何でエラーになるんだ??

630 名前:626 :01/10/01 00:27
勘違いでした

631 名前:デフォルトの名無しさん :01/10/01 01:06
/*
if(typeid(*temp)==typeid(A)){
((A*)temp)->methodA();
}else if(typeid(*temp)==typeid(B)){
((B*)temp)->methodB();
}
*/
pa = dynamic_cast<A *> (temp);
if(pa){
pa ->methodA();}
else{

pb= dynamic_cast<B *> (temp);
if(pb){
pb->methodB();
}else{
}
}

632 名前:デフォルトの名無しさん :01/10/01 01:07
すいませんが
RTTIがよくわかりません
これで実行しても、実行中にエラーになってしまいます

633 名前:デフォルトの名無しさん :01/10/01 01:29
VC++ってRTTI使えなみたいです
サンプルプログラムも実行時エラーがでます

634 名前:デフォルトの名無しさん :01/10/01 01:33
>>624

MFCはそうだろうが、NT系のエディットコントロールにサイズ制限がないのは常識だろ?

635 名前:デフォルトの名無しさん :01/10/01 02:02
>632
>633
プロジェクト-->設定-->C/C++Tab-->カテゴリ:C++言語-->RTTIを有効にする
をチェック済みかい?

もしかしたらPro 以上じゃないと駄目かも。

636 名前:デフォルトの名無しさん :01/10/01 02:11
>>635
できましたー(涙)
ありがとうございます
とりあえず、私はProを使ってますから
standardの方ではちょっとわかりませんが・・・
はまりますねコレは
ホントに助かりました

637 名前:デフォルトの名無しさん :01/10/01 06:53
>>624
勝手にMFCと決めつけるなよ。

638 名前:デフォルトの名無しさん :01/10/01 06:58
dynamic cast も RTTI 必要ですか? >VC

639 名前:デフォルトの名無しさん :01/10/01 07:07
>>638
いぇす

640 名前:デフォルトの名無しさん :01/10/01 07:22
>>639
ありがとうございます
# gcc はデフォルトでオンだったような

641 名前:デフォルトの名無しさん :01/10/01 13:48
aString == bString (in Java)

は Deep comparison ですか?
それとも Shallow Comparison ですか?

分かる人教えて・・・

642 名前:641 :01/10/01 13:50
あ、C++のスレだった。間違えました、鬱だ。
でも、分かる人いたら教えてください。悩んでるんです。

643 名前:デフォルトの名無しさん :01/10/01 18:26
>>641-642 悩んでる時間があるなら、
ちょろっとコード書いて自分で試せば?

644 名前:641 :01/10/01 20:27
>>643
どうやって試すの?

645 名前:デフォルトの名無しさん :01/10/01 20:34
たった2時間しか考えないで他人に聞くなよ。
頭は帽子を置く台じゃないんだから。

646 名前:デフォルトの名無しさん :01/10/01 20:47
頭はかつらをかぶせる台じゃないんだから。

647 名前:デフォルトの名無しさん :01/10/02 00:48
つーか、ポインタもわからないのに
Deep comparisonみたいな単語だけは知ってる
Javaはホントはすごいんだけど、馬鹿が使うから馬鹿にされるんだって

648 名前:デフォルトの名無しさん :01/10/02 00:49
C言語よりエレガントにバイナリーエディターを作れますか?

649 名前:デフォルトの名無しさん :01/10/02 09:43
>>648
C言語でエレガントに作れるものなんかあるのかよ。
エレガントだと思いこんでいる連中はいるようだが…。

650 名前:641 :01/10/02 10:19
>>647
相談スレだから、書いてみたんだけど・・・やっぱ
ダメだった??

= がShallowって言うのは分かるんだけど、
== がDeepなのかShallowなのか分からない・・

651 名前:641 :01/10/02 10:26
JAVAスレがありました。ごめんなさい。

652 名前:デフォルトの名無しさん :01/10/02 21:21
C++のポインタを使った表記が醜いので
# foo->bar.bazとか
可能な限り参照を使ってみたいのですが
# foo.bar.bazみたいに
何か問題ありますか?

653 名前:デフォルトの名無しさん :01/10/02 21:28
使えば?

654 名前:デフォルトの名無しさん :01/10/02 22:24
>>652
とりあえずリンクトリストでスタック作ってみそ

655 名前:デフォルトの名無しさん :01/10/02 22:24
>>652
問題ないよ。

656 名前:デフォルトの名無しさん :01/10/02 22:25
ただ . 演算子が4つくらい並んでいたら、
こいつ大丈夫か?と疑いはじめるだろう。

657 名前:デフォルトの名無しさん :01/10/02 23:06
>>652
参照にしたところで、醜いもんは醜いんだよ。
設計がおかしいんじゃねぇの?

658 名前:デフォルトの名無しさん :01/10/03 14:43
>>654
stack<CFoo> s;
s.push(CFoo(1));
s.push(CFoo(2));
s.top().bar.baz;

659 名前:デフォルトの名無しさん :01/10/03 14:50
>>657
参照はポインタより制限がきつい。
無制限に使えるポインタでなければ組めないとき、
なぜその制限内に収まらないのか検討する余地がある。
参照すらいらないのにポインタを使う奴もいる。
制限の緩い機能を使うときは、強力であるが故に慎重さが欲しい。

とりあえずポインタより参照を優先するという方法は
それなりに有効だよ。

660 名前:654 :01/10/04 00:16
>>658
STLのstackはデフォルトではリスト使ってないだろうと思い、
ソース読もうとして挫折。
オペレーターオーバーロードされると訳わからん

Javaに還ろ〜っと。

>>659
最初は参照で組む => 後にポインターに変更 => ->を.に置換しまくる。
つーことが良くあります。

661 名前:デフォルトの名無しさん :01/10/04 00:26
>>660
それはスキルが低すぎるからだもー。

662 名前:デフォルトの名無しさん :01/10/04 00:30
->を無条件に"."に置き換えても
構文的に曖昧になるケースなんてないんだから
全部"."にしちゃえば良かったのに。
まあドキュソ言語だからしゃあねえか>C/C++

663 名前:デフォルトの名無しさん :01/10/04 00:43
>>662
何でそうなってるのか考えてみろよ

664 名前:デフォルトの名無しさん :01/10/04 01:09
>>662
いや、"->"と"."は明らかに違うだろ。
ポインタと実体(もしくは参照)が同じように
見えるんだったらかなり重症だぞ。

665 名前:デフォルトの名無しさん :01/10/04 01:46
たしかにそもそも用途が違いますよね。

参照/ポインタの使い途を定位置を参照することに限った場合、
>>662 のような意見をもつ人がいるようにも思われ。

そうじゃないだろ? とまぁ、いいたいのですが。

666 名前:デフォルトの名無しさん :01/10/04 02:31
スタック上にあるオブジェクトをdeleteしても大丈夫な
様にする事ってできますか?
(スタックならデストラクタだけ呼び出して、開放はしない)
ヒープに置いてあるやつと区別しないで扱いたいんで。
CObject a;

667 名前:デフォルトの名無しさん :01/10/04 02:51
スタック上の(未初期化の)メモリに対して placement new を使う。

でも、どっちかというと使い方が間違ってると思う。

668 名前:デフォルトの名無しさん :01/10/04 07:16
>>662
その話題、別のスレッドでも出てたな。

C だと . と -> はまとめられるけど、ハードウェアに近い階層のプログラムを組む
場合には、ポインタとスタック上の変数を文法上も区別しておいた方がいいと思う。
演算子をまとめて、バグを入れやすくなったら本末転倒だし(ただでさえバグを作
やすい言語なんだから)。

あと C++ に関しては operator->() がないとスマートポインタ実装できないから嫌
です。

669 名前:デフォルトの名無しさん :01/10/05 03:17
コンパイラ標準のSTLじゃなくて、SGI STLとかSTLport
とか使ってる人いる?マルチプラットフォームなコードで
統一しようかと思ってるんだけど。

SGI STLってなんかコンテナの種類とか増えてるね。
hash_mapとか。

670 名前:sage :01/10/05 07:25
STLportばりばり使ってるよ

671 名前:デフォルトの名無しさん :01/10/05 11:58
>>668
> ポインタとスタック上の変数を

という用語はどうかと思うが、

> 文法上も区別しておいた方がいいと思う。

は同意。char **argvとchar *argv[]を混乱する厨房を見るにつけ

672 名前:デフォルトの名無しさん :01/10/05 11:59
あ、[]のdouble meaningのことね。

673 名前:デフォルトの名無しさん :01/10/05 12:58
STLPort使ってるよ。
バイナリがでかくなるのを除けばVC付属のよりいいんで。

ただ、コンパイラ付属のと切り替えたいときもあるんだけど、
何を#defineすれば良いのかわかんないけど。
だれかしらない?

674 名前:デフォルトの名無しさん :01/10/05 16:15
>>673

同一プロジェクト内だと無理だろ。

別プロジェクトで、ということなら、単にインクルードディレクトリの優先度を変えればできるっしょ。

675 名前:669 :01/10/05 17:24
STLport使ってる人、実際どう?
コンパイルが面倒とか特殊な書き方しないとだめとか
環境によって駄目とかある?

うちはWin, Mac, Linux全部やってるから出来れば
統一したいんだよね。

676 名前:673 :01/10/05 17:46
>>674
ああ、同一プロジェクトでは統一しますが、
コードがでかいと困るときに標準を使いたいんですよ。
ただ、環境変数で一度に設定してるから優先度いじるの面倒なんで。

>>675
コンパイルが面倒も何も、VC/BCCではmake一発でとおります。
BCCは知らないけど、VCのものよりはパフォーマンスが良いです
VC使う上での注意は、必ずマルチスレッドライブラリをリンクする
必要があるということだけかな。

677 名前:デフォルトの名無しさん :01/10/06 01:34
ねぇねぇ、
基底クラスのデストラクタを書いてなくて、
基底クラスでdeleteすると派生クラスの
デストラクタが呼ばれないって知ってた?

678 名前:669 :01/10/06 01:37
>>676
そっか、特に何にもしなくてもmakeでビルドできるのか。それはナイス。

VCでマルチスレッドライブラリリンクしてシングルCPUなマシンで
動かすと若干遅くない?必ずスレッドセーフなライブラリを使わないと
だめだとするとちょっと問題になりそうな気がするが。

Mac、Linuxで使ってる人が居たら状況キボン。

679 名前:デフォルトの名無しさん :01/10/06 02:41
>>677
当たり前だろ。仮想デストラクタにならないんだから

680 名前:デフォルトの名無しさん :01/10/06 08:24
>>679
当たり前だが、初心者がはまりやすい落とし穴ではあるな。

>>677
C++ はいろいろ過去を引きずっている影響で、いたるところに落とし穴がある仕
様になってる。痛い思いをしたくなければ Effective C++, More Effective C++
という書籍を買ってきて読んでおきましょう。

681 名前:sage :01/10/06 10:15
>>678
実際に自分の書いてるコードで置き換えてみて
評価すればよいよ。

682 名前:デフォルトの名無しさん :01/10/06 13:14
>>678
実際に計って速度に問題があればつかわんでいーだろ。

アプリケーション系で応答速度が要求されるような場合、
マルチスレッド化は当たり前のような気がする。

どうしても多重化出来ない場面でかつ、
スループットしか見ないのであれば、微妙な速度差にも
こだわってもいいけどね。

MTスレじゃないからsage

683 名前:デフォルトの名無しさん :01/10/06 23:38
>>681
>>682
ごもっとも。なのでsage

684 名前:思いつき :01/10/07 01:51
foo->bar->baz = 0

using foo->bar
baz = 0
と書けると嬉しくない?

685 名前:デフォルトの名無しさん :01/10/07 02:04
>>684
全然嬉しくない。
入れ子にできないジャン!

686 名前:デフォルトの名無しさん :01/10/07 02:11
>>685
別に常に使わなくてもいいわけだし。
C++Builderでは便利かもね。

687 名前:デフォルトの名無しさん :01/10/07 08:47
>>684
with( foo->bar ){
baz = 0;
}
の方が他の言語で慣れてるので嬉しいかも。

688 名前:デフォルトの名無しさん :01/10/07 20:22
typeof_foo_bar &bar = foo->bar;
bar->baz=0;

このくらいで我慢し説け

689 名前:デフォルトの名無しさん :01/10/07 21:02
>>684
typeof_baz& baz=foo->bar->baz;
baz=0;
できるよ?なんか文句ある?

690 名前:デフォルトの名無しさん :01/10/07 21:09
それだとbaz以外のメンバがいじれなくていやな感じ

691 名前:689 :01/10/07 21:14
>>690
↓で我慢しとけ。この程度の小石につまづいているようではX
>>688

692 名前:デフォルトの名無しさん :01/10/07 23:38
メンバ関数用意すれば?
せっかくC++なんだしさ。

693 名前:デフォルトの名無しさん :01/10/08 19:16
メンバ変数にアクセスするインターフェイスをつくるとき、
名前ってどう付けてる?

class Mona {
public:
int giko;

だとして、

・void SetGiko(int);とint GetGiko(void);
・int& Giko(void);

なんかが考えられるけど。

694 名前:デフォルトの名無しさん :01/10/08 19:17
void Giko(int value);
int Giko(void);

695 名前:デフォルトの名無しさん :01/10/08 19:19
後者は
const int& Giko() const;
だろ。Monaがconstになった途端アクセスできなくなるぞ。
それにその方法だと、結局もう一個
int& Giko();
を用意することになる。

696 名前:デフォルトの名無しさん :01/10/08 20:03
>>694
>>695
うん、要するに聞きたいのはSet〜とGet〜っていう命名は良くないのかな
って事なのだ。個人的には悪くないと思うんだけど、オブジェクトとして
考えた時はちょっとおかしいかなと感じるんで。周りには良くないって言う
人も居る。

constに関してはその通りだね。スマソ。

697 名前:694 :01/10/08 20:12
C#なんかの最近の言語ではset/getメソッドを
隠蔽するプロパティという表現が文法に組み込まれていて
とても有用なのでおかしくは無いよ。

ただ、C++では確かに一般的ではないので
コーディング規約としてきっちり確立することが
出来ないのであればやめといたほうがいいかもよ。

規約
名詞=プロパティ Count()
動詞=メソッド Clear()

698 名前:デフォルトの名無しさん :01/10/08 20:31
>>697
うん?ちょっと確認なんだけど、漏れが言いたいのは

Get/Setという命名は悪くないがオブジェクトとして見ると
オブジェクトのメソッドとしてGet/Setのような名前がついて
いるのは違和感がある

って事ね。せっかくカプセル化してるのにそのオブジェクトが
どんなメンバ変数を持っているのか外が知らないといけない
のは変だと思うわけ。

で、>>697が「おかしくは無いよ」と言っているのはどっちの表現
方法に対してのこと?それと、最後の規約の部分の文章は

・そのクラスのプロパティに関しては名詞の名前を付ける
 例:Count()
・メソッドに関しては動詞の名前を付ける
 例:Clear()

という読み方であってる?

699 名前:697 :01/10/08 20:56
>せっかくカプセル化してるのにそのオブジェクトが
>どんなメンバ変数を持っているのか外が知らないといけない
>のは変だと思うわけ。
それは命名の良し悪しとは別の問題だよ。
メソッド経由で公開するという意味ではGetGiko()もGiko()も変わらない。

理想は全部privateにして自前で処理することだけど、
そうするとクラスが肥大化したり、メソッドの引数がやたらと
多くなってくる。
# 試しにfriend/get/set一切使わないコードを書いてみるべし
なので変数(=アクセスメソッド)を公開することでコードが
簡潔(というと語弊があるが)になるならそれを避けるべきではないと思う。

おかしくないというのはCount() という表現の事。
他言語からの借用なので積極的に推すつもりは無いけど。

規約の方はその通り。

700 名前:デフォルトの名無しさん :01/10/08 21:01
int **p;

p = new int [x][y];

って間違ってます?

検索しても、出てきませんでした・・・

まじ質問です。

701 名前:700 :01/10/08 21:02
sageてしまった・・・
age

702 名前:デフォルトの名無しさん :01/10/08 21:05
>>700
C++の質問じゃねーだろ。くだらねー質問スレへ逝け。
それにそのコード間違ってる。

703 名前:700 :01/10/08 21:08
>>702
newの使い方なのでC++だと思ったんですが・・・
逝ってきます・・・

704 名前:デフォルトの名無しさん :01/10/08 21:11
>>699
ふむ。結局、Get/Setという文字列がどうこうじゃなくて、
意味的におかしくないならGetやSetが付いた命名もあり
って事なのかな。

全部自前処理が絶対に良いとは言えないのは分かるよ。
設計が悪いと言われそうだけど、friend使わないとどうしても
見通しが悪くなることはあるよね。

規約のほうは参考にしてみる。これはこれで統一されてると
思うから、うまく命名すれば使えると思う。

705 名前:デフォルトの名無しさん :01/10/08 21:13
>>703
newの使い方の問題なのか?それ以前にポインタを復習すれ。

706 名前:デフォルトの名無しさん :01/10/08 21:17
>>705
ってことは、

int **p;

*p = new int* [x];

for( i = 0; i < x; i++ )
    p[i] = new int [y];

ってことですか?

まとめて確保してくれると思ってました・・・

707 名前:700 :01/10/08 21:22
>>706

まちがいっす・・・

>*p = new int* [x];
p = new int* [x];

708 名前:デフォルトの名無しさん :01/10/08 21:22
多次元配列を扱うコンテナをもってきて
array2<int> *p = new array2<int>(x,y);

みたいにしとけば?

stlで近いことが出来た気もする。

709 名前:デフォルトの名無しさん :01/10/08 21:25
>>706

710 名前:STLマンセー :01/10/08 21:27
typedef std::vector< std::vector< int > > Aryary;
Aryary p;
p.resize(x);
for( Aryary::iterator it=p.begin(); it!=p.end(); ++it)
 it->resize(y);

711 名前:700 :01/10/08 21:29
>>708
>>710

おお・・なるほど・・・
参考にさせていただきます

ご教授ありがとうございますm(_ _)m

712 名前:デフォルトの名無しさん :01/10/08 21:31
>>709スマソ。操作ミス。

>>706
それでもいいが、newをループさせるよりはこの方がいいだろ。

int **p;

p = new int* [y];
int *x = p[0] = new int* [y*x];
for(int i=1; i<y; i++)
 p[i] = &x[i*x];

これだと配列のもち方が[y][x]になるところに注意。
っていうかこれこそC++に関係ないからsage

713 名前:デフォルトの名無しさん :01/10/08 21:33
つーか本当に任意にサイズの二次元配列確保しなきゃならないのか?
x,yは両方とも変数で無いと駄目?

714 名前:712 :01/10/08 21:35
STLをつかう方法もいいが、速度が要求されるか、
配列が大きいなら>>712の方法にしとけ。

715 名前:デフォルトの名無しさん :01/10/08 21:40
>>712を自分用コンテナにして使い回すのがよさげ

716 名前:デフォルトの名無しさん :01/10/09 18:23
単なるコレクションを返したいのですが、
どのような形で返すのが良いでしょうか?

717 名前:デフォルトの名無しさん :01/10/09 19:09
互いに関連(相手へのポインタ)をもつオブジェクトで
なおかつそのオブジェクト同士の関連の仕方が全くの任意である場合、
その関連の仕方をデータに保存するにはどのような方法があるのでしょうか?

私が思いついたのは、全てのオブジェクトを適当に順序づけて一元に保存し、
その後、その順番を元に関連の有るオブジェクト同士の番号を別途保存する
方法なのですが、所詮素人考え、どうにも二度手間で、泥臭く感じてしまうんです。

よくありそうな処理の割に良い方法が、思いつきません。
なにかスマートな方法があったら教えて下さいませ。

718 名前:デフォルトの名無しさん :01/10/09 19:34
外部シンボル’〜’が未解決っていうエラーがでたらどう解決したらいいんですか?

719 名前:デフォルトの名無しさん :01/10/09 20:12
>>717
説明読んだだけでは何がしたいのか良くわからんけど、
一度「デザインパターン」で検索して勉強してみることを強くお勧めする。
多分解決する。

720 名前:717 :01/10/09 20:49
>>719
トホホホホ、GoF本持ってる漏れは逝ってよしということですか?
  ___       ___         ___
  | YES | ΛΛ.   | YES | ΛΛ    |GoFi | ΛΛ
 〃 ̄ ̄∩ ゚Д゚) 〃 ̄ ̄∩ ゚Д゚)  〃 ̄ ̄∩ ゚Д゚) GoForIt!
     ヾ.   )     ヾ.   )        ヾ.   )

オブジェクトと書きましたが、実際はクラスと言うより、ほとんど構造体なので、
データの持たせ方がまずいっぽいです。むーん良いの思いつかねぇ。ムキョー

721 名前:デフォルトの名無しさん :01/10/09 21:15
>>720
サンプル書いてみ?

722 名前:sage :01/10/09 22:32
>>716
イテレータ

723 名前:sage :01/10/09 22:48
>>717
かっこわるいけど

class Serializer {
static size_t seed = 0;
size_t serial;
public:
Serializer() { serial=seed++; } // 場合によってはmutexで保護ね
size_t Serial() const { return serial; }
void ResetSerial(size_t n); { seed = n; }
};

をそいつらのメンバに加えときなさい。

724 名前:716 :01/10/10 00:45
>>722
どもです。やはり
const vector<type>&
とか
const type*
を返すのはダサいでしょうか?

725 名前:デフォルトの名無しさん :01/10/10 00:52
>>724
いやべつにいいんでない?

726 名前:デフォルトの名無しさん :01/10/10 00:56
ダサイよ
Delphi使いな

727 名前:デフォルトの名無しさん :01/10/10 01:12
>726
よくわかっているじゃない。

728 名前:デフォルトの名無しさん :01/10/10 01:29
つまり、>>727は、
「ダサいよ、Delphi使い。な?」
と読んだってわけか。

729 名前:デフォルトの名無しさん :01/10/10 01:51
「ダサイよ」Delphiのルビかと思った。

Del厨って全角英数好きなのか?

730 名前:デフォルトの名無しさん :01/10/10 02:29
STLのmapやsetは、マルチスレッド環境下でも排他制御なしに使えますか?
(map/setの内部にロック機構を持っていますかという意味です)
よろしくお願いします。

731 名前:デフォルトの名無しさん :01/10/10 03:09
>>730
STLportはスレッドセーフになってるらしいけど、
VC++とかGCCの純正(?)STLはどうなんだろうね?

732 名前:デフォルトの名無しさん :01/10/10 04:43
>>730
実装によります。

733 名前:デフォルトの名無しさん :01/10/10 14:22
>>714
STL使っても速度は変わらないと思ふ

734 名前:デフォルトの名無しさん :01/10/10 14:33
>>733
ふつうに使う分にはかわらないね。

でも、マイクロセカンド単位で処理速度を追求する人もいるので

735 名前:デフォルトの名無しさん :01/10/10 15:57
>>734
μ単位ならアセンブラ使えよ
ミリ単位ならまだ分かるが

736 名前:717 :01/10/10 17:27
>>723
なるほど、各オブジェクトにユニークな識別子をつける、と
ありがとうございます。こいつで色々試してみます。
>>721
というわけですいませんです。

レスありがとうございました。

737 名前:デフォルトの名無しさん :01/10/12 17:58
画像処理ルーチンなんですが、template<class T>とした時、
Tの最大ビット定数を得る方法ってありますか?

例: Class<unsigned char> → 0xFF
   Class<unsigned long> → 0xFFFF

ビットシフトに使いたいんですけど。。。

738 名前:デフォルトの名無しさん :01/10/12 18:05
template <class T>
T foo() { return T(-1); }

739 名前:デフォルトの名無しさん :01/10/12 18:06
>>737
これの動作、コンパイラ依存だったかな?

template<class T>
T MaxVal()
{
T t=0;
t--; //これで0xFFFFになる?(unsigned shortでWIN32の場合)
return t;
}

740 名前:739 :01/10/12 18:07
う…

741 名前:デフォルトの名無しさん :01/10/12 18:43
>>739
>>740
有難うございます。質問の書き込み間違えてしまいました。
最大ビット定数だと
0xFFじゃなくて0xFFFFで,
0xFFFFじゃなくて0xFFFFFFFFですね。

しかし,欲しいのは
unsigned charの時0xFFで,
unsigned longの時0xFFFFなのです。
半分だけ切り出すことって出来ますか?

742 名前:デフォルトの名無しさん :01/10/12 18:52
>>741 なんか言ってること変じゃない?

こういうこと?

template <class T>
T foo() { return T(-1) >> (sizeof(T)*8/2); }

ただし 1 byte は 8 bits と仮定。

743 名前:デフォルトの名無しさん :01/10/12 19:14
>>742
申し訳ありません。また質問を間違えてしまいました。
逝って良しですね。。。

しかし、望んでいたのはまさに>>742のお答えの通りです。
有難うございました。

744 名前:デフォルトの名無しさん :01/10/12 23:50
private: staticフィールド初期化するのって
friendな初期化のためだけのクラス作って
staticなインスタンス一個置いとくのが定跡?

745 名前:デフォルトの名無しさん :01/10/13 00:00
>>744
は?.cppでconst付きで初期化するのが普通だろ?

なんでsageてんのか知らないけどsageてるからsage。

746 名前:sage :01/10/13 08:39
スレ違いならごめんなさい。

C++に洗脳されたプログラマとしては
JavaのStringクラスは許せないです。

なんでStringだけ+と+=演算子が特殊な言語実装になってるの?

747 名前:デフォルトの名無しさん :01/10/13 11:06
その頃のJava設計者の心の中は、VBに犯されていたので。>746

748 名前:デフォルトの名無しさん :01/10/13 15:55
c++ってほとんど知らないので、添削してください。
計算機イプシロンを求めるプログラムです。

#include <stdio.h>

template<class type>
type eps( type dummy )
{
 type eps, eps1;

 eps = 1.0;
 eps1 = 1.1;

 while( eps1 > 1.0 )
 {
  eps = eps * 0.5;
  eps1 = eps + 1.0;
 }

 return eps;
}

int main(void)
{
 float f;
 double d;

 printf( "machine float epsilon %.30f\n", eps(f) );
 printf( "machine double epsilon %.30f\n", eps(d) );

 return 0;
}

http://www.kuzuoka-lab.esys.tsukuba.ac.jp/simulation/kadai98.html
http://lanmaster.sh.inf.shizuoka.ac.jp/~lecture/csprog99/exam2/epsilon/sld002.htm

749 名前:744>745 :01/10/13 16:03
>は?.cppでconst付きで初期化するのが普通だろ?
書き忘れましたが
staticフィールドをAPIなどを使って初期化する場合です。

750 名前:745 :01/10/13 16:40
>>749
あーなるほど
staticフィールドを初期化するinit関数を作りたいわけね。
うーん、これだとやっぱりfriendつくるしかないんじゃないの?


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