2012-03-02 82 views
0

对于那些经验丰富的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(); 
+1

'程序的其余部分如何知道printList()属于班级列表'是吗?为什么需要'List '作为参数,然后呢?在我看来,你创建了一个免费函数,而不是一个成员函数...尤其是当你在第二个例子中创建一个成员函数时,你使用'List ::'显示你正在执行这些函数类定义之外的定义。 – 2012-03-02 18:55:21

+0

因为......那是*不是*类中的方法。这是一个简单的功能。 – 2012-03-02 18:58:31

+0

谢谢 - 我解决了这个问题,并使第一个成员函数;现在它需要能够被调用的对象。仍然似乎很奇怪,为什么它需要的对象也作为参数传递时,可以使用'this'来完成。 – Ambidextrous 2012-03-02 19:02:58

回答

0

你的理解是正确的。除非你没有告诉我们关于List<>的一些重要内容,或者在本书中丢失了一些重要的教训,否则第二个例子明显优于第一个。

那么为什么这个片段需要传递对象本身呢?

因为它是这样编码的。说真的,你需要询问那个代码的作者,他可能是你书中的作者。

我在这里错过了什么?

这两个例子并不完全相同。第一个实现“给定两个List<> s,ab,要求a打印b的内容:a.printList(b)”。给定一个List<>a第二器具”,问a打印本身的内容:。a.printList()

这是可能的,这本书的作者都试图解释非常的区别,我不知道他们正在努力展会上,我还没有看过这本书。

为什么不直接使用this

如果你试图达到的目标2号我上面列出,即允许List打印本身,你应该只使用this

1

考虑在这里瞎猜,但你需要下列功能是T一个成员函数?因为它不是。因为它不是。这只是一个免费功能,需要T


下面是一个类定义和成员函数声明(尽管成员函数是愚蠢的,因为它需要一个参数,这可能是完全多余的):

struct T { 
    void print(const T& someT); 
}; 

而下面的是一样的傻成员函数定义出来的行:

void T::print(const T& someT) { 
    // ... 
} 

这不是entir从你的问题中清楚地知道你在这里做了哪一个,但第一个肯定是而不是的一个成员函数。

+0

谢谢 - 修正了这个问题,并且使它成为了一个成员函数 - 我应该改述我的问题。它现在需要一个对象来完成调用,对我来说,使用'this'的方法似乎也足够了。 – Ambidextrous 2012-03-02 19:04:45