C ++ - 数组og模板类对象

时间:2015-09-03 22:54:54

标签: c++ templates

这是我的任务:

实现模板类cuboid,其中尺寸(宽度,长度和高度)可以是任何数据类型。 cuboids的数组也可以是模板函数的参数,因此需要重载所需的运算符。 编写主程序,其中将声明cuboids数组,并使用数据类型float的维度进行初始化。

这是我的代码:

#include <iostream>

using namespace std;

template <class T>
class cuboid{
private:
    T length, width, height;
    cuboid *arr;
    int length_of_array;
public:
    cuboid();
    cuboid(cuboid*, int);
    cuboid(T, T, T);
    ~cuboid();
    T volume(cuboid);
    cuboid& operator = (const cuboid&);
};

template <class T>
cuboid<T>::cuboid(){
}

template <class T>
cuboid<T>::cuboid(cuboid *n, int len){
    length_of_array = len;
    arr = new cuboid <T> [length_of_array];
    for(int i = 0; i < length_of_array; i++){
    arr[i] = n[i];
    }
}

template <class T>
cuboid<T>::cuboid(T o, T s, T v){
    length = o;
    width = s;
    height = v;
}

template <class T>
    cuboid<T>::~cuboid(){
    delete [] arr;
    arr = 0;
}

template <class T>
T cuboid<T>::volume(cuboid b){
    if(length * width * height > b.length * b.width * b.height){
    return length * width * height;
    }
    else{
    return b.length * b.width * b.height;
    }
}

template <class T>
cuboid<T> & cuboid<T>::operator=(const cuboid& source){
    length = source.length;
    width = source.width;
    height = source.height;
    return *this;
}

int main(){
    int length;
    float a, b, c;
    cout << "How many cuboids array has? " << endl;
    cin >> length;
    cuboid<float> *arr;
    arr = new cuboid <float> [length];
    for(int i = 0;i < length; i++){
    cin >> a >> b >> c;
    arr[i] = cuboid <float> (a,b,c);
    }
    cuboid <float> n(arr, length);
}

我成功编译了它,但是一旦我开始输入数组对象的维度,程序就会崩溃。有什么想法吗?

提前致谢。

编辑:我修改了原始代码(和问题的表述),它是长方体而不是矩形

1 个答案:

答案 0 :(得分:1)

问题在于这行代码(以及析构函数):

    override func didMoveToView(view: SKView) {

    dateLabel.zPosition = 22
    dateLabel.fontName = "Krungthep"
    dateLabel.fontColor = UIColor.whiteColor()
    dateLabel.fontSize = 17
    dateLabel.text = NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: NSDateFormatterStyle.FullStyle, timeStyle: NSDateFormatterStyle.NoStyle)
    dateLabel.position = CGPointMake(self.size.width / 2.0, self.size.height / 1.1)
    self.addChild(dateLabel)

   }

       override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {

    var touch: UITouch = touches.first as! UITouch
    var location = touch.locationInNode(self)
    var node = self.nodeAtPoint(location)

            if node.name == "next" {
             //next day

              }







    if node.name == "before" {

        //previous day 
        let earlyDate = NSCalendar.currentCalendar().dateByAddingUnit(NSCalendarUnit.CalendarUnitDay,value: -1,toDate:
            NSDate(),options: NSCalendarOptions.WrapComponents)
        date.earlierDate(earlyDate!)


    }

它使用构造函数在堆栈上分配新的矩形对象,该构造函数不分配arr[i] = rectangle <float> (a,b,c); 数组(根据您的实现存储在堆上)。

在之后调用析构函数:

arr

尝试template <class T> rectangle<T>::~rectangle() { std::cout << "D1" << std::endl; delete[] arr; arr = 0; } delete[],尽管在这种情况下它还没有被分配。

一种解决方案是修复析构函数,以便考虑到这种情况。