Я продолжаю получать ошибку компилятора в 6 точках в моем коде, который утверждает, что «ссылка на нестатическую функцию-член должна быть вызвана» в моем файле Executive.cpp, я не могу понять, в чем проблема, но яполагаю, что это может быть какая-то синтаксическая ошибка либо в моем классе Executive, либо в моем классе ShapeContainer.Класс ShapeContainer просто содержит массив различных фигур из Shape Interface, который включает в себя круги, треугольники и прямоугольники.Все считывается из файла, и цель состоит в том, чтобы сохранить фигуры из файла в классе ShapeContainer, а затем распечатать определенные области, о которых говорится в файле.
Часть моего класса Executive и места, где ошибки:
//Executive.h
//...
class Executive
{
private:
int m_size;
int check;
ShapeContainer Shapes(int size);
ifstream inFile;
string FileName;
public:
Executive(string FileName);
void run();
};
//...
//Executive.cpp
//...
inFile.open(FileName);
int number;
inFile >> number;
while(check != 1)
{
string command = "";
int index = 0;
string shape = "";
double value1 = 0;
double value2 = 0;
inFile >> command >> index >> shape >> value1 >> value2;
if(command == "ADD")
{
if(shape == "CIRC")
{
Circle myCirc(value1);
try
{
Shapes.add(myCirc, index);//ERROR 1
}
catch(std::runtime_error& rte)
{
cout << rte.what() << "\n";
}
}
else if(shape == "TRI")
{
Triangle myTri(value1, value2);
try
{
Shapes.add(myTri(value1, value2), index);//ERROR 2
}
catch(std::runtime_error& rte)
{
cout << rte.what() << "\n";
}
}
else if(shape == "REC")
{
Rectangle myRect(value1, value2);
try
{
Shapes.add(myRect(value1, value2), index);//ERROR 3
}
catch(std::runtime_error& rte)
{
cout << rte.what() << "\n";
}
}
}
else if(command == "DELETE")
{
try
{
Shapes.remove(index);//ERROR 4
}
catch(std::runtime_error& rte)
{
cout << rte.what() << "\n";
}
}
else if(command == "PRINT")
{
cout << "Shape at index " << index << ": ";
try
{
cout << Shapes.shapeName(index) << " area = ";//ERROR 5
}
catch(std::runtime_error& rte)
{
cout << rte.what() << "\n";
}
try
{
cout << Shapes.area(index);//ERROR 6
}
catch(std::runtime_error& rte)
{
cout << rte.what() << "\n";
}
}
else if(command == "EXIT")
{
cout << "Exiting...\n";
check = 1;
}
}
inFile.close();
//...
Вот мой заголовочный файл ShapeContainer:
//ShapeContainer.h
#ifndef SHAPECONTAINER_H
#define SHAPECONTAINER_H
#include "Shape.h"
#include <stdexcept>
class ShapeContainer
{
public:
ShapeContainer(int size); //initialize pointers in m_arrayOfShapes to nullptr
~ShapeContainer();
double area(int index) const; //throws a std::runtime_error if index is invalid, meaning out of range OR index has nullptr
std::string shapeName(int index) const; //throws a std::runtime_error if index is invalid, meaning out of range OR index has nullptr
void add(Shape* shapePtr, int index); //throws a std::runtime_error if index is invalid OR if shapePtr is nullptr
void remove(int index); //throws a std::runtime_error if the index is invalid OR there is no object to delete
private:
Shape** m_arrayOfShapes;
int m_size;
};
#endif
А вот мой интерфейс Shape с примером одной из моих фигур:
//Shape.h
#ifndef SHAPE_H
#define SHAPE_H
#include <string>
class Shape
{
public:
virtual double area() const = 0;
virtual std::string shapeName() const = 0;
virtual ~Shape() {}
};
#endif
//Circle.h
#ifndef CIRCLE_H
#define CIRCLE_H
#include "Shape.h"
class Circle:public Shape
{
public:
Circle(double radius);
double area()const;
std::string shapeName()const;
private:
double m_radius;
};
#endif
//Circle.cpp
#include "Circle.h"
Circle::Circle(double radius)
{
m_radius = radius;
}
double Circle::area()const
{
return((m_radius * m_radius) * 3.14);
}
std::string Circle::shapeName()const
{
return("Circle");
}
Вот входной файл и мой обнадеживающий вывод:
//file.txt
5
ADD 0 CIR 5.5
ADD 1 TRI 2.5 6.6
PRINT 0
ADD 2 REC 10.5 20.25
PRINT 99
PRINT 2
EXIT
//output
Shape at index 0: Circle area = 95.0331
Shape at index 99: Does not exist
Shape at index 2: Rectangle area = 212.625
Exiting...