不使用对象调用类方法?

时间:2012-03-02 18:54:02

标签: c++

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

2 个答案:

答案 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<>ab,请a打印ba.printList(b)”的内容。第二个实现“给定一个List<>a,请a打印自己的内容:a.printList()

这本书的作者有可能试图解释这种区别。我不知道他们想要展示什么,我还没看过这本书。

  

为什么不使用this

如果您尝试达到我上面列出的第二个目标,即允许List打印自己,您应该只使用this