【问题标题】:Class accept and return array类接受并返回数组
【发布时间】:2015-10-20 11:44:06
【问题描述】:

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

#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;
}

【问题讨论】:

  • 你打算用数组做什么?你的目标是什么?

标签: c++ arrays


【解决方案1】:

首先,构造函数最好写成这样

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; 
}

在这种情况下,您可以在 main 中编写

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

【讨论】:

  • 感谢您的解决方案,这正是我所需要的。语法 "int ( &returnArray () )[10] {} "对我来说是新的,因为我开始学习 C++ 才几周。
  • @goofy 初学者应该互相帮助。:)
【解决方案2】:
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-&gt;Array;这是多余的,你可以简单地return Array;
  • 如果您还没有听说过 std::vectorstd::array,您应该研究一下它们,因为它们通常优于 C 样式数组。

【讨论】:

  • 您的第一个“注释”非常主观。虽然我使用与您相同的约定,但请不要将其视为绝对!
  • 我想是的......虽然当 SE 将 Array 着色为类型名时会令人困惑!
  • 除非那不是你的风格!
【解决方案3】:

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

关于在类公共 API 中公开 C 样式数组的主要问题,这不是一个非常健壮的机制。如果由于现有代码而绝对必要,请执行此操作,但如果可能更喜欢使用 std::vector。您通常会得到更好的代码。

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

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

【讨论】:

    猜你喜欢
    • 2018-09-19
    • 2018-09-08
    • 2015-02-10
    • 2019-07-28
    • 2018-06-12
    • 2011-10-11
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    相关资源
    最近更新 更多