对于那些经验丰富的C ++编码人员来说,这似乎是一个愚蠢的问题,但我想如果你有一个类并且你创建了该类的对象,你可以使用你创建的对象调用该类的公共方法(除非它是一个静态方法,在这种情况下,您使用对象或类名本身调用它?)
那为什么会这样呢?
功能定义:
template <typename Object>
void printList(const List<Object>& theList) {
if (theList.isEmpty())
cout << "Empty list!" << endl;
else {
ListItr<Object> itr = theList.first();
for(; !itr.isPastEnd(); itr.advance())
cout << itr.retrieve() << " ";
}
cout << endl;
}
函数调用:
printList(myList);
我在这里缺少什么?除非我使用printList()
的对象调用List<int>
,否则该计划的其余部分如何知道printList()
属于班级List<int>
?
这也是顺便说一下,我刚检查过。我会用这种方式调用和定义函数。请注意,这次使用this
指针定义函数,就像我认为的那样。
功能定义:
template <typename Object>
void List<Object>::printList() {
if(this->isEmpty())
cout << "Empty list!" << endl;
else {
ListItr<Object> itr = this->first();
for(; !itr.isPastEnd(); itr.advance())
cout << itr.retrieve() << " ";
}
cout << endl;
}
函数调用:
myList.printList();
答案 0 :(得分:1)
在黑暗中拍摄,但是您希望以下功能成为T
的成员函数吗?
void print(const T& someT);
因为它不是。它只是一个免费的函数,需要T
。
以下是类定义和成员函数声明(虽然成员函数很愚蠢,因为它需要一个可能完全冗余的参数):
struct T {
void print(const T& someT);
};
以下是与线外定义的相同的愚蠢成员函数:
void T::print(const T& someT) {
// ...
}
从你的问题中你并没有完全清楚你在这里做了哪一个,但第一个肯定是不是成员函数。
答案 1 :(得分:0)
您的理解是正确的。除非你没有告诉我们关于List<>
的重要内容,或者错过了本书中的一些重要课程,否则第二个例子明显优于第一个例子。
那为什么这个片段需要传递对象本身?
因为它是以这种方式编码的。说真的,你需要向作者询问那些可能是你书中作者的代码。
我在这里缺少什么?
这两个例子并不完全相同。第一个实现“给定两个List<>
,a
和b
,请a
打印b
:a.printList(b)
”的内容。第二个实现“给定一个List<>
,a
,请a
打印自己的内容:a.printList()
。
这本书的作者有可能试图解释这种区别。我不知道他们想要展示什么,我还没看过这本书。
为什么不使用
this
?
如果您尝试达到我上面列出的第二个目标,即允许List
打印自己,您应该只使用this
。