函数,返回一个对象数组

function that returns an array of objects

本文关键字:数组 一个对象 返回 函数      更新时间:2023-10-16

我有一个结构

class pyatno {

int pyatnoNumber;
int locX, locY;
bool possible;
char *number;
char pyatnoView[4][4];
}

我们的想法是创建一个函数,该函数将返回一个pyatno.pyatnoView对象的数组,但这是一团糟。我不明白我到底是怎么才能进入这个"房产"的。我不擅长c++,所以如果它不是真的,或者我说错了什么,请解释一下,因为我真的很难回答这个问题。

正如您所提到的,您对c++的能力不是很强,您的问题也很不清楚,这里有几个建议。

为了访问类的属性,c++有可见性的概念;默认可见性为private,即属性和函数在类之外不可见:

class Foo {
    int some_value;
};

有几种方法可以从对象中检索数据,但简单地说,您应该公开属性:

class Foo {
public:
    int some_value;
};

或者通过访问器/变异器暴露它:

class Foo {
    int some_value;
public:
    int get_some_value() { return some_value; }
    void set_some_value(int v) { some_value = v; }
};

另一件需要注意的事情是,您不能返回arrays!在c++中,当数组通过函数边界(也就是说,作为参数传递到或从中返回)时,在许多其他情况下,数组将"衰减"到指针。例如,以下是我将如何将一个字符数组(也称为c-string)传递给函数:

#include <iostream>
using namespace std;
void print_cstr(const char *cstr) {
    cout << cstr << endl;
}
int main() {
    const char my_cstr[20] = "foo bar baz qux";
    print_cstr(my_cstr);
    return 0;
}

那么N维数组会发生什么呢?好吧,如果char[1]衰减为char*,那么char[1][1]将衰减为char**,依此类推。您可能已经注意到C程序中较旧的main签名,它用于传递表示传递给程序的参数的字符串数组:

int main(int argc, char **argv) { ... }

非常重要的是,您要意识到这个实际上不再是一个数组。C风格的字符串有点特别,因为它们通常以空字节结尾,这意味着你通常可以知道字符串的末尾在哪里,或者它有多长。但是,你不再知道数组有多长了!例如,这是完全合法的:

#include <iostream>
using namespace std;
void bad_fn(const int *nums) {
    for (unsigned i = 0; i < 20; ++i) {
        cout << "num " << i << " = " << nums[i] << endl;
    }
}
int main() {
    const int my_nums[5] = { 1, 2, 3, 4, 5, };
    bad_fn(my_nums);
    return 0;
}

您的函数最终将读取超出数组界限的内存,因为它无法知道数组的起点或终点(毕竟,数组索引只是指针算术)。如果您不想担心跟踪和传递数组的长度(我建议您不要这样做!),请考虑使用C++标准库的容器之一。std::vectorstd::array是两个适合您提供的用例的示例,您可以在这里找到它们的适当文档。