大神能否帮忙改个错哈

程序中"..."不用管它


#include ...
class Task {
public:
    Task(int id) : id_(id) {}
    int getID() { return id_; }
    std::string getName() { return "Task"; }
    virtual bool checkTimeout() { return false; }
private:
    int id_;
};
class UDPTask : public Task {
public:
    UDPTask(int id) : Task(id) {}
    std::string getName() { return "UDPTask"; }
    bool checkTimeout() { ... }
    ...
};
class TCPTask : public Task {
public:
    TCPTask(int id) : Task(id) {}
    std::string getName() { return "TCPTask"; }
    bool checkTimeout() { ... }
    ...
};
class TaskManager {
public:
    void addTask(Task t) {
        task_map_[t.getID()] = t;
    }
    void removeTask(Task t) {
        task_map_.erase(t.getID());
    }
    void checkTimeout() {
        std::map<int, Task>::iterator it = task_map_.begin();
        for (; it != task_map_.end(); ++it) {
            if (it->second.checkTimeout()) {
                printf("%s timeout->remove it", it->second.getName());
                task_map_.erase(it);
            }
        }
    }
private:
    std::map<int, Task> task_map_;
};

其实报错的本质原因是,你的成员函数里面有Task t这样的形参,总之是这样一个成员函数出错了,
void addTask(Task t) {
task_map_[t.getID()] = t;
}
task_map_[t.getID()]是要调用默认构造的,但你却没有默认构造...

你的代码有什么问题呢?需要怎么修改都没有说

#if 1
#include
#include
using namespace std;

class Task {
public:
//此处缺少默认构造,一旦有用户自定义构造,编译器就不会再生成默认构造...我加了默认构造
Task(){}
Task(int id) : id_(id) {}
int getID() { return id_; }
std::string getName() { return "Task"; }
virtual bool checkTimeout() { return false; }
private:
int id_;
};

class UDPTask : public Task {
public:
UDPTask(int id) : Task(id) {}
std::string getName() { return "UDPTask"; }
bool checkTimeout() { }
};

class TCPTask : public Task {
public:
TCPTask(int id) : Task(id) {}
std::string getName() { return "TCPTask"; }
bool checkTimeout() { }
};

class TaskManager {
public:
void addTask(Task t) {
task_map_[t.getID()] = t;
}
void removeTask(Task t) {
task_map_.erase(t.getID());
}
void checkTimeout() {
std::map::iterator it = task_map_.begin();
for (; it != task_map_.end(); ++it) {
if (it->second.checkTimeout()) {
printf("%s timeout->remove it", it->second.getName());
task_map_.erase(it);
}
}
}
private:
std::map task_map_;
};

int main()
{
return 0;
}
#endif