Создание метода класса

125
09 сентября 2019, 14:50

Имеется класс, полем которого является структура, а один из методов это работа с этой структурой. При инициализации метода ругается на неправильное объявление, не могу понять как исправить. Что нужно написать, чтобы заработал? Спасибо (метод без параметров, выдает указатель на вектор типа структура)

Заголовок класса:

#pragma once
#include <vector>
#include <string>
class polygone
{
private:
typedef struct pointXY
{
    double x;
    double y;
}pole;
public:
polygone();
~polygone();
polygone unn(polygone *pol1, polygone *pol2);
const std::vector<pole*>& polygone::poly() const;
};

Реализация метода:

#include "stdafx.h"
#include "polygone.h"
#include <vector>
#include <string>
#include <fstream>
#include <iostream>
using namespace std;
extern struct pole;
polygone::polygone() {
poly();
}

polygone::~polygone()
{
}
polygone polygone::unn(polygone * pol1, polygone * pol2)
{
return polygone();
}
const std::vector<pole*>& polygone::poly() const{
ifstream file("poly.txt");
vector<string> vals;
vector<pole*> pgn;
pole *polyget = new pole;
if (file.is_open()) {
    string s;
    int counter1 = 0;
    while (getline(file, s, ';'))
    {
        vals.push_back(s);
    }
    file.close();
    for (int i = 1; i < vals.size(); i += 2) {
        polyget->x = atof(vals[i - 1].c_str());
        pgn.push_back(polyget);
        polyget->y = atof(vals[i].c_str());
        pgn.push_back(polyget);
    }
}
else {
    //cout << "Open error!";
}
return pgn;
}

Ругается вот на эти места, что на картинке:

Answer 1

Достаточно такого объявления внутренней структуры:

class polygone
{
private:
    struct pole
    {
        double x;
        double y;
    };
public:
    polygone();
...

Внутри класса в объявлении не нужно указывать сам класс:

const std::vector<pole*>& poly() const;

Зато вне класса нужно полностью указать имя внутренней структуры:

const std::vector<polygone::pole*>& polygone::poly() const

Объявление не пойми чего

extern struct pole;

не нужно.

И еще - вот тут

const std::vector<polygone::pole*>& polygone::poly() const

вы возвращаете ссылку на локальный объект. Что очень плохо... Вот так лучше:

std::vector<polygone::pole*> polygone::poly() const

Да, и еще - стоит ли делать тип pole закрытым (private), если вы планируете с ним работать вне класса? Например, вы не сможете написать

polygone p;
vector<polygone::pole*> s = p.poly();

Правда, все равно сможете написать

polygone p;
auto s = p.poly();

Но какой смысл скрывать то, что хотите видеть вне класса?

READ ALSO
Проблемы с коррекцией движения объекта

Проблемы с коррекцией движения объекта

Хочу сделать что-то типа джойстика на андроидеЕсть квадратный тип и круглый тип

96
JavaFX 11 + Eclipse

JavaFX 11 + Eclipse

Ранее я использовал Java 8 , где была включена JavaFXХочу настроить работу JavaFX 11 используя Eclipse

136
Angular 6 + Spring Boot. Некорректная загрузка приложения

Angular 6 + Spring Boot. Некорректная загрузка приложения

Всем доброго времени сутокПодскажите пожалуйста, почему у меня могла возникнуть следующая проблема: После того, как было собрано и запущено...

124
Как прокликать все элементы списка?

Как прокликать все элементы списка?

Нужно прокликать все ссылки в менюНа странице это выглядит так:

134