从main函数调用变量到其他类并无法使用它?

如何解决从main函数调用变量到其他类并无法使用它?

当所有类都放在一个包含所有类的主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;
   

以上变量位于主函数中。我试过在其他类中调用上述变量,但是有一个错误指出该变量未在作用域中声明。我也尝试添加extern,但是似乎也出现了一些错误。我已经将变量移到了父类Shape2D.cpp,但是,主cpp无法检测到变量名。我还公开放置在父cpp下。

如果有人可以帮我解决问题,我将不胜感激。最热烈的问候

Square.h:

enter image description here

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,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,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;






}

解决方法

对于问题一,最合理的位置是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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-