@Acaunt

Как использовать класс объявленный в другом файле?

Создал для программы класс задача которого писать в консоль и в файл информацию, которую принимает через оператор <<
сам класс
#include <iostream>
#include <fstream>

class Logger {
public:
    Logger() {
        file.open("Logger.txt");
        if (!file.is_open()) {
            throw std::runtime_error("Fail open file \"Logger.txt\"");
        }
    }
    ~Logger() {
        file.close();
    }
    template <class T>
    Logger& operator<<(const T& value) {
        file << value;
        std::cout << value;
        return *this;
    }
    Logger& operator<<(std::ostream& (*manipulator)(std::ostream&)) {
    file << manipulator;
    std::cout << manipulator;
    return *this;
  }
private:
    std::ofstream file;
};

extern Logger logg


Любой участок программы
logg << 6 << " is six" << std::endl;


По идее это должен быть, как std::cout, но у меня возникает ошибка не разрешённый внешний символ методом проб я понял что ошибка возникает при попытке передачи информации через оператор, но если я объявлю этот класс там где он необходим то ошибок нет.

Решение:
MyClass.h
class MyClass {
    //Описание класса
}

extern MyClass myclass


MyClass.cpp
#include "MyClass.h"
MyClass myclass

Спасибо всем кто подсказал.
  • Вопрос задан
  • 266 просмотров
Решения вопроса 1
maaGames
@maaGames
Погроммирую программы
Сразу скажу, что это плохой код и делать так не надо.
Однако, отвечая на вопрос: весь этот код написан в .h файле. Нужно сделать .cpp файл, в котором будет сздана переменная logg. Сейчас объявлено, что переменная есть, но самого объекта нет.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
xzripper
@xzripper
0xC0000005
Измените extern Logger logg на Logger logg;

Еще немного улучшил код:
#include <iostream>
#include <fstream>

class Logger {
public:
    Logger() {
        openFile("Logger.txt");
    }

    ~Logger() {
        closeFile();
    }

    template<class T>
    Logger& operator<<(const T& value) {
        file << value;

        std::cout << value;

        return *this;
    }

    Logger& operator<<(std::ostream& (*manipulator) (std::ostream&)) {
        file << manipulator;
    
        std::cout << manipulator;

        return *this;
    }

    void openFile(const char *path) {
        file.open(path);

        if(!file.is_open()) {
            throw std::runtime_error("Failed to open 'Logger.txt'");
        }
    }

    void closeFile() {
        file.close();
    }

private:
    std::ofstream file;
};

Logger logger;


logger << 6 << " is six" << std::endl;

64e1e14d1a6e4270143548.png
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы