2012-02-26 39 views
0

我是這樣一個C++ noob和即時通訊試圖瞭解代碼即時通訊覆蓋更好,所以我建立這個類來學習重載操作符的基本原理以及推回和彈出功能,即使我自己的變量數組。這不是一個班級任務,我只是試圖教自己的代碼。爲什麼我的回推函數不起作用,只是得到一個seg故障

這實際上是一個計算機科學編程測試問題,我做了,我試圖從中學習,以防萬一他們再次拋出類似的東西。我從java開始,現在在做C++。

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

IntArray::IntArray() 
{ 
    size=0; 
    capacity=1; 
    data = new int[capacity]; 
    cout<<"constructor fired off"<<endl; 
} 

IntArray::~IntArray() 
{ 
    delete [] data; 
    cout<<"Destructor fired off"<<endl; 
} 
IntArray::IntArray (const IntArray & m) 
{ 
    size=m.size; 
    capacity=m.capacity; 
    data= new int[capacity]; 
    cout<<"copy constructor fired off"<<endl; 

} 
IntArray IntArray::operator= (const IntArray & other) 
{ 
    cout<<"operator= fired off"<<endl; 
    if(this != &other)//comparing the addresses 
    { 
     delete [] data; 
     size= other.size; 
     capacity = other.capacity; 
     data = new int[capacity]; 
     for (int index=0; index<size; index++) 
     { 
      data[index]=other.data[index]; 
     } 
    } 
    return *this; 
} 

int& IntArray::operator[] (int n) 
{ 
    if(n<0||n>=size) 
    { 


    cout<<"Array not big enough"<<endl; 
    return n; 
    } 

    IntArray a; 
    return a[n]; 
} 
IntArray& IntArray::push_back(int n) 
{ 
    data[size]=n; 
    size++; 
    if(size==capacity) 
     capacity=capacity*2; 
    return *this; 
} 
IntArray& IntArray::pop_back() 
{ 
    if(size>0) 
     size--; 
} 
double IntArray::average() 
{ 
    double sum=0; 
    int count=0; 
    for(int index=0; index<size; index++) 
    { 
     sum+=data[index]; 
     count++; 
    } 
    return sum/count; 
} 
int IntArray::getSize() 
{ 
    return size; 
} 
int IntArray::getCapacity() 
{ 
    return capacity; 
} 

我的.h文件

#ifndef INTARRAY_H_INCLUDED 
#define INTARRAY_H_INCLUDED 

class IntArray 
{ 
    private: 
    int size; 
    int capacity; 
    int *data; 

    public: 
    IntArray(); 
    ~IntArray(); 
    IntArray (const IntArray &); 
    IntArray operator= (const IntArray &); 

    int& operator[] (int); 
    IntArray& push_back(int); 
    IntArray& pop_back(); 
    double average(); 
    int getSize(); 
    int getCapacity(); 
}; 

#endif // INTARRAY_H_INCLUDED 
+5

如果你真的是「noob」,那麼你不應該使用任何原始指針或「新」!這些都是先進的和利基的話題。 – 2012-02-26 23:58:59

+0

請記住,Java和C++ *非常*不同(您的代碼看起來像Java)。 – 2012-02-27 00:05:47

+0

您的'push_back'永遠不會改變分配數據的大小,並且會愉快地寫入當前數據塊的末尾。 – Blastfurnace 2012-02-27 00:11:28

回答

1

這不是什麼幫助,但有太多是次優我進入。

如果這是一個編程練習,那麼你需要真的提出一個更好的設計。我會避免與新的和刪除原始指針,看看智能指針。

如果你真的打算使用這個,我不會提供符合你需求的標準。

#include <vector> 
::: 
std::vector<int> i5(5); //five ints 
i5.push_back(6); //now six 
i5.pop_back(); //five again 
i5.clear(); //non 
+0

以及他們存根班,我們編碼。我不喜歡這個班,我試圖根據他給的標準重建它。他從未在工業界從事過僅僅是學術界的工作。什麼是編程的真實世界? – Cferrel 2012-02-27 00:20:16

+0

@JavaProgrammer如果你開始研究這裏提到的std :: vector如何工作,你可以瞭解真實世界。像這樣的容器在C++中通常被實現爲類模板,以允許它們通過即時生成適當的代碼來存儲任何內容,而不僅僅是有符號整數。他們也不提供像平均,排序等方法,它們給你一種插入,移除和遍歷元素的方法。由此,我們可以在不修改原始類的情況下構建任何我們想要的功能,因此我們實際上可以達到設計完成階段。如果我們將「平均」...... – stinky472 2012-02-27 00:53:39

+0

......等功能添加到原始類中,那麼在現實世界中往往會發生的情況是,開發人員會查看它並說出如下的話:「好的,這個類可以計算平均值。添加一個函數來計算中位數。「然後下一位開發人員會查看並看到該類如何提供方法來完成所有可以想象的方法,因此他添加了一種排序方法。接下來,開發人員添加了搜索和替換方法等等,而且課程設計隨着每個主要週期始終在不斷變化,並且從未真正完成。這是您可以搜索的單一級設計的一個症狀。 – stinky472 2012-02-27 00:55:45

0
  1. 你的賦值運算符應該返回一個IntArray&
  2. 你的拷貝構造函數的規模和能力,同樣的事情作爲rhs和創建數組,但不超過
  3. 的元素複製您的operator[]正在返回對本地變量的引用。如果你想在你的operator[]中構建邊界檢查,你應該拋出一個異常,而不是返回一個數字。
  4. 您的operator[]正在創建一個新的IntArray並調用它的operator[],創建一個無限循環。你應該return data[i]
  5. 不必返回從pop_back什麼它說,它返回一個IntArray&
  6. push_back,你必須檢查你的陣列是否處於最高容量,如果是,調整capacitydata。就像現在一樣,你永遠不會調整你的數組大小,而且你不會首先檢查在添加元素之前是否需要調整大小。這可能就是爲什麼你會出現段錯誤
0

你永遠不會在你的push_back()函數中分配額外的存儲空間。你只需加倍容量,這就是全部。這不會神奇地擴展您的int的存儲空間。您需要分配一個具有新容量的新塊,將內容複製到此新塊,然後刪除舊塊。

相關問題