我有一个名为Node
的类的实例向量。我希望能够确定是否填充了向量的特定索引。
请参见下面的示例代码:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Node {
int testVal;
public:
//Default Constructor
Node() {};
Node(int a){testVal = a;}
int getTestVal(){return testVal;}
};
int main(){
vector<Node> testVector;
testVector.resize(2);
Node testNode = Node(5);
testVector[1] = testNode;
for (int i = 0;i < 2;i++){
if (testVector[i] == NULL){
cout << "Missing Data" << endl;
}
else{
cout << testVector[i].getTestVal << endl;
}
}
}
代码在if
语句中崩溃。特定索引为空的最佳条件是什么?
答案 0 :(得分:1)
您的要求是不可能的。
向量存储值而不是指针,因此您永远不会得到null。
如果要检查“空”点,请声明一个存储节点地址的向量:
std::vector<std::shared_ptr<Node>> testVector;
要在矢量的第二个索引中存储项目,请执行以下操作:
testVector[1] = std::make_shared<Node>(5);
现在您的其余代码应能按预期工作(只需将对getTestVal()
函数的调用修复)。
答案 1 :(得分:0)
我认为您误解了C ++语义。
std::vector< Node> testVector; // creates empty vector of Node objects, no Node allocations made here
testVector.resize( 2 ); // calls default constructor and instantiates 2 new Node objects here
// could be done as std::vector< Node > testVector( 2 );
该向量已经为这2个节点分配了内存,因为默认构造函数定义了该类,所以它存在。听起来您想要更多类似的东西:
...
std::vector< Node * > testVector( 2, null_ptr );
testVector[ 1 ] = new Node( 5 );
for( const auto & ptr : testVector )
if( ptr )
std::cout << ptr->getTestVal() << std::endl;
...
delete testVector[ 1 ];
正如其他人所提到的,智能指针对象也可以用于为您管理内存并表现类似。