【问题标题】:Node insert cpp节点插入 cpp
【发布时间】:2017-02-07 19:31:46
【问题描述】:

如何在一个函数中编写这 3 个成员函数定义?如果可能的话。你能解释一下你是怎么做到的吗?。对不起,我英语不好,也不擅长编码,请不要侮辱我。

 void insert(int idx, PW* obj) 
{
    idx--;
    double bd = summaryCost();
    node x(1);
    x.p = obj;

    if (bd + obj->getCost() <= budget) {
        if (idx <= vec.size()) {
            vec.insert(vec.begin() + idx, x);
            remain -= obj->getCost();
        } else {
            delete obj;
            throw IndexOut();
        }
    } else {
        delete obj;
        throw DeficitError();
    }
}

   void insert(int idx, FW* obj) {
    idx--;
    double bd = summaryCost();
    node x(2);
    x.f = obj;
    if (bd + obj->getCost() <= budget) {
        if (idx <= vec.size()) {
            vec.insert(vec.begin() + idx, x);
            remain -= obj->getCost();
        } else {
            delete obj;
            throw IndexOut();
        }
    } else {
        delete obj;
        throw DeficitError();
    }
}

void insert(int idx, TW* obj) {
    idx--;
    double bd = summaryCost();
    node x(3);
    x.t = obj;
    if (bd + obj->getCost() <= budget) {
        if (idx <= vec.size()) {
            vec.insert(vec.begin() + idx, x);
            remain -= obj->getCost();
        } else {
            delete obj;
            throw IndexOut();
        }
    } else {
        delete obj;
        throw DeficitError();
    }
}

【问题讨论】:

  • 什么意思?我看到你有三种方法,它们基本上用不同的参数做同样的事情。您是否只需要一种方法来执行此操作?
  • 是的,我需要一个方法来做这个
  • 我们看不到TWFWPW的定义,所以这里有多种选择。模板方法或直接使用所有这 3 种类型的共同祖先的继承。
  • 您可以只创建一个函数,将所有三个 TW、FW 和 PW 作为参数。根据对象类型,执行代码块。
  • 我认为继承会更好。我试过了,但我做不到。这是日程表标题中的代码link

标签: c++ vector insert nodes


【解决方案1】:

看你的dropbox代码,好像需要多花点时间研究一下虚函数,c++纯虚函数;它允许你做类似的事情

struct ChargeableItem {
  virtual int getCost() = 0;
};

struct WorkItem : ChargeableItem {
  virtual int getCost() {return 5;}
}

int total = 0;
void insert(ChargeableItem* i) {
  total += i->getCost();
}

int main() {
  WorkItem x;
  insert(&x);
}

请注意,上面的代码中有很多不好的做法,但我认为这最终是你想要做的。

【讨论】:

    【解决方案2】:

    如果PWFWTW 没有共同的基类,则可以使用特征类和模板。

    完整示例:

    // Empty types for illustration purposes.
    struct PW {};
    struct FW {};
    struct TW {};
    
    struct node
    {
        node(int i) {}
        PW* p;
        FW* f;
        TW* t;
    };
    
    // For readability improvement.
    template<typename T>
    using member_ptr = T* node::*;
    
    template<typename T>
    struct NodeTraits {};
    
    // Class-specific traits
    template<>
    struct NodeTraits<PW> {
        enum {value = 1};
        static member_ptr<PW> member;
    };
    
    template<>
    struct NodeTraits<FW> {
        enum {value = 2};
        static member_ptr<FW> member;
    };
    
    template<>
    struct NodeTraits<TW> {
        enum {value = 3};
        static member_ptr<TW> member;
    };
    
    member_ptr<PW> NodeTraits<PW>::member = &node::p;
    member_ptr<FW> NodeTraits<FW>::member = &node::f;
    member_ptr<TW> NodeTraits<TW>::member = &node::t;
    
    // Finally, the function...
    template<typename T>
    void insert(int idx, T* obj) 
    {
        node x(NodeTraits<T>::value);
        member_ptr<T> ptr = NodeTraits<T>::member;
        x.*ptr = obj;
        // ...
    }
    
    // Using it...
    int main()
    {
        PW p;
        FW f;
        TW t;
        insert(0, &p);
        insert(0, &f);
        insert(0, &t);
    }
    

    解释留给感兴趣的读者作为练习。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-25
      • 2017-06-14
      • 2015-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-27
      • 2012-04-07
      相关资源
      最近更新 更多