【问题标题】:Calling variables from main function to other classes & unable to use this?从主函数调用变量到其他类&无法使用它?
【发布时间】:2020-08-14 08:50:38
【问题描述】:

当所有类都放在一个包含所有类的主 cpp 文件中时,我能够运行该程序。但是,当我将cpp文件拆分为各自的头文件和cpp文件时,出现了一些错误。

以下是我正在使用的所有文件(它们都在一个文件夹中):

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

问题 1:

我有两个变量:

ShapeTwoD * Shape2D [100];

int size = 0;
   

以上变量在main函数中。我已经尝试在其他类中调用上述变量,但是有一个错误表明它没有在范围内声明。我也尝试添加 extern,但似乎也存在一些错误。我已将变量移至父类 Shape2D.cpp,但是,主 cpp 无法检测到变量名称。我也放在 public: 父 cpp 下。

如果有人可以帮助我,我将非常感激,因为我真的没时间了。最热烈的问候

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(父类):

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();


};

主函数():

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;






}

【问题讨论】:

  • 你能放置sn-ps的代码来显示所涉及的主要文件吗?
  • 对于问题 1:重新阅读 C++ 教科书的“静态变量”部分(也可以使用 std::vector&lt;ShapeTwoD*&gt;。对于问题 2:显示代码。
  • 为什么不能在 Shape2D 子类中访问this-&gt;vect?你得到什么错误?此外,c++ 编译器现在可以处理嵌套模板一段时间,您不再需要插入额外的空格。
  • 另外,如果完整的类声明在你的 CPP 文件中,你的头文件中有什么?
  • Class Square 没有名为“vect”的成员

标签: c++ variables inheritance


【解决方案1】:

对于问题一,最合乎逻辑的地方是ShapeTwoD中的静态成员。将以下内容放入 shapetwod.h:

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

并在 shapetwod.cpp 中定义:

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

然后您可以使用 ShapeTwoD::allShapes 从其他地方访问此向量。
注意:从 C++17 开始,您可以放弃额外的定义并声明 inline static

【讨论】:

  • 通过main函数访问呢?
  • 在主函数中,您还可以引用ShapeTwoD::allShapes
  • 在main()函数之外?
  • 在主函数之外,您可以ALSO使用ShapeTwoD::allShapes 引用它。它是 ShapeTwoD 类的公共静态成员,在 ShapeTwoD 所在的任何地方都在范围内。
  • 我的 int 变量大小呢?如何在 main 函数中引用该变量以便其他类可以使用它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2013-07-20
  • 2016-05-27
相关资源
最近更新 更多