C ++喜欢在同一个类中的方法之间共享对象的方法

时间:2015-11-01 13:51:38

标签: c++ oop

给定一个有两个需要共享变量的方法的类,在它们之间传递/共享该变量的最佳方法是什么?假设在类中的其他任何地方都不需要该变量。如果该变量是STL容器,这会改变什么吗?

我正在考虑以下三个选项:

在一个方法中实例化变量并通过指针返回它,然后在另一个方法中将其删除。

class MyClass
{
    public:
        std::vector<int>* method1();
        void method2();
};

std::vector<int>* MyClass::method1()
{
    std::vector<int> *my_int_vector = new std::vector<int>;
    //manipulate the vector in some way
    return my_int_vector;
}

void MyClass::method2()
{
    std::vector<int> *myvector;
    myvector = this->method1();
    //manipulate the vector in some way
    delete myvector;
}

这将新方法和删除方法分开,这似乎是乞求出错。

或者,您可以使用类私有成员属性来保存变量。

class MyClass
{
    private:
        std::vector<int> myvector;
    public:
        void method1();
        void method2();
};

void MyClass::method1()
{
    //manipulate this->myvector
}

void MyClass::method2()
{
    this->method1();
    //manipulate this->myvector
}

这会不必要地将变量暴露给类的其余部分。

最后,您可以在一个方法中创建一个对象,并通过引用传递它。

class MyClass
{
    public:
        void method1(std::vector<int> *my_int_vector);
        void method2();
};

void MyClass::method1(std::vector<int> *my_int_vector)
{
    //manipulate my_int_vector in some way
}

void MyClass::method2()
{
    std::vector<int> myvector;
    this->method1(&myvector);
    //manipulate myvector in some way
}

对我而言,这似乎是最佳解决方案,因为您没有调用new或delete,并且该变量不适用于整个班级。

我对我的选择的评估是否正确并且我错过了其他更好的选择吗?

2 个答案:

答案 0 :(得分:1)

首选方法是将该变量设为 ,如果 将其作为参数从一个函数传递给另一个函数是不可能的。

所以是的,第三种选择可能是最好的。

  

如果该变量是STL容器,这会改变什么吗?

没有。 C ++标准库中的容器也是普通对象。

关于第二个选项:

  

这将新方法和删除方法分开,这似乎是乞求出错。

是。首先使用原始newdelete已经在乞求麻烦了。 当你不必动时,不要动态分配。当你这样做时,请使用智能指针。

因此,在这种情况下,您可以简单地按值传递向量。或者,如果该函数将被调用很多,那么可能生成向量static并通过引用返回它。

你提到了你的第二个选择

  

不必要地将变量暴露给类的其余部分。

如果那是真的问题,那么你的课程可能太大和/或试图做太多。您应该考虑将类拆分为具有明确,最小化和明确定义的职责的较小类(SRP)。

这给我们带来了第四个选项,在你的情况下可能会或者可能没有意义:将向量存储在它自己的类中,并使这两个方法成为该类的成员。然后将该类存储为MyClass的成员。

答案 1 :(得分:0)

我说 - 让一个函数创建对象并通过引用传递给其他方法。

  

对我而言,这似乎是最好的解决方案,因为你没有打电话给新的或   删除并且变量不可用于整个班级。

那么,如果您使用new创建对象,会有什么不同?内存管理的相同问题与其他技术一起出现。
无论如何,你的出发点是在堆栈上声明对象。尽量保持对象堆栈分配,如果它是在堆上 - 选择智能指针,以确保没有发生内存泄漏。

为类中的对象创建一个占位符作为静态:
1)使你的班级被不相关的物体污染 2)使你的课程不是线程安全的