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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
31.03.2013, 12:52     Как вернуть статический массив из метода и присвоить его производному классу? #1
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]'
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2013, 12:52     Как вернуть статический массив из метода и присвоить его производному классу?
Посмотрите здесь:

C++ Как перевести статический массив в динамический?
C++ Как инициализировать статический константный массив в классе?
Указатель на статический массив как параметр шаблона C++
Объявить статический массив размерности 20. Заполнить его «случайным образом»... C++
C++ Как очистить статический массив?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nagdiel
 Аватар для Nagdiel
114 / 114 / 3
Регистрация: 23.12.2012
Сообщений: 195
31.03.2013, 13:40     Как вернуть статический массив из метода и присвоить его производному классу? #2
Массив вернуть нельзя. Можно вернуть только указатель на первый элемент массива
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
31.03.2013, 13:58  [ТС]     Как вернуть статический массив из метода и присвоить его производному классу? #3
Цитата Сообщение от Nagdiel Посмотреть сообщение
Массив вернуть нельзя. Можно вернуть только указатель на первый элемент массива
ну как вернуть указатель на массив из экземпляра базового класса, и заполнить теми же данными массив в экземляре производного класса?

Добавлено через 3 минуты
делать массив динамическим не надо. надо именно со статическим
пробовал
функцию делать static и объявление массива флоат тоже static, получается ошибка "не получается преобразовать из флоат* в флоат"
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 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;
}
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 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 ошибка компилятора)
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?
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 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:
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
31.03.2013, 14:26     Как вернуть статический массив из метода и присвоить его производному классу? #8
Цитата Сообщение от Tiva Посмотреть сообщение
эм, а как надо делать наследование, чтоб производные классы имели доступ к полям базового, но при этом из мейна нельзя было иметь доступ к этим полям?
поля объявлять как private, а наследовать public?
protected
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
31.03.2013, 14:27  [ТС]     Как вернуть статический массив из метода и присвоить его производному классу? #9
объявить наследование протектед, или поля протектед?
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 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 Посмотреть сообщение
объявить наследование протектед, или поля протектед?
Поля, у меня ж написано в коде выше.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.03.2013, 14:52     Как вернуть статический массив из метода и присвоить его производному классу?
Еще ссылки по теме:

C++ Статический массив как член класса
Доступ к производному классу через методы в базовом C++
C++ Как очистить статический массив структур?

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

Или воспользуйтесь поиском по форуму:
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 минуты
все, исправил, работает, спасибо
Yandex
Объявления
31.03.2013, 14:52     Как вернуть статический массив из метода и присвоить его производному классу?
Ответ Создать тему
Опции темы

Текущее время: 13:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru