该程序包含三个部分:标题,类的功能和交互的主要部分。但是,它不会编译。
我不断得到有一个预期的构造函数,析构函数或类型转换的响应。
#ifndef BOX_H
#define BOX_H
class Box
{
private:
double height;
double width;
double length;
public:
Box();
double setHeight();
double setWidth();
double setLength();
double getVolume();
double getSurfaceArea();
};
#endif
function.cpp
:
#include "Box.hpp"
/**********************************************************************
Box:: Box
This is the default constructor that uses the set methods to initialize each field to 1.
* **********************************************************************/
Box::Box()
{
height = 1;
width = 1;
length = 1;
}
/*
Does anyone know what this section does? Is it another default constructor or is is it even needed?
Box::Box(double height, double width, double length)
{
setHeight(height);
setWidth(width);
setLength(length);
}
*/
double Box::setHeight()
{
return height;
}
double Box::setWidth()
{
return width;
}
double Box::setLength()
{
return length;
}
double Box::getVolume()
{
return height * width * length;
}
double Box::getSurfaceArea()
{
double SurAre = 0;
SurAre = (2 * (length * width)) + (2 * (length * height)) + (2 * (height * width));
return SurAre;
}
main.cpp
:
#include <iostream>
#include "Box.hpp" //contains Box class declaration
using namespace std;
int main()
{
Box object;
double Alength;
double Awidth;
double Aheight;
cout << "This program will calculate the area of a box.\n";
cout << "What is the length?";
cin >> Alength;
cout << "What is the width?";
cin >> Awidth;
cout << "What is the height?";
cin >> Aheight;
object.setLength(Alength);
if (!object.setWidth(Awidth))
cout << "Invalid box width entered. \n" << endl;
if (!object.setHeight(Aheight))
cout << "Invalid box height entered. \n" << endl;
cout << "Volume: " << object.getVolume() << endl;
cout << "Surface Area: " << object.getSurfaceArea() << endl;
return 0;
}
有没有人知道为什么?
答案 0 :(得分:1)
如果取消注释三参数构造函数,您将收到一条错误消息,因为构造函数是一个类成员,并且必须在类中声明类成员才能在外部使用或定义它们。
添加行
Box(double height, double width, double length);
在类定义中,然后也可以编译其他构造函数。
答案 1 :(得分:1)
C ++有一些奇怪的行为:如果你未能声明和定义一个默认的构造函数,它会为你做。想想自动生成。它还将定义编译器生成的复制构造函数和析构函数。理解这一点很有帮助,因为无论你是否定义它们,这些都是存在的。
你们都在标题中声明了构造函数:
public:
Box();
并在cpp文件中定义:
Box::Box()
你正确地声明并定义了这个构造函数。
如果你想要任何其他构造函数,你必须先声明它,然后才能定义它
public:
Box();
Box(double height, double width, double length); // this is new
然后你可以在cpp文件中取消注释你的定义,一切都应该没问题。
另一个样式点:你定义3参数构造函数的方式不是很好。会发生什么是构造一个Box,当你这样做时,你使用默认构造函数来获得它的高度,宽度和深度的成员变量。然后,您可以调用3个成员函数来分配这些变量。在C ++中,您可以通过使用初始化列表来避免所有这些。 3参数构造函数的主体变为
Box::Box(double height, double width, double length) :
height(height), width(width), length(length)
{}
这就是说“为我建造一个盒子,当你这样做时,使用传递高度的值作为成员高度,宽度为成员宽度,长度为成员长度”。你可以通过构建盒子“开箱即用”来保存一个0作为成员变量和3个函数调用的默认值的赋值,因为它与这些值一样。这使用了成员变量的复制构造函数,而不是默认构造函数,后跟赋值。
(技术说明:作为内置,双打在技术上没有这些构造函数,但语义表现得好像它们一样,所以你可以把它们看作是在初一思想中使用它们。)
此外,这意味着如果您定义了一个复制构造函数:
Box(const Box& other);
然后您可以在其他类中使用它来初始化其初始化列表中的Box,例如
BunchOfBoxes(const Box& firstBox) :
m_firstBox(firstBox)
{}
它将使用Box类中的复制构造函数对BunchOfBoxes进行相同类型的初始化构建
答案 2 :(得分:0)
您的班级声明/定义有问题: 您的setter应该有参数,以便您可以将它们用作setter。 在你的Box.hpp更改
double setHeight();
double setWidth();
double setLength();
到
double setHeight(double _height);
double setWidth(double _width);
double setLength(double _length);
然后在你的Box.cpp改变
double Box::setHeight()
{
return height;
}
double Box::setWidth()
{
return width;
}
double Box::setLength()
{
return length;
}
到
double Box::setHeight(double _height)
{
height = _height;
return height;
}
double Box::setWidth(double _width)
{
width = _width;
return width;
}
double Box::setLength(double _length)
{
length = _length;
return length;
}