Как инициализировать член, используя его параметризованный конструктор

Трудно описать без кода, поэтому здесь идет:
Я пытаюсь создать прототип объекта (b) в заголовочном файле другого (a), затем в конструкторе (a) вызвать конструктор (b) и передать ему значения, поэтому я могу затем использовать методы b которые зависят от его конструктора и значений, переданных ему, но способ, который я делаю, дает: красный, подчеркнутый в открытой скобке конструктора ценообразования, говорит: «конструктора по умолчанию для monteCarlo не существует», а затем на следующей строке m подчеркнут красным, говоря: msgstr «вызов объекта типа класса без соответствующего оператора () или функции преобразования в указатель на тип функции». Любой другой критик моей программы очень приветствуется, я пытаюсь научиться программировать, и хорошо.

в файле 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;
}

у меня есть:

#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;
};

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 ) или же { initializer-list } синтаксис.

3

Другие решения

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. Не используйте «использование пространства имен» в заголовке
  5. Если возможно, используйте предварительные объявления вместо включений

3) следит за тем, чтобы заголовок содержал все необходимые файлы

0

По вопросам рекламы [email protected]