如何使用“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