Задача следующая: Реализовать 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 среди полей класса, так как он используется исключительно как локальная переменная.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости