12

この非常に単純なコードをコンパイルしようとしています

class myList
{
public:
    std::vector<std::string> vec;
    class Items
    {
    public:
        void Add(std::string str)
        {
            myList::vec.push_back(str);
        };
    }items;
};

int main()
{
    myList newList;
    newList.items.Add("A");
}

必要なオブジェクトを作成したり、過度に複雑にしたりすることなく、これを機能させるにはどうすればよいですか...

4

6 に答える 6

15

親クラスへのコンストラクターとポインターをいくつか追加します。

#include <string>
#include <vector>
class myList
{
public:
    std::vector<std::string> vec;
    myList(): items(this) {} // Added
    class Items
    {
    public:
        Items(myList *ml): self(ml) {}  // Added
        void Add(std::string str)
        {
                self->vec.push_back(str); // Changed
        };
        myList *self; //Added
    }items;
};

int main()
{
    myList newList;
    newList.items.Add("A");
}

myList() コンストラクターが必要なので、それ自体のインスタンスを内部クラス メンバー変数のインスタンスに登録します。次に、外側の myList クラス インスタンスへのポインターを格納するための Items コンストラクターが必要です。最後に、Add メソッドで、保存された myList インスタンスで vec を参照する必要があります。

Catskul が指摘しているように、Item コンストラクターは、受け取った myList ポインターを実際に処理してはなりません。また、この回答は元の意図に近いですが、steveth45 の回答は実際のプログラムでやりたいことにより近いと言いたいです。

于 2008-10-25T21:52:43.657 に答える
11

このようにして、クラス メンバーを直接公開しません。あなたの例は少しオーバーアーキテクチャのようです。std::vector をクラスに入れ、それを public として公開するのはなぜですか?

class myList
{
private:
    std::vector<std::string> vec;
public:
    void Add(std::string str)
    {
        vec.push_back(str);
    };
};

int main()
{
    myList newList;
    newList.Add("A");
}
于 2008-10-25T21:52:55.730 に答える
5

Java とは異なり、C++ の内部オブジェクトは外部の「this」ポインターにアクセスできません。

Richard Quirk のソリューションは、C++ で得られる最も近いものです。

于 2008-10-25T21:58:54.190 に答える
2

内部クラスは名前だけで関連付けられます。そのような基本クラスのベクトルを参照することはできません。

ベクターを内部クラスに移動するか、ベクターへの参照を保存する必要があります。

于 2008-10-25T21:53:13.717 に答える
1

この投稿は数年前のものですが、何か役立つものを追加できるかもしれません。元の投稿のクラスのデザインはそれほど見栄えが良くないと言いますが、埋め込まれたクラスが含まれているクラスにアクセスできるようにすると便利な場合があります。これは、余分なポインタを格納せずに簡単に実行できます。以下に例を示します。いくつかの既存のコードからそれを取り、いくつかの名前を変更したので、それは機能するはずです。重要なのはEmbeddorOfマクロです。チャームのように機能します。

////////////////////.hファイル/////////////////////////

struct IReferenceCounted
{
    virtual unsigned long AddRef() = 0;
    virtual unsigned long Release() = 0;
};

struct IFoo : public IReferenceCounted
{
};

class Foo : public IFoo
{
public:
    static IFoo* Create();
    static IFoo* Create(IReferenceCounted* outer, IReferenceCounted** inner);

private:
    Foo();
    Foo(IReferenceCounted* outer);
    ~Foo();

    // IReferenceCounted

    unsigned long AddRef();
    unsigned long Release();

private:
    struct EIReferenceCounted : IReferenceCounted
    {
        // IReferenceCounted

        unsigned long AddRef();
        unsigned long Release();
    } _inner;

    unsigned long _refs;
    IReferenceCounted* _outer;
};

////////////////.cppファイル/////////////////

#include <stdio.h>
#include <stddef.h>
#include "Foo.h"

#define EmbeddorOf(class, member, this) \
    (class *) ((char *) this - offsetof(class, member))

// Foo

Foo::Foo() : _refs(1), _outer(&this->_inner)
{
}

Foo::Foo(IReferenceCounted* outer) : _refs(1), _outer(outer)
{
}

Foo::~Foo()
{
    printf("Foo::~Foo()\n");
}

IFoo* Foo::Create()
{
    return new Foo();
}

IFoo* Foo::Create(IReferenceCounted* outer, IReferenceCounted** inner)
{
    Foo* foo = new Foo(outer);
    *inner = &foo->_inner;
    return (IFoo*) foo;
}

// IReferenceCounted

unsigned long Foo::AddRef()
{
    printf("Foo::AddRef()\n");
    return this->_outer->AddRef();
}

unsigned long Foo::Release()
{
    printf("Foo::Release()\n");
    return this->_outer->Release();
}

// Inner IReferenceCounted

unsigned long Foo::EIReferenceCounted::AddRef()
{
    Foo* pThis = EmbeddorOf(Foo, _inner, this);
    return ++pThis->_refs;
}

unsigned long Foo::EIReferenceCounted::Release()
{
    Foo* pThis = EmbeddorOf(Foo, _inner, this);
    unsigned long refs = --pThis->_refs;
    if (refs == 0)
        {

        // Artifically increment so that we won't try to destroy multiple
        // times in the event that our destructor causes AddRef()'s or
        // Releases().

        pThis->_refs = 1;
        delete pThis;
        }
    return refs;
}

ニック

于 2012-12-28T22:46:17.670 に答える
0

これは、次の構成で簡略化できます。

typedef std::vector<std::string> myList;

本当にSTLベクトルを直接使ってみませんか?このようにして、すべての標準アルゴリズムをデータで機能させることができます。

于 2009-10-02T11:37:45.787 に答える