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

Объявление константы и массива в классе - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 54, средняя оценка - 4.91
zabludshiy
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 34
02.12.2012, 20:40     Объявление константы и массива в классе #1
Задача:
1. объявить константу в созданном классе и сделать ее видимой для всех методов данного класса;
2. объявить массив, размер которого определяет созданная константа.
Среда разработки Visual C++ 6.0

В итоге у меня получилось:
C++
1
2
3
4
5
6
7
8
9
10
11
// MyClass.h: interface for the MyClass class.
 
class MyClass  
{
    static const RANGE_VERH;
    // нужно ли здесь объявлять так int MyMass[RANGE_VERH] или может так int MyMass[] или нет не пойму;
public:
    MyClass();
    virtual ~MyClass();
 
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// MyClass.cpp: implementation of the MyClass class.
 
const MyClass::RANGE_VERH = 100;
 
MyClass::MyClass()
{
    int MyMass[RANGE_VERH];
}
 
MyClass::~MyClass()
{
 
}
С инициализацией константы есть сомнения поэтому интересует, как все-таки правильно объявлять и инициализировать константу в создаваемом классе, чтобы потом ее можно было использовать в конструкторе и любом методе класса. По поводу массива тоже не понял, нужно ли его объявлять в MyClass.h, а инициализировать в MyClass.cpp или сразу объявить в описании конструктора MyClass.cpp? Если да, то как и где правильно объявить массив с размером, заданным константой в создаваемом классе?
Если я объявляю массив в файле MyClass.cpp, не объявляя его в MyClass.h, а константы объявляю, как указано в примере в MyClass.h:
C++
1
static const RANGE_VERH;
, а в MyClass.cpp:
C++
1
сonst MyClass::RANGE_VERH = 100;
) компилятор ошибок не выдал, но правильно ли такое объявление?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2012, 20:40     Объявление константы и массива в классе
Посмотрите здесь:

объявление файловых потоков в классе C++
Объявление в классе объекта другого класса C++
C++ Непонятное объявление в классе
Объявление константы в классе C++
Объявление переменных в классе C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6164 / 2893 / 282
Регистрация: 04.12.2011
Сообщений: 7,693
Записей в блоге: 3
03.12.2012, 18:39     Объявление константы и массива в классе #2
Цитата Сообщение от zabludshiy Посмотреть сообщение
Задача:
1. объявить константу в созданном классе и сделать ее видимой для всех методов данного класса;
2. объявить массив, размер которого определяет созданная константа.
Всем методам и всем переменным класса это не одно и тоже. Тут нигде не видно, другими словами, что константа должна быть статической. Вот как это может быть морозным утром, сквозь запотевшее стекло:
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <iostream>
using namespace std;
template <class ArrType> class MyClass {
    const int RANGE_VERH;
    ArrType* pArr;
 
 void init(ArrType* externArr){
     try{
pArr= new ArrType[RANGE_VERH];
     }
     catch(...){
cout<<"Ошибка выделения памяти"<< endl;
system("PAUSE");
exit(1);
     }
     if(externArr){
for(int i=0; i<RANGE_VERH; ++i) pArr[i]=externArr[i];
     }else{
    
for(int i=0; i<RANGE_VERH; ++i) pArr[i]=0;
     }
    }
public:
    explicit MyClass():RANGE_VERH(3){init(0);}
    MyClass(int _sz):RANGE_VERH(_sz){init(0);}
    MyClass(int _sz, ArrType* extArr):RANGE_VERH(_sz){init(extArr);}
MyClass(const MyClass &refToOrig):RANGE_VERH(refToOrig.getSz()){
init(refToOrig.getMyArr());
}
int getSz()const{return RANGE_VERH;};
ArrType* getMyArr()const{return pArr;}
 
~MyClass(){delete [] pArr;};
void showMyArr() const {
for(int i=0; i<RANGE_VERH; ++i) cout<<pArr[i]<<" "<<endl;
cout<<endl;
 }
ArrType& operator[](int ind) const {
if(ind>=0&&ind<RANGE_VERH){
return pArr[ind];
}else{
cout<<"Недопустимый индекс "<<ind<<" при размере "<<RANGE_VERH;
cout << endl;
system("PAUSE");
exit(1);
}
}
};
int main() {
setlocale(0, "rus");
int siz=5;
int Ar[]={-1, 2, 0, 4, 6};
cout<<"init by Array\n";
MyClass<int> varMyClbyArr(siz,Ar);
varMyClbyArr.showMyArr();
MyClass<int> varMyCl(siz);
cout<<"explicit init by zeroes\n";
varMyCl.showMyArr();
cout<<"init by cycle\n";
for (int i=0; i<siz; i++)varMyCl[i]=i*i;
varMyCl.showMyArr();
MyClass<int> copyOfvarMyCl=varMyCl;
cout<<"init by copy\n";
copyOfvarMyCl.showMyArr();
varMyCl[10]=10;
cout << endl;
system("PAUSE");
return 0;
}
А размер лучше бы не константой сделать. Вдруг захочется resize() сделать? Но задание, есть задание.
zabludshiy
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 34
03.12.2012, 22:06  [ТС]     Объявление константы и массива в классе #3
Сложноватый пример для меня, как начинающего А если не константой, то с помощью чего? И чтобы видимость значения размера была доступна во всем файле MyClass.cpp?
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6164 / 2893 / 282
Регистрация: 04.12.2011
Сообщений: 7,693
Записей в блоге: 3
03.12.2012, 22:57     Объявление константы и массива в классе #4
Цитата Сообщение от zabludshiy Посмотреть сообщение
Сложноватый пример для меня, как начинающего А если не константой, то с помощью чего? И чтобы видимость значения размера была доступна во всем файле MyClass.cpp?
Почему не константой? Что бы при необходимости менять размер массива. Но я написал вариант с константным полем, поскольку, похоже у Вас задание такое.
Область видимости полей класса, - его методы. Вам же нужно, чтобы им было доступным поле RANGE_VERH? Оно и так доступно. Должно ли оно быть константным? Вообще нет. Но если задание такое, то пусть будет константным, повторяю, а вот если Вы сделаете его ещё и статическим, то это поле перестанет быть полем экземпляра (у каждого своё), а станет принадлежать всему типу (одно общее на всех). В задании, как оно Вами сформулировано в первом посте, нет требования делать его статическим. Да и не логично это, так как тогда все массивы будут одного размера. Об этом я и сказал. Так как показано в примере, - поле создается, инициализируется и не может быть изменено после этого. То есть это константа, но своя у каждого экземпляра класса.

Добавлено через 14 минут
Вот для массива целого типа, тоже самое.
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
using namespace std;
class MyClass {
    const int RANGE_VERH;
    int* pArr;
 void init(int* externArr){
     try{
pArr= new int[RANGE_VERH];
     }
     catch(...){
cout<<"Ошибка выделения памяти"<< endl;
system("PAUSE");
exit(1);
     }
     if(externArr){
for(int i=0; i<RANGE_VERH; ++i) pArr[i]=externArr[i];
     }else{
for(int i=0; i<RANGE_VERH; ++i) pArr[i]=0;
     }
    }
public:
    explicit MyClass():RANGE_VERH(3){init(0);}
    MyClass(int _sz):RANGE_VERH(_sz){init(0);}
    MyClass(int _sz, int* extArr):RANGE_VERH(_sz){init(extArr);}
MyClass(const MyClass &refToOrig):RANGE_VERH(refToOrig.getSz()){
init(refToOrig.getMyArr());
}
int getSz()const{return RANGE_VERH;};
int* getMyArr()const{return pArr;}
~MyClass(){delete [] pArr;};
void showMyArr() const {
for(int i=0; i<RANGE_VERH; ++i) cout<<pArr[i]<<" "<<endl;
cout<<endl;
 }
int& operator[](int ind) const {
if(ind>=0&&ind<RANGE_VERH){
return pArr[ind];
}else{
cout<<"Недопустимый индекс "<<ind<<" при размере "<<RANGE_VERH;
cout << endl;
system("PAUSE");
exit(1);
}
}
};
int main() {
setlocale(0, "rus");
int siz=5;
int Ar[]={-1, 2, 0, 4, 6};
cout<<"init by Array\n";
MyClass varMyClbyArr(siz,Ar);
varMyClbyArr.showMyArr();
MyClass varMyCl(siz);
cout<<"explicit init by zeroes\n";
varMyCl.showMyArr();
cout<<"init by cycle\n";
for (int i=0; i<siz; i++)varMyCl[i]=i*i;
varMyCl.showMyArr();
MyClass copyOfvarMyCl=varMyCl;
cout<<"init by copy\n";
copyOfvarMyCl.showMyArr();
varMyCl[10]=10;
cout << endl;
system("PAUSE");
return 0;
}
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,575
Записей в блоге: 17
03.12.2012, 23:25     Объявление константы и массива в классе #5
Не совсем понятно что нужно...
Если она нужна во всем файле зачем её в класс пихать ?
Но если так надо делай ее static.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//---------------------------------------------------------------------------
class MyClass
{
        const int  _size;
        int* _array;
public:
        MyClass():_size(10),_array(new int[_size])
            {
                for(int i=0; i<_size; i++) _array[i]=0;
            };
        virtual ~MyClass(){ delete[] _array; };
        int size()const{ return _size;}
        int& operator[](int index){ return _array[index]; }
        int& at(int index)
            {
                if(index>=_size) throw std::out_of_range("Выход за граници массива");
                return  _array[index];
            }
};
//---------------------------------------------------------------------------
Yandex
Объявления
03.12.2012, 23:25     Объявление константы и массива в классе
Ответ Создать тему
Опции темы

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