简体   繁体   中英

Calling variables from main function to other classes & unable to use this?

I was able to run the program when all the classes are placed together in 1 main cpp file with all the classes in it. However, when I split the cpp files into their respective header file and cpp files,there were some errors.

Below are all the files I'm using (They are all in one folder):

1) Assignment.cpp  (where the main function is at)
2) ShapeTwoD.cpp (Where the parent class is at)
3) ShapeTwoD.h
3) Square.cpp (Child Class)
4) Square.h
5) Rectangle.cpp (Child class)
6) Rectangle.h

Question 1:

I have a two variables:

ShapeTwoD * Shape2D [100];

int size = 0;
   

The above variables are in the main function. I've tried calling the above variables in the other classes however there is an error that states it is not declared in scope. I've try adding in extern as well however there appears to be some error as well. I've moved the variable to the parent class, Shape2D.cpp, however, the main cpp is unable to detect the variable names. I've also placed in the public: under the parent cpp.

Would be really grateful if someone could help me out as I'm really running out of time. Warmest Regards

Square.h: 在此处输入图像描述

Square.cpp:

class Square: public ShapeTwoD{

    public:

    Square(string name, bool containsWarpSpace, vector < pair<int, int> > vect):ShapeTwoD(name,containsWarpSpace,vect,radius){

        this->vect = vect;
        this->name = name;
        this->containsWarpSpace = containsWarpSpace;


    }
    double computeArea();
    bool isPointOnShape(int x, int y);
    bool isPointInShape(int x, int y);
    vector<pair<int,int> >allCoord();
    void setInnerCoord(vector<pair<int,int> > innerCoord);
    vector<pair<int,int> > getInnerCoord();
    void setOuterCoord(vector<pair<int,int> > outerCoord);
    vector<pair<int,int> > getOuterCoord();
    string toString();
    void calculatePerimeter();

    ~Square(){

    }



};

double Square::computeArea(){

        int width;
        int area;

      std::vector< pair<int, int> >::iterator result = std::max_element(this->vect.begin(), this->vect.end());
      int positionMax = std::distance(this->vect.begin(), result);

       pair<int, int> maxCoordinate = this->vect[positionMax];



    for(int i = 0; i < this->vect.size(); i++){
        if(this->vect[i].second == maxCoordinate.second && this->vect[i] != maxCoordinate){
            width = maxCoordinate.first - this->vect[i].first;
            area = width * width;
        }

    }


    return area;
}

bool Square::isPointOnShape(int x, int y){
     bool result = false;

      std::vector< pair<int, int> >::iterator resultMax = std::max_element(this->vect.begin(), this->vect.end());
          int positionMax = std::distance(this->vect.begin(), resultMax);

          std::vector< pair<int, int> >::iterator resultMin = std::min_element(this->vect.begin(), this->vect.end());
          int positionMin = std::distance(this->vect.begin(), resultMin);

           pair<int, int> maxCoordinate = this->vect[positionMax];
           pair<int, int> minCoordinate = this->vect[positionMin];

           for(int i = 0; i < this->vect.size();i++){

               if(maxCoordinate.first == x || maxCoordinate.second == y || minCoordinate.first == x || minCoordinate.second == y){
                   result = true;
               }
               else{
                   result = false;
               }
           }




    return result;
}

ShapeTwoD.cpp (Parent Class):

class ShapeTwoD{

    protected:
    string name;
    bool containsWarpSpace;
    vector < pair<int, int> > vect;
    int radius;
    double area;
    vector < pair<int, int> > innerCoord;
    vector < pair<int, int> > outerCoord;




    private:


    public:

    ShapeTwoD(){


    }

    ShapeTwoD(string name, bool containsWarpSpace, vector < pair<int, int> > vect, int radius){
        this->radius = radius;
        this->vect = vect;
        this->name = name;
        this->containsWarpSpace = containsWarpSpace;

    }
    virtual double computeArea();
    virtual bool isPointInShape(int x, int y);
    virtual bool isPointOnShape(int x, int y);
    virtual vector<pair<int,int> > allCoord();
    virtual void setInnerCoord(vector<pair<int,int> > innerCord);
    virtual vector<pair<int,int> > getInnerCoord();
    virtual void setOuterCoord(vector<pair<int,int> > outerCoord);
    virtual vector<pair<int,int> > getOuterCoord();
    virtual string toString();
    virtual void calculatePerimeter();

    virtual ~ShapeTwoD(){

    }



    string getName();
    bool getContainsWarpSpace();





    void setName(string name);
    void setContainsWarpSpace(bool containsWarpSpace);


    void setCoord(vector < pair<int, int> > v);
    vector < pair<int, int> > getCoord();
    void setArea(double area);
    double getArea();


};

Main Function():

int main() {

ShapeTwoD * obj;


int x;
int y;
int radius;

string menu = "0";

while(menu != "5"){
    cout <<"----------------------------------" << endl;
    cout << "1) Input sensor data" <<endl;
    cout << "5) Quit\n" <<endl;
    cout << "Please enter your choice:";
    cin >> menu;




if(menu == "1"){

cout << "[ Input sensor data ]" << endl;

    cout << "Please enter name of shape :";
    cin >> shape;
    transform(shape.begin(), shape.end(), shape.begin(), ::tolower);
    cout << "Please enter special type :";
    cin >> specialtype;
    transform(specialtype.begin(), specialtype.end(), specialtype.begin(), ::tolower);



 if(shape == "rectangle"){
     vector < pair<int, int> > temp;
    for(int i = 0; i < 4; i++){
                cout << "Please enter x-ordinate of pt " << i+1 <<" :";
                cin >> x;
                cout << "Please enter y-ordinate of pt " << i+1 << " :";
                cin >> y;

                  std::pair <int,int> p;
                  p = std::make_pair (x,y);
                  temp.push_back(p);

            }


    obj = new Rectangle(shape,"",temp);


      if(specialtype == "ws"){
          obj->setContainsWarpSpace(true);

 }
      else if (specialtype == "ns"){
          obj->setContainsWarpSpace(false);

      }

      Shape2D[size] = obj;
      size ++;
      temp.clear();



    cout << "\nRecords successfully stored. Going back to main menu ...\n" << endl;


    }
else if(shape == "square" ){

     vector < pair<int, int> > temp;

    for(int i = 0; i < 4; i++){
                cout << "Please enter x-ordinate of pt " << i+1 <<" :";
                cin >> x;
                cout << "Please enter y-ordinate of pt " << i+1 << " :";
                cin >> y;

                  std::pair <int,int> p;
                  p = std::make_pair (x,y);


                temp.push_back(p);


            }

    obj = new Square(shape,"",temp);


      if(specialtype == "ws"){
          obj->setContainsWarpSpace(true);

  }
      else if (specialtype == "ns"){
          obj->setContainsWarpSpace(false);

      }



      temp.clear();
      Shape2D[size] = obj;
      size ++;

    cout << "\nRecords successfully stored. Going back to main menu ...\n" << endl;




}


    cout << "\nRecords successfully stored. Going back to main menu ...\n" << endl;






}

For question one, the most logical place is a static member in ShapeTwoD . Put the following in shapetwod.h:

class ShapeTwoD {
  public:
    static vector<shared_ptr<ShapeTwoD>> allShapes;
};

and put a definition in shapetwod.cpp:

vector<shared_ptr<ShapeTwoD>> ShapeTwoD::allShapes;

You can then access this vector from elsewhere using ShapeTwoD::allShapes .
Note: As of C++17 you can forego the extra definition and make the declaration inline static .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM