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

最佳答案

默认构造函数是可以在不指定参数的情况下调用的构造函数。此描述似乎有些冗长,因此请考虑几种可能性。

通常,或者可能默认情况下(无双关语),默认构造函数将只是不带参数的构造函数:

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;

关于c++ - C++了解类和构造函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13293658/

10-17 00:17