Open alexey-malov opened 6 years ago
CreateShape createShape(std::cin);
while (auto shape = createShape.ExecuteCommand())
[x] Имя класса должно выражаться существительным (как правило)
[x] Файлы исходного кода переименовать
[x] От ShapeCreator-а ожидаешь возможность CreateShape
std::shared_ptr<IShape> ShapeCreator::CreateRectangle(std::istream& args) const
{
CPoint leftTop, rigthBottom;
std::string outlineColor, fillColor, inputValue;
try
{
args >> inputValue;
leftTop.x = std::stod(inputValue);
args >> inputValue;
leftTop.y = std::stod(inputValue);
inputValue.clear();
args >> inputValue;
rigthBottom.x = std::stod(inputValue);
args >> inputValue;
rigthBottom.y = std::stod(inputValue);
args >> outlineColor;
args >> fillColor;
}
catch (const std::exception& e)
{
std::cout << e.what() << std::endl;
return nullptr;
}
return std::make_shared<CRectangle>(leftTop, rigthBottom, outlineColor, fillColor);
}
ShapeCreator inputShape(std::cin);
while (auto shape = inputShape.ExecuteCommand())
{
shapes.push_back(shape);
}
[x] В ccircle.cpp не хватает подключения stdafx.h
[x] stdafx.h должен подключаться только в .cpp файлах
class ISolidShape : public CShape
{
public:
virtual ~ISolidShape(){};
virtual std::string GetFillColor() const = 0;
private:
virtual void AppendProperties(std::ostream& strm) const = 0;
};
double m_density;
std::string m_type;
[x] AppendProperties в дочерних классах сделать приватным, он не предназанчен для вызова извне
[x] В CShape также он должен оставаться приватным
class CRectangle final : public CSolidShape
{
private:
CPoint m_leftTop;
CPoint m_rightBottom;
double m_width;
double m_height;
};
1>c:\teaching\ips\2018\oop\dorohov\oop\lab4\lab4\csolidshape.h(15): warning C4250: 'CSolidShape': inherits 'CShape::CShape::GetOutlineColor' via dominance
1>c:\teaching\ips\2018\oop\dorohov\oop\lab4\lab4\cshape.h(9): note: see declaration of 'CShape::GetOutlineColor'
1>c:\teaching\ips\2018\oop\dorohov\oop\lab4\lab4\csolidshape.h(15): warning C4250: 'CSolidShape': inherits 'CShape::CShape::ToString' via dominance
1>c:\teaching\ips\2018\oop\dorohov\oop\lab4\lab4\cshape.h(10): note: see declaration of 'CShape::ToString'
1>c:\teaching\ips\2018\oop\dorohov\oop\lab4\lab4\ccircle.h(21): warning C4250: 'CCircle': inherits 'CShape::CShape::GetOutlineColor' via dominance
1>c:\teaching\ips\2018\oop\dorohov\oop\lab4\lab4\cshape.h(9): note: see declaration of 'CShape::GetOutlineColor'
1>c:\teaching\ips\2018\oop\dorohov\oop\lab4\lab4\ccircle.h(21): warning C4250: 'CCircle': inherits 'CShape::CShape::ToString' via dominance
1>c:\teaching\ips\2018\oop\dorohov\oop\lab4\lab4\cshape.h(10): note: see declaration of 'CShape::ToString'
class CShape : public virtual IShape
{
public:
std::string GetOutlineColor() const override;
std::string ToString() const override;
void SetOutlineColor(std::string const& outlideColor);
virtual void AppendProperties(std::ostream& strm) const = 0;
private:
std::string m_color;
std::string m_outlineColor;
};
class CRectangle final : public CSolidShape
{
...
std::string m_outlineColor;
std::string m_fillColor;
};
auto max = std::max_element(
arr.begin(), arr.end(),
[](std::shared_ptr<IShape> a, std::shared_ptr<IShape> b) {
return a->GetArea() < b->GetArea();
});
auto&&
) ссылке
[x] Не нужно терять интерфейс IShape. В интерфейсе не должно быть данных и методов, имеющих реализацию. Для устранения дублирования кода можно ввести промежуточный абстрактный класс CShape, где реализовать поддержку цвета обводки и, возможно, каркас метода ToString. Если подобное будет сделано и для CSolidShape, то для устранения проблем ромбовидного наследования, которое может появиться, использовать виртуальное наследование. См. пример из лекции
[x] Данных в интерфейсе также не должно быть