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

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

Войти
Регистрация
Восстановить пароль
 
monstro
1 / 1 / 0
Регистрация: 30.03.2013
Сообщений: 28
#1

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

01.05.2013, 13:18. Просмотров 518. Ответов 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;
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.05.2013, 13:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Статические поля и unresolved символы (C++):

Статические поля класса - C++
class mi { int a,b; public: mi(int a, int b) : a(a),b(b) {} void sw() { std::cout&lt;&lt;a&lt;&lt;&quot; - &quot;&lt;&lt;b&lt;&lt;std::endl; } ...

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
modwind
52 / 52 / 1
Регистрация: 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;
Иначе компилятору непонятно, какое у них начальное значение.
monstro
1 / 1 / 0
Регистрация: 30.03.2013
Сообщений: 28
01.05.2013, 13:33  [ТС] #3
а как прописать массив в срр-файле?
Croessmah
Модератор
Эксперт CЭксперт С++
13134 / 7397 / 828
Регистрация: 27.09.2012
Сообщений: 18,231
Записей в блоге: 3
Завершенные тесты: 1
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};
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
01.05.2013, 15:58 #5
Цитата Сообщение от modwind Посмотреть сообщение
Иначе компилятору непонятно, какое у них начальное значение.
Почему?
modwind
52 / 52 / 1
Регистрация: 09.03.2012
Сообщений: 101
03.05.2013, 12:19 #6
Цитата Сообщение от go Посмотреть сообщение
Почему?
По стандарту C++ и из-за обратной совместимости со статическими переменными C. Просто так положено писать. Да, можно было придумать по-другому, и инициализировать конструктором по-умолчанию. Но разработчики языка и стандартов компилятора решили так.
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
03.05.2013, 13:52 #7
Цитата Сообщение от modwind Посмотреть сообщение
По стандарту C++
Можете пункт сказать?
modwind
52 / 52 / 1
Регистрация: 09.03.2012
Сообщений: 101
03.05.2013, 14:02 #8
9.4.2 Static data members
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
03.05.2013, 14:04 #9
Цитата Сообщение от modwind Посмотреть сообщение
Иначе компилятору непонятно, какое у них начальное значение.
Скорее непонятно, что с ними делать при множественном включении файла (когда один и тот же хедер в одной программе инклудится несколько раз). Для функций есть inline/static, а вот для статических/глобальных переменных таких штуковин нету.
modwind
52 / 52 / 1
Регистрация: 09.03.2012
Сообщений: 101
03.05.2013, 14:32 #10
diagon, я специально выразился простым языком (применил инкапсуляцию) для новичка, чтобы его не запутывать ) Иначе придётся вникать в личные проблемы компилятора, которому не всё равно в каком порядке инициализировать статические переменные...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2013, 14:32
Привет! Вот еще темы с ответами:

Статические массивы - C++
Перевести в веденой строке все буквы из нижнего регистра в верхний?? Пожалуйста помогите!!! Добавлено через 56 секунд Пожалуйста!!!

Статические массивы - C++
int a; cout &lt;&lt; sizeof(a) &lt;&lt; endl; cout &lt;&lt; a &lt;&lt; endl; Добрый день. Почему выводится, что sizeof(a)=16 байт. a же это адрес,...

статические функции - C++
Всем здрасьте. У меня тут впоросик на счёт static функций. я знаю как работает static с переменной. Но как он работает с функциями? к...

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


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

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

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