Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 30.03.2013
Сообщений: 28
1

Статические поля и unresolved символы

01.05.2013, 13:18. Просмотров 700. Ответов 9
Метки нет (Все метки)

пытаюсь создать модель аквариума на с++ ...использую в качестве аквариума класс со статическими полями...при компиляции пишет "Ошибка 9 error LNK1120: неразрешенных внешних элементов: 8" тоесть unresolved... что нужно сделать? приведу код если если пригодиться

сам класс
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
#pragma once
 
#include <iostream>
#include <vector>
#include "Inhabitant.h"
#include "Animal.h"
#include "Fish.h"
#include "Plant.h"
 
using namespace std;
 
class Aquarium
{
public:
     static double Volume;
    
     static double Temperatur;
 
     static double PH;
 
     static double Contamination;
 
     static bool Filled;
 
     static double Korm;
 
     static int Size;
 
     static Inhabitant* Inhabitants[];
 
};

вот где используется
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#include "Animal.h"
#include "Plant.h"
#include "Aquarium.h"
#include <iostream>
 
using namespace std;
 
Animal::Animal(){ Entity = animal; }
 
void Animal::Show()
{
    cout << "Состояние животного под именем: " << Name << endl <<
        "Животное типа: " << AnimalType << endl << 
        "Состояние здоровья: " << Hp << " (" << Health << ") " << endl <<
        "Состояние насыщения: " << Satiety << " (" << Hunger << ") " << endl;
}
 
void Animal::Settle()
{
    cout << "Введите имя нового животного (1..10): \t";
    cin >> Name;
 
    cout << endl << "Выберите тип животного" << endl;
    cout << "1: Улитка" << endl << 
        "2: Моллюск" << endl << 
        "3: Морской конек" << endl;
 
    char num;
    cin >> num;
 
    switch (num)
    {
    case('1'): AnimalType = cochlea;
        NatureVolume = 6;
        NatureTemperaturMin = 18;
        NatureTemperaturMax = 28;
        NaturePHMin = 4;
        NaturePHMax = 6.5;
        break;
    case('2'): AnimalType = mollusk;
        NatureVolume = 10;
        NatureTemperaturMin = 10;
        NatureTemperaturMax = 42;
        NaturePHMin = 4;
        NaturePHMax = 6.5;
        break;
    case('3'): AnimalType = hippocampus;
        NatureVolume = 2;
        NatureTemperaturMin = 24;
        NatureTemperaturMax = 26;
        NaturePHMin = 5;
        NaturePHMax = 8;
        break;
    default:
        cout << "Вы ввели неправильный номер, животное по умолчанию стало улиткой" << endl;
        AnimalType = cochlea;
        NatureVolume = 6;
        NatureTemperaturMin = 18;
        NatureTemperaturMax = 28;
        NaturePHMin = 4;
        NaturePHMax = 6.5;
        break;
    }
 
    double sumvolume = 0;
    for(int i = 0; i < Aquarium::Size; i++)
    {
        sumvolume += Aquarium::Inhabitants[i]->NatureVolume;
    }
 
    if(NatureVolume + sumvolume <= Aquarium::Volume && Aquarium::Filled == false)
    {
        Aquarium::Inhabitants[Aquarium::Size] = this;
        Aquarium::Size++;
    }
    else
    {
        cout << "Вы не можете подселить животное в аквариум, создайте новый!" << endl;
        Aquarium::Filled = true;
    }
 
    Hp = 100;
    Health = healthy;
 
    Satiety = 100;
    Hunger = not;
}
 
void Animal::Eat()
{
    if(Aquarium::Korm > 0)
    {
        Satiety += Aquarium::Korm / Aquarium::Size;
        Hp += Aquarium::Korm*2 / Aquarium::Size;
 
        Aquarium::Korm -= Aquarium::Korm / Aquarium::Size;
    }
    else Satiety -= 5;
 
    Update();
 
}
 
void Animal::Contaminate()
{
    if(Satiety >= 0 && Satiety < 30)
        Aquarium::Contamination += 4;
    if(Satiety >=30 && Satiety < 60)
        Aquarium::Contamination += 8;
    if(Satiety >= 60 && Satiety <= 100)
        Aquarium::Contamination += 12;
 
    Update();
}
 
Animal::~Animal()
{
 
}
 
void Animal::Update()
{
    if(Satiety > 100) Satiety = 100;
    if(Hp > 100) Hp = 100;
 
    if(Satiety > 80 && Satiety <= 100) Hunger = not;
    if(Satiety > 40 && Satiety <= 80) Hunger = low;
    if(Satiety <= 40) Hunger = big;
 
    if(Hunger == low) Hp -= 5;
    if(Hunger == big) Hp -= 15;
 
    if(Hp > 50 && Hp <= 100) Health = healthy;
    if(Hp > 0 && Hp <= 50) Health = ill;
    if(Hp <= 0) Health = dead;
 
 
    if(Aquarium::Contamination > 40) Hp -= 5;
    if(Aquarium::Contamination > 80) Hp -= 10;
 
    if(Aquarium::Temperatur < NatureTemperaturMin || Aquarium::Temperatur > NatureTemperaturMax)
        Hp -= 10;
    else 
        Hp += 4;
 
    if(Aquarium::PH < NaturePHMin || Aquarium::PH > NaturePHMax)
        Hp -= 10;
    else 
        Hp += 4;
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.05.2013, 13:18
Ответы с готовыми решениями:

Статические поля класса
Не подскажете как инициализировать статический массив? Но чтобы я сам мог ввести этот массив.

Статические поля класса
class mi { int a,b; public: mi(int a, int b) : a(a),b(b) {} void sw() {...

Статические поля и наследование
Поймал себя на мысли, что не всё знаю о статических членах класса, а проверить, запустив тестовую...

Статические поля и методы
Ни как не могу понят что же такое статические поля и методы, и какое их принципиальное отличие от...

9
52 / 52 / 2
Регистрация: 09.03.2012
Сообщений: 101
01.05.2013, 13:24 2
Статические переменные класса обычно объявляются в хедере и инициализируются в cpp-файле.
C++
1
2
3
4
5
6
class Aquarium
{
    static double Volume;
};
 
double Aquarium::Volume = 0.0;
Иначе компилятору непонятно, какое у них начальное значение.
2
1 / 1 / 0
Регистрация: 30.03.2013
Сообщений: 28
01.05.2013, 13:33  [ТС] 3
а как прописать массив в срр-файле?
0
Грамотный. Безпорно.
16619 / 9658 / 1863
Регистрация: 27.09.2012
Сообщений: 23,959
Записей в блоге: 2
01.05.2013, 13:38 4
Цитата Сообщение от monstro Посмотреть сообщение
а как прописать массив в срр-файле?
C++
1
2
3
4
5
6
7
8
#include <iostream>
 
class A{
public:
    static int fff[10];
};
 
int A::fff[10]={3,5,1,6,3,2,4,6,5,8};
0
go
Эксперт С++
3639 / 1371 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
01.05.2013, 15:58 5
Цитата Сообщение от modwind Посмотреть сообщение
Иначе компилятору непонятно, какое у них начальное значение.
Почему?
0
52 / 52 / 2
Регистрация: 09.03.2012
Сообщений: 101
03.05.2013, 12:19 6
Цитата Сообщение от go Посмотреть сообщение
Почему?
По стандарту C++ и из-за обратной совместимости со статическими переменными C. Просто так положено писать. Да, можно было придумать по-другому, и инициализировать конструктором по-умолчанию. Но разработчики языка и стандартов компилятора решили так.
0
go
Эксперт С++
3639 / 1371 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
03.05.2013, 13:52 7
Цитата Сообщение от modwind Посмотреть сообщение
По стандарту C++
Можете пункт сказать?
0
52 / 52 / 2
Регистрация: 09.03.2012
Сообщений: 101
03.05.2013, 14:02 8
9.4.2 Static data members
0
Higher
1944 / 1210 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
03.05.2013, 14:04 9
Цитата Сообщение от modwind Посмотреть сообщение
Иначе компилятору непонятно, какое у них начальное значение.
Скорее непонятно, что с ними делать при множественном включении файла (когда один и тот же хедер в одной программе инклудится несколько раз). Для функций есть inline/static, а вот для статических/глобальных переменных таких штуковин нету.
0
52 / 52 / 2
Регистрация: 09.03.2012
Сообщений: 101
03.05.2013, 14:32 10
diagon, я специально выразился простым языком (применил инкапсуляцию) для новичка, чтобы его не запутывать ) Иначе придётся вникать в личные проблемы компилятора, которому не всё равно в каком порядке инициализировать статические переменные...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.05.2013, 14:32

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Чем отличаются статические поля от не статических?
чем отличаются статические от не статических полей? почему нельзя создать счетчик без статических...

Почему переменная не увеличивается при добавлении константы в конструкторе(статические поля класса)?
Всем привет! Учу статические поля класса (книга Лафоре). Простой пример, который работает. При...

Unresolved external symbol, unresolved token
Всем привет. У меня тут такое дело: // learncpp.cpp : main project file. #include &quot;stdafx.h&quot;...

Статические поля
Вот допустим класс: class D { public: static int E; static void GetE(int a) { E =...


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

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

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