Как вернуть вектор из класса?
У меня есть класс. Допустим, пусть это будет класс, представляющий собой координатную сетку. Координаты в ней хранятся в векторе, где каждая точка - это структура с полями x и y. Я хочу реализовать метод, позволяющий получить коллекцию всех точек на сетке. Для этого мне надо, чтобы метод класса возвращал вектор с точками (или может есть более удобный способ?). Однако возникла проблема (в с++ я новичек): как мне его вернуть? Сам метод я реализовал. Однако как мне присвоить возвращаемое значение переменной? Переменная должна при инициализации быть такого же типа, как и значение, возвращаемое из функции. И тут проблема:
Из функции возвращается вектор, содержащий структуры Point. Структура Point объявлена внутри класса. То есть в самом коде я не могу написать
vector vec = grid.get_all_points();
Что делать? Вынести структуру Point в область видимости всего кода? А если я хочу сохранить объявление этой структуры внутри класса?
Код программы:
#include <iostream>
#include <vector>
using namespace std;
class RSGrid {
private:
struct Point {
float x, y;
};
vector <Point> points;
public:
void add_point(float x, float y) {
Point p = { x, y };
this->points.push_back(p);
}
vector <Point> get_all_points() {
return this->points;
}
};
int main() {
setlocale(LC_ALL, "RUSSIAN");
RSGrid grid = RSGrid();
grid.add_point(1, 1);
grid.add_point(12, 1);
grid.add_point(1, 2);
vector <Point>
system("pause"); return 0;
}
Ответы (1 шт):
Логично, если класс объявлен внутри приватной части, то он не будет доступен вне кода класса. Но можно просто перенести его в публичную часть класса
class RSGrid {
public:
struct Point {
float x, y;
};
private:
vector <Point> points;
public:
и теперь можно писать вот так
vector <RSGrid::Point> v = grid.get_all_points();
Но что делать, если расскрывать тип внутри не очень хочется и нужно его оставить в приватной части? Тоже можно. В публичную часть класса дописываем такое
public:
using Points = std::vector<Point>;
и функцию теперь можно вот так объявить
Points get_all_points() {
return this->points;
}
и вот так использовать
RSGrid::Points v = grid.get_all_points();
P.S. В приведенном коде возвращается копия внутреннего вектора. Возможно так и нужно. А может есть смысл возвратить его по ссылке. Но это уже Вам виднее.