Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
svadum
0 / 0 / 0
Регистрация: 04.06.2016
Сообщений: 24
#1

Подскажите пожалуйста в чем может быть трабл при компиляции класса выдает ошибку

06.06.2016, 20:01. Просмотров 825. Ответов 6
Метки нет (Все метки)

Подскажите пожалуйста в чем может быть проблема:
при компиляции класса выдает ошибку:
(Ошибка LNK2001 неразрешенный внешний символ ""private: static double SavingsAccount::anualInterestRate" (?anualInterestRate@SavingsAccount@@0NA)" SavingsAccount)
но как только убираю static перед объявлением переменной anualInterestRate, все хорошо и компилируется без проблем
Вот код класса:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#pragma once
#ifndef SAVINGSACCOUNT_H
#define SAVINGSACCOUNT_H
 
class SavingsAccount {
public:
    SavingsAccount(double, double);                //construcor
    ~SavingsAccount();                                //destructor
    void calculateMonthlyInterest();                 
    void printAccount() const;
    static void modifyAnualInterest(double);
private:
    static double anualInterestRate;
    double savingsBalance;                        // account sum
};
 
#endif // !SAVINGSACCOUNT_H
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
#include<iostream>
#include<iomanip>
#include"SavingsAccount.h"
 
using namespace std;
 
SavingsAccount::SavingsAccount(double balance, double AIRate)
    : savingsBalance(balance)
{
    modifyAnualInterest(AIRate);
    cout << "Account: (" << balance << ")\n";
}
 
void SavingsAccount::calculateMonthlyInterest() {
    savingsBalance = (savingsBalance*anualInterestRate) / 12;
}
 
void SavingsAccount::printAccount() const {
    cout << "Account monthly interest: " << setprecision(2) << fixed 
         << savingsBalance << "$." << endl;
}
 
void SavingsAccount::modifyAnualInterest(double AIR) {
    anualInterestRate = AIR;
}
 
SavingsAccount::~SavingsAccount() {
    cout << "Program end.Good bay)";
}
Добавлено через 11 минут
anualInterestRate должна остаться static.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2016, 20:01
Ответы с готовыми решениями:

Программа не работает, но ошибок не выдает. В чем может быть ошибка?
#include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;cstdlib&gt; #define m 8 using namespace std; int...

Выдает ошибку при компиляции
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; typedef struct _SLine { double start; double end; ...

программа выдает ошибку при компиляции
подскажите, пожалуста, в чем ошибка..При компиляции выскакивает ошибка undefined reference to...

Выдает ошибку когда задействую поток.Подскажите в чем ошибка?
Задача: Задан двумерный массив A из N x N элементов, расположенный в локальной памяти каждой нити,...

Программа выдает ошибку при компиляции на dev c++
#include &lt;iostream&gt; #include &lt;ctime&gt; using namespace std; int main() { ...

6
nonedark2008
1036 / 773 / 215
Регистрация: 28.07.2012
Сообщений: 2,154
06.06.2016, 20:12 #2
Лучший ответ Сообщение было отмечено svadum как решение

Решение

svadum, anualInterestRate нужно еще инициализировать в каком-нибудь cpp'шнике.
C++
1
double SavingsAccount::anualInterestRate = 0;
1
svadum
0 / 0 / 0
Регистрация: 04.06.2016
Сообщений: 24
06.06.2016, 20:16  [ТС] #3
но инициализация происходит вызовом функции в строке 10 и в самой функции
C++
1
modifyAnualInterest(AIRate);
C++
1
2
3
void SavingsAccount::modifyAnualInterest(double AIR) {
    anualInterestRate = AIR;
}
или все же для статических данных требуется явная инициализация?
0
nonedark2008
1036 / 773 / 215
Регистрация: 28.07.2012
Сообщений: 2,154
06.06.2016, 20:57 #4
svadum, то, что задано внутри класса - это только объявление статической переменной.
Ее еще нужно добавочно где-нибудь определить.
0
svadum
0 / 0 / 0
Регистрация: 04.06.2016
Сообщений: 24
06.06.2016, 21:19  [ТС] #5
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
#include<iostream>
#include<iomanip>
#include"SavingsAccount.h"
 
using namespace std;
 
SavingsAccount::SavingsAccount(double balance, double AIRate)
    : savingsBalance(balance)
{
    anualInterestRate = 0;
    cout << "Account: (" << balance << ")\n";
}
 
void SavingsAccount::calculateMonthlyInterest() {
    savingsBalance = (savingsBalance*anualInterestRate) / 12;
}
 
void SavingsAccount::printAccount() const {
    cout << "Account monthly interest: " << setprecision(2) << fixed 
         << savingsBalance << "$." << endl;
}
 
void SavingsAccount::modifyAnualInterest(double AIR) {
    anualInterestRate = AIR;
}
 
SavingsAccount::~SavingsAccount() {
    cout << "Program end.Good bay)";
}
Та же ошибка.Мне кажеться тут проблема в объявление переменной, потому што инициализация не помогла, а если убрать static из объявления переменной, то все работает и с первым варионтом кода, но хочу понять почему co static не идет.

Добавлено через 6 минут
C++
1
2
3
4
5
6
SavingsAccount::SavingsAccount(double balance, double AIRate)
    : savingsBalance(balance)
{
    double anualInterestRate = 0;
    cout << "Account: (" << balance << ")\n";
}
такой вариант тоже нет
и такой
C++
1
2
3
4
5
6
SavingsAccount::SavingsAccount(double balance, double AIRate)
    : savingsBalance(balance)
{
    double anualInterestRate = AIRate;
    cout << "Account: (" << balance << ")\n";
}
хотя ето тоже самое,с именем класса и операцией расширения области также.
возможно кто то может исправить или усовершенствовать код, чтобы исправить эту ошибку?
0
Namat
12 / 12 / 5
Регистрация: 02.12.2014
Сообщений: 35
06.06.2016, 21:23 #6
Лучший ответ Сообщение было отмечено svadum как решение

Решение

Перед определением конструктора вставь:
Цитата Сообщение от nonedark2008 Посмотреть сообщение
double SavingsAccount::anualInterestRate = 0;
1
svadum
0 / 0 / 0
Регистрация: 04.06.2016
Сообщений: 24
06.06.2016, 21:40  [ТС] #7
Namat, nonedark2008, спасибо вам, просто просто с этим желание сделать данные менее видимыми уже какая-то паранойя началась
к сожалению приходится жертвовать безопасностью, но что поделаешь)
зато теперь можна зделать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#pragma once
#ifndef SAVINGSACCOUNT_H
#define SAVINGSACCOUNT_H
 
class SavingsAccount {
public:
    SavingsAccount(double, double);                    //construcor
    ~SavingsAccount();                                //destructor
    void calculateMonthlyInterest();                 
    void printAccount() const;
    static void modifyAnualInterest(double AIR) { anualInterestRate = AIR; };
private:
    static double anualInterestRate;
    double savingsBalance;                        // account sum
};
 
#endif // !SAVINGSACCOUNT_H
0
06.06.2016, 21:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2016, 21:40

Почему выдает такую ошибку? c++ при компиляции
Вот код программы, нахождение наибольшего числа с 3 заданных #include &lt;iostream&gt; uisng...

Выдает ошибку о том , что маленький буфер. Подскажите в чем причина
#include &lt;fstream&gt; #include &lt;string&gt; #include &lt;iostream&gt; using namespace std; const int RAS...

Выдает ошибку при компиляции. Не могу понять почему
Помогите с кодом. Я вижу что ошибка уровня самых низов но не могу понять все равно что тут не так....


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

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

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