检索某个类的“内部”类的地址

问题描述 投票:0回答:1

我有一个称为ValuationFunction的虚拟基类,该基类基本上只包含参数,并且可以基于一些计算输出值。除了一个被称为FunctionCombiner的函数外,所有派生类的行为基本相同,如下所示:

class FunctionCombiner : public valuationFunction
{
public:
    FunctionCombiner(std::vector<std::shared_ptr<valuationFunction>>& Inner_);
    void ValueInstrument();
    void RiskFactorAdd(double increment, RiskFactor simulatedRiskFactor);
    void RiskFactorMultiply(double factor, RiskFactor simulatedRiskFactor);
    virtual valuationFunction* clone() const;
private:
    std::vector<std::shared_ptr<valuationFunction>> Inner;
};

其工作方式是,它包含一个指向其他评估函数派生类的指针的矢量,并且对于每个函数,它基本上都是将指令传递给它所包含的每个内部类,而不是自己进行任何操作。现在我的问题是,我想比较我的valuationFunction类在某一点上是否相同,对于除FunctionCombiner之外的所有派生类,我只能直接比较指针,但是对于FunctionCombiner,我当然需要指向内部对象,而不仅仅是指向FunctionCombiner的指针,这是我认为必须使用的全部。什么是获取内部类地址的好方法?

我尝试过的是创建一个虚拟函数,该函数返回内部指针(或自身)的向量,然后将所有这些向量编译在一起以进行比较,但是大多数情况下尚未编译,无意复制,创建了许多我重复自己的代码,一直乱七八糟。我的下一个想法(我不想做)是向我的所有类添加一个带有唯一标识符的参数,然后将其检索并用于比较,而不是智能指针所指向的地址。但是,该解决方案绝对感觉不太优雅,我希望能够以其他方式实现。

带有进一步说明的编辑:问题是,如果我有一个包含功能A和功能B的FunctionCombiner,并且将其与功能A进行比较,它们当然将不相等。当我将功能A与功能组合器进行比较时,我真的想将功能A与功能A(在功能组合器内部)进行比较,将功能A与功能B(在功能组合器内部)进行比较。最终目标是排除重复项,以便在比较Function A和FunctionCombiner之后,我可以删除duplicare Function A之一。

不要以为确实需要,但valuationFunciton在下面:

class valuationFunction
{
public:
    valuationFunction(double TTM);
    virtual void ValueInstrument() = 0;
    virtual double GetValue() const;
    virtual void RiskFactorAdd(double increment, RiskFactor simulatedRiskFactor) = 0;
    virtual void RiskFactorMultiply(double factor, RiskFactor simulatedRiskFactor) = 0;
    virtual void UpdateTTM(double timeStep);
    virtual valuationFunction* clone() const = 0;
    virtual ~valuationFunction() {}
private:

protected:
    double f;
    double TTM;
};
c++ shared-ptr smart-pointers memory-address
1个回答
0
投票

如果我对您的理解正确,您想比较共享指针以查看它们是否包含相同的存储指针?然后这很简单:只需使用== operator

operator==的内部operator==实现为:

std::shared_ptr

即它检查存储的指针是否相同。

lhs.get() == rhs.get()


您可以做的是使用Demo在“内部”对象的向量中搜索特定的std::find()。在std::vector<std::shared_ptr<valuationFunction>>中还具有end()函数,您可以将其与向量迭代器的结束进行比较。

所以您的类定义将是这样的:

FunctionCombiner

然后您只需要调用class FunctionCombiner : public ValuationFunction { public: typedef std::vector<std::shared_ptr<ValuationFunction>>::iterator iterator; FunctionCombiner(std::vector<std::shared_ptr<ValuationFunction>> Inner_) : Inner(std::move(Inner_)) {} virtual ~FunctionCombiner() = default; iterator FindValuationFunction(const std::shared_ptr<ValuationFunction>& fn) { return std::find(Inner.begin(), Inner.end(), fn); } iterator end() { return Inner.end(); } private: std::vector<std::shared_ptr<ValuationFunction>> Inner; }; 并与FindValuationFunction()比较即可。如果end()不等于FindValuationFunction(),则共享指针存在于内部对象的向量中。

我还更改了构造函数,以按值获取向量并将其移动到end()。这样会更有效率。

Inner

希望这是您想要的。

© www.soinside.com 2019 - 2024. All rights reserved.