3

没有代码很难描述,所以这里是:我试图在另一个(a)的头文件中对一个对象(b)进行原型化,然后在(a)的构造函数中调用(b)的构造函数并传递它的值,所以我可以使用 b 的方法,这取决于它的构造函数和传递给它的值,但是我这样做的方式给出:定价构造函数的左括号中的红色下划线表示:“monteCarlo 不存在默认构造函数”,然后在下一行 m 用红色下划线表示:“在没有适当的 operator() 或转换函数到函数指针类型的情况下调用类类型的对象”。非常欢迎任何其他批评我的程序的人,我正在努力学习编程,而且很好。

在文件定价.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);
}

这试图调用 m它,就好像它是一个函数(如果它已经重载operator(),你将能够做到这一点,这就是错误所说的)。要进行初始化m,请使用成员初始化列表:

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

此冒号语法用于在构造函数中初始化对象的成员。您只需按名称列出成员并使用( expression-list )or{ initializer-list }语法对其进行初始化。

于 2013-03-23T13:31:48.457 回答
0

定价.cpp

#include "pricing.h"

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

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

定价.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. 不要在标题中使用“使用命名空间”
  5. 如果可能,使用前向声明而不是包含

3) 确保标头包含所有必要的包含文件

于 2013-03-23T13:47:19.550 回答