С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
zero-11
0 / 0 / 0
Регистрация: 21.03.2014
Сообщений: 56
#1

Использование конструктора на С++ - C++

02.04.2014, 17:53. Просмотров 402. Ответов 8
Метки нет (Все метки)

Дошел до конструктора и деструктора - которые используются, для инициализации членов класса, написал программу и не хочет компилироваться, выдает:

Код
fatal error LNK1120: 1 неразрешенных внешних элементов
Cсылается на private - не возможность обратится к переменной - члену класса используя косвенный доступ, привожу код:

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
#include<iostream>
 
class Cat
    
{
public:
    Cat(int initialAge);
    ~Cat();
    int GetAge();
    void SetAge( int age);
    void Meow();
private:
    int itsAge();
};
 
Cat::Cat(int initialAge)
{
    int itsAge = initialAge;
}
 
Cat::~Cat()
{
}
 
int Cat::GetAge()
{
    return itsAge();
};
 
void Cat::SetAge( int age)
{
    int itsAge = age;
};
 
void Cat::Meow()
{
    std::cout << "Meow/n";
};
 
int main()
{
    Cat Frisky(5);
    Frisky.Meow();
    std::cout << "Frisky is a cat who is ";
    std::cout << Frisky.GetAge() << " yers old.\n";
    Frisky.Meow();
    Frisky.SetAge(7);
    std::cout << "Now Frisky is " ;
    std::cout << Frisky.GetAge() << "years old /n";
    system ("PAUSE");
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2014, 17:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Использование конструктора на С++ (C++):

Использование конструктора - C++
Здравствуйте! Недавно начал изучать классы. Хочу создать динамический массив объектов: #include &lt;iostream&gt; #include &lt;cstdlib&gt; ...

Использование конструктора абстрактного класса - C++
Добрый вечер. Подскажите, как вызвать конструктор абстрактного класса из производного класса? Пытаюсь вызвать так: Advertising*...

Использование конструктора класса-шаблона - C++
Есть функция, которая принимает шаблон класса, но при попытке использовать конструктор возникает ошибка, как быть?

Грамотное использование конструктора копирования - C++
Всем добрый вечер. Есть класс list(двухсвязный). Задача гласит: Сгенерировать некоторую последовательность чисел, вывести на экран, и затем...

Использование конструктора с параметром istream - C++
Данное упражнение с книжки Липпмана. Нужно добавить в класс конструктор с параметром istream, а потом в программе конструктор с данным...

Использование конструктора базового класса наследником - C++
Доброго дня, коллеги! Решал одну задачку и столкнулся с проблемой. По условию дан класс String, моделирующий работу типа данных string....

8
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,536
02.04.2014, 17:56 #2
Цитата Сообщение от zero-11 Посмотреть сообщение
int itsAge();
Не определена.
Цитата Сообщение от zero-11 Посмотреть сообщение
int itsAge = initialAge;
Переменная перестанет существоваться по выходу из конструктора. Зачем она?
1
recoder
130 / 130 / 28
Регистрация: 13.09.2013
Сообщений: 260
Записей в блоге: 2
02.04.2014, 18:07 #3
разбирайтесь
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>
#include <cstdlib>
 
class Cat
    
{
public:
    Cat(int initialAge);
    ~Cat();
    int GetAge();
    void SetAge( int age);
    void Meow();
private:
    int itsAge;
};
 
Cat::Cat(int initialAge) :
itsAge(initialAge)
{}
 
Cat::~Cat()
{}
 
int Cat::GetAge()
{
    return itsAge;
};
 
void Cat::SetAge( int age)
{
    itsAge = age;
};
 
void Cat::Meow()
{
    std::cout << "Meow/n";
};
 
int main()
{
    Cat Frisky(5);
    Frisky.Meow();
    std::cout << "Frisky is a cat who is ";
    std::cout << Frisky.GetAge() << " yers old.\n";
    Frisky.Meow();
    Frisky.SetAge(7);
    std::cout << "Now Frisky is " ;
    std::cout << Frisky.GetAge() << "years old /n";
    system ("PAUSE");
};
0
zero-11
0 / 0 / 0
Регистрация: 21.03.2014
Сообщений: 56
02.04.2014, 19:31  [ТС] #4
Здесь объявлено. что конструктор класса инициализируются целочисленным значением :

Код
 int itsAge = initialAge;
переменной членом класса и для установления возраста не нужно прибегать к открытым функциям доступа - а достаточно передать в качестве параметра целочисленное значение

Cat Frisky(5) - целочисленное значение

а далее необходимо вызвать SetAge - для установки возраста созданного объекта Frisky:

Код
Frisky.SetAge(7);
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.04.2014, 01:06 #5
itsAge зачем функцией сделали?
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
class Cat
    
{
public:
    Cat(int initialAge);
    ~Cat();
    int GetAge();
    void SetAge( int age);
    void Meow();
private:
    int itsAge;
};
 
Cat::Cat(int initialAge)
{
    itsAge = initialAge;
}
 
Cat::~Cat()
{
}
 
int Cat::GetAge()
{
    return itsAge;
};
 
void Cat::SetAge( int age)
{
    itsAge = age;
};
 
void Cat::Meow()
{
    std::cout << "Meow/n";
};
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6513 / 3150 / 309
Регистрация: 04.12.2011
Сообщений: 8,720
Записей в блоге: 5
03.04.2014, 02:25 #6
Цитата Сообщение от zero-11 Посмотреть сообщение
private: int itsAge();
это действительно метод а не переменная и к тому же закрытый и неопределённый, но если даже написать private: int itsAge;
не будет лучше.
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
#include <iostream>
using namespace std;
class Cat{
public:
Cat::Cat(int a);
int get(){return age;}
private:
int age;
};
Cat::Cat(int a){
//тело определения класса - внешняя область видимости для метода (конструктор это метод)
int age = a;//поэтому тут локальное объявление имени age затеняет (скрывает) имя поля age
//поэтому поле не будет инициализировано, а локальная переменная исчезнет по выходу из конструктора
 
Cat::age = a;//но добраться к нему можно теперь так. Это для того, чтобы было понятно, что произошло
}
 
int main(){
Cat frisky(5);
cout<<frisky.get();//5 но если закомментировать Cat::age = a; будет мусор
cout<<endl;
system("pause"); 
    return 0; 
}
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
03.04.2014, 08:12 #7
IGPIGP, нет Cat::age (это же не статическая переменная), а this->age.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6513 / 3150 / 309
Регистрация: 04.12.2011
Сообщений: 8,720
Записей в блоге: 5
03.04.2014, 11:19 #8
Цитата Сообщение от Tulosba Посмотреть сообщение
IGPIGP, нет Cat::age (это же не статическая переменная), а this->age.
Для области видимости метода :: и this-> работают одинаково, ведь не может быть одновременно объявленo поле и статическая переменная с одним именем. У моего А вне данной зоны видимости обращение к полю через класс невозможно. Но там и через скрытый указатель на экземпляр не выйдет. Так как нет его там. Мой компилятор позволяет написать Cat::age.
Обычно, когда пишут о случае затенения показывают доступ через оператор разрешения :: и показалось, что так понятнее для объяснения:
Цитата Сообщение от IGPIGP Посмотреть сообщение
//но добраться к нему можно теперь так. Это для того, чтобы было понятно, что произошло
Хотя Вы правы, this->a правильно во всех отношениях.
1
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
03.04.2014, 12:03 #9
Цитата Сообщение от IGPIGP Посмотреть сообщение
Для области видимости метода :: и this-> работают одинаково
Хм-м. Действительно работает. Как-то не приходилось использовать :: вместо this в данном случае. Надо будет разобраться поподробнее что к чему.
1
03.04.2014, 12:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.04.2014, 12:03
Привет! Вот еще темы с ответами:

Использование конструктора базового класса при динамическом выделении памяти - C++
Есть базовый класс, от него наследуются несколько классов, свой конструктор я определил в базовом классе. Далее нужно сделать так:parent...

В чём отличия конструктора копирования и конструктора перемещения? Где и как их нужно использовать? - C++
Помогите разобраться в копирующем и перемещающем конструкторах. В чём их существенное отличие и какой плюс от использования перемещающего...

Ввод данных в функции конструктора и использование их в перегруженной функции - C++
Вот собственно код, как его исправить, что бы не было ошибки. Пишет что переменные не объявлены. Это вполне естественно. Но как сделать...

Работа с двумерными числовыми массивами. Использование указателей. Использование функций пользователя. - C++
Помогите пожалуйста!!!!!!! Сделать три варианта: первый вариант – передача данных между функциями с помощью глобального...


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

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

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