C ++独立的静态变量,用于方法内的每个对象

时间:2015-04-16 07:47:10

标签: c++ oop c++11 static-variables

请考虑以下代码:

#include <iostream>

class CTest
{
public:
    CTest() : c(0)
    {}
    void Method1()
    {
        c++;
        std::cout<<"c: "<<c<<std::endl;
    }
private:
    int c;
};

int main()
{
    CTest A,B,C;
    A.Method1();
    B.Method1();
    C.Method1();
    return 0;
}
  

c:1

     

c:1

     

c:1

对于此类型的每个对象,c值不同。为了避免名称冲突,我有兴趣将c变量放在函数中,因为Method1是唯一应该使用它的地方。我关心的是如何使它独立于每个不同的对象。有没有内置的C ++解决方案?

#include <iostream>

class CTest
{
public:
    CTest()
    {}
    void Method1()
    {
        static int c=0;
        c++;
        std::cout<<"c: "<<c<<std::endl;
    }
private:
};

int main()
{
    CTest A,B,C;
    A.Method1();
    B.Method1();
    C.Method1();
    return 0;
}
  

c:1

     

c:2

     

c:3

3 个答案:

答案 0 :(得分:1)

可以使用模板执行此操作,

template <typename int> class CTest
{
    void Method1()
    {
        static int c = 0;
    }
};

并实例化CTest<1> A;CTest<2> B;等,注意每次使用不同的int。这样,每c<n>就会得到Method1,这是CTest的本地{{1}}。但这是非常人为的,如果你想动态地实例化{{1}},那就不行了,我也不认为我会在生产中使用它。

也许使用pImpl习语的方法会更好。

答案 1 :(得分:0)

如果这只是一个命名问题,那么您可以使用不同的名称:

class CTest
{
public:
    void Method1()
    {
        int& c = unique_but_similar_to_something_else;
        c++;
        std::cout << "c: " << c <<std::endl;
    }
private:
    int unique_but_similar_to_something_else;
};

这允许您的变量在类范围内具有正确的名称,但在方法范围内具有更友好的名称。

答案 2 :(得分:-1)

class CTest
{
public:
    CTest() : MY__c(0)
    {

    }
    void Method1()
    {
        int& c = MY__c; // now c is of different meaning and doesn't spoil the "c" we want to have no conflicts with...
        c++;
        std::cout << "c: " << c << std::endl;
    }
private:
    int MY__c;
};