Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
#1

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

31.03.2013, 12:52. Просмотров 1537. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как вернуть статический массив из метода и присвоить его производному классу? (C++):

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

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

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

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

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

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

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

Добавлено через 3 минуты
делать массив динамическим не надо. надо именно со статическим
пробовал
функцию делать static и объявление массива флоат тоже static, получается ошибка "не получается преобразовать из флоат* в флоат"
0
Nick Alte
Эксперт С++
1637 / 1009 / 119
Регистрация: 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
4286 / 1408 / 121
Регистрация: 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 / 1
Регистрация: 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
4286 / 1408 / 121
Регистрация: 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
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
31.03.2013, 14:26 #8
Цитата Сообщение от Tiva Посмотреть сообщение
эм, а как надо делать наследование, чтоб производные классы имели доступ к полям базового, но при этом из мейна нельзя было иметь доступ к этим полям?
поля объявлять как private, а наследовать public?
protected
1
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
31.03.2013, 14:27  [ТС] #9
объявить наследование протектед, или поля протектед?
0
BumerangSP
4286 / 1408 / 121
Регистрация: 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 / 1
Регистрация: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.03.2013, 14:52
Привет! Вот еще темы с ответами:

Как правильно вернуть итератор из метода - C++
Всем привет. Есть класс обертка над контейнером, который рулит некоторыми сущностями И понадобилось получать итераторы на эти сущности -...

Как очистить статический массив? - C++
у меня в классе обявлен статический массив - static overall_data* array_persone; после класса задаю размер overall_data*...

Как перевести статический массив в динамический? - C++
Есть статический массив типа char,подскажите как перевести его в динамический и как потом изменять его размерность если понадобиться...

Статический массив как член класса - C++
Я туплю, что ли, почему это компилируется? о_О struct V { int v; }; V v1; V v2(v1); // копирование v2 = v1; //...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
31.03.2013, 14:52
Ответ Создать тему
Опции темы

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