2011-10-15 44 views
2

獲取一些非常令人困惑的錯誤,但不確定原因。這裏是我的代碼:C++ - 何時正確使用 - >?錯誤:' - >'的基本操作數具有非指針類型'BaseBond'

//=====================WORKS======================= 
TradingBook::TradingBook(const char* yieldCurvePath, const char* bondPath) 
{ 
//...Some stuff 
    BaseBond* tradingBook[bondCount]; 

    for (int i=0; i < bondCount; i++) 
    { 
     tradingBook[i] = new CouponBond(bonds[i]); 

     printf("Bond: %s\n" 
      " Price: %.3f\n" 
      " DV01: %.3f\n" 
      " Risk: %.3f\n", tradingBook[i]->getID(), tradingBook[i]->getPrice(), tradingBook[i]->getDV01(), tradingBook[i]->getRisk()); 
    } 
} 

//=================DOESNT WORK====================== 
//Gives Error: base operand of ‘->’ has non-pointer type ‘BaseBond’ 
void TradingBook::runAnalytics() 
{ 
    for (int i=0; i < bondCount; i++) 
    { 
     tradingBook[i]->calcPrice(tradingBook[i]->getYield()); 
     tradingBook[i]->calcDV01(); 
     tradingBook[i]->calcRisk(); 

     printf("Bond: %s\n" 
       " Price: %.3f\n" 
       " DV01: %.3f\n" 
       " Risk: %.3f\n", tradingBook[i]->getID(), tradingBook[i]->getPrice(), tradingBook[i]->getDV01(), tradingBook[i]->getRisk()); 
    } 
} 

我得到的錯誤基礎操作「 - >」具有在每個實例非指針類型「BaseBond」 - >,但只在runAnalytics()方法。 tradingBook是一個公共類變量。爲什麼它會在底部方法中給我一個錯誤,而不是構造函數?我不明白。

我也嘗試在第二種方法中將tradingBook [i] - > method()更改爲tradingBook [i] .method(),但它給了我一個分段錯誤,所以我認爲這是不對的。任何人都可以幫我澄清我的困惑嗎?

在情況下,它是需要的,這裏是頭文件TradingBook:

class TradingBook 
{ 
    public: 
     TradingBook(const char* yieldCurvePath, const char* bondPath); 
     double getBenchmarkYield(short bPeriods) const; 

     BaseBond* tradingBook; 
     int treasuryCount; 
     Treasury* yieldCurve; 
     int bondCount; 
     void runAnalytics(); 

}; 

BaseBond是一個抽象類。它的孩子是CouponBond和ZeroCouponBond。 tradingBook [i]充滿了這兩種類型。這裏是BaseBond的標題:

class BaseBond{ 
    public: 
    virtual double getPrice() = 0; 
    virtual double getYield() = 0; 
    virtual short getPeriods() = 0; 
    virtual char* getID() = 0; 
    virtual double getDV01() = 0; 
    virtual double getRisk() = 0; 
    virtual char* getRateType() = 0; 
    virtual void calcPrice(double nyield) = 0; 
    virtual double calcPriceR(double nyield) const = 0; 
    virtual void calcDV01() = 0; 
    virtual void calcRisk() = 0; 


}; 

在預先感謝您,stackOverFlow!

+0

可能重複的[Operator'。' vs' - >'in C++](http://stackoverflow.com/questions/7344127/operator-vs-in-c) –

回答

4

,因爲這樣的:

BaseBond* tradingBook[bondCount]; 

在構造函數構造隱藏tradingBook一個範圍的變量。這整條生產線改變:

tradingBook = new BaseBond*[bondCount]; 

和線

BaseBond* tradingBook; 

在標題中

BaseBond** tradingBook; 

,它應該工作。

+0

Dani: 當我進行調整時,出現以下錯誤: TradingBook.cc | 23 |錯誤:無法分配抽象類型的對象'BaseBond' 想法? – CHawk

+1

@Insomnihack:那麼'BaseBond'是一個**抽象基類**,它不能被直接實例化(但它會有**子類可以)。通過閱讀文檔或代碼示例(或在此鏈接)找出哪些子類。無論是或者你應該定義你自己的子類**'類MyInheritedBond(BaseBond)'**並實現任何方法都是純虛擬的。 – smci

+0

謝謝! BaseBond由兩個子類繼承:CouponBond和ZeroCouponBond。在數組tradingBook中都混合在一起。我意識到我嚴格按照原始代碼的構造函數制定了交易書的範圍。我的問題是,我怎樣才能讓全班同學都參與其中?我無法使用該行tradingBook = new BaseBond [bondCount];因爲BaseBond是抽象的,不能直接初始化 – CHawk

5

這是因爲tradingBook[i]是一個對象,而不是指針,因爲您指的是定義爲TradingBook *tradingBook的成員變量tradingBook。因此,請使用tradingBook[i].而不是tradingBook[i]->

+0

如果我將所有' - >'更改爲'。'我遇到了分段錯誤。我不知道這是否重要,但'BaseBond'是一個抽象類。它的孩子是'CouponBond'和'ZeroCouponBond'。 'tradingBook [i]'充滿了這兩種類型。我將BaseBond的頭文件添加到原始文章中。 感謝您的幫助! – CHawk

+1

@Insomnihack:由於代碼中存在多個問題,因此會出現分段錯誤。你修正了一個(使用'.'而不是' - >'),並且發現了另一個。您必須提出另一個問題才能得到該問題的答案。 –

+2

@NicolBolas:問題不在於' - >'應該替換爲'。',而是'tradingBook'應該是一個雙指針並且在構造函數中初始化,而不是隱藏。 – Dani

1

達尼是正確的,你應該申報和分配你的基地型的一個數組:

BaseBond** tradingBook; 
... 
tradingBook = new BaseBond[bondCount]; 

(但如果它是可變大小,你會被追加和刪除,你要麼需要malloc()(痛苦),或者使用STL向量(/其他),而不是陣列。爲了簡單起見,分配你可能合理需要的最大的陣列。)

反正聽起來像編譯器(和文檔)告訴你「BaseBond '是一個不能直接實例化的抽象基類(但是它會有子類可以)。通過閱讀文檔或代碼示例找出哪些子類(如果在閱讀後無法弄清楚,請將其鏈接到此處)。 無論是或者你應該定義你自己的子類class MyInheritedBond (BaseBond)並實現任何方法都是純虛擬的。無論哪種方法編譯器嘮叨):

class MyInheritedBond (BaseBond) { 
    void PVfn1() { /* empty dummy implementation to satisfy the compiler */ } 
    int PVfn2(...) { return NULL; } 
    ... 
}; 
相關問題