3

コードなしで説明するのは難しいので、ここに行きます:別の(a)のヘッダーファイルでオブジェクト(b)のプロトタイプを作成しようとしています。次に、(a)のコンストラクターで(b)のコンストラクターを呼び出して値を渡します、したがって、コンストラクターとそれに渡された値に依存する b のメソッドを使用できますが、私が行う方法は次のとおりです。次の行で、 m に赤い下線が引かれ、「適切な operator() またはポインターから関数への型への変換関数を使用しないクラス型のオブジェクトの呼び出し」と書かれています。私のプログラムの他の批評家は大歓迎です。私はプログラミングを学ぼうとしています。

ファイルpricing.cppには次のものがあります。

#include "pricing.h"
#include <math.h>
#include <vector>
pricing::pricing(void)
{
 m(10,0.0,0.01,50);
}
double pricing::expectedValue(void)
{
expectedExValue = m.samplePaths[2][3]; //yes this isn't an expected value, 
// its just for illustration purposes/making it compile.
return 0;
}

Pricing.hi には次のものがあります。

#pragma once
#include "pricing.h"
#include "monteCarlo.h"
class pricing
{
public:
pricing(void);
~pricing(void);
double euroCall();
std::vector<double> samplePathing;
double expectedValue();
    monteCarlo m;

};

次に、montecarlo.cpp は次のようになります。

#include "monteCarlo.h"
#include "randomWalk.h"
#include <vector>
#include <iostream>

monteCarlo::monteCarlo(int trails, double drift, double volidatity, int density)
{
for (int i = 0; i < trails; i++)
{
    std::cout << "Trail number " << i+1 <<  std::endl;
    randomWalk r(drift,volidatity,density);
    r.seed();
    samplePaths.emplace_back(r.samplePath);
    std::cout << std::endl << std::endl;
}
}


monteCarlo::~monteCarlo(void)
{
}

そして最後に montecarlo.h は次のとおりです。

#pragma once
#include <vector>

class monteCarlo
{
public:
monteCarlo(int, double, double, int);
~monteCarlo(void);
std::vector< std::vector<double> > samplePaths;
};
4

2 に答える 2

3
pricing::pricing(void)
{
 m(10,0.0,0.01,50);
}

これは、あたかも関数であるかのように呼び出そ うとします (オーバーロードされていれば、これを行うことができます。これがエラーの内容です)。代わりに初期化するには、メンバー初期化リストを使用します。moperator()m

pricing::pricing(void)
 : m(10,0.0,0.01,50)
{ }

このコロン構文は、コンストラクターでオブジェクトのメンバーを初期化するために使用されます。メンバーを名前でリストし、( expression-list )または{ initializer-list }構文で初期化するだけです。

于 2013-03-23T13:31:48.457 に答える
0

Pricing.cpp

#include "pricing.h"

pricing::pricing() 
  : m(10,0.0,0.01,50) 
{
}

double pricing::expectedValue()
{
    return m.samplePaths[2][3]; 
}

Pricing.h

#ifndef PRICING_H
#define PRICING_H
#include "monteCarlo.h"
#include <vector>

class pricing
{
public:
    pricing();
    double euroCall();
    std::vector<double> samplePathing;
    double expectedValue();
private:
    monteCarlo m;
};

#endif

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

#include "monteCarlo.h"
#include "randomWalk.h"
#include <iostream>

monteCarlo::monteCarlo(int trails, double drift, double volidatity, int density)
{
    for (int i = 0; i < trails; i++)
    {
        std::cout << "Trail number " << i+1 <<  std::endl;
        randomWalk r(drift,volidatity,density);
        r.seed();
        samplePaths.emplace_back(r.samplePath);
        std::cout << "\n" << std::endl;
    }
}

そして最後にmontecarlo.hは次のとおりです。

#ifndef MONTECARLO_H
#define MONTECARLO_H
#include <vector>

class monteCarlo
{
public:
    monteCarlo(int, double, double, int);
    std::vector< std::vector<double> > samplePaths;
};

#endif

私はいくつかの非常に基本的なルールを使用します:

  1. 使用には警備員が含まれます
  2. ヘッダーに本当に必要なヘッダーのみを含める
  3. 実装の最初のファイルとしてヘッダーを含めます。
  4. ヘッダーで「usingnamespace」を使用しないでください
  5. 可能であれば、インクルードの代わりに前方宣言を使用してください

3)ヘッダーに必要なすべてのインクルードファイルが含まれていることを確認します

于 2013-03-23T13:47:19.550 に答える