如何使用“ this”通过公共函数调用将对象传递到全局数组中?

时间:2019-05-17 07:18:40

标签: c++ arrays class object

我有一个ToDo类,该类具有描述,日期和优先级作为私有成员变量。

我正在尝试获取已填充的ToDo,并将其添加到ToDos的全局数组中。

我已经使用this->描述,this-> date和this-> priority设置了对象的所有成员变量,但是当我尝试使用以下方法添加对象时-TODO_GLOBAL_ARRAY [CURRENT_LOC_OF_ARRAY] = this; -我收到一条错误消息,指出“没有可行的重载'='”。

我还尝试实例化ToDo对象的实例并将其传递给数组,但是仍然使原始对象没有数据并且不能正确打印出来。


//ToDo Header


#include <string>

using std::string;

#ifndef TODOLIST
#define TODOLIST

class ToDoList{
private:
    string description;
    string date;
    int priority;

public:
    bool addToList(ToDoList todoItem);
    bool addToList(string desc, string date, int priority);
    bool getNextItem(ToDoList &toDoItem);
    bool getNextItem(string &desc, string &date, int &priority);
    bool getByPriority(ToDoList *results, int priority);
    bool getByPriority(ToDoList *results, int priority, int &resultSize);
    void printToDo();
    void printToDo(ToDoList aToDo);
    void printToDoList(ToDoList *aToDoList);
    void printToDoList(ToDoList *aToDoList, int size);

    ToDoList();
    ToDoList(string desc, string date, int priority);
// TODO: implement method to get ToDo from usr input
};

#endif

extern ToDoList usr_TODO_list[];
extern const int MAX_ITEMS_TODO;
extern int SIZE_OF_USR_LIST;
extern int NEXT_INDEX;

// From ToDo.cpp

bool ToDoList::addToList(string desc, string date, int priority){
    if (SIZE_OF_USR_LIST == MAX_ITEMS_TODO) {
        return false;
    }
    else{
        ToDoList aToDo;
        this->description = desc;
        this->date = date;
        this->priority = priority;
        usr_TODO_list[SIZE_OF_USR_LIST] = this;
        SIZE_OF_USR_LIST++;
        return true;
    }
}

// From main.cpp

using namespace std;

ToDoList usr_TODO_list[100];
int const MAX_ITEMS_TODO (100);
int SIZE_OF_USR_LIST = 0;
int NEXT_INDEX = 0;

int main()
{ // etc...

预期:使用“ this”将对象传递到数组中

实际:没有可行的重载'='错误

2 个答案:

答案 0 :(得分:2)

usr_TODO_list[SIZE_OF_USR_LIST] = this;试图分配一个指向class对象的指针。在这种情况下,由于ToDoList是可复制的,因此您只需取消引用this

usr_TODO_list[SIZE_OF_USR_LIST] = *this;

我还会考虑进行一些重构,以使事情变得不太混乱,例如ToDoList-> ToDo,或者如果其他内容更具有上下文意义,例如Job,那么也可以使用。正如@WhozCraig指出,addToList可以简化为:

bool ToDoList::addToList(string desc, string date, int priority) {
    if (SIZE_OF_USR_LIST == MAX_ITEMS_TODO) {
        return false;
    }
    else {
        usr_TODO_list[SIZE_OF_USR_LIST++] = ToDoList(desc, date, priority);
        return true;
    }
}

尽管这意味着this对象不受影响,但如果需要对其进行突变,则可以使用:

bool ToDoList::addToList(string desc, string date, int priority) {
    if (SIZE_OF_USR_LIST == MAX_ITEMS_TODO) {
        return false;
    }
    else {
        *this = ToDoList(desc, date, priority);
        usr_TODO_list[SIZE_OF_USR_LIST++] = *this;
        return true;
    }
}

答案 1 :(得分:0)

您可以使用例如:

{
    auto& nextListElem = usr_TODO_list[SIZE_OF_USR_LIST];
    nextListElem.description = desc;
    nextListElem.date = date;
    nextListElem.priority = priority;
    SIZE_OF_USR_LIST++;
    return true;
}