1

私はC++が初めてです(Javaから来ました)。C++ でクラスをまとめるのに問題があります。

このプログラムでの私の目標は、いくつかの文字列とカウンターを使用して基本的な Animal クラスを単純に実装することです。

作成したテキスト ファイルから読み取り、テキスト ファイル内の行をこれらの各変数に設定できるようにしたいと考えています。

種族門の子孫

次に、プログラムが 3 つのクラスすべての結果を出力するようにします。

デフォルトのコンストラクタを実装する方法がわかりません。

これが私のクラスです。

#include <iostream>
#include <string>

using namespace std;

class Animal
{
    string species;
                string family;
                string phylum;
                string desc;
                static int count;
   public:    
       bool readIn(ifstream&file, const string frame);
    void printInfo() const;
    void setAnimal(string s, string f, string p, string d);
    static int getCount();
    Animal(string s, string f, string p, string d);
    Animal(ifstream& file, const string fname);
};    

関数の定義は次のとおりです。

#include "animal.h"
#include <iostream>
#include <string>
using namespace std;

Animal::Animal(string s, string f, string p, string d)
{
        setAnimal(s,f,p,d);
}    

static int Animal::getCount()

{
    int i=0;
        i++;
        return i;
}

bool Animal::readIn(ifstream &myFile, const string fname)
{
        myFile.open(fname);
        if(myFile)
        {
                getline(myFile, species);
                getline(myFile, family);
                getline(myFile, phylum);
                getline(myFile, desc);
                myFile.close();
                return true;
        } 
        else
        return false;
}   


Animal::Animal(ifstream& file, const string fname)
{
        if(!readIn(file, fname) )
        species="ape";
        family="ape";
        phylum="ape";
        desc="ape";
        count = 1;
}   

void Animal::printInfo() const
{
cout << species << endl;
cout << family << endl;
cout << phylum << endl;
cout << desc << endl;
}

void Animal::setAnimal(string s, string f, string p, string d) 
{
        species = s, family = f, phylum = p, desc = d;
}

int main()
{
        ifstream myFile;
        Animal a;
        Animal b("homo sapien", "primate", "chordata", "erectus");
        Animal c(myFile, "horse.txt");
        a.printInfo();
        b.printInfo();
        c.printInfo();
}
4

3 に答える 3

2

デフォルトのコンストラクターは、パラメーターを指定せずに呼び出すことができるコンストラクターです。この説明は少し冗長に思えるかもしれないので、いくつかの可能性を検討してください。

通常、またはおそらくデフォルトで(しゃれなしで)、デフォルトのコンストラクターは単にパラメーターをとらないコンストラクターになります。

class Animal
{
public:
  Animal() {}; // This is a default constructor
};

また、パラメーターを受け取るコンストラクターを作成することもできますが、すべてのパラメーターにはデフォルトがあります。

class Animal
{
public:
  Animal(int age=42) : age_(age) {};  // This is a default constructor
private:
  int age_;
};

これは、パラメーターなしで呼び出すことができるため、デフォルトのコンストラクターでもあります。

Animal a;  // OK

クラスに 2 つのデフォルト コンストラクターが必要になることはありません。つまり、次のようなクラスを作成しようとしないでください。

class Animal
{
   public:

      Animal() {};
      Animal(int age=42) : age_(age) {}; 
    private:
      int age_;
};

C++ では、既定のコンストラクターを持たないクラスがある場合、コンパイラーが自動的にコンストラクターを生成します。ただし、他のコンストラクターを自分で既に宣言している場合、コンパイラーは既定のコンストラクターを自動的に生成しません。したがって、あなたの場合、他の 2 つのコンストラクター (どちらも「変換」コンストラクター) を既に宣言しているため、コンパイラーはデフォルトのコンストラクターを生成しません。定義されているように、クラスにはデフォルトのコンストラクターがないため、デフォルトのコンストラクトAnimalオブジェクトを作成することはできません。つまり、これはコンパイルされません。

Animal a;
于 2012-11-08T16:57:36.080 に答える
1

デフォルトのコンストラクターは、パラメーターを取らない単純なコンストラクターです。独自のコンストラクターを定義していない場合は、コンパイラーによって生成されます。

この自動生成されたものは、クラスのベースとメンバーのパラメーターなしのコンストラクターを呼び出す以外に何もしません。

パラメータなしのコンストラクタを自分で定義できます。

于 2012-11-08T16:53:57.477 に答える
0

デフォルトのコンストラクターを実装するには、既に行ったことを実行しますが、パラメーターは指定しません。

static int getCount();
Animal(string s, string f, string p, string d);
Animal(ifstream& file, const string fname);
Animal(); //Default Constructor

次に、実装で:

Animal::Animal(){
    species="ape";
    family="ape";
    phylum="ape";
    desc="ape";
    count = 1;
}
于 2012-11-08T16:53:42.537 に答える