使类变量在其他范围内可用? C ++

时间:2013-01-17 15:05:01

标签: c++ arrays class variables scopes

在类的构造函数中,我创建了一个具有所需大小的数组:

ArrayClass::ArrayClass(int size) 
{
    Number* nmbr = new Number[size];
}

ArrayClass::ArrayClass()
{ 
    Number* nmbr = new Number[2];
}

我也在标题中指定为

Number* nmbr;

虽然数组本身的创建工作,但我似乎无法在构造函数之外访问它。似乎每当我离开构造函数时,变量都会从内存中释放出来。如何防止这种情况,以便在调用类中的其他函数时可以使用变量?

3 个答案:

答案 0 :(得分:6)

不要创建新变量。构造函数中的nmbr彼此不同,标题中的extern也不同。

如果你必须使用全局(想三次这样做)将其声明为 nmbr = new ArrayClass[2]; ,在单个TU中定义它,并使用

{{1}}

在你的构造函数中。

不要忘记清理记忆或三个规则。

答案 1 :(得分:2)

尝试在类的声明中声明变量nmbr,而不是在构造函数中声明。 例如:

class ArrayClass

{

private: 

Number *nmbr;

public:

ArrayClass();

ArrayClass(int size);

~ArrayClass()

}

ArrayClass::ArrayClass(int size) 

{

this->nmbr = new Number[size];

}

ArrayClass::ArrayClass() 
{

this->nmbr = new Number[2];

}

ArrayClass::~ArrayClass()
{

delete this->nmbr;

}

答案 2 :(得分:1)

如果将所有代码放在一个地方,最容易看到问题。

Number *nmbr;

class ArrayClass { 
    Number *nmbr;
public:

    ArrayClass() { 
        Number *nmbr = new Number[2];
    }
};

这里有三个完全独立的变量,分别位于三个不同的范围内。每个人都“隐藏”外部范围内的任何同名变量。

这也意味着当你在构造函数中初始化nmbr时,你初始化构造函数本身的本地变量。当ctor返回时,该指针将被丢弃,并且您分配的内存将被泄露。同样糟糕的是,您(几乎肯定)想要初始化的ArrayClass::nmbr仍未初始化。

类外的nmbr几乎相同,但在某种程度上稍微安全一些:因为它是全局的,所以它将被零初始化;因为它是一个指针,这意味着它将被初始化为一个空指针(因此它不指向任何数据,但至少它很容易测试并知道它不是)。

为了防止这种情况,您可能希望消除变量的额外定义,因此对nmbr的所有引用都引用相同的内容:

class Array { 
    Number *nmbr;
public:
    Array() : numbr(new Number[2]) {}
};

由于这个类似乎在做远程所有权(即,它通过指针分配和拥有数据),你需要遵循五条规则(对C ++ 11的旧规则更新为3)或者,强烈偏好,请改用std::vector<Number>,以便它可以跟随“rule of zero”。