2008-10-25 41 views
12

我試圖編譯這個非常簡單的代碼C++嵌套類快把我逼瘋了

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

我能做些什麼,使這項工作,而不產生需要更多的物體或過於複雜的東西...

+3

從Java即將:-) – 2008-10-25 21:59:01

回答

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()構造函數,因此它將自身的實例註冊到內部類成員變量的實例中。然後你需要Items構造函數來存儲指向外部myList類實例的指針。最後在Add方法中,您需要在存儲的myList實例中引用vec。

由於Catskul指出,該項目的構造不能真正做到與myList中任何指針接收。我還想說,雖然這個答案更接近原始意圖,但steveth45的答案更接近你想要在真正的程序中做什麼。

+0

非常感謝,這工作,但我希望是一更簡單的版本存在,但我必須繼續處理C++ stuborness :-(希望C++ 0x解決了其中一些怪癖 – SMeyers 2008-10-25 22:04:47

+1

...但在MyList仍在構建時要小心MyList傳遞這個指針。如果它做了任何事情,最終使用MyList這個指針太早,它就會陷入困境 – Catskul 2009-10-01 15:48:34

11

這樣你就不會直接暴露你的班級成員。你的例子看起來有點過分了。爲什麼把一個std :: vector放到一個類中,然後公開它呢?

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"); 
} 
2

內部類只與名稱有關。你不能像這樣引用基類中的向量。

您可能需要在移動載體中,內部類或引用保存它。

5

與Java,C++中內的對象沒有訪問到外部this指針......如果你認爲它有可能是情況下,有沒有一個參考。

理查德·奎克的解決方案是你可以在最近的C++

0

您可以通過下面的結構簡化這個:

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

真的你爲什麼不直接使用STL向量? 這樣你就可以得到所有的標準算法與 數據一起工作。

1

雖然這個職位是幾年,我可能能夠添加一些有用的東西。雖然我會說在原始文章中該類的設計看起來不太好,但是有時候嵌入類能夠訪問包含類是有用的。這可以很容易地完成而不需要存儲額外的指針。下面是一個例子。它應該像我從一些現有的代碼中拿出來一樣工作,並且改變了一些名字。關鍵是EmbeddorOf宏。奇蹟般有效。

//////////////////// .h file /////////////////////// //

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; 
} 

尼克