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


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

C++相談室 part13
1 名前:デフォルトの引き篭もり :02/11/23 15:03
怪しい仕様は細々ありますが大丈夫です!
elegantなソースを目指してね。

( ^-゚).。o(きっと関連URLは >>2-5 辺りだよ)

2 名前:デフォルトの名無しさん :02/11/23 15:03
■Documents■
C++ Final Draft International Standard
http://www.kuzbass.ru/docs/isocpp/
ISO/IEC 14882 International Standard
http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf

■STL Libraries■
Boost http://www.boost.org/
STLport http://www.stlport.org/
Loki http://www.moderncppdesign.com/
Loki for VC7(LokiPort) http://www.geocities.com/rani_sharoni/LokiPort.html

■過去スレ■
Part1 http://piza.2ch.net/tech/kako/980/980175292.html
Part2 http://pc.2ch.net/tech/kako/996/996640937.html
Part3 http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
Part4 http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
Part5 http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
Part6 http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
Part7 http://pc.2ch.net/tech/kako/1021/10217/1021787032.html
Part8 http://pc3.2ch.net/test/read.cgi/tech/1025010364/ (HTML 化待機中)
Part9 http://pc3.2ch.net/test/read.cgi/tech/1027347982/ (HTML 化待機中)
Part10 http://pc3.2ch.net/test/read.cgi/tech/1029315669/ (HTML 化待機中)
Part11 http://pc3.2ch.net/test/read.cgi/tech/1032345774/ (HTML 化待機中)
part12 http://pc3.2ch.net/test/read.cgi/tech/1035005882/

3 名前:デフォルトの名無しさん :02/11/23 15:04
■関連スレ■
VisualC++相談室 3  http://piza2.2ch.net/tech/kako/993/993186053.html
VisualC++相談室 4  http://pc.2ch.net/tech/kako/1002/10021/1002165477.html
VisualC++相談室 5  http://pc.2ch.net/tech/kako/1006/10068/1006834463.html
VisualC++相談室 6  http://pc.2ch.net/tech/kako/1011/10116/1011615035.html
VisualC++相談室 【7】 http://pc.2ch.net/tech/kako/1017/10178/1017843192.html
VisualC 相談室 【8】 http://pc.2ch.net/tech/kako/1022/10224/1022499000.html

C++Builder相談室    http://piza2.2ch.net/tech/kako/969/969458279.html
新C++Builder相談室  http://pc.2ch.net/tech/kako/997/997074601.html
C Builder相談室 Part3 http://pc3.2ch.net/test/read.cgi/tech/1016065855/

STLスレッド      http://pc.2ch.net/tech/kako/1004/10042/1004287394.html
STLスレッド part2 http://pc3.2ch.net/test/read.cgi/tech/1026793823/l50


4 名前:あぶねー :02/11/23 15:05
【C++】template 統合スレ -- STL/Boost/Loki, etc.
http://pc3.2ch.net/test/read.cgi/tech/1037795348/l50

5 名前:無理矢理 :02/11/23 15:07
C/C++の宿題なら俺にやらせろ!
http://pc3.2ch.net/test/read.cgi/tech/1036572120/l50

C++規格書のココを読め
http://pc3.2ch.net/test/read.cgi/tech/1026005968/l50

6 名前:1 :02/11/23 15:24
焦ってレスした俺が馬鹿だった(ρ_;)

7 名前:デフォルトの名無しさん :02/11/23 15:40
C++Builder相談室 Part4 http://pc3.2ch.net/test/read.cgi/tech/1035596146/

8 名前:デフォルトの名無しさん :02/11/23 21:48
    ,r‐、       , -、
      !  ヽ      /  }
     ヽ、 ,! -─‐- 、{  ノ
      /´∀`   r`'、´ <オマエモナ
    / ,.-─- 、   ヽ、.ヽ
     !/     ヽ、._, ニ|
.    {              ,'
     ヽ          /,ソ
.     ヽ、.____r',/
汎用度::中汎用 << 超汎用 << 小汎用 <<ミニ汎用
優秀度::C++    << C     << ASM   << CPU配線・回路

9 名前:デフォルトの名無しさん :02/11/24 13:37
>>8
bool operator<< (const Thing& lhs, const Thing& rhs)
{
 return lhs.Wonderfulness > rhs.Wonderfulness;
}

10 名前:デフォルトの名無しさん :02/11/24 14:05
[プラットフォーム]
[Win32]
g++ << VC++7[.Net] << bcc32 フリー << C++Builder <= VC++6
[Linux&Unix]
g++ <= intelコンパイラ


11 名前:デフォルトの名無しさん :02/11/24 14:54
僕の

12 名前:デフォルトの名無しさん :02/11/24 15:23
ローカルクラスをその同じスコープ内でテンプレートパラメータとして
用いることはできないのでしょうか?
int mem_fn_mine()
{
    class SomeObject
    {
    public:
        SomeObject( const char* i_name ) : name( i_name ) {}
        void Print() { cout << name << endl; }
    private:
        const char* name;
    };

    std::vector<SomeObject> v;
こんな感じです。
g++-3.2 cygwinです。

13 名前:デフォルトの名無しさん :02/11/24 15:25
ローカルクラスって挙動がおかしかった気がする・・・


14 名前:デフォルトの名無しさん :02/11/24 15:28
>>13
やっぱりテンプレートがからんだものはnamespaceレベルで使うべきですかね
特別にローカルクラスが必要ってわけでもないので、どうでもいいんですが。。

15 名前:デフォルトの名無しさん :02/11/24 15:40
たしか、テンプレートの実体化は関数の外(namespaceスコープ)で
行われると思った。だから実体化の時点では、関数内で定義されている
ローカルクラスを見ることができないと。

16 名前:デフォルトの名無しさん :02/11/24 15:48
>12
用語の問題だが local class といったら関数内で定義したクラスのこと。

int main() {
  struct S {...}; // これ
}

クラス内で定義したクラスは nested class な。このあたりは規格書で用語
が決まってるから、誤解を招かぬよう統一して下さいな。

ANSI C++ の規格では local class はテンプレートパラメタとして使えない、
nested class は OK のはず。class SomeObject の定義を public に移して
みたら?

17 名前:デフォルトの名無しさん :02/11/24 15:57
?? 12は適切な用語を使ってると思うが??

18 名前:デフォルトの名無しさん :02/11/24 16:04
>>16
nested classならそれらがテンプレート化クラスであろうと
テンプレートパラメータとして使うことはgccにおいて問題ありませんでした。
細かいところまでやってみてないのでなんとも言えませんが、
local classはテンプレートが絡んだときには、少し特殊なものとなる
という認識でいればよさそうですね。

19 名前:債務不履行の名無しさん :02/11/24 16:08
>>11 が気になる。

20 名前:デフォルトの名無しさん :02/11/24 16:19
>>19          ,iノノ
          ,、ノノ:レ
        ,,:i,i/:'/'~/                 ,/!
     ,、_,ノ:!~;'彡-三ヾ、               ,从i  ,
     ,i[ !' ~  ~:;;、'~'ヽ               ノ ::;i!.ノi
    ,/゙ ,ヽ!ゝ   ~ii::ミ            λ  ノ'~ :;レ' :;;!
    ゙i;:  `>_:,;ii,ミミミi           ,v'.i ,ノ ::;/ ::;ノ   _,,、-,-
    '!'~`~)||!!ヾ!~ ::i,)          ,从,レ :;;/ :;ノ彡-''~゙ :i!'゙
     、彡ノノノ  ::ii人          /;/;;ノ゙;;;::i-'<、,_,,、-'~
    ,i'゙~i::ノ゙;: .:: ::iiヾ      i',   ,ノ゙/-彡'~: ::_;;_;;;::::ヾ、--、_
    i゙::i .::; ノ: ,iヾ ::゙i、_  __,,,ノv:レ从)ivト'|'゙::;;-''''~ ;;__ _;;ヾ、|~ ̄
    '゙i,:;::/ ;;-'ノ'  ~ヾ〉~''~゙ ---、, :;;ノ:i'从iiiニ=彡三ミミミ;;::i, ゙'i,
     !,;::i i ;!'゙   ::;i'゙      ~゙彡;゙ノ,レ'~,ノ゙!!=-ii、,゙ヽ, 'i;::i, i
     i,i::iミ゙    ::;i         彡彡<゙;;,ノ'二~' 彡 i 彡!,i'
      レi;     ::;i,;        ,、-彡'~~∠゙~  彡i'゙ '~´
       ヽ,     ::ゝ, 、   、___ノノ'~~フ ̄    '゙
        ヾ、ヽ、i   :ゝ,゙'i ''-ミミ= ~'-<
         ヾ、;;::::!!、  ゙i.|トトi::::::ミ'~ ̄~
           ~'ヾヾ-,、____ !__::::ヽ,
              ,ノ:::;/ ~゙ヽ):::::;)
             ノ::;ノ'   /゙:::;/
           ,-'''"ン"   /::;/
   __,,、、、-‐/'"i-、(、,、,,,,,/゙/
   二='''、::::::!、-┘ヾ--/:::;/ゝ
    ̄ ̄ ̄   ,、、-/ー'゙ノ::;∧,、,
       ∠二―┴,=< ::;ノヾ、,」ニ=ー
           ./:,、┴゙
          //
          !'

21 名前:デフォルトの名無しさん :02/11/24 16:23
>18
>local classはテンプレートが絡んだときには、少し特殊なものとなる
困ったときは、とりあえず規格書を見ましょうよ。PDF 版なら US$18
で入手できるし。
http://webstore.ansi.org/ansidocstore/product.asp?sku=INCITS%2FISO%2FIEC+14882%2D1998

14.3.1 Template type arguments
2 A local type, a type with no linkage, an unnamed type or a type compounded from
any of these types shall not be used as a templateargument for a template
typeparameter.

22 名前:デフォルトの名無しさん :02/11/24 16:35
http://pc3.2ch.net/test/read.cgi/tech/1035005882/906
コレを見ると $18 払う気がしない・・・。

23 名前:質問厨 :02/11/24 16:57
class foo
{
  foo();
  ~foo();

  static void threadFunc(foo *p);
  boo m_boo;
};

void foo::threadFunc(foo *p)
{
  while(1)
  {
  p->m_boo.xxx();
  }
}

クラスfooはスレッドを扱う。そのスレッドはfooの静的でないメンバbooを扱う
このクラスfooがデストラクトされるときに、まずスレッドが止まって、次にbooのデストラクタが呼ばれたい

どうすればいいでしょうか?

24 名前:デフォルトの名無しさん :02/11/24 17:05
void foo::threadFunc()
{
  foo* t = new foo();

25 名前:デフォルトの名無しさん :02/11/24 17:05
デストラクタでスレッドに停止命令だせばいいやん

26 名前:質問厨 :02/11/24 17:21
>25
そうするとm_booがさきにデストラクトされるとp->m_boo.xxx()のところで
おかしくなりませんか?

27 名前:デフォルトの名無しさん :02/11/24 17:23
     ∧_∧∩ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    ( ´∀`)/<>>21先生!漏れクレジットカード持ってないYO!どうしよう
 _ / /   /   \_____________________
\⊂ノ ̄ ̄ ̄ ̄\  
 ||\        \
 ||\|| ̄ ̄ ̄ ̄ ̄||
 ||  || ̄ ̄ ̄ ̄ ̄||
    .||          ||

28 名前:デフォルトの名無しさん :02/11/24 17:24
fooがm_booを使ってるとわかってるのに、
先にデストラクトするのは変じゃん

29 名前:デフォルトの名無しさん :02/11/24 18:35
boo の実体じゃなくてboo*を待たせる。
タイミングをはかりたいなら、クリティカルセクション
やらミューテックスを使う。


30 名前:デフォルトの名無しさん :02/11/24 20:07
>>27
22 先生に訊いてみてください。

31 名前:デフォルトの名無しさん :02/11/24 20:08
つーか、threadFunc() を誰がいつ蹴っ飛ばすのかわからん。
とりあえず class foo の外側でロックかけなきゃいけなさそうだが。

32 名前:デフォルトの名無しさん :02/11/25 01:00
どうするんだよ、前スレもう書き込めないじゃん

33 名前:デフォルトの名無しさん :02/11/25 13:12
自力でスクロールバーを描画したいのですが、参考ソースとかどこかにありませんか?
ググったけど見つからないです。

自力で、の意味は(OSの組み込み機能とかではなく)自分でビットマップとかを使って描きたいという事です。
(長さの割合とかの計算がよくわからない)

34 名前:デフォルトの名無しさん :02/11/25 13:15
↑リアル厨房現る!

35 名前:デフォルトの名無しさん :02/11/25 13:37
>>33
おれも座標とかの計算苦手。でも昔仕事でやったことある。嫌々。
Windowsでの話になるけど、描画用のウィンドウを作ってもいいし、
直接クライアントウィンドウのデバイスコンテキストに描画でもいいけど、
自分でコントロールもどきを作成するのは相当面倒だよ。
codeguruとか行った方が良いかも。
http://www.codeguru.com/

36 名前:33 :02/11/25 14:34
>>35
ありがとうございます。参考になりそうなソースをハッケソできました!
感謝!!

>>34
ばぁか

37 名前:デフォルトの名無しさん :02/11/25 19:43
( ゚∀゚ )<C++C++!

38 名前:デフォルトの名無しさん :02/11/25 21:22
( ゚∀゚ )<サカナサカナサカナー ℃++<

39 名前:デフォルトの名無しさん :02/11/25 21:29
>>34
上に関しては正しかったようだな……

40 名前:デフォルトの名無しさん :02/11/26 00:57
ファイルの最後に改行コードがあるかどうか判別して
改行コードがあるならば、
そのまま改行コードがないならば
改行コードを追加して
バッファに読み込みを行うという処理をしたいのですが、
ofstream
ifstream
だと一度ファイルを開いて全部読み込んで
改行コードを追加したファイルを作って
最後にまたそのファイルを読み込むという処理しか思い浮かびません。
それだとかなり処理の工程が増えてしまうのですが
なにか方法はありますでしょうか?

すでにあるファイルの最後に追加する処理
もしくはファイルの先頭に追加する処理
の方法がわかればもっと簡単にする方法はあるのですが、
そのようなことはできるのでしょうか?



41 名前:デフォルトの名無しさん :02/11/26 01:08
fstreamのin|outで開けばいいんじゃん?

42 名前:デフォルトの名無しさん :02/11/26 03:50
左のウインドウにクラスってありますよね。
今までここに表示されてる内容が
使ってるヘッダーファイルの中身だったんですが
いつのまにか使ってるcppファイルの中身になってしまって…
どうやって元に戻すのでしょうか?

43 名前:デフォルトの名無しさん :02/11/26 03:51
>>42
すいません誤爆しました…

44 名前:デフォルトの名無しさん :02/11/26 05:44
static x;
これってxはintになるんですか?

45 名前:デフォルトの名無しさん :02/11/26 05:52
なるよ

46 名前:デフォルトの名無しさん :02/11/26 06:13
なんでintなんですか?

47 名前:デフォルトの名無しさん :02/11/26 07:08
規格でそう決まっているから。

48 名前:デフォルトの名無しさん :02/11/26 07:11
ふーむ

49 名前:デフォルトの名無しさん :02/11/26 07:31
>>46
          ズドゥーン               ∧,,∧
   _ , . ; :'''"´"'' 、            l)ニ)ニ))ミ∀゚ 彡,
−=" ;,_  ; : .   ',,(lllニl============ll仁二三三ミ  ノ彡
      ´"''''- ''"        ~ ̄ ̄//└l=,lヽニ⊂ノ  彡ノ
                     _//'    ̄   '--(,,,, ,,彡,)

50 名前:デフォルトの名無しさん :02/11/26 07:48
>>49
(´Д`;)ヾ チンコ タッテキタ
  ∨)
  ((

51 名前:デフォルトの名無しさん :02/11/26 07:59
x;
これだとエラーになりますよね

52 名前:デフォルトの名無しさん :02/11/26 08:18
昔のコンパイラはそれでも通った

53 名前:デフォルトの名無しさん :02/11/26 09:53
それだとわかる文脈では、int は常に省略できる。

54 名前:デフォルトの名無しさん :02/11/26 10:11
short int x;

55 名前:40 :02/11/26 11:44
>41

すみませんfstream調べてみましたが、
いまいちちょっと使い方がピンときません。
もう少しくわしく説明願えませんでしょうか?



56 名前:デフォルトの名無しさん :02/11/26 11:48
class CHoge{
  template< int n >
  inline int func() {
    return n + 1;
  }
  template< int n >
  inline int operator ()() {
    return n + 3;
  }
};

int main()
{
  CHoge hoge;

  hoge.func< 10 >(); //これは通る

  //hoge< 5 >();   //通らない...
}

この下のやつを通す方法は無いでしょうか...
コンパイラーはVC7です。

57 名前:デフォルトの名無しさん :02/11/26 11:59
>>56
class CHoge{
  template< int n >
  inline int func() {
    return n + 1;
  }
  template< int n >
  static inline int operator ()() {
    return n + 3;
  }
};
でいいんじゃない?試してないけど。

58 名前:56 :02/11/26 12:09
operator()は非静的メンバとして宣言したときだけオーバーロードできます。
らしいです...

59 名前:デフォルトの名無しさん :02/11/26 12:55
hoge はテンプレート名じゃないんだから hoge<5> のような
書き方はできんでしょう。やるなら、hoge.operator()<5>() かな?
とてもコンパイル通るとは思えんけど (w

60 名前:デフォルトの名無しさん :02/11/26 13:13
演算子オーバーロードってテンプレート化できるんですか。。。

61 名前:56 :02/11/26 13:18
> 書き方はできんでしょう。やるなら、hoge.operator()<5>() かな?
それはやっぱ通りません
C++って面白いんですけど、癖がありますねぇ...

62 名前:デフォルトの名無しさん :02/11/26 14:05
>>55
あまりうまくないが、こんなかんじで
std::fstream fs("hoge.txt",std::ios::in|std::ios::out|std::ios::binary) ;
fs.seekg(-1,std::ios::end) ;

char c ;fs.get(c) ;
if(c!='\n'){
fs.seekp(0,std::ios::end) ;
fs.put('\n') ;
}
fs.seekg(0,std::ios::beg) ;

>>61
bcc32 5.6だと通るけど

63 名前:デフォルトの名無しさん :02/11/26 14:27
ヘッダでのクラスの定義なんですけど、

class A;
class B;

class A
{
class B b;
};
class B : public A
{
};

このA、B2つの定義を別ファイルでやろうとしてるんですが、
どうにもうまくいきません
どうしたら通るんでしょうか

64 名前:デフォルトの名無しさん :02/11/26 14:43
class A;
class B;
class A {
  B* b;
};
class B : public A {
};
こうしといて、AのコンストラクタでBのインスタンスを渡してやればいける。

65 名前:64 :02/11/26 14:45
でもあんまりいいオブジェクトじゃないなぁ...

66 名前:デフォルトの名無しさん :02/11/26 17:36
公安認定C++教習所

67 名前:デフォルトの名無しさん :02/11/26 18:27
template< class A>
class B : public A {} ;

template<class C>
class A {
B p; C tmp;
};

A<int> a;

ヤター、VC6で内部コンパイルエラー!

68 名前:終了10分前 :02/11/26 20:59
引き篭もり万歳!

69 名前:終了7分前 :02/11/26 21:04
( ゚∀゚ )さいたまさいたま!

70 名前:デフォルトの名無しさん :02/11/26 22:56
>67
bcc や gcc でも、頑張ると内部エラー出せるぞ。れっつちゃれんじ。

71 名前:デフォルトの名無しさん :02/11/27 10:09
>>67
あほですか?

72 名前:デフォルトの名無しさん :02/11/27 16:04
56のソースをちょこっと変えればbccでも内部エラーだぞむふふ

73 名前:首吊り :02/11/27 16:35
みんな設計とかどうしてる?
そこらへんのフリーのソースだけじゃ学びにくくない?

74 名前:デフォルトの名無しさん :02/11/27 20:56
>73
> そこらへんのフリーのソースだけじゃ学びにくくない?
企業に入って研修受けると、何か設計の秘技を授けてもらえると思ってる
なら大間違いだぞ。

75 名前:デフォルトの名無しさん :02/11/28 10:22
operatorの使い道がわからん。
どういう時に使えばいいんだろう?

76 名前:デフォルトの名無しさん :02/11/28 10:29
>>75
より直感的に処理を書きたいときに使えばいいんじゃないかな。
たとえば、リスト構造をもつクラスがあった場合、
n番目のアイテムを得るときに
item = list.getitem(n);
と書くところを
item = list[n];
って書けるから直感的になる。かもしれない。




77 名前:デフォルトの名無しさん :02/11/28 10:31
>>76
リストに[]は計算時間を激しく誤解してしまいそうな

78 名前:デフォルトの名無しさん :02/11/28 10:32
>>77
そう思ったけどパっと例が思いつかなかったのよ。

79 名前:デフォルトの名無しさん :02/11/28 10:42
>>75
俺は長年C++しているけど、クラスとオーバーライドしか
まともに使ったことが無い。


80 名前:デフォルトの名無しさん :02/11/28 12:08
>>75
複素数クラス作ってみ

81 名前:デフォルトの名無しさん :02/11/28 12:50
ベクトルクラスとか行列クラスとかモナー

82 名前:デフォルトの名無しさん :02/11/28 13:42
>>75

Money m( 2400 );  // 2400円
Wallet w;       // 財布には1円も入っていない

m += 1200;      // m は 3600円
m += c;        // m は 4600円
w << m;        // 財布に 4600円が入る

83 名前:82 :02/11/28 13:45
しまった。
Wallet の下に

Coins<100> c(10); //100円硬貨で10枚

が入る。

84 名前:デフォルトの名無しさん :02/11/28 14:56
>>79
なんとなくわかる
長年ってところが却って癌なんだろ

85 名前:デフォルトの名無しさん :02/11/28 15:23
>>75
見た目がゴチャゴチャしてなくて本質的な意味が直感的にわかり可読性があがる
operator定義の中にそれにとっての本質的な処理を記述できる

86 名前:デフォルトの名無しさん :02/11/28 21:49
初心者な質問ですいません。
ひとつのクラスから複数のインスタンスをつくったとき、
このクラスのパブリックな変数はインスタンスごとに違う値をとれるのですか?

またとれる場合は外部から参照するときどうやったらよいのでしょう・・・?


87 名前:デフォルトの名無しさん :02/11/28 22:03
>85
ただし、気づかぬウチに一時オブジェクトを大量生産することがあるので
注意。逆アセンブルしたら「あらびっくり」ということもある。

あと operator() は良く使うよね。

88 名前:デフォルトの名無しさん :02/11/28 22:08
operator()は関数オブジェクトを作る時によく使うね。STLで多用。

89 名前:デフォルトの名無しさん :02/11/28 22:23
>>86
>ひとつのクラスから複数のインスタンスをつくったとき
っちゅうのは、
class hoge{
public:
int m_int[10];//←複数のインスタンス
};
っちゅう解釈でよろしいか?

90 名前:89 :02/11/28 22:26
それとも
hoge hogeInstance[2];//←複数のインスタンス
ということか?

91 名前:デフォルトの名無しさん :02/11/28 22:29
あ。なに言ってるんでしょうおれは。
インスタンス→オブジェクトの間違いです。


92 名前:デフォルトの名無しさん :02/11/28 22:34
>>91
それでもどっちとも取れるよ。
あともうひとつ最悪の解釈もできるけど。

93 名前:デフォルトの名無しさん :02/11/28 22:40
うーんほんとに初心者なのでよくわからないのですが、
class hoge{
public:
int x
};
というクラスから
hoge a;
hoge b;
を生成したとき、それぞれの持つxは違う値をとれるのですか?

94 名前:デフォルトの名無しさん :02/11/28 22:43
>>93
合ってる。
同じ値にしたい場合は static をつける。


95 名前:デフォルトの名無しさん :02/11/28 22:45
ありがとうございます。
あともうひとつすいません。
こういう場合外部からどちらかのxを参照したい場合はどうすればよいのでしょう?


96 名前:デフォルトの名無しさん :02/11/28 22:45
>>93
とれるよ。
a.x = 1;
b.x = 2;
みたいにそれぞれ別々の値が格納される。
でもその程度ならコンソールアプリで確認しながら
やったほうが2Chで聞くよりも効率いいよ。

97 名前:デフォルトの名無しさん :02/11/28 22:49
なるほどそうですね・・・。
でもたすかりました。ありがとうございました!


98 名前:デフォルトの名無しさん :02/11/29 00:16
そこらへん構造体と同じよん

99 名前:デフォルトの名無しさん :02/11/29 14:51
feel ill!
tit!

100 名前:  :02/11/29 21:32
template <typename T, typename U> class hoge {
void a(void) {
// 処理
};
void b(void) {
// 処理
};
// 他にも関数たくさん
}

template<>void hoge<char, int>:a(void) {
// 特殊化
}

template<>void hoge<char, int>:b(void) {
// 特殊化
}

と、あるテンプレート内の関数を2つ特殊化しようと書いたのですが
これではコンパイラを通りません。
うまい書き方を教えてください。

101 名前:デフォルトの名無しさん :02/11/29 21:54
>>100
なんですか?それは

102 名前: ◆hMJAPH9PWA :02/11/29 22:12
>>100
クラス定義の最後のセミコロンが無いってこと以外は問題があるようには見えないけど。
というか、環境くらい書こうよ。

103 名前:デフォルトの名無しさん :02/11/29 22:14
>int>:a(v
ん? ::でないのか?

104 名前:デフォルトの名無しさん :02/11/29 22:27
template <typename T, typename U> class hoge
{
public:
void show(void) { cout << "ノーマル <" << typeid(T).name() << ", " << typeid(U).name() << ">" << endl; };
};
template<> void hoge<char, int>::show(void) { cout << "特殊 <" << typeid(T).name() << ", " << typeid(U).name() << ">" << endl; }

int main()
{
hoge<char, char> char_char; char_char.show();
hoge<char, int> char_int; char_int.show();
hoge<int, char> int_char; int_char.show();
hoge<int, int> int_int; int_int.show();
cin.get();
return 0;
}

きちんと文法守れば何も問題無いはずだが。

105 名前:デフォルトの名無しさん :02/11/29 22:56
バカは死んでくれ

106 名前:デフォルトの名無しさん :02/11/29 23:01
>>105
誰かに言ってるんなら明記してくれ。
別に誰かに言ってるわけじゃないなら、便所で一人で言っててくれ。

107 名前:105 :02/11/29 23:30
>>106
補足するとだな
>>105 バカは死んでくれ
で論理的整合性が保たれる。

108 名前:デフォルトの名無しさん :02/11/29 23:41
>>107
つまり、106 の 「便所で一人で言っててくれ」 という希望は却下という事か?

109 名前:デフォルトの名無しさん :02/11/30 00:29
2ch=便所
2chの書き込み=便所の落書き

110 名前:デフォルトの名無しさん :02/11/30 00:38
便所の落書きの中にも、キラリと光るものがある。
ただの落書きか、砂粒の中の砂金かを見分ける能力がないと
2chを読んでいても何のたしにもならない。

111 名前:100 :02/11/30 00:39
色々スマソ

>>102
g++です。セミコロンは書き忘れ。

>>103
::の間違いです。

>>104
特殊化する関数が一つならコンパイル通るし
ちゃんと動くんですよ。
何か文法的におかしいでしょうか?


112 名前:デフォルトの名無しさん :02/11/30 00:39
わざわざ臭い公衆便所に入り浸らなくてもいいやん。

113 名前:デフォルトの名無しさん :02/11/30 00:54
emplate <typename T, typename U> class hoge
{
public:
void a(void) { cout << "ノーマル a <" << typeid(T).name() << ", " << typeid(U).name() << ">" << endl; };
void b(void) { cout << "ノーマル b <" << typeid(T).name() << ", " << typeid(U).name() << ">" << endl; };
};
template<> void hoge<char, int>::a(void) { cout << "特殊 1 a <char, int>" << endl; }
template<> void hoge<char, int>::b(void) { cout << "特殊 1 b <char, int>" << endl; }
template<> void hoge<int, char>::a(void) { cout << "特殊 2 a <int, char>" << endl; }
template<> void hoge<int, char>::b(void) { cout << "特殊 2 b <int, char>" << endl; }

int main()
{
hoge<char, char> char_char; char_char.a(); char_char.b();
hoge<char, int> char_int; char_int.a(); char_int.b();
hoge<int, char> int_char; int_char.a(); int_char.b();
hoge<int, int> int_int; int_int.a(); int_int.b();
cin.get();
return 0;
}

通りますが? (VC6SP5)
コンパイラは何使ってて、アラーメッセージはどう出てるの?

114 名前:預言者 :02/11/30 01:03
「神のために力を尽くして戦え」
と出てます

115 名前:デフォルトの名無しさん :02/11/30 01:21
不覚・・・笑ってしまった

116 名前:100 :02/11/30 01:46
>>113
今ある環境(BCC)で通りました。

通らなかった環境が今ここに無いのでうろ覚えですが、
コンパイラはg++でエラーメッセージは
「もう実体化されてるぞゴルァ」とかそんな感じ。

とりあえずしょーもないミスしてないか確認してみます。
ありがとうございました。

117 名前:デフォルトの名無しさん :02/11/30 01:57
gcc-2.95.1
MinGW gcc-2.95.2
いずれでもコンパイルできますた。

でも、emplate はさすがに通らないけどな。

118 名前:デフォルトの名無しさん :02/11/30 08:06
malloc で初期化したインスタンスのコンストラクターを呼ぶ方法は無いでしょうか...
p->T()
は無理なのは知ってますが、
void (CHoge::*fpHoge)() = CHoge::CHoge
p->*fpHoge();
としようと思うと上の関数ポインターの代入が駄目と言われます。

class CHoge{
 CHoge(){
  //これを呼びたい
 }
};

template< typename T >
func()
{
 T* p;
 p = reinterpret_cast< T* >( malloc( sizeof( CHoge ) ) );
 //p->T(); //これをやりたい
}
int main()
{
 func< CHoge >();
}

119 名前:デフォルトの名無しさん :02/11/30 08:09
placement new

120 名前:デフォルトの名無しさん :02/11/30 10:38
>>118
なぜnewを使わない?

121 名前:デフォルトの名無しさん :02/11/30 11:40
ディレクトリを読み込むには、それぞれOSに依存のシステムコールなり
APIなりを使わないといけないんですよね?
winならFindFirstFile()、UNIXならopendir()/readdir()とか。
この辺の標準的なラッパとかって無いんですか?
みんなどうしてんの?

# Cスレで聞くべきか?

122 名前:デフォルトの名無しさん :02/11/30 11:52
クラスをmallocで定義する馬鹿発見!

123 名前:デフォルトの名無しさん :02/11/30 11:53
win環境でもopendirが使えるように
APIがラップされたものが提供されていると思うが

124 名前:デフォルトの名無しさん :02/11/30 12:09
>>122
>クラスをmallocで定義する
理解できないのは俺だけ?

125 名前:デフォルトの名無しさん :02/11/30 12:13
クラスのインスタンス領域をmallocで確保する馬鹿発見!
なら分からんでもない

126 名前:デフォルトの名無しさん :02/11/30 12:25
>>124
だから、newを使えば自動的にコンストラクタが呼び出されるの!

127 名前:デフォルトの名無しさん :02/11/30 12:36
>>126
何か頓珍漢な人ですね・・・

128 名前:デフォルトの名無しさん :02/11/30 12:38
まあ、allocatorを自作しようとしてるってんなら分からなくもない。
実際SGIのSTLはmallocとplacement newで初期化してたような気がするし(違ったらごめん)。

他に考えられるのは可変長構造体をclassでもやろうとしてるってのもあるかもな。
激しく未定義だが(特に仮想関数を持つ場合)。
それでも、mallocではなく::operator newを使うのが筋だと思う。

129 名前:デフォルトの名無しさん :02/11/30 12:39
>>125
良かった。俺だけじゃなかったみたいだ。

>>126
アホですか?

130 名前:デフォルトの名無しさん :02/11/30 12:42
何をもめているのか不明だが、すでに >>119 で答えが出ていると思うが。

131 名前:デフォルトの名無しさん :02/11/30 12:46
そのための placement new なんでないの

132 名前:デフォルトの名無しさん :02/11/30 12:59
でもどういう弊害が起こるか、具体的に説明しろといわれたら困るな。

133 名前:デフォルトの名無しさん :02/11/30 13:09
placement newというと、確保と解放はこれでいいのかなあ?

class CHoge{
public:
CHoge(){
std::cout << "CHoge() called." << std::endl;
}
~CHoge(){
std::cout << "~CHoge() called." << std::endl;
}
};

template <typename T>
void func()
{
T* p;
p = reinterpret_cast<T*>(std::malloc(sizeof(T)));
new (p)T;
p->~T();
std::free(p);
}
int main()
{
func<CHoge>();
}

134 名前:デフォルトの名無しさん :02/11/30 13:11
どうもこうしなければいけないような気がする。どちらが正しいのでしょうか。

template <typename T>
void func()
{
T* p;
T* q;
p = reinterpret_cast<T*>(std::malloc(sizeof(T)));
q = new (p)T;
q->~T();
std::free(p);
}
int main()
{
func<CHoge>();
}

135 名前:デフォルトの名無しさん :02/11/30 13:16
T* p = new (reinterpret_cast<T*>(std::malloc(sizeof(T)))) T();

・・・見づらい

136 名前:デフォルトの名無しさん :02/11/30 17:38
                \ │ /
                 / ̄\   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
               ─( ゚ ∀ ゚ )< C++C++!
                 \_/   \_________
                / │ \
                    ∩ ∧ ∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\∩ ∧ ∧ \( ゚∀゚)< C++C++C++!
しぃプラ〜〜〜!  >( ゚∀゚ )/ |    / \__________
________/ |    〈 |   |
              / /\_」 / /\」
               ̄     / /

137 名前:デフォルトの名無しさん :02/11/30 19:02
これだと、デストラクタが1回しか呼び出されないのですが、
どうやったら10回呼び出せるでしょうか?

class CHoge{
public:
CHoge(){
std::cout << "CHoge() called." << std::endl;
}
~CHoge(){
std::cout << "~CHoge() called." << std::endl;
}
};

int main()
{
char* p = reinterpret_cast<char*>(malloc(1000));
CHoge* q;

q = new(p) CHoge[10];
q->~CHoge();
std::free(p);
}

138 名前:デフォルトの名無しさん :02/11/30 19:04
それともこれでいいのでしょうか。placement newの解放の仕方がよく
わかりません。

class CHoge{
public:
CHoge(){
std::cout << "CHoge() called." << std::endl;
}
~CHoge(){
std::cout << "~CHoge() called." << std::endl;
}
};

int main()
{
char* p = reinterpret_cast<char*>(malloc(1000));
CHoge* q;

q = new(p) CHoge[10];
for (int i = 0; i < 10; i++)
q[i].~CHoge();
std::free(p);
}

139 名前:デフォルトの名無しさん :02/11/30 20:20
いいよ。

140 名前:デフォルトの名無しさん :02/11/30 20:28
>>139
ありがとうございます。人情的にplacement newには対応するdeleteが
必要な気がしていましたが、そうではないのですね。delete[]なんて
やったらヒープ領域と勘違いして破壊してしまいますね。

141 名前:デフォルトの名無しさん :02/11/30 21:32
cppllでいまなにやら作っている変なnicknameのお方はなんであんなにも偉そうなんですか?彼はCESとCSSの区別はついているんですか?


142 名前:デフォルトの名無しさん :02/11/30 21:42
直接たずねればいいのに

143 名前:デフォルトの名無しさん :02/11/30 23:02
>>140
placement new には対応する delete を書いたほうがよいです。
new(x) T;
でコンストラクトの途中で例外が発生した場合、(もし存在すれば)
対応する operator delete が自動的に呼ばれるからです。

144 名前:118 :02/12/01 01:39
色々ありがとうございます。
Singletonを汎用的に実装するクラスを作ることを考えていたのですが、
newをそのまま呼ぶと色々困るのでこうなりました。

145 名前:デフォルトの名無しさん :02/12/01 03:34
staticメンバ関数の使いどころがわかりません。

class A {
static int i;
int j;
public:
static void func() { std::cout << i << std::endl; }
};

int A::i;

int main()
{
A a;

a.func();
A::func();
}

のようにstaticメンバだけにアクセスできるらしいのですが、プログラミング言語C++
第3版では例えばどの節を読めばいいのでしょうか?§10.2.4などを読んでも今
ひとつすっきりしません。

146 名前:デフォルトの名無しさん :02/12/01 03:48
>145
必要になるまでは、無理して使わんで良いって。そういうものもあるんだと
頭の片隅に起きつつ、勉強進めとけ。

いずれ factory パターンとか state パターンとかに出くわしたときに、あると
便利かなと思える日が来る。

147 名前:デフォルトの名無しさん :02/12/01 11:18
>>145
1.隠れグローバル信仰者の逃げ道
2.インスタンス取得関数等、インスタンスがない状態で行うクラス関連の操作
3.メンバ関数へのフックの為の逃げ道(this を渡し、そこからメンバをコールする。)

基本的には static メンバ(変数、関数両方とも)は
インスタンスメンバと完全に区別して考えるべき。
俺は(俺の中の呼び方として)
static は 「クラス変数、クラス関数」とよび
non static は「インスタンス変数、インスタンス関数」と呼んで
完全にベツモノとして考えている。

148 名前:デフォルトの名無しさん :02/12/01 11:53
staticメンバ関数=特定クラス専用friend関数。

149 名前:デフォルトの名無しさん :02/12/01 12:02
>>146-148
わかりました。今はこういう物もあるのだと記憶にとどめる程度にしておきます。
解説書を読んでもstaticメンバ関数の存在意義について深く考察した本は見た
ことがないので、悩んでおりました。

150 名前:デフォルトの名無しさん :02/12/01 12:03
ところで、staticメンバ関数にはthisポインタは渡るのでしょうか?staticでは
ないメンバや仮想関数にアクセスすることはできないようなので、渡ってない
ように思えますが・・・・・・

151 名前:デフォルトの名無しさん :02/12/01 12:04
staticの関数の実行時にはthisは渡ってない。

152 名前:デフォルトの名無しさん :02/12/01 12:13
> staticメンバ関数=特定クラス専用friend関数。

語弊ありすぎ

153 名前:デフォルトの名無しさん :02/12/01 12:45
五平餅ウマー

154 名前:デフォルトの名無しさん :02/12/01 12:45
初めにお断りします。このコピペは掲示板の本旨とは無関係ですが、世界の子供達の
命に関わる問題なのでどうかお許しください。興味のない方は読み飛ばしてください。

世界では今日もワクチンが足りないために7000人の幼児が亡くなっています。
世界では毎年290万人もの子どもたちが「ポリオ」「はしか」「新生児破傷風」
「結核」「百日咳」「ジフテリア」で亡くなっています。これらは予防可能な病気です。
この子たちはワクチンさえあれば助かる命なのです!

1通話300円の募金ダイヤル 0990-588-889  24時間受付で、1回300円が募金されます。
300円あれば15人分のポリオワクチンを発展途上国の子供達に届ける事が出来ます。あなたの
1通話で世界の恵まれない子供達、15人の命を守る事が出来るのです。どうかご協力をお願いします。
http://www.jcv-jp.org/home.htm  http://www.lcv.ne.jp/~ono21/yobousessyu/vaccine.htm

*善意の方、この文章のコピペを通常の掲示板運営に迷惑にならない程度に、
 他の掲示板にも貼り付けてください。よろしくお願いします。

155 名前:デフォルトの名無しさん :02/12/01 12:46
↑ブラクラ

156 名前:デフォルトの名無しさん :02/12/01 12:52
ルール破る香具師が人助けか。
おめでてーな。

157 名前:デフォルトの名無しさん :02/12/01 12:54
つーか、ノート PC の HDD 壊れたのに買い換える金もない漏れに募金してくれよ・・・

158 名前:デフォルトの名無しさん :02/12/01 13:11
>>154
2chなら2chらしく3行以内で書きしる!

159 名前:デフォルトの名無しさん :02/12/01 13:31
超でかいテキストのファイルを開いて編集するプログラム作るとき
世の中ではどういう方法が適切なのかねぇ・・・。


160 名前:デフォルトの名無しさん :02/12/01 13:34
メモリマップトファイルとか・・・

161 名前:158 :02/12/01 13:47
お前ら1回300円の募金をしる!やらない奴は私が直々にレイプします。あとこれコピペOKね。
300円で15人の命が救える募金ダイヤル: 0990-588-889
http://www.jcv-jp.org/home.htm  http://www.lcv.ne.jp/~ono21/yobousessyu/vaccine.htm


ほらできた(´∀`)

162 名前:デフォルトの名無しさん :02/12/01 18:01
うん、161 程度なら許せるな。
募金しないけどw

154 はいかんともしがたい

163 名前:147 :02/12/01 21:23
>>150
> staticではないメンバや仮想関数にアクセスすることはできない
C++ では static な関数は仮想にできないから、後ろは不要。

漏れが言ってたのはクラス CHoge の static メンバ関数に
CHoge* を渡して、こいつのメンバ関数を呼び出す事ができるって事。
C の時代のコールバック関数等は non static メンバ関数を呼び出せる形になってないので、
static メンバ関数へのポインタを渡すしかない。
コールバック時に void* などとして任意の変数が渡せる場合は
そこに CHoge* を無理矢理詰め込むことで、 non static なメンバ関数への
経由地点として static 関数を利用する事ができるわけ。

164 名前:デフォルトの名無しさん :02/12/01 21:40
147はC++デビューしたて?


165 名前:デフォルトの名無しさん :02/12/01 21:43
> > staticではないメンバや仮想関数にアクセスすることはできない
> C++ では static な関数は仮想にできないから、後ろは不要。

(゚Д゚)ハァ?
static な関数からアクセスできるかどうかの話じゃないのか?

166 名前:147 :02/12/01 22:33
>>164
どこらへんが?具体的に書いてみなよ(ププッ

>>165
> static な関数からアクセスできるかどうかの話じゃないのか?
何にアクセスできるかですか?
多分 「non static なメンバに」っていう意味だと思うけど、
「アクセスできるか?」だけじゃ意味が通じてないYO。

で、話は static メンバ関数に this ポインタが渡るかどうかの話です。
>>147 でのアドバイスを >>150 さんが取り違えて、
static メンバ関数への理解に支障がでると悪いと思ったので >>163
補足したのです。

で、>>150 のはじめの「staticではないメンバ」しか「仮想関数」にできないので
わざわざ「仮想関数」まで書かなくても十分だよ。と言ってるわけですね。
Are you ok?


167 名前:147 :02/12/01 22:39
あぁちなみに static な関数は static じゃないメンバにアクセスできるからね!

ここで >>164 とかはま〜た勘違いしてやっぱり >>147 は初心者!とか決め付けてるんだろうけど、
嘘じゃないから。

static な関数が static じゃないメンバにアクセスするには条件があるだけ、
それは対象インスタンスへのポインタが必要という事。

それじゃ意味ないじゃんとか言わないように、
そのメンバが private や protected だった場合にはグローバルスコープの関数からはアクセスできないのだから、
これは static メンバ関数の特徴なんだよ。ok?

168 名前:147 the ネット弁慶 :02/12/01 22:45
>>167 はちょっと用語を間違った。
はじめの 「static な関数」は「static なメンバ関数」に読み替えてくれ。

169 名前:デフォルトの名無しさん :02/12/01 23:04
staticメンバ関数から非staticなメンバをアクセスするには、インスタンスの
参照かポインタを渡さなければいけないんですよね?

class A {
static int i;
int j;
public:
A() : j(123) {}
static void func() { std::cout << i << std::endl; }
static void func2(A& ar) { std::cout << ar.j << std::endl; }
};

int A::i = 456;

int main()
{
A a;

a.func();
A::func();
a.func2(a);
A::func2(a);
}

170 名前:デフォルトの名無しさん :02/12/01 23:11
質問です。

似たような構造体に 共通の関数を使って値をセットする関数を、テンプレートをつかって
作ったのですが、リンクでエラーがでてしまいます。なぜうまくいかないのでしょうか?

struct HogeA
{
int a;
int b;
};

struct HogeB
{
int a;
int c;
};

template < class T >
void Set_a( T* p_Hoge , int a )
{
p_Hoge->a = a;
}





171 名前:デフォルトの名無しさん :02/12/01 23:14
どんなエラーか書かない習性

172 名前:デフォルトの名無しさん :02/12/01 23:16
質問です。グローバルの
void* operator new(size_t);
void* operator new(size_t, void*);
は上書きできないんでしょうか?これは規約でしょうか?
少なくともVC++だとすでに定義されているって出てしまいます。

173 名前:172 :02/12/01 23:24
勘違い
void* operator new(size_t, void*);
だけでした。しかも <new> の中です…。

174 名前:172 :02/12/01 23:31
<new> にはvoid* operator new(size_t, void*);が絶対入ってるんですね。
ありがとうございました。

175 名前:デフォルトの名無しさん :02/12/02 01:04
自己解決と書かないと自作自演に見えるよ。
あと<new>←??

176 名前:デフォルトの名無しさん :02/12/02 02:14
質問です。
クラスのメンバに、そのクラス用コンテナを付けたいです。
(class Aのメンバにvector<A>のヤツがいるとか)
C++BuilderでもHPのaC++(此度のミッションで使うコンパイラっす。)でもコンパイルが通るのですが、
こういうマネが通るという事が処理系依存なのかどうかを聞きたひ。(すっげー使いたいんで。)
例は↓の感じ。(本例、aC++で実行確認までしますた。)


177 名前:176の続き :02/12/02 02:15
int main(int argc, char** argv)
{
A a1(1);
A a2(2);
a2.Add(A(10));
a2.Add(A(11));
a2.Add(A(12));
a2.Add(A(13));
a1.Add(a2);
a1.Add(A(50));
a1.print();
return 0;
}
実行結果:
me...
1
me end.
children...
me...
2
me end.
children...
10
11
12
13
children end.
50
children end.


178 名前:176-177の続き :02/12/02 02:16
include <string>
#include <iostream.h>
#include <vector>
class A
{
private:
int id;
vector<A> v;
public:
A(int a) : id(a) {;};
void Add(const A& a) {v.push_back(a);};
void print()
{
if(v.size() > 0) {
cout << "me..." << endl;
}
cout << id << endl;
if(v.size() > 0) {
cout << "me end." << endl;
}
if(v.size() == 0) {
return;
}
cout << "children..." << endl;
vector<A>::iterator i;
for(i = v.begin(); i != v.end(); i++) {
i->print();
}
cout << "children end." << endl;
};
};

179 名前:176-178 :02/12/02 02:17
すんません。>>177>>178、載せる順序が逆でした。

180 名前:デフォルトの名無しさん :02/12/02 08:18
>>176-178
規格で定義されてるかどうかはちょとわからんけど、その例で
vector<A> は使えても list<A> が使えないコンパイラはそれなりにあったりする。

181 名前:デフォルトの名無しさん :02/12/02 10:00
比較用のビット数の入った変数(nBitCount)を参照して
そのサイズにキャストして、比較したいのですが
動的にキャストって出来ないですか?

無理やり書いたら、

long func(long cmp,BYTE* _p,long x,long y,long w,long nBitCount)
{
long ret;
switch(nBitCount)
{
case 8:
ret = (char*)(_p + (x + (y*w))*(nBitCount>>3) ) - cmp
break;
case 16:
ret = (short*)(_p..)
break;
case 32:
ret = (long*)(_p...)
break;
}
return ret;
}
・・・
全部書いてたら、死にます。

どうにかなりませんか?


182 名前:デフォルトの名無しさん :02/12/02 10:29
何をしたいのか分からんが、nBitCount をプログラムないで指定しているのだったら
template 使った方がいいぞ。

183 名前:デフォルトの名無しさん :02/12/02 11:06
つーかこれ、

> (char*)(_p + (x + (y * w)) * (nBitCount >> 3) ) - cmp

大いに間違っていないか?

184 名前:デフォルトの名無しさん :02/12/02 14:31
比較部分はよくわからないが、こんな感じになるんでは?

template <typename T>
long func(T cmp, BYTE* _p, T x, T y, T w)
{
return reinterpret_cast<T*>(_p + (x + (y * w)) * sizeof(T) / 8 - cmp);
}

185 名前:デフォルトの名無しさん :02/12/02 15:25
すみませんファイルから文字列を取ろうとして

#include <iostream.h>
#include <fstream.h>



ifstream fr("ファイル名");

としたら「'ifstream' シンボルがあいまいです」というエラーが出た。
どういうことなのかよくわかりません。ご伝授お願いします。



186 名前:デフォルトの名無しさん :02/12/02 15:30
>>185
#include <iostream>
#include <fstream>



std::ifstream fr("ファイル名");
とやってもエラーが出るか?

187 名前:デフォルトの名無しさん :02/12/02 15:36
>>186
名前空間!!忘れていました・・・!
ありがとう御座いました

188 名前:デフォルトの名無しさん :02/12/02 15:39
>>187
しかし、fstream.hのように、".h"を付けると、stdネームスペースに包まれる事は
ないので、std::を付けなくても良いはずなのだが・・・・

コンパイラは何ですか?

189 名前:デフォルトの名無しさん :02/12/02 15:49
VC++6.0ですが・・・

あるクラスのメンバ関数内で記述していたのですが、
::ifstream fr("ファイル名");
のように :: をつけグローバル指定することで解決しました。

名前空間とは関係なかったかな・・・C++暦浅いんでよくわからないけど・・・。
他の場所でVectorやstingつかっているんで using namespace std;
は入れております。 

190 名前:デフォルトの名無しさん :02/12/02 16:11
行列A*行列B=行列C という問題なんですけど、今こんなプログラムを考えたのですが、
これでは手計算と明らかに違ってしまいます。@とAに部分を変えればいいはずなのですがこれじゃただ足した
だけになってしまいます。。。どうか教えてくださいませ!
#include<stdio.h>#define N 3 #define M 3 void main();
void m_print(double [N] [M]);
void m_add(double [N] [M],double[N][M],double[N][M]);void main()
{double A [N] [M] = {{1,3,5},{4,8,1},{11,6,8}},
B [N] [M] = {{1.9,3.6,4.7},{7.2,8.5,8.8},{0,4,0}},
   C [N] [M] ;
m_print(A);printf("\n\n * \n\n");m_print(B);printf("\n\n = \n\n");
m_add(A,B,C); m_print(C); printf("\n\n"); }
void m_add(double X[N][M], double Y[N][M], double Z[N][M]) {
//@long g,h;  for(g=0;g<M;g++) for(h=0;h<N;h++){
C[g][h]=A[g][h]*B[g][h];
//
}}
void m_print(double X[M][N]) {
//Along i,j; printf("_");i=1;
while((i++) < N){
printf(" "); }
printf(" \n"); for(i=0; i<M; i++){
printf("|");for(j=0; j<N-1; j++){
printf("%10.5f,",X[i][j]); }
printf("%10.5f|\n",X[i][N-1]); }
printf("~"); i=1; while((i++) <N){
printf(" "); }
printf(" ~\n");
//  }

191 名前:デフォルトの名無しさん :02/12/02 16:28
三行三列行列だからできないんですよね。。。

192 名前:デフォルトの名無しさん :02/12/02 17:06
>>189
VC++は使ってないのでわからんが、ifstreamの多重定義に、std名前空間を
使わなかった場合のバグが残っていると思う。普通は :: なんて付けなくていい
はずです。

>>190
微妙にスレ違いだがまあいいか。n×mの行列とn×mの行列の積は、n≠mの
場合定義されない。n×mの行列とo×pの行列の積は、m==oの場合に限り
定義される。

行列の積は、L×MとM×Nの積とすると
for (i = 0; i < L; i++) {
for (k = 0; k < N; k++) {
c[i][k] = 0.0;
for (j = 0; j < M; j++)
c[i][k] += a[i][j] * b[j][k];
}
}

のように書くべし。

193 名前:デフォルトの名無しさん :02/12/02 17:25
>192
ありがとうございますm(__)m
この行列は3×3行列と3×3行列の積です。(数字見にくくてごめんなさい)
あと、その教えてもらった数列は//@に入れればいいんですか?
とりあえず3×3行列同士にして。。。ホント見にくくてすみません。
//Aとかも聞いていいですか?いそいそしてしまってますが、提出が迫り焦っています(汗
よろしかったら教えてくださいませ。


194 名前:デフォルトの名無しさん :02/12/02 17:44
#include <stdio.h>
#define N 3
#define M 3
void m_print(double [N][M]);
void m_mul(double [N][M], double[M][N], double [N][N]);

void main()
{
double A[N][M] = {{1, 3, 5}, {4, 8, 1}, {11, 6, 8}},
B[N][M] = {{1.9, 3.6, 4.7}, {7.2, 8.5, 8.8}, {0, 4, 0}},
C[N][M];
m_print(A);
printf(" * \n");
m_print(B);
printf(" = \n");
m_mul(A, B, C);
m_print(C);
}

void m_mul(double X[N][M], double Y[M][N], double Z[N][N])
{
int i, j, k;

for (i = 0; i < N; i++) {
for (k = 0; k < N; k++) {
Z[i][k] = 0.0;
for (j = 0; j < M; j++)
Z[i][k] += X[i][j] * Y[j][k];

195 名前:デフォルトの名無しさん :02/12/02 17:45
}
}
}

void m_print(double X[M][N])
{
int i, j;

printf("_");
for (i = 0; i < N; i++)
printf(" ");
printf(" _\n");
for(i = 0; i < M; i++) {
printf("|");
for(j = 0; j< N - 1; j++)
printf("%10.5f,",X[i][j]);
printf("%10.5f|\n",X[i][N-1]);
}
printf("~");
for (i = 0; i < N; i++)
printf(" ");
printf(" ~\n");
}

196 名前:デフォルトの名無しさん :02/12/02 17:46
とにかくこれぐらいのプログラムを自分で書けないようだと、
俺たちが答えてやってもまたすぐにつまずくぞ。

197 名前:デフォルトの名無しさん :02/12/02 17:49
そうそう、main()は次のものと差し替えてくれ。

int main()
{
double A[N][M] = {{1, 3, 5}, {4, 8, 1}, {11, 6, 8}},
B[M][N] = {{1.9, 3.6, 4.7}, {7.2, 8.5, 8.8}, {0, 4, 0}},
C[N][M];
m_print(A);
printf(" * \n");
m_print(B);
printf(" = \n");
m_mul(A, B, C);
m_print(C);
}

return 0;がないが、C++のプログラムならこれでよい。

198 名前:デフォルトの名無しさん :02/12/02 17:50
まだ間違えていた。

int main()
{
double A[N][M] = {{1, 3, 5}, {4, 8, 1}, {11, 6, 8}},
B[M][N] = {{1.9, 3.6, 4.7}, {7.2, 8.5, 8.8}, {0, 4, 0}},
C[N][N];
m_print(A);
printf(" * \n");
m_print(B);
printf(" = \n");
m_mul(A, B, C);
m_print(C);
}

199 名前:デフォルトの名無しさん :02/12/02 18:19
C++ 相談室なのに、何でわざわざ C で書いてるんだ?

200 名前:デフォルトの名無しさん :02/12/02 18:20
>>199
だから、微妙にスレ違いだと書いておいた(w

201 名前:デフォルトの名無しさん :02/12/02 18:23
もしC++で書いたら、簡易行列クラスを定義して、operator*と
matprint()を定義ぐらいするかなあ。printfの代わりにstd::cout
を使って。

配列の初期化はコンストラクタにdouble型の一次元配列でも渡すか。

202 名前:デフォルトの名無しさん :02/12/02 18:31
つーか、int main() は値を返せよ。

203 名前:デフォルトの名無しさん :02/12/02 18:34
>>202
C++だと、return文がないと暗黙に0が返されるんじゃなかったっけ?

204 名前:デフォルトの名無しさん :02/12/02 18:35
もちろんmain()に限定の話だけどね。

205 名前:デフォルトの名無しさん :02/12/02 18:44
>>203
そんなご都合なルールが規格にあったっけ?

206 名前:デフォルトの名無しさん :02/12/02 18:48
>>205
知らんの?プログラミング言語C++第3版§3.2(P78)を読んでみそ。

207 名前:デフォルトの名無しさん :02/12/02 19:06
>>206
参考文献より規格を確かめろよ。

でも、そう書いてあるな。初めて知った。

ISO_IEC 14882_1998
3.6.1 Main function
5 ... If control reaches the end of main without encountering a return statement, the effect is that of executing "return 0;".

208 名前:デフォルトの名無しさん :02/12/02 19:22
>>207
これからそうします。しかしあの英文だらけのPDF読むのもなかなか
骨が折れるんだよね。だから軟弱な俺は誤植だらけの参考文献を
読んでオナーニしてますた。

209 名前:207 :02/12/02 21:08
>>208
漏れも英語はあんまり読めない。
しかし、Stroustrup はどうだか分からないけど、書籍にはいい加減なものが多い。
何が正しいかを調べるには規格書が一番。

210 名前:デフォルトの名無しさん :02/12/02 22:26
必要ないインクルードファイルをインクルードしていないかを
簡単に調べる方法ってないの?

211 名前:デフォルトの名無しさん :02/12/02 22:29
>>210
コメントアウトしてコンパイルしてエラーが出ないか調べる。
C++は型チェックが厳密だから大抵エラーが出てわかる。

212 名前:100 :02/12/03 09:59
どうも、>>100です。

template <typename T, typename U> class hoge
{
public:
void a(void) { cout << "ノーマル a <" << typeid(T).name() << ", " << typeid(U).name() << ">" << endl; b();};
void b(void) { cout << "ノーマル b <" << typeid(T).name() << ", " << typeid(U).name() << ">" << endl; };
};
template<> void hoge<char, int>::a(void) { cout << "特殊 1 a <char, int>" << endl; b();}
template<> void hoge<char, int>::b(void) { cout << "特殊 1 b <char, int>" << endl; }
template<> void hoge<int, char>::a(void) { cout << "特殊 2 a <int, char>" << endl; b();}
template<> void hoge<int, char>::b(void) { cout << "特殊 2 b <int, char>" << endl; }

int main()
{
hoge<char, char> char_char; char_char.a(); char_char.b();
hoge<char, int> char_int; char_int.a(); char_int.b();
hoge<int, char> int_char; int_char.a(); int_char.b();
hoge<int, int> int_int; int_int.a(); int_int.b();
cin.get();
return 0;
}

エラーの原因は特殊化したa(void)内のb()がb(void)を特殊化する前に書かれていることのようでした。
a(void)とb(void)の記述を逆にすれば通ります。

そういうものなんでしょうか?(規格書読めってことですか)


213 名前:デフォルトの名無しさん :02/12/03 10:34
>>212
コンパイラがテンプレートインスタンスを作成する前に、
コンパイラに特殊化を知らせないといといけない。

知らせればいいんだから、
↓こんな宣言だけ先に書いといてやれば、定義の順は逆にしなくてもよくなるけど。
template<> void hoge<char, int>::b(void);


214 名前:デフォルトの名無しさん :02/12/03 19:08
http://www.cmagazine.jp/src/kinjite/cpp/index.html

ちょっとは役に立つだろう。

215 名前:デフォルトの名無しさん :02/12/03 20:15
Borland-C++5.5.1だと>>212は通りません(T_T)。

216 名前:デフォルトの名無しさん :02/12/04 01:55
FreeBSD gcc 3.2でstd::wstringを使うと、
リンクエラーが発生してしまうのですが、
解決方法はないでしょうか?

hoge% g++ a.cpp -lstdc++
/var/tmp//ccQ92fTH.o: In function `main':
/var/tmp//ccQ92fTH.o(.text+0x2b): undefined reference to `std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::basic_string[in-charge]()'
/var/tmp//ccQ92fTH.o(.text+0x92): undefined reference to `std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::length() const'
collect2: ld returned 1 exit status

----- a.cpp ----
#include <iostream>
#include <string>
#include <locale>
using namespace std;
int main()
{
wstring* wstr = new wstring();
cout << wstr->length() << endl;
return 0;
}

---- g++ ----
Reading specs from /usr/home/hoge/gcc/lib/gcc-lib/i386-unknown-freebsd4.5/3.2/specs
Configured with: ./configure --enable-languages=c,c++ --prefix=/usr/home/hoge/gcc
Thread model: posix
gcc version 3.2


217 名前:_ :02/12/04 02:15
テンプレートってコードのサイズが膨れ上がるから駄目だって友達がいうのですけど
本当の所どうなんでしょうか?
キャッシュがどうのって言ってたのですけど。

218 名前:デフォルトの名無しさん :02/12/04 02:24
インライン化によって膨れることもあるのは確かだが
パフォーマンス的にそれほど劣るとは考えにくい・・・

219 名前:デフォルトの名無しさん :02/12/04 02:41
ソートのclock()比較のプログラム作ってみたけど、インライン展開をONにする
とほとんど例外なくclock()が小さくなった。

驚いたのは、Cのqsort()関数まで速くなったことだ。どうなってるの?

220 名前:デフォルトの名無しさん :02/12/04 03:02
>>217
テンプレートを使ってコードサイズを減らす細工もつくれる。
結局は、使う側の問題。

でも普通に使ってる分には増えるのが普通だと思う。

221 名前:デフォルトの名無しさん :02/12/04 10:26
>>217
よく聞く話だが
実例をあげて議論すべきだと思う
例えばMFCとATLのように


222 名前:デフォルトの名無しさん :02/12/04 15:28
class Parent
{
 Child child;
public:
 Parent(): child(this){};
};
と書くとchild(this)で怒られます。
ブロック内でnew/deleteやchild.parent=thisならできますが
他にうまいやり方はないですか?

223 名前:デフォルトの名無しさん :02/12/04 15:31
>>222
何故怒られるのかを考えましょう。最適な答えがみつかると思います。
(一定ルールを守れればその警告は無視できます。)

224 名前:デフォルトの名無しさん :02/12/04 15:32
>>217
まぁCPUのキャッシュ使用効率とかを考慮してカリカリにチューンする
ような局面では、コードサイズが増えがちなテンプレートは嫌うだろうな。

ただ、チューンが必要なところだけinline asm使ったり、gogoやlame
みたいに一部nasm使ったりする手もあるわけで、いきなり全面否定も
どうかと思うが。

225 名前:222 :02/12/04 15:43
>(一定ルールを守れればその警告は無視できます。)
これは文法的に回避する方法があるということですか?
それとも>>222のような書き換えによってですか?


226 名前:デフォルトの名無しさん :02/12/04 15:46
>>217
templateをコンパイラがどう処理するのかよくわからないので何とも言えませんm(_ _)m

227 名前:デフォルトの名無しさん :02/12/04 15:53
テンプレートって上級者の証?
俺まだクラス覚えたばっかり。

228 名前:デフォルトの名無しさん :02/12/04 15:56
>>222
エラーメッセージをちゃんと読めよ
いやだろうけど教科書読むのと同じくらい大事だぞ

229 名前:デフォルトの名無しさん :02/12/04 16:04
>>222
エラーメッセージはコンパイラが怒ってるわけじゃないんだよ。

コンパイラ:
「すいません。私にはコンパイルできませんでした。
たぶん***が原因だと思うんですが・・・。
申し訳ないですが***を直してもう一度やってもらえないでしょうか?」

って感じだ。エラーメッセージを読めば大体理由はわかる。
(しゃべるのが下手なコンパイラもいるけどね。cl.exeとかcl.exeとかcl.exeとか・・・)

230 名前:デフォルトの名無しさん :02/12/04 16:11
>>229
別にコンパイルできないんじゃなくて、潜在的にバグの温床になりかねんから
警告してくれてるだけじゃねぇか。
「こういうことをしてると痛い目にあう可能性があるが覚悟はいいな?」
ってだけの話。

231 名前:デフォルトの名無しさん :02/12/04 16:11
普通にコンパイルできるじゃないか。

class Parent;

class Child {
public:
Child (Parent* p = 0) {}
};

class Parent {
Child child;
public:
Parent(): child(this){};
};

int main()
{
}

232 名前:デフォルトの名無しさん :02/12/04 16:18
>>227
普通の証。

233 名前:デフォルトの名無しさん :02/12/04 16:32
>>227
最高技術者の証。

234 名前:デフォルトの名無しさん :02/12/04 16:50
>>233
んなこたーない。

235 名前:222 :02/12/04 16:59
警告の意味は理解しているつもりです。
知りたいのはC++では初期化リストでメンバの初期化で
コンストラクタの引数にthisポインタや参照を要求されたら
一般的にどう対応するのかということです。
1.そもそもChild(Parent &parent), Child(Parent *parent)のようなコンストラクタを作らない。
2.警告を無視する。
3.parent/childの関係はよくあるので何かうまい方法があるはずでは。
なるべくなら1.2.は選びたくないので3.の方法はないのかということです。


236 名前:デフォルトの名無しさん :02/12/04 18:08
>>235
まず、どっちが正しいか間違っているかを大局的に判断すれ
ChildをParent*で初期化するのが間違っているのか
ChildがParent*で初期化できないのが間違っているのか

これで次の1手は決まる

237 名前:デフォルトの名無しさん :02/12/04 18:23
class Parent {
Child *child;
public:
Parent(): { child = new Child(this); };
~Parent() { delete child; };
};

238 名前:デフォルトの名無しさん :02/12/04 19:08
つーかそれってクソ設計じゃん

239 名前:デフォルトの名無しさん :02/12/04 19:17
まあ、未初期化の Parent& を渡して何が (゚д゚)ウマ- なのかはよくわからない

240 名前:デフォルトの名無しさん :02/12/04 19:35
>235
警告を無視する。あるいは親子間のリンクを張るメソッドを別に用意して、
コンストラクタの「中」で呼ぶ。

どっちも一長一短だから、好きな方を選んでくれ。

241 名前:デフォルトの名無しさん :02/12/04 19:36
>239
その時点では使わずに、あとで別のメソッドから使うんでしょ。

メンバ変数として Parent* ではなく Parent& を持たせたい場合、コンストラクタで
初期化するのは必須。

242 名前:デフォルトの名無しさん :02/12/04 19:51
>>241
Parent に Child の実体を持たせて、Child に Parent の参照を持たせるような
事はできたっけ?

243 名前:242 :02/12/04 19:56
できたね、ごめん。

244 名前:デフォルトの名無しさん :02/12/04 20:32
結局半端な&の仕様が糞ってことで。

245 名前:デフォルトの名無しさん :02/12/04 20:40
a?

246 名前:デフォルトの名無しさん :02/12/04 21:15
参照型メンバの初期化の方法がわかりません。
class Bのメンバaをどうやって初期化すればよいのでしょうか?

class A {
public:
A() {}
};

class B {
class A& a;
public:
B() {}
};

int main()
{
B b;
}

247 名前:デフォルトの名無しさん :02/12/04 21:32
>>246
class B {
A& a;
public:
B(A& aa):a(aa){}
};

main(){
A a
B b(a);
}

248 名前:デフォルトの名無しさん :02/12/04 21:35
>>247
ありがとうございます。早速試してみます

249 名前:デフォルトの名無しさん :02/12/04 21:43
class MyClass{
char *sDat;
public:
void SetDat(char *s);
MyClass(char *s);
MyClass();
MyClass(const MyClass &mc);
~MyClass();
MyClass & operator=(const MyClass &mc);
};

C++の本で勉強中なのですが、練習問題の○×問題で、
ア.void SetDat; はprivate: なメンバ関数である。(答え ○)

とあるのですが、なんで○になるのでしょうか?
激しく混乱しています・・・


250 名前:デフォルトの名無しさん :02/12/04 21:44
なんて本?


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