2015-07-29 5 views
1

Я пытаюсь создать класс, который принимает и возвращает массив, но у меня есть некоторые проблемы. Я не уверен, что законно возвращать массив из класса. Или это можно сделать, возвращая указатель на массив. Благодарим за любое решение проблемы.Класс принимает и возвращает массив

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

тогда вы забыли поставить скобки после повторного turnArray2. Написать

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

И следующая функция член неправильно, потому что выражение в ответном заявлении имеет тип int * в то время как тип возвращаемого значения функции int

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

Так как функция будет совпадать с второй член, если вы укажете его тип возврата, например int *.Или вы могли бы изменить выражение возврата на *Array

+0

Спасибо за ваше решение, и это то, что мне нужно. Синтаксис «int (& returnArray()) [10] {}» для меня новичок, потому что я начал изучать C++ всего за несколько недель. – goofy

+0

@goofy Начинающие должны помогать друг другу. :) –

+0

;-) Спасибо за вашу поддержку – goofy

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 и вашему члену arr или arr_, иначе вы соберете много людей.
  • return this->Array; это является излишним, вы можете просто return Array;
  • Если вы еще не слышали о std::vector и std::array вы должны исследовать те, поскольку они, как правило, превосходят массивы C-стиле.
+1

Ваша первая «заметка» очень субъективна. Хотя я использую то же соглашение, что и вы, пожалуйста, не считайте его абсолютным! –

+0

Я полагаю, что так ... хотя это сбивает с толку, когда цвета SE 'Array' как typename! – Arcinde

+0

Только если это не ваш стиль! –

0

В общем, я бы предложил прочитать книгу на C++, чтобы правильно понять ваши основы, поскольку в коде, который вы опубликовали, есть много проблем.

Что касается вашего основного вопроса об экспонировании массивов стиля C в API открытого класса, это не очень надежный механизм. Сделайте это, если это абсолютно необходимо из-за существующего кода, но по возможности предпочитает использовать std :: vector. В большинстве случаев вы получите лучший код.

Другие ответы скорректировали ваши ошибки кодирования, поэтому я не буду повторять это.

Еще одна вещь, ваш код предполагает, что размер массива фиксирован. Вы можете передать и вернуть массив по ссылке. Обратитесь к: General rules of passing/returning reference of array (not pointer) to/from a function?

Смежные вопросы