C ++: Çözümlenmeyen dıştanlar beni deli ediyor

C ++ 'da bir ders alıyorum ve bu beni çılgına çeviriyor. Dürüstlük kısmı, hiçbir rehberin bana tam olarak ne yapacağını söylemediği ve hiçbir sorunun buradaki sorunu çözmediği yönündedir. Muhtemelen kısmen birden çok C ++ derleyicisinin sorununa bağlı. Visual Studio 2010 kullanıyorum ve sadece operatör aşırı yüklenme ile bir sınıf oluşturmaya çalışıyorum. Başlığım, sınıfım, ana, vb. Var:

//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

Ve sınıf:

#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));
    }

Alıcı işlevleri beklediğiniz ve hata vermediğiniz işlevlerdir, ancak yapıcı ve aşırı yüklenmiş yöntemler bana çözümlenmemiş dışını verir. Yöntemlerde ve başlıkta ne kadar denediğimi hatırlayamıyorum bile. Bir düzine kadar rehber ve örnek gördüm ve bunların hiçbiri işe yaramadı. Bunu bir kez + işlenen ile bir arkadaş işlevi olarak derlemek için aldım, ancak atama için bir üye işlevi olması ve bir şekilde yukarıdakilerin tümünü kırmayı başarmış bir üye işlevine taşınması gerekiyor. Burada deliriyorum. Ne yaparsam yapayım bu yöntemleri çözmeyecek!

Ana yöntem, tüm bunları standart biçimde çağırır ve Rational.h dosyasını içerir. Tüm dosyalar aynı dizinde.

1
Oh, unutmayalım, ana yöntem tüm bunları standart olarak çağırır ve Rational.h dosyasını içerir. Tüm dosyalar aynı dizinde.
katma yazar user1017413, kaynak
Operatörlerinizin = ve + = , * this 'i referans ile göndermelidir.
katma yazar Kerrek SB, kaynak
Bazı işlevleri tanımlamakta başarısız oluyorsunuz, tam linker hatasını gönderiyorsunuz.
katma yazar K-ballo, kaynak
Ödev operatörlerinin mevcut örneğe bir referans döndürmesi gerektiğini unutmayın.
katma yazar K-ballo, kaynak
Bazı öğretici veya tanıtım kitaplarına bakmak isteyebilirsiniz. Bir başlıktaki türü tanımlarsanız, sınıfı başka bir çeviri biriminde yeniden tanımlayamazsınız, ancak yalnızca üye işlevlerini tanımlayın yerine koymalısınız.
katma yazar David Rodríguez - dribeas, kaynak
2 kod örneğiniz kaynak ve başlık dosyası mı?
katma yazar radman, kaynak

3 cevap

Sen açıkça bir şeyler öğreniyorsun. İlerlemenizi gerçekten engelleyecek bir dizi 'küçük' meseleyi düzeltmek için zaman ayırdım; Umarım stenografik açıklamaları seni doğru yola sokar.

  • 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
katma
Cthulhu sizi korusun efendim! Göreceli olarak basit bir şey yığılmış olduğumu düşündüm. İlk önce Java'yı öğrenmek için aldığım budur. Etrafı zor olabilecek önyargılı fikirler alıyorum. Her halükarda, bazı mutasyonlardan sonra, derleme ve ümit edildiği gibi çalışıyor.
katma yazar user1017413, kaynak

Dersi iki kez ilan ediyorsun.

Başlığınız böyle görünmelidir, ancak işlevi tanımladığınızda bunlar bir sınıf bloğunun içine sarılmamalıdır.

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();
};

Şimdi bunu .cpp'nizde tanımlayın.

Rational::Rational(int num , int den )
{
  //Stuff Goes hear 
}

Ayrıca, fonksiyonları satır içi olarak tanımladığınızı unutmayın.

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
katma
Ayrıca, bildirimi .h içinde gider, tanımı .cpp içinde gider.
katma yazar Dialecticus, kaynak

Gösterdiğiniz kod, Rational iki tanımını içerir. Yöntemlere satır içi uygulama yapılmadan bir kez Rational varsa, yöntemlerin başka bir yerde tanımlanması gerekir, ancak ayrı olarak , hepsi başka bir sınıfında gruplandırılmaz yapısı. İyi görünen başlık ekledikten sonra, her bir yöntemin uygulanmasını kendi başına yapın:

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

Gösterdiğiniz şey, "çözülmemiş harici" hatalara yol açmaz. Size "çoklu sınıf tanımı" hataları vermelidir. Projenize ikinci Rational dosyasını dahil etmeyi tamamen ihmal etmedikçe. O zaman, "çözülmemiş harici" gerçekten doğrudur, çünkü o sınıftaki işlevler için doğru tanımları sağlamadınız.

2
katma