関数の呼び出し方法

[戻る]
マーちゃん 2006/01/16(月) 17:14:49
こんにちは、初投稿するマーちゃんです。
C++を最近はじめたもので、簡単なことを質問することになると思いますが、
申し訳ありません。

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

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

Ban 2006/01/16(月) 17:17:38
とりあえず、Kansu2がスタティックでなければ、Bのインスタンスが必要。
# 意味が分からなければまず調べてみてください。

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

マーちゃん 2006/01/16(月) 17:22:57
マーちゃんです。
申し訳ありません。誤って編集途中で送信してしまいました。
再度書かせていただきます。

-----------------------------------------
ファイル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 2006/01/16(月) 17:32:03
定義と宣言をソースとヘッダに分離して、宣言をインクルードする。

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

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

KING・王 2006/01/16(月) 17:33:27
いろいろと問題がありますが、とりあえず、以下のようにすれば呼び出せます。

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

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

マーちゃん 2006/01/16(月) 17:56:05
Banさんへ
早速のお返信、ありがとうございます。

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

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

マーちゃん 2006/01/16(月) 18:22:45
Blueさんへ
 説明不足で、すみません。

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

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

Blue 2006/01/16(月) 18:26:21
> class B
> {
> public:
>     void Kansu2();
> }
class宣言の最後の括弧(})の後に ; は入れてありますか?(class A, B ともに)

マーちゃん 2006/01/16(月) 18:29:51
classAとBの両方とも、「;」が入れてあります。

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

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

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

Ban 2006/01/16(月) 18:42:37
> 提示されたソース以外に class B に宣言されているものはないでしょうか?
> (virtual 〜 という関数があるとか、class B は実は派生クラスだとか。)

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

Blue 2006/01/16(月) 18:46:25
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' : クラス、構造体、共用体にデフォルト コンストラクタがありません。

マーちゃん 2006/01/16(月) 18:57:59
情報が正しく提示していなくて、すみません。
下記が今のクラスの宣言です。
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()
{
     ****;
}

Blue 2006/01/16(月) 19:02:19
クラスBのコンストラクタ + 基底クラスの純粋仮想関数(virtual 〜 = 0;)の定義を載せ
てください。

というか
> Kansu2()はvirtualで宣言してます
virtual の意味は理解できていますよね?

Ban 2006/01/16(月) 19:17:25
> VC6だと、warning C4259も出ちゃいました。

これは、Level4でないと出ないだけだと思われます。

マーちゃん 2006/01/16(月) 19:37:03
クラスBのコンストラクタと基底クラスの純粋仮想関数は下記になります。

class B:public CB
{
public: 
    B(IPMUnknown *boss);     <----IPMUnknownは現在作成しているプログラムをダウ
ロードして、
                 実行するアプリケーション(Indesign)特有のものです。
    ~B();
  virtual void Kansu2();   <----Kansu2()はvirtualで宣言してます
    virtual bbbb();
  
private:
    void cccc();
    
};

class PUBLIC_DECL CB : public IB
{
public:
     CB(IPMUnknown *boss, PMIID interfaceID = IID_IOBSERVER);    <----()中は
Indesign特有のもの
     virtual ~CB();
     virtual bbbb();
               
protected:
     
DECLARE_HELPER_METHODS()
};

class IB : public IPMUnknown
{
public:
    virtual bbbb()=0;   
};

Ban 2006/01/16(月) 19:43:00
とりあえず、関数呼出だけに限って言えば、
私の書いたように参照で引数渡しすれば通ると思いますが、
インスタンスをどうしたいかは、要求と設計次第なので
今の情報ではなんとも言えません。

今でてるエラーは別問題。

マーちゃん 2006/01/17(火) 10:58:52
kansu1()はif文である条件が成立した時に呼ばれますが、
呼ばれる前にclass Bのインスタンスを生成すればいいでしょうか?

>Kansu2()はvirtualで宣言してます
virtualは基本クラスで宣言するものと本に書いてありましたが、
Kansu2()をclass Bにしかない関数にしたい時は、virtualで宣言
するのは間違ってる、という理解でいいでしょうか?

現在作成しているプログラムは、すでに出来上がっているものに対して、
手を加えているもので、プログラムのこともC++のこともまだまだ理解できていません。
初歩的な質問ばかりして、大変心苦しいのですが、
気を悪くせずに、どうか教えてください。
よろしくお願いします。

RAPT 2006/01/17(火) 11:06:07
> Kansu2()をclass Bにしかない関数にしたい時
簡単な例。

class BaseB
{
public:
};


class B : public BaseB
{
public:
    void Kansu2();
};

REE 2006/01/17(火) 11:09:52
>kansu1()はif文である条件が成立した時に呼ばれますが、
>呼ばれる前にclass Bのインスタンスを生成すればいいでしょうか?

>Kansu2()をclass Bにしかない関数にしたい時は、virtualで宣言
>するのは間違ってる、という理解でいいでしょうか?

どんな目的で何をする関数かも分からない状態で、
これらを判断することは出来ません。

>プログラムのこともC++のこともまだまだ理解できていません。

という状態で、

>すでに出来上がっているものに対して、手を加えているもので

ということをしている時点で間違っています。

Ban 2006/01/17(火) 11:26:25
> kansu1()はif文である条件が成立した時に呼ばれますが、
> 呼ばれる前にclass Bのインスタンスを生成すればいいでしょうか?

そうすることは可能ですが、それで正解かどうかは マーちゃん さん以外には判断できません。
背景や事情を知っているのは、マーちゃん さんだけです。

> 初歩的な質問ばかりして、大変心苦しいのですが、
> 気を悪くせずに、どうか教えてください。

気は悪くしてませんが、C++の必要な知識をここで全部説明するのは不可能です。

「とりあえず動けばいい」的な対応をすると、C/C++では危険なコードを作る可能性が高いので、
もっと簡単なものから初めて、理解できるようになってから修正された方が安全だと思います。

マーちゃん 2006/01/17(火) 13:03:08
C++をもう少し勉強してから、インスタンスの生成場所を考えてみたいと思います。
付き合っていただいて、ありがとうございました。
また何かありましたら、よろしくお願いします。

古いスレッドには追加発言できません。