C++如何将指针放入dvc中的指针

标签 c++ c++11

我是 C++(Java 程序员)新手,正在为入门类(class)做家庭作业。目的是“构造函数、动态内存分配和 重载运算符”话虽这么说,但我确实陷入了其中一个具体细节。

我正在创建 2 个类 Color 和 ColorBox。指令中指定了ColorBox中的成员变量为int width、int height和Color** data。我的理解是数据保存对 Color 对象的二维数组的引用......

我的问题是:如何在 DVC 中为数据设置某种类型的空值或基本值?有人有关于这种指针的正确撰写的链接吗?我发现了关于数组和指针的通用写法,但我仍然无法理解这一点。

提前致谢!

编辑: 我想我用下面的代码使它可以工作,但我承认我仍然不认为我知道我在做什么。

ColorBlock::ColorBlock()
{
    this->width = 0;
    this->height = 0;
    Color temp_data[1][1];
    this->data = (Color**)temp_data;
}

最佳答案

当您说空值或基本值时,我假设您的意思是将变量初始化为安全的默认状态。如果是这种情况,您提供的代码在某种程度上是正确的,但还需要一些工作。

首先,您可以像下面这样重写构造函数

ColorBlock::ColorBlock()
{
    this->width = 0;
    this->height = 0;
    this->data = nullptr;
}

这里最重要的变化是数据不再指向您创建的垃圾数据。这很重要,因为当构造函数终止时,指向的内存将不再是有效内存,但很难检查它是否是垃圾内存。 nullptr 是 C++11 初始化指向安全值的指针的方法,因为它不能指向有效的内存位置(它用于表示指针不指向任何内容),而且它也是类型安全的。

[在 C++11 之前的 C 和 C++ 标准中,我们会将指针初始化为 NULL,有关为什么应该使用 nullptr 的更多信息,请在此处检查:What are the advantages of using nullptr? ]

另一件事需要注意,正如 stargateur 下面所指出的,你使用了 C 类型的强制转换,这种强制转换很强大,因为它结合了 reinterpret_cast、const_cast 和 static_cast,但出于同样的原因也是不安全的。在这里您可能需要reiniterpret_cast。

除此之外,还有另一种“更多 C++”方式来初始化此数据。

ColorBlock::ColorBlock() : //Note the colon here
    width(0), height(0), data(nullptr)
{ }

有关为什么您会/应该/可以使用此样式的信息,请参阅以下内容:
Why should I prefer to use member initialization list?

附注这是我第一次尝试通过这个网站帮助别人,如果我可以改进我的格式或解释以便更简洁,请向我指出。如果我有错误,还请指出。

编辑:尝试按照建议添加更改。

关于C++如何将指针放入dvc中的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40316184/

相关文章:

c++ - while 循环内部具有相同条件的 if 语句?

c++ - clang-format:在 lambda 函数和外部 block 的大括号之前中断

c++ - 为什么在 C++11/C++14 中有针对自动和大括号初始化器的特殊类型推导规则?

c++ - 放置到 std::map 的 std::map

c++ - 另一个 "pointer being freed was not allocated"

c++ - auto 如何决定变量的类型?

c++ - 在 C++ 中如何返回指向数组的指针?

C++ 鼠标点击窗口中的特定位置

c++ - 有没有办法在C++字符数组中输入所需数量的字符

c++ - 如何在 Code::Blocks 中将版本信息添加到 C++ 应用程序