【问题标题】:Copying pointers in C++在 C++ 中复制指针
【发布时间】:2010-03-18 10:29:27
【问题描述】:

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

class A {

public:
    A();
    init(int parameter, int otherParameter, B* toBeInitialized);

protected:
    B* myB;
    B* myOtherB;

};

现在我的意思是我想将init() 称为:

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

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

现在,我的 init 实现为:

void init( int parameter, int otherParameter, B* toBeInitialized ) {

    toBeInitialized = someConstructorFunction(parameter, otherParameter);

}

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

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

谢谢
托马索

【问题讨论】:

  • 这是一个非常可怕的设计。

标签: c++ pointers parameters copy initialization


【解决方案1】:

是的,改成

void init( int parameter, int otherParameter, B*& toBeInitialized ) {

    toBeInitialized = someConstructorFunction(parameter, otherParameter);

}

在您的原始代码中,toBeInitialized 是按值传递的,并且只会修改变量的本地副本。

【讨论】:

    【解决方案2】:

    这显然是一个缩减的问题,但如前所述,有这样的东西不是更好吗:

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

    然后调用函数为

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

    将第三个参数转换为对该成员的引用(或指向该成员的指针)会起作用,但听起来您的设计可能是错误的。

    【讨论】:

    • 我知道,但实际上这个方法初始化不止一个东西,所以不可能全部都用return。
    • @tunnuz:那么你的设计可能需要更多的工作。如果您有多组可以独立初始化的成员,请考虑将它们拆分为单独的类。
    【解决方案3】:

    您通过值传递toBeInitialized,因此init() 内部修改的值不会反映在外部。您需要传递对toBeInitialized 指针或双指针的引用。即将初始化签名更改为 init(int, int, B*&)init(int,int,B**);

    【讨论】:

      【解决方案4】:

      考虑使用指向成员的指针。 (它会给你更多的安全感。)

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

      而用法是

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-14
        • 2020-02-26
        相关资源
        最近更新 更多