gpt4 book ai didi

C++ 指向对象类型检查的指针

转载 作者:行者123 更新时间:2023-11-28 03:54:47 26 4
gpt4 key购买 nike

如何验证指针指向的对象是否有效

相关代码

LookupTable<Product *> table;
Product temp = *table[selection];
// if *table[selection] is not a product, program crashes...

查找表是这样的:

#ifndef LOOKUPTABLE_H
#define LOOKUPTABLE_H

#include <iostream>
#include <string>

using namespace std;

#define MAXRANGE 10

template <class T>
class LookupTable
{
private:
T *aptr[MAXRANGE];
int rangeStart[MAXRANGE];
int rangeEnd[MAXRANGE];
int numRanges;

public:
T defaultValue;
bool failedRangeCheck;
std::string failReason;


// Constructor
LookupTable()
{
numRanges = 0;
defaultValue = T();
}

void addRange(int start, int end)
{
std::cout << "Created a new range... Start: " << start << " / End: " << end << endl;
failedRangeCheck = false;

//lines omitted because not working anyway

if ( !failedRangeCheck )
{
//set ranges
rangeStart[numRanges] = start;
rangeEnd[numRanges] = end;

//build new generic array with end-start+1 positions
//set pointer to point to it
aptr[numRanges] = new T[ end - start + 1 ];
numRanges++;
}
else
{
std::cout << "Range overlapped another range." << endl;
std::cout << failReason << endl;
}
}

T &operator[](int value) // Overloaded [] operator
{
for ( int i = 0; i < numRanges; i++ )
{
if ( (value >= rangeStart[i]) && (value <= rangeEnd[i]) )
{
return aptr[i][value - rangeStart[i]];
}
}

return defaultValue;
}

~LookupTable()
{
delete[] aptr;
numRanges = 0;
}

};
#endif

最佳答案

tableLookupTable<Product*> .为什么它会包含一个不是 Product* 的指针?这没有任何意义。

您永远不需要这样做。您需要这样做的唯一原因是:

  • 通过一些复杂的转换,您插入了一个指向不是 Product 的指针。进入table .唯一的解决办法是“不要那样做”。

  • 你有一个指向 Product 的指针对象,但是你搞砸了你的对象生命周期管理,你在用完它之前就销毁了它。对此的解决方案是使用范围绑定(bind)资源管理(SBRM,也称为 Resource Acquisition is Initialization,或 RAII),它允许自动管理生命周期。使用像 shared_ptr 这样的智能指针容器/weak_ptr以促进这一点。

  • 你在 table 中放置了一个空指针.在这种情况下,您可以不将空指针放入查找表,或者从表中获取指针后检查它是否为空。

关于C++ 指向对象类型检查的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4092747/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com