c ++ как объявить функцию, возвращающую вектор объектов

0

и я борюсь с функцией, которая должна возвращать вектор объектов, но по какой-то причине она постоянно вызывает ошибки, заявляя, что мой объект является незаявленным идентификатором, а вектор этих объектов недействителен и указывает мне на файл.h, где я объявляю функцию. Я объясню, что это значит и как это исправить. ниже я размещаю код из своего класса и стартовых файлов.

#ifndef SETUPW_H
#define SETUPW_H
#include"Square.h"
#include <iostream>
#include<string>
#include<fstream>
#include<vector>

std::vector<std::ifstream> allText();
std::ifstream loadTxt(std::string txt);
void printByLine(std::ifstream& txt);
std::vector<square> allSquares();//compiler points me to this line and that one bellow
void whichSQ(int sqNum, std::vector<square> sq);

#endif

и мой класс:

#ifndef SQUARE_H
#define SQUARE_H
#include"player.h"
#include"setupW.h"
#include<iostream>
#include<string>
#include<fstream>

class square
{
public:
     square(std::string name, int sqNumber, std::string description, int exits, int object);
    void loadSQ(std::ifstream& inFile);
    void printSQ();

private:
    int mSqNumber;
    std::string mName;
    std::string mDescription;
    int mExits;
    int mObject;
};

#endif
  • 0
    std::vector требует, чтобы класс был копируемым. Просто определите конструктор копирования.
  • 1
    Ваш заголовок охранников не прав в первом фрагменте. И square.h не должен включать setupW.h если это первый фрагмент.
Показать ещё 12 комментариев
Теги:
object
vector

1 ответ

1
Лучший ответ

Проблема возникает из-за того, что здесь есть круговая зависимость. В square.cpp вы сначала включаете square.h. Но square.h содержит эту строку #include"setupW.h" (перед объявлением класса). Таким образом, объявления ваших функций появятся перед объявлением вашего square класса. Это заставляет компилятор пробормотать, что square не объявлен (в то время), когда он читает std::vector<square>.

Самым простым решением было бы просто удалить include, потому что это, насколько я могу судить, неслучайно.

  • 0
    Вот и все, спасибо большое. Я был совершенно уверен, что мне нужно включить все мои файлы .h во все остальные, если вы понимаете, о чем я. Я не понимал, что это может вызвать проблемы. Еще раз спасибо.
  • 0
    @SzarleyDwarf Хорошим подходом является сведение к минимуму включений, включающих в заголовочный файл только те файлы, которые вам действительно нужны. Например, если вы хотите объявить член std::string в вашем заголовочном файле, вы должны будете включить его туда, но если вам нужен только std::string в вашей реализации, включите его в файл .cpp, а не в свой заголовок. файл
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню