2013-01-07 56 views
1

當我試圖讓形狀和在這個地方不同的形狀,如「八面體」,「立方體」,「領域」,一個總體載體...矢量繼承

我試圖做一些事情與此類似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:警告: '球' 可以在該函數中使用的未初始化[-Wuninitialized] main.cpp:126:57:warning:'ellipsoid'may be在此函數中使用未初始化[-Wuninitialized] main.cpp:130:54:警告:'cuboid'可能在此函數中未初始化使用[-Wuninitialized] main.cpp:134:58:warning:'octahedron'may be在此函數中使用未初始化[-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; 
} 

回答

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

+0

〜形狀不必是虛擬的,如果你管理所有通過動態分配shared_ptrs形狀。 –

+0

shared_ptr使用類型擦除來記住存儲的類型。它將調用正確的析構函數,而不管基類型是否暴露。我已經在VC中驗證了這種行爲,並且從我的理解來看,它是按照標準。 –

+0

@PeterRuderman你是對的,謝謝:) –