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


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

C++相談室 part6
751 名前:デフォルトの名無しさん :02/05/07 19:01
あ、クラス!=型 じゃなくて、
インスタンス != 型 だね。

752 名前: :02/05/07 19:03
???

753 名前:s :02/05/07 19:07
再度引用:
>そもそも クラス=型 としているC++が少し特殊なだけ
んじゃ、クラス=型としていない言語とは?

Smalltalkとかはクラスオブジェクトがあるけど、そういうのを言うのかな・・?

754 名前:デフォルトの名無しさん :02/05/07 19:12
>>750
メンバの無いstructだって、型だよ。
intだってvoidだって型だろ。

755 名前:デフォルトの名無しさん :02/05/07 19:20
俺も>740がわからん・・・

756 名前:デフォルトの名無しさん :02/05/07 19:49
>>739
定番の注意事項なんかを述べておくと、要らなくてもコピーコンストラクタと代入演算子は書いてください。中身要らんので。書いとくだけ。ただし呼べないようにprivateで。
でないとコンパイラが勝手にpublicでコピーコンストラクタと代入演算子を生成しやがります。

757 名前:_ :02/05/07 20:14
#include<stdio.h>

void main(void)
{
int a;


a = 10;
}

↑を実行すると「aの値は10です」と
出力するように変更すれって言う
問題が出たんだけど分かる人います?
誰か教えて下さい m(__)m

758 名前:デフォルトの名無しさん :02/05/07 20:17
>>757
printf("aの値は%dです\n", a);
というか激しくスレ違い。

759 名前:デフォルトの名無しさん :02/05/07 20:19
わかる人はいっぱいいるでしょう。
ただし、「aの値は10です」と出力するには、OSと処理系を書いたほうがいいでしょう。
それから問題はもっと厳密に。じゃないと、
#include<stdio.h>
void main(void)
{
 int a;
 a = 10;
 printf("aの値は10です") ;
}
という答が返ってきます。

760 名前:デフォルトの名無しさん :02/05/07 20:20
//#include<stdio.h>
#include <iostream>
void main(void)
{
int a;


a = 10;
std::cout << "aの値は" << a << "です" << std::endl;
}


761 名前:759 :02/05/07 20:20
空振り・・・

762 名前:デフォルトの名無しさん :02/05/07 20:21
宿題は別スレいけ

763 名前:デフォルトの名無しさん :02/05/07 21:07
#include<stdio.h>

int main(void)
{
puts("aの値は10です");
return 0;
}

764 名前:デフォルトの名無しさん :02/05/07 21:16
お前ら全然ダメ。
全角で数字出すんだぞ。わかッてんのか?


765 名前:_ :02/05/07 21:16
結局の所763が答えなのでしょうか?

>>762
どこのスレに行けば良いの?

766 名前:デフォルトの名無しさん :02/05/07 21:21
>>765
http://pc.2ch.net/test/read.cgi/tech/1011722640/
でももうすぐ1000だからお早めに。

767 名前:デフォルトの名無しさん :02/05/07 21:21
どこのスレいっても全角英数使うやつはダメ。

http://pc.2ch.net/test/read.cgi/tech/1011722640/

768 名前:デフォルトの名無しさん :02/05/07 22:20
・・・・
デバーグほどめんどくさい事は無い

誰かが言った言葉さ(;´ー`)
あーめんどい・・・・

769 名前:デフォルトの名無しさん :02/05/08 01:41
>>763 以外は
void main につっこんでないな。

770 名前:デフォルトの名無しさん :02/05/08 02:33
|  | ∧
|_|Д゚)
|文|⊂)
| ̄|∧| ネタハダメヨ・・・

771 名前:デフォルトの名無しさん :02/05/08 23:56
疲れたぽ・・・・
一人デスマーチ状態ぽ・・・

772 名前:デフォルトの名無しさん :02/05/09 00:51
テーブル持てば?

773 名前:デフォルトの名無しさん :02/05/09 01:22
>> 768

CppUnit 使うべし。


774 名前:デフォルトの名無しさん :02/05/09 01:56
>>773
知ったかハケーン
Unit Testはすでに完成(半完成)しているプロジェクトへの導入は困難です
最初から考慮して書かないとダメ

775 名前:デフォルトの名無しさん :02/05/09 10:20
protected:に物申す。
メンバにアクセスできる相手を、クラス側から指定できるfriendと、
アクセスしてくる側が勝手に接続してくる継承が何で同じ扱いなんだ?

776 名前:デフォルトの名無しさん :02/05/09 10:35
>>774
ってことはモデリングの段階でだめってことじゃん。
オブジェクト同士の結合度が密になっていなければ導入できるはずぽ。

777 名前:sage :02/05/09 11:35
誰かつっこんでやれよ >>775



778 名前:デフォルトの名無しさん :02/05/09 12:09
アンドリューさんのAccelerated C++ を読んだばかりの初心者なのですが、
私がコンパイラの実装等にあまり明るくないためか、8章で出てくる
typename の必然性がいまいち良く分かりません。その必要性を教えていた
だけないでしょうか? また typedef 以外で使う用途ってどんな場合があ
るのでしょうか?

779 名前:デフォルトの名無しさん :02/05/09 14:00
>>775 dempa jusinn tyuu?

780 名前:デフォルトの名無しさん :02/05/09 17:40
newとdeleteの多重定義を行ってメモリ管理を自前で行いたいと思っています。
自前で定義したnew演算子は呼び出せるのですが、
自前で定義したdelete演算子を呼び出す方法がわかりません。
どなたか正しい方法をご存知の方はいらっしゃらないでしょうか。
使用しているコンパイラはVC6です。




void *operator new( size_t size, my_allocator& alloc )
{
return alloc.allocate( size );
}

void operator delete( void* pointer, my_allocator& alloc )
{
alloc.deallocate( pointer );
}

class X;

void f( my_allocator& alloc )
{
X* array = new( alloc ) X(); // 自前で定義したnew演算子を呼び出す。

// delete( alloc ) X; // エラーが出る。この方法は間違いらしい。
// delete X; // 標準のdelete演算子が呼び出されてしまうのでダメ。
}


781 名前:デフォルトの名無しさん :02/05/09 17:46
globalのnewを上書くと、いろいろ面倒で、
classに対して定義しないとドツボだった記憶が。


782 名前:デフォルトの名無しさん :02/05/09 18:51
>>780
deallocateはsizeを指定しないとエラーになりませんか?
それから、my_allocateはallocator<X>から継承したものですか?

783 名前:デフォルトの名無しさん :02/05/09 19:14
>>782
今のところ、その部分ではエラーは発生していませんが、
deallocate()は第二引数としてサイズを指定しなけりゃいかんみたいですね。
直しておきます。ご指摘ありがとうございました。

size_type とか pointer とかの定義が面倒なので、
今のところ my_allocator を std::allocator を継承していますが、
そのうち独立させたいなあ、などと夢想しています。


784 名前:デフォルトの名無しさん :02/05/09 19:25
>>783
了解です。多分、delete array;で、自前のdeleteが呼び出されていると
思います。グローバルのdeleteを呼び出すときは ::delete array;となる
でしょうね。全体がわからないのでこちらでコンパイルできないのです
が、もし骨格部分でもうpしてくだされば、こちらで確認してみます。

785 名前:デフォルトの名無しさん :02/05/09 19:53
>>784
デバッガで追ってみたところ、 delete X とすると、自前のものではなくて
システム標準の operator delete() が呼び出されているようでした。
また、::delete X としても動作は変わりませんでした。

いくつかのC++の解説書を調べてみたところ(赤本第三版とかEffective C++とか)、
独自定義の operator new() の使用例は書いてありましたが、
operator delete() を独自に定義した場合は、システム標準と同じ引数で
例示されているものしか見あたりませんでした。

msdnオンラインのページには似たような例が載っていましたが、
operator delete()は再定義はしてあるものの、使用例が書いてないので涙。
http://www.microsoft.com/JAPAN/developer/library/vccore/vcrefcompilerwarning%28level1%29c4291.htm

骨格を切り離すのはちょっと難航中。


786 名前:デフォルトの名無しさん :02/05/09 19:57
>>785
784です。すみません、ちょっとガセを書いてしまったと思います。
newは柔軟性がありますが、deleteは引数を一つしか取れないので
ちょっと面倒ですね。コンテナのdeleteはどのようにして実現している
のかを知らないと書けませんでした。すみません、力不足でした。

787 名前:デフォルトの名無しさん :02/05/09 20:06
やっぱり
class foo : public myallocatio<foo>
{...};
みたいな、ModernC++な方法で……

788 名前:デフォルトの名無しさん :02/05/09 22:36
>>778
p141 のことかな? 確かにここの説明では必要性がよく分からないかも
しれんなあ。次のようなテンプレートを考えてみてくれ。
template<class T> class Foo {
public:
 typename T::size_type foo( const T& x );
};
メンバ関数 foo() は、T::size_type という型の戻値を返すんだが、
コンパイラが最初にこのコードを読んだときは、まだ T に実際の型が
与えられていない。それでもコンパイラは、上のコードを構文解析だけは
しなくちゃならない。というわけで、プログラマがコンパイラに対して
「T::size_type は何らかの型である」ということを教えてやる必要が
あるわけだ。
Accelerated では、typename vector<T>::size_type となっているが、
これだと、コンパイラは既に #include <vector> を通っているはずで、
vector<T>::size_type が何かの型だということをコンパイラは知って
いてもよいはずなんだよね。だから必要性がよく分からないんだと思う。
実際、VC++ なんかだと、typename が無くてもコンパイルが通ったり
するし。

789 名前:778 :02/05/10 00:08
>>788
すっごく分かりやすいです。完璧理解。
ありがとうございました。

790 名前:デフォルトの名無しさん :02/05/10 01:00
>>785
オーバーロードされた operator delete を使って delete pObj はできない。
オーバーロードされたものは、対応する operator new で確保した
オブジェクトのコンストラクタが例外をスローした時に呼び出されるようにコンパイラが使用する。

791 名前:デフォルトの名無しさん :02/05/10 11:49
>>780
そもそも operator delete をオーバーロードしたところで、new 演算子
と違い、delete 演算子には引数を付加することができないので、それを
呼ぶことは不可能。
つまり、void operator delete( void* pointer, my_allocator& alloc )
とかを定義しても、delete p; で、この operator delete が呼ばれる
ことはありえないということ。

781 も書いているように、やるなら、大域的な new/delete ではなく、
クラス内で new/delete を上書きするべし。
class X {
private:
my_allocator *pAlloc;
public:
void *operator new( size_t size, my_allocator& alloc )
{
pAlloc = &alloc;
return alloc.allocate( size );
}

void operator delete( void* pointer, size_t size )
{
pAlloc->deallocate( pointer );
}
}; // class X

void f( my_allocator& alloc )
{
X* array = new( alloc ) X(); // 自前で定義したoperator newを呼び出す。

delete X; // 自前で定義したoperator deleteを呼び出す。
}
こんなんでどう?

792 名前:791 :02/05/10 12:03
あ、すげーチョンボ。
operator new の時点じゃ、まだオブジェクトが構築されてないじゃんか。
書き直し。

class X {
private:
static my_allocator *pAlloc;
public:
void *operator new( size_t size, my_allocator& alloc )
{
if (pAlloc != NULL) pAlloc = &alloc;
return alloc.allocate( size );
}
……
}; // class X

my_allocator *X::pAlloc = NULL;

これでもいまいちだけど、やりたいことは分かるよね。

793 名前:791 :02/05/10 12:48
たびたびすまん。今、C++の仕様書を読み返したら、
void operator delete( void* pointer, size_t size );
というシグニチャを持った operator delete は存在しないようだ。
void operator delete( void* pointer );
を使ってね。
あと、>>790 の言ってるのは、
void operator delete( void* pointer, void * );
のことだね。

794 名前:デフォルトの名無しさん :02/05/10 14:11
g++でC++の勉強してるんだけど,日本語のライブラリマニュアルきぼんぬ.

書籍でも可.探したんだけど全然ない・・・

795 名前:デフォルトの名無しさん :02/05/10 14:48
辞典ならあるけど
http://shopping.yahoo.co.jp/shop?d=jb&id=30693818

796 名前:デフォルトの名無しさん :02/05/10 14:53
こんなんどう?
ttp://www-scc.jst.go.jp/riyou/users/users_guide/ucoma/FJcompiler/C++/index.html

797 名前:_ :02/05/10 15:13
>防衛関連の試験装置又は解析用ソフトの開発。Windows上でC言語で開発。

いきなりこんな事会社で言われてしまいましたが、これからC言語を学んで
いくとして、どのくらいでお金がもらえるレベルになりますか・・・?

一応Win、エクセル&アクセスでのVBAとVBEの基礎くらいならわかります。
あと、アクセスでSQLも少しならわかるくらいです。


798 名前:デフォルトの名無しさん :02/05/10 15:31
すれ違い

799 名前:794 :02/05/10 15:42
>>795-796サンクスコ.とくに>>796(・∀・)イイ!


800 名前:デフォルトの名無しさん :02/05/10 15:46
>>793 これならうまくいったぞ。

class X;

class my_allocator : public allocator<X> {
};

class X {
private:
static my_allocator *pAlloc;
public:
void *operator new(size_t size, my_allocator &alloc) {
if (pAlloc != NULL) pAlloc = &alloc;
return alloc.allocate( size );
}
void operator delete(void *pointer, size_t size) {
pAlloc->deallocate(static_cast<X *>(pointer), size);
}
};

my_allocator *X::pAlloc = 0;

void f(my_allocator &alloc)
{
X *array1 = new(alloc) X();

delete array1;
}
}

801 名前:デフォルトの名無しさん :02/05/10 16:00
800ですが、793さんの言われるとおり、
void operator delete(void *pointer, size_t size);という形式はないのですが、
なぜかコンパイルできてしまいます。
コンパイラはBorland-C++5.6です。今からgcc3.0で試してみます。

802 名前:デフォルトの名無しさん :02/05/10 16:04
801です。gcc3.0でも通ってしまいました。うむむ。どなたか解説キボンヌ。

803 名前:デフォルトの名無しさん :02/05/10 16:38
>>790
あー、なんとなくわかりました。

定義されているどの operator new() で確保しても、
例外発生した場合以外は、必ず operator delete( void* ) が呼び出される。

余計な引数を付け加えた operator delete() は、
あくまで例外発生時に呼び出すのが主目的であって、
ユーザーが任意に呼び出すことは出来ない、と。

わりと納得。


804 名前:デフォルトの名無しさん :02/05/10 19:41
802です。Borland-C++5.6でもgcc3.0でも、deallocateの第2パラメータは
ダミーで無視されていますね。Borland-C++は::delete()、gcc3.0ではfree
を呼び出していました。

805 名前:デフォルトの名無しさん :02/05/10 20:21
>>804
Effective C++ の 10項で、void operator delete(void *p, size_t size);
の形が使われてるね。そこの説明読むと、この形の operator delete も
必要だと思えるなぁ。

806 名前:デフォルトの名無しさん :02/05/10 20:52
>>805
どうしてもsize_tを持ったdeleteが必要な時がありますね。もっともこれは
オーバーロードだから、実際の解放には::operator deleteかdeallocateを
使うしかないわけですが。

807 名前:デフォルトの名無しさん :02/05/11 00:52
>>793
void operator delete(void *p, std::size_t size); はC++標準ではOKなはずだぞ。
今規格が手元に無いので自分では確かめてないのだが、
Exceptional C++によれば「3.7.3.3/2を参照されたい」とのこと。

808 名前:デフォルトの名無しさん :02/05/11 02:30
質問なのですけど
昔から#include <iostream.h>みたいに書いていたから
今もstd使わないでこういう書き方しているんですけども、
この書き方って何か問題あるんですか?
ANSI規格で、stdを使うように推奨していることは知っていますが、
using namespace std;とか
std::cout << とか書くのが面倒くさいんですけど。

809 名前:デフォルトの名無しさん :02/05/11 02:52
>>808
別に。using namespace std;書いた時点で、iostreamもiostream.hと同じ意味に
なっちゃうよ。例えば自前のcinを作りたかったら、それを my というnamespace
ででも包めばバッティングしない。

810 名前:790 :02/05/11 07:55
↓ここみるとだいぶわかる
http://www.google.co.jp/search?hl=ja&q=+site%3Awww.microsoft.com+%22Robert+Schmidt%22+new+delete&lr=lang_ja

811 名前:デフォルトの名無しさん :02/05/11 07:56
cin,coutのcはcharacterのc?C++のC?

812 名前:デフォルトの名無しさん :02/05/11 07:57
console

813 名前:デフォルトの名無しさん :02/05/11 07:58
>>812
なんだ・・・

814 名前:デフォルトの名無しさん :02/05/11 07:59
>>813
なんだとはなんだ

815 名前:デフォルトの名無しさん :02/05/11 08:01
>>814
なんだとはなんだとはなんだ

816 名前:デフォルトの名無しさん :02/05/11 08:14
>>815
なんだとはなんだとはなんだとはなんだ

817 名前:デフォルトの名無しさん :02/05/11 09:21
for (int i=0;i<4;++i){
  cout << "なんだとは";
}
cout << "なんだ" << endl;

818 名前:デフォルトの名無しさん :02/05/11 09:46
cout << "JAVA の授業さぼっちゃった" << endl;

819 名前:デフォルトの名無しさん :02/05/11 10:40
>>817
ワロタ

820 名前:デフォルトの名無しさん :02/05/11 11:22
>>807,>>810
おかげでかなり理解が深まったよ。ちょっとまとめてみる。長文すまん。

● placement-new に相当するような placement-delete 構文はない。
delete p; によって呼び出されるのは、次のどちらか一方。
void operator delete( void * );
void operator delete( void *, size_t );
前者が存在すれば、前者が呼び出される。
後者の size_t にどのような値が渡されるかは分からなかったが、
g++ で実験してみたところ、delete 演算子のオペランドとなったポインタを
dereference した型の sizeof になるようだ。

●placement-new 構文によるコンストラクト中に例外が発生した場合、
使用された operator new に対応するシグニチャを持つ operator delete が
暗黙裡に呼び出される。
例:
void *operator new( size_t, T1, T2, T3 ); に対しては、
void operator delete( void *, T1, T2, T3 ); が呼び出される。
このような operator delete を宣言しないとコンパイラが警告を出すことも
ある。

●placement な operator delete を明示的に呼び出してオブジェクトを
デストラクトしたい場合は、デストラクタを明示的に呼び出す必要がある。
例:
class X {};

class Foo {
public:
~Foo();
void *operator new( size_t, X& );
void operator delete( void *, X& );
};

X x;
Foo *p = new(x) Foo;
p->~Foo(); // デストラクタの明示的な呼び出し
Foo::operator delete( p, x ); // placement delete の明示的な呼び出し


821 名前:デフォルトの名無しさん :02/05/11 22:34
ねえーこれって無理なん?
コンパイラに怒られるんだけど・・。

error C2259: 'CTest' : 抽象クラスあるいは構造体のオブジェクトが宣言されています。

class CTest
{
TestM()
{
CTest* pTest = new CTest;
};
};


822 名前:デフォルトの名無しさん :02/05/11 22:36
>>821
コンパイラが怒るんなら、無理なんでしょう。書き方を変えてみる。
class CTest
{
  TestM();
};
CTest::TestM()
{
  CTest* pTest = new CTest;
}


823 名前:821 :02/05/11 22:38
勘違いですた、すまそん

824 名前: ◆Sd0g4XYw :02/05/11 22:41
BorlandのC++BuilderとかMicrosoftのC++とかはどう違うんですか?
MicrosoftC++しか使ったことないのでさぱ〜りです。
違いを教えてください。

825 名前:デフォルトの名無しさん :02/05/11 22:41
>>824
MS C/C++ってまだ出てるの?

826 名前:デフォルトの名無しさん :02/05/11 22:57
>>825
Microsoft C++ Compiler 13.0
http://www.microsoft.com/japan/msdn/visualc/

827 名前:デフォルトの名無しさん :02/05/11 22:58
>>826
その名前・・・正確なんですか?マジで。

828 名前:デフォルトの名無しさん :02/05/11 23:04
>>827
コマンドラインから cl とやると
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version XX.XX.XXXX for 80x86
Copyright(C) Microsoft Corp XXXX-XXXX. All rights reserved.
と表示されるよ。

829 名前:デフォルトの名無しさん :02/05/11 23:07
MS-Cの頃からの通番だからな

830 名前:デフォルトの名無しさん :02/05/11 23:07
>>828
勉強になりました。

831 名前:デフォルトの名無しさん :02/05/12 02:01
> Deletion of a pointer to an incomplete type is an unsafe programming
> practice because there is no way for the compiler to verify that the
> destructor is indeed trivial.

って書いてあるんですが、具体的にこれはどういうコードが unsafe なんでしょう?
そもそも "incomplete type" 「不完全な型」ってどういう意味なのかが分からない
んですが、どなたか教えて頂けませんでしょうか。

# やっぱり僕には boost はまだ早いですかねぇ・・・


832 名前:デフォルトの名無しさん :02/05/12 02:03
>>831
incomplete type っつーのは、たとえば

struct foo;
foo* p;

みたいに、実際の定義を与えていない宣言だけの型かと。

833 名前:831 :02/05/12 02:11
>>832
なるほど!たしかにそーゆー型に sizeof を適用したら
"incomplete type" ってエラーメッセージが出ました。(g++ 3.0.4)
それなら話は分かります。ありがとうございました m(_ _)m

834 名前:デフォルトの名無しさん :02/05/12 03:19
std::iterator_traits<int*>::value_type val;
VC6ですが、なぜこれでコンパイルエラーが出やがりますか?

835 名前:デフォルトの名無しさん :02/05/12 14:32
const int

int const
って何か違うの?
C++ って const の意味が増えたと聞いたんだけど・・・

836 名前:デフォルトの名無しさん :02/05/12 14:36
a)const int i
b)int const i
c)const int *p
d)int const *p
e)int* const p

a=b
c=d!=e

837 名前:デフォルトの名無しさん :02/05/12 14:36
int const のほうが幸せ。

838 名前:デフォルトの名無しさん :02/05/12 14:44
1) const int *p
2) int *const p
3) const int const *p
4) const int const *const p

訳分からんわ・・・・

839 名前:デフォルトの名無しさん :02/05/12 14:47
int const * const p なら幸せ。

840 名前:835 :02/05/12 14:48
>>836
thx!
a==b
c==d
である事が分かればそれでいいんだ。
テストコード書いて見た限りじゃ一緒っぽかったんだけど、
一応不安だったんで聞いてみたっす。
# さすがにc != e は分かっとるよ。

841 名前:デフォルトの名無しさん :02/05/12 14:50
>>838
3と4の先頭のconstは不要

842 名前:デフォルトの名無しさん :02/05/12 16:42
>>839>>841
産休。何となくわかってきました。今実験中です。

843 名前:831 :02/05/12 23:14
えーと、皆さんにとって有用性があるかどうかはカナーリ怪しいのですが、
お世話になったお礼というわけでもないんですけど、boost に関する指摘な
メモでも書いてみました。

http://www4.tkcity.net/~toshiki/boost/index.html

まだ勉強始めたばっかりなんで、内容薄いんですけど、今後も暇があれば勉強
した事を加筆していくつもりです。ですが、なにぶん若輩者故間違ったところ
等あると思うんで、そーゆーのは指摘して頂けるとありがたいです・・・

844 名前:デフォルトの名無しさん :02/05/13 01:45
前から831は大物になると踏んでたんだよね。

845 名前:デフォルトの名無しさん :02/05/13 07:15
>>843
なんていうか、目次頁がEUCで中身がSJISとかいう、文字コードごちゃまぜはやめてくれる・・・? IEが混乱するのよ・・・それか各頁で文字コードを指定しておくとか

846 名前:845 :02/05/13 07:17
ごめ。全部EUCやね。IEがおかしかっただけでした。

847 名前:デフォルトの名無しさん :02/05/13 10:11
まあでも SJIS または EUC で書くときは charset を指定して欲しいよね。
ブラウザによる自動判別にも限界があるし。

848 名前:847 :02/05/13 10:13
最初に文句がきちゃったみたいですまんけど、boost を読むとっかかりに
させてもらいます。

849 名前:831 :02/05/13 11:20
とりあえず content-type 指定しといたっす。
スマソ,スマソ。

ところで ref の使い方が分かんないんですがどなたか教えて頂けませんでしょうか。
僕の理解によると、

struct Aho : binary_function<int&, int, void>
{
void operator() (int& a, int b) const {cerr << a << " " << b <<endl;;}
};
struct Baka : binary_function<int, int, void>
{
void operator() (int a, int b) const {cerr << a << " " << b <<endl;;}
};

int main()
{
int i=30;
typedef boost::binder1st<Aho> funca;
typedef boost::binder1st<Baka> funcb;
Aho a;
Baka b;
funca fa = boost::bind1st(a, i);
funcb fb = boost::bind1st(b, boost::ref(i));
fa(0);
fb(0);
i = 20;
fa(0);
fb(0);
}

これで
30 0
30 0
20 0
20 0
と表示されるんじゃないかと思ったんですが、
30 0
30 0
20 0
30 0
ってなるんですよね。(g++ 3.0.4)
参照渡しのパラメータを持つ関数オブジェクト(Aho)でも ref 無しでも fb が
作れちゃうみたいですし、ref の効用がイマイチ分かりません。
どなたか教えて頂けませんでしょうか。
あ、Aho とか Baka っつーのは hoge とか foo みたいなもんなんで、あまりお気に
なさらずに・・・



850 名前:デフォルトの名無しさん :02/05/13 12:53
>>843
next(),prior()のところ、template <class T>じゃないの?

851 名前:841 :02/05/13 13:40
>>850 ご指摘の通りでした。直しておきました。ただオリジナルのドキュメントのコピペなんすよ、アレ。
オリジナルが間違ってるんですよねぇ。でも英語書けないから報告は出来ないや。

ちなみに作りかけの ref を間違ってウプしとりました。見なかった事にして下さい。


852 名前:831 :02/05/13 16:28
>>851 は841じゃなくって831の間違いです。スマソ。 # boost::any 見てたらちょっと感動した。
# でもこれあんま使えないような・・・。


853 名前:デフォルトの名無しさん :02/05/13 23:34
template<int N>struct STA{
static N;
};
void main(void)
{
int a[10]={STA<12>::N};
}
test.obj : error LNK2001: 外部シンボル ""public: static int STA<12>::N" (?N@?$STA@$0M@@@2HA)" は未解決です

・・・・・・・・・・・・・分からない、ナンデ??

854 名前:デフォルトの名無しさん :02/05/13 23:38
template<int I>
struct STA {
 static int N;
};

template<int I>
static int STA::N = I;

855 名前:デフォルトの名無しさん :02/05/13 23:51
>>854
サンクス♪

856 名前:デフォルトの名無しさん :02/05/14 00:46
キタ━━(゚∀゚)━━ァ!
と思ったら終わってた・・・打つ

857 名前:831 :02/05/14 01:04
>>856
もしかしてウチの事でしょうか・・・なんか今tkcityの名前が引けないっぽい
んですよね。DNSが死んだっぽくって。まぁその内アクセス出来るようになると
思うんで・・・
# スレ汚しスマソ

858 名前:デフォルトの名無しさん :02/05/14 04:18
あるクラスのメンバ変数の名前を
つけかえたいんですが、そんなことは可能でしょうか?

859 名前:デフォルトの名無しさん :02/05/14 04:45
言いたいことはよくわからないけれど、
define、参照、置換、プロパティのどれかでできるとおもう

860 名前:デフォルトの名無しさん :02/05/14 06:24
std::mapでもにたことができるかも

861 名前:858 :02/05/14 07:23
>>859
ありがとうございます。
参照で出来ました!

862 名前:デフォルトの名無しさん :02/05/14 18:53
あの有名なVNCのソースを見ていて疑問がわきました。

class _OMNITHREAD_NTDLL_ omni_mutex_lock {
omni_mutex& mutex;
public:
omni_mutex_lock(omni_mutex& m) : mutex(m) { mutex.lock(); }
~omni_mutex_lock(void) { mutex.unlock(); }
private:
// dummy copy constructor and operator= to prevent copying
omni_mutex_lock(const omni_mutex_lock&);
omni_mutex_lock& operator=(const omni_mutex_lock&);
};
上記クラスのコンストラクタで引数omni_mutex&mを受け取りomni_mutexのコンストラクタに渡しています
ここでomni_mutexのコンストラクタに引数omni_mutex&を受け取る物はありません。
const omni_mutex&を受け取る物ならありますがこれはコピーコンストラクタのダミー定義だけです
omni_mutex_lock(omni_mutex& m) : mutex(m) { mutex.lock(); }のmutex(m)はエラーにならないのですか?


863 名前:デフォルトの名無しさん :02/05/14 18:55
>>862
2行目をよく見てみそ

864 名前:862 :02/05/14 18:58
参照だとどうなるのですか?

865 名前:デフォルトの名無しさん :02/05/14 19:01
教えてくんか。
これ以降はFAQだ

866 名前:862 :02/05/14 19:07
参照だとコンストラクタを呼ぶ必要は無いですが(と思う)
この場合mutex(m)はどう働くのですか?
教えて君で申し訳ないのですがよろしくどうぞ。

867 名前:デフォルトの名無しさん :02/05/14 19:09
参照の初期化!=オブジェクトの初期化

868 名前:デフォルトの名無しさん :02/05/14 19:09
int i = 10; // 普通の変数の初期化
int&j = i; // これは何でしょうね?

869 名前:862 :02/05/14 19:13
要するにポインタでかくと
omni_mutex *mutex;
mutex = &m;
みたいな事ですよね。
でも : mutex(m)ってのはコンストラクタを呼ぶ物じゃないんですか?

870 名前:デフォルトの名無しさん :02/05/14 19:13
>>869
呼ばない

871 名前:862 :02/05/14 19:26
本来:mutex(m)みたいな記述はmutex=mの意味なんですか?
operator=が禁止されているのでこんな風にやるとか?


872 名前:デフォルトの名無しさん :02/05/14 19:29
>>871
どうぞ
http://pc.2ch.net/test/read.cgi/tech/1018454705/865

873 名前:デフォルトの名無しさん :02/05/14 19:30
int i( 10 ); // 普通の変数の初期化
int&j( i ); // これは何でしょうね?

874 名前:デフォルトの名無しさん :02/05/14 19:39
>>873
あ、そっか。
初期化の=はコンストラクタ呼ぶんだ。

875 名前:862 :02/05/14 19:41
int i(10);なんて初期化の方法があったんですね。。知りませんでした。

参照の場合も要はポインタだから組込型と同じようにコンパイラは初期化の方法を知ってて
クラスの場合はコピーコンストラクタとかを呼ぶんですね?


876 名前:831 :02/05/14 20:41
なんか tkcity 氏んだままなので、移転しました。
http://members13.tsukaeru.net/toshi/
間違っとる所とか、指摘して頂けると幸いです。
# boost 関係のページは実はダミーなんですけどね(藁


877 名前:デフォルトの名無しさん :02/05/14 21:04
>>875
だから呼ばんちゅうに。あんたもガンコな人だね。

878 名前:デフォルトの名無しさん :02/05/14 21:17
>>877
参照=ポインタならC++には参照はいらないな。

879 名前:デフォルトの名無しさん :02/05/14 21:36
>>862
omni_mutex& mx0( m );
omni_mutex mx1( m );

これら二つがまったく異なることは気がつきましたか?
ちなみに配置されているアドレスを比較すると、以下のようになるはず。

&mx0 != &mx1;
&mx0 == &m;


880 名前:デフォルトの名無しさん :02/05/14 21:39
>>878
なんで 877 を指しているのかは謎だけど、機能的には、
T& foo == T* const foo
じゃないの?

881 名前:デフォルトの名無しさん :02/05/14 21:50
>>880
バインドについて勉強してこい

882 名前:デフォルトの名無しさん :02/05/14 22:08
>>881
ああ、シンタックス上有用、というのはそのとおり。
「機能的」と書いたのが間違い。「機構的に」と書くべきだった。

883 名前:デフォルトの名無しさん :02/05/14 22:08
独立参照ですよね?

884 名前:デフォルトの名無しさん :02/05/15 00:26
C#のようにクラスの中にmainを含めることはできないのですか?


885 名前:デフォルトの名無しさん :02/05/15 00:27
HOGE h( 10 ); // 普通のコンストラクタ
HOGE h2=10; //これはなんでしょうね?

886 名前:デフォルトの名無しさん :02/05/15 00:29
C.C.やね。
確かカーボンコピー。

887 名前:デフォルトの名無しさん :02/05/15 00:34
explicit 付けなさいってこった。

888 名前:デフォルトの名無しさん :02/05/15 01:23
よし!
C++のことならぜんてわかるから
質問があるならこの俺に

889 名前:デフォルトの名無しさん :02/05/15 01:26
>>888
8Qeensをコンパイル時に解く方法はありますか?

890 名前:888 :02/05/15 01:29
うえーん(p_;)
ごめんなさい出直します

891 名前:889 :02/05/15 01:33
スペリングミスつてた
Qeens -> Queens

892 名前:888 :02/05/15 01:51
ちょっと変えます

C++の"基本的なこと"なら何でも俺に聞け!

893 名前:デフォルトの名無しさん :02/05/15 02:02
・class Baseから派生したA,B,Cがある
・クライアントからはBaseしか見えない
・これらのインスタンスをソートする際の比較を、 AB、AC、BC等、
 相手クラスとの組み合わせによって、別々の方法で比較しなければならない

これに今後D,E,Fと追加される予定がある場合にも、
柔軟に対応できるよい設計方法ってないでしょうか?
できればダウンキャストを使いたくないのですが、やはり使うべきでしょうか?

894 名前:デフォルトの名無しさん :02/05/15 02:34
>893
それぞれが 中間的な比較対象を生成して、それを比較するとか。
例えば、現在の内部状態を一旦数値化して、それを比べるっていうのだと
Baseに state_to_val() = 0; というのを用意しておいて、具体的な実装はA,B,C側でやる。

class A{
 //...
 bool operator< (const Base& b){
  Val val1 = this->state_to_val();
  Val val2 = b.state_to_val();
  return val1 < val2;
 }
 //...
}

Base* pb1 = new A;
Base* pb2 = new C;
if( pb1 < pb2 ) //...

…頭が回ってないので変なこと書いてたらスマソ

895 名前:デフォルトの名無しさん :02/05/15 03:07
>>894
レス感謝です。これならメチャスマートですねぇ。

具体的にはA,B,Cは独自プリミティブ、ソートはZソートなんです。
894さんの言う中間的な比較対象を、Z値のmin、maxとして
引っかかった場合のみ、もにょもにょするのが良いのかな…。

できればこの、もにょもにょの部分(円と方形のコリジョン判定など)も、
中間的な比較対象として一般化したいのですが、難しいですよねぇ…。

もう少し悩んでみます。アドバイスありがとうございました。
あ…、気づいたらサッカー終わってる(´Д⊂

896 名前:デフォルトの名無しさん :02/05/15 08:32
試してないから動く自信なっしんぐだけど…

bool operator< ( const Base& lhs, const Base& rhs ) {
 return lhs.isLessThanBase( rhs );
}
class Base {
 virtual bool isLessThanBase( const Base& rhs ) const = 0;
};
class D1 : public Base {
 virtual bool isLessThanBase( const Base& rhs ) const { return rhs.isMoreThan(*this); }
 template<class T>
 bool isMoreThan( const T& rhs ) const { return Compare(*this, rhs)>0; }
};
class D2 : public Base {
 virtual bool isLessThanBase( const Base& rhs ) const { return rhs.isMoreThan(*this); }
 template<class T>
 bool isMoreThan( const T& rhs ) const { return Compare(*this, rhs)>0; }
};

でごっそりとCompareを用意とか。
「ダブルディスパッチ」で検索かけてみると良いと思われ。

897 名前:896 :02/05/15 08:36
あーだめだ。↑それじゃ全く駄目。回線切って寝てきます。さらば。

898 名前:デフォルトの名無しさん :02/05/15 10:14
>>895
共通的な比較対象に変換するというアプローチならば
すべてポリゴン(三角形リスト)に変換するというのもアリかな。
実行速度の点でダメだろうけど。
ダブルディスパッチをするのならVisitorパターンをオススメする。
ダウンキャストしない方法は多分それしかない。
Modern C++ に依存関係を最小にするVisitorパターンのやり方とか
のってるよ。

899 名前:デフォルトの名無しさん :02/05/15 11:41
age age♪

900 名前:893 :02/05/15 15:33
だ、ダブルディスパッチすごいです!むはー、ダウンキャスト使用と拡張性は
不可避なトレードオフだとと思ってたのに、こんなエレガントな解決法があるなんて…。

今回は、比較対照である要素が2つという特殊なケースだったので、
ConcreteVisitorA〜Cを用意し、それぞれをA〜Cに関連づけ、Visitorを
B.conpare(A->VisitorA)の様に渡す事によって、実行時型チェックを避けることができました。

できれば中身は同じなのに、別のものとしているABとBAの扱いを、
同じものにできれば、ConcreteVisitorも一つにまとまり、
素晴らしそうなのですが…これは今後の課題にしたいと思います。
>>896
うちのショボーンコンパイラだと、クラス内の関数テンプレートが
うまく自動生成してくれなくて…でも今後の参考にさせて頂きます。
>>898
三角形リストでやっておいてから、もとのプリミティブに還元……と。
これも分かり易いですねぇ…。Modern C++の紹介も感謝、入手しておきます。

お二人ともレス、ありがとうございました!

901 名前:デフォルトの名無しさん :02/05/15 17:50
VisitorとAcceptor(A〜C)の二人でダブルなディスパッチな訳だから
Visitorがひとつになることはないよ。
行列の行と列のようになるはず。
で、順番入れ替えは・・上の話でもう自明かと。
それからModernは(もし読んでなければ)
デザパタ本読んでからのほうが良いと思われる。

902 名前:893 :02/05/15 23:06
>>901
AcceptorA( VisitorB )と
AcceptorB( VisitorA )という、同じ処理なのに別の記述なとこを
どうにかできたらと思ったのですが、仰るとおりでこれやったらダブル
ディスパッチでもなんでも無くなるんですね。考えてみたらもう一枚クラスを
かませれば良いだけですし…。いやはや、素人の浅知恵でした…。

ご推察の通り、私はGoF本の分かり易いところ拾い読みした程度でして…。
今回のことで感銘を受けたので、もう一度基礎から読み直してみたいと
思います。ご忠告ありがとうございました。

903 名前:デフォルトの名無しさん :02/05/17 04:22
VCだとコンパイルできるんだけど、BCCやMingwだと先頭のclassのところで
エラーになっちゃいます。なぜでしょうか?

------------------

/* Tera Term
Copyright(C) 1994-1998 T. Teranishi
All rights reserved. */

/* TTMACRO.EXE, error dialog box */

// CErrDlg dialog
class CErrDlg : public CDialog
{
public:
CErrDlg(PCHAR Msg, PCHAR Line, int x, int y);

//{{AFX_DATA(CErrDlg)
enum { IDD = IDD_ERRDLG };
//}}AFX_DATA

//{{AFX_VIRTUAL(CErrDlg)
//}}AFX_VIRTUAL

protected:
PCHAR MsgStr, LineStr;
int PosX, PosY;

//{{AFX_MSG(CErrDlg)
virtual BOOL OnInitDialog();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

typedef CErrDlg *PErrDlg;


904 名前:デフォルトの名無しさん :02/05/17 04:30
MingwやBCCでMFC使えるようにしてるん?

905 名前:デフォルトの名無しさん :02/05/17 04:38
そのくらいやってるよ。ば〜か
もっと気の利いたこといえヴォケ

906 名前:デフォルトの名無しさん :02/05/17 04:45
>>904
ああ、これってMFCだったのですね。
実はC++ではろくに書いたことがなくて、さらにWindowsでプログラムを
書いたこともロクにないもんで気づきませんでした。

確かにBCCにはMFCはついてきませんね。さて、どうしたもんかなあ。


907 名前:デフォルトの名無しさん :02/05/17 04:48
>906
仕事でやってるんですか?趣味でやってるんですか?

908 名前:デフォルトの名無しさん :02/05/17 04:52
>>906
つか、あんた……他人のコード、名前入りで晒すなよ……

909 名前:デフォルトの名無しさん :02/05/17 04:54
著作権侵害だあ

910 名前:デフォルトの名無しさん :02/05/17 04:56
>>907
趣味なのです。
TeraTermにSSH2をつけようとしてて、それだけだったら
MFCと関係なくやれるのですが(だいたいできた)、
どうせならTeraTermもろとも、無料環境でコンパイルできるように
したいなと思ったのです。

911 名前:デフォルトの名無しさん :02/05/17 04:58
>>903

以上Windowsプログラミングの知識0のド素人の激しくスレ違いな妄言でした。

912 名前:デフォルトの名無しさん :02/05/17 05:01
>910
仕事でなくてよかったですねぇ。そのレベルで仕事だったら大変です。
以前ヴァカ上司がVC++の仕事をC++やろ?とかいって取ってきたときは地獄を見ました。


913 名前:デフォルトの名無しさん :02/05/17 05:05
>>906
ftp://ftp.digitalmars.com/Digital_Mars_C++/MS/4.21/MFC4.21.zip
MFCとATL落ちてるんで拾ってきて使えるようにしよう

914 名前:デフォルトの名無しさん :02/05/17 05:10
>>911
大変失礼しました。

>>912
私ごときのレベルではとてもプログラミングを業とすることはできませんね。
もっと勉強が必要なのですが、Windows関係はなんでもお金が高くついて
いけません。


915 名前:デフォルトの名無しさん :02/05/17 07:20
class A {
 const int c;
public:
 A() : c(0) { }
};

class B : A { };

B b1, b2;
b1 = b2;

このコードが通りません
constメンバを持つクラスにはoperator=がデフォルトで設定されないのでしょうか?

916 名前:デフォルトの名無しさん :02/05/17 07:20
age

917 名前:デフォルトの名無しさん :02/05/17 07:30
>>915
operator = はコンストラクタじゃない。
コンストラクタじゃないから const メンバは変更できない。
だから暗黙の生成はされないってことでしょ。

918 名前:デフォルトの名無しさん :02/05/17 07:52
>>913
Digital Mars C++用のものを無理矢理Mingwにつっこんでみましたが、
必殺Internal Compiler Errorになってしまいました。手も足も出ん。


919 名前:デフォルトの名無しさん :02/05/17 08:07
>>918
修正しろって。
MFCはたいしたことやってないから、時間を掛ければ凡人にも直せる

920 名前:デフォルトの名無しさん :02/05/17 08:21
>>919
他のエラーならどうにかこうにかAdHocに直せるだろうが、
Internal Compiler Errorじゃどうしていいのかわからん。


921 名前:デフォルトの名無しさん :02/05/17 08:26
error message全体をコピペしないってのは単なる妄言としか思えませんが。
むしろ君の出力ではどうしていいのかわからん。

922 名前:デフォルトの名無しさん :02/05/17 10:04
placement newを使うのに必要なメモリ量ってどうやって得るのでしょうか?

class A { };
BYTE b[sizeof A * 2];
A* pa = new(b) A[2];
これだとオーバーランしちゃうと思うんですが

923 名前:デフォルトの名無しさん :02/05/17 11:10
>>922
alignment の問題をいってる?

924 名前:デフォルトの名無しさん :02/05/17 16:08
1つのソ−スが大きくなる時
クラスのメンバ関数を別ファイルで定義してインクルードするのはありなんですか?

925 名前:デフォルトの名無しさん :02/05/17 16:24
>>924
include = そのまま挿入

だから動くだろうけど読みやすいかと言えば死ぬほど読みにくい。

926 名前:デフォルトの名無しさん :02/05/17 16:26
template ライブラリはしょがないじゃねかと蛙鳴く

927 名前:デフォルトの名無しさん :02/05/17 18:48
Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted.

.netでC++プロジェクトでコーデングしているとこのような警告ダイアログが出て止まってしまいます。
これはどういうことでしょう。スタックオーバーフローというやつでしょうか。

928 名前:デフォルトの名無しさん :02/05/17 18:57
実行時のチェックの失敗ー
変数a 周辺のスタックの内容が破壊されました。

よくあるエラーだねぇ・・。

929 名前:922 :02/05/17 19:08
>>923
alignmentじゃないです。
たとえばdouble[2]とかでもかまいません
http://www.google.co.jp/search?q=cache:u_dSdwqiAL8C:www.eva.hi-ho.ne.jp/reki/diary/2001/20010206.htm+placement+new&hl=ja&lr=lang_ja
ここを見ると配列で取ると管理領域分余分にメモリを消費するようで、
これが規定されてるのか不満なんです

930 名前:デフォルトの名無しさん :02/05/17 20:17
#include <stdio.h>
void main (void)
{
int a,b,c;
scanf("%s %s %s",&a,&b,&c);

printf("%5s\n",a);
printf("%11s\n",b);
printf("%16s\n",c);
}
コンパイルエラーはないんですが
実行するとエラーが出るのですが原因わかりますか?
メモリがどうたらこうたら初心者でスマソ

931 名前:デフォルトの名無しさん :02/05/17 20:21
>>930
mainの戻り値はint

932 名前:デフォルトの名無しさん :02/05/17 20:22
>>930
貴方は2つの罪を犯しています。
1つ目の罪はその質問はC質問スレですべきということで、
2つ目は罪はprintfのドキュメントをちゃんと読んでないこと、
です。%sが文字列であることを確認してからやり直しましょう。

933 名前:0927 :02/05/17 20:23
>>928
なるほど。見直してみると配列a[10][10]の添え字の範囲を超えてアクセスしていました。

934 名前:デフォルトの名無しさん :02/05/17 20:25
>>931
うーん、意味がわからない。無知でスマソ
>>932
ドキュメント?
すれ違いでしたか
逝ってきます

935 名前:デフォルトの名無しさん :02/05/17 20:26
>>929
operator new() と operator new[]() は別物だよ。そのリンク先の人は、
カン違いしてるか、古い仕様の C++ コンパイラを使ってると思われる。

936 名前:デフォルトの名無しさん :02/05/17 20:32
>>929
示された URL に...

> だが、管理領域のサイズはどこにも定義が無いことから、これらは
> 不定のサイズと考えるべきだ。他のコンパイラでは(場合によっては
> コンパイルオプション次第で)違うサイズの管理領域を確保している
> 可能性は十分ある。

と書かれているが...。これじゃ不満なの ?

こんなことがしたいのなら、::operator new() と ::operator delete()
を適切に定義すべき。

937 名前:922 :02/05/17 20:45
>>936 これじゃ不満なの ?

不定であるなら、それを求められないと必要なメモリ量が分からないから、どうすればいいの?
って質問なんですけど



938 名前:936 :02/05/17 20:53
>>937
だから ::operator new[]() と ::operator delete[]() を定義しろと、
書いてあるんだけど、見えないのか ?
(そう言えば、仕様変わったんだよな、忘れてたよ。サンクス。>>935)

939 名前:935 :02/05/17 20:56
すまん、カン違いしていたのはオレのほうみたい。
void *operator new[]() を定義した場合は、てっきり、これが返す
アドレスから配列はが始まると思っていたのだが、やっぱり、先頭部は
管理領域になるようだ。

940 名前:デフォルトの名無しさん :02/05/17 21:11
boost 1.28.0 age

941 名前:935 :02/05/17 21:12
ただし、operator new[](size_t size, ...) の size には、
その管理領域も含めたサイズが渡ってくるので、メモリを確保するのは
そこでやればよいのかな。

942 名前:デフォルトの名無しさん :02/05/17 23:10
1.28の目玉はlambdaか。

943 名前:デフォルトの名無しさん :02/05/17 23:15
>>942
LISPみたいな?

944 名前:831 :02/05/18 00:38
>>943
こんな感じに書けるんよ。結構感動。

vector<int> v(10);
for_each(v.begin(),v.end(), _1 = 50);
for_each(v.begin(),v.end(), cerr << _1 << " ");

945 名前:デフォルトの名無しさん :02/05/18 00:41
>>944
1行foreach、へぇ。

946 名前:831 :02/05/18 00:43
lambda の説明としてはこっちの方が適切か。

int i = 3, j = 5,k;
k = (_1 + _2)(i, j); // k = 8

947 名前:デフォルトの名無しさん :02/05/18 01:01
>>944
for_each(v.begin(),v.end(), cerr << "error: " << _1 << " ");
となると素直には書けないので constant() とか使わないと
いけないのが、ちょびっとだけ悲しいんだけどね。

948 名前:デフォルトの名無しさん :02/05/18 04:12
あげ

949 名前:デフォルトの名無しさん :02/05/19 04:46
class CTest
{
public:
int m_i;
CTest& operator+=(const CTest& t)
{
(*this).m_i += t.m_i;
return (*this);//これは必要なのか。
}
};

operator+= にreturn(*this)は必要なんでしょうか?
なくても動くような気がするのですが、どのような場合、
return (*this); が必要なのでしょうか。


950 名前:デフォルトの名無しさん :02/05/19 04:56
>>949
戻り値があることについては、
a = (b += c);
というふうに、足した結果をさらに参照できるよううに。

戻り型が値でなく非constの参照なのは、代入結果の左辺値にさらに変更を加えることを許すためじゃないすか。
(a += b) += c;
とか。

951 名前:949 :02/05/19 05:01
>>950
なるほど、
>a = (b += c);
のような使い方、したことなかったので、気がつきませんでした。
納得しました。ありがとうございました。


952 名前:デフォルトの名無しさん :02/05/19 05:01
>>950
>> (a += b) += c;

でもそれって int とか基本型では保証されてないって聞いた覚えがあるぞ。気のせいか?

953 名前:デフォルトの名無しさん :02/05/19 05:12
const CTest& operator=(const CTest& t)

954 名前:デフォルトの名無しさん :02/05/19 05:13
const CTest& operator=(const CTest& t) const
なんつって

955 名前:デフォルトの名無しさん :02/05/19 05:34
状態を変更するからoperator=() constはありえない

956 名前:デフォルトの名無しさん :02/05/19 09:45
//例外をthrowできない関数
void Test1() throw()
{
throw 1;//Error!
}
//例外をthrowできる関数
void Test2 throw(...)
{
throw "Test2";//Ok
}
//例外をthrowできる
void Test3() throw(int)
{
throw 1;//Ok
}
throwについて調べてるんですが、
末尾につけるthrow(...),throw()は、
プログラムのミスを避けるためのものだと思うのですが、
使わないと最適化への影響や何らかの弊害があるのでしょうか?
よろしくお願いします。

957 名前:思い出 :02/05/19 09:45
class C{};

C obj_c();  //これでデフォルトコンストラクタ呼んでたと思ってた

958 名前:デフォルトの名無しさん :02/05/19 09:47
>>956
帰ってくる例外の型を特定するための機能だよね。


959 名前:デフォルトの名無しさん :02/05/19 10:06
>>958
void Test4() throw(unsigned int)
{
throw 4;
}

void TestCatch1();
{
try{
Test2();
Test3();
Test4();
}
catch(int){//型がわかる
//Test2
}
catch(unsigned int){//型がわかる
//Test4
}
}

TestCatch2() throw()
{
try{
TestCatch1();
}
catch(...){//残り
//Test3
}
}

あいまいさを解決できるということですね。納得できました。

960 名前:デフォルトの名無しさん :02/05/19 10:08
そういうわけでもないんだが。
呼び出し側が捕捉すべき例外を明示するための機能。
throw(unsigned int)と指定されていれば、
throw floatは成立し得ない(プログラムが落とされる

961 名前:デフォルトの名無しさん :02/05/19 10:08
>>952
気のせいだろ。というか、その程度、ちょっとコンパイラで
確認すればいい話じゃないのか?
> (a += b) += c;
このコードは、VC6SP5 , bcc5.5.1 , gcc2.95.3-6 で
コンパイルが通って、なおかつ期待通りに計算されてたぞ。
ただ、ついでに確認したhttp://www.digitalmars.com/
コンパイラだと、コンパイルが通ってくれなかったな。
このコンパイラがヘヴォなだけだと思うんだが…。
本格的に確認したければ、プロ言C++を見るしか。

>>953>>954
operator=()の戻り値をconstにはするな、とEffective C++に
書いてある。理由は、Scott Meyersお得意の『intのように振舞え』
だったけど。
Exceptional C++にもconstにはするな、と書いてある。こっちの理由は、
STLのコンテナに入れられなくなるから、だ。
そういうわけで、constを付けちゃいけない。

962 名前:デフォルトの名無しさん :02/05/19 10:10
>>960
throwする側が仕様以外の例外を返さないようにする保険のようなもんじゃないの?

963 名前:デフォルトの名無しさん :02/05/19 10:15
>>962
する側じゃなくて、される側のために用意してあるもんなんだが

964 名前:デフォルトの名無しさん :02/05/19 10:17
>>963
まぁ、お互いのためだ。

出す側が未定義の例外投げればコンパイルエラーになるし、出される側も飛んでくる型が特定できる。


965 名前:デフォルトの名無しさん :02/05/19 10:23
もし同じ型の例外が複数きたときはどうすればいいんでしょうか?

966 名前:デフォルトの名無しさん :02/05/19 10:25
>>965
その例外の値(intとか)クラスメンバ(Exception.typeみたいな)で判断するべし。

967 名前:デフォルトの名無しさん :02/05/19 10:25
>>964
コンパイルエラーにはならないっしょ。例外仕様が指定されていないライブラリのために。

>>965
言ってる意味がわからん。例外は、投げるときは必ずひとつのはずだが。

968 名前:965 :02/05/19 10:37
>>967
よく考えてみれば、一つですね。
>>966
例外処理クラス作ります。


969 名前:デフォルトの名無しさん :02/05/19 10:42
uncaught_exceptionがサポートされてない処理系(VCとか)で
スタックに確保したオブジェクトのデストラクタがthrowするとか。

970 名前:デフォルトの名無しさん :02/05/19 11:12
>>969
例外のためのアンワインド中に、スタック上のオブジェクトのデストラクタが
さらに例外を投げた場合って意味か?
その場合はいきなりプログラムがあぼーんじゃなかったっけ。
だからデストラクタでは例外を投げるなよ、といろんな本に書いてあるのでは。

971 名前:デフォルトの名無しさん :02/05/19 12:10
>>957
えっ?違うの・・・?
# ネタじゃありません・・・

972 名前:デフォルトの名無しさん :02/05/19 13:40
ていうか
もう痔スレ立てますよ?

973 名前:デフォルトの名無しさん :02/05/19 13:44
>>972
よろしこ。

974 名前:デフォルトの名無しさん :02/05/19 13:44
>>972
おっと、いつのまに1000間近か…よろしく

975 名前:デフォルトの名無しさん :02/05/19 13:52
>>971
関数宣言になっちゃう

976 名前:971 :02/05/19 14:02
>>975
ナルホドサンクスコ。

977 名前:デフォルトの名無しさん :02/05/19 18:05
C++相談室 part7
http://pc.2ch.net/test/read.cgi/tech/1021787032/l50
新スレ

978 名前:デフォルトの名無しさん :02/05/20 08:25
v(^・^)v

979 名前:デフォルトの名無しさん :02/05/20 10:21
グッシッシ

980 名前:デフォルトの名無しさん :02/05/20 13:55
v(^・^)v

981 名前:     :02/05/21 00:45
C++相談室 part7
http://pc.2ch.net/test/read.cgi/tech/1021787032/l50
新スレ


982 名前:デフォルトの名無しさん :02/05/21 22:29
v(^・^)v

983 名前:デフォルトの名無しさん :02/05/22 00:09
v(^・^)v

984 名前:デフォルトの名無しさん :02/05/22 09:08
v(^・^)v

985 名前:デフォルトの名無しさん :02/05/22 15:08
v(^・^)v

986 名前:デフォルトの名無しさん :02/05/22 18:15
(゚Д゚) 何見てんだゴルァ!!

987 名前:デフォルトの名無しさん :02/05/22 18:15
(゚Д゚) 何見てんだゴルァ!!

988 名前:デフォルトの名無しさん :02/05/22 18:15
(゚Д゚) 何見てんだゴルァ!!

989 名前:デフォルトの名無しさん :02/05/22 18:15
(゚Д゚) 何見てんだゴルァ!!

990 名前:デフォルトの名無しさん :02/05/22 18:15
(゚Д゚) 何見てんだゴルァ!!

991 名前:デフォルトの名無しさん :02/05/22 18:15
(゚Д゚) 何見てんだゴルァ!!

992 名前:デフォルトの名無しさん :02/05/22 18:16
(゚Д゚) 何見てんだゴルァ!!

993 名前:デフォルトの名無しさん :02/05/22 18:16
(゚Д゚) 何見てんだゴルァ!!

994 名前:デフォルトの名無しさん :02/05/22 18:16
(゚Д゚) 何見てんだゴルァ!!

995 名前:デフォルトの名無しさん :02/05/22 18:24
v(^・^)v

996 名前:v(^・^)v :02/05/22 18:25
Boost 感動した。よくやった。

997 名前:デフォルトの名無しさん :02/05/22 18:27
997

998 名前:v(^・^)v :02/05/22 18:27
1000 トルナラ イマノウチ

999 名前:v(^・^)v :02/05/22 18:28
キタ━━(゚∀゚)━( ゚∀)━(  ゚)━(  )━(゚  )━(∀゚ )━(゚∀゚)━━!!!!!

1000 名前:v(^・^)v :02/05/22 18:29
v(^・^)v


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