Ошибка: ссылка на нестатическую функцию-член - PullRequest
0 голосов
/ 26 сентября 2019

Я продолжаю получать ошибку компилятора в 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...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...