我设置了一个大小为2的“父类指针”向量来存储其“派生类”地址,但是无论我添加多少地址,该向量似乎都只存储最终地址,因此导致“访问冲突读取”问题。 顺便说一下,我使用了复合模式。
我尝试了很多方法,我使用了向量,2d指针(例如int **)。
class Node{
public:
virtual double evaluate();
};
class NumNode: public Node{
private:
double number;
public:
double evaluate();
NumNode(int);
};
class OpNode: public Node{
private:
char operation;
vector<Node*> branch;
public:
double evaluate();
void addLeft(NumNode);
void addRight(NumNode);
OpNode(char);
};
double OpNode::evaluate(){
if(this->operation == '+')
return this->branch[0]->evaluate() + this->branch[1]-
>evaluate();**Exception thrown at 0x008C6097 in
Project_Testing.exe: 0xC0000005: Access
violation reading location 0xCCCCCCCC.**
return 0;
}
void OpNode::addLeft(NumNode other){this->branch[0] = &other;}
void OpNode::addRight(NumNode other){this->branch[1] = &other;}
int main(){
OpNode n('+');
n.addLeft(NumNode(2));
n.addRight(NumNode(3));
cout << n.evaluate() << endl;
}
当您查看主要功能时,我添加了两个不同的NumNode。但是当我开始调试时。
branch[0] 0x006ff620 {...} Node *
branch[1] 0x006ff620 {...} Node *.
他们有相同的地址!
答案 0 :(得分:0)
您的问题在这里:
void OpNode::addLeft(NumNode other){this->branch[0] = &other;}
void OpNode::addRight(NumNode other){this->branch[1] = &other;}
如评论中所述:
您的addLeft和addRight采用堆栈参数的地址 其他。由于两个调用的堆栈看起来完全相同,因此您会看到 完全相同的地址。传递一个可以是 直接存储,或(在您的方法中)分配一个副本(包含新 NumNode(其他))并存储该地址。
解决该问题的另一种方法是使用std::shared_ptr
因此,您的常规列表变为:
vector<shared_ptr<Node> > branch;
然后:
void OpNode::addLeft(const shared_ptr<NumNode> >& other){this->branch[0] = other;}
答案 1 :(得分:0)
您正在将指针指向临时对象。 当此对象的生命周期结束引用是未定义行为时,在这种情况下将导致崩溃。
在堆上创建此对象以延长所需对象的寿命。
例如:
import Breads from './bread.js';
<FlatList
data={Breads}
keyExtractor={(item, index) => item.id}
renderItem={({item}) => <View>
<Image source={item.src} />
<Text>{item.title}</Text>
</View>
}
/>