簡體   English   中英

在C ++中使用單例類

[英]Use singleton classes in c++

我創建了一個單例課程

  class AreaDataRepository {
private:
    AreaDataRepository();
    AreaDataRepository(const AreaDataRepository& orig);
    virtual ~AreaDataRepository();

    Way onGoingWay;
public:
    static AreaDataRepository& Instance()
    {
        static AreaDataRepository singleton;
        return singleton;
    }

    void SetOnGoingWay(Way onGoingWay);
    Way const & GetOnGoingWay() const;
};

        void AreaDataRepository::SetOnGoingWay(Way onGoingWay) {
        this->onGoingWay = onGoingWay;
    }

Way const & AreaDataRepository::GetOnGoingWay() const {
    return onGoingWay;
}

Way的頭文件

  class Way {
private:
    std::string id;
    std::string name;
public:
    Way();
    Way(const Way& orig);
    virtual ~Way();

    void SetName(std::string name);
    std::string const & GetName() const;

    void SetId(std::string id);
    std::string const & GetId() const;
};

然后,我創建了Way對象並設置了id和name的值。

Way wayNode;
wayNode.SetId("123");
wayNode.SetName("jan")
AreaDataRepository::Instance().SetOnGoingWay(wayNode);

分配OngoingWay之后,從另一個類訪問它。

std::cout << AreaDataRepository::Instance().GetOnGoingWay().GetId();

淡谷不打印。

我要在這里精神和....我占卜你的執行SetId是這樣的:

void SetId(std::string id) { id = id; }

不設置成員變量,而是將參數設置為其自身。 並且由於您的構造函數很可能將成員變量id設置為""您正在打印空字符串。 更改參數名稱(例如,更改為newId )以避免沖突,或者將實現更改為:

void SetId(std::string id) { this->id = id; }

作為此聲明的證明 ,這里是第一個版本的結果 ,如您所見,它不打印任何內容。 這是第二個結果 ,如您所見,它會打印數字。

問題歸結為:您具有與成員變量名稱相同的函數參數名稱,並且函數參數正在陰影/隱藏成員變量。

唯一無法發生的地方是在構造函數的初始化列表中:

class Foo {
    int x;
public:
    Foo(int x): x(x) {} // <-- this works
    void SetX(int x) { x = x; } // <-- this won't the parameter is hiding the member variable
};

上面片段的演示

如果不是全部, std::cout將在大多數實現中緩沖。 這意味着,流將在寫入任何數據之前等待您結束一行。 因此,您可以通過將輸出語句更改為

 std::cout << AreaDataRepository::Instance().GetOnGoingWay().GetId() << std::endl;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM