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


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

C++相談室 part9
751 名前:デフォルトの名無しさん :02/08/10 00:43
>>750
メンバにする必要ある?

752 名前:744 :02/08/10 01:00
>>751
もし新規に文字列クラスを設計するという話なら、メンバ関数にする内容だろう。
ただ std::string を拡張しようって話なら、

「やめとけ」

と思うけど。あと CString っつー名前も MFC, WTL と重複するから、避けた方が
良いかもしれん。

753 名前:731 :02/08/10 01:08
訂正:やはり、sscanfにはfloatしか渡せないみたい。
結論:標準の 文字列->倍精度浮動小数 の精度には疑問が残った。

#include<stdio.h>
#include<iostream>
#include<sstream>

int main()
{
double dResult;float fResult;char buf[255];
std::cout << "original data:" << "200.123456789012" << std::endl;
sprintf(buf,"%f",(200.123456789012));
sscanf(buf,"%f",&fResult);
sscanf(buf,"%f",&dResult);
std::cout << fResult << std::endl;
std::cout << dResult << std::endl;
printf("%.15g\n",fResult);
printf("%.15g\n",dResult);

sscanf(buf,"%.15g",&fResult);
sscanf(buf,"%.15g",&dResult);
std::cout << fResult << std::endl;
std::cout << dResult << std::endl;
printf("%.15g\n",fResult);
printf("%.15g\n",dResult);

std::cout << "strtod" << std::endl;
char *stopstring;
double dResult2 = strtod(buf,&stopstring);
std::cout << dResult2 << std::endl;
printf("%.15g\n",dResult2);

std::cout << "atof" << std::endl;
double dResult3 = atof(buf);
std::cout << dResult3 << std::endl;
printf("%.15g\n",dResult3);

std::cout << "stringstream" << std::endl;
double dResult4;
std::stringstream stream;
stream << buf;
stream >> dResult4;
printf("%.15g",dResult4);

double Test = 200123456789012;//地道に変換したことを考える。
Test *= 1E-12;
printf("%.15g\n",Test);//これぐらいの精度は欲しい。
}

754 名前:デフォルトの名無しさん :02/08/10 01:14
>>753
そのsscanf()の使い方、間違ってるって。
MSDN読めよ。


755 名前:デフォルトの名無しさん :02/08/10 01:18
>>753
こんなに時間かけて、その結論かよ…
早く寝ろ。

756 名前:デフォルトの名無しさん :02/08/10 01:21
>>753
ネタ?

757 名前:デフォルトの名無しさん :02/08/10 01:23
"%lf"?

758 名前:デフォルトの名無しさん :02/08/10 01:35
sscanf(buf,"%lf",&dResult);
sscanf(buf,"%l.15g",&dResult);



759 名前:730 :02/08/10 01:39
>>751>>752
というと、ネームスペースレベルの関数にしたほうがいいってことですか?

それはそれとして、最初の質問に戻りますけど『仮想デストラクタのない
クラスからpublic継承したい』場合って、>>730>>742以外に、クラス設計で
注意すべき点ってありますかね?

760 名前:デフォルトの名無しさん :02/08/10 01:46
>>759
すまん、俺あんま分かってないんだと思うけど、仮想デストラクタの無い
クラスを継承することに関する問題と、それがpublic継承/private継承である
ということと、なんか関係あるの?
単に、delete時に導出クラスのデストラクタが呼ばれないだけじゃないの?


761 名前:デフォルトの名無しさん :02/08/10 01:53
永レスごめん
class TreeObj3D
{
public:
int Obj;
TreeObj3D *pParent;
TreeObj3D **pChild;
DWORD ChildNum;
DWORD size;
TreeObj3D();
virtual ~TreeObj3D();

TreeObj3D &operator [](DWORD n){return(**(pChild+n));}

void addChild(int aObj);
void del();
};
typedef class TreeObj3D TREEOBJ3D,FAR *LPTREEOBJ3D;
void PrTree(TreeObj3D a,DWORD n,DWORD u,DWORD v,DWORD w,BOOL b)
{
char str[8];
int i;
if(b)
{
cout<<" ";
for(i=0;i<n-1;i++)
{
cout<<" ";
/* if(v&(DWORD)pow(2,i)) cout<<" | ";
else*/ cout<<" ";
}
cout<<"---";
}
if(u&&a.pParent!=NULL&&w==a.pParent->ChildNum-1) v&=~u;
//if(u) v&=~u;
wsprintf(str,"%03d",a.Obj);
cout<<str;
if(a.ChildNum) cout<<"---";
if(a.pParent!=NULL&&a.pParent->ChildNum) v|=(DWORD)pow(2,n-1);
for(i=0;i<a.ChildNum;i++)
{
if(a.pParent!=NULL&&w==a.pParent->ChildNum-1) u|=(DWORD)pow(2,n-1);
if(i==0) PrTree(**(a.pChild+i),n+1,u,v,i,FALSE);
else PrTree(**(a.pChild+i),n+1,u,v,i,TRUE);
}
if(!a.ChildNum) cout<<endl;
}
PrTree()で木構造を表示するんですが
親→子へ引っぱる"|"を入れるのがむずくて困ってます
"-"は出来たんですが・・・
誰か助けてくり




762 名前:761 :02/08/10 01:57
あれTABは駄目かと思って半角スペースでインデント入れたのに
なってくれない・・・
見にくくてごめん


763 名前:デフォルトの名無しさん :02/08/10 01:58
lines(n)=replace(lines(n),"""",chr(93)+chr(45)+chr(93))

764 名前:744 :02/08/10 02:01
>>759
> 『仮想デストラクタのないクラスからpublic継承したい』
だから、するなよ……。

765 名前:デフォルトの名無しさん :02/08/10 02:15
vectorって自己参照ポインタ使えないんですか?
VC5.0だと使えなかったので木構造を自力で実装しましたでふ

2重カキコとか出るし・・・


766 名前:730 :02/08/10 02:18
>>760
『単に』って、それが問題だから相談してるんですが。

>>764
じゃあ、これをpublic継承以外でエレガントに解決する方法を教えてください。

namespace {
  typedef void (*FUNC)(void);
  class CTable :
    public map<string,FUNC>
  {
  public:
    CTable(){
      (*this)["hoge"] = &Hoge;
      (*this)["sage"] = &Sage;
      (*this)["moge"] = &Moge;
      (*this)["hage"] = &Hage;
    }
  };
}

void foo(const string& str){
  static CTable table;
  // tableをいろいろ使う。省略。
}

767 名前:デフォルトの名無しさん :02/08/10 02:20
>>766
> じゃあ、これをpublic継承以外でエレガントに解決する方法を教えてください。
要求仕様を明記してくれ。コードだけ見ても、意図するところが分からん。

768 名前:デフォルトの名無しさん :02/08/10 02:22
730 は何でこんなに態度がでかいの?(w

っつか、質問する側が喧嘩を売ってどうするよ。

769 名前:デフォルトの名無しさん :02/08/10 02:30
CStringクラスのデストラクタで何か解放しなければならないものがあるの?

770 名前:デフォルトの名無しさん :02/08/10 02:37
>>769
横から口を挟むのも何ですが、
最低でも文字列解放しなきゃメモリリークなんじゃ・・・!?
ようしらんけどデストラクタでfree()してるんじゃないの?


771 名前:デフォルトの名無しさん :02/08/10 02:38
>>770
何か勘違いをしていると思われ

772 名前:名無しさん :02/08/10 02:38
DirectShowについて詳しく書かれた本おしえて

773 名前:デフォルトの名無しさん :02/08/10 02:39
文字列ってstringのバッファをそのまま利用してるんじゃ
なかったのか・・。

774 名前:デフォルトの名無しさん :02/08/10 02:39
>>772
マイクロソフトのチュートリアルが詳しい&&易しい

775 名前:770 :02/08/10 02:42
CStringってリサイズできなかったけ?
出来るんならメモリ確保してるんじゃないの


776 名前:デフォルトの名無しさん :02/08/10 02:42
>>770
それじゃぁstd::stringの出番なさそうじゃん。

777 名前:デフォルトの名無しさん :02/08/10 02:43
やっぱりCStringっていう名前がよくない(w

778 名前:デフォルトの名無しさん :02/08/10 02:44
>>775
ちなみに、ここでいっているCStringは、一般的なものではないみたいです

779 名前:770 :02/08/10 02:46
>>778
そーですか
過去レス見てないのでごめんなちゃい


780 名前:デフォルトの名無しさん :02/08/10 02:57
>>730
別に仮想デストラクタでなくてもパブリック継承すること自体は
問題ないと思うがね。しなくてもかまわないこともあるしな。
implemented-usingだと多態はまずいからprotectedやprivateに
するだろうな
今回はメンバ関数を増やしたいだけだから何の問題もなかろう
概念的包括も問題ないから混乱しないだろうし

781 名前:780 :02/08/10 03:01
二行目>“仮想デストラクタに”しなくてもかまわないこともあるしな。


782 名前:デフォルトの名無しさん :02/08/10 03:05
>>780
同意ですなぁ。日本語処理用になんか変なメンバを追加してなけりゃ。

783 名前:770 :02/08/10 03:12
過去レス斜め読み

std::stringをpublicメンバで持たせるとか
短絡過ぎ?


784 名前:デフォルトの名無しさん :02/08/10 03:18
>>783
面白いが、730は激しく嫌がりそうだ。

785 名前:デフォルトの名無しさん :02/08/10 03:18
>>783
既出。というか、俺もその方が良いと思うけど。

786 名前:デフォルトの名無しさん :02/08/10 03:21
.演算子をオーバーロードできればよかったのにな。

787 名前:デフォルトの名無しさん :02/08/10 03:21
チームでやってなきゃ隠蔽なんてどーでもイイしね
あなだらけ(w



788 名前:785 :02/08/10 03:21
ごめん、ボケをかました。

789 名前:デフォルトの名無しさん :02/08/10 03:27
>>786
そんなことができたら、何を信じて生きていけばいいかが分からなくなるw

790 名前:デフォルトの名無しさん :02/08/10 03:28
オーバーロードできても新しいメンバ呼出せなくなるからどのみち駄目か。

791 名前:デフォルトの名無しさん :02/08/10 03:30
>>786
継承だけでなく、委譲のサポートがあれば良かったとは思うが。private 継承して
メンバ関数全て using すりゃ良いんだが、面倒だよねぇ。

792 名前:デフォルトの名無しさん :02/08/10 03:33
>>791
リファレンスヘルプからusingをオートマで吐き出すツール作ったら売れるかな?
結構簡単そう

793 名前:デフォルトの名無しさん :02/08/10 03:40
>>792
売れないと思う。

---
#include <string>
class MyString : deletgate std::string {};
---

とか書いておくと、適当なヘッダを出力してくれるツールならともかく。

……これって名前空間やらテンプレートやらへの対応を考えると、フルスペックの
C++ パーサ書く必要があるな。

794 名前:792 :02/08/10 03:43
UMLみたいにちょこっとのスケルトンなら簡単なんじゃない?
こんなの誰でも作れるか・・・


795 名前:730 :02/08/10 10:55
>>767
では、>>766を踏まえて要求仕様を。
やりたいことを簡単に説明すると、switch分岐の、動的な変更です。
fooに文字列"hoge"が渡されたら、関数ポインタ経由でHoge()を呼び出します。
fooに文字列"sage"が渡されたら、関数ポインタ経由でSage()を呼び出します。
fooに未知の文字列が渡されたら、例外を出すなどのエラー処理をします。
『この文字列ならこの関数を呼び出す』というペアのいくつかはコンパイル時に
決定していますが、実行時に新たなペアが増える場合もありますし、
減る場合もあります。
『現時点で、ここには分岐できるが、ここには分岐できない』といった動的な情報は、
プログラム全体でひとつしかありません。
そういう状況です。それを達成するのに最もエレガントなコードが、>>766
のコードのつもりです。
・動的な分岐はmapの連想配列でこなす。
・ひとつしかない動的な情報は、ローカルstaticオブジェクトが保有。
・コンパイル時に決定されているペアは、オブジェクトのコンストラクタで入力。
という方針です。
もし、More Effective C++ を持ってるんでしたら、項目31を参照してください。
同じようなことをやってあります(ただし、あっちは絶対にpublic継承を
やりたくないのか、面倒な手段で実現してあります)。

>>780-782
C++3rdを持っていないのでEffective C++ からの引用ですが、
『C++標準規格は、この点について極めて明確に述べている。
基底クラスのポインタを介して派生クラスのオブジェクトを削除しようと
するとき、その基底クラスに仮想でないデストラクタがあると、
その結果は不定となる』
だそうです。プログラマとしての直感から言えば、たしかに、派生クラスで
メンバを追加してなくてデストラクタで何もしてないんなら、正常に
動いてくれそうな予感はします。けど、そういった条件は全く書かれずに
『不定』だと書いてあるんですから、やっちゃいけないというか、
『やれないようにクラス設計する覚悟がなければpublic継承してはいけない』
んではないでしょうか。

796 名前:デフォルトの名無しさん :02/08/10 11:50
>>795
分岐フラグに文字列そのものを使っている時点であまりエレガントだとはおもわんが。


797 名前:デフォルトの名無しさん :02/08/10 12:02
>>795
「基底クラスのポインタを介して派生クラスのオブジェクトを削除」しようとしなければ、問題ない。
よって766のコードは問題ない。
stringから派生した新たな文字列クラスを作ってみたところで、mapに入るのは派生クラスではなくstringであるから、何ら問題ない。
・・・という回答で良いの?

798 名前:730 :02/08/10 14:08
>>796>>797
あ、ごめんなさい。例が悪かったせいで、えらく勘違いさせちゃってたみたいです。
やりたいのは『switch分岐の動的な変更』です。
文字列で分岐しているのは深い意味はありません。

>>796
じゃあ、class CTable : public vector<pair<int,FUNC> > で。

>>797
そっちは関係ありません。CTableの方。仮想デストラクタのない、
mapからpublic継承してますよね? つっこんで欲しいのは、そこ。
あと、「(前略)〜削除しようとしなければ、問題ない」のはあたりまえです。
じゃあ、間違って削除しないようにするためにどうすのか、それをコンパイラに
強制させる方法はないのか、ってことを聞きたいんです。

799 名前:デフォルトの名無しさん :02/08/10 14:52
>>798
あなたの例からは、継承させる必要性を感じないのだが?
CTableにstd::vectorやstd::mapの一般的なメソッドは必要なのか?



800 名前:デフォルトの名無しさん :02/08/10 14:58
new とか new[] する必要がないなら、それだけ禁止さえしておけば
public継承で別に問題ないのでは?と俺は思うけれど。

>>767
初期化時以外は完全に std::map として扱いたいという要求なら、
この方がわかりやすい気がする。

map<string, FUNC>& funcMap()
{
 static struct initialize {
  initialize()
   {
    map_["hoge"] = &Hoge;
    map_["hage"] = &Hage;
   }
  map<string, FUNC> map_;
 } unique_instance;
 return unique_instance.map_;
}

そうでなくて、実行時用の操作メソッドをもった一個のクラスとしてCTableを
作りたいなら、当然実装詳細である map は private に隠すべきでしょう。

801 名前:デフォルトの名無しさん :02/08/10 14:59
767じゃねぇ>>798だ。鬱氏。

802 名前:デフォルトの名無しさん :02/08/10 15:29
>>798
間違って削除出来ないようにする。では逆にどういう状況では削除出来る可能性があるか?
766の例だと、foo内で delete &table; とかやらない限り、そんなことは無いと思う。
もうちょっと起こりそうな例を・・・
それとも delete &table; さえも間違って起きないようにしたい?

803 名前:802 :02/08/10 15:31
あぁ。わけのわからんことを書いた気がする。
delete &table; だったら、基底クラスのポインタを介して派生クラスのオブジェクトを削除したことにならんよな。
むー?意図がいまいち読めん。混乱してきた。

804 名前:デフォルトの名無しさん :02/08/10 16:50
最高の道具あげ。

805 名前:730 :02/08/10 16:53
>>799
必要です。逆に聞きたいです。CTableは、単にコンストラクタでの
初期化のためだけにクラス化しているのです。それだけのために、
map,vectorの便利な関数を全部隠蔽されてしまうのは、とてつもなく不便だと
感じませんか? あとから「あ、やっぱり使うから付け足そう」などと
するより、最初から全部使えた方が余計な再コンパイルは不要で、
便利ですよね?

>>800
キタ━━━━(゚∀゚)━━━━!!!!
なるほど、これは素晴らしいです。そっかー。こうすればいいのか……。

>>802
いや、「起こりそうかどうか」なんて、どうでもいいんです。
誰かが「仮想デストラクタのないクラスをpublic継承させちゃいかんよな」って
言ったとき、>>766みたいなコードをあなたが書いてたとして、「いや、
基底クラスからdeleteさせられることがほとんどありえないなら、
public継承するけど」って言えますか? そして、説得できますか?
俺は、無理だと思います。だから俺は、「いや、基底クラスからdeleteされることが
ありえないようなクラス設計をした上でなら、public継承させるけど」
って言いたいので、そう言う道を探してるんです。

>>803
map<string,FUNC>* p = &table;
delete p;
ならどうだろう……? new,new[]といっしょに、delete,delete[]も
privateで隠蔽しといた方が安全ですかね……?

806 名前:デフォルトの名無しさん :02/08/10 16:57
>>799
> あなたの例からは、継承させる必要性を感じないのだが?
同意。メンバ変数として map 持つよな。

class CFuncDispatcher
{
  typedef void (*func_type)();
  std::map<std::string, func_type> func_table_;
public:
  CFuncDispatcher()
  {
    func_table_["foo"] = &foo;
    func_table_["bar"] = &bar;
  }
  void operator()(const std::string& s)
  {
    return (*func_table_[s])();
  }
};


(俺なら、さらにテンプレートクラス化すると思うけど)

807 名前:デフォルトの名無しさん :02/08/10 16:59
>>805
> あとから「あ、やっぱり使うから付け足そう」などと
> するより、最初から全部使えた方が余計な再コンパイルは不要で、
> 便利ですよね?
おいおい。何のためのカプセル化だよ…。

808 名前:730 :02/08/10 17:14
>>807
だから、mapとしての機能は、もともと全部使いたいんですよ。
カプセル化をやろうなんて思ってないんです。クラスにしたのは、
デフォルト入力データの初期化を行うのに、コンストラクタが
都合がいいからであって。そのためにmapの機能が制限されてしまうのは、
まったく不本意なんです。

809 名前:デフォルトの名無しさん :02/08/10 17:23
>>808
> だから、mapとしての機能は、もともと全部使いたいんですよ。
例が悪い、というか 798 と言ってることが違う。ころころ要求仕様を変えて
逆ギレしないように。

C 言語での配列の初期化
void (*func_table)[] = { &foo, &bar, &woo };
みたいに、定義と初期化をまとめたいっつー話なのね?

810 名前:デフォルトの名無しさん :02/08/10 17:41
>>805
new してないものを delete する奴は、別問題だと考えて、ここでは new 出来なくするくらいでいいんじゃなかろうか。

new してないものを delete する・・・例えば
void foo(int*p){
 delete p;
}
void bar(){
 int i = 1;
 foo(&i);
}
こんな事する奴は、そもそも防ぎようがない。諦めれ。

811 名前:デフォルトの名無しさん :02/08/10 18:04
日本語をうまく扱える文字列は、もうどうでもいいのか。

812 名前:730 :02/08/10 18:11
>>809
ああ、失礼。要するに、STLのコンテナとしての機能は、
何ひとつ損ないたくない、ってことを言いたいんでして。
で、そうです。定義と初期化をまとめたいんです。
理想はコンパイル時に初期化が済んでるといいんですけどね。
それはさすがに無理っぽいです。

>>810
ですね。VCでちょっと実験してみましたけど、派生クラス側でoperator deleteを
禁止しても、呼び出されるdeleteは基底クラス側だから、>>810的な
コードを書かれたら防ぎようがないんですね。まいった……。

>>811
いや、どうでもよくはないんです。>>759以降、レスがもらえないから
話が出来ないだけでして。

813 名前:デフォルトの名無しさん :02/08/10 18:14
>>812
違うネタをふったのはあんただよ

814 名前:デフォルトの名無しさん :02/08/10 18:20
>>812
ちなみに、今何をつくってるんすか?

815 名前:デフォルトの名無しさん :02/08/10 18:31
データ用のクラスを作って
STLコンテナとの
多重継承にして、
データ用のクラスでデータ管理すればいいんでない?


816 名前:デフォルトの名無しさん :02/08/10 18:37
>>812
俺なら、こんな感じで書くかねぇ。

typedef void (*func_type)();
struct func_tbl {
  const char *d_str;
  func_type d_func;
};

typedef map<string, func_type> dispatcher;

dispatcher
dispatcher_creator(struct func_tbl *p)
{
  dispatcher d;
  for (; p->d_str != NULL; ++p)
    d.insert(dispatcher::value_type(p->d_str, p->d_func));
    // 重複エラーのチェックをすること
  return d;
};

int
main()
{
  struct func_tbl tbl[] = {
    { "foo",   &foo },
    { "bar",  &bar },
    { NULL, NULL },
  };

  dispatcher d(dispatcher_creator(tbl));

  return 0;
}

817 名前:デフォルトの名無しさん :02/08/10 22:11
>> 定義と初期化をまとめたいんです。

勝手にまとめろやごるぁ。

dispatcher& funcMap()
{
 static const dispatcher::value_type initial_values[] = { ... };
 static dispatcher unique_instance( &initial_values[0]
                   , &initial_values[sizeof(initial_values)/sizeof(table_type::value_type)] );
 return unique_instance;
}


818 名前:817 :02/08/10 22:13
まちがえちったぞごるぁ
s/table_type/dispatcher

819 名前:デフォルトの名無しさん :02/08/11 00:02
>>812
日本語を上手く扱える文字列としてstd::wstringを使わない理由は?

820 名前:730 :02/08/11 09:03
>>814
ゲームです。

>>815-818
興味深いアイデア、いろいろありがとうございます。でも、>>800より
言いかと考えると、どれも微妙ですね。

>>819
ああ! そういや、そんなのがあるってのをなんかで見たような……。
ちょっとぐぐってみました。えーと。マルチバイト文字をstringで
読み込んで、標準関数(?)の mbstowcs()でwstringに
入れてしまえば、全部の文字が2バイト単位で扱える。で、テキスト
出力したいときはwcstombs()でマルチバイト文字でstringに戻せる。
……でいいんでしょうか。Webじゃあんまりいい情報が見つからないんで、
なにかお勧めの書籍があったら教えてください。

821 名前:デフォルトの名無しさん :02/08/11 09:57
戻したりするのが限りなくうざい

822 名前:デフォルトの名無しさん :02/08/11 15:09
>>820
> でも、>>800より言いかと考えると、どれも微妙ですね。
変数定義と初期化をまとめたいって話なら、おれは 817 か 818 だと思うがね。
800 だと初期化に使う内容が、変数の定義部分と離れてしまう。

逆に、多くの箇所で同一の値で初期化された map を利用するのなら 800 だ
ろう。

(相変わらず要求仕様が曖昧なんで、どっちが良いのか良く分からんが)

823 名前:デフォルトの名無しさん :02/08/11 17:14
std::string str = "abcd\nefgh\nijkl\n"
のような文字列を\nで分割したいのですが、
C風でなくC++風に分割するにはどうすればよいのでしょうか?

例えばstr1にabcd、str2にefgh、str3にijklのようなイメージです。

findで\nを探してsubstrで取り出すという方法を考えたのですが、
より良い方法はあるのでしょうか・

824 名前:コギャルとHな出会い :02/08/11 17:15
http://kado7.ug.to/net/


朝までから騒ぎ!!
   小中高生
 コギャル〜熟女まで
   メル友
  i/j/PC/対応

女性の子もたくさん来てね
                 
全国デ−トスポット情報も有ります。
全国エステ&ネイル情報あります。

825 名前:デフォルトの名無しさん :02/08/11 17:15
>>823
strtok

826 名前:デフォルトの名無しさん :02/08/11 17:19
>>823
boost::regexかboost::tokenizerを使うのが簡単だけども
標準ライブラリではないな

827 名前:デフォルトの名無しさん :02/08/11 17:18
>>825
ありがとうございます。
stringのままよりこちらの方が良いですか。

828 名前:デフォルトの名無しさん :02/08/11 17:27
>>826
そちらが簡単ですか。
標準ライブラリ以外でも大丈夫なので
そちらも調べてみたいと思います。
ありがとうございました。

829 名前:デフォルトの名無しさん :02/08/11 17:27
C++を勉強しているのですが、vectorがよくわかりません。

#include <iostream>
#include <vector>
using namespace std;
class hoge {
public:
 hoge() { cout << "hoge()" << endl; }
 ~hoge() { cout << "~hoge()" << endl; }
};
int main() {
 {
  vector< hoge* > v;
  for (int i = 0; i < 3; i++) v.push_back(new hoge);
  for (int i = 0; i < 3; i++) v.pop_back();
 }
 return 0;
}

スコープを抜けてvectorが削除されるときか、さもなくば
pop_back()で要素を削除したときにhogeのデストラクタを
呼び出して欲しいのですが、うまくいきません。

何かいい方法はないでしょうか。

830 名前:デフォルトの名無しさん :02/08/11 17:30
>>829
vector<hoge> を使えばいい。

831 名前:デフォルトの名無しさん :02/08/11 17:50
>>830
vector<boost::shared_ptr<hoge> > もな。

832 名前:デフォルトの名無しさん :02/08/11 17:51
boost::shared_ptr を使えば良い


833 名前:デフォルトの名無しさん :02/08/11 17:56
>>830-832
vector<hoge>だと一時オブジェクトができるのがちょっと厭だったんです。

shared_ptrというものがあるんですか。
それを調べてみます。

どうもありがとうございました。

834 名前:デフォルトの名無しさん :02/08/11 17:58
この場合にauto_ptrだけは使わないようにな。


835 名前:デフォルトの名無しさん :02/08/11 17:59
なんでC++ってポインタ(参照含む)の種類がたくさんあるんだろうね。
複雑なだけじゃん。

836 名前:デフォルトの名無しさん :02/08/11 17:59
>>833
>vector<hoge>だと一時オブジェクトができるのがちょっと厭
*まずは* それを気にしない、メモリ管理の事は自分の責任にしない、というのが
C厨を脱する1手段である気もするけどな。

まぁ、いつまでもそれじゃ駄目なんだけどさ。




837 名前:デフォルトの名無しさん :02/08/11 18:00
>>836
禿童


838 名前:デフォルトの名無しさん :02/08/11 18:02
>836
std::string& を返す関数を書いてしまい慌ててEffectiveあたり買いにいく罠、だな。



839 名前:デフォルトの名無しさん :02/08/11 18:03
>>835
> なんでC++ってポインタ(参照含む)の種類がたくさんあるんだろうね。
それが分かれば C++ 中級認定。

840 名前:デフォルトの名無しさん :02/08/11 18:10
ポインタの種類?

841 名前:デフォルトの名無しさん :02/08/11 18:20
>>835
もともとポインタはアドレスと型の情報しかない。メモリはCではプログラマが完全に管理するものだった。
C++でも初期のころはそうだった。後に参照ができSTLができた。
ポインタをプログラマが管理するのは苦痛である。それをSTLで簡単に管理することが可能になった。
しかしそれは無理やりに近い方法である。そのためスマートな解決策がなく結果としていろんなものが出来てしまった。
メモリの管理は簡単になったかもしれないが、反対に実装を詳しく知らないとバグを入れやすくなってしまった。
ポインタの管理を言語側にすべて任せてスマートに解決したものがGC
C++を使っている以上、メモリの管理は難しい。

842 名前:デフォルトの名無しさん :02/08/11 18:21
C++の日本語のリファレンスマニュアルネット上にありませんか?

843 名前:842 :02/08/11 18:24
すみませんみつけたからいいです

844 名前:デフォルトの名無しさん :02/08/11 18:24
ふつーの、GUIを持つアプリケーションをつくるならどうでもいいけどね。
Strutsなんかを見ているとGCありの言語が羨ましくなる。


845 名前:デフォルトの名無しさん :02/08/11 18:24
>>843
どこだ?あるのか?


846 名前:デフォルトの名無しさん :02/08/11 18:28
なんだGCなんて略すなよ
調べちゃったじゃないか

847 名前:デフォルトの名無しさん :02/08/11 18:30
がべこれ


848 名前:デフォルトの名無しさん :02/08/11 18:31
演算子関数の為に(省略)

849 名前:デフォルトの名無しさん :02/08/11 18:59
>>846
略さないで書く奴なんでイネーヨ(藁


850 名前:デフォルトの名無しさん :02/08/11 19:04
なんでC++って標準GUIライブラリが無いんですか?

851 名前:デフォルトの名無しさん :02/08/11 19:07
>>850
必要ないから

852 名前:デフォルトの名無しさん :02/08/11 19:09
>>851
C++でGUIアプリを書かないっていうことですか?

853 名前:デフォルトの名無しさん :02/08/11 19:11
入れてとこうかって話あったんだけどさ、
その標準ライブラリで作られるGUIが、あんまりかっこわるくてさ、
俺が反対しといた。ごめんな。

854 名前:デフォルトの名無しさん :02/08/11 19:16
>>853
GUIのかっこよさって実装でどうにかすればいいだけじゃないんですか?

855 名前:デフォルトの名無しさん :02/08/11 19:20
だから個人個人で勝手にかっこよく実装してくださいってことにしたのよ。俺ら。


856 名前:デフォルトの名無しさん :02/08/11 19:25
>>855
なんで設計や仕様を統一させなかったのですか?

857 名前:デフォルトの名無しさん :02/08/11 19:27
入ったとしてもX.hとかWindows.hとかOS依存になるだろうな。

858 名前:デフォルトの名無しさん :02/08/11 19:28
いや、統一しようと結構頑張ってるけどさ、コンパイラ作る人がわからずやでさ。
困ったもんだね。

859 名前:デフォルトの名無しさん :02/08/11 19:29
あ、858は856へね。

860 名前:デフォルトの名無しさん :02/08/11 19:32
そういやGUIと関係ない標準クラスライブラリ(STLじゃなく)も無いような気がしますが。

861 名前:デフォルトの名無しさん :02/08/11 19:34
なんで
> STLじゃなく
ってSTLを除くの?あれ結構頑張って作ってるよ、俺ら。

862 名前:デフォルトの名無しさん :02/08/11 19:36
>>861
面白くない。


863 名前:デフォルトの名無しさん :02/08/11 19:36
  ,、__,、 
 ( '・ω・) ショボーン
 (、っiョc)
  ゙'ー'゙ー'゙

864 名前:デフォルトの名無しさん :02/08/11 19:57
オモロくないけど、標準クラスライブラリってSTLじゃないとしたらどんな物を指してるの?


865 名前:デフォルトの名無しさん :02/08/11 20:02
iosとかでしょ。


866 名前:デフォルトの名無しさん :02/08/11 20:09
>>864
Java の socket やら GUI 周りのライブラリみたいのを想像してるんじゃないのか?

867 名前:デフォルトの名無しさん :02/08/11 20:26
socketまわりは何かあれば嬉しいなといつも思うけど。


868 名前:デフォルトの名無しさん :02/08/11 20:35
VCL使うべし

869 名前:デフォルトの名無しさん :02/08/11 20:58
>>868
それ「標準」ライブラリじゃないし、その候補でさえない……。

>>867
使ったことないんだが Common C++ Libraries とか、どう?
http://sourceforge.net/projects/cplusplus/

870 名前:デフォルトの名無しさん :02/08/11 21:01
>>869
イマイチもいいとこ


871 名前:デフォルトの名無しさん :02/08/11 22:29
std::string strの中にある\nの数を調べるために

int allnum = 0;
for(const char* i = str.c_str(); i != NULL; i++) {
   if(*i == 0x0d && ++*i == 0x0a)
      allnum++;
}

と書いてみたんですが、もっといい方法はありますか?

872 名前:871 :02/08/11 22:31
間違えました
int allnum = 0;
for(const char* i = str.c_str(); i != NULL; i++) {
   if(*i == 0x0d && *(++i) == 0x0a)
      allnum++;
}

873 名前:デフォルトの名無しさん :02/08/11 22:31
c_str使ってる時点でやる気を感じない。
とりあえずfindつかって書いてごらんよ。


874 名前:デフォルトの名無しさん :02/08/11 22:44
>>873
数を数えるなら count_if だろう。

class IsChr
{
  const char ch_;
public:
  IsChr(const char ch) : ch_(ch) {}
  bool operator()(const char ch) const { return ch == ch_; }
};

cout << count_if(s.begin(), s.end(), IsChr('\n')) << endl;

875 名前:デフォルトの名無しさん :02/08/11 22:49
少しきれいでないのが微妙ですがこんな感じでいかがでしょうか?
int allnum = 0;
int pos = 0;
while(true) {
   if((pos = s.find("\n", pos)) == std::string::npos)
      break;
   allnum++;
}

876 名前:871,872,875 :02/08/11 22:51
>>874
countで最初やろうとしていたんですがcount_ifですか。
これから調べてみたいと思います

877 名前:874 :02/08/11 22:53
>>876
この場合 count の方が良いな。

878 名前:デフォルトの名無しさん :02/08/11 22:54
cout << count(s.begin(), s.end(), '\n') << endl;

879 名前:878 :02/08/11 22:55
二足遅かった…。。。

880 名前:デフォルトの名無しさん :02/08/11 22:58
>>877-878
countでOKでしたか。最初やったらエラーが出でて・・・
ありがとうございます。

881 名前:デフォルトの名無しさん :02/08/12 00:44
count_ifはもっと複雑な検索条件を指定する時に使うといいね。

882 名前:デフォルトの名無しさん :02/08/12 01:07


883 名前:デフォルトの名無しさん :02/08/12 01:17
通常の方法およびクラス方法の差は何ですか。C++はルビーより非常に劣っている言語ですが、さらにC++にいくらかのクラス方法がありますか。それが悪い頭と紳士に尋ねているので、初期に答えてください。

884 名前:デフォルトの名無しさん :02/08/12 01:17
こうして基本的なアルゴリズムを知らない人が増えるのであった。

885 名前:デフォルトの名無しさん :02/08/12 01:19
>>883
英語で書いてください。

886 名前:デフォルトの名無しさん :02/08/12 01:21
>>864
クラス方法およびアルゴリズムとのどの関係がそこにありますか。知らせてください。
>>865
それはここで日本の掲示板ではありませんか。
私は、日本語を流暢に話すことができるので、満足であると思います。

887 名前:デフォルトの名無しさん :02/08/12 01:23
>>886
なんて書いてあるか理解できません。

888 名前:デフォルトの名無しさん :02/08/12 01:26
>>883>>886
日本人で地でやっているとしたら天才。
多分一度英語に機械翻訳してからまた日本語に戻しているのだろうが。

889 名前:デフォルトの名無しさん :02/08/12 01:27
私の日本の能力は非常に素晴らしい。あなたの頭が悪いので、病院へ行くために推薦します。また、もはや現われないでください。あなたの考察に感謝します。愚か、氏、887

890 名前:デフォルトの名無しさん :02/08/12 01:28
C++ is superior to Ruby.

891 名前:デフォルトの名無しさん :02/08/12 01:29
ッヒヤッヒャッ。

892 名前:デフォルトの名無しさん :02/08/12 01:31
この試みは私が開発した翻訳エンジンをテストするために遂行されました。それはしませんが、それら[説明で]あなたへの―ま、それは少しの程度および希望に関連させます。

893 名前:デフォルトの名無しさん :02/08/12 01:33
>>889
どうする>>888でばれたぞ。

894 名前:デフォルトの名無しさん :02/08/12 01:35
>>892
あなたの作成したかもしれない翻訳エンジンは、どちらかと言うと改良するための
必要が存在すると思うかもしれません。

895 名前:デフォルトの名無しさん :02/08/12 01:36
下らん外人もどきは無視。

896 名前:デフォルトの名無しさん :02/08/12 01:43
おまえら人口無能相手に何を必死になって居るんだ

897 名前:デフォルトの名無しさん :02/08/12 01:45
>>896
いや盆休みで暇なんでちょうどいい暇潰しにと思って。

898 名前:デフォルトの名無しさん :02/08/12 01:45
hikikomori is very superior to 2channeler.

hikky! >>>>>> Rubyist

899 名前:デフォルトの名無しさん :02/08/12 01:50
答えをまだ得ることができませんか。
しない、1レベルがより高く来られる場合、1つ、この掲示板?容易なものは単に聞かれます。
それは理解します(そのようなもの)?排泄物BAKA--それは死ぬことができます(よ答え)それは糞です、何、容易なもの糞。
それは、ものが何を使用しなければならないか尋ねています、どのように、クラス方法として。

900 名前:デフォルトの名無しさん :02/08/12 01:53
class _899 {
public: void hang_up()
{
   ||    
   ||    
   ||      yesterday...
 ∧||∧  
(  ⌒ ヽ
 ∪  ノ 
  ∪∪

}
};

901 名前:デフォルトの名無しさん :02/08/12 01:54
読めないので英語に戻す。

Can't an answer be obtained yet?
the case where bend and one level comes more highly
-- one and this bulletin board --
it is only asked to an easy thing It is the ?
excrement BAKA to understand (such a thing).
-- It (よ答え) from which it can die is what and
the easy thing excrement which are excrement.
It is as the class method to how that is asking
what a thing must use.

902 名前:デフォルトの名無しさん :02/08/12 01:56
あなたは恐らく理解しませんが、ルビーは素晴らしい言語です。
それは、オブジェクト指向のスクリプト言語として他のスクリプト言語を圧倒する実行および美しい言語明細を行っています。
例えば、スキーム、SmallTalkなどが比較的美しい言語であると言われていますが、ルビーは遅れる優位によって一層の美および一層の現実性を装備しています。
もちろん、Perl、ピュートーンなどは問題外です。
日本語との類似性では、選択が単にルビーを持つでしょう。
ルビーのLinuxの分配の採用の例は増加していました。
分配はすべて、1年後に、ルビーの標準の採用を行なうでしょう。
ルビーは将来のスクリプト言語です。

それは、長くなりましたが、KOPIPEではありません。
場合、KOPIPE[承認することができる人々は、ルビーのものを理解することができない人々に会います、そして/この発言]、それらは幸福です。

903 名前:デフォルトの名無しさん :02/08/12 01:56
なぁ、翻訳するのは簡単だが翻訳されたものを元に戻すのは
難しいことを暗号に利用できんか?


904 名前:デフォルトの名無しさん :02/08/12 01:57
日本語→英語→日本語を何回もして、もはや原文のニュアンスが
失われている。

905 名前:デフォルトの名無しさん :02/08/12 01:58
この際どこまでくずれるかやってみたら

906 名前:デフォルトの名無しさん :02/08/12 01:58
Rubyは松本死のonaniy!さ。

907 名前:デフォルトの名無しさん :02/08/12 01:59
どうやって翻訳してるんだ?
その翻訳そふとかなり完成度高そうじゃないか?

908 名前:デフォルトの名無しさん :02/08/12 01:59
>>904
それ他の言語への翻訳も間に入れて何回も繰り返してみたんだが
翻訳がおかしくなるのはある程度までなんだよな。
もちろん原文とは違うがある程度で内容の劣化が止まる。
だからなにと言われても困るが。

909 名前:デフォルトの名無しさん :02/08/12 02:03
>>908
例えばExciteで翻訳繰り返していると、途中で劣化が止まるね。
恐らく複数の異なるエンジン間で翻訳を繰り返しているのだろう。

910 名前:デフォルトの名無しさん :02/08/12 02:03
>>907
俺はExcite(または同じ翻訳エンジン)とみた。
Exciteは変換できないとき>>899のように括弧がでてくるからな。


911 名前:デフォルトの名無しさん :02/08/12 02:05
OCN翻訳サービスもあるよ。これとExciteを代わりばんこに使えば
ひどく崩れるのでは?
http://www.ocn.ne.jp/translation/?R

912 名前:デフォルトの名無しさん :02/08/12 02:10
>>902 ここまで崩れたぞ(w

あなたは恐らく理解しませんが、ルビーは素晴らしい言語です。
実行により実行することができる美しい言語詳細はオブジェクト指向のスクリプト言語
として他のスクリプト言語を圧倒します。例えば、遅れの優位による、美および多数の
現実性、それによってSUKIMU、SmallTalkなどがそうだったと言わ?黷トいましたが、
ルビーおよび設備は実行されました、その、さらに比較的、美しい言語(多数[ほとんど
遠くに])([多数]の内部の)――さらに(自然)問題にならず、それはさらに多く(恐らく距離中の)
である選択は、同じPerlを持った日本語としてポイントにルビーを単に持っています、
PYU調子など。ルビーのLinuxの分配の採用の例は増加していました。分配はすべて、
1年後にルビーの標準を採用するでしょう。ルビーは将来のスクリプト言語です。それは、
長くなりましたが、KOPIPEではありません。更に、人々、KOPIPE[私はそれを人々に会うこの
発言と見なすことができません、また、それは、それがそのように現われる(しかしながら)こと
を受理することができないものを持っています、この人、そしてルビー](および/)、また、
それらは幸福です。

913 名前:デフォルトの名無しさん :02/08/12 02:20
「女が欲しくて気が狂いそうです。」
-> 「彼は、女性を望むように見えて狂気でしょう。」
-> 「恐らく、彼は、女性を望むように見えて、精神異常です。」
-> 「恐らく、彼は、女性を望むように見えて、精神の混乱です。」(以下同じ)


914 名前:デフォルトの名無しさん :02/08/12 02:32
902の
"〜そして/"
ってemacsかな?

それにしても902みたいな翻訳って難しいな。

915 名前:デフォルトの名無しさん :02/08/12 02:36
あっちょんぶりけっ
けっの中の最初のあっちょん
けっの中の始めのあっちょん
けっの中で始められたあっちょん
けっの中によって始められることができたあっちょん
けっの内部によって始められることができたあっちょん

916 名前:デフォルトの名無しさん :02/08/12 02:47
トンボ釣りの帰り道に、ちんちんをつまんで、おしっこで日暮れの町に水をまいた。
陰茎は、トンボ釣りにその方法に後ろにはさまれました。また、水は薄明かりの町の小便によってその中でまき散らされました。
陰茎は方法でトンボ釣りに挿入されて戻りました。さらに、水は、その中の薄い光の町の尿によってまき散らされました。

すぐに止まるね。

917 名前:デフォルトの名無しさん :02/08/12 02:58
方法によって、それは、陰茎によってトンボ釣りに再び挿入されました。
更に、その中の薄い光の町の尿は、水曜日までにまき散らされました。

918 名前:デフォルトの名無しさん :02/08/12 03:30
>>911 そこはExciteと翻訳エンジンが同じだ。どちらもAMIKAI

919 名前:デフォルトの名無しさん :02/08/12 10:33
>>897
せっかくの良スレが駄レスで埋まるのは、とても悲しいものです。

920 名前:デフォルトの名無しさん :02/08/12 19:04
恐らく、分かりやすい説明が、構造オブジェクトの違いに関するクラスで
与えられる場合、それは保存されます。彼はさらに単にC++を理解しません。

921 名前:デフォルトの名無しさん :02/08/12 19:05
>>920
その文自体が理解できましぇん

922 名前:デフォルトの名無しさん :02/08/12 19:07
>>920
日本語変。

923 名前:デフォルトの名無しさん :02/08/12 19:13
>>921,922
それは、それが素晴らしく熟練した場合、悪いですか、それ、
日本ですが、よろしく、私?ここに来るあなたは、それがC++に
健康でそれに非常に来る、と思います。更に、私がこの日本語
のようにC++を滑らかに書くことができれば、それは嬉しい。

924 名前:デフォルトの名無しさん :02/08/12 19:17
>>923
どこの翻訳エンジンだ?昨日からいるようだが。

925 名前:デフォルトの名無しさん :02/08/12 19:24
>>924
これは自動的に翻訳エンジンです。結果はどうですか。それはそれぞれを
装備一完全に良いタッチです。それ,また私がそれでいると思います。確実に、
それは爆発的に糞です。

926 名前:デフォルトの名無しさん :02/08/12 19:25
>>925
どこの外国人か知らんが商用に使おうとか思うなよ。

927 名前: :02/08/12 19:32
日本人だと思われ

928 名前:デフォルトの名無しさん :02/08/12 20:36
御前等、放置スキルマックスでお願いします

929 名前:デフォルトの名無しさん :02/08/12 20:37
英語書けないようだしな。

930 名前:デフォルトの名無しさん :02/08/12 23:17
Exciteの和英の翻訳精度悪くなったような気がするのは俺だけ?

931 名前:デフォルトの名無しさん :02/08/12 23:19
和英じゃなくて英和だ、、

932 名前:デフォルトの名無しさん :02/08/12 23:53
C++等をフリーでダウンロードできる所誰か知らないでしょうか。
知っていたらぜひ教えていただきたいのですが。

933 名前:デフォルトの名無しさん :02/08/12 23:55
C言語スレの2に書いてる

934 名前:デフォルトの名無しさん :02/08/12 23:59
>>932
C++なら既にあるじゃないか。
君の心の中に(略)

935 名前:デフォルトの名無しさん :02/08/13 00:00
http://dempa.2ch.net/prj/page/ger/index.html

レベル1

936 名前:デフォルトの名無しさん :02/08/13 00:00
borland のや cygwinのgccや win用のgccとかあるよ
borland の奴だとBCC Developerと一緒に使うといいよ
gccはGCC Developerだっけかな?(こっちは使った事無い)

937 名前:デフォルトの名無しさん :02/08/13 00:19
すみませんもうちょいと詳しく教えてもらえますか?
具体的にどのようにすればいいのですか?
何もしらないもので・・^^;

938 名前:名無しさん@Emacs :02/08/13 00:21
>何もしらないもので・・^^;
じゃあ自分で調べたら?
調べて分からなかったら, そこで初めて人に聞くといい.
じゃないとプログラミングの勉強始めても身に付かないよ.

939 名前:デフォルトの名無しさん :02/08/13 00:26
それは素晴らしい翻訳、borland、それはそれぞれを
装備一完全に良いタッチです。それ,また私がそれでいると思います。確実に、
それは爆発的に糞です。COBOL。

http://www.borland.co.jp/cppbuilder/freecompiler/

940 名前:デフォルトの名無しさん :02/08/13 00:28
うう・・・なんて人思いのいい2ちゃんねらなんでしょ・・・(ノ_・、)
私はDQNなんですぐ答えを・・・

http://www.cygwin.com/download.html

GNU + Cygwin + Window = Cygwin(・∀・)イイ!


941 名前:932 :02/08/13 00:30
いろいろありがとうございますーーー
早速ためしてみまーーす

942 名前:デフォルトの名無しさん :02/08/13 00:53
>>932
最も強いものは「BASIC」です。これはあなたのために必要になります。
コンパイラーの設置によって最初につまずくでしょう。これは運命です。
次に、言語の参照の壁があります。次に、さらにオブジェクト指向の壁があります。
今後危険な多くの方法があります。


943 名前:名無しさん@Emacs :02/08/13 01:00
>>942
だからExciteはもうイイって. 正直目障り.

944 名前:デフォルトの名無しさん :02/08/13 01:22
それはそれに見えますか、それは何かによって誤解されます?私は英国民のクリスです。エキサイトは何ですか。
私は、この糸によって非常にエキサイトです。私はすべてを知っています「C、C++"言語。「GNU」の仕事も終わりました。
「INTEL」の仕事も終わりました。それは非常に面白い。私は、今「2CHANNEL」の仕事を行っています。
それは非常に面白い。特に、ASCII芸術の事務長のアルゴリズムは非常に賞賛されます。


945 名前:デフォルトの名無しさん :02/08/13 21:26
英語もロクに使えないのにExciteの力を借りてつまんねーネタつくんな。

946 名前:デフォルトの名無しさん :02/08/13 21:45
結局ここはC++の相談室なわけだけど、
なにを相談したいの?
相談することないなら
スレ違い、以上。

947 名前:デフォルトの名無しさん :02/08/14 06:27
template<class T>class TCA{
friend class T;
private:
void func(void){cout<<"TCA"<<endl;}
};

class A{
public:
TCA<A> tca;
A(){tsa.func();}
};
なんでエラー??

948 名前:デフォルトの名無しさん :02/08/14 06:31
間違えた
tca.func();

949 名前:名無しさん@Emacs :02/08/14 06:34
template<class T>class TCA{
friend T;
private:
void func(void){cout<<"TCA"<<endl;}
};

class A{
public:
TCA<A> tca;
A(){tsa.func();}
};

950 名前:名無しさん@Emacs :02/08/14 06:36
>>949だ。すまん、注釈書こうと思ったら間違って投稿しちまった.

 friend class T;
じゃなくて
 friend T;
とするところが変更点…って見れば分かるか.

951 名前:デフォルトの名無しさん :02/08/14 06:41
サンクスです。久々にfriend使ったらぼけてました。逝ってきます

952 名前:デフォルトの名無しさん :02/08/14 07:26
ヘボい事言ってみますけど、
friendは使わないほうがいいんでしょ?
goto並みっすか?

953 名前:デフォルトの名無しさん :02/08/14 07:28
directxをはじめようと思うのですがC++の基礎知識とかなくてもできますか?
C言語しかできないんですが。

954 名前:デフォルトの名無しさん :02/08/14 07:36
>>953
いちおうC++でなくCからでも使えるようになっとるよ・・・・

955 名前:デフォルトの名無しさん :02/08/14 09:53
>>952
iteratorを作るような時は、逆にfriendを積極的に使った方が、
publicメンバを減らせてカプセル化を強められるということもある。
要は使い方次第。

956 名前:デフォルトの名無しさん :02/08/14 14:07
演算子のオーバライド辺りで、メンバ関数よりfriend関数にした方が良いパターンが
あったような気がするが……
ん―、思い出せん。

957 名前:デフォルトの名無しさん :02/08/14 14:41
>>956
ああ、何を言いたいのか分かった。

class Hoge{
  int n_;
public:
  Hoge() : n_(0) {}
  Hoge(int i) : n_(i) {}
  friend Hoge operator +(const Hoge& lhs,const Hoge& rhs){
    return lhs.n_ + rhs.n_;
  }
};

Hoge a(3);
Hoge b(4);
Hoge c = a + b;
c = 3 + b;// friendなら通る。
c = a + 4;

ってなケースのことだな。
friendなら、暗黙の型変換をやってくれるからどれも通るけど、
friendにしてないと、通らないやつが出てくる、というお話。

958 名前:デフォルトの名無しさん :02/08/14 17:57
>>957
うむ。3.operator+(b) という構文は許されないからねえ。

959 名前:デフォルトの名無しさん :02/08/14 17:58
そろそろ新スレ立ててみるよ。ちょっと汚れてしまったから心機一転。

960 名前:デフォルトの名無しさん :02/08/14 18:06
立てました。新スレ
「C++相談室 part10」
http://pc3.2ch.net/test/read.cgi/tech/1029315669/

961 名前:デフォルトの名無しさん :02/08/16 13:07
次スレも立ったし埋めsage

962 名前:デフォルトの名無しさん :02/08/17 04:11
埋めsage

963 名前:デフォルトの名無しさん :02/08/19 21:04
std::cout << "埋めsage" << endl;


964 名前:デフォルトの名無しさん :02/08/19 23:57
なかなか埋まらないsage


965 名前:デフォルトの名無しさん :02/08/24 20:39
sage

966 名前:デフォルトの名無しさん :02/08/25 12:18
sageろやゴルァ!!

967 名前:デフォルトの名無しさん :02/08/25 13:47
悩みに悩んでたんですが、
思い切って聞きますね。
UNLZA32.DLLの扱いについて
質問したいのですが、
どこのスレへいったらいいのでしょうか?
どこへいってもすれ違いと言われてしまいそうで
困りはてています。
ここでお聞きしてもいいのでしょうか?

968 名前:デフォルトの名無しさん :02/08/25 13:48
>>967
そんなDLL初めて聞いた。何する奴?

969 名前:967 :02/08/25 13:56
すみません、タイプミスしました。

UNLZA32.DLL

UNLHA32.DLL
でした。

970 名前:デフォルトの名無しさん :02/08/25 14:06
http://www.ntus.net/nubak/manual/japanese/UNLHA32.TXT

これ見る限り, APIドキュメントも同梱されてるみたいだが…?

971 名前:967 :02/08/25 14:08
>970
わざわざすみません、
一通りドキュメントには目を通したんですが、
どうにもわからなくて。。
ここで具体的に聞いていいですか?

972 名前:デフォルトの名無しさん :02/08/25 14:09
>969
扱いといっても色々あって回答に困る。
 拾ってきたアプリ(用DLL)の使用方法が分からないの?
 自作アプリからDLLを使う方法が分からないの?
 権利面とかの扱いが分からないの?

973 名前:デフォルトの名無しさん :02/08/25 14:16
>971
下記あたりをキーにGoogleで検索して見てください。
 DLL LHA 動的リンク
すぐに詳しく書いてあるページがヒットすると思う。

974 名前:デフォルトの名無しさん :02/08/25 14:27
>>971
とりあえずここに詳しい解説があるよ。
http://www.hyuki.com/writing/techask.html


975 名前:967 :02/08/25 14:32
ありがとうございます。
自分の症状書いてたので
レスに気付きませんでした。
とりあえず>974さんに教えていただいた
ところに解決策があることを期待して行って来ます。
それから聞いても遅くないですしね。、
ありがとうございました。

976 名前:967 :02/08/25 17:30
>973
教えていただいた、キーワードでも
さわりくらいの解説しかヒットしませんでした。
>974
散々探したのですが
本当にこのURLであってますか?
サイト内検索でLHAと検索しても
ヒットしなかったんですが。。

とりあえず解説サイトはないとして、
心置きなく質問させてもらいますね。
でもちょっとタイミング悪いみたいなんで、
次スレ待ってます。


977 名前:デフォルトの名無しさん :02/08/25 19:50
>>976
解説サイトはあるが、それが967の求めているかどうかがわからない、というだけ。
>>974をちゃんと読んで、自分が何を求めているのか、正しく提示せよ、ということ。

978 名前:デフォルトの名無しさん :02/08/25 19:53
C++ のテンプレートについての基本的な質問です。

- main.cc

#include<cstdio>

template <typename T> void func(T a);

int main(int argc,char *argv[]){
func('c');
}

-func.cc

template <typename T> void func(T a){
return;
}

の様に別ファイルにテンプレート関数を記述した時、コンパイルは通るのですが、リンクで以下のエラーメッセージが発生します。なぜなのでしょうか?

main.o: In function `main':
main.o(.text+0xc): undefined reference to `void func<char>(char)'
collect2: ld returned 1 exit status

コンパイラは、gcc version 2.95.3 を使用しています。
よろしくおねがいします。



979 名前:デフォルトの名無しさん :02/08/25 19:57
それではfunc.ccをコンパイルするときには func<char> が必要かどうか
分らない。

980 名前:デフォルトの名無しさん :02/08/25 19:58
>>978
export付けてないからでしょ。それと、exportキーワードをサポートしている
処理系はほとんどないから、分割コンパイルは難しいかも。

981 名前:デフォルトの名無しさん :02/08/25 20:14
See C++ 3rd, C.13.10

982 名前:デフォルトの名無しさん :02/08/25 20:35
c++でウインドウを作るのってどうやるの?
どっかいいサイトあったら教えて

983 名前:またかよ、、 :02/08/25 20:44
http://www.kumei.ne.jp/c_lang/index.html


984 名前:デフォルトの名無しさん :02/08/25 21:05
回答をありがとうございます。

979> それではfunc.ccをコンパイルするときには func<char> が必要かどうか
979> 分らない。

とありますが、必要である事をコンパイラへ知らせるには、どのようにすれば良いのでしょうか?

980> export付けてないからでしょ。それと、exportキーワードをサポートしている
980> 処理系はほとんどないから、分割コンパイルは難しいかも。

export をサポートしていないコンパイラでは、どうやっても無理と言う事でしょうか? export をサポートしているコンパイラは、どの様な種類の物があるのでしょうか?

981> See C++ 3rd, C.13.10

これは、何ですか?

983> http://www.kumei.ne.jp/c_lang/index.html

C++ の文法について書かれたページですね。しかしここには、この問題の解決法は記述されていないようです。



985 名前:デフォルトの名無しさん :02/08/25 21:20
983のリンクの Windows SDK編 第1部にウィンドウの作り方からあるよ。

986 名前:デフォルトの名無しさん :02/08/25 21:22
なるほど、983 は 982 に対する返答ですね。失礼しました。

987 名前:デフォルトの名無しさん :02/08/25 21:46
>>984
>981> See C++ 3rd, C.13.10
>これは、何ですか?

See=見ろ
C++ 3rd=プログラミング言語C++ 第3版
C.13.10=付録Cの13(テンプレート)の10(明示的なインスタンス生成)

988 名前:デフォルトの名無しさん :02/08/26 04:02
See → 眺める
Oppai → おっぱい

989 名前:デフォルトの名無しさん :02/08/26 05:04
なるほど、わかりました。 > 987

ファイル func.cc 内に、

template void func<char>(char);
template void func<int>(int);

を記述する事により、実際に使用する型各々のコンパイル結果がオブジェクトファイル内に生成される訳ですね。

どうもありがとうございました。


990 名前:デフォルトの名無しさん :02/08/26 17:51
990

991 名前:デフォルトの名無しさん :02/08/26 17:51
よーし、パパ1000取っちゃうぞー

992 名前:デフォルトの名無しさん :02/08/26 17:52
もうちょっと!

993 名前:デフォルトの名無しさん :02/08/26 17:52
993ゲット

994 名前:デフォルトの名無しさん :02/08/26 17:55
994

995 名前:デフォルトの名無しさん :02/08/26 17:57
やっと995か

996 名前:デフォルトの名無しさん :02/08/26 17:58
996!

997 名前:デフォルトの名無しさん :02/08/26 17:58
997だ!あとちょっと!念願の1000ゲットなるか!

998 名前:デフォルトの名無しさん :02/08/26 17:59
998…すごい!

999 名前:SITNAM :02/08/26 18:00
 ∧⊂ヽ   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 (゚Д゚)ノ <  1000ゲット!
 (|  |   \__________
〜|  |
 ∪∪

1000 名前:SITNAM :02/08/26 18:00
やったー!1000打!


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