0

如果 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;
}

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

4

3 回答 3

1

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

于 2014-08-10T11:28:02.800 回答
1

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

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

这里也有一些关于引用与指针的其他意见。

于 2014-08-10T11:30:49.683 回答
0

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

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

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

void do_stuff(ClassA& object)

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

于 2014-08-10T11:53:05.973 回答