Задача следующая: Реализовать c++ объект, который предоставил бы возможность менять тип данных во время исполнения. Хранение значения типа данных должно храниться с использованием xml.Тут должны поддерживаться операции преобразования типов между "однотипными" данными; Операции между типами данных, которые не согласуются между собой должны вызывать исключения. Т.е. например: ten+P= 13; twenty+str исключение
header.h
#include <iostream>
#include <fstream>
#include <string>
#include <typeinfo>
#include <stdarg.h>
#include <vector>
using namespace std;
ofstream xml;
class Object {
public:
ifstream fin;
string path = "xml.txt";
template <typename T>
Object(T);
Object();
~Object();
template <typename T, typename T1, typename T2>
Object(T, T1, T2);
template < typename T >
Object operator + (T);
private:
int num;
int& Count();
template <typename T>
void value(T);
void open();
void close();
string type;
};
void Object::open(){
char buff[3];
num = ++Count();
_itoa_s(num, buff, 10);
xml << "<" << buff << ">\n";
}
void Object::close() {
char buff[3];
_itoa_s(num, buff, 10);
xml << "</" << buff << ">\n\n\n\n";
}
template <typename T>
void Object::value(T buff) {
type = typeid(buff).name();
if (type == "char const *") {type = "string";};
xml << "<" << type << ">\n";
xml << "<value>\n";
xml << buff << "\n";
xml << "</value>\n";
xml << "</" << type << ">\n";
}
Object::Object() {
open();
close();
}
template <typename T>
Object::Object(T buff) {
fin.open(path);
open();
value(buff);
close();
fin.close();
};
template <typename T, typename T1, typename T2>
Object :: Object(T buff1, T1 buff2, T2 buff3){
fin.open(path);
open();
value(buff1);
xml << "\n";
value(buff2);
xml << "\n";
value(buff3);
xml << "\n";
close();
fin.close();
}
int& Object::Count() {
static int c = 0;
return c;
}
Object :: ~Object() {
--Count();
xml.close();
}
template <typename T>
Object operator+(T &sum)
{
try {
if (typeid(value).name != typeid(sum.value))
throw 666;
}
return T(this->value + sum.value);
catch (int i){
cout << "Error" << endl;
}
}
main.cpp
#include "header.h"
#pragma once
int main() {
ifstream fin;
xml.open("xml.txt");
Object arr(120, 23.5, "Word");
Object arr1(1, 2, 3);
Object arr2(15.5, 25.2, 22.3);
Object ten = 10;
Object twenty = 20;
Object P = 3.14;
Object str = "Course";
Object str1 = "Program";
Object boolean = false;
Object boo = true;
Object st("Hello!", "World", "WoW!");
Object sum;
sum = ten + P;
return 0;
}
У меня выдает ошибку:
Ошибка 1 error C2280: "std::basic_ifstream>::basic_ifstream(const std::basic_ifstream> &)": предпринята попытка ссылки на удаленную функцию c:\users\user\documents\visual studio 2013\projects\course\course\main.cpp 25 1 course В месте
sum = ten + P;
Помогите разобраться, как её исправить, что бы все работало?
sum = ten + P;
выполняет вызов неявно сгенерированного копирующего оператора присваивания, который будет копировать все поля класса, включая fin
, однако объекты ifstream
являются некопируемыми. Однако они могут быть перемещены. Соответственно для своего класса следует реализовать перемещающий оператор присваивания (и перемещающий конструктор за одно). Однако в данном случае на самом деле нет никакого смысла держать fin
среди полей класса, так как он используется исключительно как локальная переменная.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Есть публичное поле класса — gamer, которое служит флагом смены хода
Возможно ли записать два и/или более std::stringstream в один?