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

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

06.06.2016, 20:01. Просмотров 218. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Подскажите пожалуйста в чем может быть трабл при компиляции класса выдает ошибку (C++):

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

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

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

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

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

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

6
nonedark2008
1022 / 762 / 210
Регистрация: 28.07.2012
Сообщений: 2,118
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
1022 / 762 / 210
Регистрация: 28.07.2012
Сообщений: 2,118
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
Привет! Вот еще темы с решениями:

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

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

При компиляции выдает ошибку E2314 Call of nonfunction Full
Всем привет) при компиляции выдает ошибку E2314 Call of nonfunction Full ...

После компиляции выдает ошибку
После компиляции выдает такое сообщение: ------ Build started: Project: dz2,...


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

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

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