所以我想要实现的是从函数返回指向2D数组的指针,以便可以在main()中访问它。我知道有一些C ++库像std::vector
一样为你做这件事,但我正在努力避免动态内存分配,因为我正在使用嵌入式主板(STM32),因此我将坚持只是普通的指针和数组。 (由于某些原因我无法在KEIL uVision中使用std::array
,这也是我被迫使用指针/数组的原因)
另外,我理解返回指向函数内部定义的本地数组int arr[2][2]
的指针并不是一个好主意,因为它在函数返回后将不再有效,这就是我创建{{1在一个类中声明它并在一个函数中定义它(充当一个全局变量)所以我认为这不应该是一个问题。你们有什么感想?但是,这样做会在标量初始化程序中出现错误"多余元素"
test_array
#include <iostream>
#include "file.hpp"
int main() {
myClass class_object;
class_object.value = class_object.foo();
}
//file.hpp
#include <stdio.h>
class myClass{
int array[2][2];
int (*foo())[2];
int (*value)[2];
int test_array[2][2]; //declaring here!
};
答案 0 :(得分:1)
当前的问题:
test_array[2][2]={ {10,20}, {30, 40} }; //defining here - ERROR!!
没有定义。 test_array
中定义了myClass
。这是尝试分配给test_array
的单个元素,特别是[2][2]
不存在的元素。特别冒犯编译器的不是越界访问,而是={ {10,20}, {30, 40} };
试图将数组填充到单个数组元素中。编译器期望一个数字,因此四个数字肯定是过量的。
不幸的是,我不知道做你想做的事情的好方法。您可以使用初始化列表初始化数组,但不能从一个数组中分配。
所以
class myClass{
public:
myClass();
void foo();
int test_array[2][2]; //declaring here!
};
// you can do this:
myClass::myClass(): test_array{ {10,20}, {30, 40} }
{
}
void myClass::foo()
{
// but you can't do this:
test_array = { {10,20}, {30, 40} };
}
根据您对test_array
的处理方式,在构造函数中初始化可能对您有用。如果你必须在每次调用foo
时重置数组,那么自动变量可能更适合你
void myClass::foo()
{
int temp_array[2][2] = { {10,20}, {30, 40} };
// use temp_array
// maybe copy temp_array to test_array with good ol' memcpy here if you
// need to carry the state for some reason.
}
让房间里的大象沉默and gain access to std::array
, give this a try.注意:我从来没有这样做过。对于我所知道的一切来说,这可能是一场彻头彻尾的灾难,所以请耐心等待。
答案 1 :(得分:0)
如果您真的想使用C-Array,请使用typedef来使用普通语法:
class myClass{
public:
using array2 = int[2][2];
myClass() {
test_array[0][0] = 0;
test_array[0][1] = 1;
test_array[1][0] = 2;
test_array[1][1] = 3;
}
const array2& getArray() const { return test_array; }
array2& getArray() { return test_array; }
private:
array2 test_array;
};