2013-03-23 122 views
3

很難描述沒有代碼所以在這裏: 我想在另一個(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; 
}; 
+0

歡迎計算器!請考慮一個描述問題的標題好一點。這樣,你可能會得到更多的關注和更好的答案。 – Sentry 2013-03-23 13:32:49

+0

沒有理由包含自己的標題。我將從pricing.h中移除#include「pricing.h」。 – 2013-03-23 13:36:35

+0

啊耶謝謝你,我認爲這一定是我一直在添加頭文件,我開始不使用它們。試圖在實際編程中更好地完成工作,而不僅僅是完成工作,所以這是一個學習過程:)感謝您重命名該問題,不確定什麼是好標題 – 2013-03-23 15:33:06

回答

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 2013-03-23 13:36:14

+0

謝謝你真是太棒了! – 2013-03-23 15:26:05

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,這應該足夠用於頭標衛嗎? – 2013-03-23 15:29:53

+0

@RobSpencer包括警衛更便攜 – 2013-03-23 16:29:53

相關問題