3

クラスBazvector::iterator. ループを実行するforと、次のエラーが発生します。

'const class std::unique_ptr' has no member named 'getName'

誰かが何が起こっているのか、どうすれば baz 内の一意のポインタ コレクションをループできるのか説明できますか? 前もって感謝します。

#include <iostream>
#include <string>
#include <memory>
#include <vector>

class BaseInterface
{
protected:

std::string Name;

public:

virtual ~BaseInterface(){}
virtual void setName( std::string ObjName ) = 0;
virtual std::string getName() = 0;
};

class Foo : public BaseInterface
{
public:

void setName( std::string ObjName )
{
    Name = ObjName;
}

std::string getName()
{
    return Name;
}

};

class Bar : public BaseInterface
{
public:

void setName( std::string ObjName )
{
    Name = ObjName;
}

std::string getName()
{
    return Name;
}

};

class Baz
{
    protected:

    std::vector< std::unique_ptr< BaseInterface > > PointerList;

    public:

    void push_back( std::unique_ptr< BaseInterface > Object )
    {
        PointerList.push_back( std::move( Object ) );
    }

    std::vector< std::unique_ptr< BaseInterface > >::const_iterator begin()
    {
        return PointerList.begin();
    }

    std::vector< std::unique_ptr< BaseInterface > >::const_iterator end()
    {
        return PointerList.end();
    }

};

int main( int argc, char ** argv )
{

std::unique_ptr< BaseInterface > FooObj( new Foo() );
FooObj->setName( "Foo" );

std::unique_ptr< BaseInterface > BarObj( new Bar() );
BarObj->setName( "Bar" );

std::unique_ptr< Baz > BazObj( new Baz() );

BazObj->push_back( std::move( FooObj ) );
BazObj->push_back( std::move( BarObj ) );

for( auto it = BazObj->begin(); it != BazObj->end(); ++it )
{
    std::cout << "This object's name is " << it->getName() << std::endl;
}

return 0;
}
4

1 に答える 1

3

最初にイテレータを逆参照する必要があります。

std::cout << "This object's name is " << (*it)->getName() << std::endl;
//                                       ^^^^^
于 2013-05-18T18:49:07.277 に答える