- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先,我是一名物理学家,所以我的编码经验和知识有限,如果我使用的术语不正确或者这个问题的答案已经存在,我深表歉意。不过,我一直找不到任何对我有意义的足够相似的东西。
现在,我正在对某个量子系统进行蒙特卡罗模拟,其中我需要一些特定的多项式。我已经为所有这些多项式编写了类。它们在初始化时都采用相同的参数(一个字符串和一个整数),并且它们中唯一的公共(public)方法从外在的角度来看是相似的(它接收一组复数 double 并输出一个复数 double )。大体图是
class Polyi{
public:
Polyi(string type, int N){
::Set things up if needed::
}
complex<double> poly(complex<double> *z){
::Calculate the polynomial and return::
}
}
现在,我希望在给定模拟中使用的多项式需要是我可以从外部输入的东西。我更习惯于 Python,所以像
if poly_type==i: polynomial = Polyi(type, N)
elif ...
是我想做的。然后我会在后续代码中使用 polynomial.poly(z)
。
但是,事实证明这在 C++ 中极其困难,因为我必须在赋值时声明我正在使用的类的类型。我试过几件事。我制作了一个包含所有单个多项式的处理程序。没用。我还尝试为所有这些创建一个基类,包括 poly(z)
函数,然后在每个函数中重载它。我也在这里失败了。但是,它们可能不起作用,因为我是个白痴,而不是因为它们实际上无法实现。
因此,我该如何实现这种动态赋值,这样当我进行实际计算时,我在变量 polynomial
中有一个所需的多项式,属于任何类别,我可以调用 polynomial.poly(z)
?如果可能的话,最简单的解决方案会很棒,因为我希望能够理解代码实际在做什么。
感谢您能为我提供的任何帮助!
编辑:非常感谢大家!没有一个无用的评论/答案,也没有很多关于查找内容的好建议。感谢大家!!!
附言。需要澄清的是,虽然它似乎不是关键点,但 type
变量定义了一种多项式中的一种多项式。例如,对于 Pn 多项式,Pn("1",N) = z1+z2+...+zN, Pn("2",N)=z1^2+z2^2+...zN^2等等。在更复杂的方面,我有 Jack 多项式,它由整数分区(如 11122 或 223)索引。我不知道如何生成它们,所以我用它们下载了一个文件,因此它是一个字符串。
最佳答案
C++ 中的多态性依赖于指针。
如果您有一个基类 Poly,然后有子类 Polya、Polyb、Polyi 等。你可以有一个 Poly*
实际上指向一个 Polya*
,但是你不能有一个包含 Polya
的 Poly
因为你将面临类型切片。
所以你可以有这样的东西:
class Poly_base
{
public:
Poly_base(string type, int N) {
// Potentially do stuff that you do on ALL poly
}
virtual complex<double> poly(complex<double> *z) = 0;
}
class Polyi : public Poly_base
{
public:
Polyi(string type, int N):
Poly_base(type, N)
{
// Stuff you would do only on Polyi.
}
virtual complex<double> poly(complex<double> *z)
{
// Your calculation for Polyi.
}
}
注意 virtual
关键字。这表示:这是我的基类上的一个方法,可以在子类上重新实现。如果您在实际指向 Polya
实例的 Poly_base*
指针上调用 poly,则将调用重新实现的版本。 (通过 vtables 的魔力)
然后在 main 中:
Poly *polynomial;
if (some_condition) {
polynomial = new Polya(type, N);
} else if (some_other_condition) {
polynomial = new Polyi(type, N);
}
polynomial->poly(z);
编辑:您可能希望您的类型是枚举而不是字符串,因此您可以像这样对其执行 switch 语句:
enum PolyType {
polya = 0,
polyb,
polyi
}
Poly_base *polynomial;
switch (type) {
case polya:
polynomial = new Polya(type, N);
break;
case polyb:
polynomial = new Polyb(type, N);
break;
case ....
}
EDIT2:您也可能不需要类构造函数中的类型。此架构的全部要点在于此信息包含在您实际创建的实例中。如果您创建了一个 Polya,那么它“知道”它是一个 Polya 而不是一个 Polyb。
关于python - C++ 中用户定义类的动态分配,都具有相同的公共(public)函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28193313/
是 if(a == 0 && b == 0 && c == 0) { return; } 一样 if(a == 0) { return; } if(b == 0) { return; } if(c =
我想做这样的事情: Class A Class B extends A Class C extends A B b = new B(); C c = new C(); b->setField("foo
我对 Mysql 世界很天真......:)我试图使用连接从表中查询, 我遇到结果集问题...表结构如下 下面... VIDEO_XXXXX | Field | Type
我最近问过关于从另一个类获取类的唯一实例的问题。 ( How to get specific instance of class from another class in Java? ) 所以,我正
假设我们有两种类型 using t1 = int*; using t2 = int*; 我知道 std::is_same::value会给我们true .什么是,或者是否有模板工具可以实现以下目标?
对于我的一个应用程序,我假设比较 2 个字符串的第一个字符比比较整个字符串是否相等要快。例如,如果我知道只有 2 个可能的字符串(在一组 n 字符串中)可以以相同的字母开头(比如说 'q'),如果是这
我想在我的NXP LPC11U37H主板(ARM Cortex-M0)上分析一些算法,因为我想知道执行特定算法需要多少个时钟周期。 我编写了这些简单的宏来进行一些分析: #define START_C
我在 Excel 中创建了一个宏,它将在 Excel 中复制一个表格,并将行除以我确定的特定数字(默认 = 500 行),并为宏创建的每个部门打开不同的工作表。 使用的代码是这样的: Sub Copy
我想根据第一个字典对第二个字典的值求和。如果我有字典 A 和 B。 A = {"Mark": ["a", "b", "c", "d"], "June": ["e", "a"], "John": ["a
当我这样做时 system()在 Perl 中调用,我通常根据 perldocs 检查返回码.嗯,我是这么想的。大部分时间 $rc!=0对我来说已经足够了。最近我在这里帮助了两个遇到问题的人syste
在我的进度条上,我试图让它检测 div 加载速度。 如果 div 加载速度很快,我想要实现的目标将很快达到 100%。但进度条的加载速度应该与 div 的加载速度一样快。 问题:如何让我的进度条加载
当我获得与本地时间相同的时间戳时,firebase 生成的服务器时间戳是否会自动转换为本地时间,或者我错过了什么? _firestore.collection("9213903123").docume
根据the original OWL definition of OWL DL ,我们不能为类和个体赋予相同的名称(这是 OWL DL 和 OWL Full 之间的明显区别)。 "Punning" i
我有两个输入复选框: 尝试使用 jQuery 来允许两个输入的行为相同。如果选中第一个复选框,则选中第二个复选框。如果未检查第 1 个,则不会检查第 2 个。反之亦然。 我有代码: $('inpu
可以从不同系统编译两个相同的java文件,但它们都有相同的内容操作系统(Windows 7),会生成不同的.class文件(大小)? 最佳答案 是的,您可以检查是否有不同版本的JDK(Java Dev
我正在清理另一个人的正则表达式,他们目前所有的都以结尾 .*$ 那么下面的不是完全一样吗? .* 最佳答案 .*将尽可能匹配,但默认情况下为 .不匹配换行符。如果您要匹配的文本有换行符并且您处于 MU
我使用 Pick ,但是如何编写可以选择多个字段的通用PickMulti呢? interface MyInterface { a: number, b: number, c: number
我有一个 SQL 数据库服务器和 2 个具有相同结构和数据的数据库。我在 2 个数据库中运行相同的 sql 查询,其中一个需要更长的时间,而另一个在不到 50% 的时间内完成。他们都有不同的执行计划。
我需要你的帮助,我有一个包含两列的表,一个 id 和 numpos,我希望 id 和 numops 具有相同的结果。 例子: $cnx = mysql_connect( "localhost", "r
如何将相同的列(在本例中按“级别”排序)放在一起?我正在做一个高分,我从我的数据库中按级别列出它们。如果他们处于同一级别,我希望他们具有相同的 ID。 但是我不想在别人身上显示ID。只有第一个。这是一
我是一名优秀的程序员,十分优秀!