【问题标题】:Pointers for Member Functions成员函数的指针
【发布时间】:2020-05-19 21:20:55
【问题描述】:

我目前正在尝试创建一个程序,通过将数组传递给类的成员函数来计算具有给定时间值的火箭的质量。我想为数组使用指针。我该怎么做。指针应该在 int main 还是类中初始化。任何建议表示赞赏。

#include <cmath>
#include <cstring>
#include <fstream>
#include<iostream>

using namespace std;

class equip
{
public:
    double mass[999999999], velocity, height, *time[999999999];
    double calcmass(double* time); 
    double calcvelocity();
    double calcheight();
    double calctime();
private:
    double T = 7000;
    double g = 32.2;
    double K = 0.008;
};

double equip::calcmass(double* time)
{
    int i = 0;
    for(i=0; i=999999999; i++)
    {
        return mass[i] = (3000 - 40 * time[i]) / g;
    }
}

int main()
{
    int i = 0;
    equip rocket;
    ifstream infile;
    string filename;
    cout<<"Enter input file name for time values: ";
    cin>>filename;
    infile.open(filename.c_str());

    while(infile.fail())
    {
        cerr<<"Error opening file. \n";
        cout<<"Enter file name: ";
        cin>>filename;
        infile.open(filename.c_str());
    }

    for(i=0; i<999999999; i++)
    {
        infile>>rocket.time[i];
    }

    for(i=0; i<999999999; i++)
    {
        cout<<rocket.mass[i];
    }

    return 0;
}

【问题讨论】:

  • 忘记 C 样式数组的存在,不再考虑或使用它们。使用std::arraystd::vector 代替它们,您的生活会简单得多。
  • 欢迎来到 SO!请详细说明您发布的代码如何按预期工作。你得到什么输出,你想要什么?
  • 正如@JesperJuhl 所说,那些大型的堆栈分配数组(masstime)几乎肯定不是您想要做的。如果它们的大小可以改变,则使用std::vector,如果它们的大小在编译时已知,则使用std::array
  • double mass[999999999] !!!!
  • 为什么是times指针?

标签: c++ arrays class pointers


【解决方案1】:

equip 是一个非常大的对象。实际上大约 14 GB。

equip rocket 等自动变量分配在执行堆栈上。大多数桌面系统上执行堆栈的默认大小约为 1 到几兆字节。

14 GB 的对象肯定会溢出 1 MB 的堆栈。

解决方案:始终对大型数组使用动态分配,例如此处使用的。最简单的解决方案是使用std::vector。另外,你确定你需要这么大的数组吗?


for(i=0; i=999999999; i++)

这个循环看起来永远不会结束,因为 999999999 始终为真。

{
        return ....

但事实上,循环永远不会重复,因为函数会立即返回。这两种选择都没有意义,尽管它们的愚蠢结合在一起会相互抵消。

【讨论】:

    【解决方案2】:

    将数组的大小更改为实际的实数。如果不能,则进行动态内存分配。

    【讨论】:

      猜你喜欢
      • 2011-04-29
      • 1970-01-01
      • 2018-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多