0

コードにいくつかのエラーがあり、問題を解決できないようです。コードを実行すると、3 種類のエラーが発生します。

  • 不正なメンバーの初期化
  • 「クラス」タイプの再定義
  • '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;
    }
};

SpaceItem.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"){}};

SelectItem.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";
        }
    };

main.cpp

#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: 'Asteroid': メンバーの初期化が無効です: 'AItems' はベースまたはメンバーではありません

spaceitems.h(19): エラー C2504: 'AItems': 基本クラスが定義されていません

spaceitems.h(20): エラー C2614: 'Comet': メンバーの初期化が無効です: '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: 'Astronaut': メンバーの初期化が無効です: 'AItems' はベースまたはメンバーではありません

spaceitems.h(49): エラー C2504: 'AItems': 基本クラスが定義されていません

spaceitems.h(50): エラー C2614: 'Satellite': メンバーの初期化が無効です: 'AItems' はベースまたはメンバーではありません

spaceitems.h(55): エラー C2504: 'AItems': 基本クラスが定義されていません

spaceitems.h(56): エラー C2614: 'ジャンク': メンバーの初期化が無効です: 'AItems' はベースまたはメンバーではありません

spaceitems.h(61): エラー C2504: 'AItems': 基本クラスが定義されていません

spaceitems.h(62): エラー C2614: 'Moon': メンバーの初期化が無効です: 'AItems' はベースまたはメンバーではありません

select item.h(33): エラー C2440: 'return': 'Asteroid *' から 'AItems *' に変換できません 指されている型は無関係です。変換には reinterpret_cast、C スタイルのキャスト、または関数スタイルのキャストが必要です

select item.h(35): エラー C2440: 'return': 'Comet *' から 'AItems *' に変換できません 指されている型は無関係です。変換には reinterpret_cast、C スタイルのキャスト、または関数スタイルのキャストが必要です

select item.h(37): エラー C2440: 'return': 'FlyingSaucer *' から 'AItems *' に変換できません 指されている型は無関係です。変換には reinterpret_cast、C スタイルのキャスト、または関数スタイルのキャストが必要です

select item.h(39): エラー C2440: 'return': 'Rocket *' から 'AItems *' に変換できません 指されている型は無関係です。変換には reinterpret_cast、C スタイルのキャスト、または関数スタイルのキャストが必要です

select item.h(41): エラー C2440: 'return': 'SpaceStation *' から 'AItems *' に変換できません 指されている型は無関係です。変換には reinterpret_cast、C スタイルのキャスト、または関数スタイルのキャストが必要です

select item.h(43): エラー C2440: 'return': 'Astronaut *' から 'AItems *' に変換できません 指されている型は無関係です。変換には reinterpret_cast、C スタイルのキャスト、または関数スタイルのキャストが必要です

select item.h(45): エラー C2440: 'return': 'Satellite *' から 'AItems *' に変換できません 指されている型は無関係です。変換には reinterpret_cast、C スタイルのキャスト、または関数スタイルのキャストが必要です

select item.h(47): エラー C2440: 'return': 'Junk *' から 'AItems *' に変換できません 指されている型は無関係です。変換には reinterpret_cast、C スタイルのキャスト、または関数スタイルのキャストが必要です

select item.h(49): エラー C2440: 'return': 'Moon *' から 'AItems *' に変換できません 指されている型は無関係です。変換には reinterpret_cast、C スタイルのキャスト、または関数スタイルのキャストが必要です

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ソース ファイルに 1 回だけ含まれるようになります。

主に Visual C++ で使用される という新しいものもあり#pragma onceます。これをヘッダー ファイルの先頭に配置すると、コンパイラはヘッダー ファイルがソース ファイルに複数回含まれないようにします。

これらのメソッドは、ヘッダー ファイルが複数のソース ファイルに含まれるのを防ぐものではないことにも注意してください。

于 2013-04-15T14:11:36.927 に答える