在不使用对象的情况下调用类方法

Calling class method without using the object?

本文关键字:情况下 调用 类方法 对象      更新时间:2023-10-16

对于经验丰富的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>,除非我使用对象List<int>调用printList()

顺便说一句,我刚刚检查过。我会使用这种方式来调用和定义函数。请注意,这一次函数是使用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();

在黑暗中拍摄,但您是否希望以下函数是T的成员函数?

void print(const T& someT);

因为事实并非如此。这只是一个需要T的自由函数。


以下是类定义和成员函数声明(尽管成员函数很傻,因为它采用了一个可能完全多余的参数):

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

下面是定义不正确的愚蠢成员函数:

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

从你的问题中还不完全清楚你在这里真正做的是哪一个,但第一个肯定是而不是成员函数。

您的理解是正确的。除非你没有告诉我们List<>的一些重要内容,或者错过了书中的一些重要课程,否则第二个例子显然比第一个好。

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

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

我在这里错过了什么?

这两个例子不完全一样。第一个实现了"给定两个List<>ab,要求a打印b的内容:a.printList(b)"。第二个实现"给定一个List<>a,要求a打印自己的内容:a.printList()

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

为什么不直接使用this

如果你试图实现我上面列出的第二个目标,即允许List打印自己,你应该只使用this