如何将数组传递给构造函数或类?

时间:2013-03-28 16:24:17

标签: c++

我是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<<" ";

 }

}

5 个答案:

答案 0 :(得分: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;

};

你不能在课程内容中分配..特别是在未定义的成员中不能分配:)

此外..你已经指定了c'tor中的指针(不是你赋予它们任何价值......)

答案 1 :(得分:1)

这些是您的代码的所有问题,按外观顺序列出。我还为您提供了一些提示:

  1. 在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. 以下行正在打印a k次的地址

    cout << a << " ";
    

    你不想这样做。您打印十六进制数字,表示内存中指针指向的地址。要打印指针指向的,您必须取消引用指针:

    cout << *a << " ";
    

    注意:您尚未使用任何值初始化数组,因此所有打印的内容都是堆栈中的垃圾。要为数组分配一些值,你可以这样做(在main声明你的数组的地方)

    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包含有关其大小的信息,这使得传递数组的长度变得不必要。使用矢量可以大大简化您的程序。

  4. 这就是你的计划:

    #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

答案 2 :(得分:0)

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

这是问题所在。在创建类实例时,k是未初始化的,并且您将其用作数组大小。

答案 3 :(得分: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)':

您应该从= new int[k]的声明中删除*a并在构造函数中初始化*a

答案 4 :(得分: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 :: array,参见http://en.cppreference.com/w/cpp/container/array

<强>错误

std :: bad_alloc是新运算符失败时抛出的异常

如果您不想让新抛出该异常,可以使用std :: nothrow,请参阅http://en.cppreference.com/w/cpp/memory/new/nothrow

您收到此消息的原因是您传递的是未初始化的变量