こんにちは、初投稿するマーちゃんです。
C++を最近はじめたもので、簡単なことを質問することになると思いますが、
申し訳ありません。
開発環境:windowsXP
Microsoft Visual Studio .NET 2003
ファイル1
class A
{
private:
Kansu1()という関数が宣言されている。
ファイル2で、Bというクラス中で、publicでKansu2()という関数を宣言している。
やりたいのは、Kansu1()中でKansu2()を呼び出したい!!
とりあえず、Kansu2がスタティックでなければ、Bのインスタンスが必要。
# 意味が分からなければまず調べてみてください。
引数で取得する一例。
Kansu1(B& b)
{
b.Kansu2();
}
マーちゃんです。
申し訳ありません。誤って編集途中で送信してしまいました。
再度書かせていただきます。
-----------------------------------------
ファイル1
class A
{
private:
void Kansu1();
}
void A::Kansu1()
{
<----ここでファイル2のKansu2()を呼び出す
}
------------------------------------------
ファイル2
class B
{
public:
void Kansu2();
}
void B::Kansu2()
{
****;
}
ファイル1のKansu1()の中で、ファイル2のkansu2()を呼び出したいのですが、
呼び出し方法がわかりません。
どなたか教えていただけませんか?
よろしくお願いします。
定義と宣言をソースとヘッダに分離して、宣言をインクルードする。
ファイル2’
class B
{
public:
void Kansu2();
}
ファイル1
#include ファイル2’
class A
{
private:
void Kansu1();
}
void A::Kansu1(B& b)
{
b.Kansu2();
}
いろいろと問題がありますが、とりあえず、以下のようにすれば呼び出せます。
ファイル1
#include ファイル2.h
class A
{
private:
void Kansu1();
}
void A::Kansu1()
{
// ここでファイル2のKansu2()を呼び出す
B ObjB; // class Bのインスタンスの作成
ObjB.Kansu2(); // class Bのpublicメンバ関数Kansu2()の呼び出し。
}
Banさんへ
早速のお返信、ありがとうございます。
Bのインスタンスについてですが、
これはファイル1の中で宣言すればよろしいでしょうか?
> Bのインスタンスについてですが
メンバにするのか、Kansu1内のローカル変数にするかは、
class B が何なのかわからないので、回答者側には不明だと思いますが。
もう少し、
class A 、class B の役割を明記してもらえれば、具体的なアドバイスができるかと。
Blueさんへ
説明不足で、すみません。
今、KING・王さんに教えていただいた方法でやってみましたが、
コンパイルすると、下記のようなエラーが出ました。
うまくいきません。
error C2259: 'B' : cannot instantiate abstract class
error C2512: 'B' : no appropriate default constructor available
> class B
> {
> public:
> void Kansu2();
> }
class宣言の最後の括弧(})の後に ; は入れてありますか?(class A, B ともに)
classAとBの両方とも、「;」が入れてあります。
エラーを見る限りでは、B に純粋仮想関数があったり、
引数つきのコンストラクタが定義されていたりするように見えますが、
クラスA,Bの定義をさらしてもらわないと、なんとも...
> error C2259: 'B' : cannot instantiate abstract class
は「抽象クラスをインスタンス化できない」というエラーで、
上記のソースだけではでないように思われます。
提示されたソース以外に class B に宣言されているものはないでしょうか?
(virtual ~ という関数があるとか、class B は実は派生クラスだとか。)
> 提示されたソース以外に class B に宣言されているものはないでしょうか?
> (virtual ~ という関数があるとか、class B は実は派生クラスだとか。)
純粋仮想と思われるので、クラス自体か基底クラス内に = 0 とか書いてあるはず。
VC6だと、warning C4259も出ちゃいました。
実験コード)
class B
{
public:
B( const int n ) {}
void Test();
virtual int xxxx() = 0;
};
void B::Test()
{
}
class A
{
public:
void Test();
};
void A::Test()
{
B b;
b.Test();
}
int main()
{
A a;
a.Test();
return 0;
}
error C2259: 'B' : 抽象クラスあるいは構造体のオブジェクトが宣言されています。
warning C4259:'int __thiscall B::xxxx(void)':純粋仮想関数は定義されていません。
error C2512: 'B' : クラス、構造体、共用体にデフォルト コンストラクタがありません。
情報が正しく提示していなくて、すみません。
下記が今のクラスの宣言です。
virtualと派生クラスが発生しているエラーに関連してるんですか?
-----------------------------------------
ファイル1
class A:public CA
{
public:
virtual aaaa();
:
:
private:
void Kansu1();
:
:
};
void A::Kansu1()
{
<----ここでファイル2のKansu2()を呼び出す
}
------------------------------------------
ファイル2
class B:public CB
{
public:
virtual void Kansu2(); <----Kansu2()はvirtualで宣言してます
virtual bbbb();
:
:
private:
void cccc();
:
:
};
void B::Kansu2()
{
****;
}