基本Shape类和Circle类:编译错误

时间:2016-11-26 02:05:59

标签: c++ class polymorphism

我有这个家庭作业要做,我做了大部分代码,但我在main()中有一个剩余的编译错误,我不明白。

这是作业:

  
      
  1. 定义一个名为BasicShape的抽象基类。 BasicShape类应具有以下成员(...)

  2.   
  3. 定义一个名为Circle的类。它应该来自BasicShape类。     它应该有以下成员:

         

    a)私人会员变量:radius(用于保持圆圈的双倍)   半径)

         

    b)构造函数和公共成员函数:

         
        
    • 圆圈(双a,字符串   n,double r):应该调用基类构造函数的构造函数   使用a初始化成员区域,并使用n命名。构造函数   还将使用r
    • 设置成员半径的值   
    • 油杉():   重写功能(...)
    •   
    • print():重写函数(...)
    •   
  4.   
  5. 创建这些类后,创建一个测试程序   (...)

  6.   

这是我的代码:

基本Shape.h

#ifndef BASICSHAPE_H
#define BASICSHAPE_H
#include <string>
class basicShape
{
public:
    basicShape(const std::string &, double &);
    double getArea() const;
    virtual double calcArea() const = 0;
    virtual void print()const;
    std::string getname()const;
protected:
    const double area;
private:
    const std::string name;
};

#endif

Circle.h

#ifndef CIRCLE_H
#define CIRCLE_H
#include <string>
#include "Basic Shape.h"
using namespace std;
class Circle : public basicShape
{
public:
    Circle(const string & n, double & a, double & r);
    virtual double calcArea() const override;
    virtual void print() const override;
private:
    double radius;
};
#endif

Circle.cpp

#include <iostream>
#include "Circle.h"
#include<string>
using namespace std;

Circle::Circle(const string &n, double &a,  double &r)
:basicShape(n,a)
{
    radius = r;
    calcArea();
}
double Circle::calcArea() const 
{
    double area;
    area = 3.14159*radius*radius;
    return area;
   }
double basicShape::getArea() const
{
   return area;
}
void Circle::print() const
{
   cout << "radius:" << radius;
   basicShape::print();
   basicShape::getname();
}

Test.cpp的

#include <iostream>
#include "Basic Shape.h"
#include "Circle.h"
#include <string>
#include<vector>
using namespace std;
void poly(const basicShape * const);

int main()
{ 
    Circle circle("Round",0.0,10.0);
    vector< basicShape * > shapes(1);
    for (const basicShape *basicshapePtr : shapes)
         poly(basicshapePtr);
}
void poly(const basicShape * const baseClassPtr)
{
   baseClassPtr->calcArea();
   baseClassPtr->print();
}

以下是我在main中获得的编译错误:

 "Circle::Circle(Circle Assignment 3 &&)': cannot convert argument 2 from 'double' to 'double &' 

1 个答案:

答案 0 :(得分:0)

问题

您尝试在此处构建新圈子:

Circle circle("Round",0.0,10.0);

但是你的构造函数有以下签名:

Circle(const string &n, double &a,  double &r)

对于第二个和第三个参数,您使用对double值的引用。像这样通过引用传递意味着您可以更改引用的值。不幸的是,你传递了不变的文字。这是不允许的。

解决方案

使用const引用定义构造函数:

Circle(const string &n, const double &a,  const double &r)

或传递值:

Circle(string n, double a,  double r)

请注意,第二个选项似乎更受欢迎。而且我甚至建议你尊重作业中给出的签名,这样可以避免那些麻烦。

PS:对于将来的问题,请将问题减少到重现错误所需的最小元素,而不是发布完整的作业和完整的代码,其中大部分与错误无关