一种用不同变量做同样的方法

时间:2011-04-11 13:58:08

标签: c++ templates

我有类似的东西

class Foo {
    Bar a, b, c;

    void doStuffWithA();
    void doStuffWithB();
    void doStuffWithC();
}

而不是为每个我希望像模板之类的方法编写实现。怎么做?

干杯, 德克

编辑:

我明确需要知道我用哪个变量(递归):

class Foo {
    Bar a, b, c;
    Foo* parent;

    static void doRecursiveStuffWithA(Foo *_node) {
        if(_node->parent==NULL) {

            return;
        } else {
            doRecursiveStuffWithA(_node->parent)
        }

    }
    static void doRecursiveStuffWithB(Foo *_node) {
        if(_node->parent==NULL) {
            return;
        } else {
            doRecursiveStuffWithB(_node->parent)
        }

    }
    static void doRecursiveStuffWithC(Foo *_node) {
        if(_node->parent==NULL) {
            return;
        } else {
            doRecursiveStuffWithC(_node->parent)
        }

    }

}

EDIT2:

也许这确实可以更好地解释我的问题:

class Foo {
public:
    int a, b, c;

}

class Bar {
public:
    void doStuffWithAOfFoo(Foo *_foo);
    void doStuffWithBOfFoo(Foo *_foo);
    void doStuffWithCOfFoo(Foo *_foo);

}

我只想保持我的代码简单,而不是必须三次实现doStuffWithX ......

5 个答案:

答案 0 :(得分:5)

我想你想要参数......

class Foo {
    Bar a, b, c;

    void doStuffWithBar(Bar x);
}

模板用于处理各种数据类型,函数参数用于处理各种变量

答案 1 :(得分:1)

答案 2 :(得分:1)

您可以使用参考:

class Foo {
    Bar a, b, c;

    void doStuffWithBar(Bar& what)
    {
        print(what);
        bool flag = check(what);
        if (!flag)
            doStuffWithBar(what);
    }
}

您可以使用指向成员的指针:

class Foo {
    Bar a, b, c;
    typedef Bar (Foo::*PointerToBar);

    void doStuffWithBar(PointerToBar selector)
    {
        print(this->*selector);
        bool flag = check(this->*selector);
        if (!flag)
            doStuffWithBar(selector);
    }
}

后一种解决方案更灵活:您可以选择另一个对象和/或另一个继续递归的成员(指向成员的指针是模糊的,很少使用;除非您需要这种灵活性,否则不要使用它们):

class Foo {
    Bar a, b, c;
    Foo* next;
    typedef Bar (Foo::*PointerToBar);

    void doStuffWithBar(PointerToBar selector)
    {
        print(this->*selector);
        if (next)
            next->doStuffWithBar(selector);
    }
}

答案 3 :(得分:0)

为了扩展安德鲁的解决方案,您可能也在寻找:

void doStuffWithBar(Bar x, Bar y, Bar z);

如果你真的有BarX x,BarY y和BarZ z,那么你可能想要在你的班级重载你的成员函数

class Foo {
BarX x;
BarY y;
BarZ z;

void doStuffWithBar(BarX x);
void doStuffWithBar(BarY y);
void doStuffWithBar(BarZ z);
};

您可能也在寻找类似的东西(这是最丑陋的解决方案,我不会真的推荐它):

void doStuffWithBar(int n)
{
    if(n==0)
          doSomethingWithX();
    else if(n==1)
          doSomethingWithY();
    else if(n==2)
          doSomethingWithZ();
}

编辑:

ReturnType Bar::doStuffWithBar(ParamA a, ParamB b);

答案 4 :(得分:0)

代码味道 - 设计问题?这里的重复让人觉得Bar需要一种新的方法:

void Bar::doStuff(Foo &foo);

然后你需要弄清楚什么是publicprivateconst

修改:您的修改会稍微改变一下。我现在真的觉得有一些方法可以改进你的设计,例如: STL容器和算法。