在不使用对象的情况下调用类方法
Calling class method without using the object?
对于经验丰富的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<>
,a
和b
,要求a
打印b
的内容:a.printList(b)
"。第二个实现"给定一个List<>
,a
,要求a
打印自己的内容:a.printList()
这本书的作者可能正试图解释这种区别。我不知道他们想展示什么,我还没读过这本书。
为什么不直接使用
this
?
如果你试图实现我上面列出的第二个目标,即允许List
打印自己,你应该只使用this
。
- 如果 std::vector::clear() 不是静态的,如何在没有实例的情况下调用它?
- C++ - 如何在不调用其属性的情况下调用类?
- C++ 在不释放内存的情况下调用析构函数
- Python在不引用类名的情况下调用类函数
- 为什么在这种情况下调用非常量右值移动构造函数?
- 是否可以在没有显式专用化的情况下调用可变参数模板函数?
- 使用按引用调用时,不能在没有对象的情况下调用成员函数 const
- 您可以在不调用构造函数的情况下调用攻击器吗?
- 命名空间:不能在没有对象的情况下调用成员函数
- 哪些语言将在没有显式桥接的情况下调用C++
- 如何在不重新索引顶点的情况下调用"boost::remove_vertex"?
- C :在没有对象实例的情况下调用非静态成员函数
- 在不实例化的情况下调用不同派生类的虚拟方法
- C 如何在没有错误的情况下调用void函数
- 在MSVC上的数组初始化期间,destructor在不复制或移动构造方的情况下调用
- 在不指定实例化的情况下调用类模板的静态方法的方法
- 为什么INVOKE总是取消引用数据成员,而不是在可能的情况下调用
- 是否可以在不实例化派生类的情况下调用该类的虚拟函数
- 无法在没有对象的情况下调用成员函数(尽管我相信我确实初始化了它)
- 为什么在没有赋值运算符的情况下调用转换构造函数