3

假设我在一个类中有一些数据结构如下

class DataStructure
{
    DataStructure();
    ~DataStructure();

    void reset();
    void init();
    void setiX();
    ...;
    int getiX();
    double get dx();
    void addToList(OtherDataStructure dt);

private:
    int ix;
    int iy;
    int iz;
    double dx;
    ...;
    vector<OtherDataStructure> dtStVec;
};

所以我通常将此类用作以下方式

class manageSomething
{
    manageSomething();
    ~manageSomething();

    func1();
    func2();
    ...;
    funcN();
private:
    some vatiables;
    DataStructure structure; //HERE
};

所以我通常必须使用 getter 和 setter 来访问数据结构变量

如果继承类不在主应用程序中,是否更好地继承数据结构,并直接访问所有元素,如下

class manageSomething : public DataStructure
{
    manageSomething();
    ~manageSomething();

    func1();
    func2();
    ...;
    funcN();
private:
    some vatiables;
};

所以manageSomething的用法被用作

int main()
{
   manageSomething manager;
   ///manager.stuff ....
   return EXIT_SUCCESS;
}

我们什么时候决定选择哪一个?

4

3 回答 3

1

除非您正在编写的类确实扩展了您从中继承的类,否则您不应该公开manageSomething继承,即是一种DataStructure. 这被称为Liskov 替换原则。违反它会导致代码中出现严重的可读性和可维护性问题。

私有继承的规则不那么严格,但通常你应该更喜欢组合而不是私有继承,除非在非常特殊的情况下

这样做的结果是你的第一个代码片段(带有组合)做的一切都是正确的,你不需要改变它。

于 2013-06-27T14:27:10.310 回答
1

这真的要看情况!

如果您的管理器中有超过 1 个 DataStructure,则需要有一个带有 DataStructure 的 STL 容器的管理器。

如果您的经理中只有一个 DataStructure,那么您的经理可能没用,您可以直接使用 DataStructure。但是,如果您认为需要它,因为您调用了 DataStructure 中没有的函数,您可以继承 DataStructure。

我需要更精确地了解您对 DataStructure 所做的事情,以获得更好的答案。

于 2013-06-27T14:27:34.060 回答
1

第一的,

class manageSomething 
{
manageSomething();
~manageSomething();

func1();
func2();
...;
funcN(); 
private:
some vatiables;
DataStructure structure; //HERE 
};

这是您代码的一部分,我想告诉您,您的所有课程都是私有的。C++ 将所有内容默认设为私有。

回到你的问题。在大多数情况下,最好的方法是 getter 和 setter。永远不要使用公共变量。很难说继承是否是最好的选择,有时是,但不是经常。继承有一个好的但不完美的规则。您需要确定对象是否有其他对象或者是那个对象。

class Engine
{
   ...
};

class Car
{
private:
    Engine m_engine;
...
};
class BMW : protected Car
{
...
};

在这个例子中,宝马是汽车,所以最好使用继承,但是汽车有引擎,所以我们把这个对象放在这个类中。更重要的是继承,最好通常以受保护的方式继承。如果要继承该类,可以使用公共继承。假设我们为此使用公共继承:

class BMW : public Car
{
...
};
class X7 : protected Car
{
...
};

我希望它有一点帮助。

于 2013-06-27T16:49:05.757 回答