不使用对象调用类方法?
对于那些经验丰富的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);
缺少什么我在这里?除非我使用List<int>
的对象调用printList()
,否则程序的其余部分如何知道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();
你的理解是正确的。除非你没有告诉我们关于List<>
的一些重要内容,或者在本书中丢失了一些重要的教训,否则第二个例子明显优于第一个。
那么为什么这个片段需要传递对象本身呢?
因为它是这样编码的。说真的,你需要询问那个代码的作者,他可能是你书中的作者。
我在这里错过了什么?
这两个例子并不完全相同。第一个实现“给定两个List<>
s,a
和b
,要求a
打印b
的内容:a.printList(b)
”。给定一个List<>
,a
第二器具”,问a
打印本身的内容:。a.printList()
这是可能的,这本书的作者都试图解释非常的区别,我不知道他们正在努力展会上,我还没有看过这本书。
为什么不直接使用
this
?
如果你试图达到的目标2号我上面列出,即允许List
打印本身,你应该只使用this
。
考虑在这里瞎猜,但你需要下列功能是T
一个成员函数?因为它不是。因为它不是。这只是一个免费功能,需要T
。
下面是一个类定义和成员函数声明(尽管成员函数是愚蠢的,因为它需要一个参数,这可能是完全多余的):
struct T {
void print(const T& someT);
};
而下面的是一样的傻成员函数定义出来的行:
void T::print(const T& someT) {
// ...
}
这不是entir从你的问题中清楚地知道你在这里做了哪一个,但第一个肯定是而不是的一个成员函数。
谢谢 - 修正了这个问题,并且使它成为了一个成员函数 - 我应该改述我的问题。它现在需要一个对象来完成调用,对我来说,使用'this'的方法似乎也足够了。 – Ambidextrous 2012-03-02 19:04:45
'程序的其余部分如何知道printList()属于班级列表'是吗?为什么需要'List '作为参数,然后呢?在我看来,你创建了一个免费函数,而不是一个成员函数...尤其是当你在第二个例子中创建一个成员函数时,你使用'List
因为......那是*不是*类中的方法。这是一个简单的功能。 – 2012-03-02 18:58:31
谢谢 - 我解决了这个问题,并使第一个成员函数;现在它需要能够被调用的对象。仍然似乎很奇怪,为什么它需要的对象也作为参数传递时,可以使用'this'来完成。 – Ambidextrous 2012-03-02 19:02:58