Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/10: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Tiva
94 / 94 / 21
Регистрация: 25.04.2012
Сообщений: 429
1

Как вернуть статический массив из метода и присвоить его производному классу?

31.03.2013, 12:52. Просмотров 1915. Ответов 10
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class A
{
    float mas[12];
public:
    float GetMas(){return mas;}
};
class B: public A
{
    B(const A& obj)
    {
         mas=obj.GetMas();
    }
};
int main(void)
{
    A a;
    B b(a);
}
грубо говоря, есть вот такие 2 класса
пишу конструктор копирования, надо в объект класса B скопировать значения из объекта класса А, в классе А - статический массив.
как его вернуть функцией? я уже где только не ставил амперсантов, звездочек, или нулевых индексов, или без всего этого - не получается
Код
error C2440: =: невозможно преобразовать 'float' в 'float [12]'
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2013, 12:52
Ответы с готовыми решениями:

Доступ к производному классу через методы в базовом
Доброго дня! Прошу помощи в решении моей проблемы. Словесно проблему можно...

Можно из функции вернуть статический массив?
Есть функция float calculation_Psi( float Psi_old, float Omega ){ ...

Нужно создать статический массив строк как статический массив указателей на строки. Условние ниже -->
Слова английского текста рассортировать по возрастанию количества заданной...

создать статический массив строк как статический массив указателей на строки, задание ниже -->
Слова английского текста, начинающиеся с гласных букв, рассортировать в...

Объявить статический массив размерности 20. Заполнить его «случайным образом»...
Задача 2. Объявить статический массив размерности 20. Заполнить его...

10
Nagdiel
116 / 115 / 8
Регистрация: 23.12.2012
Сообщений: 195
31.03.2013, 13:40 2
Массив вернуть нельзя. Можно вернуть только указатель на первый элемент массива
0
Tiva
94 / 94 / 21
Регистрация: 25.04.2012
Сообщений: 429
31.03.2013, 13:58  [ТС] 3
Цитата Сообщение от Nagdiel Посмотреть сообщение
Массив вернуть нельзя. Можно вернуть только указатель на первый элемент массива
ну как вернуть указатель на массив из экземпляра базового класса, и заполнить теми же данными массив в экземляре производного класса?

Добавлено через 3 минуты
делать массив динамическим не надо. надо именно со статическим
пробовал
функцию делать static и объявление массива флоат тоже static, получается ошибка "не получается преобразовать из флоат* в флоат"
0
Nick Alte
Эксперт С++
1647 / 1019 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
31.03.2013, 14:02 4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Pirate {
public:
    float* arr()
    {
        return arr_;
    }
private:
    float arr_[10];
};
 
void foo(Pirate& pirate)
{
    for(int i=0; i<10; ++i)
        pirate.arr()[i] = i+1;
}
2
BumerangSP
4287 / 1409 / 463
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
31.03.2013, 14:05 5
Tiva, немного перепишу Ваш пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
class A
{
protected:
    const static size_t n = 12;
    float mas[n];
public:
    A()
    {
         for (int i=0; i<n; ++i)
             mas[i] = i;
    }
    float operator[] (size_t i)
    {
        return mas[i];
    }
    void show()
    {
        for (int i=0; i<n; ++i)
            std::cout<<mas[i]<<' ';
        std::cout<<std::endl;
    }
};
class B: public A
{
    float mas[n];
public:
    B(){}
    B(A& obj)
    {
      for (int i=0; i<n; ++i)
         mas[i] = obj[i];
    }
    void show()
    {
        for (int i=0; i<n; ++i)
            std::cout<<mas[i]<<' ';
        std::cout<<std::endl;
    }
};
int main(void)
{
    A a;
    a.show();
    B b;
    b.show();
    B b1(a);
    b1.show();
    system("pause");
}
Во-первых, у Вас по умолчанию члены базового класса закрыты для производных. Поэтому mas не получится воспользоваться в классе B. Если только объявить свой с таким же именем.
Во-вторых, будь он даже доступен из из класса A, он бы уже содержал данные из его массива (наследование ж).
В-третьих, конструктор в классе B объявлен как private.
В-четвертых, Getmas() должен возвращать указатель на массив (на первых элемент), т.е. float*
В-пятых, там в конструкторе B const не нужен, так бы была -1 ошибка компилятора)
2
Tiva
94 / 94 / 21
Регистрация: 25.04.2012
Сообщений: 429
31.03.2013, 14:17  [ТС] 6
Цитата Сообщение от BumerangSP Посмотреть сообщение
Tiva, немного перепишу Ваш пример:
а вот теперь дальше
оператор [] перегружен только для возвращения mas[i]
а у меня в классе, есть два статических массива float mas[12] и float mas2[12]
делая точно так же, [] - вернет же значение из mas, а не mas2?

Добавлено через 3 минуты
Цитата Сообщение от BumerangSP Посмотреть сообщение
Во-первых, у Вас по умолчанию члены базового класса закрыты для производных. Поэтому mas не получится воспользоваться в классе B. Если только объявить свой с таким же именем.
Во-вторых, будь он даже доступен из из класса A, он бы уже содержал данные из его массива (наследование ж).
В-третьих, конструктор в классе B объявлен как private.
эм, а как надо делать наследование, чтоб производные классы имели доступ к полям базового, но при этом из мейна нельзя было иметь доступ к этим полям?
поля объявлять как private, а наследовать public?
0
BumerangSP
4287 / 1409 / 463
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
31.03.2013, 14:24 7
Цитата Сообщение от Tiva Посмотреть сообщение
есть два статических массива float mas[12] и float mas2[12]
Да можно той же функцией сделать.
Это в A:
C++
1
2
3
4
5
    void getmas(float *mas)
    {
         for (int i=0; i<n; ++i)
          mas[i] = this->mas[i];
    }
Конструктор B:
C++
1
2
3
4
5
B(A& obj)
    {
        obj.getmas(mas);
                obj.getmas(mas1);
    }
...
C++
1
2
3
4
5
6
7
8
9
void show()
    {
        for (int i=0; i<n; ++i)
            std::cout<<mas[i]<<' ';
        std::cout<<std::endl<<'\n';
         for (int i=0; i<n; ++i)
            std::cout<<mas1[i]<<' ';
        std::cout<<std::endl;
    }
Просто нужно доступ к скрытым членам получить.

Цитата Сообщение от Tiva Посмотреть сообщение
эм, а как надо делать наследование, чтоб производные классы имели доступ к полям базового, но при этом из мейна нельзя было иметь доступ к этим полям?
объявить как protected:
1
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
31.03.2013, 14:26 8
Цитата Сообщение от Tiva Посмотреть сообщение
эм, а как надо делать наследование, чтоб производные классы имели доступ к полям базового, но при этом из мейна нельзя было иметь доступ к этим полям?
поля объявлять как private, а наследовать public?
protected
1
Tiva
94 / 94 / 21
Регистрация: 25.04.2012
Сообщений: 429
31.03.2013, 14:27  [ТС] 9
объявить наследование протектед, или поля протектед?
0
BumerangSP
4287 / 1409 / 463
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
31.03.2013, 14:29 10
Да вот только не понял: нужно чтобы члены производного класса были = членам базового? Так они и так будут равны, если их не переобъявлять и не присваивать новых знаяений:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
class A
{
    float mas[12];
public:
     A()
    {
         for (int i=0; i<12; ++i)
             mas[i] = i;
    }
      void show()
    {
        for (int i=0; i<12; ++i)
            std::cout<<mas[i]<<' ';
        std::cout<<std::endl;
    }
};
class B: public A
{
public:
};
 
int main(void)
{
    A a;
    a.show();
    B b;
    b.show();
    system("pause");
}
Добавлено через 25 секунд
Цитата Сообщение от Tiva Посмотреть сообщение
объявить наследование протектед, или поля протектед?
Поля, у меня ж написано в коде выше.
1
Tiva
94 / 94 / 21
Регистрация: 25.04.2012
Сообщений: 429
31.03.2013, 14:52  [ТС] 11
Цитата Сообщение от BumerangSP Посмотреть сообщение
Да можно той же функцией сделать.
Это в A:
C++
1
2
3
4
5
    void getmas(float *mas)
    {
         for (int i=0; i<n; ++i)
          mas[i] = this->mas[i];
    }
Конструктор B:
C++
1
2
3
4
5
B(A& obj)
    {
        obj.getmas(mas);
                obj.getmas(mas1);
    }
копирует только mas
mas1 из А в В не копируется.

Добавлено через 4 минуты
все, исправил, работает, спасибо
0
31.03.2013, 14:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.03.2013, 14:52

Создать статический массив на 10 элементов и заполнить его случайными числами из диапазона [0;5]
Знает кто-то, как решить задачу на С++? Создать статический массив на 10...

Как правильно вернуть итератор из метода
Всем привет. Есть класс обертка над контейнером, который рулит некоторыми...

Функция: создать динамический массив, состоящий из n натуральных чисел и вернуть его из функции
Пришёл к вам за советом. Вот задание. Напишите функцию int* naturals(int n),...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru