gpt4 book ai didi

python - C++中如何继承重载运算符的功能

转载 作者:行者123 更新时间:2023-11-28 02:53:52 24 4
gpt4 key购买 nike

所以我有一个表示 n 维空间中的点的点类,以及一个从点类继承的 vector 类,并添加了一些特定于 vector 的额外功能,例如点积。我希望 vector 类从父点类继承重载运算符(+、-(一元)、-(二元)等)。在原始 python 中,我这样定义了 __add__ 运算符:

def __add__(self, other): # should be same dimensionality
sum = self.__class__.zeros(self.dimension())
for i in range(self.dimension()):
sum[i] = self[i] + other[i]
return sum

所以它需要 self 和另一个对象(大概是同一类型),调用类的一个方法生成另一个具有相同数量的维度/组件和所有零值的点/vector ,然后填充那个点/vector 与添加的组件,并返回它。在 python 中,我的 vector 类从点类继承了这个方法,没有问题,因为它通过使用 self.__class__ 调用 zeros(它本身调用每个参数的值为零的类构造函数)。我有一个 C++ 版本,看起来像这样:

Point operator+(const Point other) const { // dimensionality must match
vector<long double> new_comps(_comps.size(), 0);
for (size_t i(0); i < _comps.size(); i++) {
new_comps.at(i) = _comps.at(i) + other._comps.at(i);
}
return Point(new_comps);
}

问题是在C++中,我使用了Point作为返回类型,直接调用了point类的构造函数。在 C++ 中是否有任何等同于 self.__class__.__init__ 的东西?更广泛地说,是否有任何方法可以编写像此运算符这样的成员函数,以便它调用当前类的构造函数并返回该类型的对象,以便可以继承泛型函数并为继承它的每个类类似地工作?或者这种行为在 C++ 中是不可能的,还是我应该使用不同的技术(组合而不是继承)来解决这个问题?事实上,我的 vector 类继承自点类并添加自己的成员函数就好了,但是它的 + 运算符返回一个点而不是一个 vector ,这是有问题的。 (需要明确的是,在整个过程中我一直指的是 vector 的数学对象,而不是 vector 的 C++ STL 容器,尽管我在我的实现中使用了它。)

最佳答案

忽略一些语义差异(比如 vector 是一个点),不。您通常会做的是创建一个返回类的零形式的 static Point zeros() 方法,然后从运算符重载中调用它。如果每个子类都实现了该方法,那么它将正确返回预期的类型。

关于python - C++中如何继承重载运算符的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22445279/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com