返回对象数组的函数

时间:2015-03-06 22:21:45

标签: c++ arrays pointers

我有一个结构

class pyatno {


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

这个想法是创建一个函数,它将返回一个pyatno.pyatnoView对象的数组,但是有一个混乱。我不明白我究竟能够访问这个“财产”。我在c ++方面不够强,所以如果它不是真的,或者我说错了,请解释一下,因为我真的很喜欢这个问题。

1 个答案:

答案 0 :(得分:1)

正如你所提到的,你对c ++的态度不是很强,你的问题还不清楚,这里有几个建议。

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

class Foo {
    int some_value;
};

有几种方法可以从对象中检索数据,但是简单来说,你应该将属性设为公共:

class Foo {
public:
    int some_value;
};

或通过访问者/ mutator公开它:

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样式字符串有点特殊,因为它们通常以空字节\0终止,这意味着您通常可以知道字符串结尾的位置,或者它的长度。但是,您不再拥有阵列有多长的信息!例如,这是完全合法的:

#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是两个适合您提供的用例的示例,您可以为他们找到合适的文档here