2013-03-28 140 views
-1

我是C++的新手,請幫助我。非常感謝。如何將數組傳遞給構造函數或類?

我想將一個(新類型數組)傳遞給一個類。但我得到的消息,「拋出一個bad_alloc的實例後調用C++終止」是什麼意思?再次感謝!!!!

#include <iostream> 

using namespace std; 

class test { 
    public: 
     test (int*, int); 
     void check(); 
    private : 
    int k; 
    int *a= new int [k]; 
//int a; 

}; 


int main() 
{ 
    //int a1=5,n=4; 
    int n=4; 
    int *a1= new int[n]; 
    //int a1[4]={1,2,3,4}; 
    test haha(a1,n); 
    haha.check(); 

    return 0; 
} 


test::test(int *aa, int kk){ 
a=aa; 
k=kk; 
} 

void test::check() 
{ 
for(int i=0; i<k; i++){ 
    cout<<a<<" "; 

} 

} 
+0

[?潤通(http://i0.kym-cdn.com/photos/images/original/000 /176/344/ALOT.png?1316561198) - 更嚴重的消息,這段代碼甚至不應該編譯...你確定這是你正在使用的*精確*代碼嗎? –

+0

這是如何編譯? –

+0

你有沒有考慮過使用'std :: vector'而不是手動分配數組?這也可以解決你破壞'test'的memleak。我也建議命名你的變量有一點表現力。關於你的問題:你嘗試創建一個數組有多大?'bad_alloc'典型信號發射出去的內存(除非你設法損壞您的堆或東西) – Grizzly

回答

1
class test { 
    public: 
     test (int*, int); 
     void check(); 
    private : 
    int k; 
    int *a= new int [k]; <--- problem, k is undefined + you don't allocate in class declerations 
//int a; 

}; 

你可以不上課declerations分配..特別是沒有未定義的成員:)

besides..you已經分配指針在c'tor(不是你給他們任何價值...)

0
int k; 
int *a= new int [k]; 

問題出在這裏。在創建類實例時,k未初始化,並且將其用作數組大小。

+0

因爲我不能發表評論給他人。 C++ 11允許非靜態成員初始化。爲什麼大家都說它不應該編譯? –

0

在你的類:

int *a= new int [k]; 

這將導致錯誤:當k爲未定義呢。

error: `test::k' cannot appear in a constant-expression 
error: `new' cannot appear in a constant-expression 
error: ISO C++ forbids initialization of member `a' 
error: making `a' static 
error: invalid in-class initialization of static data member of non-integral type `int*' In constructor `test::test(int*, int)': 

你應該從*a聲明刪除= new int[k]並在構造函數初始化*a

0

你應該使用std :: vector而不是動態內存分配;特別是考慮到你沒有刪除內存。

std :: vector非常易於使用,並且有大量的文檔可用。見http://en.cppreference.com/w/cpp/container/vector

std::vector<int> qux; 

qux.push_back(6); 

void foo(std::vector<int>& bah) 
{ 

} 

如果必須通過周圍的數組,你會想,至少是,使用std ::陣列,看到http://en.cppreference.com/w/cpp/container/array

錯誤

std :: bad_alloc是新操作失敗時引發的異常

如果你不希望有新拋出的異常,您可以使用std ::拋出異常,見http://en.cppreference.com/w/cpp/memory/new/nothrow

原因您收到這是因爲你傳遞一個未初始化的變量各地

1

這些都是你的代碼的所有問題,按照外觀順序列出。我還爲您提供了一些提示:

  1. 在Pre-C++ 11代碼中不允許在類中初始化非靜態數據成員。因此此行無效:

    private: 
    // ... 
        int *a = new int [k]; 
    //   ^^^^^^^^^^^^^^ 
    

    不僅如此,此行是多餘的。您已經有了一個構造函數,它接受一個指針並將該指針分配給a。所以這裏沒有必要在課堂上進行任務。

  2. test的構造函數應該定義爲main以上。另外,提示:您應該使用member initializer-list初始化您的成員。它看起來像這樣在你的代碼:

    test::test(int *aa, int kk) : k(kk), a(aa) {} 
    //       ^^^^^^^^^^^^^^ 
    

    接下來的冒號是你的成員的初始化,用冒號隔開。

  3. 下面的行打印地址ak

    cout << a << " "; 
    

    你不想這樣做。您打印一個十六進制數字,表示您的指針指向的內存地址。要打印到該指針指向,您必須解引用指針:

    cout << *a << " "; 
    

    注:您還沒有初始化任何值的數組,因此所有將要打印的是垃圾從疊加。要指定數組的一些值,你會做這樣的(內部主,你宣佈你的陣列)

    int *a1 = new int[n]; 
    
    a1[0] = 1; 
    a1[1] = 2; 
    a1[2] = 3; 
    a1[3] = 4 
    

    或者,你可以使用一個for循環:

    for (int i = 1; i <= 4; ++i) 
    { 
        a1[i - 1] = i; 
    } 
    

    或者,如果你用C++編譯11(這你可能沒有):

    int *a1 = new int[n] {1, 2, 3, 4}; 
    

    但最重要的,不要忘了你的delete[]陣列時,你使用它完成。任何你用new/new[]創建您必須刪除:

    delete[] a1; 
    

    無論如何,你可以避開內存分配和混亂使用std::vector(這恕我直言更好):

    #include <vector> 
    
    std::vector<int> a1 = {1, 2, 3, 4}; 
    

    std::vector包含有關信息它的大小使得通過陣列的長度變得不必要。使用矢量將顯着簡化您的程序。

而且隨着這裏是你的程序:

#include <iostream> 
#include <vector> 

class test { 
    public: 
     test(std::vector<int>); 
     void check(); 

    private: 
     std::vector<int> v; 
}; 

test::test(std::vector<int> temp) : v(temp) {} 

void test::check() 
{ 
    std::vector<int>::const_iterator it; 

    for (it = v.begin(); it != v.end(); ++it) { 
     std::cout << *it << std::endl; 
    } 
} 

int main() 
{ 
    std::vector<int> a1 = {1, 2, 3, 4}; 

    test haha(a1); 
    haha.check(); 
} 

Live Demo