函数初始化类内的动态数组 作为练习,我将我的硕士论文的时域有限差分法转换成了从MATLAB到C++的波传播仿真,我遇到了以下问题:
我想创建一个类,它对应于称为cpml的非物理吸收层。层的大小取决于所需的模拟参数,因此定义吸收层的阵列必须是动态的函数初始化类内的动态数组 作为练习,我将我的硕士论文的时域有限差分法转换成了从MATLAB到C++的波传播仿真,我遇到了以下问题:,c++,C++,我想创建一个类,它对应于称为cpml的非物理吸收层。层的大小取决于所需的模拟参数,因此定义吸收层的阵列必须是动态的 #ifndef fdtd_h #define fdtd_h #include <cmath> #include <iostream> #include <sstream> using namespace std; class cpml { public: int thickness; int n_1, n_2, n_3; double
#ifndef fdtd_h
#define fdtd_h
#include <cmath>
#include <iostream>
#include <sstream>
using namespace std;
class cpml {
public:
int thickness;
int n_1, n_2, n_3;
double cut_off_freq;
double kappa_x_max, sigma_x_1_max, sigma_x_2_max, alpha_x_max;
double *kappa_x_tau_xy, *sigma_x_tau_xy, *alpha_x_tau_xy;
void set_cpml_parameters_tau_xy();
};
void cpml::set_cpml_parameters_tau_xy(){
double temp1[thickness], temp2[thickness], temp3[thickness];
for(int j = 1; j < thickness; j++){
temp1[j] = 1 + kappa_x_max * pow((double)(thickness - j - 0.5) / (double)(thickness - 1), n_1);
temp2[j] = sigma_x_1_max * pow((double)(thickness - j - 0.5) / (double)(thickness - 1), n_1 + n_2);
temp3[j] = alpha_x_max * pow((double)(j - 0.5) / (double)(thickness - 1), n_3);
}
kappa_x_tau_xy = temp1;
sigma_x_tau_xy = temp2;
for(int i = 1; i < thickness; i++){
cout << sigma_x_tau_xy[i] << endl;
}
alpha_x_tau_xy = temp3;
}
#endif /* fdtd_h */
#ifndef fdtd#h
#定义时域有限差分法
#包括
#包括
#包括
使用名称空间std;
类cpml{
公众:
int厚度;
int n_1、n_2、n_3;
双截止频率;
双kappa_x_max、sigma_x_1_max、sigma_x_2_max、alpha_x_max;
双*kappa_x_tau_xy,*sigma_x_tau xy,*alpha_x_tau xy;
void set_cpml_参数_tau_xy();
};
void cpml::set_cpml_参数_tau_xy(){
双temp1[厚度]、temp2[厚度]、temp3[厚度];
对于(int j=1;j CUT< P>两个问题:它们的一个小的方面是,您的程序在技术上不是一个有效的C++程序,因为C++没有(您的数组<代码> Tun1,<代码> Tun2和 TEMP3 )。
更严重的问题是保存指向局部变量的指针。当函数返回时,局部变量超出范围而不再存在。指向它们的指针将变得无效,使用这些指针将导致未定义的行为
这两个问题都很容易用数组和指针来代替。
两个问题:它们的技术是,在程序上技术上不是一个有效的C++程序,因为C++没有(你的数组<代码> TEMP1 ,<代码> Tun2和 TEMP3 )。
更严重的问题是保存指向局部变量的指针。当函数返回时,局部变量超出范围而不再存在。指向它们的指针将变得无效,使用这些指针将导致未定义的行为
这两个问题很容易用数组和指针代替。
不能声明C++中的数组,没有一个“常量”表达式的大小(必须在编译时知道)。这意味着该代码无效:
double temp1[thickness], temp2[thickness], temp3[thickness];
相反,您应该执行以下操作:
class cmpl
{
//...
std::vector<double> kappa_x_tau_xy, sigma_x_tau_xy, alpha_x_tau_xy;
// ...
};
void cpml::set_cpml_parameters_tau_xy(){
alpha_x_tau_xy.resize(thickness);
kappa_x_tau_xy.resize(thickness);
sigma_x_tau_xy.resize(thickness);
//...
在main
中也有类似问题:
for(int j = 1; j < cpml.thickness; j++){
cout << *(cpml.sigma_x_tau_xy + j) << endl;
}
这可以说是更好的。(不过,您可以使用getter从类中获取sigma\u tau\u xy
,然后自己打印)然后你可以考虑如何通过创建表示alpha_x_max
和alpha_y_max
等逻辑分组的对象来进一步简化事情。这可以是一个std::pair
或一个带有自己的getter和setter的完全on结构。现在,它们自己的逻辑被分组在一起,并且很容易传递/ref参考/思考。cmpl
的构造函数也变得更简单,您可以接受一个同时表示x
和y
的参数,而不是分别表示这两个参数
Matlab在我(公认的BLIF)经验中并不真正鼓励面向对象的方法,但是在C++中很容易。
< P>不能在C++中声明一个数组,而没有一个“常量”表达式的大小(必须在编译时知道)。这意味着该代码无效:
double temp1[thickness], temp2[thickness], temp3[thickness];
相反,您应该执行以下操作:
class cmpl
{
//...
std::vector<double> kappa_x_tau_xy, sigma_x_tau_xy, alpha_x_tau_xy;
// ...
};
void cpml::set_cpml_parameters_tau_xy(){
alpha_x_tau_xy.resize(thickness);
kappa_x_tau_xy.resize(thickness);
sigma_x_tau_xy.resize(thickness);
//...
在main
中也有类似问题:
for(int j = 1; j < cpml.thickness; j++){
cout << *(cpml.sigma_x_tau_xy + j) << endl;
}
这可以说是更好的。(不过,您可以使用getter从类中获取sigma\u tau\u xy
,然后自己打印)然后你可以考虑如何通过创建表示alpha_x_max
和alpha_y_max
等逻辑分组的对象来进一步简化事情。这可以是一个std::pair
或一个带有自己的getter和setter的完全on结构。现在,它们自己的逻辑被分组在一起,并且很容易传递/ref参考/思考。cmpl
的构造函数也变得更简单,您可以接受一个同时表示x
和y
的参数,而不是分别表示这两个参数
Matlab在我(公认的BLIF)经验中并不真正鼓励面向对象的方法,但是在C++中很容易。
如果需要动态数组,则确实需要使用<代码> STD::Vector < /C>。“最好”的C++方式是使用<代码> STD::Vector < /Cl> >(它是动态容器类),而不是原始数组(它从来不是动态的,但可以动态分配)。如果需要动态数组,则应该使用<代码> STD::vector < /代码>。<代码> >代码> SETHSPMCLIOVALDSELSYTAXYX结束,因此不能“存储”以后使用。“最好”的C++方式是使用<代码> STD::vector < /Cl> >(它是动态容器类),而不是原始数组(它从不动态),但可以动态分配。
int main() {
int cpml_thickness = 10;
int n_1 = 3, n_2 = 0, n_3 = 3;
double cut_off_freq = 1;
double kappa_x_max = 0;
double sigma_x_1_max = 0.8 * (n_1 + 1) / (sqrt(simulation_medium.mu/simulation_medium.rho) * simulation_grid.big_delta_x), sigma_x_2_max = 0.8 * (n_1 + 1) / (sqrt(simulation_medium.mu/simulation_medium.rho) * simulation_grid.big_delta_x);
double alpha_x_max = 2 * PI * cut_off_freq;
double kappa_y_max = 0;
double sigma_y_1_max = 0.8 * (n_1 + 1) / (sqrt(simulation_medium.mu/simulation_medium.rho) * simulation_grid.big_delta_y), sigma_y_2_max = 0.8 * (n_1 + 1) / (sqrt(simulation_medium.mu/simulation_medium.rho) * simulation_grid.big_delta_y);
double alpha_y_max = 2 * PI * cut_off_freq;
cpml cpml(cpml_thickness, n_1, n_2, n_3, cut_off_freq, kappa_x_max, kappa_y_max, sigma_x_1_max, sigma_x_2max, alpha_x_max, alpha_y_max);
cpml.set_cpml_parameters_tau_xy();
cpml.PrintSigmaTauXY(std::cout);
}