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

Posted

技术标签:

【中文标题】如何使用“this”将对象传递到具有公共函数调用的全局数组中?【英文标题】:How can I pass an object into a global array with a public function call using 'this'? 【发布时间】:2019-05-17 07:18:40 【问题描述】:

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

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

我已经使用 this->description、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' 将对象传递到数组中

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

【问题讨论】:

这里的一些命名有点混乱,ToDoList 实际上是一个数组元素而不是一个列表。我会尝试重构您的代码以使其更清晰。无论如何,如果你想添加一个副本,你应该使用usr_TODO_list[SIZE_OF_USR_LIST] = *this;,这样你就不会试图分配一个指针。如果您实际上是在尝试存储指针,那么您可能希望将您的数组声明为 ToDoList *usr_TODO_list[100]; 这个架构很奇怪,但是你的 else 子句应该可以简化为 usr_TODO_list[SIZE_OF_USR_LIST++] = ToDoList(desc, date, priority); return true; 并注意 aToDo 在你的实现中是没有意义的。不知道你想要什么。无论如何,您的代码似乎厚颜无耻地将 ToDo list 与 ToDo item 混淆。前者应该包含后者的实例,并且就我所见,后者只需要一个描述、日期和优先级的简单对象。 @George 谢谢!!!我忘了这是一个指针。我使用了尊重运算符,它起作用了。您可以将其发布为回复,以便我将其标记为正确答案吗?谢谢! 【参考方案1】:

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;
    

【讨论】:

【参考方案2】:

你可以使用例如:


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

【讨论】:

以上是关于如何使用“this”将对象传递到具有公共函数调用的全局数组中?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 presentViewController 将对象传递到视图中?

如何使用 jsp:include 参数标签将对象传递到另一个 jsp

如何在不将文件保存在本地存储上的情况下将对象传输到 Azure Blob 存储?

如何将对象传递给另一个数组对象

如何将对象声明为私有

RESTkit,Core Data:在将对象传输到 Core Data 之前对其进行处理