Я нахожусь в середине проекта C ++, и я получаю известную ошибку «не объявлено в этой области». В частности, «vexp не был объявлен в этой области». Как вы можете видеть ниже, vexp — это вектор, объявленный в классе Exploration, и хотя я включил Exploration.h в main, vexp недоступен. С другой стороны, Exploration :: vexp недопустим, потому что vexp не является статичным. Делает ли vexp static единственным способом получить к нему доступ из 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
vexp
является нестатическим членом Exploration
, каждый Exploration
у создаваемого вами объекта будет свой vexp
член. Таким образом, чтобы получить доступ к vexp
вам нужно иметь Exploration
объект. То есть будет работать следующее:
Exploration exp1(false, 3.0f, 5);
Exploration exp2(true, 6.0f, 10);
exp1.vexp.push_back(exp2);
Обратите внимание, что я получаю доступ к vexp
член exp1
с exp1.vexp
, Это вектор, который принадлежит этому конкретному Exploration
объект. К этому вектору я подталкиваю exp2
,
Что именно вам нужно сделать, зависит от того, что вы пытаетесь сделать, и в этом я не уверен. Кажется, что вы не до конца понимаете объектно-ориентированные принципы. Вам должно быть ясно, что, потому что vexp
является нестатическим членом Exploration
не существует, пока вы не создадите Exploration
объект. То есть, каждый Exploration
объект владеет контейнером более Exploration
объекты.
Похоже, что вы просто хотите std::vector<Exploration>
это не член Exploration
, Так что вы просто хотите контейнер Exploration
с, не принадлежащие другим Exploration
s. Для этого вы просто должны сделать:
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
как член Exploration
объект, если вы не хотите сделать его статическим, напр.
temp.vexp.push_back(something);
Но, похоже, ты этого не хочешь. В вашем случае кажется, что вы должны сделать это статической или глобальной переменной.
vexp
является переменной-членом класса Exploration
поэтому его следует использовать с экземпляром класса Exploration
temp.vexp.push_back(SomeVariable);
Но не рекомендуется объявлять переменную-член как public
и использовать это так вне класса.
Является vexp
должен был быть список всех ваших Exploration
s? Если это так, вы должны объявить это вне из 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);
}
Возьмите 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';
}