首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在编译时Mammal.h类出现错误

为什么在编译时Mammal.h类出现错误
EN

Stack Overflow用户
提问于 2010-12-31 17:00:22
回答 4查看 1.7K关注 0票数 2

伙计们,为什么我在这里收到错误?在Visual C++中执行了以下操作

Mammal.h类文件

代码语言:javascript
复制
#include <iostream>
using namespace std;

class Mammal
{
public:
    //constructor
    Mammal() { cout << "Mammal constructor...\n"; }
    Mammal(int age) { maAge = age; cout << "Mammal age constructor...\n"; }
    ~Mammal() { cout << "Mammal destructor...\n"; }
    //accessors
    void setMaAge(int age) { maAge = age; }
    void setMaWeight(int weight) { maWeight = weight; }
    int getMaAge() { return maAge; }
    int getMaWeight() { return maWeight; }
    //other func
    void speak() { cout << "Mammal Sound!...\n"; }
    void maSleep() { cout << "Mammal Sleeping!...\n"; }
protected:
    int maAge, maWeight;
};

Dog.h类文件

代码语言:javascript
复制
#include <iostream>
#include "Mammal.h"
using namespace std;
enum BREED { golden, shepard, lab, doberman };
class Dog : public Mammal
{
public:
    //constructor
    Dog() { cout << "Constructing dog!...\n"; }
    Dog(int age) { Mammal(age); cout << "Constructing dog with age!...\n"; }
    Dog(int age, BREED breed) { Mammal(age); dogBreed = breed; 
    cout << "Constructing dog with age and breed!... \n"; }
    Dog(int age, int weight) { Mammal(age); maWeight = weight;
    cout << "Constructing dog with age and weight!...\n"; }
    ~Dog(){ cout << "Destruction of dog!...\n"; }
    //accessors
    void setDogAge(int age) { maAge = age; }
    void setDogWeight(int weight) { maWeight = weight; }
    void setDogBreed(BREED breed) { dogBreed = breed; }
    int getDogAge() { return maAge; }
    int getDogWeight() { return maWeight; }
    int getDogBreed() { return dogBreed; }
    //other func
    void dogWagTail() { cout << "Dog Wagging Tail!...\n"; }
    void dogBegFood() { cout << "Dos is Hungry!... Wants a bone.\n"; }
    void speak() { cout << "Dog Sound: Wof, Wof!\n"; }
private:
    BREED dogBreed;
};

main.cpp文件

代码语言:javascript
复制
#include <iostream>
#include "Mammal.h"
#include "Dog.h"
using namespace std;

int main()
{
    Mammal fourLegs;//const mammal
    Dog Champ;//const dogs
    Dog Pimp(4, lab);
    Dog Mango(2, 54);
    fourLegs.speak();
    Champ.speak();
    Champ.setDogBreed(doberman);
    Pimp.setDogWeight(123);
    cout << "Pimp is: " << Pimp.getDogAge() << " years old - Weight: " << Pimp.getDogWeight() 
        << " pounds - breed: " << Pimp.getDogBreed() << endl;
    Mango.dogWagTail();
    system("pause");
    return 0;
}

错误:

代码语言:javascript
复制
1>------ Build started: Project: Overriding, Configuration: Debug Win32 ------
1>  main.cpp
1>c:\users\jorge\documents\visual studio 2010\projects\overriding\overriding\mammal.h(5): error C2011: 'Mammal' : 'class' type redefinition
1>          c:\users\jorge\documents\visual studio 2010\projects\overriding\overriding\mammal.h(5) : see declaration of 'Mammal'
1>c:\users\jorge\documents\visual studio 2010\projects\overriding\overriding\dog.h(6): error C2504: 'Mammal' : base class undefined
1>c:\users\jorge\documents\visual studio 2010\projects\overriding\overriding\dog.h(10): error C2079: 'age' uses undefined class 'Mammal'
1>c:\users\jorge\documents\visual studio 2010\projects\overriding\overriding\dog.h(10): error C2082: redefinition of formal parameter 'age'
1>c:\users\jorge\documents\visual studio 2010\projects\overriding\overriding\dog.h(11): error C2079: 'age' uses undefined class 'Mammal'
1>c:\users\jorge\documents\visual studio 2010\projects\overriding\overriding\dog.h(11): error C2082: redefinition of formal parameter 'age'
1>c:\users\jorge\documents\visual studio 2010\projects\overriding\overriding\dog.h(13): error C2079: 'age' uses undefined class 'Mammal'
1>c:\users\jorge\documents\visual studio 2010\projects\overriding\overriding\dog.h(13): error C2082: redefinition of formal parameter 'age'
1>c:\users\jorge\documents\visual studio 2010\projects\overriding\overriding\dog.h(13): error C2065: 'maWeight' : undeclared identifier
1>c:\users\jorge\documents\visual studio 2010\projects\overriding\overriding\dog.h(17): error C2065: 'maAge' : undeclared identifier
1>c:\users\jorge\documents\visual studio 2010\projects\overriding\overriding\dog.h(18): error C2065: 'maWeight' : undeclared identifier
1>c:\users\jorge\documents\visual studio 2010\projects\overriding\overriding\dog.h(20): error C2065: 'maAge' : undeclared identifier
1>c:\users\jorge\documents\visual studio 2010\projects\overriding\overriding\dog.h(21): error C2065: 'maWeight' : undeclared identifier
1>c:\users\jorge\documents\visual studio 2010\projects\overriding\overriding\main.cpp(8): error C2079: 'fourLegs' uses undefined class 'Mammal'
1>c:\users\jorge\documents\visual studio 2010\projects\overriding\overriding\main.cpp(12): error C2228: left of '.speak' must have class/struct/union
1>          type is 'int'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

感谢您的任何帮助

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-12-31 17:11:07

请阅读以下内容:

1>c:\users\jorge\documents\visual studio类错误C2011:‘哺乳动物’:‘类’类型重定义

现在,当您的程序编译(从main.cpp开始)时,它包含iostream,然后是Mammal.h,然后是Dog.h。

当包含Mammal.h和Dog.h时,程序还会包含来自这些文件的所有包含内容。

因此,Mammal.h首先来自main.cpp,然后来自Dog.h

要删除此错误,只需使用#ifndef#define#endif,如下所示:

代码语言:javascript
复制
#ifndef _MAMMAL_H
#define _MAMMAL_H
#include <iostream>
using namespace std;

class Mammal
{
public:
    //constructor
    Mammal() { cout << "Mammal constructor...\n"; }
    Mammal(int age) { maAge = age; cout << "Mammal age constructor...\n"; }
    ~Mammal() { cout << "Mammal destructor...\n"; }
    //accessors
    void setMaAge(int age) { maAge = age; }
    void setMaWeight(int weight) { maWeight = weight; }
    int getMaAge() { return maAge; }
    int getMaWeight() { return maWeight; }
    //other func
    void speak() { cout << "Mammal Sound!...\n"; }
    void maSleep() { cout << "Mammal Sleeping!...\n"; }
protected:
    int maAge, maWeight;
};
#endif

一定要在所有的.h文件中包含#ifndef、#define和#endif。

票数 3
EN

Stack Overflow用户

发布于 2010-12-31 17:10:01

除了包含保护,在Dog对象中你初始化Mammal对象的方式是错误的,你应该像这样初始化你的基类;

代码语言:javascript
复制
Dog(int age) : Mammal(age) { ... }
票数 2
EN

Stack Overflow用户

发布于 2010-12-31 17:04:02

你应该在你的头中使用include guards

main.cpp在包含Dog.h之前包含了Mammal.h,而Dog.h本身也包含了Mammal.h。这意味着在main中重新定义了Mammal类,因此出现了编译器错误。包括保护你不受此伤害的守卫。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4569122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档