gpt4 book ai didi

c++ - 取消引用指向容器类成员的指针

转载 作者:行者123 更新时间:2023-12-02 10:03:18 25 4
gpt4 key购买 nike

我有以下我想解决的问题。我从一个很大的 P 类开始,我想把它分开。因此,部分功能被移至新的 Q 类。但是,我似乎无法使这两者正常通信。为了让这更直观一点,我做了这个玩具示例:

#include <iostream>

class Q {
public:
int* x_ptr;

Q(){ } // Is there any way to not have to write default constructors?

Q(int* x_ptr){
x_ptr = x_ptr;
}

void say_x(){
std::cout << *x_ptr << std::endl;
}

void change_x(){
*x_ptr += 1;
}
};

class P {
public:
Q q;
int x;

P(int x){
x = x;
q = Q(&x);
}
};

int main(){
P my_p = P(10);
my_p.q.say_x();
my_p.q.change_x();
std::cout << my_p.x << std::endl;
}

我希望 Q 类负责更改 P.x.为此,我认为在创建 Q 时将对 P.x 的引用传递给它会起作用。但是,这会导致段错误。有没有办法让 Q 能够访问和修改 x?这样做的原因是我最终想要有许多类 Q1、Q2 等,它们都负责 P.x 上的不同操作,其中 P.x 将是比简单的 int 更复杂的数据类型。

最佳答案

您的问题源于您对函数参数和类成员使用相同的变量名这一事实。虽然这是允许的,但它是(恕我直言),非常糟糕的做法。如果要保留名称,则需要显式添加 this->在您需要区分两者的函数中,否则您的参数名称将'shadow'类(class)成员。

所以,你的 Q保持名称冲突的构造函数需要:

    Q(int* x_ptr) {
this->x_ptr = x_ptr;
}

和你的 P构造函数将是:

    P(int x) {
this->x = x;
q = Q(&(this->x));
}

但是,通过对参数进行简单的名称更改,这会更加清晰:

    Q(int* arg_x_ptr) {
x_ptr = arg_x_ptr;
}
//...
P(int arg_x) {
x = arg_x;
q = Q(&x);
}

就目前而言,在您的代码中, q = Q(&x); 行在 P构造函数将给定的临时对象的地址作为参数传递,这会在您稍后尝试修改它时导致内存错误(段错误)。

注意:关于您不必为 Q 定义默认构造函数的评论- 如果您在声明/启用 q 时提供了“必需”参数,则可以删除它。成员(member) P :

class P {
public:
Q q{ nullptr }; // BEWARE: You can NEVER use this object as it stands!
int x;
//...

关于c++ - 取消引用指向容器类成员的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61482750/

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