现在我有点初学者的问题。我有一个类型为int的数组变量x。
用户将在方法B中输入x的大小。我想在方法A中使用x。
void method A()
{
using int x [] blah blah blah
}
void method B()
{
int n;
cin >>n;
int x [n]; // How can I use this int x in method A without getting error: storage size x is unknown.
// Or the error 'x' was not declared in this scope.
}
编辑:参数传递不是我正在寻找的解决方案。
DOUBLE EDIT:我确实知道矢量选项,但我的程序正按时填写。我正在创建一个算法,每毫秒计算一次。
BTW我发现了一种方法。
int x [] = {}
method B();
method A () { blah blah use x}
method B () {/*int*/ x [n]}
答案 0 :(得分:6)
如果你真的想要一个数组而不是一个向量,并且你希望该数组在运行时动态调整大小,则需要在堆上创建它(将其存储在指针中),并在完成后释放它。
来自Java,您需要了解C ++中没有垃圾收集 - 您希望在析构函数中使用new
清理对象中的delete
(在堆上创建)。
class foo
{
private:
int *array;
public:
foo() { array = NULL; };
~foo()
{
if (array != NULL)
delete [] array;
}
void createArray()
{
array = new int[5];
}
};
答案 1 :(得分:1)
使用矢量:
std::vector<int> x(n);
然后将其作为std::vector<int> const &
类型的参数传递给方法A.
修改:或者让vector
成为您班级的数据成员,并将其设置为:
size_t n;
std::cin >> n;
x.resize(n);
答案 2 :(得分:1)
在C ++中,您无法使用运行时值直接调整数组大小,只能使用常量。
你几乎肯定想要矢量:
std::vector<int> x(n);
答案 3 :(得分:1)
编辑:充实答案。
我不知道你是在尝试学习数组,还是试图解决一些实际问题。我会假设后者。
方法A访问任何变量的唯一方法是它是否在范围内。具体而言,x
必须是:
以下是x
是类成员的解决方案:
class C {
public:
std::vector<int> x;
void A() {
std::cout << x[2] << "\n"; // using x[], for example.
}
void B() {
int n;
cin >> n;
x = std::vector<int>(n); // or, as others have pointed out, x.resize(n)
}
};
答案 4 :(得分:0)
这是您的示例的一个版本,适用于c ++。
#include <iostream>
int *my_array;
void methodA(a,b){
my_array[a] = b;
}
int methodB(){
int n;
std::cin >> n;
my_array = new int[n];
}
int main(){
int x;
x = methodB();
methodA(x-1, 20);
delete [] my_array;
return 0;
}
答案 5 :(得分:0)
请注意,C ++中的数组比Java更基本(也更危险)。
在Java中,检查对数组的每次访问,以确保您使用的元素编号在数组中。
在C ++中,数组只是指向已分配的内存区域的指针,您可以使用任何您喜欢的数组索引(无论是否在数组的范围内)。如果您的数组索引超出了数组的范围,那么您将访问(并修改,如果您要分配给数组元素!)那时内存中发生的任何事情。这可能会导致异常(如果内存地址在您的进程可访问的区域之外),或者可能导致几乎任何事情发生(更改程序中的另一个变量,更改操作系统中的某些内容,格式化您的硬盘,无论如何)被称为“未定义的行为”)。
当你在C ++中声明一个本地,静态或全局数组时,编译器需要知道那个数组的大小,因此它可以分配内存(当它超出范围时为你释放它)。因此数组大小必须是常量。
但是,数组只是一个指针。因此,如果你想要一个在编译时你不知道的数组的数组,你可以使用“new”在堆上创建一个数组。但是,一旦完成内存,你就有责任释放内存(使用“删除”)。
如果可以的话,我同意上面的海报使用矢量,因为这样可以防止您访问您习惯使用的数组边界之外的东西。
但是如果你想要最快的代码,请使用分配的数组:
class C {
int [] x;
void method A(int size)
{
x = new int[size]; // Allocate the array
for(int i = 0; i < size; i++)
x[i] = i; // Initialise the elements (otherwise they contain random data)
B();
delete [] x; // Don't forget to delete it when you have finished
// Note strange syntax - deleting an array needs the []
}
void method B()
{
int n;
cin >> n;
cout << x[n];
// Be warned, if the user inputs a number < 0 or >= size,
// you will get undefined behaviour!
}
}