我无法解决静态类变量的使用问题,以及与函数文件相对应包含在主文件中的确切内容。当我尝试编译代码时,会出现大量错误。
提供的问题要求我创建一个静态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;
}
答案 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
返回一个指针,因此Elephant
和Cheetah
的声明应类似于
animal* Elephant;
animal* Cheetah;
Elephant = new animal("Elephant");
Cheetah = new animal("Cheetah");
但是,没有理由在这里使用指针,只需这样做
animal Elephant("Elephant");
animal Cheetah("Cheetah");
此外,尚未在类主体中定义默认构造函数,您必须添加
animal();
到类声明。
类主体中缺少成员name
和species
,因此请确保添加
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