#include <iostream>
using namespace std;
template<typename T>
class PrintEverything{
private:
T data;
public:
void printInt(){
cout << data << endl;
};
void setInt(T data){
this->data = data;
};
};
class PrintInt{
private:
int data;
public:
void printInt();
void setInt(int data);
};
void PrintInt::printInt(){
cout << data << endl;
}
void PrintInt::setInt(int data){
this->data = data;
}
class PrintString{
private:
string str;
public:
void printString();
void setString(string str);
};
void PrintString::printString(){
cout << str << endl;
}
void PrintString::setString(string str){
this->str = str;
}
int main()
{
PrintInt p1;
p1.setInt(10);
p1.printInt();
PrintString p2;
p2.setString("leihoua");
p2.printString();
PrintEverything<int> p3;
p3.setInt(100);
p3.printInt();
PrintEverything<string> p4;
p4.setInt("mobanshiyan");
p4.printInt();
cout << "Hello World!" << endl;
return 0;
}
你的代码中存在一些问题,主要是与模板类PrintEverything
有关。具体来说:
- 在模板类
PrintEverything
中,你定义了printInt
和setInt
方法,但这些方法名可能引起混淆,因为它们暗示了只能打印整数或设置整数,而实际上这个类是通用的,可以处理任何类型。因此,方法名应该更具通用性。 - 当使用
PrintEverything<string>
时,你调用了setInt
和printInt
方法,并传递了一个字符串参数,这会导致编译错误,因为这两个方法的名字不符合预期用途。
下面是修正后的代码:
#include <iostream>
#include <string>
using namespace std;
template<typename T>
class PrintEverything{
private:
T data;
public:
// 更改方法名为更通用的形式
void printData(){
cout << data << endl;
}
void setData(T data){
this->data = data;
}
};
class PrintInt{
private:
int data;
public:
void printInt();
void setInt(int data);
};
void PrintInt::printInt(){
cout << data << endl;
}
void PrintInt::setInt(int data){
this->data = data;
}
class PrintString{
private:
string str;
public:
void printString();
void setString(string str);
};
void PrintString::printString(){
cout << str << endl;
}
void PrintString::setString(string str){
this->str = str;
}
int main()
{
PrintInt p1;
p1.setInt(10);
p1.printInt();
PrintString p2;
p2.setString("leihoua");
p2.printString();
PrintEverything<int> p3;
p3.setData(100); // 使用通用方法名
p3.printData();
PrintEverything<string> p4;
p4.setData("mobanshiyan"); // 使用通用方法名
p4.printData();
cout << "Hello World!" << endl;
return 0;
}
主要修改点包括:
- 将
PrintEverything
中的printInt
和setInt
方法重命名为printData
和setData
,以反映其通用性质。 - 在主函数中相应地更改了对这些方法的调用,以匹配新的名称。
这样,代码不仅更加清晰,而且能够正确运行并按照预期输出数据。
3.6.8.1 QList
在 Qt 框架中, QList 是一个容器类,它在内部实现上类似于一个数组,但也提供了一些链表的特性。
QList 的设计旨在提供一个在多数情况下既高效又方便的通用列表容器。用于存储元素列表。它提供了
丰富的功能,包括添加、移除、访问元素等。
QList 的内部工作原理:
1. 数组式存储: QList 在大多数情况下使用连续内存存储其元素,类似于数组。这意味着它提供了快
速的索引访问(通过下标操作符 [] ),以及相对高效的迭代性能。
2. 动态调整大小:与静态数组不同, QList 可以动态增长和缩减,自动管理内存分配。
3. 链表特性:虽然 QList 主要基于数组,但它也提供了一些链表的操作,比如在列表的开始或结束
处添加和移除元素。这些操作通常比在数组中间插入或删除元素更高效。
4. 复制时共享内存: QList 使用一种称为“隐式共享”(implicit sharing)或“写时复制”(copy-on
write)的技术。这意味着当你复制一个 QList 时,它不会立即复制所有元素,而是共享相同的数
据,直到你尝试修改其中一个列表,此时才进行实际的复制。这使得复制 QList 变得非常高效。
使用场景:
当你需要快速的随机访问(如通过索引访问元素)时, QList 是一个不错的选择。
如果你的主要操作是在列表的两端添加或移除元素, QList 也表现得很好。
基本用法
包含头文件:首先,你需要包含 QList 的头文件。
#include <QList>
创建 QList 实例:创建一个 QList 对象,并指定存储的元素类型。
QList<int> list;
添加元素:使用 append 或 push_back 方法添加元素。
list.append(1);
list.append(2);
list.append(3);
this->setWindowTitle(fileName + "- MyNoteBook");
QList<QTextEdit::ExtraSelection> extraSelections;
void setExtraSelections(const QList<QTextEdit::ExtraSelection> &extraSelections)
访问元素:可以使用下标操作符或 at() 方法访问元素。
遍历列表:使用迭代器或范围基的 for 循环遍历列表。
移除元素:使用 removeAt 、 removeOne 或 clear 方法移除元素。