C++相談室2

このエントリーをはてなブックマークに追加
320typename C++::books
>>316
> あと個人的には Modern C++ Design: Generic Programming and Design Patterns Applied
> も気になってる。
>
> http://www.amazon.co.jp/exec/obidos/ASIN/0201704315

これめちゃ面白いよ。template炸裂。
Effective C++, More Effective C++, Exceptional C++の次に必読。

// templateが原始帰納関数計算できるって知ってた?
321Bear in mind:01/09/18 16:56
>>316
Effective STL読んでます。今item37。
あと一週間待って。
322309:01/09/18 21:10
>>320
Thanks. よし、買おう。

> // templateが原始帰納関数計算できるって知ってた?
Game Programming Gems で template 使って行列計算するサンプルを読んで、
初めて template の記述能力の高さに気づきました。あそこまでいくと、もはや、
コンパイル時に評価されるインタプリタ「言語」ですね。

>>321
レビュー、期待しております :)
>>322

ちょっとサンプル見せて
324309:01/09/18 22:28
>>323
行列だと長いから、フィボナッチ数列のサンプルで良い?

template<unsigned N> struct Fib
{
  enum
  {
    Val = Fib<N - 1>::Val + Fib<N - 2>::Val
  };
};

template<> struct Fib<0> { enum { Val = 0 }; };
template<> struct Fib<1> { enum { Val = 1 }; };

これで、ソース中に Fib<8>::Val と書くと、フィボナッチ数列の 8 番目
の数値が得られます。
325 :01/09/18 23:21
やはりみなさんは「プログラミング言語C++」を通して
お読みになられたのでしょうか?
326typename C++::books:01/09/19 00:05
>>323
> ちょっとサンプル見せて

http://cseng.aw.com/book/0,,0201704315,00.html
ここからloki.zipを取得せよ。ちょと強引なのもあるけどね。template萌え萌え

// 標準に追い付いてないg++でcompile出来ない…
>>324
うぁ、すごいね。
これを見ると、とてもC++を使いこなしているとは言えないなぁ
>>324
関数型言語みたいな感じやね
329typename C++::books:01/09/19 00:37
Lisp、ML、Haskelで培った型やマクロに関する知見を、
compile-timeという制約を課して開花させていると思われ

最近良く使うのは、

template <class T> struct UnConst { typedef T UnConstT; }
template <class T> struct UnConst<const T> { typedef T UnConstT; }
…UnConstT<var>…

というようなpattern matchを使ったconst, &, *外し。

「引数がポインタ型だった時だけ」というようなtemplateも書ける。
330テンプレートマンセー:01/09/19 01:28
最近のお話のものは、テンプレートメタプログラミングで
引けばいろいろ出ると思われ。

ttp://www.oonumerics.org/oon/
ttp://extreme.indiana.edu/~tveldhui/papers/techniques/

昔のCマガにも出てたことあり。
331デフォルトの名無しさん:01/09/19 02:11
>>324
よくもわるくも馬鹿すぎ。
よいほうの理由は説明は略するとして、
悪いほうは「それって単なるCの引数つきマクロと同じレベルじゃん」。
その理屈でいえばマクロ的なことをなんでもやらせられるという安直な結論になるだけだ。
>>331
> 「それって単なるCの引数つきマクロと同じレベルじゃん」
マクロは C/C++ を理解しない単なる文字列置換しかできませんが、template
関数/クラスは C++ の文法を 100% 理解できますから、記述能力が全く違い
ますよ。

それと >>324 で挙げられているような単なる数値計算に限っても、実行時では
なくコンパイル時に値を確定できる利点があります。数値シミュレーションや 3D
ゲームのエンジンを記述する時には、十分に実用的なテクニック。

> その理屈
どの理屈?
333デフォルトの名無しさん:01/09/19 03:10
マクロは字句解析レベルで置換を行うプリプロセッサ
テンプレートは構文解析レベルで置換候補を作っておいて、
リンク時に解決を行うプリ/ポストプロセッサって感じがする。
(実際は違うんだろうけど)
なんかC++の言語本体からは遊離しているような印象。
それが使いやすくもあり、使いにくくもある。

JavaのJSR-14とかだと、もうちょっと言語よりになっているような..
reflectできるし、interface指定できるし
lispのマクロみたいね。
335デフォルトの名無しさん:01/09/19 07:19
>>331
知ったか厨房決定。
テンプレートをよく知らないと思われ。
>355
いや、ただの厨房でしょ。
337325:01/09/19 18:45
みなさん無反応なんですが・・・(汗

やはりあんな分厚い言語仕様本を通して読むのはバカげてますかね・・。
338デフォルトの名無しさん:01/09/19 20:09
>>337
そんなことない。1回は読んどくべきと思う。
‥とかいいつつ、漏れもまだ20章あたりまでしか読んでないが(w
339325:01/09/19 20:37
そうですか。読む勇気が沸いてきました(w。
まだ5章です。
あの大きさは、電車とかで読むのにはちょっとキツイですな。
それがネックになっています。
340馬鹿:01/09/19 20:49
>>337
読んだよ。
341教えて君。:01/09/19 21:16
g++-3.0.1ではg++-2.95.3で通ったC++のコードをコンパイルしてくれません。
なぜですか。
342それはね:01/09/19 23:05
2.95.3 では通るけど、3.0.1 では通らないコードを
コンパイルしようとしているからです。
343デフォルトの名無しさん:01/09/20 01:07
「Standard Template Libraryプログラミング」επιστημη と
「C++標準ライブラリチュートリアル&リファレンス」の
どっちがおすすめですか?
struct A {
 A();
 virtual void method();
};

struct B : public A {
 B();
 virtual void method() { puts("called"); }
};

上記のようなクラス定義で、
1 A::A() { method(); }
2 B::B() { method(); }

1の呼び出しが無効なのは分かるのですが、
2の呼び出しが正常に行われる保証はあるのでしょうか?
Bのコンストラクタが開始した時点で仮想関数は確実に呼び出せる状態にあるのでしょうか?

BCCでは呼び出せたのですが、処理系依存なのか分からないので・・・
345struct?:01/09/20 01:52
>>344
コンストラクタ内での関数呼び出しは不定なので
初期化用メソッドを別に用意するのが普通です。
コンストラクタでの処理は、メンバの初期化などで留めましょう。
>>345

返答ありがとうございました。
初期化メソッドもvirtualで継承してきているので、
そうなるとまたもうひとつ初期化メソッド用意するということですね。
なんか、カッコ悪い(^^;

>struct?
public:を省略して記事量を抑えるためですが(^^;
クラス設計で質問です。

戻り値がvoidのメソッドを作るのなら、
自分への参照を返す方が賢い気がするのですが、
実際どっちが良いんでしょう?
348:01/09/20 07:22
>>322
Effective STL終わりました。

内容は、More Effective C++より平易だと思います。
しかしSTLの中身を少し覗いたことがないと分からないと思われる記述も多いです。
また所々に標準についてのほほうと思う文が散らばっています。
「vector<bool>は標準化委員会の失敗作だ」
では買いなのかといわれると、More Effective C++より役に立つ機会は多いと思います。

>>344
保証はあると思います。
349-:01/09/20 07:36
350デフォルトの名無しさん:01/09/20 10:04
>>347
>自分への参照を返す方が賢い気がするのですが、
この根拠は?どんな用途を想定しているの?
351デフォルトの名無しさん:01/09/20 10:26
>>345
大嘘付かないよーに

各コンストラクタ中の仮想関数呼び出しは、自分自身の仮想関数
テーブルを用いて行われるので、どのクラスの仮想関数が呼ばれ
るかを特定できる

>>344
>1の呼び出しが無効なのは分かるのですが、

無効というのは、B::methodが呼ばれないという意味?
そういう意味では真だが、A::methodが呼ばれるのは保証される
352デフォルトの名無しさん:01/09/20 12:05
コンストラクタ内では、自分はまだ作りかけで
オブジェクトとしては(コンパイラに)認知されていないから、
仮想関数は部分オブジェクトとして構築済みの
基底クラスのそれが呼ばれるのだ。

仮想じゃない関数を介してコンパイラをだますことは
できるけれど、あくまで自分は作りかけなので
それを承知の上での処理をしないといけない。

んだよね?
353C--=A:01/09/20 14:34
ファイルをios::inでopenしたりした時にそんなファイルが無かったりした場合などのようにI/O関係でのエラーで例外を投げてくれないのは?
一々状態チェックするの嫌なんだけど。。。
354デフォルトの名無しさん:01/09/20 15:57
>>324あたりのテンプレート
いろいろやってみるも実際は意図した結果になかなかならないなー
結局ループしてたりw

あとテンプレートの引数が複数あって、片方だけ専門化できるようにならんのかな
355デフォルトの名無しさん:01/09/20 20:17
>>314

最初っから何でもかんでもクラスにするこた無いかも。

・とりあえず // と const と inline と namespace に萌えてみる
・関連の強い構造体と関数をクラスにまとめてってみる
・ユーザー定義型を作ってみる
・標準ライブラリを覚える
・全部オブジェクトにする(シングルトンとか使って)
・クラスライブラリを作ってみる
・テンプレートライブラリを効率を意識しながら作ってみる

みたいに段階を踏んだ方が、実行時効率を問われる世界から来た場合はやりやすい
んじゃなかろーかと。
例えば、関数オブジェクトを知らないでクラスライブラリ作ろうとしたりすると、
効率と柔軟性のトレードオフな物しか書けない訳で。
356デフォルトの名無しさん:01/09/20 22:39
>>352
> コンストラクタ内では、自分はまだ作りかけで
> オブジェクトとしては(コンパイラに)認知されていないから、
> 仮想関数は部分オブジェクトとして構築済みの
> 基底クラスのそれが呼ばれるのだ。

そんな仕様聞いたことないよ。
A::f()とB::f()が宣言されてる時にBのスコープ内で単にf()としたら、
B::f()が呼ばれるのが自然じゃない?

リファレンスやポインタを介さない関数呼び出しはコンパイル時に静的に決定できる
ので、仮想関数の仕組みは必要ないと思うんだけど。
357356:01/09/20 22:51
で、結局 >>344 の例だと、
void hoge(void){
 B b;
 // 何か
}
とした時、Bの構築時は、まず基底クラスAのデフォルトコンストラクタA::A()が呼ばれ、
その中でA::method()が呼び出され、その後でB::B()が呼ばれ、B::method()が呼ばれる
という順番になると思うんだけど‥。少なくともうちのgccではそうなったよ。
これが保証されないんなら怖くて継承とか仮想関数とか使ってられないよ。
358デフォルトの名無しさん:01/09/20 23:32
>>357
確かに実際にはその順番になるんだけど…。

B b;
ってしたときに、A::A() の中で B::method() ではなく A::method() が
呼ばれてしまう実装ってダサいと思わないか?
しょっちゅう間違えてハマるんだけど、俺。(w
359:01/09/21 00:28
12.7

-3- Member functions, including virtual functions (class.virtual),
can be called during construction or destruction (class.base.init).
When a virtual function is called directly or indirectly from a constructor
(including from the mem-initializer for a data member) or from a destructor,
and the object to which the call applies is the object under construction or destruction,
the function called is the one defined in the constructor or destructor's own class or
in one of its bases, but not a function overriding it in a class derived from the constructor or destructor's class,
or overriding it in one of the other base classes of the most derived object (intro.object).
If the virtual function call uses an explicit class member access (expr.ref) and the object-expression refers to the object
under construction or destruction but its type is neither the constructor or destructor's own class or one of its bases,
the result of the call is undefined. [Example:

352さんはどうやら分かっているが誤解をまねく記述をしている模様。
んで358さんへの答えは352さんがしているという再帰。
360sage:01/09/21 00:30
>>358
もっと勉強してから偉そうなこと書いてくれ
361345:01/09/21 00:34
>>351
あう〜、大嘘はひどいモナー(AA略)、というわけでザッと探してきた
http://www1.kcn.ne.jp/~robe/cpphtml/html02/cpp02017.html
http://www.sun-inet.or.jp/~yaneurao/rsp/rspA1toA8.html
(逆に叩かれたりして(w

うーん、VCだけなのかなぁ。でも…昔のBCCも仮想関数呼び出し前に
派生クラスのコンストラクタ呼んでくれなかったような…。

あとコンストラクタ内で重い処理するとマズイみたいな話無かったっけ?
それにグローバルでやるとなんたらとか……全部記憶が曖昧だ(^-^;

全部ひっくるめて適当に答えたのは謝ります。ごめんね〜 >>344
362345:01/09/21 00:36
>>359
おっと書いてる間に…よく読んどこ
363typename C++::books:01/09/21 01:39
>>354
コンパイラ古くない?

>>337
読んでるよ。仕様書も必要なところは。
仕様書のcode断片例はいいと思う。仕様は曖昧じゃないしさ。
>>361
yaneuraoあげると余計ややこしくなる
365デフォルトの名無しさん:01/09/21 03:11
質問です
クラス A がクラス B へのポインタを持ち、クラス B の機能を
利用するのですが、クラス A の派生クラス AA はクラス B の
機能では満足できないのでクラス B の派生クラス BB を利用します.

クラス A ではクラス B へのポインタを設定する関数
SetProxy( B * pB ) を宣言しているのですが、
クラス AA はクラス BB の機能を利用するため SetProxy のポインタを
クラス BB 以下の派生クラスに限定したいのですが
クラス A の SetProxy インタフェースを維持しつつ、
クラス AA の SetProxy ではクラス BB 以下の派生クラスへのポインタを
限定して受け取るように設計するにはどうしたら良いのでしょうか?
あと、初心者なのでこういう設計になれていないので
良い設計がありましたら、教えてほしいのですが…。

class B {
public: void doHogeHoge();
};

class BB : public B {
public: void doFooBar();
};

class A {
protected: B * PointerB;
public: void SetProxy( B * pB) { PointerB = pB; } };

class AA : public A {
protected: BB * PointerBB;
public: void SetProxy( BB * pBB) { PointerBB = pBB; } };
???
366358:01/09/21 07:44
>>359
いや、だからC++ってその辺ダサくない?って言ってるんだが。
「そういうもんなのです」って答えっスか?
367デフォルトの名無しさん:01/09/21 09:34
>>366
この結果のどこがダサイですか?
Bの部分であるAをconstructする時に、Aに任せるのは当たり前では?
何か勘違いしてませんか?

$ cat virtual.c
#include <iostream>

using namespace std;

struct A {
A() { method(); }
virtual void method() { cout << "A's method() called" << endl; }
};

struct B : public A {
B() { method(); }
virtual void method() { cout << "B's method() called" << endl; }
};

int main(void) {
A a; B b;
return 0;
}
$ g++ test.c
$ ./a.out
A's method() called
A's method() called
B's method() called
$
368358じゃないよ:01/09/21 10:42
>>367
派生クラスによる追加部分が未構築な段階で、
基底クラスの構築子から派生クラスの仮想メソッドを呼べてしまうと、
その仮想メソッドが派生クラスの未構築なメンバをもしもアクセス
すると動作が異常になるので、言語仕様では安全サイドに振って
一律に派生クラス側のメソッドを呼べないようにしているわけだが、
コンパイラとリンカが神のごとく賢ければ、未構築なメンバを
アクセスする仮想メソッドの呼び出しに対してはエラーを、
さもなくば呼び出し可能としても良いわけで、>>358 はそれを
ダサいと言っているのであろう。
逆にプログラマ責任サイドに振って、派生クラスの仮想メソッド
を呼び出しOKにして、未構築なメンバをアクセスするような
仮想メソッドの場合は「未定義の動作」とする手もあったと思う。
C++の場合、この手の選択では「未定義の動作」とする場合が
多いのだが、そうしなかったのは仮想テーブルの設定を行う
実装が難しくなるからかな。
369javaの場合は:01/09/21 11:20
>>368 の続き
ちなみに、Java は基底クラスの構築子の中から、
派生クラスの仮想メソッドが呼べてしまう。

その時点では派生クラスで追加したフィールドは派生クラス
の構築子による設定前なので、デフォルトの0(null)が埋まっている。
C++のように「デフォルトは不定」ではないので、深刻な問題は起きない。
もちろん、0(null)がプログラマが意図した結果であるかどうかは別問題。

------------(インデントはスマン)
class A {
A() { v(); }
public void v() { System.out.println("A#v"); }
}
class B extends A {
String s;
B() { s="hello"; v(); }
public void v() { System.out.println("B#v s="+s); }
}

public class test {
public static void main(String[] argv) {
// A a = new A();
B b = new B();
}
}

$java test
B#v s=null
B#v s=hello
------------

C# ではどうなるのかな。
370351:01/09/21 11:20
>>361
ええ。叩かせて頂きまふ(w

上のURLの方は、説明してる事は*ほぼ*正しいんですが、
>仮想関数はコンストラクタ内では正しく働かない。
という表現が間違ってますな。

下のURLの方は、>>358と同じ勘違いをしてるんでしょう。
何処を勘違いしてるかは、>>352>>367が書いてるから省略。

仕様を調べたわけじゃないから不正確だけど、危ないのは
初期化構文で仮想関数を呼んだ場合。(B() : A(method()) { })

仮想関数テーブルが初期化作業は、初期化構文を抜けて、
コンストラクタの関数部分({})に入る直前に行われるから、
この場合は何が起こるかわからない。(bcc32.exeだと落ちた)
371デフォルトの名無しさん:01/09/21 12:07
>>370 何が起こるかわらない…って違うだろ。>>359 を良く読め
372:01/09/21 12:46
>>367-369
残念ながら恐らく>>366さんはそんなことをダサいと言っているのではないです。

模範解答

C++のコンストラクタは、"コンストラクタ"だからである。
コンストラクタとメモリ管理を密接に結びつけることによって
コンパイラ実装者は、コンストラクタに、オブジェクトを作成するための
多種多様なメモリ管理の意味を与えることができる。

Javaにおいては、
メモリの割り当て及びメンバ変数の初期化を、コンストラクタと切り離すことによって
基底クラスコンストラクタが実行される前に、
派生クラスオブジェクトのメンバ変数が初期化済みであることを保証することができる。
373358=366:01/09/21 13:32
いや残念ながら俺が言いたかったのは、>>368氏が例としてあげた
> 逆にプログラマ責任サイドに振って、派生クラスの仮想メソッド
> を呼び出しOKにして、未構築なメンバをアクセスするような
> 仮想メソッドの場合は「未定義の動作」とする手もあったと思う。

こういう仕様の方が自然だったんじゃないか?ってこと。
仮想関数を呼んだときに実際に呼ばれる関数が
コンストラクタ配下で"だけ"他の場合と異なるってのは
違和感があるっつーか何というか。


> コンパイラ実装者は、コンストラクタに、オブジェクトを作成するための
> 多種多様なメモリ管理の意味を与えることができる。

ゴメン俺あんまり理解できてない模様。今の場合だと

  C++のコンストラクタ ∈ メモリ管理
→ vtableの構築も"コンストラクタ"の仕事
→ 派生クラスコンストラクタより先に基底クラスコンストラクタが呼ばれるので
→ 基底クラスコンストラクタ中ではvtableは整って無くて当然

ってことでしょか?
374358=366:01/09/21 13:36
「整ってなくて」って言い方はマズいかな。
「まだ派生クラスのものになっていなくて」 くらいに修正…。
375デフォルトの名無しさん:01/09/21 13:44
>>365
実装とインターフェースを分離すれば?

struct A
{
  virtual ~A() {}
  virtual void doSomethingWithB() = 0;
};

struct AA : public A
{
  virtual ~AA() {}
  virtual void doSomethingWithBB() = 0;
};

class AImp : public A
{
  B* m_imp;
public:
  AImp() : m_imp(NULL) {}
  void SetProxy(B* imp) { m_imp = imp; }
  void doSomethingWithB() { m_imp->doHogeHoge(); }
};

class AAImp : public AA
{
  BB* m_imp;
public:
   AAImp() : m_imp(NULL) {}
  void SetProxy(BB* imp) { m_imp = imp; }
  void doSomethingWithB() { m_imp->doHogeHoge(); }
  void doSomethingWithBB() { m_imp->FooBar(); }
};
376 :01/09/21 14:46
スタティックライブラリのファイルサイズって
実行速度に影響するんですか?
>>376
質問が大雑把過ぎて、何が言いたいのが良くわかりませんが。

純粋に実行コードのサイズの話なら、ワーキングセットがキャッシュメモリの
サイズを越えるかどうかが問題。実行ファイルが 100KB でも 1MB でも、あ
る時間内に頻繁に実行される部分が L1 キャッシュに収まるなら、実行速度
は変わらない。

あとスタティックライブラリのファイルサイズが大きくても、それが全て実行ファ
イルにリンクされるわけじゃない。必要な部分だけリンクされる。
378 :01/09/21 16:05
>>377
ありがとうございます
数値計算で使うパッケージが全部で14Mくらいなんで
どうなんだろうかと思っていましたが
ちょっと安心しました
379365:01/09/22 05:06
>>375
ありがとうございます。勉強になります。
クラスAAは派生クラスBBを受けるので、引数の異なるSetProxy()を
定義することになっちゃいますよね。ポリモルフィックの見方からすると
それで良いのかなと思いまして。
共通のSetProxy()を宣言して、ダウンキャストできるか調べる方法も
ありますよね。それとどちらが良いのかなとも。
OOP は難しいです…。(^^;)
380デフォルトの名無しさん:01/09/22 05:32
>>379
> 共通のSetProxy()を宣言して、ダウンキャストできるか調べる方法も
> ありますよね。それとどちらが良いのかなとも。
他のクラスがどのように A, AA と関わってくるかによって最適解は違ってきますが、
こちらの方法だとコンパイル時にエラーを検出できないのが悲しいですね。

> OOP は難しいです…。(^^;)
クラス階層の設計に関しては、必ずしも「正しい」解答がないですからね。

ただし、経験から生み出された定石があって「デザインパターン」と呼ばれています。
C++ では言語レベルでな継承・集約をサポートしていますが、これに加えてデザイン
パターンも習得すると、設計の柔軟性が格段に上がります。

参考文献
 オブジェクト指向における再利用のためのデザインパターン 改訂版
 ガンマ,エリック ヘルム,リチャード ジョンソン,ラルフ ブリシディース,ジョン
 ソフトバンクパブリッシング (1999)ISBN:4797311126

デザインパターンの骸骨たち
http://www11.u-page.so-net.ne.jp/tk9/ys_oota/mdp/
381:01/09/22 06:14
>>373
そのような実装も許されるということです。(ARM 10.9c)
未構築の派生クラスオブジェクトに対する仮想関数の呼び出し自体が定義できません。

>こういう仕様の方が自然だったんじゃないか?ってこと。
標準化委員会はそう思わなかったようです。
Javaは、基底クラスコンストラクタの呼び出しの前に、
派生クラスオブジェクトのメンバ変数は初期化されているので
実はこの判断と独立できます。
その説明が、>>372です。
382379=365:01/09/22 06:43
>>380
素早いレスありがとうございます。とても早かったのでちょっとびっくりです。

>こちらの方法だとコンパイル時にエラーを検出できないのが悲しいですね。
そうですよね。見た目なんとなく、すっきりするのですが
コンパイルエラーでチェックできないので…
あまり良くないかもしれないです。
こういうときに使うもの、ではないのかも…。

>これに加えてデザインパターンも習得すると、
>設計の柔軟性が格段に上がります。
デザインパターンはまだ未開拓の土地です。(^^;)
C++をまだ十分理解できていないので難しいかな?と
思いまして。(^^;)
設計する上で先人の勉強は大切ですよね。この機会に
DPのほうも一緒に勉強してみます。
役立つリンクをご教示いただいて、ありがとうございます。(多謝)
383デフォルトの名無しさん:01/09/22 13:44
-********/////////////////////--------------------------------------------------------------------------
あなた達には分からないでしょうが、Rubyは素晴らしい言語です。
オブジェクト指向スクリプト言語として他のスクリプト言語を圧倒する性能と美しい言語仕様を持っています。
例えば、SchemeやSmallTalkなどは比較的美しい言語だと言われていますが、後発である優位さでRubyは
さらなる美しさと実用性を備えています。
もちろんPerlやPythonなど問題外です。
日本語との親和性ではRubyしか選択肢がないでしょう。

LinuxのディストリビューションもRubyの採用例が増えてきています。
1年後には全てのディストリビューションがRubyを標準採用するでしょう。
Rubyは未来のスクリプト言語なのです。

長くなりましたが、コピペではありません。
賛同していただける方はRubyの事を分かっていただけない人に出会ったら、
この発言をコピペしていただければ幸いです。
C++なんて問題外ですが。
384 :01/09/22 14:03
じゃあなんで
Ruby Ruby Ruby Ruby Ruby Ruby Ruby Ruby Ruby Ruby Ruby Ruby
とかやる荒らしが出る?
>383はDelphiスレとかにも似た奴貼り付けてる。
放置。
3861Rubyユーザ:01/09/22 14:14
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
C++なんて問題外です。
387デフォルトの名無しさん:01/09/22 14:41
俺はどっちも好きだ。どっちもいい言語だよ。
けど、Rubyの話は別スレでやってくれよ。

Rubyは好きだけどRubyバカは勘弁してくらはい。
お前らにRubyを語られたらゆきひろがかわいそうだろ?
388デフォルトの名無しさん:01/09/22 16:52
Rubyはクソです。ゴミ箱逝きです。

いじょ
389デフォルトの名無しさん:01/09/22 18:07
>>383
Linuxは何言語で作られているか分かってるんだろうかわらぃ
390かな:01/09/22 18:16
どなたかマージソートで重複を削除する
プログラムを教えていただきませんでしょうか??
>>390
それ C++ の話なんですか? ともかく、宿題は麻衣ちゃんに教わって下さい。

お兄ちゃんの宿題、私が答えるよ
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=982853418
392かな:01/09/22 18:37
C言語です。
ありがとうございます。
さっそく聞いてみます。



Rubyはクソです。ゴミ箱逝きです。

いじょ
この発言をコピペしていただければ幸いです。
394Ruby野郎は、:01/09/22 19:46
Javaスレにも出没していたな。
そんなに素晴らしいのなら、他言語と比較するアカデミックなスレでも立てて、他人を納得させてみなさい。まぁ、叩かれるのがオチだろうがな。
395デフォルトの名無しさん:01/09/22 23:59
>>388
( ´∀`) ナイスお茶。
マジレス希望なんですけど
new演算子で確保したメモリに対してエラーチェックってしたほうがいいんでしょうか?

if( ( int *pNum = new int ) == NULL ) {
/* エラー時の処理 */
}

っていう感じに
new は失敗すると std::bad_alloc という例外を送出するナリ
例外を送出して欲しくなければ new(nothrow) なんてするナリ
new(std::nothrow) かな?
>>397さん早いレスありがとうございます、
例外って意外と便利なんですね。
400デフォルトの名無しさん :01/09/23 06:38
#include <iostream.h>

int main(void)
{
char c;
int i=0;

while(cin.get(c)) {
i++;
}

cout << i << endl;

return(0);
}
これで、入力した文字数をカウントして表示するプログラムを作成したつもりですが、
これでは、文字数が表示されません。どこが間違っているのか教えてください。
>>400
文字の入力が終わるのはいつだ?
402デフォルトの名無しさん:01/09/23 10:31
>>400
C++以前の問題。
わからんかったらプログラム書くな。
403デフォルトの名無しさん:01/09/23 10:34
>>396
set_new_handlerも調べておけ。
>>399
ただし、落とし穴もあるので注意な。

void foo()
{
  int *p1, *p2;

  p1 = new int;
  p2 = new int;
  // do something
  delete p2;
  delete p1;
}

このプログラムで p2 = new int に失敗すると、そこで例外が投げられて関数
を抜けてしまうため p1 = new int で確保したメモリを開放する機会が失われ
る。

C++ の例外に絡んだ落とし穴は色々あるので、実用的なプログラムを書くなら
Effective C++, More Effective C++, Exceptional C++ の三冊は必読。
>Effective C++, More Effective C++, Exceptional C++ の三冊は必読。
おいらはこのうちの一冊も読んでないナリ。
読んだのは、プログラミング言語C++ と ARM だけです。
実用的なプログラムを書くのは無理ですか?(藁
406デフォルトの名無しさん:01/09/23 13:48
>>405
その読んだって2冊の読み方によるけど、
仕事で使ったりするんだったら、
読んでないとロクでもないソフトが完成してしまうと思います。

っていうか、出来れば読みたくない訳?
C++でコード書きたかったらがむしゃらに読んどけ。
>その読んだって2冊の読み方によるけど、
思うんだけど、プログラミングの初心者じゃない人で
その2冊読んでダメならなに読んでもダメなんじゃない?
あと、C++ の解説書ばっかしいくら読んでも
スキルは上がらんよ。
何度もゴメソ

>Effective C++, More Effective C++, Exceptional C++ の三冊は必読。
ちなみにこの3冊が良い本なのは確かだと思いまふ。
読んでないけど。

以上、暇だったのでからんでみました。
410デフォルトの名無しさん:01/09/23 14:11
そうそう。Rubyができないと一人前とは言えないね。
>>410 ワラタ
でも氏ね
>>410
   λ
   ( ヽ  / ̄ ̄ ̄ ̄ ̄
  ( ゚Д゚ )< Rubyはクソです。ゴミ箱逝きです。 いじょ
 (____) \_____
   ヽ(´ー`).ノ
     (  へ)
      く



                      - = ≡三  λ
                  _ = ≡三     ( ヽ  / ̄ ̄ ̄ ̄ ̄
       (´ー`)          = ≡三    ( ゚Д゚ )< この発言をコピペしていただければ幸いです。
      ( ヽ ヽ)         - = ≡三   (____) \_____
      /  >             - = ≡三
413デフォルトの名無しさん:01/09/23 15:04
>>397
VC6は投げないという話があったような。VC持ってないから間違ってたら失礼。

try { delete[] new char[-1]; } catch (const std::bad_alloc& e){ std::cerr << e.what(); }
こんなんで確認出来るだろうか?(one-liner失敬)
保護の弱い環境だとクラッシュするかも。
414デフォルトの名無しさん:01/09/23 15:12
Effective C++, More Effective C++, Exceptional C++
これらの本はC++のどのような本なんですか?
OOPとかですか?
415Ruby!:01/09/23 15:19
OOPならRubyだね。

>C++
>いろいろと有名なオブジェクト指向言語であるC++と
>Rubyを比較すると:

>* C++なぞ問題外.^^;;;

http://www.ruby-lang.org/ja/compar.html

Rubyを知ってもらうためにもこの文をコピペしてください。
416デフォルトの名無しさん:01/09/23 15:20
>>415 いまさらですが、ひとつに偏るのは良くないです。
>>414
「プログラミング言語C++」は、コンパイラ作成者向けに書かれた仕様書を、利用者
向けに咀嚼した書籍だけど、上の三冊は仕様書の狭間にある陥穽や、仕様書には直
接は書いていない言語仕様策定者の意図に踏み込んで解説している。

実践で得られた知見をまとめた Tips 集、というのが近いかな。

Exceptional C++ も似たようなものだけど、こっちは Gru of the Week の記事が元に
なっている。英語が苦手でなければ、Web で公開されている記事をどうぞ(というか
私は GoW しか読んでない)。

Gru of the Week
http://www.gotw.ca/gotw/
                       

――――――――――――――――――――――
番組の途中ですが、臨時ニュースです。
「Rubyはクソです。ゴミ箱逝きです。 いじょ 」
この発言をコピペしていただければ幸いです。
___________   __________
             ‖ \|________   
             ‖ | ON AIR.|
             ‖  ̄ ̄ ̄ ̄
        ./ ̄ ̄θ Λ_Λ
      .../   //(´∀` )/|
     ./      ̄/⊂    ||_/
     | ̄ ̄ ̄ ̄ ̄|  (  ━┳┛
     |_____| /ヽ」┘┻
420デフォルトの名無しさん:01/09/23 18:03
             ‖ | ON AIR.|
             ‖  ̄ ̄ ̄ ̄
        ./ ̄ ̄θ Λ_Λ
      .../   //(´∀` )/|
     ./      ̄/⊂    ||_/
     | ̄ ̄ ̄ ̄ ̄|  (  ━┳┛
     |_____| /ヽ」┘┻
421デフォルトの名無しさん:01/09/23 18:04
             ‖ | ON AIR.|
             ‖  ̄ ̄ ̄ ̄
        ./ ̄ ̄θ   Λ_Λ
      .../   //(´∀` )/|
     ./      ̄/⊂    ||_/
     | ̄ ̄ ̄ ̄ ̄|  (  ━┳┛
     |_____| /ヽ」┘┻
422デフォルトの名無しさん:01/09/23 18:08
             ‖ | ON AIR.|
             ‖  ̄ ̄ ̄ ̄
        ./ ̄ ̄θ  ∧_∧
      .../   //(´∀` )/|
     ./      ̄/⊂    ||_/
     | ̄ ̄ ̄ ̄ ̄|  (  ━┳┛
     |_____| /ヽ」┘┻

AA調整実験中
423デフォルトの名無しさん:01/09/23 18:09
――――――――――――――――――――――
何故か耳がズレる
___________   __________
             ‖ \|________  
             ‖ | ON AIR.|
             ‖  ̄ ̄ ̄ ̄
        ./ ̄ ̄θ ∧_∧
      .../   //(´∀` )/|
     ./      ̄/⊂    ||_/
     | ̄ ̄ ̄ ̄ ̄|  (  ━┳┛
     |_____| /ヽ」┘┻
424デフォルトの名無しさん:01/09/24 00:56
この間から騒いでるRuby厨房は、当然Rubyも理解できてないと思われ。
425デフォルトの名無しさん:01/09/24 02:16
参照はどう使うと
きれいにコーディングできますか?
以前Javaをやっていて、VC++もやってみようと思い
現在C++猛勉強中です
JavaからC++に移行する際に注意する点等もありましたら
教えてもらえるとうれしいです
多重継承と、virtualをつけないとオーバーロードできない点が
なんか違うなーと感じてます
426デフォルトの名無しさん:01/09/24 02:16
オーバーライドですね
427デフォルトの名無しさん:01/09/24 02:51
参照は & と * があるよ
& はいまいち好きじゃない。値渡しと見た目で区別できないから。
でもコピーコンストラクタやテンプレートで必須になるんだよね。
428C++厨:01/09/24 02:56
>>425
左辺値を返すとき、たとえば
代入演算子のオーバーロードをするとき。
virtualがないものはクラス名で修飾された、
単なる関数で第一引数にthisが渡っていると
考えて良いそうな。
デストラクタの実行はスコープがあれば
その終わりに順ずる。
コンテナと例外をうまく使えばごみ集め
の手間はかからない。
429C++厨:01/09/24 11:37
C++(gcc)でシグナルハンドラからlongjmpするとコアダンプ
するんだけど、仕様的にはこれでいいんだっけ?
もうひとつ、allocaってC++で使っていいのかってこと。
例外とデストラクタが絡むから、ヤバイ気がする。
430デフォルトの名無しさん:01/09/24 12:01
>>429
おいおい、シグナルハンドラからどこへ longjmp するんだ?

>例外とデストラクタが絡むから、ヤバイ気がする。

そこまでわかってるならやばくないように
使うこともできるのでわ?
まあ c++ ならあんま必要ないしね。

gcc 限定なら int a[n] (iは非定数)なんてことができて
これは alloca と等価。
×:(iは非定数)
○:(nは非定数)
432 :01/09/24 14:02
Visual C++7.0っていつでますか?
>>432
激しくスレ違い。
434デフォルトの名無しさん:01/09/24 14:48
visualC++で
一般保護法違反がでてPCが固まったんですけどなんででしょうか?
>434 ははは・・・キミの上司ならもしかして理由の想像は判るかもしれないね。
    でもたぶん・・・・・

 PCを固めるのはコールバック系の処理中に変な事するとか
 まあ色々方法はあるけどね
436 :01/09/24 15:12

コールバック系?
リアルジュークボックスを起動しながらやっていたせいかなぁ?
437デフォルトの名無しさん:01/09/24 16:26
>>429
ISO/ANSIでは、C++における(POSIX) signalについて何も保障してない。
環境依存だから、compiler, libraryのmanualを読め。

ただ、longjumpはregister周りをいじって大域脱出を実装するので、
destructorが呼ばれるなんて事は金輪際ないと思うぞ。

signal→例外という機構がまだないんだなー。UNIXには。
Windows(SEH&__try)にはあるのになー。
438 :01/09/24 16:27
関数内ででかい配列を宣言すると飛ぶよ。
gnucも飛ぶ。
439デフォルトの名無しさん:01/09/24 16:39
シグナルハンドラ内で閉じている longjmp は、
たぶん機能するんじゃないかと思います。
ただしスタック巻き戻すときにデストラクタなんかは動かないでしょう。
(なので覚悟の上じゃないとちょとアレ)

シグナルハンドラてのは、プログラム本体とは無関係に
非同期に動くものなので、シグナルハンドラの外へ longjmp するのは
あるスレッドで setjmp した場所へ、別のスレッドから
longjmp しようとするようなものです。

飛ぶでしょ?普通。
>(なので覚悟の上じゃないとちょとアレ)
かわりにC++ではthrow/catchを使うべきだですよね。
>>440
シグナルハンドラから throw するのも、保証されてるかどうか怪しいな。
環境依存だからマニュアル読んでね、としか言えないけど。
ソダネ
そもそも本筋で throw してる最中にシグナルハンドラが
呼ばれて、そんなかで throw しようとしたらえらいことになるかも?
443デフォルトの名無しさん:01/09/24 22:41
>>436
ばーか。
そんなこと逝ってるようなやつが質問すんな。
444デフォルトの名無しさん:01/09/24 22:52
>>443
恐怖恐怖恐怖!!
443引見陰険隠見隠顕淫ビ
443最低
いじめかこわるい
ださ
さいあく〜〜〜〜
ちょーーーーーーー
ぼーーーーーーーーーーーーーーーーーー
ぶーーーーーーーーーーー
ってか厨房
あほ
だぼ
さヴぉ
445デフォルトの名無しさん:01/09/24 22:53
しったかぶり
        ∧ ∧   ∧ ∧
   /⌒~~~⌒\                       (   ,,)   (,,・Д・)
 / ( ゚?д?゚ )y─┛~~                〜(___ノ  〜(___ノ ,γ_
(_ ノγ U  ∩_∩)   THANK YOU 2ch     ┌───────┐   \
  α___J _J         and          (| ●        ● |      ヽ
  / ̄ ̄ ̄ ̄\  GOOD-BYE 2ch WORLD! /.| .┌▽▽▽▽┐ .|____|__||_| ))
 /     ●  ●、                   ( ┤ .|        | .|□━□ )
 |Y  Y       \ またどこかで会おうね  \.  .└△△△△┘ .|  J  |)
 |.|   |       .▼ |                 | \あ\      | ∀ ノ
 | \/        _人|∧∧∩゛冫、 .∧_∧      |    \り.\     . |  - ′
 |       _/)/)/( ゚Д゚)/ `  . (´∀` )..ヽ(´ー`)ノ  \が\ .   |  )
 \    / 〔/\〕 U  / ∩∩ (    ) (___)    \と.\ .|/
  | | | c(*・_・)  |  |ヽ(´ー`)ノ_|  |  | |   |〜 /\.\う\| (-_-)
  (__)_) UUUU /∪∪ (___)(_(__) ◎ ̄ ̄◎─┘ .└──┘.(∩∩)


 ママ〜 2chでスレたてたよ〜
 \__  ______
      ∨    ∧_∧
           " ,  、 ミ   / ̄ ̄ ̄ ̄ ̄
            ゝ∀ く  < いい子ね、後で見てみるわぁ
           ∧_∧  |   \_____
        三  (    とノ
      三   /   つ |
     三  _ ( _  /|  |
        (_ソ(_ソ(_ )
446デフォルトの名無しさん:01/09/24 22:53
テレビにニュース速報が入る。
俺は慌ててパソコンを立ち上げ、そして気付く。
「あぁ、2chは閉鎖したんだっけ……」
テレビからは現場の慌しい状況が伝わってくる。
もし2chがあったら、どういうスレが立っているのだろう。
重複スレが沢山できて、それで荒らしとかやってきて……
テレビでは相変わらず、レポーターが必死で現場の状況を伝えている。
可愛いレポーターだ。俺は、頭の中で「萌え〜」というレスを
つけている自分を想像した。
後ろの群集がテレビに向かって挑発的なポーズを取っている。
「なんだ、あのドキュソ」「厨房氏ね」……
俺はたまらなくなり、無いとは分かっていながら再び2chにアクセスした。
しかし、画面には一言「閉鎖したのです。。。」とだけしか表示されない。
何度リロードしても変わらない。あの日以来、2chは止まったのだ。
どうやら犯人が逮捕されたようだ。相変わらず可愛いレポーターが
その状況を伝えている。
「さよなら、にちゃんねる」
俺はお気に入りから2chを削除し、そして騒がしいニュースを冷めた目で
見るのであった。
         
447デフォルトの名無しさん:01/09/24 22:54
            ⊆ニ(二(ニニ⊇   ⊆ニ(二(ニニ⊇
        ./ ̄ ̄ ̄ ̄ ̄/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ヽ
       / ____/_________________ヽ
      ,/ ̄ ̄ ┏━, / ̄ ̄ ̄|| ||. ̄ ̄ ̄ ̄ |||  ̄ ̄ ̄ ̄ ̄ ̄ ̄...| |
     ,/ ∧ ∧. i┸i //. ∧ ∧ || / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    _.,/. (・Д・ ) | :::|// (゚Д゚ ) < >>443を迎えにきました。措置入院です!!
   |/,,,,,へ⊂ ヽ  .//  ,/  ノ/ ||\______________
  ,/ ̄ ̄ ̄ ̄ ̄ ̄//|_/ ̄ ̄ ̄|  ̄ ̄ ̄ ̄ ̄ | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
  |~ ゜ ̄゜ ̄ ̄ ̄~~| ̄ ̄   =。|┃       |━━━━━...............|
  |______: |,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|,,,,゜,,,,,,,,,,,,,,,,,,,,,,,,,|,,,東京精神病院,,,,,[|
 ._|]0::∴:::0::[二二il:]    ,-―-、 ,,|         |       .     [|
 |====== ;...........|  /,  ̄ヽ |~~|.        |  /,  ̄ヽ |     {|
 ヽニ[_]ヾニニヽ''''''|―-|.(※)|':|''''|.'''''''''''''''''''''''''''''|''''''''|.(※)|:|'''''''''''''''''/
     ゞゝ三ノ ̄ ̄ ̄ ゞゝ_ノ ̄ ̄ゞゝ三ノ ̄ ̄ ̄ ゞゝ_ノ
448デフォルトの名無しさん:01/09/24 22:55
while(){
printf("きしょ");
}
449デフォルトの名無しさん:01/09/24 22:57
━┓                                                  ____
] ┃                                                /    /
  ┃                                               / 2ch  /
] ┃                                             /Λ_Λ  /
  ┃    ゲキトツスルゾヌッ!!                               / (´∀` ) /
] ┃                                          / ∧∧    )/
  ┃                                         /  (゚Д゚ ) ̄ ̄ /
] ┃      _______________________/    U U ̄ ̄/ _
  ┃    /         ・・・・・|_|・・・・・ Λ_Λ ∩∩  /)_/) i⌒――⌒i       ̄ | __
] ┃   />   <  2ch Airlines (・∀・ ) (・x・)ノ (,’ー’) (´(Å__)` ) / ̄ ̄ ̄ ̄ ̄/
  ┃  /         _          _  (     ) ノ|x| _( U__U) /ヽ / /_ノ ヽ  ̄ ̄ ̄ / ̄
] ┃ | ▼      |_|・・・・・・・・・・|_|・・・・・・ ・・ |_|・・・・_・・・・|_|・・・/_/ |_|((.l_ll)))  /
  ┃ |_人_  (-_-)ヽ(´ー`)ノ/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄/ ̄ ̄ ̄ ̄ ̄ / (lロ-ロl) /
] ┃  \   (∩∩)(___)\==  / ̄ ̄ ̄ /|| ̄| ̄|\/ ̄ ̄   ヽ ∀ノ/
  ┃    ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄| ̄|\/ ̄||  |  |  |  ̄ ̄ ̄ ̄ ̄ ̄ ̄
] ┃                     ||  |  | |   ||  |_|/
  ┃                     ||  |_|/    ̄ ̄
] ┃                       
450デフォルトの名無しさん:01/09/24 22:57
参照を使った戻り値について質問なんですが
int &f(){return value;}
という関数があるとして、
f()=5;
という使い方できる事以外では
int f(){return value;}
と同じでしょうか?
451デフォルトの名無しさん:01/09/24 22:57
   ||
 ∧||Λ
( / ⌒ヽ
 | |>ALL|
 ∪ / ノ
  | ||
  ∪∪
452デフォルトの名無しさん:01/09/24 22:58
          正直、スマンカッタ!!
     \\  正直、スマンカッタ!! //
 +   + \\ 正直、スマンカッタ!!/+
     .   ___ .  ___  . ___   +
        /. ――┤  /. ――┤ . /. ――┤+
      ./(.  = ,= | ./(.  = ,= | ./(.  = ,= |
 +  .  |||\┏┓∩|||\ ┏┓∩|||\┏┓/  +
   ((  (つ   ノ  (つ   丿 (つ   つ ))
       ヽ  ( ノ   ( ヽ ノ   )  )  )
       (_)し    し(_)   (__)__)
453?r?????l????????:01/09/24 23:05
参照を使った戻り値について質問なんですが
int &f(){return value;}
という関数があるとして、
f()=5;
という使い方できる事以外では
int f(){return value;}
と同じでしょうか?
454kago:01/09/25 00:04
(先ほどの人、コメントありがとうございます。それではここで。)
最近linuxでC++を始めたんですが、関数一覧表、みたいなものはネット上にどこかないんですか? GNUのGCCを使っていますが。GNUのぺーじには、一覧表、みたいなものは見つけられませんでした。
perlとかphpとかだと、日本語のページでけっこう簡単に見つかって参考にしているんですが、C++はどうにも見つかりません・・・。
みなさんはある機能を使いたいと思った時、どのようにして調べるのでしょうか? 参考までに教えて下さい。
455>454:01/09/25 00:10
システムコールは載ってないけどね
http://www.microsoft.com/japan/developer/library/vclang/vclanghm.htm
>>453
いいえ違います、同じではありません
言語機能やSTLについて調べたいときは、
VC++やBCBのオンラインマニュアルを参照してます。
OSやライブラリの機能については、
それらのマニュアルを調べます。
あとはサンプルプログラムをgrepするとか。
>>453
戻り値に参照を返すのは鬼門。
EffectiveC++第2版の31項を参照。
459デフォルトの名無しさん:01/09/25 19:03
>>404

void foo()
{
  auto_ptr<int> p1(new int);
  auto_ptr<int> p2(new int);

  // do something
}

こうすれば例外が出てもリークしません。
p2の確保に失敗したときですら、p1だけがうまくデストラクトされます。
auto_ptrを使え、ということではなく、自動変数(スコープ)をうまく使えということです。
vectorやlistを使ってもいいし、何かのクラスのメンバになっていてもいい。
要はdeleteが無ければいい。deleteをまき散らしているやつはまだ厨房。
>>459
404 は、それを知ってて敢えて *ダメなサンプル* として、あのコードを出ただ
けだと思うが。More Effective C++ の項目9が、そのものスバリだし。

> deleteをまき散らしているやつはまだ厨房。
同意
461厨房:01/09/25 19:49
正直、すまんかった。

void foo()
{
  int* p1 = NULL;
  int* p2 = NULL;

  try {
    p1 = new int;
    p2 = new int;

    // do domething
  }
  catch (...) {
   delete p2;
   delete p1;
   throw;
  }
}
462厨房:01/09/25 19:53
それじゃ、うまくいった場合にメモリリークだ。(笑)
463厨房:01/09/25 19:56
以上、はまるパターンのサンプルでした。(てへっ)
464デフォルトの名無しさん:01/09/25 20:41
>>450
まあ大体はそれでいいと思うが、アセンブラだと

; int& f();
mov eax,offset value
ret

; int f();
mov eax,[value]
ret

という感じだと思われるから、その後のアクセスなど考えると前者が軽いかもしれん。
要は、戻り値がintでなくint&だから、一般的実装ではポインタ的に動きそうだと。
でもインライン化されるなら話は全く変わる。

どっちにしても、個人的にint& f();みたいな関数を書きたい局面は滅多に無いと思う。
でもMyClass& f();みたいにクラスを返すなら話は全く変わるし、頻繁に使ってる。

つーか組込型への参照を返す場面ってほとんど無いんじゃ。
クラスメンバアクセサとかなら、半端な隠蔽せんで読みと書きに個別の関数作るしな。

>>458
いや、どう見ても自動変数じゃないから鬼門ではなかろ。
int& f() { int value; return value; }
なら即自滅だが。
465デフォルトの名無しさん:01/09/26 10:45
>>464
自動変数じゃなかったとしても、EffectiveC++29項、30項に引っかかる。
C++とオブジェクト指向を両方とも深く知った人が理由あって使うならともかく、
普通は使用禁止と考えたほうがいい。
466デフォルトの名無しさん:01/09/26 14:01
VBで作ったDLLをVCで呼び出す必要が出てきたのですが、VB側で

Public Function Show(XXXX as Collection)

となっている場合、VC側での引数はどうすればよろしいのでしょうか?

LPDISPATCH aaa;
XXXDLL->Show( &aaa ) ;

だと、ビルドは通っても、実行時に
「ハンドルされていない例外はXXX.EXEにあります。0x0000005:Access Violation」
となってしまうのですが・・・。
BSTRのときのSysAllocStringみたいに、何かしてあげないといけないのでしょうか?
467デフォルトの名無しさん:01/09/26 15:25
C++でコンストラクタ中のエラーを例外投げずに通知するには一般にどうやってるの?
とりあえずコンストラクトは成功させて後でGetLastError()メソッドでエラーチェックさせるとか?
>>467
「一般には」例外を投げる。

どうしても例外を投げたくなければ、オブジェクトのコンストラクトと初期化用の
メソッドを分離して、後者の戻り値で判断させるのが手だと思うが。グローバル
なデータ領域を使って成/否を記録しておくのは、ネストできなくなるから、や
めたほうがいい。

CFoo foo;
if (!foo.Init(...)) {
  // 初期化失敗
}
469デフォルトの名無しさん:01/09/26 16:39
これって合法?
class Foo{
public:
 static void foo(char *message)
 {
  puts(message);
 }
};

void (*bar)(char *message);

int main(int argc, char* argv[])
{
 Foo::foo("xxx");
 bar = Foo::foo;

 bar("yyy");
 return 0;
}

実行結果
xxx
yyy
470これじゃ駄目かね?:01/09/26 18:39
#include <string>
#include <stdio>
#include <stdlib>
using namespace std;
class IBar
{
 public:
  virtual void Write(const string &message) = 0;
};

class Foo : public IBar {
public:
 virtual void Write(const string &message)
 {
  puts(message.c_str());
 }
};

int main(int argc, char* argv[])
{
 Foo foo;
 foo.Write("xxx");

 IBar *bar = &foo;
 bar->Write("yyy");
 return EXIT_SUCCESS;
}
471デフォルトの名無しさん:01/09/26 20:53
typedefって使う意味あるんですか?
>>471
typedefの役割と意味を調べれば自明。
473デフォルトの名無しさん:01/09/26 20:59
実際にそういう使い方して役に立った?
>>471
とりあえず林晴比古本でも見るよろし
475デフォルトの名無しさん:01/09/26 21:27
インスタンスが無いと、メンバ関数って呼べない・・・
476469:01/09/27 00:19
>470
駄目なんです。
コールバックを登録するCのライブラリの
ラッパーを作っていてその部分を隠蔽したいのです。

まあstaticメソッドを普通の関数としてクラスの外に
追い出してしまえばいいのですが、もし合法なら
staticでやりたいなということです。
477ポコニャン:01/09/27 03:12
>>476

そーゆーことなら469のまんまでも問題ないっしょ。

つまり469でのbarが実際にCで叩かれるアドレスなのねぇ。
関数ポインタとstaticメソッドの代入互換ってどこで説明されてる?
479470:01/09/27 09:59
うむ、C言語のライブラリの都合なら仕方があるまい。

>>478
いろいろなところで言われていると思うが……。
こういうケースでstaticメソッドを使うのは常套手段でしょう。
ポインタを1つ渡せる場合は、thisを渡すとかいうのも。

class Foo{
private:
 static void foo(void *p) {
  Foo *t = reinterpret_cast<Foo *>(p);
  t->Write();
 }
 int hdl;
public:
 virtual void Write() { puts(msg); }
 Foo() {
  hdl = set_callback(foo, this);
 }
 ~Foo() {
  remove_callback(hdl);
 }
};
480デフォルトの名無しさん:01/09/27 10:44
static void* hInstance

class Foo
{
public:
Foo(){
hInstance = this;
}
static void foo(char* message){
typedef void (Foo::*CallbackProc)(char*);
Foo* pObj = (Foo*)hInstance;
CallbackProc pProc = &Foo::Write;

(pObj->*pProc)(message);
}
protected:
virtual void Write(char* message){
puts(message);
}
};
481 :01/09/27 22:36
参照型を返す関数ってどんな使い方があるのですか?
やはり
func(0) = 1;  //funcの戻り値は参照型
といった感じですか?

x = func(0);
という使い方なら別に参照型を返さなくてもいいのですよね?
でも
int& a = func(0);
とすればちょっとは意味あるのかな?

とまぁいろいろ悩んでいるのですが・・・。
482>481:01/09/27 22:56
class A {
  ・・・
  string m_Name;
  const string& getName() {
   return m_Name;
  }
}

みたいにconst参照を返すのはよく使う、俺は。
というか、返値として使う場面はそれ以外にないな。
483 :01/09/27 23:11
>>482
それって呼び出し側はどういった使い方になるんですか?
ただのconst string型を返すのではダメなんすか?
>>483
それだと、インスタンスのコピーが発生するからコストがかさむ。
return this の時はたいてい参照で返すYO!
486 :01/09/27 23:49
で・・・、そのconst string&型を返す関数をどうやって使うのですか?
関数呼び出しを左辺にするのですか?
それとも戻り値を何かに代入するのですか?
結局参照を返すのはコスト削減のためだけなのですか?
>>486
従来の C 言語の経験があるなら、ポインタを返すタイミングで参照を返す(こともある)
で分かると思うが。理由は、主に次の二つ。

- 右辺値としてアクセスしたい場合に、オブジェクトをコピーするコストを削減する
- コピーではなく、実体にアクセスしたい場合に使う

もし分からないなら、少し実際のプログラム読んだほうが良いと思われ。
488デフォルトの名無しさん:01/09/28 00:57
>>481
参照を返す関数といえば、これ

ostream& operator<<(ostream& os, 〜);
489デフォルトの名無しさん:01/09/28 01:19
仮想関数+テンプレート
の関数の実行効率が異常に悪いのですが、心当たりあります?
490デフォルトの名無しさん:01/09/28 01:27
>>489
それ自体がそれほどパフォーマンスを落とすことはないと思われ。別な原因でわ?
>>489
とりあえず、お約束ということで。
プロファイルはとりましたか?
492デフォルトの名無しさん:01/09/28 01:54
>>491 いやとっていません。みても何がなんだかさっぱりで。
>>483
コピーに伴うコストが高くつく
>>492
それだと、ほんとにボトルネックが「仮想関数 + テンプレート」にあるのかどうか
分からん気がするが。
495おでん屋:01/09/28 05:12
すみません。以下のようなプログラムで継承元のクラスBの仮想関数を
オーバーライドするにはどうしたら良いでしょうか?
昨日から考えているのですがコンパイルエラーの連続で...
よければどうかお助け下さい

class A { public: virtual void method(void); }
class B : public A { ... };
class C : public A, public B {
 virtual void Cmethod(void);
 // ここで B の仮想関数 method をオーバーライドして
 // Cmethod()を使いたいのですが、書き方が分からないです。
};

void C::B::method(void) { Cmethod(); } // これはダメみたいです
なにしたいんだかわかんないけど

void C::Cmethod() {
// 必要ならなんか
B::method();
// さらに必要ならなんか
}

たぶんもっと基本的なことちゃんと勉強した方が良いと思われ。
>>495
クラス階層が明らかに変だけど。クラス C で B だけでなく A も直接継承している
のは何故?

あと「クラスBの仮想関数をオーバーライド」という意味が良く分からんのだけど、
もしかして

C* p;
static_cast<A*>(p)->method();
static_cast<B*>(p)->method();

それぞれで、別の処理を行うことを想定してます?
498おでん屋:01/09/28 06:00
>>496,497氏
レスありがとうございます。

ほんと構造が変です。こんな変な構造になったのは...
基底クラスのデストラクタでファイルの後始末処理をしているのですが
基底のデストラクタでは派生クラスの仮想関数はすでに使えないので
(ファイルの操作はこれに頼っているので、困ってしまいます)
派生クラスで書かないといけないですよね?
でも、この派生クラスをさらに派生すると...?

延々と続く問題になってしまいまして、それを解決しようとしたのが
クラスAで、派生クラスの後始末側にAの仮想関数を呼び出すようにして
Aの仮想関数で後始末をできるようにしました。

CのAはCを面倒みて、BのAはBを面倒みるような形にすると
こんな問題がでてしまいました。
さらに、呼び出すにもCのAなのか、BのAなのか明確にしないと
いけないです。さらにまずいです。

まったくもって勉強不足を痛感しております。
このような問題はどう解決したらいいのでしょうか...。
>>498
> 基底クラスのデストラクタでファイルの後始末処理をしているのですが
> 基底のデストラクタでは派生クラスの仮想関数はすでに使えないので
> (ファイルの操作はこれに頼っているので、困ってしまいます)
この段階で設計が間違ってるなぁ。

これだけだと何とも言えんから、各クラスの処理の概要とファイルの後始末
に関して、少し詳しく書いたほうがいいと思う。
500おでん屋:01/09/28 06:43
お世話になっております。説明が少し下手ですが宜しくお願いします。(ぺこり)

概要はこんな感じです。
重要でない細かい部分は端折らせていただきますね。

class AbstructFile {
public: Open() = 0, Close() = 0, Read() = 0, Write() = 0; // 純粋仮想メソッドです
public: ~AbstructFile() { Close(); }
 // 閉じ忘れ防止にデストラクタでファイルを閉じる処理はしておきたいです
}

AbstructFile は多種に派生してその一種に AbstructFile2 があります。
これもデストラクタで閉じたいのですが基底のデストラクタの Close(); は
邪魔になります。それをどうにか解決しても、AbstructFile2 から派生した
AbstructFile3 でさらに AbstructFile2 のデストラクタ処理が邪魔になりました。

正しい設計にするにはどうしたら良いのでしょうか...。
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な。
>>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つの数をインプットし読み込んで
その数の二乗、三乗を計算するプログラム
>>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 それはオブジェクトへのポインタ
クラスへのポインタではありません
>>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関数ではない)
>>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
テンプレートってヘッダファイルに書くの?
どこに書いたらいいのかよくわからん。
>>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
ダウンキャストする時に使ってたんじゃない?
その昔は。
>>533
C++はObjectを作る方法として、ポインタにnew使う奴と、変数埋めこみで直接作る奴とが有るが、
C++が痛いのは、その両方に対して使える機構しか、提示しない、ということだな。

メタクラスの方向性を否定してるんで、「つみかさねる」ようなプログラミングを
ちまちま手作業で書かないとならないんで、辛い。
>>538
すまん。日本語が難しすぎてよく分からんので、もうすこし C++ プログラマに
わかりそうな言葉でしゃべってもらえると、ありがたい。
540デフォルトの名無しさん:01/09/29 02:35
>>535
ヘッダにソース書くのやだなー。
って思う人はどうしてるの?
>>540
ヘッダに宣言だけ書いて *.cpp ファイルに実装書くこともできますよ。
でもヘッダに書くのが主流。
542デフォルトの名無しさん:01/09/29 02:51
>>541
そうなんだ。ありがとうございます。
思い切ってヘッダに書いてみます。

昔はよく、「ヘッダにコードを書くな」って怒られたものです。
(それはインクルードするだけで実体化するからですけど〜。)
543デフォルトの名無しさん:01/09/29 02:53
>>540
昔、ミカカ子会社提供のミドルウェアの一部であるテンプレート
ライブラリ(ヘッダに実装かいてあった)に間抜けなバグがある
のを発見した事がある。

ソース完全公開状態だからな。恥さらしだと思った。
(問題は、そこがバグっているとそもそもそのライブラリが
役立たずなものになるという致命的なものだったのだが、誰が
どう試験していたんだろうか…)
>>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);
}
546545: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.
『ゴルァ 』
>>545
やべーワラタ。
548デフォルトの名無しさん:01/09/29 10:55
すいません、C++の、ポインタとかクラスとかSTL」とかはぜんぶやったんですが、enumだけ覚えずにここまできてしまいました。
enumってなんでしょう。
549デフォルトの名無しさん:01/09/29 11:19
>>548
const や #define に代わる、定数宣言の最適な手段です(整数に限る)

例:
enum N_{
 N = 32
};
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++ だと、明示的に型キャストしない限り、
コンパイラが「あれっ?」と思ってくれます。
>>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になってるってつっこんでるんだよ。
556550:01/09/29 13:49
>>551
あっ、…。(鬱氏)
>>552
C なら
enum type {...};
enum type x;

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

(今度こそ!)
557553:01/09/29 14:11
>>556
そういや、構造体と同じで普通に名前付けられるのだったね…。
boolが仕様に入るまではこうしてた
typedef enum{
false=0;
true=1;
} bool;
セミコロンじゃなくてカンマだっけ
560デフォルトの名無しさん:01/09/29 16:27
汎用性のある参照カウンタ付きのクラスを継承して使いたいのですが、
自作したほうがいいですか?
それとも既にライブラリが存在し、それ使った方がいいですか?
561デフォルトの名無しさん:01/09/29 18:28
C++で動的配列を作りたいのですが、new [ ] で作成した配列
のサイズをあとで変更するにはどうすればいいですか?

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

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

delete a[ ];
STLのVector使え。
        
>>561
realloc
>>563
newしたやつにreallocするのは止めろ。
ビットコピーされたらどうするつもりだ?
>>563 バカ?
素直にmalloc使えよ
>>561
#include <vector>

void foo(void)
{
 vector<int> a(100);
 a.resize(50);
 //delete不要
}
568561:01/09/29 20:49
eMbedded Visual C++ なので、STL 使えないのです…
realloc 使うことにします。
>>561
小さくするだけなら、そのままにしとけ。
570sage: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;
のほうがいいの?
>>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へのレスね。
>>571
ここはC++のスレだぞ。APIについては他所でやれよ。
ついでにいっとけばエディタを作るのにWindowsのEditBox使うのは止めろ。
>>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;
}
か?
>>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[固定]だからです
>>588
MSDN読め。
591デフォルトの名無しさん:01/09/29 23:58
>>588
仕様です
592デフォルトの名無しさん:01/09/29 23:59
>>589
それが真実ならマイクロソフトさんって思ったより知能低いですね
速答ありがとうございます
>>587
自分で作るか他のエディトコンポーネントを探すか
>>582
ヘッダファイルの相互依存関係は、ちょっとソフトウェアの規模が大きくなると
辛いです。一つのヘッダを修正するだけで、ほとんどすべてのソースを再コン
パイルすることになりかねません。

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

>>584
いや class X の「サイズ」が決まらないと class X をメンバとして持つクラスの
「サイズ」も決まらないので、ダメです。
595デフォルトの名無しさん:01/09/30 00:01
>593
自分で作るって、どういうことですか?CreateWindowの引数でどうにかできるのですか?
596デフォルトの名無しさん:01/09/30 00:04
>595
悪い事いわんから開発やめとけ。
>>595
ネタとマジレスの区別も付かない、自分で一切調べないような奴には
一生かかっても無理だ。
598デフォルトの名無しさん:01/09/30 00:34
>>592
っていうか、「メモ帳」だぞ。
そんなおっきいファイル開く方が間違ってるYO。
エディタじゃねーよ。メモって意味考えろ。
599 :01/09/30 00:49
CEditView(ファイルサイズ64Kまで)かCRichEditViewつかいませう。
CRichEditViewで挫折したらまた質問下さい。
リッチエディットをエディタに使うバカはいません。
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のクラスなんか使わないでしょ。普通。

さすがにそれは普通じゃないと思われ。
>>604
MFC使わないやつは
1 完全にオリジナルのUIを構築するやつ(移植性とかなんとか
2 アンチMFC
3 MFCが分からないやつ

で、比率で言えば、1:10:89こんなものかな
>>608
604は「エディタのビューとして」の話だと思う所存。
エディタのビューとしてCEditやCRitchEditを使う奴はDQNだと思うナリよ
MFC相談室になっているゆえ、Qt使えとか言ってみる。

.>>609 MVCの話なら歓迎〜。
メーラーとかの編集窓でRicheditは多いと思うが
Win2000ならメモ帳のサイズ制限はないよ。
613デフォルトの名無しさん:01/09/30 08:17
>>611
俺の知る限りはAL-Mailぐらいだな。
>>611
メーラーなんかプレーンテキストで十分だ。
よってCEditで十分だと思うが、どうか?

>>608
禿同。
615デフォルトの名無しさん:01/09/30 09:30
RichEditなんて遅くて重いの使ってられるかよ。
つーかエディタを作るってのはエディトコントロールを自分で作るって事じゃないの?
そこがエディタの命なんだからさ。
秀丸がリッチエディット使ってたら誰も買わないだろ。
617デフォルトの名無しさん:01/09/30 10:55
すいません、vector< vector<int> > a;で、
stringのc_str()みたいに配列全体を得たいのですが、どのメソッドを使えばよいのでしょう。
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 は正しい。
>>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
試したら?
いいね
629デフォルトの名無しさん:01/10/01 00:14
何でエラーになるんだ??
630626: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使えなみたいです
サンプルプログラムも実行時エラーがでます
>>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 ですか?

分かる人教えて・・・
642641:01/10/01 13:50
あ、C++のスレだった。間違えました、鬱だ。
でも、分かる人いたら教えてください。悩んでるんです。
>>641-642 悩んでる時間があるなら、
ちょろっとコード書いて自分で試せば?
644641:01/10/01 20:27
>>643
どうやって試すの?
たった2時間しか考えないで他人に聞くなよ。
頭は帽子を置く台じゃないんだから。
頭はかつらをかぶせる台じゃないんだから。
647デフォルトの名無しさん:01/10/02 00:48
つーか、ポインタもわからないのに
Deep comparisonみたいな単語だけは知ってる
Javaはホントはすごいんだけど、馬鹿が使うから馬鹿にされるんだって
648デフォルトの名無しさん:01/10/02 00:49
C言語よりエレガントにバイナリーエディターを作れますか?
>>648
C言語でエレガントに作れるものなんかあるのかよ。
エレガントだと思いこんでいる連中はいるようだが…。
650641:01/10/02 10:19
>>647
相談スレだから、書いてみたんだけど・・・やっぱ
ダメだった??

= がShallowって言うのは分かるんだけど、
== がDeepなのかShallowなのか分からない・・
651641:01/10/02 10:26
JAVAスレがありました。ごめんなさい。
652デフォルトの名無しさん:01/10/02 21:21
C++のポインタを使った表記が醜いので
# foo->bar.bazとか
可能な限り参照を使ってみたいのですが
# foo.bar.bazみたいに
何か問題ありますか?
使えば?
>>652
とりあえずリンクトリストでスタック作ってみそ
>>652
問題ないよ。
ただ . 演算子が4つくらい並んでいたら、
こいつ大丈夫か?と疑いはじめるだろう。
>>652
参照にしたところで、醜いもんは醜いんだよ。
設計がおかしいんじゃねぇの?
>>654
stack<CFoo> s;
s.push(CFoo(1));
s.push(CFoo(2));
s.top().bar.baz;
659デフォルトの名無しさん:01/10/03 14:50
>>657
参照はポインタより制限がきつい。
無制限に使えるポインタでなければ組めないとき、
なぜその制限内に収まらないのか検討する余地がある。
参照すらいらないのにポインタを使う奴もいる。
制限の緩い機能を使うときは、強力であるが故に慎重さが欲しい。

とりあえずポインタより参照を優先するという方法は
それなりに有効だよ。
660654: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++
>>662
何でそうなってるのか考えてみろよ
664デフォルトの名無しさん:01/10/04 01:09
>>662
いや、"->"と"."は明らかに違うだろ。
ポインタと実体(もしくは参照)が同じように
見えるんだったらかなり重症だぞ。
665デフォルトの名無しさん:01/10/04 01:46
たしかにそもそも用途が違いますよね。

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

そうじゃないだろ? とまぁ、いいたいのですが。
スタック上にあるオブジェクトをdeleteしても大丈夫な
様にする事ってできますか?
(スタックならデストラクタだけ呼び出して、開放はしない)
ヒープに置いてあるやつと区別しないで扱いたいんで。
CObject a;
スタック上の(未初期化の)メモリに対して placement new を使う。

でも、どっちかというと使い方が間違ってると思う。
>>662
その話題、別のスレッドでも出てたな。

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

あと C++ に関しては operator->() がないとスマートポインタ実装できないから嫌
です。
コンパイラ標準のSTLじゃなくて、SGI STLとかSTLport
とか使ってる人いる?マルチプラットフォームなコードで
統一しようかと思ってるんだけど。

SGI STLってなんかコンテナの種類とか増えてるね。
hash_mapとか。
670sage:01/10/05 07:25
STLportばりばり使ってるよ
671デフォルトの名無しさん:01/10/05 11:58
>>668
> ポインタとスタック上の変数を

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

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

は同意。char **argvとchar *argv[]を混乱する厨房を見るにつけ
あ、[]のdouble meaningのことね。
STLPort使ってるよ。
バイナリがでかくなるのを除けばVC付属のよりいいんで。

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

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

別プロジェクトで、ということなら、単にインクルードディレクトリの優先度を変えればできるっしょ。
675669:01/10/05 17:24
STLport使ってる人、実際どう?
コンパイルが面倒とか特殊な書き方しないとだめとか
環境によって駄目とかある?

うちはWin, Mac, Linux全部やってるから出来れば
統一したいんだよね。
676673:01/10/05 17:46
>>674
ああ、同一プロジェクトでは統一しますが、
コードがでかいと困るときに標準を使いたいんですよ。
ただ、環境変数で一度に設定してるから優先度いじるの面倒なんで。

>>675
コンパイルが面倒も何も、VC/BCCではmake一発でとおります。
BCCは知らないけど、VCのものよりはパフォーマンスが良いです
VC使う上での注意は、必ずマルチスレッドライブラリをリンクする
必要があるということだけかな。
677デフォルトの名無しさん:01/10/06 01:34
ねぇねぇ、
基底クラスのデストラクタを書いてなくて、
基底クラスでdeleteすると派生クラスの
デストラクタが呼ばれないって知ってた?
678669:01/10/06 01:37
>>676
そっか、特に何にもしなくてもmakeでビルドできるのか。それはナイス。

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

Mac、Linuxで使ってる人が居たら状況キボン。
>>677
当たり前だろ。仮想デストラクタにならないんだから
>>679
当たり前だが、初心者がはまりやすい落とし穴ではあるな。

>>677
C++ はいろいろ過去を引きずっている影響で、いたるところに落とし穴がある仕
様になってる。痛い思いをしたくなければ Effective C++, More Effective C++
という書籍を買ってきて読んでおきましょう。
681sage:01/10/06 10:15
>>678
実際に自分の書いてるコードで置き換えてみて
評価すればよいよ。
>>678
実際に計って速度に問題があればつかわんでいーだろ。

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

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

MTスレじゃないからsage
>>681
>>682
ごもっとも。なのでsage
684思いつき:01/10/07 01:51
foo->bar->baz = 0

using foo->bar
baz = 0
と書けると嬉しくない?
>>684
全然嬉しくない。
入れ子にできないジャン!
>>685
別に常に使わなくてもいいわけだし。
C++Builderでは便利かもね。
>>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;
できるよ?なんか文句ある?
それだとbaz以外のメンバがいじれなくていやな感じ
691689:01/10/07 21:14
>>690
↓で我慢しとけ。この程度の小石につまづいているようではX
>>688
メンバ関数用意すれば?
せっかくC++なんだしさ。
メンバ変数にアクセスするインターフェイスをつくるとき、
名前ってどう付けてる?

class Mona {
public:
int giko;

だとして、

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

なんかが考えられるけど。
void Giko(int value);
int Giko(void);
後者は
const int& Giko() const;
だろ。Monaがconstになった途端アクセスできなくなるぞ。
それにその方法だと、結局もう一個
int& Giko();
を用意することになる。
>>694
>>695
うん、要するに聞きたいのはSet〜とGet〜っていう命名は良くないのかな
って事なのだ。個人的には悪くないと思うんだけど、オブジェクトとして
考えた時はちょっとおかしいかなと感じるんで。周りには良くないって言う
人も居る。

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

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

規約
名詞=プロパティ Count()
動詞=メソッド Clear()
>>697
うん?ちょっと確認なんだけど、漏れが言いたいのは

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

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

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

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

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

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

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

規約の方はその通り。
int **p;

p = new int [x][y];

って間違ってます?

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

まじ質問です。
701700:01/10/08 21:02
sageてしまった・・・
age
>>700
C++の質問じゃねーだろ。くだらねー質問スレへ逝け。
それにそのコード間違ってる。
703700:01/10/08 21:08
>>702
newの使い方なのでC++だと思ったんですが・・・
逝ってきます・・・
704デフォルトの名無しさん:01/10/08 21:11
>>699
ふむ。結局、Get/Setという文字列がどうこうじゃなくて、
意味的におかしくないならGetやSetが付いた命名もあり
って事なのかな。

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

規約のほうは参考にしてみる。これはこれで統一されてると
思うから、うまく命名すれば使えると思う。
>>703
newの使い方の問題なのか?それ以前にポインタを復習すれ。
>>705
ってことは、

int **p;

*p = new int* [x];

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

ってことですか?

まとめて確保してくれると思ってました・・・
707700:01/10/08 21:22
>>706

まちがいっす・・・

>*p = new int* [x];
p = new int* [x];
多次元配列を扱うコンテナをもってきて
array2<int> *p = new array2<int>(x,y);

みたいにしとけば?

stlで近いことが出来た気もする。
709デフォルトの名無しさん:01/10/08 21:25
710STLマンセー: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);
711700:01/10/08 21:29
>>708
>>710

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

ご教授ありがとうございますm(_ _)m
>>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
つーか本当に任意にサイズの二次元配列確保しなきゃならないのか?
x,yは両方とも変数で無いと駄目?
714712:01/10/08 21:35
STLをつかう方法もいいが、速度が要求されるか、
配列が大きいなら>>712の方法にしとけ。
>>712を自分用コンテナにして使い回すのがよさげ
716デフォルトの名無しさん:01/10/09 18:23
単なるコレクションを返したいのですが、
どのような形で返すのが良いでしょうか?
717デフォルトの名無しさん:01/10/09 19:09
互いに関連(相手へのポインタ)をもつオブジェクトで
なおかつそのオブジェクト同士の関連の仕方が全くの任意である場合、
その関連の仕方をデータに保存するにはどのような方法があるのでしょうか?

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

よくありそうな処理の割に良い方法が、思いつきません。
なにかスマートな方法があったら教えて下さいませ。
718デフォルトの名無しさん:01/10/09 19:34
外部シンボル’〜’が未解決っていうエラーがでたらどう解決したらいいんですか?
>>717
説明読んだだけでは何がしたいのか良くわからんけど、
一度「デザインパターン」で検索して勉強してみることを強くお勧めする。
多分解決する。
720717:01/10/09 20:49
>>719
トホホホホ、GoF本持ってる漏れは逝ってよしということですか?
  ___       ___         ___
  | YES | ΛΛ.   | YES | ΛΛ    |GoFi | ΛΛ
 〃 ̄ ̄∩ ゚Д゚) 〃 ̄ ̄∩ ゚Д゚)  〃 ̄ ̄∩ ゚Д゚) GoForIt!
     ヾ.   )     ヾ.   )        ヾ.   )

オブジェクトと書きましたが、実際はクラスと言うより、ほとんど構造体なので、
データの持たせ方がまずいっぽいです。むーん良いの思いつかねぇ。ムキョー
>>720
サンプル書いてみ?
722sage:01/10/09 22:32
>>716
イテレータ
723sage: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; }
};

をそいつらのメンバに加えときなさい。
724716:01/10/10 00:45
>>722
どもです。やはり
const vector<type>&
とか
const type*
を返すのはダサいでしょうか?
>>724
いやべつにいいんでない?
726デフォルトの名無しさん:01/10/10 00:56
ダサイよ
Delphi使いな
>726
よくわかっているじゃない。
つまり、>>727は、
「ダサいよ、Delphi使い。な?」
と読んだってわけか。
「ダサイよ」Delphiのルビかと思った。

Del厨って全角英数好きなのか?
STLのmapやsetは、マルチスレッド環境下でも排他制御なしに使えますか?
(map/setの内部にロック機構を持っていますかという意味です)
よろしくお願いします。
>>730
STLportはスレッドセーフになってるらしいけど、
VC++とかGCCの純正(?)STLはどうなんだろうね?
>>730
実装によります。
733デフォルトの名無しさん:01/10/10 14:22
>>714
STL使っても速度は変わらないと思ふ
734デフォルトの名無しさん:01/10/10 14:33
>>733
ふつうに使う分にはかわらないね。

でも、マイクロセカンド単位で処理速度を追求する人もいるので
>>734
μ単位ならアセンブラ使えよ
ミリ単位ならまだ分かるが
736717:01/10/10 17:27
>>723
なるほど、各オブジェクトにユニークな識別子をつける、と
ありがとうございます。こいつで色々試してみます。
>>721
というわけですいませんです。

レスありがとうございました。
画像処理ルーチンなんですが、template<class T>とした時、
Tの最大ビット定数を得る方法ってありますか?

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

ビットシフトに使いたいんですけど。。。
template <class T>
T foo() { return T(-1); }
>>737
これの動作、コンパイラ依存だったかな?

template<class T>
T MaxVal()
{
T t=0;
t--; //これで0xFFFFになる?(unsigned shortでWIN32の場合)
return t;
}
740739:01/10/12 18:07
う…
>>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のお答えの通りです。
有難うございました。
private: staticフィールド初期化するのって
friendな初期化のためだけのクラス作って
staticなインスタンス一個置いとくのが定跡?
>>744
は?.cppでconst付きで初期化するのが普通だろ?

なんでsageてんのか知らないけどsageてるからsage。
746sage:01/10/13 08:39
スレ違いならごめんなさい。

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

なんでStringだけ+と+=演算子が特殊な言語実装になってるの?
その頃の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
749744>745:01/10/13 16:03
>は?.cppでconst付きで初期化するのが普通だろ?
書き忘れましたが
staticフィールドをAPIなどを使って初期化する場合です。
750745:01/10/13 16:40
>>749
あーなるほど
staticフィールドを初期化するinit関数を作りたいわけね。
うーん、これだとやっぱりfriendつくるしかないんじゃないの?
>>749
コンストラクタで(あるいは最初に使う時)
未初期化だったら初期化するようなことをするよ、おれ。
最近の仕様だと、static objectのコンストラクタ呼出しを使えばいいのではないかな。
ANSIだとmainの前に呼ばれるけど、VC++だとWinMainの前かな。
VC++で実装されているかどうか知らないけど。

g++は駄目。よって>>751してる。
753デフォルトの名無しさん:01/10/14 14:07
gdbでstd::stringの内容を確認するイイ方法ない?
754デフォルトの名無しさん:01/10/14 14:52
string()って関数があるってこと?
それとも
文字列データのこと?
755sage:01/10/14 14:54
void print_string(std::string &s)

を作っておいて、gdbから呼べばいいんでないの??
関数呼び出すとgdb落ちてしまうこと多くないですか?
>>753
DDD使え
758753:01/10/14 20:08
え!DDDだとstringサポートあるんですか。
でも emacs から使いたいなあ。
>>758
そういう訳じゃないが、リンクが簡単に辿れるのだ
http://www.gnu.org/software/ddd/all.jpg
ここのウインドウの上側をみると分かるかな?
760デフォルトの名無しさん:01/10/15 01:12
>>753はどうして>>754には無言なの? 何をやりたいか書かないと、

(gdb) print 変数名

で的を得た答なのかどうか分からない…
761デフォルトの名無しさん:01/10/15 01:18
>>758
GVDでもstring objectの中、見やすい。
emacsからは使えんがね。デバグにemacs使いたい心境がわか
らんなぁ。素のgdbよりは格段にマシなのはわかるけど。
>>760
754はC++知らない...とまでは言わないが的外れ。無視されても
しょうがないとおもうけど?
>>760
的は得るものではなくて、射るものですね。

ってのはともかく print 変数名だと std::string オブジェクトの内部構造もろもろが
表示されて邪魔、単純に文字列だけ取得したいって話じゃないの?
764デフォルトの名無しさん:01/10/15 01:38
HDDフォーマットしてWindows入れてVisualC++でデバッグ
766デフォルトの名無しさん:01/10/15 01:50
>>763
じゃぁ p obj.c_str() か p obj.data() か p obj.dat
他実装によりけり。

GVDはemacs support (gvd.el) あるみたいだねスマソ。
どうサポートしてくれんのかはしらんけど…。
767デフォルトの名無しさん:01/10/15 03:29
>>766
> じゃぁ p obj.c_str() か p obj.data() か p obj.dat
> 他実装によりけり。

ptype objでclassの定義見れる。
なぜ代入系演算子は継承されない言語仕様なのでしょうか。
分かる気もするけれど、整然とは理解できません。

どなたかご教授ください。
継承されてもあまり嬉しくないから。
スライシングになっちゃうでしょ。
771753:01/10/15 10:15
>>760
ごめん。std::stringっていたら文字列です。
>>771
> ごめん。std::stringっていたら文字列です。

俺は>>754じゃないから謝る必要ないけど、>>760でいいのかどうか、また書いてない…
>>763の想像にもお答えしてない。何もんなんだ、あんた。
773デフォルトの名無しさん:01/10/15 18:30
趣味プログラマです。ちょっと質問させてください。
GoF本の真似して、今までメンバ変数の頭を _dwMemberなどのように
_をつけて記述していました。しかし仕事でC++使ている友人に、それは
止めた方が良いと忠告されました。もちろん理由は教えてくれません(w

やはり何かまずいのでしょうか?
>>教えてくれません(w
あたりがネタっぽいが・・・

C/C++ではアンダースコア(_)で始まる名前は予約語とされている。
だから使わないほうがいい
775753:01/10/15 18:52
gdbでstringを表示させた事がある人なら何が問題か説明しなくてもわかると
思ったんだけどそうではなかったみたいですね。
余計な詮索させてしまって申し訳ない。
問題は色々あるけどstringの内部表現がNUL終端文字列ではないのが
一番大きいです。print コマンドの結果から読み取るのは困難です。
c_str()を呼ぶのはいい方法ですね。気が付きませんでした。
でも状態を変えてしまうので常に使える方法とはいえません。
GVDはよさそうですね。試してみます。皆さんありがとう。
776773:01/10/15 19:05
>>774
やぁ、ネタと紛らわしくてすいません。友人もよく分かってなかったんですよ。
なるほど予約語だったのですねぇ。ったくGoF本め、なんだってあんな…。
ハァ〜これから今まで書いた全部のコード置換します。レスありがとうございました。
777セックスショパン:01/10/15 19:55
くーれないーにそーまあたーーーーーーーーーこーのおーーれーをーーーーーーーーーー
まともな人が去っていくよ>777
置換する必要はないと思うけどな。
先頭のアンダースコアは現状では安全だと思う。
(問題出た人いる?)
アンダースコア2つで始めると危険だけど。
780773:01/10/15 20:59
>>779
レスどもです。ありゃそうなんですか?今どんなマクロなら確実に変換できるか
悩んでたところだったり。いちいちコンパイルして確認するの辛いなぁとか。
間違いなく良いソースでは無いのでしょうけど、そういうことなら今までのは放置しようかな。
先頭がアンダースコアの名前を使うプログラマがあまりに多いので
システム予約シンボルはアンダースコア2つで始めるという仕様になりました。
...なわけないけどまあそんな感じかな。
俺はアンダースコアで始まるメンバ変数をいろんな環境でかなりの間
使ってるけど今まで問題にあったことはない。
Qt(GUIライブラリ)でもそういう命名規則やってるよ。
そもそもアンダースコア使わなきゃ絶対OKってわけでもないしね。
たとえばSolarisならsunが定義済みだったり。
ま、問題が出たシンボル名だけ変更すればいいんでない?
>>779
たとえば FreeBSD のスタートアップルーチンだと _progname に実行ファイルの
名前が入るようになってるから、自分のプログラムで _progname なんてシンボル
を定義するとリンク時にはまると思われ。

>>780
問題ないなら、とりあえず放っておけば? ただ _ で始まるシンボルを使うことに
はリスクがある(メリットはあまりない)から、今後は避けるということで。
俺は
「_で始まる語はCの予約語」
「__で始まる語はC++の予約語」
と教わったが・・・。
>>775
なんだぁ、ついこの前オイラがぶちあたった
問題じゃないか。俺はそれを乗り越えて進化できたYO
MS的には識別子にはGUIDを織り交ぜる、か?

古く形骸化してるが、_で始まる名前はさけるのがよいでしょ。
>>783で言ってるのが本来のお約束。
786sa:01/10/15 22:23
てす、てす。
787773:01/10/15 22:33
みなさんありがとうございます。勉強になりました。知人に自慢しよっと。
お勧めに従い、今までのは問題が出ない限り放っておき、大丈夫そうですが今後は
一応_を避けていきたいと思います。これからはm_か〜、慣れるまで時間かかりそう。
788デフォルトの名無しさん:01/10/16 20:08
>>783
それはない
_で始まるのは処理系実装で使用される予約語、
__で始まるのはC++処理系で生成される予約語
って説をみたが。どうよ?
プログラミング言語C++第3版には_から始まるのは
予約語だぐらいしか書いてないが。
790デフォルトの名無しさん:01/10/16 21:15
C++極めていますとうそぶいてしまってC++の仕事がやってきました。
2週間の学習猶予をもらえたので
そのうちに出来るだけ身につけたいと思っています。
実際は『憂鬱な…』と『プログラミング言語C++第3版』
『CプログラマのためのC++入門』しか読んでいません。
Effective C++、More Effective C++は定評があるようなので
頑張って読めるだけ読もうと思います。
他に何かやっておいたほうが良いことはありますか?
どれをクラスにすれば良い、とかそう言う話は憂鬱な…だけで
身につけられるのでしょうか?

アドヴァイスください、助けてください。
とりあえずコード書け。
792デフォルトの名無しさん:01/10/16 21:19
>>790
exceptional C++ モナー。

っていうかさ、既存の(その仕事で使う)クラスライブラリの学習はしなくて平気なのか?
なんか一個作れ
794790 :01/10/16 21:23
既存のものではなく新規の作成です。
C言語馬鹿なのでとりあえず継承とかやってみようと思います。

どれをクラスにすれば良いかなんてのはどうやって学ぶのですか?
>>794
ふつうはOO関係の本を見て学びます

コンパイラの付録で付いてくるライブラリをみて、
どのレベルでクラスを作ればよいか調べてもいいと思うが...
二週間じゃその時間もないな
796792:01/10/16 21:28
>>794
いや俺が言ってるのはMFCとかQtとかXercesとかそういうモノの学習は?
ってことよ?

どれを〜 は憂鬱でいいんじゃないの?あとある程度書けたら(納期的に
あともどりできるうちに)、デザインパターン読むと、劇的にコード改良
できたりするよ。さいしょのうちは。
797794:01/10/16 21:31
デザインパターンってこれですか?

オブジェクト指向における再利用のためのデザインパターン 改訂版
ガンマ,エリック ヘルム,リチャード ジョンソン,ラルフ ブリシディース,ジョン
ソフトバンクパブリッシング (1999)ISBN:4797311126
デザパタは、慣れてからの方がいいかもね。
799792:01/10/16 21:34
>>797
それ。
800794:01/10/16 21:39
C++はCでいうK&Rスタイルのように
権威のある(一般的な)コーディングスタイルは存在しないのですか?
ネットで調べたところ、
メンバ関数にはm_をつけてClass名の始めは大文字 というのが多いみたいですが。
801792:01/10/16 21:45
ない。
おれはJava風に書く。m_ などつけない。

#MS系はともかく、UNIXでいろいろなライブラリ使ってるとスタイルの不統一
#の酷さでめまいがするよ。
>>801
クソな記法でも、信者を量産したもの勝ちだっていうのか?
おれはそんなの認めない。認めないんだ!
803794:01/10/16 22:03
Java style っていうのは
http://geosoft.no/style.html
ですね?

もし違うにしても、ここに書いてあるものが見やすいような気がする。
804792:01/10/16 22:05
>>802
どゆこと?
まさかハンガリアンマンセーとかいうんじゃないだろうな?
コーディングスタイルといえば、
なんでCって変数名 短くするの?
C++風に読める形にしたほうがいいのに。
806デフォルトの名無しさん:01/10/16 22:13
C言語は変数、関数名に文字数制限ある(きっと)からじゃない?
C++はないはず。
おれ、メンバ変数はint value_;とか後ろに_つけてるけど
これって変?
で、クラス名は大文字始まり、publicメソッドは大文字
始まり、protectedとprivateのメソッドは小文字始まり
の名前つけてます。
あと、STLとかもよっぽどで無い時以外はstd::つけてる。
>>807
それはオブジェクト指向的日常あたりの影響かい?
>>808
スマソ、それ知らない。
題名から察すると雑誌の連載かなんか?
後ろアンダーバーはC++FAQの影響。他は特になし。
810デフォルトの名無しさん:01/10/16 23:32
プログラミング作法ってC++載ってたよね。
そのスタイルに従うのがいいんじゃ。
811セックスショパン:01/10/17 00:29
僕は
変数は
int MyInt;
こんなかんじです。
そして
関数は
void MyFunc();
こんなかんじです。
そしてクラスは
class MyClass{
}
こんなかんじです。
そして定数は
const int MyConstInt=1;
こんなかんじです。
812セックスショパン:01/10/17 02:53
名スレの予感
813デフォルトの名無しさん:01/10/17 03:09
コーディングスタイルうんぬん言うのは本末転倒。
プログラミング言語がなんのために存在しているのか
分かっていない。そういうのを好みで速攻置換するために存在する。
とPerlマンにうそぶかれて鬱。
814デフォルトの名無しさん:01/10/17 15:57
はじめからC++やったひとは
やっぱプログラムの細かいところはあんまり詳しくないのかな。  
リスト構造とかスタックとかも作る必要ないし。
815デフォルトの名無しさん:01/10/17 19:16
憂鬱なプログラマのためのオブジェクト指向...についているCDに
収録されているソースコードがコンパイル出来ないのですが
何か他にソースが必要なのでしょうか。
最後の魔方陣の奴です。
環境はでびあん、コンパイラはG++つかいました。
>>815
g++ならたぶん答えられるからエラー貼ってみ?
817815:01/10/17 19:55
g++ *.cpp
/tmp/ccEH60BU.o: In function `Nummgr::delnum(int)':
/tmp/ccEH60BU.o(.text+0x0): multiple definition of `Nummgr::delnum(int)'
/tmp/ccLVnn4N.o(.text+0x18): first defined here
/tmp/ccEH60BU.o: In function `Nummgr::getmax(void)':
/tmp/ccEH60BU.o(.text+0x34): multiple definition of `Nummgr::getmax(void)'
/tmp/ccLVnn4N.o(.text+0x4c): first defined here
/tmp/ccKhIvO0.o: In function `Hline::setnextline(Hline *)':
/tmp/ccKhIvO0.o(.text+0x0): multiple definition of `Hline::setnextline(Hline *)'
/tmp/ccLVnn4N.o(.text+0x0): first defined here
/tmp/ccKhIvO0.o: In function `Nummgr::delnum(int)':
/tmp/ccKhIvO0.o(.text+0x18): multiple definition of `Nummgr::delnum(int)'
/tmp/ccLVnn4N.o(.text+0x18): first defined here
/tmp/ccKhIvO0.o: In function `Nummgr::getmax(void)':
/tmp/ccKhIvO0.o(.text+0x4c): multiple definition of `Nummgr::getmax(void)'
/tmp/ccLVnn4N.o(.text+0x4c): first defined here
/tmp/ccPqUxZt.o: In function `Nummgr::delnum(int)':
/tmp/ccPqUxZt.o(.text+0x0): multiple definition of `Nummgr::delnum(int)'
/tmp/ccLVnn4N.o(.text+0x18): first defined here
/tmp/ccPqUxZt.o: In function `Nummgr::getmax(void)':
/tmp/ccPqUxZt.o(.text+0x34): multiple definition of `Nummgr::getmax(void)'
/tmp/ccLVnn4N.o(.text+0x4c): first defined here
/tmp/ccXW5oU3.o: In function `Hline::setnextline(Hline *)':
/tmp/ccXW5oU3.o(.text+0x0): multiple definition of `Hline::setnextline(Hline *)'
/tmp/ccLVnn4N.o(.text+0x0): first defined here
/tmp/ccXW5oU3.o: In function `Nummgr::delnum(int)':
/tmp/ccXW5oU3.o(.text+0x18): multiple definition of `Nummgr::delnum(int)'
/tmp/ccLVnn4N.o(.text+0x18): first defined here
/tmp/ccXW5oU3.o: In function `Nummgr::getmax(void)':
/tmp/ccXW5oU3.o(.text+0x4c): multiple definition of `Nummgr::getmax(void)'
/tmp/ccLVnn4N.o(.text+0x4c): first defined here
/tmp/ccleMZxq.o: In function `Hline::setnextline(Hline *)':
/tmp/ccleMZxq.o(.text+0x0): multiple definition of `Hline::setnextline(Hline *)'
/tmp/ccLVnn4N.o(.text+0x0): first defined here
/tmp/ccleMZxq.o: In function `Nummgr::delnum(int)':
/tmp/ccleMZxq.o(.text+0x18): multiple definition of `Nummgr::delnum(int)'
/tmp/ccLVnn4N.o(.text+0x18): first defined here
/tmp/ccleMZxq.o: In function `Nummgr::getmax(void)':
/tmp/ccleMZxq.o(.text+0x4c): multiple definition of `Nummgr::getmax(void)'
/tmp/ccLVnn4N.o(.text+0x4c): first defined here
/tmp/ccIA7dYg.o: In function `Nummgr::delnum(int)':
/tmp/ccIA7dYg.o(.text+0x0): multiple definition of `Nummgr::delnum(int)'
/tmp/ccLVnn4N.o(.text+0x18): first defined here
/tmp/ccIA7dYg.o: In function `Nummgr::getmax(void)':
/tmp/ccIA7dYg.o(.text+0x34): multiple definition of `Nummgr::getmax(void)'
/tmp/ccLVnn4N.o(.text+0x4c): first defined here
collect2: ld returned 1 exit status
818816:01/10/17 20:09
憂鬱 はもっていないのでソースはみられないのだが、

>>817
.cpp から .cpp を #include してないかい?
819815:01/10/17 20:23
cppはインクルードされていません。
コード変換していないのがまずいのでしょうか。
CDに入っていたソースはウインドウズに合わせていて EUCにはなっていなかったのですが。
nkfで一気に変換する方法を知らないのでそのままコンパイルしたのですが。
820816:01/10/17 20:52
どこぞからソース貰ってきた。

> コード変換していないのがまずいのでしょうか。
コンパイルは通ってるからいまは問題ないです。

Nummgr.h と Hline.h で setnextline(),
getmax(), delnum() の実装が書かれていると
思うけど、 inline がついていないでしょ。
書けば通るよ。バグです。
821815:01/10/17 21:04
820様、
有難うございます。
付属のCDにもバグと言うものはあるのですね。
これもまた、課題の一つだったのかも知れませんが。
822SS:01/10/17 21:58
inline はC++版マクロと判断していいですか?
既に、C++版マクロはSTLと認定されておる。
824SS:01/10/17 22:20
>823
なんで?スタンダードテンプレートライブラリが?
825sage:01/10/17 22:27
>憂鬱な〜
この本てどこがいいの?斜め読みした感じいまいちというか全然
わからんのだけど。
普通の今時の入門書籍がJavaでやる類のことをC++でやったというだけか?
それだけまともなC++のOO本がないってこと。
OOよりもEffectiveC++のような落とし穴を解説した本の方が必須だしな。
827デフォルトの名無しさん:01/10/17 22:35
 「憂鬱な」は読んでいて新しい感覚を受けましたけど
最後に載ってるソースコードは読みにくかったです。特殊な書き方ですね。

あの本読んでも最後の演習がよくわからなかったのですが
これは私のおつむが弱いからですか?
あれが一番簡単なOO本なんですよね?
プログラミング言語C++にしてもEffectiveC++にしても
あぁいうスタンスではないだろうから他に頼るものが…。
828816:01/10/17 22:39
借りて読んだことがありますが、あの本は別にJava書きだろうが
Eiffel書きだろうが読む意味あるとおもいますがねえ。

>>825
具体的な書名は?
829:01/10/17 22:40
JAVA信者のいうことなんか気にするなよ
Javaが叩かれているのはど〜してなんでしょうね?ついていけない人?
831:01/10/17 22:44
javaでついていけないなんてことは有り得ない。
832デフォルトの名無しさん:01/10/17 22:46
>>827
> あの本読んでも最後の演習がよくわからなかったのですが
> これは私のおつむが弱いからですか?
自分の分析力を信じろ。君のクラス設計が世界で一番正しい。
833825:01/10/17 22:48
いまどき
C++ == OO
は無い。高レベルではgenericsやMSのCOM、低レベルでは組み込み
にOOを使う方法とか、C++のおいしい部分に関心無しにOOが欲しい
だけならC++で学習する意義は薄いと思うぞ。今はJavaやC#があるん
だからそっちで勉強した方がいいんじゃないの?
C++を中途半端に学習して消化不良になると時間の無駄だと思うが。

>>827
>プログラミング言語C++にしてもEffectiveC++にしても
>あぁいうスタンスではない

どのへんが? 後者はともかく前者は読んでないってこと?
>>831
君のHNあほの「あ」か
835:01/10/17 22:50
追加
java ごとき でついていけないなんてことはあってはならない。
>>835
がんばってね
837827:01/10/17 22:51
>> 833
いや、一応読みましたが全て通して読んではいません。
前半部分の機能説明の部分を辞書を引くようにして読んだ程度です。
そう言えば最後のほうに設計関係のことが欠いてあったような…
申し訳ない。
838:01/10/17 22:53
追追加
java 程度 でついていけなくなるのは 絶対に おかしい。
>>838
マジな話し、自分の使いやすい言語作れ。
840816:01/10/17 22:57
>>833
(激しく)同意。

が、Java入門書と銘打ったもので良いOO入門書あるなら教えてくれよ。
感銘を受けるほどのOO入門書って少ないと思うので。
>>837
プログラミング言語C++を設計入門として読むなら、先にピアソンの
「オブジェクト指向言語のはなし」を購入しておくことを勧めるw
841827:01/10/17 23:02
憂鬱→プログラミング言語C++
→Effective→More Effective
→デザインパターン→…

ですか?
842816:01/10/17 23:05
>>841
Moreは読まなくてもいいんじゃない?
843デフォルトの名無しさん:01/10/17 23:08
参考書よむ奴は努力を認めるが、3流
844:01/10/17 23:13
証明)
参考書は努力して読むものじゃない。参考にするものだ。
∴努力して読む奴=3流。
(証明終
>>843
手段は問わず。結果を出せれば良し。

参考書読まないのは構わんが、それでダサい設計をしたり余計なバグを
埋めたら銃殺。
846:01/10/17 23:22
ダサい設計というのは実に主観的であり、一概には決められないので845は却下。
847デフォルトの名無しさん:01/10/17 23:25
お前が一番ダサイということで終了な。
848:01/10/17 23:26
主観的なので847は銃殺のうえ却下。
そろそろ「あ」は放置プレイで行きましょう。
850:01/10/17 23:39
その前に根拠のある理由を述べてください。
851816:01/10/17 23:54
さぁ…
このスレ印刷して病院で聞いてみたら? >>850

きみがだれにも負けない一流の何かをもっているならそれは
おめでたいことだが、たとえその点で勝っていても、こんな
ところで意図不明(意味不明とは言っていない)の発言を繰
り返すような人間が健全と言えるか?ジジイになったときに
楽しい人生だったと思えるようにするために、やっておくべ
きことがもっと他に沢山あるんじゃないのか?
852816:01/10/17 23:54
なんちゃって。
853:01/10/17 23:58
>851
ネタにマジレスさんくす!あー釣れた釣れたおもしろかった。今度牛丼おごるよ。
854816:01/10/18 00:01
そうか、傷つけたお詫びに俺がおごるよ。特盛な。
まぁコピペだから気にすんな。
あほーん
856827:01/10/18 00:04
となると一流の人は実践で学ぶと言うことですね。
なるほど。当たり前と言えば当たり前のような気が。
私はどうも参考書だのみになってしまうので
永久に三流です。
今度なんか簡単なのを設計してみようと思います。
857:01/10/18 00:09
>856
そんなことはありません。世の中に”絶対”は無いのですから。
あが一流だということは絶対にありえない。
859デフォルトの名無しさん:01/10/18 02:54
new, delete のオーバーロードと同様にして
自動変数の確保される領域を自前で管理する方法はないでしょうか?
色々調べているのですが方法が見つかりません。どうかご教示ください。
860:01/10/18 02:56
>>859
なんでそんなことがしたいのかおしえて〜
861体育会系PG:01/10/18 02:58
>>856
参考書なんか読むな!
いきなりソースをにらむのだ!
読書百篇意自ずから通ず!
862859:01/10/18 03:03
>>860
new, delete のオーバーロードだと
うっかり delete を書き忘れた時にリークしてしまうので
スコープの最後で必ずデストラクタが呼ばれる
自動変数の形でこれらが記述できると便利かと思ったんです。
方法、あるでしょうか?
863:01/10/18 03:06
え、意味がわかんない。
かならずデストラクタが呼ばれるのだから、リークしない
(しないように書ける)じゃん。
864859:01/10/18 03:12
>>863
いえ、基本的には全部ヒープを自分で管理したいんです。
ただ、そのために new, delete のオーバーロードを使っていると
うっかり delete を書き忘れたときに困るので
見かけは自動変数で中身は自前ヒープ上に、という形にしたいんです。
なぜ自前でヒープ管理したいかと言えば
指定されたメモリ空間内だけで処理が行なわれるようにしたいからです。
ちょっと特殊なソフトを書いてまして・・・
仕事が絡んでるので申し訳ありませんが詳細は公開できません・・・
865:01/10/18 03:18
なるほど。
俺なら自動変数としてオブジェクト作成(Aとする)して、そいつに
newしたオブジェクト(Bとする)の参照渡して、Aがスコープはずれる
タイミングでBをdeleteするが、それでは駄目??

そんなことは結構やるなぁ。
866:01/10/18 03:20
>>865
>AがスコープはずれるタイミングでBをdeleteするが
自明だと思いますが、Aのデストラクタで、の意。
867859:01/10/18 03:22
>>865
それでもいいんですが
自動変数のデフォルトのメモリ制御を
オーバーロードあたり一発で済ませられれば
それが一番スマートかと思いまして。
placement new に似た自動変数の初期化構文があるだけでも
かなりすっきりとするんですが・・・。
>>867
グローバルにクラスをひとつ置いて、
コンストラクタとデストラクタで処理するのは?
std::auto_ptr ‥‥
870859:01/10/18 03:29
>>868
すいません。意味がよく分かりません・・・。

>>869
それ以外にないんでしょうか?
871デフォルトの名無しさん:01/10/18 03:33
Boehm GC..
872859:01/10/18 04:02
結局次のような処理で妥協することにしました。

void bar( void){
  simple_gc gc ;
  Foo* foo1 = new( gc) Foo ;
  Foo* foo2 = new( gc) Foo ;
  /* 処理 */
  // ここで gc がデストラクトされて foo1, foo2 もクリアされる。
}
873デフォルトの名無しさん:01/10/18 09:53
本質的じゃない質問で恐縮です。

いまどきのC++だと、
#include <stdio.h> → #include <cstdio>
ですが、↓これはどういう名前に換えれば良いのでしょう?

#include <sys/socket.h> →?
これはUNIX CのヘッダであってC++標準とは無関係>#include <sys/socket.h>
なので、どうしてもいまどきのスタイルに死体なら自分で<sys/socket.h>を
インクルードする"csocket"という名前のファイルでも作って標準includeパス
にぶちこんどけ。
そうすれば#include <csocket>で行ける。激しく無意味だが。
>>872
それって、自動変数に代入されるヒープ領域の管理であって、>>859
 自動変数の確保される領域を自前で管理する方法
なの?
本人納得なら別にどーでもいいことなんだけど。
>>874
イヤ過ぎる...
877デフォルトの名無しさん:01/10/18 12:38
>>873
extern "C" {
#include <sys/socket.h>
}
ちゃいますの? Stroustrup本の9.2.4見てねん。

# せんで大丈夫なのは、たまたまそういうlinkageの実装の時だけ。linkage的には本質。
878デフォルトの名無しさん:01/10/18 13:21
>>877
せんで大丈夫なのは、ヘッダファイル中に extern "C" が書かれている
からでしょう。ほとんどの場合。
879デフォルトの名無しさん:01/10/18 14:32
Franz Lisp-386をWindowsに、移植中です。
Compilerは、Borland C++を検討しましたが
諸問題を抱えるのでcygwinを導入してcomlileしようと
思うのですがcygwin窓の$はプロンプトですか?
gccは単なるCコンパイラーですか?
>思うのですがcygwin窓の$はプロンプトですか?
そうです。

>gccは単なるCコンパイラーですか?
そうです。
>>879
>諸問題を抱えるので
それはあなたです。
882デフォルトの名無しさん:01/10/18 15:13
>>879
> 諸問題を抱えるのでcygwinを導入してcomlileしようと

MinGWもいいよん。
http://www.ab.wakwak.com/~tino/windows/
痛い >>877
884デフォルトの名無しさん:01/10/18 20:11
C++を最短距離でみにつけたいのですが
どうすれば良いですか?
とりあえずプログラミング言語C++第3番のクラスのところからよみはじめましたが。
頭から読め
身に付けたいなら ひたすらコードを読んで変更して、その後書く事だな。
>>886
C++ だと、あるていどオブジェクト指向を分かってないと、既存のコードを読んでも (?_?)
となるかもしれず。
888884:01/10/19 11:36
コード読んで書くことですね。
プログラミング言語c++は全部読んでる余裕がないので
クラスのところから読み始めたんですが。
最初の方はたんなる紹介のような感じがしたので。
>>888
今までにオブジェクト指向言語の経験があるなら、
必要なところをかいつまんで読めばいいけど、
経験無しなら、プログラミング言語C++だけじゃ
つらいかも。
890884:01/10/19 11:58
憂鬱なプログラマのための・・・っていうのが
読みましたけど足りませんか?
プログラミング言語C++、K&Rのようなものを期待していたのですが
わかりにくいです。来週からC++の仕事が始まるというのに
891デフォルトの名無しさん:01/10/19 15:41
プログラミング言語C++の設計のところは抽象的過ぎるきらいがある
892デフォルトの名無しさん:01/10/19 16:08
本読みながらC++勉強中の厨房です。
C++が部品化とか再利用が利点とありますが、意味が良くわかりません。

例えば、あるクラスを自前で書いて、それにclass.h class.cpp
という名前で持ってたとして、ある日、別の似たような仕事で
そのクラスから派生させたクラスを作ればうまくいきそうだと
したとき、差分を書いたnewclass.hでclass.hをincludeして、
class.cppとnewclass.cppをリンクすれば再利用、C++って
ウマーってことになるんでしょうか(ハァ...なんか自分で書いてて鬱)

下らない質問でごめんなさい
893:01/10/19 16:28
>892
そのとおりです!

オブジェクト指向∋>>1の文

です!
>>892
部品化についてはEssentialCOMという本(のはじめの方)が簡単で良いです。
895デフォルトの名無しさん:01/10/20 12:27
text.txtから1行読むにはどうすればいいですかー!ウッウッ
>>895
気合いを入れる
897895:01/10/20 12:38
やっぱり改行コードを調べるのですか?あうち!
>>897 いや、まあ、1行読む方法は幾らでもあるんで
  コメントのしようがない。  Cの方法もそのまま使えるし
>>895
何も考えずにダブルクリックしてみろ!
一行と言わず何十行もまとめて読める。
900デフォルトの名無しさん:01/10/20 13:41
いまどきの初心者ならSTL使ってみろ!
string line_buf;
ifstream file("text.txt");
getline(file, line_buf);

こんなクソコード書いていいのは初心者のうちだけだぞ!
901デフォルトの名無しさん:01/10/21 00:17
VCで次のコードがとおらないのですが
何故ですか?
stringが定義されていないと出ます。


#include <string>

int main()
{
string str;

return 0;
}
std::string str;
903:01/10/21 00:21
>901
namespace std{
#include<string>
int main()
{
string str;

return 0;
}
}
または、
using namespace std;

何のことかわからないなら「名前空間」を調べてみよう。
905:01/10/21 00:28
>1
安全にネームスペースを使うにはこうする。
プロの開発現場ではよく使われる手法。

#include<string>
namespace std{
string str;
}
int main() {
std::str="1";
return 0;


}
906デフォルトの名無しさん:01/10/21 00:30
stdって標準でusing namespaceされてるんじゃありませんでしたっけ?
違いますか?
プログラミング言語C++にもそう書いてありますが。
907:01/10/21 00:31
>906
大嘘。なんていう本ですか。
908901:01/10/21 00:33
printfは名前区間を指定しなくても動くのは何故ですか?
909:01/10/21 00:36
printfはC++の予約語だからです。
910デフォルトの名無しさん:01/10/21 00:40
>>909
嘘だよ。

#include <iostream.h> とか #include <stdio.h>

と、

#include <iostream> とか #include <string>

などの違いを調べてみるのも吉かと。
911:01/10/21 00:45
C++の標準ではヘッダ名に後ろにhがつきません。
.hはC言語時代の名残です。
なんか、散々偉そうだったけど、底が見えちゃった感じだねえ。
誰とは言わないが。
913:01/10/21 00:49
>912
ワラタ
激しく同意
>>913
909にワラタ。おれも。
915デフォルトの名無しさん:01/10/21 01:10
Danaのgrep最強なんたげと
拡張子ないと開かないんだよね・・
916デフォルトの名無しさん:01/10/21 01:12
string型に
int 型2つをセットするにはどのようにすれば良いのですか?
stringの使い方のページが見当たらなくて。
ワケワカラン
918:01/10/21 01:17
>916
string a,b,c;
char buf[10];
int d,e;

itoa(d,buf,10);
b=buf.
itoa(e,buf,10);
c=buf.

a=b+","+c;

多分違うと思うけど
919デフォルトの名無しさん:01/10/21 01:18
string str;
int a = 1;
int b = 2;
// これをStringにセット

cout<<string.c_str();

-out put-
1 2
920デフォルトの名無しさん:01/10/21 08:32
C++でマルチスレッドってどうやりますか?
>>920
環境依存。
pthreadライブラリを探せ
923920:01/10/21 15:21
C++のマルチスレッドが環境依存とは正直驚いた。
標準じゃないのね。Javaだって標準なのに。
>>923
Java以外に標準でスレッドインタフェースを持ってるものを考えてみ。
925デフォルトの名無しさん:01/10/21 15:29
>>923
Cも標準じゃないよ。POSIX環境ならCもpthreadも両方定義しているけど。
ISOやJISになっているくらいメジャーな言語でマルチタスク/スレッドが標準なのって、
Adaくらいじゃないの?

> Javaだって標準なのに。

「だって」って、Javaはmulti-plathomeでの道具の豊富さは他の追従を許さないよ。
// performanceとか、他に問題はかかえているけど。
926デフォルトの名無しさん:01/10/21 15:43
2次配列を使わなくてはいけないレベルに達しました。

ここで、
char buf[2][64];
などとしたはいいんですが、
関数の宣言部でこれを引数で使いたいとき、
int functionA(...... ,buf[2][64]);
とやっていいものでしょうか?こんなの見たことありません。
int functionA(...... ,buf[][]);
ですか?それとも、
int funcitonA(...... ,**buf);
でしょうか、わかりません。お助けください。
>>923
マルチスレッドをサポートしないJavaプラットフォームも実在しますが、何か?
int functionA(..., buf[][64])
929sage:01/10/21 15:55
>>927
そうなのか。
以下はそれがホントだとして書いてみる。

javaはどうせ廃れると思って見てなかったけど、駄目さ加減を知るために
いっちょやってみるか。

CやC++でマルチスレッドがサポートが標準で言語仕様にないのは、
これらの言語がアセンブラの延長として考案、拡張されてきたからだろうね。

アセンブラのニモニックレベルでマルチスレッド(というか同期処理)を処理する
CPUが20年以上前に作られていたら、Cの言語仕様にも組み込まれて
いただろうに..
930デフォルトの名無しさん:01/10/21 16:05
>>926
926の一番上のものでOK。
928ももちろん正解。
931デフォルトの名無しさん:01/10/21 16:07
>>925
>Javaはmulti-plathomeでの道具の豊富さは他の追従を許さないよ。

あれは既得権益というのです。
932デフォルトの名無しさん:01/10/21 16:09
>>926
コンパイラによっては一次元配列以外バグコード出すのもあり。
うーん、基本的に2次元でもなんでも配列は
単なる文字列ということで知識を深めていますから、
**bufで行こうかとも思いますが、それでもバグコード
が出るのだったら厄介ですーーーナ

さんくす>>932
やっぱ、宣言をchar **bufにした場合、
関数に渡す前にmallocやらをしないと怒られるかな・・・
935デフォルトの名無しさん:01/10/21 17:17
いろいろ見て回ったんですが、
char **argvの場合
argvとargcはたいてい組みでつかいますか?
argc使わなくてもごり押しでいけますか?
7割くらいわかってるつもりなんですけど。。
使わなくてもいいし、ごり押しでもいいよ。

でもその前に getopt を覚えろ。
そしてそれ以前にスレ違いであることを反省しろ。
937デフォルトの名無しさん:01/10/21 17:23
わかりました。これからは多分スレは選ぼうと思います。
ありがとうございます。>>936
938sage:01/10/21 23:56
stl の vector (じゃなくてもいいけど)をつかった動的な配列で質問。

・要素内容:可変長buffer(malloc したbufferみたいな)
・要素数:可変
の配列って、どうつくるのですか?

vec[i] = new buf(size);
みたいにやれば、vec の消滅とともに思いっきり
メモリリークしそうだし。
auto_ptr するのも面倒だし。
第一、vector の要素に auto_ptr の pointer 入れた場合って、
auto_ptr のデコンストラクタがちゃんと呼び出されることが
「保証」されてるのですか?


みたいなのって、
939sage:01/10/21 23:57
最後の一行、ゴミです。無視してください。スマソ。
940sage:01/10/21 23:59
typedef vector<sage> variable_length_buffer;
std::vector<variable_length_buffer> hoge;

貴様にauto_ptrはまだ早い。
ついでにsageはコテハンじゃ。
1.可変長バッファを管理するclassを作る。
2.それをvectorに格納。

可変長バッファの用途が文字列ならstd::string。
>>938
std::vector< std::string > 可変長バッファの可変長配列
std::stringは文字列じゃなくても利用できるっす(\0が途中にあっても関係ない)。

>第一、vector の要素に auto_ptr の pointer 入れた場合って、
>auto_ptr のデコンストラクタがちゃんと呼び出されることが
>「保証」されてるのですか?
保障されるっす。デバッガで追いかけるとわかる。
でも以下のコードはメモリ漏れるので注意。
{
 std::auto_ptr<char> p = new char[100];
}
auto_ptrのデストラクタはdelete[]ではなくdeleteなので。
なんと!
string 型でいいのか。すげぇ!これなら俺でもわかります。

> std::vector<variable_length_buffer> hoge;

hoge[0] = "variable_length_data";
・・・・・・
hoge[0] = "change_to_more_and_more_long_lenght_data";

みたいにできるのかな?
やってみよう・・・。
944943:01/10/22 01:20
あ、オオボケなレスしちゃった。
943 で聞きたかったのは、
940 さんみたいにやったばあい、そのやりかただと、
variable_length_buffer[] の要素が、charの配列みたいに、
メモリ上に連続で並んでいることが保証されてないとヤバくない?
ってことです。
もちろん、vector は普通は単なる配列として実装されてるので、
実際問題としては動くとは思いますが。
945デフォルトの名無しさん:01/10/22 09:40
plathomeっていう単語は造語ですか?
platformと思っていたのですが、コンピュータ関係ではplathomeでOKですか?
いや、マジで聞いてます。
946デフォルトの名無しさん:01/10/22 10:08
>>945
私も数年前までは何気に「ぷらっとほーむ」と発音してましたが
plathome という英単語は存在しない模様
「がいしゅつ」と同類かと

google で検索してみると,ヒットするのは殆ど日本語サイトでした・・・
ってのはぷらっとホーム株式会社(plathome.co.jp)がヒットしたからなんだけど,
そうでなくても間違って憶えている人は多いみたいっすね

ちなみに「ぷらっとホーム」は Plat'Home と表記して欲しいみたいです
947946:01/10/22 10:16
・・じゃなくて,945 はわりとスレ違いな気がしてきたけどいいや

・・じゃなくて,私も質問っす
BCB や VC++ では「プロパティ」てな概念が存在します
変数に代入したり変数を参照するような文を書くだけで
特定の関数を呼び出せるようなやし
具体的には BCB なら __property キーワード,VC++ なら
__declspec(property()) っすよね

他の C++ コンパイラではどうなんでしょうか?
テンプレートとクラスである程度似たようなことはできるけど,
さすがに限界もあるわけだし

あと,プロパティは C++ 的にどれくらい嫌われてますか(わらぃ
9483文字回答:01/10/22 12:39
>>946
COM
949946:01/10/22 14:17
>>948
3文字レスどうもです
そうっすね、BCB や VC++ なんかは COM のおかげで
「プロパティ」の概念の必要性が出てきたわけで

ということは、標準的にはどのコンパイラも __property みたいな
機能を備えている保証はないし、
特にこれから搭載される予定もなさそうだ〜、ということで
オッケーっすか

# ていうかずっと __property に甘えたコード書いてました(ゎらぇなぃ
950948:01/10/22 14:53
じゃあ2文字回答で。
「C#」
Delphiつーのは無しな。
>>943
std::vectorは operator[] を持ってます。持ってないと[]での
アクセスはできないので。

まぁ、libstdc++では、仰る通り
reference operator[](size_type __n) { return *(begin() + __n); }
const_reference operator[](size_type __n) const { return *(begin() + __n); }
となってますけんど。
つうと、やっぱ、
memcpy( &vec[0], pBufSrc, vec[0].size() );
みたいなのは、
実際には動くだろうけど、
厳密にはSTLのインプリメントに依存すると
考えてOKですか?
あ、訂正。
vec[0].resize(pBufSrc.len);
memcpy( &vec[0], pBufSrc.dat, vec[0].size() );
みたいなの。
ようは、vec[0] に入っているはずの可変長バッファに
STLでも何でもない普通のバイナリデータを転送する、とか。
Cだと、malloc したバッファへのポインタを要素とする配列を用意して、、
とかやんなきゃいけない場合を、STLできれいに書きたいのです。
954データ抽象マンセー:01/10/22 21:04
>>953
#include <algorithm>
string& buffer = vec[0].resize(pBufSrc.len);
std::copy((char*)(pBufSrc.dat), (char*)(pBufSrc.dat) + pBufSrc.len, buffer.begin());
こんなん? Cからの移行組は一旦実装はスカッと忘れなさい。でなきゃ悟れない
955デフォルトの名無しさん:01/10/22 23:56
enum型って 普通の演算子使えないのでしょうか。

m += n; // 両方ともEnum型

この演算子に適切な方への変換定義を行いません
というエラーが出るのですが
enumって初期化時以外左辺値にはできないような。
957デフォルトの名無しさん:01/10/23 01:23
>>956
そりゃenumのメンバ自身のことやん。

>>955がエラーになる理由は、
「enumはintに自動変換されるが、intからenumには暗黙に変換されない」ということでしょう。

たとえば enum foo {A,B,C} m, n; という変数m,nがあるとして、
m = m + n; はコンパイル通らない。右辺が最終的にint型だから。しかし
m = (foo)(m + n); なら通る。これは実際には
m = (foo)((int)m + (int)n); と同じこと(それが望んだ結果かどうかは別)。
>>954
STLはコンテナばっかり使ってるわ。
真っ当にもう一度勉強して悟ろう。
このスレに集う皆様へ。
そろそろ次スレを立てたいのですが、1に書くべき文面はいかがいたしましょう。
また2〜3あたりに貼り付ける、おすすめリンク等ございましたら、ご教示ください。
>>959
こんな感じでどうですか。

【スレタイトル】
C++相談室 Part3

【1の本文】
OS/環境に依存しないC++の話題。STLも可、むしろ歓迎。
前スレ http://piza2.2ch.net/test/read.cgi/tech/996640937/
C++参考リンクは>>2を参照のこと。
>>959
こんな感じでどうですか。

【スレタイトル】
C++相談室 Part3

【1の本文】
OS/環境に依存するC++の話題。STLも可、むしろ必須。
前スレ http://piza2.2ch.net/test/read.cgi/tech/996640937/
C++参考リンクは>>2を参照のこと。
963962:01/10/23 14:34
ついでに

割と詳しい入門ページ
http://www.d1.dion.ne.jp/~ecb/cpp/cpp00.html
FILEとfstream。あなたならどっち?
965分かりません。:01/10/23 19:02
参照を戻り値にする場合は
一体なにが戻ってきているのですか?
例えば
strtype& operator+(strtype& ob);
のような関数の場合、戻ってくるのは
一時オブジェクトではなく、何なのですか?
966965:01/10/23 19:08
このプログラムはなぜかメモリがおかしくなるみたいです。
突然ですいませんが、どうやら根本的なところが分かってないみたいです。

#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;

class strtype{
char* p;
int len;
public:
strtype(){*p='\0';len=0;}
strtype(char* s){
len=strlen(s)+1;
p=new char[len];
if(!p){
cout<<"メモリが確保できません"<<endl;
exit(1);
}
strcpy(p,s);
}
~strtype(){
cout<<"メモリ解放:"<<(unsigned)p<<endl;
delete [] p;
}
char* get(){return p;}
// strtype(const strtype &ob);
strtype& operator+(strtype& ob);
}:
strtype& strtype::operator+(strtype& ob)
{
int l;
l=len+ob.len+1;
strtype temp;
temp.len=l;
temp.p=new char [l];
strcpy(temp.p,p);
cout<<temp.p<<endl;
strcat(temp.p,ob.p);
cout<<temp.p<<endl;
cout<<(unsigned)temp.p<<endl;

return temp;
}
int main()
{
strtype ob1("Hello!"),ob2("Good-bye");
cout<<"ob1:"<<ob1.get()<<' '<<"ob2:"<<ob2.get()<<endl;
cout<<"ob1とob2を連結すると--->"<<(ob1+ob2).get()<<endl;
     return 0;
}
まず
strtype(){*p='\0';len=0;}
968965:01/10/23 19:16
>>967
ありがとうございます。
どの変がおかしいのでしょうか?
>>959
C++ Final Draft International Standard
http://www.kuzbass.ru/docs/isocpp/
970965:01/10/23 19:27
参照を返すというのはどういうことなのかな?
>968 領域を確保してない。
973965:01/10/23 19:38
>>972
ありがとうございます。
あの部分は変更したのですが、
まだうまくいかないみたいです。
ちなみに
strtype(){;}
↑こうしました。

あのプログラムは
return tempのところに問題があるみたいなんですが。
>954 さん

いまやってるのは、
あるAPIの戻り値である不定長の要素をふんだんに持つ構造体、
ってのがあって、

struct out_t {
unsigned int type;
unsigned int len1;
unsigned char dat1[len1]; // ほんとはこんな書き方はNG
unsigndd int len2;
unsigned char dat2[len2:
};
result_t call_api(key1_t key1, key2_t key2, out_t& out);
for_each(key1, key2) { // ほんとはこんな書き方はない。
result = call_api(key1, key2, out[next++]);
}

それをkey1, key2 の組み合わせ毎にメモリに格納する。
key1 は、ファイルから読み込む。
key2 は、あるルールで範囲を決定してループで作ればよし。
・・っていうやつなんですけど、
もうすでにCで完成してます。すごく汚いコードですけど。(笑い)。
しかし。突然の仕様変更で、
key1 の方は、あるルールでソートしてメモリに格納する。
さらに、out_t もふくめ、全体を、シリアライズしてセーブ。
(二回目以降の読み込みの高速化のため。emacs の dump と同じ)
・・・とかになったもので、
いっきにC++とSTLで書き直したれ!とかなったんですが。

std::map< key1_t, std::vector< std::vector<out_t> > > gOutlist;

とかやってもダメっす。
(正確には、コンパイルは通るけど、使い方がわからん)
ろーかるなオブジェクトを返してmp、抜けた時点ではじゃ胃されるや炉。
Effective C++の29校も読むと世濾紙
新スレに移行せよ。諸君
977965:01/10/23 20:24
一応解決しました。
関数内で定義した変数は参照で戻せないみたいです。
コピーコンストラクタをつくって、一時オブジェクトで
もどしたらできました。
それからやはり最初のstrtype(){*p='\0';len=0;} がまずかった
みたいです。
ありがとうございます。
これで心置きなく新スレに以降
979974:01/10/24 00:13
新スレのまえに、オイラにお助けを。
980キリ番ゲッター:01/10/26 18:54
1000間近スレッド発見
981キリ番ゲッター:01/10/26 18:55
1000狙うからな
邪魔するなよ>ALL
982キリ番ゲッター:01/10/26 18:55
俺様が1000とったら
ウラビデオさしあげます
983キリ番ゲッター:01/10/26 18:56
984キリ番ゲッター:01/10/26 18:56
邪魔したら
もらえなくなるんで

注意!!!!
985キリ番ゲッター:01/10/26 18:57
1000ほしい
お願い

くださいな
986キリ番ゲッター:01/10/26 18:57
邪魔するんじゃ ねーーーーーーーーーーーーぞ


baka
987キリ番ゲッター:01/10/26 18:58
つーか

プログラマー=きちがい
988キリ番ゲッター:01/10/26 18:59
大リーグって いつからやるん??????


hehehe
989キリ番ゲッター:01/10/26 18:59
くそ−−−−−−1000の道が 遠すぎる

お前らも 手伝え
990キリ番ゲッター:01/10/26 19:00
邪魔をとるか

おまんちょ丸見えビデオをとるか   よーーーーーく考えろ
991キリ番ゲッター:01/10/26 19:00



0GET  だよーん
992キリ番ゲッター:01/10/26 19:01
タリバンなかなか つぶれない


しぶといなあああああ
>>キリ番ゲッター

サム
994キリ番ゲッター:01/10/26 19:01
おおおお
お前のような

邪魔者は

去れ
995キリ番ゲッター:01/10/26 19:02
くそ!!!!!!!!!
なんで
邪魔するんだーーーーーーーーーーーーー 氏ね>>993
996キリ番ゲッター:01/10/26 19:03
いいか、1000GETの
邪魔するんじゃ

ねーーーーーーーーーぞ!!!
997キリ番ゲッター:01/10/26 19:03
FUCK YOU!!!!!!!!


氏ね〜〜〜〜〜〜〜〜〜!!!!!!>ALL
998キリ番ゲッター:01/10/26 19:03
もうすぐだ!!!!!  ぜったい1000取るよ
>>キリ番ゲッター

オソ
1000キリ番ゲッター:01/10/26 19:04
1000 is very good


ははははっはははははh
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。