Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
2 C和x2B+;具有相同功能但变量名不同的类-使用哪种模式? 我有2个C++类,它们具有相同的变量类型,需要对这些变量执行完全相同的操作。但是,这两个类的变量名和函数名不同,因为它们在各自的类中表示不同的内容_C++_Oop_Templates_Inheritance_Design Patterns - Fatal编程技术网

2 C和x2B+;具有相同功能但变量名不同的类-使用哪种模式? 我有2个C++类,它们具有相同的变量类型,需要对这些变量执行完全相同的操作。但是,这两个类的变量名和函数名不同,因为它们在各自的类中表示不同的内容

2 C和x2B+;具有相同功能但变量名不同的类-使用哪种模式? 我有2个C++类,它们具有相同的变量类型,需要对这些变量执行完全相同的操作。但是,这两个类的变量名和函数名不同,因为它们在各自的类中表示不同的内容,c++,oop,templates,inheritance,design-patterns,C++,Oop,Templates,Inheritance,Design Patterns,如何在没有代码重复的情况下实现这一点?继承或模板在这里有用吗 这里有一个简单的例子 class A { private: float m; float n; public: float foo() {return m + n}; }; class B { private: float p; float q; public: float bar() {return p + q}

如何在没有代码重复的情况下实现这一点?继承或模板在这里有用吗

这里有一个简单的例子

class A
{
    private:
       float m;
       float n;

    public:
       float foo() {return m + n};
};

class B
{
    private:
       float p;
       float q;

    public:
       float bar() {return p + q};
};

在我的例子中,操作和变量比上面的例子更复杂。这两个类之间唯一的区别是变量名和函数名。其余的都一样。如何在C++中重构这个?

< p>有几种方法来处理这个问题。

  • 只需使用一个类。如果功能是相同的,而您只是在更改名称,那么为什么需要多个类呢。
    • 优点:最大限度地减少代码重复
    • 缺点:如果这是针对两个不同的应用程序,则违反了单一责任原则
  • 创建一个包含所有函数的基类,然后为每种情况创建一个具有正确名称的基类。
    • 优点:最大限度地减少代码重复
    • 缺点:可能不是偶然的
  • 创建一个类并
    typedef
    创建另一个名称。
    • 优点:最大限度地减少代码重复
    • 缺点:只更改“类”的名称,而不更改方法调用
  • 把它分成两类
    • 优点:每个类负责自己的非相关操作,并独立于其他类进行操作
    • 缺点:可能的代码重复
  • 一般来说,在不知道类的具体情况下,我会说最好的方法是让两个类保持原样。如果他们在做不同的事情,而恰好两者都有相似的方法,这是偶然的,不值得牺牲可读性和单一责任原则。

    如果它们是相关的,那么考虑它是否会遵循继承的关系。如果没有,请再次将它们保留为两个类。

    两个相当复杂的函数,除了使用哪些变量外,它们是相同的?听起来像是一个简单的例子,在这个例子中,公共性可以被提取到一个单独的函数中,该函数为不同的事物提供参数。例如:

    float DoComplicatedThing(float a, float b)
    {
        // whatever the complicated thing is
        // ...
    
        // but staying with your example it's just:
        return a + b;
    }
    
    class A
    {
        private:
           float m;
           float n;
    
        public:
           float foo() { return DoComplicatedThing(m, n) };
    };
    
    class B
    {
        private:
           float p;
           float q;
    
        public:
           float bar() { return DoComplicatedThing(p, q) };
    };
    

    如果有充分的理由让
    a
    B
    派生自公共基类,那么
    docompleedthing
    可能是该基类的静态函数。否则,它可能只是一个没有类的独立函数(如我的示例中所示)。

    好吧,首先你应该知道为什么它们是分开的。为什么不在两种情况下都使用一个类呢?(我认为大多数其他解决方案可能会增加不必要的复杂性)我如何在没有代码重复的情况下实现这一点代码复制没有问题。如果类型的含义不同,那么类具有相同的布局只是巧合。如果我有20个成员的班级被称为
    Car
    ,而另一个碰巧也有同样的20个成员,但它是
    Toaster
    ?。顺便说一句,如果你看一个真实世界的程序,这个程序可能有许多“两个成员”类,所有这些类的含义都不同。如果我们知道这些类是什么,那将是很有帮助的。使用
    std::pair
    作为泛化(resp
    class Base{std::pair y;public:T baz(){return y.first+y.second;};
    )?为了回应@PaulMcKenzie,如果两种不同的类型用于表示不同的事物,并且在不同的情况下使用,那么具有相同布局的两种不同类型没有问题。如果你真的只想有一个类型(比如说它叫
    MySingleType
    ),你可以做
    typedef MySingleType NameOne
    typedef MySingleType name二
    若要创建别名,则可以使用
    NameOne
    NameTwo
    将其视为自己的类型。