类接受和返回数组

时间:2015-07-29 13:09:14

标签: c++ arrays

我尝试创建一个接受并返回数组的类,但是我遇到了一些问题。我不确定从类中返回一个数组是否合法。或者可以通过返回指向数组的指针来完成。感谢您解决问题。

#include <iostream>
using namespace std;

class myclass {
private:
    int Array[10];

public:
    myclass (int temp[10]) {
        for (int i = 0; i < 10; i++) {
            Array [i] = temp [i];
        }
    }


    int returnArray () {
        return Array; // error here, I'm not sure if it is legal to return an array.
    }

    int* returnArray2 () {
        return this->Array; // hope it will return a pointer to the array
    }
};


int main () {
    int Array[10] = {1,2,3,4,5,6,7,8,9};
    myclass A(Array);
    cout << A.returnArray() << endl; // try to return an array and print it.

    myclass* ptr = &A;
    cout << *ptr->returnArray2 << endl; // error here
    return 0;
}

3 个答案:

答案 0 :(得分:2)

首先,最好像

一样编写构造函数
myclass ( const int ( &temp )[10] ) {
    for (size_t i = 0; i < 10; i++) {
        Array [i] = temp [i];
    }
}

或喜欢

myclass ( int temp[], size_t n ) : Array {} {

    if ( n > 10 ) n = 10;
    for (size_t i = 0; i < n; i++) {
        Array [i] = temp [i];
    }
}

甚至你可以定义两个构造函数。

对于返回值,您可能不会返回数组。您可以返回对数组的引用或指向整个数组的指针或指向其第一个元素的指针

例如

int ( &returnArray () )[10] {
    return Array; 
}

在这种情况下,您可以在主

中书写
for ( int x : A.returnArray() ) std::cout << x << ' ';
std::cout << std::endl;

至于这句话

cout << *ptr->returnArray2 << endl; // error here

然后你忘了在returnArray2之后放置括号。写

cout << *ptr->returnArray2() << endl;

以下成员函数是错误的,因为return语句中的表达式具有类型int *,而函数的返回类型是int

int returnArray () {
    return Array; // error here, I'm not sure if it is legal to return an array.
}

因此,如果指定其返回类型如int *,则该函数将与第二个成员函数重合。或者您可以将返回表达式更改为*Array

答案 1 :(得分:0)

int returnArray () {
    return Array; // error here, I'm not sure if it is legal to return an array.
}

这是非法的,因为Array不属于int类型。但是,returnArray2有效。至于这一行:

cout << *ptr->returnArray2 << endl; // error here

这是非法的,因为returnArray2功能;你必须调用它才能返回int*

cout << *ptr->returnArray2() << endl; // prints the first value in the array

其他说明:

  • 你的资本化是倒退的;你应该打电话给你的班级MyClass和你的成员阵列arrarr_,否则你会让很多人感到困惑。
  • return this->Array;这是多余的,您可以简单地return Array;
  • 如果您还没有听说过std::vectorstd::array,那么您应该对它们进行研究,因为它们通常优于C风格的阵列。

答案 2 :(得分:0)

一般情况下,我建议您阅读一本c ++书籍,以确保您的基础知识正确,因为您发布的代码中存在很多问题。

关于在类公共API中公开C样式数组的主要问题,这不是一个非常强大的机制。如果由于现有代码绝对必要,但是如果可能的话更喜欢使用std :: vector。你最常总会得到更好的代码。

其他答案已经纠正了您的编码错误,所以我不再重复了。

另一件事,您的代码表明数组大小是固定的。您也可以通过引用传递和返回数组。请参阅:General rules of passing/returning reference of array (not pointer) to/from a function?