类和静态变量的问题

时间:2018-07-12 01:39:31

标签: c++ class static

我无法解决静态类变量的使用问题,以及与函数文件相对应包含在主文件中的确切内容。当我尝试编译代码时,会出现大量错误。

提供的问题要求我创建一个静态ID变量,每个新动物(例如Elephant和Cheetah)都会对它进行递增,因此大象会显示ID 1和Cheetah ID2。我知道我的animal.h文件格式正确,但是我不确定main和animal.cpp文件。

有人可以纠正我的代码中存在的任何问题吗?谢谢!

animal.h

Object.setPrototypeOf()

animal.cpp

#include <iostream>
#include <string>

using namespace std;

#ifndef ANIMAL_H
#define ANIMAL_H

class animal{
public:
animal();
animal(string aSpecies);            //Animals are allocated a unique ID on 
 //creation,
                                    //the first animal has ID 1, second is 2 
 //and so on
void set_name(string aName);        //Change the animals name
string get_species();
string get_name();
std::string name;
std::string species;
int get_ID();                       //The animals unique ID

static int currentID;                   //The next ID number to give out
~animal();
};

#endif //ANIMAL_H

main-1-1.cpp

#include <iostream>
#include "animal.h"

using namespace std;


//static ID variable
int animal::currentID = 0 ;


//Default animal constructor implementation
animal::animal(){
  name = "?";
  currentID++;
}

animal::animal(string aSpecies){
  species = aSpecies;
}

void animal::set_name(string aName){
  name = aName;

}

std::string animal::get_species(){
  return species;
}

std::string animal::get_name(){
  return name;
}

2 个答案:

答案 0 :(得分:0)

您似乎正确地声明了静态变量并将其设置为零。但是,您需要在构造函数(animal::animal)中对其进行递增。

另一个问题是您正在使用new关键字在堆上分配两个动物,但是随后您将指针分配给animal对象。您可以通过以下两种方法来解决此问题:

animal Elephant("Elephant");    // Not on the heap

OR

animal *Elephant = new animal("Elephant");   // Elephant is a pointer to an object on the heap

另一件事,std::cout无法知道如何打印这些对象。而不是直接打印它们,您应该调用get_函数之一:

cout << "The animal " << Elephant.get_species() << ... ;

最后,如果您希望能够访问动物的ID,则需要将ID存储为成员变量,并使用静态ID变量作为增量,以确保每个动物都有唯一的连续ID。 / p>

答案 1 :(得分:0)

有一些语法可以纠正

静态成员变量具有类命名空间,因此在main中还必须使用

对其进行调用
animal::currentID

然后,new返回一个指针,因此ElephantCheetah的声明应类似于

animal* Elephant;
animal* Cheetah;
Elephant = new animal("Elephant");
Cheetah = new animal("Cheetah");

但是,没有理由在这里使用指针,只需这样做

animal Elephant("Elephant");
animal Cheetah("Cheetah");

此外,尚未在类主体中定义默认构造函数,您必须添加

animal();

到类声明。

类主体中缺少成员namespecies,因此请确保添加

private:
std::string name, species;

到班级正文

尚无<<的{​​{1}}运算符,因此输出不知道要做什么。您可以将它们添加到类中,或仅输出animal的{​​{1}}成员。重载运算符看起来像这样

species

您通常将其声明为朋友非成员,因此添加

animal

对于类主体,这使操作员可以访问std::ostream& operator<<(std::ostream &os, animal const &A){ os << "The animal " << A.name << " is of species " << A.species << " and has ID " << A.myID; }; 的私有成员。请注意,这需要friend std::ostream& operator<<(std::ostream &os, animal const &A); 才能使animal工作。然后,您可以做

<iostream>

它将打印animal的描述。

一些其他建议:

在头文件中包含std::cout << Cheetah << std::endl; 是很危险的事情,它可能会将事情带到您不知道的范围内。

根据您发布的代码,Cheetah没有理由成为using namespace的成员,它只能是currentID中的局部变量。如果要自动跟踪,可以添加一个非animal成员main,并在构建时像这样增加ID

static