- PR -

VC++ クラスの関数の呼び出し

投稿者投稿内容
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2006-01-20 16:30
引用:
whiteさんの書き込み (2006-01-20 16:16) より:
しかし、クラスListboxobは有効なデフォルトコンストラクタがないと言われます。
”有効なデフォルトコンストラクタ”とは何でしょうか?


Listboxobのコンストラクタには親クラスのコンストラクタを書いたほうがよいということなのかなぁ?
というか、エラーメッセージはそのままコピペしてください。
親クラスのコンストラクタは引数を取らないものがあるのですよね?

例えば
コード:
class Base

{
public:
Base( const int n ) {}
virtual ~Base() {}

virtual void Test() = 0;
};

class Hoge : public Base
{
public:
Hoge(){}
virtual ~Hoge() {}

virtual void Test() {}
};


こんなのはエラーです。
Hoge() : Base( 1 ) {}
のように親クラスのコンストラクタを指定して呼んであげるようにしなければなりません。
# もしもこうならば、クラスの設計がわからないのでLitboxojが何者であるかがわからない
# 以上何もアドバイスできません。
## 例えば MFCのようにウィンドウハンドルを持たないといけないとかなったときに
## ローカル変数にインスタンス作って〜みたいなことは、どうなの??
## ってことになるかと。

[ メッセージ編集済み 編集者: Blue 編集日時 2006-01-20 16:48 ]
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2006-01-20 16:39
引用:

whiteさんの書き込み (2006-01-20 16:16) より:
デストラクタをvirtual宣言するのとしないのとで何が違うかがわかりません。。。


これは、仮想デストラクタと呼ばれるもので、インスタンスをポインタ(または参照)で扱うときに問題になります。
(今回はあまり重要ではない)

こちらのサイトを参考にどうぞ
第20章 デストラクタ(仮)

ここがなにをいっているかわからないようであれば、
第2部 クラスを知ろう の14章あたりから読んでみてください。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2006-01-20 16:44
こんにちは。

引用:

whiteさんの書き込み (2006-01-20 16:16) より:
しかし、クラスListboxobは有効なデフォルトコンストラクタがないと言われます。
”有効なデフォルトコンストラクタ”とは何でしょうか?



デフォルトコンストラクタとは、「引数のない」あるいは「(デフォルト引数で)引数の省略できる」コンストラクタのことです。
でも、提示されているコードを見る限り、Listboxobクラスにデフォルトコンストラクタがあるんですし
なぜデフォルトコンストラクタが要求されているのかが分かりません。
おかしいですねぇ。

引用:

引用:

Blueさんの書き込み (2006-01-20 13:14) より:

それと、Listboxob::~Listboxob() の宣言に virtual がないのは意図的でしょうか?



意図的というわけではありません。
デストラクタをvirtual宣言するのとしないのとで何が違うかがわかりません。。。



Listboxobの基底クラスCobが仮想デストラクタをもっているので、
Listboxob::~Listboxob()にvirtualが付いてなくてもかまいませんよ。

ただ、デストラクタにはvirtualをつけるクセをつけておいたほうが安心ですね。

仮想デストラクタの効果は例えば、
コード:
	Cob* obj = new Listboxob();
	…
	delete obj;


としたときに、deleteでListboxob::~Listboxob()が呼び出されます。
もし仮想デストラクタでなければ、Cob::~Cob()が呼び出されるのですが、
これでは正しくデストラクタが呼び出せていないため、メモリリークなどの原因となってしまいます。

スキルアップ/キャリアアップ(JOB@IT)