Witam mam problem i nie wiem jak zrobić by moja metoda read() mogła przyjmować różne struktury
std::variant
, przeciążanie lub polimorfizm. Do wyboru do koloru.
Albo szablony.
no właśnie chciałbym użyć szablonów ale nigdy ich nie stosowałem
Pokaż, kod w jakim ta metoda ma byc kontekście i pomyślimy.
#include "FileCSV.h"
FileCSV::FileCSV() {};
FileCSV::~FileCSV() {};
bool FileCSV::open(string pathToFile) {
setPathToFile(pathToFile);
file.open(getPathToFile(), ios::in | ios::out);
if (!file.is_open()) {
cout << "Error: Can't open the file or File doesn't exist" << endl;
return false;
}
return true;
}
void FileCSV::read() {
}
W metodzie read chce przyjmować jako parametr struktury np. z klasy login , transakcje...
Te struktury sa w innych klasach
Wygląda na materiał na polimorfizm - ale zapodaj te klasy login, transakcje itd.
87kelthuzad napisał(a):
W metodzie read chce przyjmować jako parametr struktury np. z klasy login , transakcje...
Te struktury sa w innych klasach
A nie lepiej, żeby te klasy miały funkcje typu toString
/fromString
. Wtedy FileCSV
nie ma silnej zależności, zajmuje się wyłącznie tym czym powinien i nie wtrąca się w implementacje innych klas.
#ifndef HOMEBUDGET_LOGIN_H
#define HOMEBUDGET_LOGIN_H
#include <iostream>
#include <string>
using namespace std;
struct recordLogin {
string nickCSV;
string passwordCSV;
};
class Login {
private:
recordLogin sRecordLogin;
string nick;
string password;
void comparisonOfLoginWithCVS();
public:
Login();
~Login();
Login(string nick, string password);
void setNick(string nick) { this->nick = nick; }
void setPassword(string password) { this->password = password; }
void test();
};
#endif //HOMEBUDGET_LOGIN_H
Ok, to stwórz sobie klasę czysto wirtualną, z której wszelkie struktury będą dziedziczyły:
class Readable
{
void fromRawData(const char *data) = 0;//to się przyda jakbyś zapisywał do plików binarnie
void fromCSVString(const std::string &csvString) = 0;//a to przy zapisie tekstowym CSV
};
i każda z tych klas-struktur miałaby już sensowną implementację dla tych funkcji. Potem klasie FileCSV robisz jakoś tak:
void FileCSV::read(Readable &readable)
{
readable.fromCSVFile(file.readAll());//kod podglądowy, nie wiem jakiego typu jest file
}