爲了實現這個使用繼承,你認爲Key
如在地圖/ multimap中實施的關鍵專門的數據類型。 Key
繼承自Object
,但它可以提供其自己的特定於鍵的功能,例如–,例如–函數repr()
,其生成由地圖用於某些地圖特定操作的表示(可以作爲散列或排序的基礎管他呢)。
地圖/多重映射必須以這樣的方式使得Key
對象存儲作爲指針被使用(或std::unique_ptr
,或std::shared_ptr
,或任何爲宜),但不作爲Key
對象的副本。
因此,我們有:
struct Object
{
virtual ~Object()
{ }
};
/* Key class. Pointers of this type are inserted
into the map. */
class Key : public Object
{
public:
/* Must be supported by all keys: */
virtual std::string repr() const = 0;
};
我們還假設有Person
對象的單獨定義:
struct Person : Object
{
Person(const std::string &name)
: name_(name)
{ }
std::string name_;
};
根據您的具體要求,也有Key
兩種形式:一種是代表字符串並且必須使用一個字符串進行初始化,另一個代表人員,並且必須由人員指針初始化(我將假設人員密鑰實際上並不是自己的這些指針,因此只要人員密鑰存在,您就需要確保指向的人員對象保持活動狀態)。
我們通過專業Key
成兩個派生類,一個PersonKey
和實施這樣的StringKey
:
class PersonKey : public Key
{
public:
PersonKey(Person *person_ptr)
: Key() , person_ptr_(person_ptr)
{ }
virtual std::string repr() const
{
if (person_ptr_ != 0)
return std::string("Person/") + person_ptr_->name_;
else
return "<NUL>";
}
private:
Person *person_ptr_;
};
class StringKey : public Key
{
public:
StringKey(const std::string &str)
: Key() , str_(str)
{ }
virtual std::string repr() const
{
return str_;
}
private:
std::string str_;
};
當您插入到地圖/ multimap中,你產生Key
對象(你代表爲Key*
或Key&
或std::unique_ptr<Key>
)。當你想插入一個字符串,你生成它們作爲StringKey
對象,當你想插入他們作爲人的三分球,你用PersonKey
–但你插入鑰匙的數據類型將不會反映專業化。
這裏是一個一般Key
對象的一個例子(作爲std::unique_ptr<Key>
實現,但可以只使用Key*
如果不怕內存泄漏的):
int main()
{
/* General key object: */
std::unique_ptr<Key> mykey;
/* Now it points to a string-key, initialized using
a string, as required: */
mykey.reset(new StringKey("hello"));
std::cout << "repr(mykey) == \""
<< mykey->repr()
<< '"'
<< std::endl;
/* Now the same key object is made to refer to
a person object: */
Person person("me");
mykey.reset(new PersonKey(&person));
std::cout << "repr(mykey) == \""
<< mykey->repr()
<< '"'
<< std::endl;
return 0;
}
爲上述代碼必要的標頭是:
#include <iostream>
#include <memory>
#include <string>
(但memory
只需要爲我用的std::unique_ptr
,這是不實際需要來解決你的問題。)
請使用一些示例代碼來顯示您當前正在嘗試的內容,即使您知道這是錯誤的。 – aschepler
你可以將'std :: string'包裝在派生自Object的某個類中,因此這是可能的。 – dyp
@aschepler我添加了我的節點類和一些更多的解釋。 –