2016-05-20 10 views
-5

このエラーに関する質問は繰り返し聞かれましたが、これまでの回答は私の問題を解決するものではありません。"抽象クラス型のオブジェクトを割り当てる"エラーすべての関数に実装があります

私は純粋な抽象クラスITileあります

class ITile { 
public: 
    virtual ~ITile() {} 
    virtual void display() = 0; 
    virtual bool isWalkable() = 0; 
    virtual bool isGoal() = 0; 
}; 

そして、すべてのようにように、これらの機能を実装する3つのサブクラス:

Floor.h

#include "ITile.h" 

class Floor : public ITile { 
public: 
    Floor(); 
    virtual ~Floor(); 
    virtual void display() override; 
    virtual bool isWalkable() override; 
    virtual bool isGoal() override; 
}; 

Floor.cppを

#include "Floor.h" 
#include <iostream> 
using namespace std; 

Floor::Floor() {} 
Floor::~Floor() {} 

void Floor::display() { 
    cout << " "; 
} 

bool Floor::isWalkable() { 
    return true; 
} 

bool Floor::isGoal() { 
    return false; 
} 

私は次の出力を取得し、プロジェクト全体のコンパイルしようとしている:

g++ -std=c++0x -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/main.d" -MT"src/main.d" -o "src/main.o" "../src/main.cpp" 
In file included from ../src/main.cpp:1: 
In file included from ../src/board.h:1: 
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/vector:265: 
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/__bit_reference:15: 
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/algorithm:627: 
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/memory:1641:31: error: allocating an object of abstract class type 'ITile' 
     ::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...); 
[...] 

...ノートの束が続いています。しかし、問題は、私が推測すると、上記の最後の行のエラーです。

このように、algorithmmemoryなどのファイルは正確に何ですか?どうすればこのエラーを取り除くことができますか?

私はMac OS X(Mavericks)のC/C++プラグインでEclipse Lunaを開発者コマンドラインツールで使用しています。ご要望に応じてより多くの情報を喜んで提供します。

ありがとうございます!

+4

あなたはあなたの例では少しも最小限に行ってきました。投稿してください[mcve] – NathanOliver

+2

@ NathanOliver:あまりにも少なすぎないです。それは不完全だということです。彼はすべてを結びつける 'main'関数を欠いている。ほぼ確実に 'ベクトル'を使用しているもの。 –

+0

@ NathanOliverまあ、私自身は他の人の完全なプロジェクトを通して読書を憎む。私はこれが私の間違いを見つけるのに十分かもしれないと思った。他に何を投稿すべきですか? –

答えて

2

std::vector<ITile>は、ITileは存在しないため、宣言することはできません。

多型をコンテナで使用するには、ポインタを格納する必要があります。これらのポインタは、タイプFloorWall,Ceiling&hellipの動的に割り当てられたオブジェクトを指します。あなたが持っているものは何でも。

と考えると、std::vector<std::unique_ptr<ITile>>とします。

+0

空の 'std :: vector 'が、CopyConstructible型やCopyAssignable型を必要とする操作を呼び出さない限り、C++ 11以降はうまくいきませんが(これは無用ですが)、抽象クラスとはどのように見えますか不完全な型ではありません。 –

+0

@ChristianHackl:実装についての標準的な要求事項がどれくらいあるかわかりません。ベクトルが5つの「ITile」のために十分なスペースを確保していたなら、それでも問題はありませんか?私はそれができるsizeof(ITile)を知ることだけが必要であることを認識しています。実際には、実際には、後で誰かが実際の要素を作成するときに新しいchar型を配置することになるでしょう。しかし、それは保証されていますか?うーん。 –

+0

@ChristianHackl準拠の実装でこれを許可する必要があります。ベクタに格納された型への要件は、前記ベクタに対して呼び出される関数によって要求されます。 'vector :: vector()'は、基になる型には何も要求しません。 – SergeyA

1

ITileは抽象クラスです。

以前のC++ 11コンパイラでは、std::vector<ITile>を作成することはできません。 std::vectorは、CopyConstructibleおよびCopyAssignable型でのみ使用できます。抽象クラスはCopyConstructibleでもCopyAssignableでもありません。

C++ 11以降のコンパイラを使用している場合は、タイプをCopyConstructibleにする必要はなく、CopyAssignableでstd::vectorを作成する必要はありません。他のメンバ関数がそれらの要件を課すかもしれない。コンパイラが厳密に準拠していない場合、そのような型の場合はstd::vectorを構築できません。

さらに詳しい情報:

http://en.cppreference.com/w/cpp/container/vector http://en.cppreference.com/w/cpp/concept/CopyConstructible http://en.cppreference.com/w/cpp/concept/CopyAssignable

+0

あまりにも遅い老人! –

+0

あなたはある日、中年の男になるでしょう! –

+0

そして、RSahuを追加するには、@ LightnessRacesinOrbitが十分に幸運であれば彼はそこに着くでしょう! – SergeyA

関連する問題