如何使用成员的参数化构造函数初始化成员

How to initialize a member using its parameterized constructor

本文关键字:成员 构造函数 初始化 何使用 参数      更新时间:2023-10-16

没有代码很难描述,因此如下所示:我试图在另一个(a(的头文件中创建一个对象(b(的原型,然后在(a(调用(b(构造函数的构造函数中传递值,这样我就可以使用b的方法,这些方法取决于它的构造函数和传递给它的值,但我的做法是:pricing构造函数的左括号中用红色下划线表示:"蒙特卡洛不存在默认构造函数",然后在下一行m用红色下划线强调:"调用没有适当运算符((或转换函数的类类型的对象以指向函数类型"。任何其他对我的节目的批评都是非常受欢迎的,我正在努力学习节目,而且很好。

在文件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;
}

在定价方面。h我有:

#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)
{
}

最后是蒙特卡罗。h是:

#pragma once
#include <vector>
class monteCarlo
{
public:
monteCarlo(int, double, double, int);
~monteCarlo(void);
std::vector< std::vector<double> > samplePaths;
};
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 ){ initializer-list }语法对其进行初始化。

pricing.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;
    }
}

最后是蒙特卡罗。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. 不要在标头中使用"using namespace">
  5. 如果可能,请使用前向声明而不是include

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