繁体   English   中英

C ++ - 何时正确使用 - >? 错误:' - >'的基本操作数具有非指针类型'BaseBond'

[英]C++ - When to exactly use ->? Error: base operand of ‘->’ has non-pointer type ‘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是一个公共类变量。 为什么它会在底部方法中给出错误而不是构造函数? 我不明白。

我也尝试在第二种方法中将所有的tradeBook [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!

这是因为tradingBook[i]是一个对象,而不是一个指针,因为你指的是成员变量tradingBook ,它定义为TradingBook *tradingBook 所以,使用tradingBook[i]. 而不是tradingBook[i]->

因为这个:

BaseBond* tradingBook[bondCount];

在构造函数中构造一个隐藏tradingBook的范围变量。 将整行改为:

tradingBook = new BaseBond*[bondCount];

和线

BaseBond* tradingBook;

在标题中

BaseBond** tradingBook;

它应该工作。

Dani是正确的,你应该声明并分配你的基类型数组:

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

(但是如果它是可变大小的,你将要追加和删除,你要么需要malloc() (痛苦),要么使用STL Vector(/无)而不是数组。为简单起见,分配你可能合理的最大数组需要。)

无论如何,听起来像编译器(和文档)告诉你'BaseBond'是一个抽象的基类,不能直接实例化(但它会有子类,可以)。 通过阅读文档或代码示例来确定哪些子类(或者如果您在阅读后无法解决这个问题,请将其链接到此处)。 要么你或者你应该定义你自己的子class MyInheritedBond (BaseBond)并实现任何纯虚拟方法(即编译器唠叨的方法):

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM