No.2ベストアンサー
- 回答日時:
こんばんは。
面白いかどうかは不明ですが、コピーコンストラクタと代入演算子をテンプレート化して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;
}
No.3
- 回答日時:
当たり前すぎて面白くないかもしれませんが、デストラクタでメンバー
変数を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();
}
このほかにも、メンバーにポインターがある場合とか、コピー代入演算子
がある場合とか、いろんな時にコピーコンストラクタがほしくなります。
関数引数を参照渡しにするとある程度は回避できますが、例外クラス、
演算子オーバーロードの戻り値にする場合や、コンテナに値を格納する
場合などには、欲しくなると思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Android(アンドロイド) データコピー 2 2022/12/26 15:01
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- 書籍・本 どうしてスマホのアプリでコピーする人は 本のコピー仕方知らないんですか? よくおばさんから「この本コ 7 2023/03/27 17:32
- Excel(エクセル) xlDownの使い分けについての質問です vbaでxlDownを使って一覧近い空白までのセルをコピー 3 2022/08/04 12:20
- UNIX・Linux Ubuntu でinvalid filenameとなるファイルをコピーする方法 3 2023/06/08 22:26
- 面接・履歴書・職務経歴書 バイト面接時の履歴書の取扱いについて 会社側はコピー(写し)を保管 応募者に原本を渡すのは問題か 3 2022/06/14 10:30
- iPod・ウォークマン・音楽プレーヤー ituneの使い方について 4 2022/06/28 03:27
- Excel(エクセル) Excelで質問です! 現在マクロを勉強中の初心者です。 以下のような表から、会社名が空白のもの以外 2 2022/06/14 12:16
- Excel(エクセル) エクセルのマクロについて教えてください。 3 2023/02/07 14:47
- Excel(エクセル) VBA 特定の列に入っているテキストをコピペ 2 2023/06/14 11:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
既定のコンストラクタがありま...
-
Notepad++の関数リスト表示の変...
-
C++にてtemplateで受け取った任...
-
ArduinoでMouse関数を使用して...
-
WNDPROC をクラスのメンバにも...
-
const_castのつかいどころを教...
-
【gcc・cygwin】multiple defin...
-
int main()、void main()、void...
-
コンパイルエラー: LNK2001
-
(void)0 はどんな意味ですか
-
解凍ソフト(C++builderで作成...
-
解凍ソフト(C++builderで作成...
-
C/C++でのScene管理について
-
一定時間ごとにプログラムを起...
-
VC++でGetKeyboardStateがうま...
-
C++別のオブジェクトからメンバ...
-
C# Controls.Addで動的に配置し...
-
【VC++6.0】イベントハンドラ関...
-
OpenSSLのSHA1関連の関数はどこ...
-
定義した文字列を wchar_t 系の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
int main()、void main()、void...
-
戻り値を返す関数の前に(void)...
-
既定のコンストラクタがありま...
-
Notepad++の関数リスト表示の変...
-
ArduinoでMouse関数を使用して...
-
多重定義が起きている?--lnk20...
-
C++にてtemplateで受け取った任...
-
静的でないメンバ関数の呼び出...
-
C# Controls.Addで動的に配置し...
-
const_castのつかいどころを教...
-
(void)0 はどんな意味ですか
-
C# KeyDownイベントでショート...
-
gcc: incompatible pointer type
-
C#でラジオボタンを設定に記録...
-
VC++でGetKeyboardStateがうま...
-
C言語 ① 5秒間 1秒間隔で点滅を...
-
void*型の配列について
-
GDI+の使用方法について
-
DirectInput でのエラー
おすすめ情報