如何初始化一个成员使用它的参数化构造函数
很难描述没有代码所以在这里: 我想在另一个(a)的头文件中创建一个对象(b)的原型,然后在a)调用(b)的构造函数并传递它的值,所以我可以使用b的方法,这取决于它的构造函数和传递给它的值,但是我做的方式给出了:红色下划线在定价的开放括号中构造函数说:“没有默认构造函数存在monteCarlo”,然后在下一行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;
}
在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)
{
}
终于蒙特卡洛.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 }
语法对它们进行初始化。
@OP yep,这应该做到 – TravellingGeek 2013-03-23 13:36:14
谢谢你真是太棒了! – 2013-03-23 15:26:05
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
我会用一些非常基本的规则:
- 使用包括警卫
- 只包括那些真正需要在头
- 包括标头,如在执行第一个文件头。
- 不要在头
- 如果可能,请使用“使用命名空间”,可以使用前置声明,而不是包括
3)确保,即头包含所有必要的包含文件
非常感谢回答:)我实际上在每个头文件的顶部都有#pragma,这应该足够用于头标卫吗? – 2013-03-23 15:29:53
@RobSpencer包括警卫更便携 – 2013-03-23 16:29:53
欢迎计算器!请考虑一个描述问题的标题好一点。这样,你可能会得到更多的关注和更好的答案。 – Sentry 2013-03-23 13:32:49
没有理由包含自己的标题。我将从pricing.h中移除#include“pricing.h”。 – 2013-03-23 13:36:35
啊耶谢谢你,我认为这一定是我一直在添加头文件,我开始不使用它们。试图在实际编程中更好地完成工作,而不仅仅是完成工作,所以这是一个学习过程:)感谢您重命名该问题,不确定什么是好标题 – 2013-03-23 15:33:06