【问题标题】:Make class variable available in other scopes? c++使类变量在其他范围内可用? C++
【发布时间】:2013-01-17 15:05:01
【问题描述】:

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

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

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

我也在标题中将其指定为

Number* nmbr;

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

【问题讨论】:

  • 您很可能只需要一个班级成员。考虑使用std::vector<int> 作为会员。
  • 为什么叫它ArrayClass?我们不使用std::vector_class
  • 更正:当您离开构造函数时,指向数据的指针会丢失,最终导致内存泄漏。你到底想做什么?

标签: c++ arrays class variables scopes


【解决方案1】:

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

如果你必须使用全局变量(三思而后行),将其声明为extern,在单个 TU 中定义它,然后使用

 nmbr = new ArrayClass[2];

在你的构造函数中。

不要忘记清理内存或关于三法则。

【讨论】:

【解决方案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;

}

【讨论】:

  • 顺便说一下,我想你的意思是 new Number 而不是 new ArrayClass
【解决方案3】:

如果将所有代码放在一个地方,可能最容易在这里发现问题。

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 的旧规则三的更新),或者,强烈偏好,请改用std::vector<Number>,这样它就可以跟随“rule of zero”。

【讨论】:

    猜你喜欢
    • 2017-01-02
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多