繁体   English   中英

取消引用指向容器 class 成员的指针

[英]Dereferencing pointer to container class member

我有以下我想解决的问题。 我从一个大的 class P 开始,我想把它分开。 因此,部分功能被移至新的 class 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;
}

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

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

因此,保持名称冲突的Q构造函数需要:

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

你的P构造函数将是:

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM