Софтуерно Инженерство
Loading...
TsenoBorislavovTsenov avatar TsenoBorislavovTsenov 0 Точки

Task 2 - Aggregators

Здравейте!

Защо ми дава error attempting to reference a deleted function в този код(Става дума за 2ра задача от 8мо домашно) : 

 

#ifndef SUMAGGREGATOR_H
#define SUMAGGREGATOR_H

#include "Aggregator.h"
#include <sstream>

class SumAggregator : public StreamAggregator
{
public:
	SumAggregator(std::istream stream) : StreamAggregator(stream)
	{
		//....
	}
};

#endif // !AGGREGATOR_H

Това е base class:

#ifndef AGGREGATOR_H
#define AGGREGATOR_H

#include <istream>

class StreamAggregator {
private:
	std::istream& stream;
	int numAggregated;
protected:
	int aggregationResult;

	virtual void aggregate(int next) {
		this->numAggregated++;
	}
public:
	StreamAggregator(std::istream& stream) : stream(stream), numAggregated(0) {}

	int aggregate() {
		int next;
		while (this->stream >> next) {
			this->aggregate(next);
		}

		return this->getAggregationResult();
	}

	int getAggregationResult() const {
		return this->aggregationResult;
	}

	int getNumAggregated() const {
		return this->numAggregated;
	}

	virtual ~StreamAggregator() {}
};

#endif // !AGGREGATOR_H


 

Тагове:
0
C++ Advanced
j.petrov_90 avatar j.petrov_90 118 Точки
Best Answer

Привет,

В случая конструкторът ти:
SumAggregator(std::istream stream) : StreamAggregator(stream) {}
Счупва build-а.

Би трябвало да е:
SumAggregator(std::istream & stream) : StreamAggregator(stream) {}
и build-а е ОК.

Какво направих - ами предадох std::istream-а по референция.
Ти волно или неволно не си го направил.
А твоята версия не работи, защото copy constructor-а на std::ifstream е delete-нат по стандарт.
Това е така, защото обекта от тип std::istream спазва правилото на нулата.

За повече информация:
http://www.cplusplus.com/reference/istream/istream/istream/

По-здрави

0