関数の呼び出し方法 – プログラミング – Home

通知
すべてクリア

関数の呼び出し方法

固定ページ 1 / 2

マーちゃん
 マーちゃん
(@マーちゃん)
ゲスト
結合: 19年前
投稿: 9
Topic starter  

こんにちは、初投稿するマーちゃんです。
C++を最近はじめたもので、簡単なことを質問することになると思いますが、
申し訳ありません。

開発環境:windowsXP
Microsoft Visual Studio .NET 2003

ファイル1
class A
{
private:
Kansu1()という関数が宣言されている。
ファイル2で、Bというクラス中で、publicでKansu2()という関数を宣言している。
やりたいのは、Kansu1()中でKansu2()を呼び出したい!!


引用解決済
トピックタグ
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

とりあえず、Kansu2がスタティックでなければ、Bのインスタンスが必要。
# 意味が分からなければまず調べてみてください。

引数で取得する一例。
Kansu1(B& b)
{
b.Kansu2();
}


返信引用
マーちゃん
 マーちゃん
(@マーちゃん)
ゲスト
結合: 19年前
投稿: 9
Topic starter  

マーちゃんです。
申し訳ありません。誤って編集途中で送信してしまいました。
再度書かせていただきます。

-----------------------------------------
ファイル1
class A
{
private:
  void Kansu1();
}
void A::Kansu1()
{
<----ここでファイル2のKansu2()を呼び出す
}
------------------------------------------
ファイル2
class B
{
public:
void Kansu2();
}
void B::Kansu2()
{
****;
}
ファイル1のKansu1()の中で、ファイル2のkansu2()を呼び出したいのですが、
呼び出し方法がわかりません。
どなたか教えていただけませんか?
よろしくお願いします。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

定義と宣言をソースとヘッダに分離して、宣言をインクルードする。

ファイル2’
class B
{
public:
void Kansu2();
}

ファイル1
#include ファイル2’
class A
{
private:
  void Kansu1();
}
void A::Kansu1(B& b)
{
b.Kansu2();
}


返信引用
KING・王
 KING・王
(@KING・王)
ゲスト
結合: 20年前
投稿: 122
 

いろいろと問題がありますが、とりあえず、以下のようにすれば呼び出せます。

ファイル1
#include ファイル2.h

class A
{
private:
  void Kansu1();
}
void A::Kansu1()
{
// ここでファイル2のKansu2()を呼び出す
B ObjB; // class Bのインスタンスの作成
ObjB.Kansu2(); // class Bのpublicメンバ関数Kansu2()の呼び出し。
}


返信引用
マーちゃん
 マーちゃん
(@マーちゃん)
ゲスト
結合: 19年前
投稿: 9
Topic starter  

Banさんへ
早速のお返信、ありがとうございます。

Bのインスタンスについてですが、
これはファイル1の中で宣言すればよろしいでしょうか?


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> Bのインスタンスについてですが
メンバにするのか、Kansu1内のローカル変数にするかは、
class B が何なのかわからないので、回答者側には不明だと思いますが。
もう少し、
class A 、class B の役割を明記してもらえれば、具体的なアドバイスができるかと。


返信引用
マーちゃん
 マーちゃん
(@マーちゃん)
ゲスト
結合: 19年前
投稿: 9
Topic starter  

Blueさんへ
 説明不足で、すみません。

今、KING・王さんに教えていただいた方法でやってみましたが、
コンパイルすると、下記のようなエラーが出ました。
うまくいきません。

error C2259: 'B' : cannot instantiate abstract class
error C2512: 'B' : no appropriate default constructor available


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> class B
> {
> public:
> void Kansu2();
> }
class宣言の最後の括弧(})の後に ; は入れてありますか?(class A, B ともに)


返信引用
マーちゃん
 マーちゃん
(@マーちゃん)
ゲスト
結合: 19年前
投稿: 9
Topic starter  

classAとBの両方とも、「;」が入れてあります。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

エラーを見る限りでは、B に純粋仮想関数があったり、
引数つきのコンストラクタが定義されていたりするように見えますが、
クラスA,Bの定義をさらしてもらわないと、なんとも...


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> error C2259: 'B' : cannot instantiate abstract class
は「抽象クラスをインスタンス化できない」というエラーで、
上記のソースだけではでないように思われます。

提示されたソース以外に class B に宣言されているものはないでしょうか?
(virtual ~ という関数があるとか、class B は実は派生クラスだとか。)


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

> 提示されたソース以外に class B に宣言されているものはないでしょうか?
> (virtual ~ という関数があるとか、class B は実は派生クラスだとか。)

純粋仮想と思われるので、クラス自体か基底クラス内に = 0 とか書いてあるはず。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

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' : クラス、構造体、共用体にデフォルト コンストラクタがありません。


返信引用
マーちゃん
 マーちゃん
(@マーちゃん)
ゲスト
結合: 19年前
投稿: 9
Topic starter  

情報が正しく提示していなくて、すみません。
下記が今のクラスの宣言です。
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()
{
****;
}


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました