Недавно начал программировать, написал программу по считыванию файла и по поиску подстроки с определенными условиями (контрольная работа), при сборке которой выскакивает ошибки типа: "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';
}
}
Прошу помочь найти ошибку, указать на неё и/или подсказать решение проблемы.
