2013-03-28 172 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