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 回答