объявление — не объявлено в этой области Переполнение стека

Я нахожусь в середине проекта 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

0

Решение

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с, не принадлежащие другим Explorations. Для этого вы просто должны сделать:

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 учебный класс.

2

Другие решения

Вы должны получить доступ vexp как член Exploration объект, если вы не хотите сделать его статическим, напр.

temp.vexp.push_back(something);

Но, похоже, ты этого не хочешь. В вашем случае кажется, что вы должны сделать это статической или глобальной переменной.

1

vexp является переменной-членом класса Exploration поэтому его следует использовать с экземпляром класса Exploration

temp.vexp.push_back(SomeVariable);

Но не рекомендуется объявлять переменную-член как public и использовать это так вне класса.

0

Является vexp должен был быть список всех ваших Explorations? Если это так, вы должны объявить это вне из 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);
}
0

Возьмите 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';
}
0
По вопросам рекламы [email protected]