0

我的代码中有许多错误,我似乎无法解决问题。当我运行代码时,我有 3 种不同类型的错误:

  • 非法成员初始化
  • 'class' 类型重新定义
  • 'return' : 无法转换

我想做的是创建一个空间模拟器,它有一个菜单驱动的前端。下面的代码能够从以下可能性列表中选择可能在太空中找到的项目:小行星、彗星、飞碟、火箭、空间站、宇航员、卫星、垃圾、月球。

然后需要在 spaceItem 工厂中创建此项目。

抽象类Item.h

class AItems // error C2011: 'AItems' : 'class' type redefinition
{
    std::string name;
public:
    AItems(std::string n)
        :name(n)
    {

    }

    //This method is for testing only
    std::string GetName()
    {
        return name;
    }
};

空间项目.h

#include <list>
#include <algorithm>
#include <stdexcept>
#include <memory>
#include <iostream>
using namespace std;

#include "Abstract Class Item.h"

//Lets declare all the concrete ITEMS

class Asteroid : public AItems // error C2504: 'AItems' : base class undefined
{
public: Asteroid() // error spaceitems.h(14): error C2614: 'Asteroid' : illegal member initialization: 'AItems' is not a base or member
            :AItems("Asteroid"){}
};

class Comet : public AItems
{
public: Comet() 
            :AItems("Comet"){}
};

class FlyingSaucer : public AItems
{
public: FlyingSaucer()
            :AItems("Flying Saucer"){}
};

class Rocket : public AItems
{
public: Rocket()
            :AItems("Rocket"){}
};

class SpaceStation : public AItems
{
public : SpaceStation()
             :AItems("Space Station"){}
};

class Astronaut : public AItems
{
public : Astronaut()
             :AItems("Astronaut"){}
};

class Satellite : public AItems
{
    public : Satellite()
                 :AItems("Satellite"){}
};

class Junk : public AItems
{
public : Junk()
             :AItems("Junk"){}
};

class Moon : public AItems
{
public : Moon()
             :AItems("Moon"){}};

选择项.h

    #include <list>
    #include <algorithm>
    #include <stdexcept>
    #include <memory>
    #include <iostream>
    using namespace std;

    #include "Abstract Class Item.h"
    #include "SpaceItems.h"

    class SelectItem
    {
    public:

        enum ITEM_TYPE
        {
            ASTEROID,
            COMET,
            FLYINGSAUCER,
            ROCKET,
            SPACESTATION,
            ASTRONAUT,
            SATELLITE,
            JUNK,
            MOON
        };

        static AItems* createItem(ITEM_TYPE itemType)
        {
            switch (itemType)
            {
            case ASTEROID:
                return new Asteroid(); //error C2440: 'return' : cannot convert from 'Asteroid *' to 'AItems *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
            case COMET:
                return new Comet();
            case FLYINGSAUCER:
                return new FlyingSaucer();
            case ROCKET:
                return new Rocket();
            case SPACESTATION:
                return new SpaceStation();
            case ASTRONAUT:
                return new Astronaut();
            case SATELLITE:
                return new Satellite();
            case JUNK:
                return new Junk();
            case MOON:
                return new Moon();
            }
            throw "Invalid Item Type";
        }
    };

主文件

#include <list>
#include <algorithm>
#include <iostream>
using namespace std;

#include "Select Item.h"

void item_information (SelectItem::ITEM_TYPE itemtype)
{
    AItems* createItem = SelectItem::createItem(itemtype);
    std::cout << "Item Type" << std::endl;
    std::cout << itemtype << std::endl;
    delete createItem; // warning C4150: deletion of pointer to incomplete type 'AItems'; no destructor called
}

int main()
{
    item_information (SelectItem::ASTEROID);
    item_information (SelectItem::COMET);
    item_information (SelectItem::FLYINGSAUCER);
    item_information (SelectItem::ROCKET);
    item_information (SelectItem::SPACESTATION);
    item_information (SelectItem::ASTRONAUT);
    item_information (SelectItem::SATELLITE);
    item_information (SelectItem::JUNK);
    item_information (SelectItem::MOON);
}

你能帮我看看我哪里出错了。谢谢

以下是错误列表:

spaceitems.h(13):错误 C2504:“AItems”:未定义的基类

spaceitems.h(14):错误 C2614:“小行星”:非法成员初始化:“AItems”不是基础或成员

spaceitems.h(19):错误 C2504:“AItems”:未定义的基类

spaceitems.h(20):错误 C2614:“彗星”:非法成员初始化:“AItems”不是基础或成员

spaceitems.h(25): 错误 C2504: 'AItems' : 基类未定义

spaceitems.h(26):错误 C2614:“FlyingSaucer”:非法成员初始化:“AItems”不是基础或成员

spaceitems.h(31): 错误 C2504: 'AItems' : 基类未定义

spaceitems.h(32):错误 C2614:“Rocket”:非法成员初始化:“AItems”不是基础或成员

spaceitems.h(37):错误 C2504:“AItems”:未定义基类

spaceitems.h(38):错误 C2614:“SpaceStation”:非法成员初始化:“AItems”不是基础或成员

spaceitems.h(43): 错误 C2504: 'AItems': 基类未定义

spaceitems.h(44):错误 C2614:“宇航员”:非法成员初始化:“AItems”不是基础或成员

spaceitems.h(49): 错误 C2504: 'AItems': 基类未定义

spaceitems.h(50):错误 C2614:“卫星”:非法成员初始化:“AItems”不是基础或成员

spaceitems.h(55): 错误 C2504: 'AItems': 基类未定义

spaceitems.h(56):错误 C2614:“垃圾”:非法成员初始化:“AItems”不是基础或成员

spaceitems.h(61): 错误 C2504: 'AItems' : 基类未定义

spaceitems.h(62):错误 C2614:“Moon”:非法成员初始化:“AItems”不是基础或成员

选择 item.h(33):错误 C2440:“返回”:无法从“小行星 *”转换为“AItems *” 指向的类型是不相关的;转换需要 reinterpret_cast、C-style cast 或 function-style cast

选择 item.h(35):错误 C2440:“返回”:无法从“彗星 *”转换为“AItems *” 指向的类型是不相关的;转换需要 reinterpret_cast、C-style cast 或 function-style cast

选择 item.h(37):错误 C2440:'return':无法从 'FlyingSaucer *' 转换为 'AItems *' 指向的类型是不相关的;转换需要 reinterpret_cast、C-style cast 或 function-style cast

选择 item.h(39):错误 C2440:'return':无法从 'Rocket *' 转换为 'AItems *' 指向的类型是不相关的;转换需要 reinterpret_cast、C-style cast 或 function-style cast

选择 item.h(41):错误 C2440:'return':无法从 'SpaceStation *' 转换为 'AItems *' 指向的类型是不相关的;转换需要 reinterpret_cast、C-style cast 或 function-style cast

选择 item.h(43):错误 C2440:“返回”:无法从“宇航员 *”转换为“AItems *” 指向的类型是不相关的;转换需要 reinterpret_cast、C-style cast 或 function-style cast

选择 item.h(45):错误 C2440:“返回”:无法从“卫星 *”转换为“AItems *” 指向的类型是不相关的;转换需要 reinterpret_cast、C-style cast 或 function-style cast

选择 item.h(47):错误 C2440:'return':无法从 'Junk *' 转换为 'AItems *' 指向的类型是不相关的;转换需要 reinterpret_cast、C-style cast 或 function-style cast

选择 item.h(49):错误 C2440:'return':无法从 'Moon *' 转换为 'AItems *' 指向的类型是不相关的;转换需要 reinterpret_cast、C-style cast 或 function-style cast

main.cpp(13):警告 C4150:删除指向不完整类型“AItems”的指针;没有调用析构函数

我已经解决了这个问题。但是,它没有做我想做的事。我希望能够选择一个项目,然后显示该项目。

相反,它显示以下内容

Item Type 0 Item Type 1 Item Type 2

以此类推,直到第 8 位。

该程序应该向我询问项目并列出该特定项目,有人可以帮忙吗?

4

2 回答 2

0

如前所述,我会说放入一些双重防护!

但是,我确实尝试过,Visual Studio/C++ 2010 编译得很好:

#include "stdafx.h"


#include <list>
#include <algorithm>
#include <stdexcept>
#include <memory>
#include <iostream>

class AItems
{
    std::string name;
public:
    AItems(std::string n)
        :name(n)
    {

    }

    //This method is for testing only
    std::string GetName()
    {
        return name;
    }
};




//Lets declare all the concrete ITEMS

class Asteroid : public AItems
{
public: Asteroid()
            :AItems("Asteroid"){}
};

class Comet : public AItems
{
public: Comet() 
            :AItems("Comet"){}
};

class FlyingSaucer : public AItems
{
public: FlyingSaucer()
            :AItems("Flying Saucer"){}
};

class Rocket : public AItems
{
public: Rocket()
            :AItems("Rocket"){}
};

class SpaceStation : public AItems
{
public : SpaceStation()
             :AItems("Space Station"){}
};

class Astronaut : public AItems
{
public : Astronaut()
             :AItems("Astronaut"){}
};

class Satellite : public AItems
{
    public : Satellite()
                 :AItems("Satellite"){}
};

class Junk : public AItems
{
public : Junk()
             :AItems("Junk"){}
};

class Moon : public AItems
{
public : Moon()
             :AItems("Moon"){}};



#include <list>
#include <algorithm>
#include <stdexcept>
#include <memory>
#include <iostream>


class SelectItem
{
public:

    enum ITEM_TYPE
    {
        ASTEROID,
        COMET,
        FLYINGSAUCER,
        ROCKET,
        SPACESTATION,
        ASTRONAUT,
        SATELLITE,
        JUNK,
        MOON
    };

    static AItems* createItem(ITEM_TYPE itemType)
    {
        switch (itemType)
        {
        case ASTEROID:
            return new Asteroid();
        case COMET:
            return new Comet();
        case FLYINGSAUCER:
            return new FlyingSaucer();
        case ROCKET:
            return new Rocket();
        case SPACESTATION:
            return new SpaceStation();
        case ASTRONAUT:
            return new Astronaut();
        case SATELLITE:
            return new Satellite();
        case JUNK:
            return new Junk();
        case MOON:
            return new Moon();
        }
        throw "Invalid Item Type";
    }
};


#include <list>
#include <algorithm>
#include <iostream>


void item_information (SelectItem::ITEM_TYPE itemtype)
{
    AItems* createItem = SelectItem::createItem(itemtype);
    std::cout << "Item Type" << std::endl;
    std::cout << itemtype << std::endl;
    delete createItem;
}


int _tmain(int argc, _TCHAR* argv[])
{
    item_information (SelectItem::ASTEROID);
    item_information (SelectItem::COMET);
    item_information (SelectItem::FLYINGSAUCER);
    item_information (SelectItem::ROCKET);
    item_information (SelectItem::SPACESTATION);
    item_information (SelectItem::ASTRONAUT);
    item_information (SelectItem::SATELLITE);
    item_information (SelectItem::JUNK);
    item_information (SelectItem::MOON);
}
于 2013-04-15T13:58:08.467 回答
0

你需要包括警卫

如果你在一个源文件中多次包含一个头文件,编译器会报错多个定义。这是因为头文件完全包含在源文件中。

执行此操作的最常见和标准的方法是使用预处理器来确保内容不包含多次。

一些随机头文件:

#ifndef SOME_RANDOM_HEADER_FILE
#define SOME_RANDOM_HEADER_FILE

// Contents of header file

#endif // SOME_RANDOM_HEADER_FILE

这将确保#ifndef和之间的所有内容#endif仅包含在源文件中一次。

还有一个更新的东西,主要由 Visual C++ 使用,称为#pragma once. 您将它放在头文件的顶部,编译器将确保头文件在源文件中不会被多次包含。

还应该注意的是,这些方法不会阻止头文件包含在多个源文件中。

于 2013-04-15T14:11:36.927 回答