在类

时间:2016-09-11 02:04:50

标签: c++

我是操作重载的新手。我做了一个实验室,我需要能够显示一个圆的面积和周长。用户输入半径和中心x,y点。我的问题是我迷失了如何正确执行乘法运算过载。有人可以帮助我吗?

这是main.cpp的一部分

cout << "====================================================" << endl;
   cout << "Radius is: " << circle1.setRadius << endl;
   cout << "Area is: " << circle1.setArea << endl;
   cout << "Circumference is: " << circle1.setCircumference << endl;

这是我的circleTypeImp.cpp

#include <iostream>
#include "circleType.h"
#include "pointType.h"

class CircleType;

const float PI = 3.14;

void CircleType::setRadius (float r)
{
   float radius const=r;
}

void CircleType::printCircle() const
{

}

void CircleType::setArea ()
{
   return PI * radius * radius;
}

void CircleType::setCircumference ()
{
   return 2 * PI * radius;
}

这是我的CircleType.h

#ifndef CIRCLETYPE_H
#define CIRCLETYPE_H
#include "pointType.h"
#include <iostream>

using namespace std;

class CircleType : public PointType
{
   public:
       void setRadius(float r);
       void printCircle() const;
CircleType& operator* (const CircleType& radius);
       void setArea();
       void setCircumference();
   private:  
       float radius const;
};
#endif

谢谢

1 个答案:

答案 0 :(得分:0)

根据您的澄清,以下是我可以提出的帮助您的建议。

我已经粘贴并编辑了您的代码,并在我更改了详细信息的原因时添加了注释。

一些要点:

  1. 在调用任何函数时,即使是那些没有参数的函数,您仍然需要()

  2. 返回值的函数不应返回void,而应返回返回值的类型。 (即以下情况中的float)。

  3. 当您想要设置成员变量时,习惯使用setVariableName或类似的东西,当您返回成员变量的值(或简单操作时)时,您可以使用{{1 }} 以免混淆功能应该做什么。

  4. 您应该避免在头文件(.h / .hpp文件)中使用getVariableName,以免强制每个人使用您的代码也使用相同的名称空间。

  5. using namespace std不应声明radius,因为您希望在创建对象后能够设置它的值。

  6. 使用const时,您经常需要最准确的变量类型表示。您经常可以在PI中的许多系统上以cmathM_PI)找到此信息。

  7. 我没有对#include <cmath>类或重载的乘法运算符做任何事情。我不知道PointType类是什么样的,并且似乎没有必要使用乘法运算符。

    下面是一个使用此类来说明如何使用成员函数的示例程序。

    CircleType.h

    PointType

    CircleType.cc

    #ifndef CIRCLE_TYPE_H
    #define CIRCLE_TYPE_H
    #include "PointType.h"
    #include <iostream>
    // It's common practice to not put "using namespace" in a header file.
    // If you do, anyone including your header file has to use it.
    
    class CircleType : PointType {
      public:
        void setRadius(const float r);
        void printCircle() const;
    
        CircleType operator * (const circleType& c) const;
    
        float getRadius() const;
        float getArea() const;
        float getCircumference() const;
      private:
        float radius;  // Note because you want to set radius
                       // after creation of a circle object
                       // radius should not be const
    }
    #endif
    

    main.cc

    #include "CircleType.h" // PointType.h will also be included
    #include "PointType.h"  // But it's also fine to explicitly include it
    #include <iostream>
    using namespace std;
    
    // you don't need a dummy class here, In fact that will likely cause a compiler issue
    
    // You should probably use a more accurate value of Pi
    const float PI = 3.1415927;  // Or use M_PI in "cmath" (if it's defined on your system)
    
    void CircleType::setRadius(const float r){
      radius = r;
    }
    
    void CircleType::printCircle() const {
      // Do whatever you need to print a circle
    }
    
    // As far as I can tell, you don't actually need to overload
    // multiplication to do any the tasks you mentioned.
    CircleType CircleType::operator * (const CircleType& c) const {
      CircleType tmp;
      // I have no clue what multiplying two circles gives you,
      // this is the general form of the multiplication operator
      return tmp;
    }
    
    // It is customary to name a function that returns a private variable
    // or the result of simpler operations on private variables with getXXX
    // like the ones below -- Note the return type is not void but
    // the actual type you expect.
    
    float CircleType::getRadius() const {
      return radius;
    }
    
    float CircleType::getArea() const {
      return PI * radius * radius;
    }
    
    float CircleType::getCircumference() const {
      return 2 * PI * radius;
    }