2014-09-30 45 views
2

我需要实例化一个类中的许多对象,但它们中的每一个都需要知道对于此类的每个对象都通用的特定值X,例如全局参数。这是我的构造函数在我的对象中正常工作所必需的。如何在C++中的许多对象中使用公共值?

有没有办法做到这一点,而不作为构造参数传递值?我想要做的是在所有对象中使用相同的变量,所以我不浪费RAM。

*在我的实际情况中,它不仅仅是一个X值,而是一个1024-dim的int向量。

+0

将该值通过引用传递给函数,而不是通过值传递,因此它不会创建额外的副本。 – CoryKramer 2014-09-30 23:26:28

+0

* 1024-dimmension int vector *认真? – deviantfan 2014-09-30 23:28:36

+0

全局变量有什么问题?如果你不喜欢它们 - 静态变量也会起作用 – 2014-09-30 23:30:08

回答

1

我假定你的意思是你想要一个大小为1024的矢量作为所有类的共享变量。你可以这样做:

class MyClass { 

    static std::vector<int> s_my_vector; 
} 

这段代码会进入你的头文件。在你的cpp文件中,你必须初始化std :: vector。不过,我不建议这样做。需要构造函数调用的类静态变量(即不是基元或POD类型)有很多我不打算进入的陷阱。我将提供一个不过更好的解决方案:

class MyClass { 
    static std::vector<int> & GetMyVector() 
    { 
    static std::vector<int> my_vector; 
    static bool initialized = MyVectorInit(my_vector); 
    return my_vector; 
    } 

    static bool MyVectorInit(std::vector<int> & v) 
    { 
    v.resize(1024); 
    ... 
    } 
public: 
    MyClass() { 
    std::vector<int> & v = GetMyVector(); 
    ... 
    } 

    static void EarlyVectorInit() 
    { 
    GetMyVector(); 
    } 
} 

在这种情况下,静态局部变量确保只会有my_vector的一个副本,您可以通过调用GetMyVector得到一个参考吧。此外,初始化的静态布尔保证只创建一次,这意味着MyVectorInit只会被调用一次。你可以使用这种方法,以防你需要以一些不可能在构造函数中完成的非平凡方式填充你的向量。 我写它的方式,你的矢量会在你第一次使用它时自动创建,这很方便。如果您想由于某种原因手动触发创建,请致电EarlyVectorInit()。

+1

GetMyVector和相关函数应该是静态的。 – 2014-10-01 00:25:03

+0

我认为。让它们变得静态有什么好处吗?由于他们应该是私人的(哎呀,忘了公开),我很难想出它会如何改变。 – 2014-10-01 00:27:49

+1

他们为什么不应该是静态的?他们不需要任何物体存在。 – 2014-10-01 00:28:29

2

你想要的是一个静态成员。 “当一个数据成员被声明为静态时,只为该类的所有对象维护一份数据副本”。例如

class myClass { 
    public: 
    static int x; 
}; 
相关问题