C ++了解类和构造函数

时间:2012-11-08 16:48:09

标签: c++ string class object text

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

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

默认构造函数只是一个不带参数的构造函数。如果您没有定义自己的构造函数,编译器会为您生成一个。

这个自动生成的除了调用类'base和members的no-param构造函数之外什么都不做。

您可以自己定义一个无参数构造函数。

答案 2 :(得分: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;
}