簡體   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