【问题标题】:C++ member function requires pointer, bad practice to pass by reference?C++ 成员函数需要指针,通过引用传递的坏习惯?
【发布时间】:2014-10-03 09:13:05
【问题描述】:

如果 C++ 类成员函数需要指向对象的指针作为参数,那么通过引用传递是否被认为是不好的做法?

例如,下面的代码可以工作,但是如果没有按引用传递,它就会变成危险代码,并会在运行时导致灾难性错误。

class ClassA
{
public:
    void SetPointer(const ClassB& classb) // Remove 1 ampersand and serious errors will occur
    {
        if(ptr_to_classb == nullptr) // Initialized to nullptr in constructor
            ptr_to_classb = &classb;
        else
            throw(...); // Throw some error
    }

private:
    ClassB* ptr_to_classb;
}

考虑如果按值传递,并且制作了参数的副本,那么在以后取消引用时这将是灾难性的。

替代方案是这样的:

class ClassA
{
public:
    void SetPointer(const ClassB* const classb)
    {
        if(ptr_to_classb == nullptr) // Initialized to nullptr in constructor
            ptr_to_classb = (ClassB*)(classb);
        else
            throw(...); // Throw some error
    }

private:
    ClassB* ptr_to_classb;
}

我喜欢一致性,默认为第一种,但我怀疑第二种形式被认为是更好的做法。是这样吗?

【问题讨论】:

  • 指针传递......
  • 两者都可以,但我个人更喜欢指针。如果一个函数在返回后会保留对该对象的引用,我会使用一个指针来提醒我何时调用该函数。
  • “如果 C++ 类成员函数需要指向对象的指针作为参数,那么通过引用传递是否被认为是不好的做法?” - 如果一个函数需要一个指针并且你传递一个非指针,那么它甚至不会编译。因此,如果它需要一个指针,请用指针调用它。如果它需要引用,请使用引用调用它。就这么简单。
  • @TheParamagneticCroissant 我认为他的意思是该函数的底层逻辑需要一个指针,他不确定该函数应该采用指针还是引用。
  • @PeterClark 如果它需要一个指针,那么只有一个指针就足够了。如果它需要修改参数,那么两者都可以。如果他不想复制参数,那么(const)指针和引用都可以解决问题。不幸的是,OP 正在寻找三个替代方案中的哪一个是模棱两可的。

标签: c++ pass-by-reference pass-by-pointer


【解决方案1】:

嗯,这两种方法都是正确的,但在你的情况下,使用指针可能会更好,因为与指针不同,引用变量只能在初始化时被赋值。使用相同的指针,您以后可以传递不同的类对象。

【讨论】:

  • 我不确定我是否理解仅初始化一次的意义,因为另一个示例包含 2 个 const 标识符?
  • 他只是指函数参数。
  • @user3728501 我不知道。但是输入“他/她”是三个字符,作为程序员我很懒:p
  • @NeilKirk 是的,我是他,只是注意到人们通常会写“他”,然后就接受了。也许人们希望程序员是男性?
  • 那个东西也被讨论了here
【解决方案2】:

我的观点是,如果将 null 参数传递给方法是一件有效的事情(即方法执行的逻辑对于 null 指针将是有效的),那么使用指针。如果参数不应该为空,则使用引用。

在您的情况下,这取决于 ClassA::ptr_to_classb 为空是否有效。因为如果 ptr_to_classb 已经设置(意味着你永远不想改变它指向的内容)你会抛出,你甚至可能想要考虑存储一个引用并将其传递给 ClassA 的构造函数,从而摆脱 ClassA::SetPointer。

关于引用与指针here as well还有一些其他意见。

【讨论】:

    【解决方案3】:

    您的方法只是设置对象的一个​​字段,因此您似乎想使用该字段的类型(即指针,而不是引用)。你写的

    我喜欢一致性,默认为第一类

    我猜,这指的是“尽可能使用引用;否则使用指针”的规则。我认为你的情况是这条规则的一个例外,因为声明

    void do_stuff(ClassA& object)
    

    通常的意思是“在对象上做一些事情,然后忘记它”,你的情况不同。

    【讨论】:

    • 我喜欢一致性,这意味着我喜欢使用所有指针或所有引用,而不是两者的混合。
    • 另外我不同意你关于参考文献通常推断的评论。
    猜你喜欢
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 2010-12-01
    相关资源
    最近更新 更多