0

Недавно начал программировать, написал программу по считыванию файла и по поиску подстроки с определенными условиями (контрольная работа), при сборке которой выскакивает ошибки типа: "LNK2019 ссылка на неразрешенный внешний элемент". Пытался разобраться в этом и исправить, но не могу ничего найти.

Файл главной функции:

 include <iostream>
# include <fstream>

# include "MyString.h"

void flush()
{
    while (std::cin.get() != '\n') continue;
}

int main()
{
    setlocale(LC_ALL, "rus");
    system("chcp 1251");
    while (true)
    {
        std::cout << "\n                    МЕНЮ : \n"
            << "\n     Построчное считывание файла-----------------1"
            << "\n     Поиск подстроки-----------------------------2"
            << "\n     Удаление подстроки -------------------------3"
            << "\n     Демонстрация остальных методов--------------4"
            << "\n     Выход--------------------------------- другое";

        std::cout << "\n\n Для выполнения операции введите нужную цифру\n";

        switch (std::cin.get())
        {
        case '1':
        {
            MyString str;
            std::ifstream in{ "text.txt" };
            for (std::size_t i = 0; in; i++)
            {
                in >> str;
                std::cout << i << str << '\n';
            }
            break;
        }
        case '2':
        {
            MyString str, substr;
            std::cout << "Строка:\n";
            flush();
            std::cin >> str;
            std::cout << "Подстрока для поиска:\n";
            std::cin >> substr;
            for (auto pos = str.substr(substr, 0); pos != -1; pos = str.substr(substr, pos + 1))
            {
                std::cout << "Найдена искомая подстрока, стартовая позиция = " << pos << '\n';
            }

            break;
        }
        case '3':
        {
            MyString str, substr;
            std::cout << "Строка:\n";
            flush();
            std::cin >> str;
            std::cout << "Подстрока для удаления:\n";
            std::cin >> substr;
            while (str.remove(substr));
            std::cout << "После удаления: " << str << '\n';
            break;
        }
        case '4':
        {
            MyString a("Hello "), b("world");
            std::cout << "Первая строка(a): " << a << '\n';
            std::cout << "Вторая строка(b): " << b << '\n';
            std::cout << "size(a) = " << a.size() << '\n';
            auto c = a + b;
            std::cout << "Сумма строк(a+b): " << a + b << '\n';
            std::cout << "Присоединение строки(a+=c): " << (a += c) << '\n';
            std::cout << "Третий символ строки a : " << a[2] << '\n';
            break;

        }
        default:
        {
            return 0;
        }
        }
        std::cout << "\nДля продолжения нажмите клавишу\n";
        std::cin.get();
    }
}

Заголовочный файл:

class MyString
{
public:
    MyString();
    MyString(const MyString& obj);
    MyString(MyString&& other);
    MyString(const char* str);

    MyString& operator = (const MyString& obj);
    MyString& operator+=(const MyString& obj);

    bool operator == (const MyString& obj) const;
    long long substr(MyString& obj, std::size_t start);
    bool remove(MyString& obj);

    friend std::ostream& operator<<(std::ostream& os, const MyString& obj);
    friend std::istream& operator>>(std::istream& is, MyString& obj);
    friend MyString operator+(MyString lhs, const MyString& rhs);

    char& operator[](std::size_t index);
    std::size_t size() const;
    const char* data() const;
    ~MyString(void);
private:
    void clear();
    void finalize();
    std::size_t m_size;
    char* m_data;
};

Файл реализации:

# include <iostream>
# include <fstream>
#include <algorithm>
#include <sstream>
#include <cstdlib>

#include "MyString.h"

MyString::MyString() :
    m_size(0),
    m_data(nullptr) {}

MyString::MyString(const MyString& obj) :
    m_size(obj.size()),
    m_data(m_size ? new char[m_size + 1]() : nullptr)
{
    std::copy(obj.data(), obj.data() + m_size, m_data);
    finalize();

}


MyString::MyString(MyString&& other)
    :
    m_size(std::exchange(other.m_size, 0)),
    m_data(std::exchange(other.m_data, nullptr))
{

}


MyString::MyString(const char* str) : MyString()
{
    std::istringstream t;
    t.str(str);
    t >> *this;
}


MyString& MyString::operator = (const MyString& obj) {
    if (this == &obj)
    {
        return *this;
    }
    delete[] m_data;
    m_size = obj.size();
    m_data = new char[m_size + 1];
    std::copy(obj.data(), obj.data() + m_size, m_data);
    return *this;
}


MyString& MyString::operator+=(const MyString& obj)
{
    if (obj.size() != 0)
    {
        char* newdata = new char[obj.size() + m_size + 1]();
        std::copy(m_data, m_data + m_size, newdata);
        delete[] m_data;
        std::copy(obj.data(), obj.data() + obj.size(), newdata + m_size);
        m_size += obj.size();
        m_data = newdata;
        finalize();
    }
    return *this;
}


bool MyString::operator == (const MyString& obj) const
{
    if (m_size != obj.size())
        return false;
    return std::equal(m_data, m_data + m_size, obj.data());
}

MyString operator+(MyString lhs, const MyString& rhs)
{
    lhs += rhs;
    return lhs;
}


long long MyString::substr(MyString& obj, std::size_t start)
{
    if (obj.size() == 0 || start >= m_size)
    {
        return -1;
    }
    for (std::size_t i = start; i < m_size; i++)
    {
        std::size_t j = 0, k = i;
        for (; j < obj.size() && k < m_size; j++, k++)
        {
            if (obj[j] != m_data[k])
            {
                break;
            }
        }
        if (j == obj.size())
        {
            return i;
        }
    }
    return -1;
}

bool MyString::remove(MyString& obj)
{
    auto i = substr(obj, 0);
    if (i != -1)
    {
        auto j = i + obj.size();
        for (std::size_t k = i, c = 0; k < j && j + c < m_size; k++, c++)
        {
            m_data[k] = m_data[j + c];
        }
        m_size = m_size - j + i;
        return true;
    }
    return false;
}

std::ostream& operator<<(std::ostream& os, const MyString& obj)
{
    os.write(obj.m_data, obj.m_size);
    return os;
}

std::istream& operator>>(std::istream& is, MyString& obj)
{
    obj.clear();
    char temp[1000];
    while (is)
    {
        is.get(temp, 1000);
        auto n = is.gcount();
        if (n != 999 && !is.eof())
        {
            is.get();
        }
        if (n == 0 && !is.eof())
        {
            is.clear();
            is.get();
        }
        if (n == 0)
        {
            obj.finalize();
            return is;
        }
        char* newdata = new char[obj.m_size + n + 1]();
        if (obj.m_size != 0)
        {
            std::copy(obj.m_data, obj.m_data + obj.m_size, newdata);
            delete[] obj.m_data;
        }
        std::copy(temp, temp + n, newdata + obj.m_size);
        obj.m_size += n;
        obj.m_data = newdata;
        if (n != 999)
        {
            obj.finalize();
            return is;
        }
    }
    obj.finalize();
    return is;
}

char& MyString::operator[](std::size_t index)
{
    if (index >= m_size)
    {
        throw std::out_of_range("index out of range ");
    }
    else
    {
        return m_data[index];
    }
}

std::size_t MyString::size() const
{
    return m_size;
}

const char* MyString::data() const
{
    return m_data;
}

MyString::~MyString(void)
{
    clear();
}

void MyString::clear()
{
    delete[] m_data;
    m_data = nullptr;
    m_size = 0;
}

void MyString::finalize()
{
    if (m_size != 0)
    {
        m_data[m_size] = '\0';
    }
}

Весь список ошибок

Прошу помочь найти ошибку, указать на неё и/или подсказать решение проблемы.

Harry
  • 221,325
  • 1
    судя по сообщениям, файл реализации не добавлен в проект – Pavel Gridin Sep 11 '19 at 18:43
  • Спасибо, помогло. Я пока что плохо разбираюсь в теме "работа с файлами" – Сергей Sep 11 '19 at 18:58

0 Answers0