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

Posted

技术标签:

【中文标题】如何将数组传递给构造函数或类?【英文标题】:How to pass an array to a constructor or a class? 【发布时间】:2013-03-28 16:24:16 【问题描述】:

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

 


【问题讨论】:

Alot? - 更严重的消息是,这段代码甚至不应该编译……你确定这是你要使用的确切代码吗? 这怎么编译?? 您是否考虑过使用std::vector 而不是手动分配的数组?这也将解决您在销毁 test 时的 memleak。我还建议将变量命名为更具表现力。关于您的问题:您尝试创建多大的数组? bad_alloc 通常表示内存不足(除非你设法破坏了堆或其他东西) 你可以参考类似的文章,已经在 *** 上:[点击这里][1] [1]:***.com/questions/9426932/… @Konrad Tsk 用于链接到图像而不是 the article! 【参考方案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 中分​​配了指针(不是您给它们任何值...)

【讨论】:

【参考方案2】:

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

    非静态数据成员的类内初始化在 C++11 之前的代码中是不允许的。因此这一行是无效的:

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

    不仅如此,这条线是多余的。您已经有一个带有指针的构造函数,并将该指针分配给a。所以这里不需要在课堂上做作业。

    test 的构造函数应该在main 之上定义。另外,提示:您应该使用member initializer-list 初始化您的成员。在您的代码中看起来像这样:

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

    冒号后面是你的成员的初始化,每个成员用冒号分隔。

    下面一行是打印ak次的地址

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

这就是你的程序:

#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

【讨论】:

【参考方案3】:
int k;
 int *a= new int [k];

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

【讨论】:

因为我无法将 cmets 发布给其他人。 C++11 确实允许非静态成员初始化。为什么大家都说它不应该编译?【参考方案4】:

在你的课堂上:

 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

【讨论】:

【参考方案5】:

您可能应该使用 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 是当你的新操作符失败时抛出的异常

如果你不想让新的 throw 那个异常,你可以使用 std::nothrow,见http://en.cppreference.com/w/cpp/memory/new/nothrow

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

【讨论】:

以上是关于如何将数组传递给构造函数或类?的主要内容,如果未能解决你的问题,请参考以下文章

使用构造函数将数组传递给对象后,值已更改(在 c++ 中)。我想不通为啥

将对象数组传递给构造函数[重复]

将数组常量传递给枚举构造函数[重复]

将参数从php中的数组传递给构造函数[重复]

无法从构造函数中将数组值传递给向量

构造函数不将初始数组值传递给方法