Применение паттернов проетирования в базу данных C++
Здраствуйте, я делаю базу данных в консольном приложении на С++. У меня есть файлы с данными, которые нужно отфильтровать. Основным условием есть использование паттернов проектирования в моем проекте. Проект я делаю с использованием хедеров, где создаю классы и методы классов, а в .cpp файлах я их описываю. В чем же ПРОБЛЕМА. Компилятор выдает 2 какие-то ошыбки, что не может найти определения для функций DataSportsReading и DataSave, указанных в вашем основном файле, хотя вроде методы описаны неплохо. Помогите разобратся) Код файлов .cpp и .h Main файл Kursova.cpp
#include "SportsmenFunctions.h"
using namespace std;
int SelectUser() {
int userType;
cout << "Выберите тип пользователя:" << endl
<< "1. Пользователь" << endl
<< "2. Администратор" << endl
<<"Ваш выбор:";
cin >> userType;
return userType;
}
int state_Menu;
void Menu(int userType) {
cout << "Выберите действие:" << endl
<< "1. Список спортивных клубов города" << endl
<< "2. Список спортсменов определенного клуба, занимающихся указанным видом спорта" << endl
<< "0. Выход из программы" << endl
<<"Ваш выбор:";
cin >> state_Menu;
}
int main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int userType = SelectUser();
system("cls");
Menu(userType);
int _sizet = 0;
ISportsmen_Data** arrSportsmen = new ISportsmen_Data* [_sizet];
DataSportsReading(arrSportsmen, _sizet, "Sportsmen1.txt");
while (state_Menu != 0)
{
switch (state_Menu)
{
case 1:
system("cls");
showOnlySportClubs();
cout << endl;
system("pause");
system("cls");
Menu(userType);
break;
case 2:
system("cls");
if (_sizet! = 0) {
findSportsByClub(*arrSportsmen, _sizet);
}
else {
cout << "Файл пуст!" << endl;
}
system("pause");
system("cls");
Menu(userType);
break;
default:
cout << "Пункт введен не верно" << endl;
system("pause");
system("cls");
Menu(userType);
break;
}
}
system("cls");
cout << "Работа окончена!" << endl;
return 0;
}
Файл Sportsmen.h, здесь я реализовал паттерн проектирования Фабрика
#include <iostream>
#include <string>
#include <fstream>
#include <Windows.h>
using namespace std;
struct Sportsmen {
string sport_init, sport_sportclub, sport_vydsportu, sport_coach, sport_boolcomp;
int sport_rozryad, sport_pryzovi;
};
class ISportsmen_Data {
public:
virtual ~ISportsmen_Data() {}
virtual void PrintSports() = 0; // print sportsmen data
virtual void DataEntry(Sportsmen sport_data_) = 0; // overloaded function for data entering
virtual Sportsmen GetSportsmenData() = 0; // getter sportsmen data from class
virtual ISportsmen_Data& operator = (ISportsmen_Data& d_o) = 0; // overloading of operator "="
};
class Sportsmen_Data : public ISportsmen_Data {
protected:
Sportsmen sport_data;
public:
Sportsmen_Data(); //constructor without argument
Sportsmen_Data(Sportsmen sport_data_); // constructor with argument
~Sportsmen_Data();// destructor
void PrintSports();// print sportsmen data
void DataEntry(Sportsmen sport_data_);// overloaded function for data entering
//getter sportsmen data from class
Sportsmen GetSportsmenData() { return sport_data; }
//overloading of operator "="
ISportsmen_Data& operator=(ISportsmen_Data& d_o); // overloading of operator "="
};
Sportmen.cpp
#include "Sportsmen.h"
Sportsmen_Data::Sportsmen_Data() {
sport_data.sport_init = "";
sport_data.sport_sportclub = "";
sport_data.sport_vydsportu = "";
sport_data.sport_coach = "";
sport_data.sport_rozryad = 0;
sport_data.sport_boolcomp = "";
sport_data.sport_pryzovi = 0;
}
Sportsmen_Data::Sportsmen_Data(Sportsmen sport_data_) {
sport_data.sport_init = sport_data_.sport_init;
sport_data.sport_sportclub = sport_data_.sport_sportclub;
sport_data.sport_vydsportu = sport_data_.sport_vydsportu;
sport_data.sport_coach = sport_data_.sport_coach;
sport_data.sport_rozryad = sport_data_.sport_rozryad;
sport_data.sport_boolcomp = sport_data_.sport_boolcomp;
sport_data.sport_pryzovi = sport_data_.sport_pryzovi;
}
Sportsmen_Data::~Sportsmen_Data() {
}
void Sportsmen_Data::PrintSports() {
cout << "Фамилия и имя: " << sport_data.sport_init << endl;
cout << "Спортивный клуб: " << sport_data.sport_sportclub << endl;
cout << "Вид спорта:" << sport_data.sport_vydsportu << endl;
cout << "Тренер: " << sport_data.sport_coach << endl;
cout << "Разряд:" << sport_data.sport_rozryad << endl;
cout << "Участвовал в соревнованиях: " << sport_data.sport_boolcomp << endl;
cout << "Количество занятых призовых мест:" << sport_data.sport_pryzovi << endl;
}
void Sportsmen_Data::DataEntry(Sportsmen sport_data_) {
sport_data.sport_init = sport_data_.sport_init;
sport_data.sport_sportclub = sport_data_.sport_sportclub;
sport_data.sport_vydsportu = sport_data_.sport_vydsportu;
sport_data.sport_coach = sport_data_.sport_coach;
sport_data.sport_rozryad = sport_data_.sport_rozryad;
sport_data.sport_boolcomp = sport_data_.sport_boolcomp;
sport_data.sport_pryzovi = sport_data_.sport_pryzovi;
}
ISportsmen_Data& Sportsmen_Data::operator=(ISportsmen_Data& d_o) {
Sportsmen_Data* sportsmenData_o = dynamic_cast<Sportsmen_Data*>(&d_o);
if (sportsmenData_o != nullptr) {
sport_data = sportsmenData_o->GetSportsmenData();
}
return *this;
}
SportsmenFunctions.h
#include "Sportsmen.h"
// Prototypes of functions
void DataEntry(ISportsmen_Data** arrSportsmen, int& mass);
void DataSportsReading(ISportsmen_Data** arrSportsmen, int& mass, const string& fileName);
void showSports(ISportsmen_Data* arrSportsmen, int mass);
void Copy(ISportsmen_Data* arrSportsmen_n, ISportsmen_Data* arrSportsmen_o, int mass);
void addSportsmen(ISportsmen_Data** arrSportsmen, int& mass);
void findSportsByClub(ISportsmen_Data* arrSportsmen, int mass);
void DataSave(ISportsmen_Data* arrSportsmen, int mass, const string& fileName);
SportsmenFunctions.cpp(реализация методов созданных в .h файле)
#include "SportsmenFunctions.h"
#include <sstream>
//description of functions
void DataEntry(ISportsmen_Data** arrSportsmen, int& mass) {
Sportsmen sportsmen;
cout << "Введите размер массива:";
cin >> mass;
*arrSportsmen = new Sportsmen_Data[mass];
for (int i = 0; i < mass; i++) {
char e; cin.get(e);
cout << "Введите фамилию и имя:";
getline(cin, sportsmen.sport_init, '\n');
cout << "Введите название спортклуба:";
getline(cin, sportsmen.sport_sportclub, '\n');
cout << "Введите вид спорта:";
cin >> sportsmen.sport_vydsportu;
cout << "Введите имя и фамилию тренера:";
getline(cin, sportsmen.sport_coach, '\n');
cout << "Введите спортивный разряд:";
cin >> sportsmen.sport_rozryad;
cin.ignore(1, '\n');
cout << "Участвовал в соревнованиях:";
getline(cin, sportsmen.sport_boolcomp, '\n');
cout << "Занятых скрытых мест:";
cin >> sportsmen.sport_pryzovi;
cin.ignore(1, '\n');
//add new data to element of array
(*arrSportsmen)[i].DataEntry(sportsmen);
cout << "_______________________\n";
}
}
void DataSportsReading(ISportsmen_Data** arrSportsmen, int& mass, const string& fileName) {
ifstream fin(fileName);
if (fin) {
Sportsmen sportsmen;
string line;
getline(fin, line);
stringstream ss(line);
ss >> mass;
*arrSportsmen = new Sportsmen_Data[mass];
for (int i = 0; i < mass; i++) {
getline(fin, sportsmen.sport_init);
getline(fin, sportsmen.sport_sportclub);
getline(fin, sportsmen.sport_vydsportu);
getline(fin, sportsmen.sport_coach);
fin >> sportsmen.sport_rozryad;
fin.ignore(1, '\n');
getline(fin, sportsmen.sport_boolcomp);
fin >> sportsmen.sport_pryzovi;
fin.ignore(1, '\n');
(*arrSportsmen)[i].DataEntry(sportsmen);
// Skip empty line between sportsmen
if (i < mass - 1) {
getline(fin, line);
}
}
}
else {
cout << "Problem with file opening!" << endl;
}
fin.close();
}
void showSports(ISportsmen_Data* arrSportsmen, int mass) {
for (int i = 0; i < mass; i++) {
cout << "Спортсмен #" << i+1 << endl;
arrSportsmen[i].PrintSports();
cout << "_______________________________________\n\n";
}
}
void Copy(ISportsmen_Data* arrSportsmen_n, ISportsmen_Data* arrSportsmen_o, int mass) {
for (int i = 0; i < mass; i++) {
arrSportsmen_n[i] = arrSportsmen_o[i];
}
}
void addSportsmen(ISportsmen_Data** arrSportsmen, int& mass) {
Sportsmen_Data* new_array = new Sportsmen_Data[mass + 1];
Copy(new_array, *arrSportsmen, mass);
Sportsmen sportsmen;
cout << "Введите фамилию и имя:";
getline(cin, sportsmen.sport_init, '\n');
cout << "Введите название спортклуба:";
getline(cin, sportsmen.sport_sportclub, '\n');
cout << "Введите вид спорта:";
cin >> sportsmen.sport_vydsportu;
cout << "Введите имя и фамилию тренера:";
getline(cin, sportsmen.sport_coach, '\n');
cout << "Введите спортивный разряд:";
cin >> sportsmen.sport_rozryad;
cin.ignore(1, '\n');
cout << "Участвовал в соревнованиях:";
getline(cin, sportsmen.sport_boolcomp, '\n');
cout << "Занятых скрытых мест:";
cin >> sportsmen.sport_pryzovi;
cin.ignore(1, '\n');
new_array[mass].DataEntry(sportsmen);
delete[] * arrSportsmen;
*arrSportsmen = new_array;
mass++;
}
void findSportsByClub(ISportsmen_Data* arrSportsmen, int mass) {
string club, sport;
cout << "Введите спортклуб: ";
cin >> club;
system("cls");
cout << "Введите вид спорта:";
cin >> sport;
system("cls");
for (int i = 0; i < mass; i++) {
if (arrSportsmen[i].GetSportsmenData().sport_sportclub == club && arrSportsmen[i].GetSportsmenData().sport_vydsportu == sport) {
cout << "Спортсмен #" << i+1 << endl;
arrSportsmen[i].PrintSports();
cout << "_______________________\n";
}
}
}
Код ошыбки
Серьезность Код Описание Проект Файл Строка Состояние подавления
Ошибка LNK2019 ссылка на неразрешенный внешний символ "void __cdecl DataSportsReading(class ISportsmen_Data * *,int &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?DataSportsReading@@YAXPEAPEAVISportsmen_Data@@AEAHAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) в функции main. Kursova robota D:\Курсова С++\KURSOVA\Kursova robota\Kursova robota.obj 1
Серьезность Код Описание Проект Файл Строка Состояние подавления
Ошибка LNK2019 ссылка на неразрешенный внешний символ "void __cdecl DataSave(class ISportsmen_Data *,int,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?DataSave@@YAXPEAVISportsmen_Data@@HAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) в функции main. Kursova robota D:\Курсова С++\KURSOVA\Kursova robota\Kursova robota.obj 1