2015-07-02 14 views
0

У меня есть следующий класс:C++ не может реализовать конструктор по умолчанию

class Fraction { 
    private: 
     int x; 
     int y; 
    public: 
    // Constructors 
     Fraction(long x = 0, long y = 1); 
     Fraction(const Fraction&)=default;//here is the problem 
     virtual ~Fraction(); 
}; 

Я пытаюсь отключить по умолчанию C++ конструктора для реализации моих (я намерен использовать его для копирования). Итак, я объявил это как дефолт. Но, когда я пытаюсь реализовать:

Fraction::Fraction(const Fraction&){} 

Компилятор выдает следующее сообщение об ошибке на меня:

./src/Fraction.cpp:16:1: error: definition of explicitly-defaulted ‘Fraction::Fraction(const Fraction&)’ Fraction::Fraction(const Fraction&){^In file included from ../src/Fraction.cpp:8:0: ../src/Fraction.h:22:2: error: ‘Fraction::Fraction(const Fraction&)’ explicitly defaulted here Fraction(const Fraction&)=default;

Есть ли способ это исправить? Что я делаю неправильно? Я нашел некоторые статьи о дефолтах, но ничего, что могло бы помочь мне исправить эти ошибки.

+0

Если вы хотите отключить конструктор копирования, используйте '= delete', а не' = default'. –

+5

'= default' сообщает компилятору использовать стандартную реализацию. Это также означает, что вы не можете предоставить свой собственный. Если вы _don't_ хотите, чтобы компилятор его создал, просто удалите '= default'. – Zeta

+1

* Конструктор по умолчанию * и * конструктор копирования * - это две разные вещи. – dlask

ответ

7

= default сообщает компилятору использовать стандартную реализацию. Это также означает, что вы не можете предоставить свои собственные. Если вы не хотите, чтобы компилятор создать, просто удалить = default:

class Fraction { 
// ... 
    Fraction(const Fraction&); // NO =default 
}; 

К слову, «конструктор по умолчанию» это тот, который вызывается, когда вы не предоставите никаких аргументов, например

Fraction my_frac; // default constructor called 

Если вы хотите отключить конструктор по умолчанию, используйте =delete:

class Fraction{ 
public: 
    Fraction() = delete; 
} 

Имейте в виду, что ваш текущий Fraction(long, long) предоставляет аргументы по умолчанию, так что это право, как конструктор по умолчанию.

+0

Но почему мы должны сказать компилятору, чтобы использовать реализацию по умолчанию? будет ли он использовать по умолчанию один ... по умолчанию? – Ophelia

+2

@Ophelia: Это зависит от контекста. Например, если вы предоставляете свой собственный конструктор, он больше не будет генерировать конструктор по умолчанию. Если вы все еще хотите его использовать, вы можете просто использовать '= default'. [Этот ответ] (http://stackoverflow.com/a/20829116/1139697) содержит некоторые сведения. – Zeta

+0

Спасибо, что понял. – Ophelia

Смежные вопросы