0

私は現在 C++ を学んでおり、「C++ Primer 5th Edition」を読んでいます。コンストラクターについて学び始めたばかりで、理解できない問題が少しあります。

#ifndef SALES_DATA_H
#define SALES_DATA_H
#include <string>
struct Sales_data
{
    //default constructor
    Sales_data(const std::string &s, unsigned n, double p):
               bookNo(s), units_sold(n), revenue(p*n) { } 
    //new members: operations on Sales_data objects
    std::string isbn() const { return bookNo; }
    Sales_data& combine(const Sales_data&);
    double avg_price() const;
    //data members
    std::string bookNo;
    unsigned units_sold;
    double revenue;
};

私が書いたデフォルトのコンストラクターが正しいと確信しています (それが本に書かれているものであることを考慮して) が、明らかにここに何かが欠けています。構文エラーなどは表示されず、すべての組み込みメンバーが初期化されているため、何が問題なのかわかりません。

編集 :

エラーが発生したのはヘッダーファイルではなく、実際にはソースファイルであることがわかりました。次のような Sales_data オブジェクトを作成すると:

Sales_data total;

「適切なデフォルトコンストラクターがありません」というエラーが表示されます。著者がデフォルトのコンストラクターを記述するための 3 つの方法を提供したことを考えると、何が問題なのかまだわかりません。これらは次のとおりです。

struct Sales_data {
// constructors added
Sales_data() = default;   //Number 1
Sales_data(const std::string &s): bookNo(s) { }    //Number 2
Sales_data(const std::string &s, unsigned n, double p):    //Number 3
           bookNo(s), units_sold(n), revenue(p*n) { }

それらがデフォルトのコンストラクターでない場合、正確には何ですか/その目的は何ですか?

4

3 に答える 3

3

A default constructor is a constructor that can be called without passing any argument.

This means that it must take no parameters or that all of them must have a default value.

The default constructor is needed for example when you write

MyClass x;

because the compiler must be able to generate code to build such an object without any arguments.

Also standard containers may require a default constructor depending on how you use them: for example if you use std::vector::resize the library can be asked to increase the size of a vector containing your class instances, thus it must be able to create elements without providing any argument.

于 2013-09-26T09:37:10.983 に答える
0

クラスのコンストラクターは 3 つのパラメーターを受け取ります。これらは、オブジェクトを構築しようとするときに指定する必要があります。現在の変数宣言にはパラメーターがありません:

Sales_data total;

パラメーターが指定されていないため、コンパイラーはパラメーターを取らないコンストラクターを使用しようとします。このようなコンストラクタは、「デフォルト コンストラクタ」とも呼ばれます。クラスにはパラメーターのないコンストラクターがないため、これは機能しません。

既存のコンストラクターを使用するには、オブジェクトを作成するときにパラメーターを指定する必要があります。

Sales_data total("books", 28, 15.99);

Sales_dataまたは、パラメーターをとらないコンストラクター (デフォルト コンストラクター) を追加し、いくつかのデフォルト値でクラスを初期化することもできます。

于 2013-09-26T10:11:22.050 に答える