在c ++中使用单例类

时间:2014-03-05 18:10:15

标签: 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();

这个谷没有打印。

2 个答案:

答案 0 :(得分:3)

我在这里开心灵....我认为你SetId的实现是这样的:

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

不设置成员变量,将参数设置为自身。由于您的构造函数很可能将成员变量id设置为"",因此您将打印空字符串。更改参数的名称(例如,更改为newId)以避免冲突或将实现更改为:

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

作为此声明的证明,这里是第一个版本的the result,正如您所看到的那样,它什么都不打印。第二个是the result,你可以看到它打印的数字。

问题可归结为:您的函数参数名称与成员变量的名称相同,函数参数是阴影/隐藏成员变量。

唯一不能发生的地方是构造函数的初始化列表:

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

Demo for the above snippet

答案 1 :(得分:0)

std::cout在大多数实现中都是缓冲的,如果不是全部的话。这意味着,在写出任何数据之前,流将等待您结束一行。因此,您可以通过将输出语句更改为

来轻松解决此问题
 std::cout << AreaDataRepository::Instance().GetOnGoingWay().GetId() << std::endl;