预期的构造函数,析构函数或头文件

时间:2015-10-28 19:17:31

标签: c++

该程序包含三个部分:标题,类的功能和交互的主要部分。但是,它不会编译。

我不断得到有一个预期的构造函数,析构函数或类型转换的响应。

#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;

}

有没有人知道为什么?

3 个答案:

答案 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;
}