4

私は積分計算機を書いています。functions.h.cpp ファイルにある関数クラスから関数を読み込むように main.cpp ファイルを取得しようとしています。簡単なケースとして、次のように定義された関数があります。

double square(double aX)
 {
   return aX*aX;
 }

この関数は、メイン ファイルに含めると機能しますが、関数ファイルにあるときにメイン ファイルから呼び出そうとすると機能しません。これが私が持っているコードです:

Main.cppファイル:

#include <iostream>
#include "IntegralCalculator.h"
#include "functions.h"

using namespace std;

int main()
  {
    IntegralCalculator Function(square);
    Function.print();
  }

ご覧のとおり、IntegralCalculator実際に積分の計算を行う別のクラスが呼び出されていますが、関数定義がメインに含まれ、関数がパラメーターとして渡される場合に機能するため、何も問題はありません。ファイルは次のfunctions.hように定義されています。

#ifndef FUNCTIONS_H
#define FUNCTIONS_H

#include <iostream>
#include <cmath>
#include "IntegralCalculator.h"


class functions : public IntegralCalculator
 {
  public:
   functions();
   double square(double aX);

 };

#endif

functions.cppファイルは次のように定義されています。

#include <iostream>
#include <cmath>
#include "functions.h"


double functions::square(double aX)
 {
   return aX*aX;
 }

現時点ではライブラリが必要ないことはわかっていますが<cmath>、より複雑な機能を追加するときにライブラリが必要になります。

メインで関数クラスを継承しようとしましたが、関数クラスの名前空間を作成して関数を定義しようとしましたが、どれも機能しませんでした。コンパイルすると、次のエラーが発生します。

Main.cpp: In function ‘int main()’:

Main.cpp:9: error: ‘square’ was not declared in this scope

誰かが私がこの問題を理解するのを手伝ってくれるなら. 私が書こうとしているこのコードは、私のクラスが超えたよりも高度なので、この方法でプログラムを書きたいのですが、それを修正する方法がわかりません。

編集: 興味がある場合は、 Makefileにfunctions.hとファイルを含めます。クラスにも定義functions.cppを入れようとしたときに同じエラーが発生しました。square(double aX)IntegralCalculator

4

2 に答える 2

6

あなたの問題は、squareメンバー関数AKAメソッドです。つまり、単純な記号はsquareどこにもありません。それはfunctions::square. また、これは静的メソッドではないため、単独では意味がありません。対応するオブジェクト インスタンスが常に必要ですが、それはあなたが持っておらず、持っていたIntegralCalculatorとしても使用できません。

3 つの解決策を、最も単純なもの、質問に最も近いもの、最良のものの順に並べます。


コンストラクターの宣言から、squareをクラスの外に移動し、グローバル関数にします。

クラス外の functions.h 内:

double square(double aX);

functions.cpp で

double square(double aX) {
    return aX*aX;
}

main.cpp での使用法:

IntegralCalculator Function(square);

または、静的メソッドにします (これは、Java のような言語を使用した場合に行う必要がある方法であり、「裸の」関数を許可していませんが、実際には C++ の方法ではありません)。

functions.h:

class functions // inheriting IntegralCalculator removed as not needed
{
    public:
    static double square(double aX);
};

そして functions.cpp で:

//static
double functions::square(double aX) {
    return aX*aX;
}

次に、このように main.cpp の関数コンストラクターに渡すことができます。

IntegralCalculator Function(functions::square);

最後に、おそらく最良の解決策は、上記の 2 つの長所を組み合わせたものです:square名前空間に配置します。したがって functions.h は次のようになります

namespace functions {
    double square(double aX)
}

functions.cpp は次のようになります

namespace functions {
    double square(double aX) {
        return aX*aX;
    }
}

次のようにメインで引き続き使用します。

IntegralCalculator Function(functions::square);
于 2013-03-26T06:12:22.313 に答える
0

あなたが持っている:

class functions : public IntegralCalculator
 {
  public:
   functions();
   double square(double aX);

 };

これは問題ありませんが、functions.cpp ファイルのどこかに square というグローバル関数があることを他の cpp ファイルに伝えません。あなたがする必要があるのは、その関数のヘッダーをインクルードして、コンパイラーがそれが存在することを認識できるようにすることです:

double square(double ax);
class functions : public IntegralCalculator
 {
  public:
   functions();
   double square(double aX);

 };

また、質問とはまったく関係ありませんが、コンストラクターコードを見た後に言及する価値があるので、次のように typedef を使用して関数ポインターを宣言することをお勧めします。

typedef double (IntegralFunctor*)(double);

あなたのコンストラクタが今できるように

IntegralCalculator::IntegralCalculator(IntegralFunctor func);

これにより、よりクリーンで混乱が少なくなります

于 2013-03-26T06:19:06.103 に答える