繁体   English   中英

在此范围内未声明c ++

[英]not declared in this scope c++

我处于c ++项目的中间,并且收到众所周知的错误“未在此范围内声明”。 特别是“未在此范围内声明vexp”。 如下所示,vexp是在Exploration类中声明的向量,尽管我已经在主目录中包含Exploration.h,但vexp无法访问。 另一方面,Exploration :: vexp是不可接受的,因为vexp不是静态的。 使vexp静态化是从main访问它的唯一方法吗???

#include "exploration.h"
#include <iostream>
#include <vector>

int main()
{

    std::srand (time(NULL));

    for(int i=1; i<9; i++)
    {
        Exploration temp (0,3,3);
        vexp.push_back(temp);
    }
    for(int j=0; j<(int)Exploration::vexp.size(); j++)
    {
        std::cout << Exploration::vexp[j].Vertical;
        std::cout << Exploration::vexp[j].Horizontal;
        std::cout << Exploration::vexp[j].r;
        std::cout << '\n';
    }

    return 0;
}

和标题:

#ifndef EXPLORATION_H
#define EXPLORATION_H
#include<vehicle.h>
#include <vector>

class Exploration : public vehicle
{
    public:
    std::vector <Exploration> vexp;
    Exploration(bool,float,int);
    int r;
    void DangerCheck();
    bool expaxis(int k);
};
#endif // EXPLORATION_H

vexpExploration的非静态成员。 您创建的每个Exploration对象将具有其自己的vexp成员。 因此,要访问vexp ,您需要具有一个Exploration对象。 也就是说,以下将起作用:

Exploration exp1(false, 3.0f, 5);
Exploration exp2(true,  6.0f, 10);
exp1.vexp.push_back(exp2);

请注意,我访问vexp成员exp1exp1.vexp 那就是属于那个特定Exploration对象的向量。 为此,我推exp2

您究竟需要做什么,取决于您要做什么,而我不确定。 似乎您没有完全掌握面向对象的原理。 您应该清楚,由于vexpExploration的非静态成员,因此在您创建Exploration对象之前它不存在。 也就是说, 每个 Exploration对象拥有一个包含更多Exploration对象的容器。

似乎您只需要一个不是Exploration成员的std::vector<Exploration> 因此,您只需要一个Exploration的容器,而不由其他Exploration拥有。 为此,您只需执行以下操作:

int main()
{
  std::srand (time(NULL));
  std::vector<Exploration> vexp; // vexp has been moved here

  for(int i=1; i<9; i++)
  {
      Exploration temp (0,3,3);
      vexp.push_back(temp);
  }
  for(int j=0; j < vexp.size(); j++)
  {
      std::cout << vexp[j].Vertical;
      std::cout << vexp[j].Horizontal;
      std::cout << vexp[j].r;
      std::cout << '\n';
  }
}

请注意,现在已将vexp声明为main函数的本地变量,应将其从Exploration类中删除。

如果您不想将vexp设为静态对象,则必须将vexp作为Exploration对象的成员进行访问。

temp.vexp.push_back(something);

但这似乎并不是您想要的。 在您的情况下,似乎应该将其设置为静态或全局变量。

vexpExploration类的成员变量,因此应与Exploration类的实例一起使用

temp.vexp.push_back(SomeVariable);

但是,不建议将成员变量声明为public并像在外部类中那样使用它。

vexp从类中vexp

 std::vector<Exploration> vexp;

和:

 for(int j=0; j<vexp.size(); j++)
 {
     std::cout << vexp[j].Vertical;
     std::cout << vexp[j].Horizontal;
     std::cout << vexp[j].r;
     std::cout << '\n';
 }

vexp是否打算成为您所有Exploration的列表? 如果是这样,则需要在Exploration之外声明它。 然后你可以做你的

Exploration temp (0,3,3);
vexp.push_back(temp);

它应该可以正常工作。

另一方面,如果是作为附加到特定Exploration的向量,则本节将非常令人困惑:

  Exploration temp (0,3,3);
  vexp.push_back(temp);

您将需要类似

  Exploration myExpl;
  for(int i=1; i<9; i++)
  {
      Exploration temp (0,3,3);
      myExpl.vexp.push_back(temp);
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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