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

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

Восстановить пароль Регистрация
 
monstro
1 / 1 / 0
Регистрация: 30.03.2013
Сообщений: 28
01.05.2013, 13:18     Статические поля и unresolved символы #1
пытаюсь создать модель аквариума на с++ ...использую в качестве аквариума класс со статическими полями...при компиляции пишет "Ошибка 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++
Статические члены C++
C++ unresolved external symbol, unresolved token
Статические поля и наследование C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
modwind
 Аватар для modwind
52 / 52 / 1
Регистрация: 09.03.2012
Сообщений: 101
01.05.2013, 13:24     Статические поля и unresolved символы #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  [ТС]     Статические поля и unresolved символы #3
а как прописать массив в срр-файле?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
01.05.2013, 13:38     Статические поля и unresolved символы #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++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
01.05.2013, 15:58     Статические поля и unresolved символы #5
Цитата Сообщение от modwind Посмотреть сообщение
Иначе компилятору непонятно, какое у них начальное значение.
Почему?
modwind
 Аватар для modwind
52 / 52 / 1
Регистрация: 09.03.2012
Сообщений: 101
03.05.2013, 12:19     Статические поля и unresolved символы #6
Цитата Сообщение от go Посмотреть сообщение
Почему?
По стандарту C++ и из-за обратной совместимости со статическими переменными C. Просто так положено писать. Да, можно было придумать по-другому, и инициализировать конструктором по-умолчанию. Но разработчики языка и стандартов компилятора решили так.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
03.05.2013, 13:52     Статические поля и unresolved символы #7
Цитата Сообщение от modwind Посмотреть сообщение
По стандарту C++
Можете пункт сказать?
modwind
 Аватар для modwind
52 / 52 / 1
Регистрация: 09.03.2012
Сообщений: 101
03.05.2013, 14:02     Статические поля и unresolved символы #8
9.4.2 Static data members
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
03.05.2013, 14:04     Статические поля и unresolved символы #9
Цитата Сообщение от modwind Посмотреть сообщение
Иначе компилятору непонятно, какое у них начальное значение.
Скорее непонятно, что с ними делать при множественном включении файла (когда один и тот же хедер в одной программе инклудится несколько раз). Для функций есть inline/static, а вот для статических/глобальных переменных таких штуковин нету.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2013, 14:32     Статические поля и unresolved символы
Еще ссылки по теме:

C++ статические поля класса
C++ Статические поля и методы
C++ Чем отличаются статические поля от не статических?

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

Или воспользуйтесь поиском по форуму:
modwind
 Аватар для modwind
52 / 52 / 1
Регистрация: 09.03.2012
Сообщений: 101
03.05.2013, 14:32     Статические поля и unresolved символы #10
diagon, я специально выразился простым языком (применил инкапсуляцию) для новичка, чтобы его не запутывать ) Иначе придётся вникать в личные проблемы компилятора, которому не всё равно в каком порядке инициализировать статические переменные...
Yandex
Объявления
03.05.2013, 14:32     Статические поля и unresolved символы
Ответ Создать тему
Опции темы

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