#c #visual-studio-2010
#c #visual-studio-2010
Вопрос:
Я посещаю занятия по C , и это сводит меня с ума. Самое смешное, что ни одно руководство, похоже, не говорит мне точно, что делать, и ни один вопрос, похоже, не решает проблему здесь. Вероятно, отчасти это связано с проблемой нескольких компиляторов C . Я использую Visual Studio 2010 и просто пытаюсь создать класс с перегрузкой оператора. У меня есть мой заголовок, класс, main и т. Д:
//File Rational.h
#ifndef RATIONAL_H
#define RATIONAL_H
class Rational
{
private:
int numerator;
int denominator;
public:
Rational(int num = 0, int den = 1);
Rational operator (const Rational amp;);
Rational operator=(const Rational amp;);
Rational operator =(const Rational amp;);
int getNum();
int getDenom();
};
#endif
И класс:
#include "stdafx.h"
#include <iostream>
using namespace std;
class Rational
{
private:
int numerator;
int denominator;
public:
Rational(int num = 0, int den = 1)
{
numerator = num;
denominator = den;
}
Rational operator (const Rational amp;r)
{
return Rational(((numerator * r.denominator) (r.numerator * denominator)), (denominator * r.denominator));
}
Rational operator=(const Rational amp;r)
{
denominator = r.denominator;
numerator = r.numerator;
}
Rational operator =(const Rational amp;r)
{
return Rational(((numerator * r.denominator) (r.numerator * denominator)), (denominator * r.denominator));
}
Функции получения — это то, что вы ожидаете, и не выдают ошибок, но конструктор и перегруженные методы дают мне неразрешенный внешний. Я даже не могу вспомнить, сколько вещей я пробовал в методах и заголовке. Я видел около дюжины руководств и примеров, и ни один из них не сработал. Я получил это для компиляции один раз с операндом в качестве дружественной функции, но для назначения это должна быть функция-член, и перемещение ее в функцию-член каким-то образом удалось нарушить все вышесказанное. Я схожу с ума здесь. Он не разрешит эти методы, что бы я ни делал!
Метод main вызывает все это стандартным образом и включает файл Rational.h . Все файлы находятся в одном каталоге.
Комментарии:
1. О, забыл упомянуть, что метод main вызывает все это стандартным образом и включает файл Rational.h . Все файлы находятся в одном каталоге.
2. Кажется, вам не удается определить некоторые функции, опубликуйте точную ошибку компоновщика.
3. Обратите внимание, что ваши операторы присваивания должны возвращать ссылку на текущий экземпляр.
4. Возможно, вы захотите взглянуть на какой-нибудь учебник или вводную книгу. Если вы определяете тип в заголовке, вы не можете снова определить класс в другой единице перевода, но вам следует определять только функции-члены.
5. Являются ли ваши 2 образца кода исходным кодом и заголовочным файлом?
Ответ №1:
Вы явно чему-то учитесь. Я потратил время, чтобы исправить ряд «незначительных» проблем, которые действительно будут препятствовать вашему прогрессу; Я надеюсь, что мои стенографические пояснения направят вас на правильный путь.
- Вы переопределяете класс в файле cpp; это не соответствует C (объявите класс в заголовке, определите реализацию в cpp):
- Вы не возвращаете значения в методах, отличных от void
- Вы не можете вернуть результат присваивания по ссылке (только нарушает ожидания, но возврат по ссылке рекомендуется и идиоматичен)
=
не удается обновить*this
и вернуть то же самое
Я также продемонстрировал списки инициализаторов и реализовал =
в терминах op operator
.
//File Rational.h
#ifndef RATIONAL_H
#define RATIONAL_H
class Rational
{
private:
int numerator;
int denominator;
public:
Rational(int num = 0, int den = 1);
Rational operator (const Rational amp;) const;
Rationalamp; operator=(const Rational amp;);
Rationalamp; operator =(const Rational amp;);
int getNum();
int getDenom();
};
#endif
main.cpp:
#include "rational.h"
#include <iostream>
using namespace std;
Rational::Rational(int num, int den)
: numerator(num), denominator(den) // prefer initializer lists
{
}
Rational Rational::operator (const Rational amp;r) const
{
return Rational(
((numerator * r.denominator)
(r.numerator * denominator)),
(denominator * r.denominator));
}
Rationalamp; Rational::operator=(const Rational amp;r)
{
denominator = r.denominator;
numerator = r.numerator;
return *this; // ADDED
}
Rationalamp; Rational::operator =(const Rational amp;r)
{
return *this = (*this) r;
}
int main()
{
}
Комментарии:
1. Благослови вас Ктулху, сэр! Я подумал, что у меня получилось что-то относительно простое. Я думаю, это то, что я получаю за изучение Java в первую очередь. У меня есть предвзятые представления, которые может быть трудно обойти. В любом случае, после некоторой возни, он компилируется и работает так, как хотелось бы.
Ответ №2:
Вы объявляете класс дважды.
Ваш заголовок должен выглядеть так, как он выглядит, но когда вы определяете функцию, они не должны быть обернуты внутри блока класса.
class Rational
{
private:
int numerator;
int denominator;
public:
Rational(int num = 0, int den = 1);
Rational operator (const Rational amp;);
Rational operator=(const Rational amp;);
Rational operator =(const Rational amp;);
int getNum();
int getDenom();
};
Теперь определите это в вашем .cpp.
Rational::Rational(int num , int den )
{
//Stuff Goes hear
}
Также помните, что вы можете определять встроенные функции.
class Rational
{
private:
int numerator;
int denominator;
public:
Rational(int num = 0, int den = 1)
{
//Stuff Goes hear
}
Rational operator (const Rational amp;);
Rational operator=(const Rational amp;);
Rational operator =(const Rational amp;);
int getNum();
int getDenom();
};
Комментарии:
1. Кроме того, объявление вводится в .h, определение вводится в .cpp
Ответ №3:
Показанный вами код включает в себя два определения Rational
. Если у вас Rational
когда-то не было встроенных реализаций методов, методы должны быть определены в другом месте, но отдельно, а не сгруппированы внутри другой class
структуры. После включения заголовка, который выглядит хорошо, поместите реализацию каждого метода отдельно, вот так:
Rational::Rational(int num = 0, int den = 1)
{
numerator = num;
denominator = den;
}
Однако то, что вы показали, не приведет к «неразрешенным внешним» ошибкам. Это должно привести к ошибкам «множественного определения класса». Если только вы полностью не забыли включить второй Rational
файл в свой проект. Тогда «неразрешенный внешний» действительно правильный, потому что вы не предоставили правильных определений для функций в этом классе.