1

我正在学习 c++,我有这些疑问:

我想在运行时初始化数组,但数组的大小也需要在运行时读取。

int size;

int main(){
    //read size
    size = <value read above>;
    CIwUIButton* buttons[size];
}

这不会编译并且说size必须是常量。我来自 Java 背景,我可以通过遵循相同的逻辑来实现相同的功能。如何在 C++ 中做到这一点。

我使用vector作为Java ArrayList的等价物。我想在main之外引用vector,但想在main里面初始化它。同样,max_size将从用户输入中读取,所有元素都应该初始化为0;

vector<int> elements;

int main(){
    //read size
    int size = <value read above>;
    //how to do following in c++
    elements = new vector<int>(size);
}
4

10 回答 10

6

对,所以 C++ 不是 Java,Java 也不是 C++。它们都是不同的语言。

如果您有未知数量的“事物”,则需要使用 avector或动态分配 using new。因此,如果您想要指针size数量:CIwUIButton

CIwUIButton** buttons = new CIwUIButton*[size];

(确保您delete [] buttons稍后使用 - 删除每个按钮后)。

如果你想要size按钮的数量:

CIwUIButton* buttons = new CIwUIButton[size]; 

同样,delete对按钮使用与上面相同的方法,但您不需要自己删除按钮)

你也可以使用vectorfor CIwUIButton

如果你想要一个全局向量中的整数大小,elements那么:

elements.resize(size);

(几乎没有需要调用对象的情况new-vector这可能是错误的,除非您确切知道为什么要这样做)

于 2013-07-27T07:37:17.193 回答
1

第一部分;

您需要动态分配数组,如下所示:

CIwUIButton** buttons = new CIwUIButton*[size];

(不要忘记使用析构函数和 delete [] 删除该对象及其元素。)

如果要使用非默认构造函数,则需要在循环中初始化每个对象:

 for(int i=0;i<size;i++) {
    buttons[i] = new CIwUIButton(x,y);
 }

第二个问题;

 std::vector<int> elements;

您不需要给出尺寸,但是您可以像这样定义尺寸:

 elements.resize(size);
于 2013-07-27T07:34:45.460 回答
1

在 C++ 中,我们遵循称为RAII的习语。
资源获取就是初始化。

当您在范围内声明对象 A 的实例时:

{
    A instance;
}

当我们离开作用域时,这个对象将被销毁。

对于您的 global std::vector<int>,它将在程序开始执行时创建和初始化,并在程序终止时被释放。

在这种情况下没有必要new和。delete


std::vector有一个resize方法可以让你调整内部数组的大小,这样你就可以通过operator[]. 您也可以push_backemplace_back不必调整大小。

于 2013-07-27T07:43:18.687 回答
0

使用 new 你只需要一个vector<int>*指针。C++ 的首选解决方案是使用以下vector<T>::resize()操作:

vector<int> elements;

int main(){
    //read size
    int size = <value read above>;
    //how to do following in c++
    elements.resize(size,0);
}
于 2013-07-27T07:34:19.423 回答
0

您可以像这样使用矢量:

vector<int> elements;

int main(){
    //read size
    int size = <value read above>;
    //how to do following in c++
    elements.resize(size, 0);
}
于 2013-07-27T07:36:03.187 回答
0

在 Java 中,所有新对象都需要使用“new”关键字创建,但在 C++ 中并非总是如此。元素将凭借其声明成为构造对象,准备在 main 中使用。您可以通过调用 resize 方法来设置它的大小。或者,您可以在 main 中声明元素(而不是在外部作为全局变量)并将向量的大小作为构造函数参数传递。

这些是基本主题,我建议您在继续之前阅读 C++ 教程。

你可以让按钮

vector<CIwUIButton *>

并在类构造函数中设置其大小。但是您还需要管理按钮元素的创建方式。

于 2013-07-27T07:36:31.523 回答
0

C99 中引入了可变长度数组,但 C++ 不支持它。

要使用vector

vector<int> elements;

int main(){
    //read size
    int size = <value read above>;
    elements.resize(size);
}
于 2013-07-27T07:37:19.320 回答
0

std::vector 没有固定大小,没有理由初始化为特定大小,它只会按需增长。您可以elements.reserve(size)为 size 元素(在您的示例中为整数)分配空间。

t 并且所有元素都应该初始化为0;

您的元素向量不是指针,它是通过调用构造函数构造的对象,不需要动态内存管理,因为它甚至没有在堆上分配。

newdelete(不要忘记删除,或者更好地使用智能指针)仅与指针一起使用。

例子 :

int main()
{
  std::vector<int> elements; // not a pointer constructor called because of this statement
  std::vector<int> *elements_ptr = new std::vector<int>(); // this is a pointer pointers have asterisks as part of their declaration and these are initialized via new they simply contain a memory location
  // do stuff here
  delete elements_ptr; // frees allocated memory and calls the destructor for the object 
  return 0;
} // elements destructor is called when it goes out of scope

如果您是这门语言的新手,我强烈建议您阅读一本关于 C++ 的书。这些材料可以很好地描述这些内容。

我会推荐deitel 的 how to program C++Bjarne Stroustrup 的 C++ 编程语言

于 2013-07-27T07:38:37.610 回答
0

首先我不会使用全局变量,这是一种邪恶。

如果您不知道需要多少对象/变量,您有两个选择,要么使用某个容器,要么动态分配内存。

我建议使用容器,但首先是关于动态分配。在 CmallocfreeC++ 中new以及delete. C 类型分配给你一块内存,C++ 类型做同样的事情并调用构造函数和析构函数,我建议使用 C++ 分配器。

如何使用它:

Object *ptr;         //pointer to some object
ptr = new Object;    //creating one object
delete ptr;          //deleting that object, destructor called and memory deallocated
ptr = new Object[n]; //created n objects, to reach any of them just use array index
delete [] ptr;       //deleted array. n destructors called all memory freed

如果您创建对象数组,请不要使用delete没有[].

所以这是关于你自己的分配器。在您的情况下,使用vector可能是最好的选择。但我再说一遍,全局变量是个坏主意。我建议在调用函数时传递对它的引用。

C++中函数原型的几种方式

/*1*/foo(Object obj);    //value of given object will be copied it's slow but sometimes we need that
/*2*/foo(Object *obj);   //passing pointer more C type. Fast but unsafe.
/*3*/foo(Object &obj);   //C++ passing reference. It is the same as passing pointer but it is C++ type declaration, it is safer because you won't pass NULL and you won't go out of memory
/*4*/foo(const Object *obj);
/*5*/foo(const Object &obj);  //Same as before one is C type, another C++ type (unsafe and safer). Keyword `const` means what value won't be changed.

对这些函数的调用如下所示:

Object obj;
/*1*/foo(obj);
/*2*/foo(&obj);
/*3*/foo(obj);
/*4*/foo(&obj);
/*5*/foo(obj);

所以回到你的问题。

如果您真的想使用全局变量,那么您需要调整容器的大小。在你的情况下,elements.resize(size);但我不会使用全局数据,所以我的选择是:

typedef std::vector<CIwUIButton> ButtonVector;  //in big projects typedef makes us to type less :)
size_t size = <value read above>;
ButtonVector buttons(size);   //You will need default constructor to initialize all buttons

我在您的代码中看到了一个指针,不确定您想用它做什么,但我认为没有必要。

顺便说一句,您应该阅读有关 STL 容器的信息,因为 C++ 和 JAVA 不同。特别是阅读vectordeque。在您的情况下vector可能会更好,但是deque您提到的情况要ArrayList好得多。dequevector

编辑 如果你真的想开始用 C++ 编程,你也应该看看boost你的情况scoped_arrayshared_ptr可能会有用。

于 2013-07-27T08:57:17.213 回答
-3

您必须动态分配内存,使用 malloc 并将 sizeof(yourClass) * size 分配给您创建的指针

于 2013-07-27T07:34:00.333 回答