2013-03-23 4 views
3

Трудно описать без кода, так вот: Я пытаюсь прототипировать объект (b) в заголовочный файл другого (a), а затем в конструкторе (a) вызвать конструктор (b) и передать его значения, поэтому я могу затем использовать методы b, которые зависят от его конструктора и значений, переданных ему, но способ, которым делает im, дает: красный подчеркивается в открытой скобке ценообразования конструктор говорит: «для 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) 
{ 
} 

и, наконец, Montecarlo .h:

#pragma once 
#include <vector> 

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

Добро пожаловать в StackOverflow ! Пожалуйста, рассмотрите заголовок, который описывает проблему немного лучше. Таким образом, вы, вероятно, получите больше внимания и лучших ответов. – Sentry

+0

Нет причин включать заголовок от себя. Я бы удалил #include "pricing.h" из pricing.h. –

+0

Ах да, спасибо, я думаю, что это должно было быть, пока я добавлял файлы заголовков, я начал их не использовать. Попытка лучше поправляться на самом деле программирования, а не просто выполнять работу, так что это процесс обучения :) Спасибо за переименование вопроса тоже, не был уверен, что хороший заголовок –

ответ

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 } синтаксисом.

+0

@OP yep, это сделает это – TravellingGeek

+0

Thank вы очень! –

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

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

+0

Большое спасибо за ответ :) У меня на самом деле есть #pragma один раз в верхней части каждого заголовочного файла, должно ли это быть достаточным для защиты заголовков? –

+0

@ RobSpencer включают защитные устройства более переносимые –

Смежные вопросы