アプリ版:「スタンプのみでお礼する」機能のリリースについて

コピーコンストラクタについて何か面白いネタがあったら教えてください

A 回答 (3件)

 こんばんは。



 面白いかどうかは不明ですが、コピーコンストラクタと代入演算子をテンプレート化してLHS >= RHSでなければコンパイルエラーにするとか。
 VC60では無理です、VC2005が無いと。

//ココでエラー
template<bool __size_ok>
struct size_check;

//LHS >= RHSなのでOK
template<>
struct size_check<true>
{};

//代入させる
template<class __Tp, class __Tp2>
struct static_assert
{
//サイズの計測
typedef typename size_check<sizeof(__Tp) >= sizeof(__Tp2)> result;
};

//bool型に他の型は代入させない ココでエラー
template<class __Tp2>
struct static_assert<bool, __Tp2>;

template<class __Tp>
struct bogus
{
typedef typename __Tp value_type;
explicit bogus(const __Tp& r = __Tp(0)) : _M_tp(r){}

template<class __Tp2>
bogus(const bogus<__Tp2>& r) : _M_tp(r.get())
{
static_assert<value_type, bogus<__Tp2>::value_type>::result();
}

template<class __Tp2>
bogus& operator = (const bogus<__Tp2>& r)
{
new (this) bogus<__Tp2>(r);
return *this;
}

bogus(const bogus<__Tp>& r) : _M_tp(r._M_tp){}

bogus& operator = (const bogus& r)
{
if(this != &r)new (this) bogus(r);
return *this;
}

~bogus(){}

__Tp get() const { return _M_tp; }

private:
__Tp _M_tp;
};

int main()
{
bogus<char> Char(10);
bogus<bool> Bool = Char;//ERROR

bogus<bool> Bool2;
bogus<bool> Bool3 = Bool2;//OK
bogus<int> Int = Bool3;//OK
bogus<long> Long = Int;//OK
bogus<short> Short = Long;//ERROR
return 0;
}
    • good
    • 0
この回答へのお礼

わざわざプログラムを書いてくれてありがとうございます。

これはプレゼンのいいネタになりそうです。

参考にさせてもらいます

お礼日時:2008/11/26 10:57

当たり前すぎて面白くないかもしれませんが、デストラクタでメンバー


変数をdeleteするよなクラスの場合、コピーコンストラクタで、
うまく対処しないと、2重delete してしまうかもしれません。


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

class CLS{
public:
CLS(char * msg){
int msglen= strlen(msg);
str = new char[msglen+1];
memcpy(str,msg,msglen+1);
}
~CLS(){
cout << "~CLS" << endl;
delete str;
}
void print(){
cout << "print:" << str<< endl;
}
private:
char * str;
};

void foo(CLS s){
s.print();
}

void bar(){
CLS s("msg");
s.print();
foo(s); // fooから戻るときにs.strはdeleteされてしまう
s.print();
}

int main(int argc,char * argv[])
{
bar();
}

このほかにも、メンバーにポインターがある場合とか、コピー代入演算子
がある場合とか、いろんな時にコピーコンストラクタがほしくなります。
関数引数を参照渡しにするとある程度は回避できますが、例外クラス、
演算子オーバーロードの戻り値にする場合や、コンテナに値を格納する
場合などには、欲しくなると思います。
    • good
    • 0

「面白い」かどうかの判定基準を教えてください.

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!