При попытке использовать статический член ifstream и сопутствующую функцию я получаю ошибку компоновщика - PullRequest
1 голос
/ 18 декабря 2011

Если предположить, что если в файле .o обнаружена ошибка, то это проблема компоновщика ...

В любом случае, я пишу программу для организации курсов, которые я хочу пройти в колледже, путем вывода их в красиво отформатированный HTML-файл. Чтобы сделать это, я собираюсь выбросить кучу объектов моего класса Course в список (структуру данных, которую я выбрал, если кто-то не предупредит иначе), упорядочить их по коду курса и вывести их в вышеупомянутый HTML-файл, поместив разрывы горизонтальной линии между каждым основным / второстепенным / и т. д. В верхней части каждого сегмента с пунктирной линией будет название майора, читаемого как;

AMS (Прикладная математика и статистика)

Всякий раз, когда пользователь вводит код курса (только три буквы, а не число), я хочу, чтобы класс проверял, есть ли код в .txt, который я предоставляю программе. Потому что, если в конце концов я собираюсь получить десятки Courses, зачем добавлять в мой код fstream или функцию-член для каждого объекта? Поэтому я подумал, что использование магии static может быть хорошей идеей. Затем я получаю это сообщение об ошибке, используя g ++;

(К сожалению, это выглядит грязно, кстати, я не уверен, как это аккуратно отформатировать здесь.)

В функции `std :: basic_ifstream> :: open (char const *, std :: _ Ios_Openmode) ':

/ USR / включать / C ++ / 4,5 / fstream | 528 | неопределенная ссылка на Course::courses' /usr/include/c++/4.5/fstream|533|undefined reference to курс :: курсы ' /usr/include/c++/4.5/fstream|533| неопределенная ссылка на Course::courses' obj/Debug/main.o In function std :: basic_filebuf> :: is_open () const ':

/ usr / include / c ++ / 4.5 / fstream | 223 | неопределенная ссылка на Course::courses' obj/Debug/main.oIn function std :: basic_ifstream> :: close () ': /usr/include/c++/4.5/fstream|566| неопределенная ссылка на Course::courses' obj/Debug/main.o:/usr/include/c++/4.5/fstream|529|more undefined references to курс :: следование курсов

Затем я направляюсь в этот сегмент заголовка fstream;

void open(const char* __s, ios_base::openmode __mode = ios_base::in)
  {
if (!_M_filebuf.open(__s, __mode | ios_base::in))
  this->setstate(ios_base::failbit);
else
  // _GLIBCXX_RESOLVE_LIB_DEFECTS
  // 409. Closing an fstream should clear error state
  this->clear();
  }

Два статических члена, которые у меня есть (открыть и закрыть поток, в начале и конце всего процесса сбора для курсов), а также сам член объявлены так:

class Course
{
    public:
        Course();
        void setup();
        bool confirm();
        stringstream entry;
        static void openCodeList() { courses.open("codes"); if (!courses.is_open()) exit(1); }
        static void closeCodeList() { courses.close(); }
    private:
        //Irrelevant strings and bits, etc, etc.
        static ifstream courses;
}

У меня есть другие файлы .cpp и .h (а именно класс File, который обрабатывает фактически вывод всего в конце), но я даже не упомянул эти связанные с fstream члены ни в одном из них, кроме моего, очевидно, основного WIP. каст;

int main()
{
    cout << "Welcome to the Stony Brook Course Organizer!  This program will help you\n"
            "organize the courses that you wish to take at Stony Brook University.\n\n";
    Course thefirst;
    Course::openCodeList();
    thefirst.setup();
    thefirst.confirm();
    Course::closeCodeList();
}

Любая помощь в решении моих static вопросов и советы на будущее (даже если это не имеет прямого отношения к этому) будет принята с благодарностью. Спасибо!

1 Ответ

1 голос
/ 18 декабря 2011

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

например. в .cpp:

std::ifstream Course::courses;
...