正在检索 class "inner" class 的地址
Retrieving address of "inner" classes of a class
我有一个名为 ValuationFunction 的虚拟基础 class,它基本上只包含参数并且可以根据一些计算输出一个值。所有派生的 classes 除了一个叫做 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;
};
它的工作方式是它包含一个指向其他估值函数的指针向量派生 classes 并且对于它的每个函数,它基本上将指令传递给每个内部 class es 它包含而不是自己执行任何操作。现在我的问题是我想比较我的 valuationFunction classes 看看它们在某一点是否相同,对于除了 FunctionCombiner 之外的所有派生 classes 我可以直接比较指针,但是对于 FunctionCombiner,我当然需要指向内部对象的指针,而不仅仅是指向 FunctionCombiner 的指针,这是我认为必须使用的所有内容。获取内部 classes 地址的好方法是什么?
我试过的是创建一个虚函数,returns 一个内部指针向量(或它本身),然后将所有这些向量编译在一起进行比较,但这大部分都没有编译,无意中制作了副本,创建了很多代码,我在其中重复自己并且一直很混乱。我的下一个想法(我不想这样做)是简单地向我的所有 classes 添加一个参数,该参数带有一个唯一标识符,然后我将检索该标识符并将其用于比较,而不是智能指针指向的地址指针。虽然这个解决方案绝对感觉不是很优雅,但我希望能够以其他方式做到这一点。
编辑并进一步解释:问题是如果我有一个包含函数 A 和函数 B 的 FunctionCombiner,并且我将它与函数 A 进行比较,它们当然不相等。当我将函数 A 与 FunctionCombiner 进行比较时,我真的很想将函数 A 与函数 A(内部函数组合器)以及函数 A 与函数 B(内部函数组合器)进行比较。最终目标是排除重复项,以便在比较函数 A 和 FunctionCombiner 之后,我可以删除其中一个重复函数 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;
};
如果我没理解错的话,您想比较共享指针以查看它们是否包含相同的存储指针?然后很简单:只需使用 == operator
.
std::shared_ptr
的内部 operator==
实现为:
lhs.get() == rhs.get()
即它检查存储的指针是否相同。
您可以使用 std::find()
在 "inner" 对象的向量中搜索特定的 std::shared_ptr<valuationFunction>
。在 FunctionCombiner
中还有一个 end()
函数,您可以比较向量迭代器的过去结尾。
所以您的 class 定义将是这样的:
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
。这样会更有效率。
Demo.
希望这就是您要找的。
我有一个名为 ValuationFunction 的虚拟基础 class,它基本上只包含参数并且可以根据一些计算输出一个值。所有派生的 classes 除了一个叫做 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;
};
它的工作方式是它包含一个指向其他估值函数的指针向量派生 classes 并且对于它的每个函数,它基本上将指令传递给每个内部 class es 它包含而不是自己执行任何操作。现在我的问题是我想比较我的 valuationFunction classes 看看它们在某一点是否相同,对于除了 FunctionCombiner 之外的所有派生 classes 我可以直接比较指针,但是对于 FunctionCombiner,我当然需要指向内部对象的指针,而不仅仅是指向 FunctionCombiner 的指针,这是我认为必须使用的所有内容。获取内部 classes 地址的好方法是什么?
我试过的是创建一个虚函数,returns 一个内部指针向量(或它本身),然后将所有这些向量编译在一起进行比较,但这大部分都没有编译,无意中制作了副本,创建了很多代码,我在其中重复自己并且一直很混乱。我的下一个想法(我不想这样做)是简单地向我的所有 classes 添加一个参数,该参数带有一个唯一标识符,然后我将检索该标识符并将其用于比较,而不是智能指针指向的地址指针。虽然这个解决方案绝对感觉不是很优雅,但我希望能够以其他方式做到这一点。
编辑并进一步解释:问题是如果我有一个包含函数 A 和函数 B 的 FunctionCombiner,并且我将它与函数 A 进行比较,它们当然不相等。当我将函数 A 与 FunctionCombiner 进行比较时,我真的很想将函数 A 与函数 A(内部函数组合器)以及函数 A 与函数 B(内部函数组合器)进行比较。最终目标是排除重复项,以便在比较函数 A 和 FunctionCombiner 之后,我可以删除其中一个重复函数 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;
};
如果我没理解错的话,您想比较共享指针以查看它们是否包含相同的存储指针?然后很简单:只需使用 == operator
.
std::shared_ptr
的内部 operator==
实现为:
lhs.get() == rhs.get()
即它检查存储的指针是否相同。
您可以使用 std::find()
在 "inner" 对象的向量中搜索特定的 std::shared_ptr<valuationFunction>
。在 FunctionCombiner
中还有一个 end()
函数,您可以比较向量迭代器的过去结尾。
所以您的 class 定义将是这样的:
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
。这样会更有效率。
Demo.
希望这就是您要找的。