首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++中使用构造函数时结构数据的更改

在C++中使用构造函数时结构数据的更改
EN

Stack Overflow用户
提问于 2021-07-01 13:49:44
回答 1查看 74关注 0票数 1

第一段代码按预期工作。我试着用结构内部的双指针来工作。

代码语言:javascript
复制
#include "bits/stdc++.h"
using namespace std;

struct Node{
    int data;
    Node *left;
    Node* right;

    Node(int val) {
        data = val;
        left = right = NULL;
    }
};

struct Triplet{
    Node** node;
    int pval, lchild;
};

int main()
{
    Node *root = new Node(10);

    Triplet t;
    t.node = &root;
    t.pval = 1001;
    t.lchild = 2;
    cout << (*t.node)->data << " " << t.pval << " " << t.lchild << "\n";
    cout << (*t.node)->data << " " << t.pval << " " << t.lchild << "\n";
    cout << (*t.node)->data << " " << t.pval << " " << t.lchild << "\n";
    return 0;
}

以下是正确和预期的输出

代码语言:javascript
复制
10 1001 2
10 1001 2
10 1001 2

但是,当我尝试使用相同的逻辑,但使用构造函数时,则在调用第一个cout之后得到随机值。这不仅限于double-pointer,而且如果只访问一次cout,它将在下一次调用中更改。

代码语言:javascript
复制
#include "bits/stdc++.h"
using namespace std;

struct Node{
    int data;
    Node *left;
    Node* right;

    Node(int val) {
        data = val;
        left = right = NULL;
    }
};

struct Triplet{
    Node** node;
    int pval, lchild;
    Triplet(){}
    Triplet(Node* temp, int a, int b){
        node = &temp;
        pval = a;
        lchild = b;
    }
};

int main()
{
    Node *root = new Node(10);

    Triplet t(root, 1001, 2);
    cout << (*t.node)->data << " " << t.pval << " " << t.lchild << "\n";
    cout << (*t.node)->data << " " << t.pval << " " << t.lchild << "\n";
    cout << (*t.node)->data << " " << t.pval << " " << t.lchild << "\n";
    return 0;
}

不寻常的产出:

代码语言:javascript
复制
10 1001 2
1878374340 1001 2
1878374340 1001 2
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-01 14:00:57

在非构造函数版本中,t.node保存root的地址。

代码语言:javascript
复制
t.node = &root;

在构造函数版本中,t.node保存temp的地址,这确实是临时的。一旦dangling pointer不再存在,它就会变成temp

代码语言:javascript
复制
node = &temp;

为了匹配非构造函数版本,构造函数需要接受一个Node**

代码语言:javascript
复制
struct Triplet{
    Node** node;
    int pval, lchild;
    Triplet(){}
    Triplet(Node** temp, int a, int b){
        node = temp;
        pval = a;
        lchild = b;
    }
};


int main()
{
    Node *root = new Node(10);

    Triplet t(&root, 1001, 2);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68211433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档