2016-03-01 88 views
-5

我寫C++整型數組類自己和提取子陣列功能,但在試圖編譯我的代碼,我收到此錯誤:編寫C++「陣列」類自己

「多個標記在該行 - 沒有回報,在函數返回非空 - 與 '陣列陣列:: subArr(INT,INT)'」

(不好意思忘了,包括這個錯誤)

- ‘int* Array::subArr(int, int)’ cannot be overloaded 

但爲什麼不能它是超載?

Array類的私有數據成員是:

​​

兩個導致錯誤的公共職能爲:

int * subArr(int pos, int siz) 
{ 
    if (pos+siz < len) 
    { 
     subArr1 = new int[siz]; 
     for (int i=0; i<siz; i++) 
     { 
      subArr1[i] = arr[pos]; 
      pos++; 
     } 
     return subArr1; 
    } 
} 

Array subArr(int pos, int siz) 
{ 
    if (arr != NULL && (siz + pos) < len) 
    { 
     Array sub; 
     sub.len = siz; 
     sub.subArray = new int [siz]; 
     for (int i=0; i<siz; i++) 
     { 
      sub.subArray[i] = arr[pos]; 
      pos++; 
     } 
     return sub; 
    } 
    cout<<"Error. Enter a valid index and/or position\n"; 
} 

我可以給全班代碼是否需要。

+0

那麼,有什麼不清楚的錯誤信息?在「if」塊之外沒有「返回」。 –

+0

錯誤信息其實很清楚,你的函數應該返回一個'int *',但是在某些情況下它不會。 – user463035818

+0

你讀過編譯器說的什麼了嗎?它說你的函數不會返回一個值。很明顯,有代碼修改('else',因爲你的'if'沒有完成)函數沒有返回。 –

回答

4

這就是它說的;

沒有回報,在函數返回非空 - 與 '陣列陣列:: subArr(INT,INT)'」

看代碼:

int * subArr(int pos, int siz) 
{ 
    if (pos+siz < len) 
    { 
     subArr1 = new int[siz]; 
     for (int i=0; i<siz; i++) 
     { 
      subArr1[i] = arr[pos]; 
      pos++; 
     } 
     return subArr1; 
    } 
} 

會發生什麼如果if (pos+siz < len)是假的?

正確,你沒有任何東西可以返回,在函數聲明爲返回int *。這是一個錯誤。


'詮釋*陣列:: subArr(INT,INT)' 不能在代碼重載

查找:

int * subArr(int pos, int siz) 
Array subArr(int pos, int siz) 

兩個功能在返回的差異僅在於類型。這是不可能的;參數的數量和/或類型必須有所不同。


無償一般建議:

  • 避免重新實現標準功能,不是鍛鍊等。
  • 避免使用指針。
  • 避免new除非...

      在構造您的析構函數具有相應的 delete
    • 包裹在智能指針分配中。

    (分配函數內部存儲器中,然後期待呼叫者再次釋放它是內存泄漏的主要來源。)

  • 不要寫錯誤cout,拋出異常。
  • 使用nullptr,而不是NULL。

總之,編寫C++,而不是C與類 - 這是三十年前。

+0

謝謝先生,但請再次檢查上述問題 –

+0

@AbdulMateen:添加到免費的通用建議:發佈後不要改變問題。修改我的回答以涵蓋所附問題。 – DevSolar

+0

@AbdulMateen:多一個 - [搞定一本好書](http://stackoverflow.com/questions/388242/)。不完全是。 ;-) – DevSolar

1

有可能達到你的函數的結束,你不會在最後返回任何東西。如果你有一個函數返回某個東西,那麼每個從該函數出來的路徑都需要返回。基本上

int * subArr(int pos, int siz) 
{ 
    if (pos+siz < len) 
    { 
     subArr1 = new int[siz]; 
     for (int i=0; i<siz; i++) 
     { 
      subArr1[i] = arr[pos]; 
      pos++; 
     } 
     return subArr1; 
    } 
} 

變爲

int * subArr(int pos, int siz) 
{ 

} 

如果if (pos+siz < len)是假的。由於沒有回報,你會得到錯誤。


你的第二個問題是你不能重載基於它的返回類型的函數。

Array subArr(int pos, int siz) 
int * subArr(int pos, int siz) 

忽略對函數的返回類型,我們有

subArr(int pos, int siz) 
subArr(int pos, int siz) 

它是如何應該告訴他們分開?它不能。這就是爲什麼它不被允許。

+0

對不起,我忘記了包括這個錯誤 –

+0

請再次檢查問題Sir –

+0

那麼這意味着重載取決於參數的數據類型而不是返回類型? –