Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/47: Рейтинг темы: голосов - 47, средняя оценка - 4.68
96 / 96 / 21
Регистрация: 25.04.2012
Сообщений: 449

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

31.03.2013, 12:52. Показов 9146. Ответов 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 скопировать значения из объекта класса А, в классе А - статический массив.
как его вернуть функцией? я уже где только не ставил амперсантов, звездочек, или нулевых индексов, или без всего этого - не получается
Code
1
error C2440: =: невозможно преобразовать 'float' в 'float [12]'
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.03.2013, 12:52
Ответы с готовыми решениями:

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

Как вернуть 2d массив из метода и вывести в textBox\listBox
Суть задачи создать матрицу, и поменять в ней местами выбранные строки(строка1,строка2) с помощь метода SwapRow(матрица, строки,...

Можно из функции вернуть статический массив?
Есть функция float calculation_Psi( float Psi_old, float Omega ){ Psi_old=0.221; return Psi_old; } На входе принимает...

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

Добавлено через 3 минуты
делать массив динамическим не надо. надо именно со статическим
пробовал
функцию делать static и объявление массива флоат тоже static, получается ошибка "не получается преобразовать из флоат* в флоат"
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
31.03.2013, 14:02
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
4311 / 1423 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
31.03.2013, 14:05
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
96 / 96 / 21
Регистрация: 25.04.2012
Сообщений: 449
31.03.2013, 14:17  [ТС]
Цитата Сообщение от BumerangSP Посмотреть сообщение
Tiva, немного перепишу Ваш пример:
а вот теперь дальше
оператор [] перегружен только для возвращения mas[i]
а у меня в классе, есть два статических массива float mas[12] и float mas2[12]
делая точно так же, [] - вернет же значение из mas, а не mas2?

Добавлено через 3 минуты
Цитата Сообщение от BumerangSP Посмотреть сообщение
Во-первых, у Вас по умолчанию члены базового класса закрыты для производных. Поэтому mas не получится воспользоваться в классе B. Если только объявить свой с таким же именем.
Во-вторых, будь он даже доступен из из класса A, он бы уже содержал данные из его массива (наследование ж).
В-третьих, конструктор в классе B объявлен как private.
эм, а как надо делать наследование, чтоб производные классы имели доступ к полям базового, но при этом из мейна нельзя было иметь доступ к этим полям?
поля объявлять как private, а наследовать public?
0
 Аватар для BumerangSP
4311 / 1423 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
31.03.2013, 14:24
Цитата Сообщение от 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
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
31.03.2013, 14:26
Цитата Сообщение от Tiva Посмотреть сообщение
эм, а как надо делать наследование, чтоб производные классы имели доступ к полям базового, но при этом из мейна нельзя было иметь доступ к этим полям?
поля объявлять как private, а наследовать public?
protected
1
96 / 96 / 21
Регистрация: 25.04.2012
Сообщений: 449
31.03.2013, 14:27  [ТС]
объявить наследование протектед, или поля протектед?
0
 Аватар для BumerangSP
4311 / 1423 / 463
Регистрация: 16.12.2010
Сообщений: 2,939
Записей в блоге: 3
31.03.2013, 14:29
Да вот только не понял: нужно чтобы члены производного класса были = членам базового? Так они и так будут равны, если их не переобъявлять и не присваивать новых знаяений:
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
96 / 96 / 21
Регистрация: 25.04.2012
Сообщений: 449
31.03.2013, 14:52  [ТС]
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.03.2013, 14:52
Помогаю со студенческими работами здесь

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

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

Как присвоить фон к css классу в модуле?
Привет всем. Суть: есть модуль &quot;тор пользователей&quot;(utop) в нем выводятся аватары пользователей. На рисунке синим обозначен блок в котором...

Как присвоить значение полю по имени? Класс статический
Здраствуйте! У меня есть статический класс Comm. Внутри него есть функция static public SetValueByFieldName(string fieldName) ...

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru