目次: C言語とlibc
(説明は後述) コードとVC++ のプロジェクトファイルを固めたものへのリンク。
 コードとVC++ のプロジェクトファイルを固めたものへのリンク。
C++ の超有名ライブラリboostに、デフォルトのコピー操作をコンパイル時点でエラーにしてくれるboost::noncopyableという便利クラスがあります。
C++ ではコピー操作(コピーコンストラクタやoperator=)が未定義のクラスでコピー操作を行うと、デフォルトのコピーが働きます。しかしポインタをコピーしてしまうなど、デフォルトのコピーでは困るケースがあります。boost::noncopyableを使うと、気づかないうちに意図しないコピーを使っていないかどうかを、コンパイル段階で検出できるのです。便利でしょ。
前置きが長くなりましたが、私もこれはいいなと思って使ってみたのですが、g++ 4.3.2では何も言われないのに、VC++ 2010だとエラーになってしまい困っています。
私の使い方が何か間違っているだけかもしれませんが、同じコードをコンパイルしてもg++ 4.3.2は何も言いません。しかもVC++ 2010の出すエラーメッセージが意味不明すぎてどこをどう直せばいいのかわからんのです…。
コピーOKなクラスAと、コピーNGな(Uncopyable(※1)を継承)クラスBを多重継承した、クラスCを定義(※2)します。このオブジェクトを例外で投げる(main() のthrow C(); の部分)ということがしたいのです。
その際g++ 4.3.2は何も言わないし、できた実行ファイルも正常に動作もしますが、VC++ 2010は「そんなことはできねーよ!」とお怒りになり、コンパイルエラーにされてしまいます。
A <-----------------+-- C
Uncopyable <-- B <--'
しかし、クラスBを取っ払って、下記のように多重継承したクラスDを使うとVC++ も文句を言わなくなります。
A <-----------------+-- D
Uncopyable <--------'
(※)Uncopyableクラスは、boost::noncopyableのコピペにデバッグメッセージを追加しただけのクラスです。
(※2)コピーOKとコピーNGを多重継承するなんて、コピーOKなのかNGなのか矛盾してますよ、テメーの設計はおかしいですよ。という突っ込みはその通りなのですが、今は設計の話ではないので無視して進めてます。
コードは下記の通りです。先頭の #define USE_CLASS_Cを有効にするとパターン1、コメントアウトなどして無効にするとパターン2となります。
#include <iostream>
#include <cstdio>
//#define USE_CLASS_C
class Uncopyable {
protected:
	Uncopyable() {
		std::cout << "Uncopyable::Uncopyable()" << std::endl;
	}
	~Uncopyable() throw() {
		std::cout << "Uncopyable::~Uncopyable()" << std::endl;
	}
	
private:
	Uncopyable(const Uncopyable&);
	const Uncopyable& operator=(const Uncopyable&);
	
};
class A {
public:
	A() {
		std::cout << "A::A()" << std::endl;
	}
	virtual ~A() {
		std::cout << "A::~A()" << std::endl;
	}
	
	virtual const char *func() {
		return "A";
	}
};
class B : private Uncopyable {
public:
	B() {
		std::cout << "B::B()" << std::endl;
	}
	virtual ~B() {
		std::cout << "B::~B()" << std::endl;
	}
};
#ifdef USE_CLASS_C
class C : public A, public B {
public:
	C() : A(), B() {
		std::cout << "C::C()" << std::endl;
	}
	virtual ~C() {
		std::cout << "C::~C()" << std::endl;
	}
	C(const C& c) : A(), B() {
		std::cout << "C::C(const C& c)" << std::endl;
	}
	
	virtual const char *func() {
		std::cout << "C::func()" << std::endl;
		return "C";
	}
};
#else
class D : public A, private Uncopyable {
public:
	D() : A(), Uncopyable() {
		std::cout << "D::D()" << std::endl;
	}
	virtual ~D() {
		std::cout << "D::~D()" << std::endl;
	}
	D(const D& d) : A(), Uncopyable() {
		std::cout << "D::D(const D&)" << std::endl;
	}
	
	virtual const char *func() {
		std::cout << "D::func()" << std::endl;
		return "D";
	}
};
#endif
int main(int argc, char *argv[])
{
	try {
		std::cout << "try0" << std::endl;
#ifdef USE_CLASS_C
		throw C();
#else
		throw D();
#endif
	} catch (A& e) {
		std::cout << "catch0" << std::endl;
		std::cout << "---- " << e.func() << std::endl;
	}
	getchar();
}
コピペするのすら面倒くさい方のために、 コードとVC++ のプロジェクトファイルを固めたものを置きます。全コードの著作権は放棄しますが、Uncopyableクラスはboostライブラリboost::noncopyableの派生物です。
 コードとVC++ のプロジェクトファイルを固めたものを置きます。全コードの著作権は放棄しますが、Uncopyableクラスはboostライブラリboost::noncopyableの派生物です。
コンパイルと実行結果は下記の通りです。
パターン1 VC++(エラー)、g++(OK)、パターン2 VC++(OK)、g++(OK)の順に、コンパイル結果と、実行結果を連続して掲載しています。
まずはUncopyableを直接継承していないパターン(パターン1)です。VC++ の結果です。
1>------ ビルド開始: プロジェクト: noncopyable, 構成: Debug Win32 ------ 1> a.cpp 1>y:\projects\c\test\test_noncopyable\a.cpp(55): error C2248: 'Uncopyable::Uncopyable' : privateメンバー (クラス 'Uncopyable' で宣言されている) にアクセスできません。 1> y:projectsctesttest_noncopyablea.cpp(17) : 'Uncopyable::Uncopyable' の宣言を確認してください。 1> y:projectsctesttest_noncopyablea.cpp(7) : 'Uncopyable' の宣言を確認してください。 1> コンパイラでのこの診断により関数 'B::B(const B &)' が生成されました。 ========== ビルド: 0正常終了、1失敗、0更新不要、0スキップ ==========
次にg++ の結果です。
$ g++ -Wall -DUSE_CLASS_C a.c -o c.out $ ./c.out try0 A::A() Uncopyable::Uncopyable() B::B() C::C() catch0 C::func() ---- C C::~C() B::~B() Uncopyable::~Uncopyable() A::~A()
次、クラスBを継承ツリーから省いてUncopyableを直接継承しているパターン(パターン2)です。VC++ の結果です。
try0 A::A() Uncopyable::Uncopyable() D::D() catch0 D::func() ---- D A::a = 0 D::~D() Uncopyable::~Uncopyable() A::~A()
次にg++ の結果です。
$ g++ -Wall a.c -o d.out $ ./d.out try0 A::A() Uncopyable::Uncopyable() D::D() catch0 D::func() ---- D D::~D() Uncopyable::~Uncopyable() A::~A()
な、なぜだ…。一体、何が間違っているというのだ…。
 この記事にコメントする
 この記事にコメントする
東プレRealforce 108UBKを使い始めてから半年が経ちました。作りはしっかりしていて、キーボードがずれていってしまうこともないし、キーの表面が剥げたり、削れてぴかぴかになることもありません。
私のようなへっぽこタイパーにはもったいないくらいのキーボードですが、以前と比べてたった1つだけ難点があります。キーボードの打鍵音がかなり響くのです。
夜は特に打鍵音が気になります。以前使用していたパンタグラフ式と比べると、Realforceのキーストロークはかなり深く、その分だけキーが勢いよく土台にぶつかって盛大にガシャガシャ音がするのです。
とはいえ、キーの打ちやすさのためにはストロークを浅くするわけにはいかないでしょう。それに業務用のキーボードですから、元から静音性は必要とされていません。家庭で使っているホビーユーザには悩ましいところです。
一番良いのは、夜中にキーボードなんて打ってないで、さっさと寝る&朝起きてやることなんだろうな…。
 この記事にコメントする
 この記事にコメントする
先週に引き続き、住む場所探し。前回訪れた不動産屋さんの高槻支店があるそうなので訪ねました。
前回は吹田市でしたが、やや予算オーバーでした。今回は高槻市近辺を探しました。
高槻市でJRと阪急双方が利用可能な地域というとJR高槻駅&阪急高槻市駅とJR摂津富田駅&阪急富田駅の2カ所があります。
高槻駅近隣は非常に便利な場所なので、築年数の少ない新しい建物を選ぼうとすると家賃がべらぼうに高いです。かといって安い家賃となると大阪万博の頃の(築30年突破)設備がモロに昭和な物件くらいしかありません。いくら安くても昭和にタイムスリップするのはご勘弁…。
というわけで高槻駅近辺は厳しいです。ペーペーでも借りられるような物件となると、徒歩15〜20分くらいの高台か、もっと離れた平地の物件になります。そんな距離を出勤していたら、確実に心が折れます。
富田駅近辺はJR <-> 阪急間がわずか2分のため、駅の間に土地がほとんどありません。従ってJRの北側か、阪急の南側に借りることになります。
ベッドタウンだけあって物件はたくさんありますが、どれもそこそこ距離(15分くらい)があります。
一カ所だけ駅近の物件があったのですが、真西に窓があって西日が全力で入っていました。所詮西日だろと思ってなめていたのですが、この季節にも関わらず、めちゃくちゃ暑い部屋でした。夏の電気代がかなりヤバいことになりそうです。
おそらくこれ以上駅近にこだわってもろくな目に遭わないでしょう…。ここはひとつ、駅からの距離を諦め、ある程度快適さを確保する方向に倒すしかありません。
というわけで今のところJR北側の徒歩15分くらいの物件を第一候補に考えています。せっかく買った自転車もこれで活躍できることでしょう。
 この記事にコメントする
 この記事にコメントする
| < | 2010 | > | ||||
| << | < | 06 | > | >> | ||
| 日 | 月 | 火 | 水 | 木 | 金 | 土 | 
| - | - | 1 | 2 | 3 | 4 | 5 | 
| 6 | 7 | 8 | 9 | 10 | 11 | 12 | 
| 13 | 14 | 15 | 16 | 17 | 18 | 19 | 
| 20 | 21 | 22 | 23 | 24 | 25 | 26 | 
| 27 | 28 | 29 | 30 | - | - | - | 
 25年10月27日
 25年10月27日
 23年4月10日
 23年4月10日
 25年10月15日
 25年10月15日
 25年10月18日
 25年10月18日
 22年5月5日
 22年5月5日
 25年10月19日
 25年10月19日
 23年4月11日
 23年4月11日
 06年4月22日
 06年4月22日
 25年10月17日
 25年10月17日
 25年10月6日
 25年10月6日
 25年10月13日
 25年10月13日
 20年10月23日
 20年10月23日
 25年10月12日
 25年10月12日
 20年8月29日
 20年8月29日
 19年1月13日
 19年1月13日
 18年10月13日
 18年10月13日
 18年9月3日
 18年9月3日
 18年8月20日
 18年8月20日
 18年7月23日
 18年7月23日
 18年7月22日
 18年7月22日
 wiki
 wiki Linux JM
 Linux JM Java API
 Java API 2002年
 2002年 2003年
 2003年 2004年
 2004年 2005年
 2005年 2006年
 2006年 2007年
 2007年 2008年
 2008年 2009年
 2009年 2010年
 2010年 2011年
 2011年 2012年
 2012年 2013年
 2013年 2014年
 2014年 2015年
 2015年 2016年
 2016年 2017年
 2017年 2018年
 2018年 2019年
 2019年 2020年
 2020年 2021年
 2021年 2022年
 2022年 2023年
 2023年 2024年
 2024年 2025年
 2025年 過去日記について
 過去日記について アクセス統計
 アクセス統計 サーバ一覧
 サーバ一覧 サイトの情報
 サイトの情報合計: 
本日: