C ++: шешілмеген externals жаңғақтарды басқарады

Мен C ++-де сабақ алып жатырмын және бұл мені қызықтырады. Ең қызығы, ешқандай нұсқаулық маған не істеу керектігін айтқысы келмейді және мұнда мәселені шешпейтін сияқты. Мүмкін бірнеше C ++ компиляторларының мәселесіне байланысты болуы мүмкін. Мен Visual Studio 2010 пайдаланамын, мен оператордың жүктемесі бар сынып құруға тырысамын. Менде тақырып, сынып, басты және т.б. бар.

//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 &);
    Rational operator=(const Rational &);
    Rational operator+=(const Rational &);
    int getNum();
    int getDenom();
};
#endif

Және сынып:

#include "stdafx.h"
#include 
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 &r)
    {
        return Rational(((numerator * r.denominator) + (r.numerator * denominator)), (denominator * r.denominator));
    }

    Rational operator=(const Rational &r)
    {
        denominator = r.denominator;
        numerator = r.numerator;
    }

    Rational operator+=(const Rational &r)
    {
        return Rational(((numerator * r.denominator) + (r.numerator * denominator)), (denominator * r.denominator));
    }

Getter функциялары сіз күтетін және қателеспейтін нәрсе болып табылады, бірақ конструктор мен шамадан тыс әдістер шешілмеген сыртқыымды береді. Мен әдістер мен тақырыпта қаншалықты тырысып көргенімді есіме түсіре алмаймын. Ондаған немесе ондай басшылар мен мысалдарды көрдім, олардың ешқайсысы жұмыс істемеді. Мен мұны бір рет диспетчер функциясы ретінде + операнда құрастырдым, бірақ тапсырманы орындау үшін мүше функция болуға және оны қандай да бір түрде жоғарыда аталған барлық функцияларды бұзуға қабілетті мүшеге ауыстыру керек. Мен мұнда жаңғақ барамын. Мен бұл әдістерді не істемесем де шешпейді!

Негізгі әдіс стандартты түрде осы әдістерге сәйкес келеді және Rational.h файлын қамтиды. Барлық файлдар бірдей каталогта болады.

1
О, ұмытып кетуді ұмытпаңыз, негізгі әдіс осы әдістерді стандартты түрде жасайды және Rational.h файлын қамтиды. Барлық файлдар бірдей каталогта болады.
қосылды автор user1017413, көзі
= және + = операторларыңыз сілтеме бойынша * this мәнін қайтаруы керек.
қосылды автор Kerrek SB, көзі
Кейбір функцияларды анықтай алмайсың, дәл сілтеме қатесін орналастыруыңыз мүмкін.
қосылды автор K-ballo, көзі
Тапсырмаңыздың операторлары ағымдағы данаға сілтеме жасау керек екенін ескеріңіз.
қосылды автор K-ballo, көзі
Сіз кейбір оқулық немесе кіріспе кітабын қарастырғыңыз келуі мүмкін. Егер сіз тақырыптағы түрді анықтасаңыз, басқа аударма бірлікте сыныпты қайта анықтай алмайсыз, бірақ сіз тек анықтай мүше функцияларын ғана орната аласыз.
қосылды автор David Rodríguez - dribeas, көзі
2 код сіздің бастапқы және тақырып файлын тексереді ме?
қосылды автор radman, көзі

3 жауаптар

Сіз нақты нәрселерді білесіз. Мен сіздердің жетістіктеріңізге кедергі келтіретін бірқатар «кішігірім» мәселелерді шешу үшін уақытты алдым; Менің стенографиялық түсініктемелерім сені дұрыс жолға салады деп үміттенемін.

  • You are redefining the class in a cpp file; this is not proper C++ (declare the class in the header, define the implementation in the cpp):

  • You fail to return values in non void methods

  • You fail to return the result of assignment by reference (only breaks expectations - but returning by reference is recommend and idiomatic)
  • += fails to update *this and return the same

I also demonstrated initializer lists and implemented += in terms 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 &) const;
    Rational& operator=(const Rational &);
    Rational& operator+=(const Rational &);
    int getNum();
    int getDenom();
};
#endif

main.cpp:

#include "rational.h"
#include 
using namespace std;

Rational::Rational(int num, int den)
    : numerator(num), denominator(den)//prefer initializer lists
{
}

Rational Rational::operator+(const Rational &r) const
{
    return Rational(
            ((numerator * r.denominator) + 
             (r.numerator * denominator)), 
            (denominator * r.denominator));
}

Rational& Rational::operator=(const Rational &r)
{
    denominator = r.denominator;
    numerator   = r.numerator;

    return *this;//ADDED
}

Rational& Rational::operator+=(const Rational &r)
{
    return *this = (*this) + r;
}

int main()
{
}
3
қосылды
Цхулху мырза саған батасын берсін! Мен қарапайым қарапайым нәрсе бар деп ойладым. Яғни алдымен Java үйрену үшін алдым, менің ойымша. Мен айналадағыларға қиындық тудыруы мүмкін түсініксіз түсініктерді аламын. Қалай болғанда да, кейбір әңгімелерден кейін ол компиляция жасап, үміт артуда.
қосылды автор user1017413, көзі

Сіз сыныпты екі рет жариялайсыз.

Сіздің тақырыпыңыз сол сияқты көрінуі керек, бірақ сіз функцияны анықтаған кезде, олар сынып блоктарының ішіне оралмауы керек.

class Rational
{
private:
    int numerator;
    int denominator;

public:
    Rational(int num = 0, int den = 1);
    Rational operator+(const Rational &);
    Rational operator=(const Rational &);
    Rational operator+=(const Rational &);
    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 &);
    Rational operator=(const Rational &);
    Rational operator+=(const Rational &);
    int getNum();
    int getDenom();
};
2
қосылды
Сонымен қатар, декларация жүреді., Анықтама .cpp
қосылды автор Dialecticus, көзі

Сіз көрсеткен кодқа Rational екі анықтамасы кіреді. Егер сізде әдістерге кірістірілген енгізілімдерсіз бір рет Rational болса, басқа әдістерді басқа жерде анықтау керек, бірақ class ішінде топтастырылмайды, бірақ бөлек құрылым. Жақсы көрінетін тақырыпты қосқаннан кейін, әр әдісті өз бетіңізше орындаңыз:

Rational::Rational(int num = 0, int den = 1)
{
    numerator = num;
    denominator = den;
}

Сіз көрсеткендеріңіз «шешілмеген сыртқы» қателерге алып келмейді. Ол сізге «бірнеше сыныпты анықтау» қателерін беруі керек. Егер сіздің жобаңыздағы екінші Rational файлын мүлдем ескермеген болсаңыз. Содан кейін «шешілмеген сыртқы» шынымен дұрыс, себебі сіз осы сыныптағы функциялар үшін тиісті анықтамалар бермедік.

2
қосылды