继承类传染媒介

时间:2013-01-07 19:11:46

标签: c++ class stdvector

当我试图制作一个形状的总体矢量时,在这个地方有不同的形状,如“八面体”,“长方体”,“球体”......

我试图做类似于http://www.cplusplus.com/forum/general/2710/的事情,但行121 - 136

if (shape_type == 0) {
  sphere->set_shape(Coordinates, Properties, mode);
  ShapeVector.push_back(sphere);
}
else if (shape_type == 2) {
  ellipsoid->set_shape(Coordinates, Properties, mode);
  ShapeVector.push_back(ellipsoid);
}
else if (shape_type == 3) {
  cuboid->set_shape(Coordinates, Properties, mode);
  ShapeVector.push_back(cuboid);
}
else if (shape_type == 4) {
  octahedron->set_shape(Coordinates, Properties, mode);
  ShapeVector.push_back(octahedron);
}

但我收到了错误

main.cpp:122:54:警告:'sphere'可以在此函数中未初始化使用[-Wuninitialized] main.cpp:126:57:警告:'椭球'可以在此函数中未初始化使用[-Wuninitialized] main.cpp:130:54:警告:'cuboid'可以在此函数中未初始化使用[-Wuninitialized] main.cpp:134:58:警告:'八面体'可以在此函数中未初始化使用[-Wuninitialized]

如果有人有任何建议我会很感激。如果你想要它,完整的文件在下面。

#include <iostream>
#include <cstring>
#include <fstream>
#include <vector>
#include <sstream>
#include <cstdio>
#include "ShapeContainer.H"

using namespace std;

int main () {

  //    Declaration of Variables    //
  vector <double> input;
  vector <double> BoundingBoxDimension; // Will be in the form X,Y,Z,dX,dY,dZ

  //    Note: shape_type follows same convention as Stat3D 
  //        0 = Sphere
  //        1 = Cylinder
  //        2 = Ellipsoid
  //        3 = Cuboid
  //        4 = Octahedron
  unsigned int shape_type;
  unsigned int mode;
  vector <double> Coordinates; //   Coordinates of Center of each shape 

  //    Properties of the shape
  //        For:
  //            Spheres:    r
  //            Cylinders:  R,h,v1,v2,v3
  //            Ellipsoid:  a,b,c,a1,a2,a3,b1,b2,b3 ... will calculate c1,c2,c3
  //            Cuboid:     a,b,c,a1,a2,a3,b1,b2,b3 ... will calculate c1,c2,c3
  //            Octahedron: a,b,c,a1,a2,a3,b1,b2,b3 ... will calculate c1,c2,c3
  vector <double> Properties;
  double item;
  string line;

    vector <Shape*> ShapeVector;
  ShapeContainer SC;

  //////    These are some default options used in development
  //////        feel free to delete them when finished
  string inputFileName = "../Cuboid.in";
  string Stat3DFileName = inputFileName;
  string T3DFileName = inputFileName;

  Stat3DFileName.insert(Stat3DFileName.rfind("."), "_Rewrite");
  T3DFileName.insert(T3DFileName.rfind("."), "_T3D"    );

  //    Set some options    //
  bool ReWriteStat3D = true;

  //    Set Shapes  //
  //        (if need to add a new shape, add shape here)
  Sphere* sphere;
  Ellipsoid* ellipsoid;
  Cuboid* cuboid;
  Octahedron* octahedron;

  //    Open File   //
  ifstream inputFile (inputFileName.c_str());

  if ( !inputFile.is_open() ) {
    cout << "Can not find specified input file,\n  " << inputFileName.c_str() << "\nplease check the file and try again.\n";
    return 0;
  }

  //    Read File Contents  //

  //    Gets Bounding Box Dimensions from First Line of File    //
  getline(inputFile, line);
  istringstream iss(line); //   Get a line of data corresponds to 1 item.
  while (iss >> item) {BoundingBoxDimension.push_back(item);}; //   Parses the data from the line
  if (BoundingBoxDimension.size() == 0) {
    cout << "Bounding box does not follow recognized format.\nPlease have the first line be either\ndx dy dz\nor\nx y z dx dy dz\n";
    return 0;
  }
  else if (BoundingBoxDimension.size() == 3) {BoundingBoxDimension.insert(BoundingBoxDimension.begin(),3,0);};
  SC.set_BoundingBox(BoundingBoxDimension);
  //    Takes number of particles and total number
  //        of rows and does not record them
  getline(inputFile, line);
  getline(inputFile, line);

  //    Get Data for each shape starting at line
  while (getline(inputFile, line)) {
    istringstream iss(line); // Get a line of data corresponds to 1 item.
    input.resize(0,0);

    while (iss >> item) {input.push_back(item); }; //   Parses the data from the line

    //  Set shape type  //
    shape_type=input[0]; // What type of shape is it?

    //  Set Mode (Stat3D) / Property (T3D) //
    mode=input[1]; //   What material is it (mode Stat3D/ Property T3D)

    //  Set coordinates //
    Coordinates.push_back(input[2]); // x
    Coordinates.push_back(input[3]); // y
    Coordinates.push_back(input[4]); // z

    //  Puts sizing and orientation into Properties
    for (unsigned int i = 5; i < input.size(); i++) {Properties.push_back(input[i]);};

    //  Calculates the c1,c2,c3 of shapes defined that way
    if (Properties.size() == 9)
      {
      double length;
      length = sqrt(pow(Properties[3],2)+pow(Properties[4],2)+pow(Properties[5],2));
      for (unsigned int PC = 3; PC <= 5; PC++) {Properties[PC] = Properties[PC] / length;}

      length = sqrt(pow(Properties[6],2)+pow(Properties[7],2)+pow(Properties[8],2));
      for (unsigned int PC = 6; PC <= 8; PC++) {Properties[PC] = Properties[PC] / length;}

        Properties.push_back(Properties[4]*Properties[8]-Properties[6]*Properties[7]);
        Properties.push_back(Properties[5]*Properties[6]-Properties[3]*Properties[8]);
        Properties.push_back(Properties[3]*Properties[7]-Properties[4]*Properties[6]);
      };

    if (shape_type == 0) {
      sphere->set_shape(Coordinates, Properties, mode);
      ShapeVector.push_back(sphere);
    }
    else if (shape_type == 2) {
      ellipsoid->set_shape(Coordinates, Properties, mode);
      ShapeVector.push_back(ellipsoid);
    }
    else if (shape_type == 3) {
      cuboid->set_shape(Coordinates, Properties, mode);
      ShapeVector.push_back(cuboid);
    }
    else if (shape_type == 4) {
      octahedron->set_shape(Coordinates, Properties, mode);
      ShapeVector.push_back(octahedron);
    }
    Coordinates.clear();
    Properties.clear();
  }

  inputFile.close(); // Closes Input File

/*
  //    Prints out the shapes
  ofstream T3DFile (T3DFileName.c_str());
  PrintT3D(T3DFile, SC);
  T3DFile.close();

  //    If option ReWriteStat3D is set to true, a new file for Stat3D is created 
  if (ReWriteStat3D == true) {
    ofstream Stat3DFile (Stat3DFileName.c_str());
    PrintStat3D(Stat3DFile, SC);
    Stat3DFile.close();
  };
*/
  return 0;
}

1 个答案:

答案 0 :(得分:3)

Sphere* sphere;声明一个未初始化的Sphere指针。编译器警告你,你做错了 - 你应该将它初始化为有意义的东西:

Sphere* sphere = new Sphere;

或者,更好的是:

vector <std::shared_ptr<Shape> > ShapeVector;
//...
std::shared_ptr<Shape> sphere(new Sphere);
//...

这种方式具有相同的语义,并且也正确使用RAII。但是,如果您使用第一个版本,则需要手动delete内存,这在使用智能指针时不是必需的。

无论你做什么,都不要忘记Shape::~Shape()应该是virtual