论证通过标准化

时间:2016-02-05 14:10:43

标签: c++ design-patterns parameter-passing

我的C ++项目变得越来越大。在某些情况下,我只是为了自己的方便而通过引用传递参数,有些我不这样做。这是一个例子:

struct foo{
    foo(int &member){
        this->member = &member;
    }
    private:
        int *member;
};

当我不想创建int变量的两个实例时,我正在使用此模式。我没有必要实现getmodify方法来操纵它的值。相反,我甚至可以在不访问foo对象的情况下更改变量。但有时我使用不同的方式来管理成员变量:

struct foo{
    foo(int member){
        this->member = member;
    }
    void modify_member(){
        this->member = 6;
    }
    int get_member(){
        return this->member;
    }
    private:
        int member;
};

我不确定在同一结构中混合使用这两种管理成员的方法是一种好习惯。我应该将其正常化吗?那么例如给定结构中的每个函数都将使用“按值传递”方法?

2 个答案:

答案 0 :(得分:7)

你的第一个案例就是灾难的秘诀。你最终会得到悬挂指针和卡车装载的未定义行为。

你的第二个案例是对封装的不良尝试。没有必要。只需使用int即可。这将减少代码库的大小。

答案 1 :(得分:0)

代码应该易于阅读且易于更改,这种方式不会破坏您的程序。示例一将导致代码,您很难分辨foo个实例的更改位置。不要忘记已经提到的所有其他问题。

示例二没关系。通常,提供getter和setter可以让您稍后添加约束,例如检查值范围。所以我建议使用它们,除非你有充分的理由不这样做。它还使重构更容易。

在函数中传递参数时:根据经验,在原始类型的情况下使用按值传递:int,double等。传递对象时使用常量引用foo(const MyClass &myClass)

class MyClass {
    public:
    MyClass(const MyOtherClass &member1, int member2){
         this->member1 = member1;
         this->member1 = member1;
    }

    // other functions, getters, setters omitted...

    private:
    MyOtherClass member1;
    int member2;
};