【问题标题】:Calling void function problems调用void函数问题
【发布时间】:2012-06-29 02:26:10
【问题描述】:

您好,我在代码中调用 void initialize() 函数时遇到问题。我应该得到一个看起来像这样的数组

//cccccccccccccccccccccccccc
  cxxxxxxxxxxxxxxxxxxxxxxxxc
  cxxxxxxxxxxxxxxxxxxxxxxxxc
  cxxxxxxxxxxxxxxxxxxxxxxxxc
  cxxxxxxxxxxxxxxxxxxxxxxxxc
  cxxxxhhhhhhhxxxxxxxxxxxxxc
  cxxxxhhhhhhhxxxxxxxxxxxxxc
  cxxxxhhhhhhhxxxxxxxxxxxxxc
  cxxxxhhhhhhhxxxxxxxxxxxxxc
  cxxxxxxxxxxxxxxxxxxxxxxxxc
  cccccccccccccccccccccccccc//

数组在 Initialize() 中定义,变量来自 FIN 、 SteamPipe 和 GridPT 类。我的代码在数组之前给了我第一组答案,但是当它到达数组时,我只得到符号'?这就是它在 GridPT 类中指定的内容。 我认为我调用 void 函数的方式是错误的,或者传递变量有问题?我已经尝试取出 const 但仍然相同。 这是我的代码 .h 文件

#include<iostream>
#include<istream>
#include<cmath>
#include<cstdlib>

using namespace std;

const int maxFinHeight = 100;
const int maxFinWidth = 100;

class Steampipe
{
private:
  int height, width;
  double steamTemp;

public:
  Steampipe (int H = 0, int W = 0, double sT = 0.0)
  {
    height = H;
    width = W;
    steamTemp = sT;
  }

  // Access function definitions
  int getWidth()const{return width;};
  int getHeight()const{return height;};
  double getSteamTemp()const{return steamTemp;};
  void setWidth(int dummysteamwidth) {width = dummysteamwidth;};
  void setHeight(int dummysteamheight){height = dummysteamheight;};
  void setSteamTemp(double dummysteamtemp){steamTemp = dummysteamtemp;};

  // Access function definitions
  friend istream& operator>>(istream& , Steampipe& ); // YOU MUST DEFINE
  friend ostream& operator<<(ostream& , const Steampipe& ); // YOU MUST DEFINE
};

class GridPt
{
private:
  double temperature;
  char symbol;

public:
  GridPt(double t = 0.0, char s = '?')
  {
    temperature = t;
    symbol = s;
  }

  // Access function definitions
  double getTemperature()const {return temperature;};
  char getsymbol() const {return  symbol;};

  void setTemperature (double T=0) {T=temperature;}
  void setsymbol (char S='?'){S=symbol;}
};

class Fin
{
private:
  int width, height; //width and height of fin
  int pipeLocationX, pipeLocationY; //grid location of lower left corner of steampipe
  double boundaryTemp; //temperature of fin surroundings
  Steampipe Pipe; //steampipe object - COMPOSITION
  GridPt GridArray[maxFinHeight][maxFinWidth]; // array of GridPts - COMPOSITION

public:
  int getwidth() {return width;}
  int getheight() {return height;}
  int getpipeLocationX(){return pipeLocationX;}
  int getpipeLocationY(){return pipeLocationX;}
  double get_boundarytemp(){return boundaryTemp;}
  void setwidth (int w){w=width;}
  void setheight (int h){h=height;} 
  friend istream& operator>>(istream& , Fin& ); // YOU MUST DEFINE
  friend ostream& operator<<(ostream& , const Fin& ); // YOU MUST DEFINE

  void initialize(); // YOU MUST DEFINE
};

void Fin::initialize()
{
  int j(0) ,i(0);
  for ( i = 0; i < height; i++)
  {
    for (  j = 0; j < width; j++)
    {
      if (   j == pipeLocationX && i == pipeLocationY
          && i <  Pipe.getHeight() + pipeLocationY
          && j < Pipe.getWidth() + pipeLocationX)
      {
        GridArray [j][i].setTemperature(Pipe.getSteamTemp());
        GridArray [j][i].setsymbol('H');
      }
      else if (j == (width -1) || i == (height -1) || j == 0 || i == 0)
      {
        GridArray [j][i].setTemperature(boundaryTemp);
        GridArray [j][i].setsymbol('C');
      }
      else
      {
        GridArray [j][i].setTemperature((Pipe.getSteamTemp() + boundaryTemp)/2);
        GridArray [j][i].setsymbol('X');
      }
    }
  } 
}



istream &operator >> (istream & in, Fin& f)
{
  int   ws, hs; 
  double  ts;
  char comma;

  cout << "Enter the height of the fin (integer) >>> ";
  in >> f.height;

  cout << "Enter the width of the fin (integer) >>> " ;
  in >> f.width;

  cout << "Enter the height of the streampipe (integer) >>> ";
  in >>hs;
  f.Pipe.setHeight(hs);
  cout << "Enter the width of the steampipe (integer) >>> ";
  in >> ws;
  f.Pipe.setWidth(ws);
  cout << "Enter coordinates of lower left corner of steampipe (X,Y) >>> ";
  in >> f.pipeLocationX >> comma >> f.pipeLocationY;

  cout << "Enter the steam temperature (floating point) >>> ";
  in >> ts;
  f.Pipe.setSteamTemp(ts);
  cout << "Enter the temperature around the fin (floating point) >>> "; 
  in >> f.boundaryTemp;
  return in;
}

ostream &operator << (ostream &stream, const Fin& t)
{
  int i = 0;
  int j = 0;

  stream << "The width of the fin is " << t.width << endl;

  stream << "The height of the fin is " << t.height << endl;

  stream << "The outside temperature is " << t.boundaryTemp << endl;

  stream << "The lower left corner of the steam pipe is at " 
         << t.pipeLocationX <<      "," << t.pipeLocationY << endl;

  stream << "The steampipe width is " << t.Pipe.getWidth() << endl;

  stream << "the steampipe height is " << t.Pipe.getHeight() << endl;

  stream << "The temperature of the steam is " << t.Pipe.getSteamTemp() << endl;

  for ( i = 0; i < t.height; i++)
{
    for (  j = 0; j < t.width; j++)
    {
        if (j == t.pipeLocationX && i == t.pipeLocationY && i < t.Pipe.getHeight() + t.pipeLocationY && j < t.Pipe.getWidth() + t.pipeLocationX)
        {
            t.GridArray [j][i].getTemperature();
            stream<<t.GridArray [j][i].getsymbol();

        }
        else if (j == (t.width -1) || i == (t.height -1) || j == 0 || i == 0)
        {
            t.GridArray [j][i].getTemperature();
            stream<<t.GridArray [j][i].getsymbol();
        }
        else
        {
            t.GridArray [j][i].getTemperature();
            stream<<t.GridArray [j][i].getsymbol();
        }

    }stream<<endl;
}   

  int coorx(0),coory(0);char comma;

  stream << "Enter the coordinates of the gridpoint of interest (X,Y) >>> "
         << endl;
  cin>>coorx>>comma>>coory;
  stream<<"The temperature at location ("<<coorx<<","<<coory<<") is "
         << t.GridArray << endl;

  return stream;
}

而我的驱动文件cpp是:

#include "pipe.h"

int main()
{
  Fin one; 
  cin >> one;
  one.initialize();
  cout << one;

  return 0;
}

任何建议将不胜感激。谢谢

【问题讨论】:

  • 至少尝试有一些缩进代码并将其缩小到实际问题。否则这太痛苦了。
  • 是的,那里有这么大的代码块,编辑它以使其更具可读性似乎太费力了!请提供简洁、格式良好的示例。

标签: c++ class multidimensional-array


【解决方案1】:

在你的代码中有以下错误:

void setTemperature (double T=0) {T=temperature;}
void setsymbol (char S='?'){S=symbol;}

一定是:

void setTemperature (double T=0) {temperature = T;}
void setsymbol (char S='?') { symbol = S;}

顺便说一句:把函数定义放在你的头文件中(除非它是一个模板)不是一个好习惯,而是把它们放在一个源文件中,只在头文件中声明。

在您的代码中,您还可以直接在输出流中使用t.GridArray:
stream&lt;&lt;t.GridArray;
这行不通。 它不是 ostream 可以理解的函数或类型。 使用您已声明的 i 和 j 变量并逐个遍历数组的每个元素以打印它们,与初始化数组时相同。

【讨论】:

  • 谢谢 Slashmais,老师给了我们部分标题。我们应该初始化函数管道并制作数组,我们不能在源代码中移动任何函数。顺便说一句,我只是切换了温度和符号侧,但仍然无法正常工作。我得到的只是函数的地址 =002e8728
  • 再次感谢 Slashmais,我按照你说的做了,现在看起来好多了。唯一的问题是我没有得到用“H”填充的内部矩形。但我会继续寻找我可能遗漏的任何东西。
  • @lolo1116:这是学习、使用代码、进行更改并看看会发生什么的方式。从现在开始你应该开始做的一个非常好的习惯是当你有工作代码时,在你改变它之前备份它。这样,您可以在更改失败时将其复制回来,然后重试。 (相信我,这是“当”而不是“如果”;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-04
  • 2011-02-05
相关资源
最近更新 更多