2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
1

Ошибка при написании класса: error LNK2019: ссылка на неразрешенный внешний символ

12.02.2014, 14:29. Показов 1485. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int _tmain(int argc, _TCHAR* argv[])
{
    Fraction x, x2, y, y2, fl, res, c;
    
    cout << "..." << endl;
    x.setFraction();
    
    cout << "..." << endl;
    y.setFraction();
 
    cout << "Умножение" << endl;
    res = x * y;
    res.ShowFraction();
 
...
}
Описание методов:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void Fraction :: setFraction()
     { int numerator;
        char c;
        int denominator;
        
        
        cin >> numerator;
        cin >> c;
        cin >> denominator;
        m_Numerator = numerator;
        m_Denominator = denominator;
}
 
 Fraction Fraction :: operator* (const Fraction a) {
    Fraction tmp; //результат умножения двух дробей
    tmp.m_Numerator = m_Numerator*a.m_Numerator;
    tmp.m_Denominator = m_Denominator*a.m_Denominator;
    return tmp;
};
и при компиляции выдает ошибку при участии строки "res = x * y;", т.е. вводится дробь нормально, а дальше такая петрушка, в чем проблема? ах да, и пишет, что-то типа "error LNK2019: ссылка на неразрешенный внешний символ..."
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.02.2014, 14:29
Ответы с готовыми решениями:

Ошибка при работе со структурами: error LNK2019: ссылка на неразрешенный внешний символ _main
#include&lt;iostream&gt; using namespace std; struct baza_film { char name_film ; char...

Ошибка 1 error LNK2019: ссылка на неразрешенный внешний символ
Ошибка 1 error LNK2019: ссылка на неразрешенный внешний символ &quot;public: void __thiscall...

Ошибка: error LNK2019: ссылка на неразрешенный внешний символ...
Не могу понять ошибку в своей программе! Ничего красным не подчёркивается, но программа не...

Ошибка error LNK2019: ссылка на неразрешенный внешний символ
Здравствуйте, не уверен в эту ли тему пишу, но в теме специализированой по OpenGL мне ни кто ничего...

16
55 / 48 / 13
Регистрация: 31.10.2013
Сообщений: 166
12.02.2014, 14:32 2
А вы в аргументе перегруженного оператора принимайте ссылку, то есть:
C++
1
Fraction Fraction :: operator* (const Fraction a) {
заменить на
C++
1
Fraction Fraction :: operator* (const Fraction &a) {
0
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
12.02.2014, 14:33 3
по-моему из-за того что оператор= не перегружен
0
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
12.02.2014, 14:44  [ТС] 4
Цитата Сообщение от dzrkot Посмотреть сообщение
по-моему из-за того что оператор= не перегружен
вы имеете в виду оператор присваивание нужно перегрузить?

Добавлено через 20 секунд
Цитата Сообщение от ShadowFirst Посмотреть сообщение
А вы в аргументе перегруженного оператора принимайте ссылку, то есть:
C++
1
Fraction Fraction :: operator* (const Fraction a) {
заменить на
C++
1
Fraction Fraction :: operator* (const Fraction &a) {
не сработало
0
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
12.02.2014, 14:45 5
Цитата Сообщение от RayPas Посмотреть сообщение
вы имеете в виду оператор присваивание нужно перегрузить?
именно
вообще если выложите весь код то будет проще)
0
55 / 48 / 13
Регистрация: 31.10.2013
Сообщений: 166
12.02.2014, 14:45 6
Кстати да, = тож нужно перегрузить, как то не подумал об этом сразу.
0
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
12.02.2014, 15:02  [ТС] 7
нужно в Res положить рез-т умножения дробей;
попытался перегрузить присваивание... теперь получается нужно этот метод применить к строчке Res = x*y, но как?
C++
1
2
3
4
Fraction Fraction :: operator= (const Fraction &a) {
     R = a.R;
     return *this;
 }
R определил как объект класса Fraction...

Добавлено через 8 минут
да, все дело в этом операторе...
оставил только x*y - проект строится без ошибок
0
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
12.02.2014, 15:06 8
Цитата Сообщение от RayPas Посмотреть сообщение
Fraction Fraction :: operator= (const Fraction &a) { R = a.R; return *this; }
Цитата Сообщение от RayPas Посмотреть сообщение
R определил как объект класса Fraction...
...подумайте тогда над значением а.R ...))
вы не правы, надо создать нвоый обект и вернуть его копию
т.е.
C++
1
2
3
4
Fraction R();
R.парамерты=a.параметры
return R; 
//примерно так
0
Эксперт по математике/физикеЭксперт С++
2051 / 1369 / 396
Регистрация: 16.05.2013
Сообщений: 3,514
Записей в блоге: 6
12.02.2014, 15:10 9
RayPas, вряд ли проблема в операторе присваения. Приведите весь код пожайлуста. Созданный по умолчанию работает примеоно так как вы написали выше. Повторюсь нужен код.
0
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
12.02.2014, 15:13  [ТС] 10
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
#pragma once
 
namespace Program {
class Fraction
{
private:
    int m_Numerator;
    int m_Denominator;
    int R;
public:
    Fraction(void);
 
 
    int getNumerator() { return m_Numerator; }
    int getDenominator() { return m_Denominator; }
    void setFraction();
    void ShowFraction() const;
    void Fraction :: Control(int &denominator, int  &numerator);
    
    Fraction operator= (const Fraction &a);
    Fraction operator * (const Fraction &a);
    ~Fraction(void);
};
}


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
#include "stdafx.h"
#include "Fraction.h"
#include <iostream>
 
using namespace std;
 
namespace Program {
 
Fraction::Fraction(void)
{
}
 
 
Fraction::~Fraction(void)
{
}
 
void Fraction :: setFraction()
     { int numerator;
        char c;
        int denominator;
        
        
        cin >> numerator;
        cin >> c;
        cin >> denominator;
        m_Numerator = numerator;
        m_Denominator = denominator;
}
 
 Fraction Fraction :: operator* (const Fraction &a) {
    Fraction tmp; //результат умножения двух дробей
    tmp.m_Numerator = m_Numerator*a.m_Numerator;
    tmp.m_Denominator = m_Denominator*a.m_Denominator;
    return tmp;
};
 
// Fraction Fraction :: operator= (const Fraction &a) {
    // R = a.R;
     //return *this;
// }
 
void Fraction :: ShowFraction() const {
    cout << this -> m_Numerator << '/' << this -> m_Denominator << endl;
}
 
 
void Fraction :: Control(int &denominator, int  &numerator) {
     if (denominator == 0) {cout << "error!try again!"<<endl;}
     if (numerator % denominator != 0) {cout << "error!try again!"<<endl;}
}
 
 
}

ну и главная часть такая же, как выше написал
0
Эксперт по математике/физикеЭксперт С++
2051 / 1369 / 396
Регистрация: 16.05.2013
Сообщений: 3,514
Записей в блоге: 6
12.02.2014, 15:24 11
А вы указали, что используете свое пространство имен?
C++
1
using namespace Program;
1
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
12.02.2014, 15:27 12
C++
1
2
3
4
5
 Fraction& Fraction :: operator= (const Fraction &a) {
     m_Numerator= a.m_Numerator;
     m_Denominator=a.m_Denominator;
     return *this;
 }
прототип подправьте тоже
0
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
12.02.2014, 15:28  [ТС] 13
Цитата Сообщение от Ilot Посмотреть сообщение
А вы указали, что используете свое пространство имен?
C++
1
using namespace Program;
да, только таким образом
C++
1
using Program:: Fraction;
и хмм, он заработал!!!
Но! Получается, что R нельзя определять как объект класса, потому что при введении дробей в R забивается мусор, и при отладке он выводит этот мусор через разделенную черту дроби...как быть?
0
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
12.02.2014, 15:30 14

Не по теме:

Цитата Сообщение от dzrkot Посмотреть сообщение
Код C++
Fraction R();
R.парамерты=a.параметры
return R;
//примерно так
глупость я написал походу сначала)



Добавлено через 1 минуту
Цитата Сообщение от RayPas Посмотреть сообщение
Но! Получается, что R нельзя определять как объект класса, потому что при введении дробей в R забивается мусор, и при отладке он выводит этот мусор через разделенную черту дроби...как быть?
я выше отписал, поправьте перегрузку=, у меня всё заработало с тем что выше
1
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
12.02.2014, 15:31  [ТС] 15
dzrkot, спасиб друг!) и, правда, все заработало!)
ох ты ж и это только умножение...самое легкое!)
просто, про перегрузку оператора присваивания, вообще не знал, классы буквально вчера начал изучать.
0
Эксперт по математике/физикеЭксперт С++
2051 / 1369 / 396
Регистрация: 16.05.2013
Сообщений: 3,514
Записей в блоге: 6
12.02.2014, 15:32 16
Вы R не инициализируете вообще. Вводите какую-то с...
0
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
12.02.2014, 15:34  [ТС] 17
какое -то c это чаровский символ для имитации дроби, а R собсно переменная для реза...
0
12.02.2014, 15:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.02.2014, 15:34
Помогаю со студенческими работами здесь

Ошибка error LNK2019: ссылка на неразрешенный внешний символ
Здравствуйте! Помогите пожалуйста! Компоновщик выдаёт ошибку error LNK2019: ссылка на...

Ошибка линковки - error LNK2019: ссылка на неразрешенный внешний символ
Что может быть не так? есть файл test.h #ifndef _T_ #define _T_ template&lt;class T&gt; class...

Переопределение операции. Ошибка Error LNK2019: ссылка на неразрешенный внешний символ
Возникает такая ошибка: 1 error LNK2019: ссылка на неразрешенный внешний символ &quot;public: class...

Не могу разобраться где ошибка!error LNK2019: ссылка на неразрешенный внешний символ
#include &quot;stdafx.h&quot; #include &quot;conio.h&quot; #include &quot;stdio.h&quot; #include &quot;stdlib.h&quot; #include...

Ошибка линковщика(error LNK2019: ссылка на неразрешенный внешний символ _main в функции ___tmainCRTStartup)
#include &lt;iostream&gt; using namespace std; void rotor(int *a,int k,int len) { // Создаем и...

Структуры/Работа с файлами(ошибка линковщика error LNK2019: ссылка на неразрешенный внешний символ)
Задание: Дан файл содержащий сведения о видах журналов редакции.Структура записи файла: -код...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru