代码之家  ›  专栏  ›  技术社区  ›  tunnuz

C++中指针的复制

  •  1
  • tunnuz  · 技术社区  · 16 年前

    我有一个类a,包含指向另一个类B的对象的两个指针。我想初始化一个或另一个指针,这取决于传递给哪个指针 init() ,它还接受其他参数。因此,我的情况如下:

    class A {
    
    public:
        A();
        init(int parameter, int otherParameter, B* toBeInitialized);
    
    protected:
        B* myB;
        B* myOtherB;
    
    };
    

    现在我想说的是 作为:

    init(640, 480, this->myB);
    

    init(640, 480, this->myOtherB);
    

    现在,我的init实现为:

    void init( int parameter, int otherParameter, B* toBeInitialized ) {
    
        toBeInitialized = someConstructorFunction(parameter, otherParameter);
    
    }
    

    问题是两个指针没有初始化,我怀疑toBeInitialized被覆盖了,但是原始参数没有被修改。

    我做错什么了? 我应该引用指针吗?

    非常感谢。

    4 回复  |  直到 16 年前
        1
  •  6
  •   Andreas Brinck    16 年前

    是的,换成

    void init( int parameter, int otherParameter, B*& toBeInitialized ) {
    
        toBeInitialized = someConstructorFunction(parameter, otherParameter);
    
    }
    

    toBeInitialized 是按值传递的,只修改变量的本地副本。

        2
  •  3
  •   Andrew Aylett    16 年前

    这显然是一个削减问题,但如前所述,这样做不是更好:

    class A {
    
    public:
        A();
        B* buildB(int parameter, int otherParameter);
    
    protected:
        B* myB;
        B* myOtherB;
    
    };
    

    然后调用函数

    this->myB = buildB(640, 480);
    

        3
  •  2
  •   Naveen    16 年前

    你路过了 toBeInitialized 按值,所以值在内部修改 init() 指针或双指针。i、 e.将初始签名更改为 init(int, int, B*&) init(int,int,B**);

        4
  •  1
  •   Ari    16 年前

    考虑使用指向成员的指针。它会给你多一点安全。)

    void A::init(int p1, int p2, B * A::* memberToInit)
    {
        this->*memberToInit = SomeConstructorFunc(p1, p2);
    }
    

    myObject.init(480, 620, &A::myB);