我只是试图让C ++失效并且做到这一点,我必须创建自己的库和诸如此类的东西。所以我试图获得自己的List模板类的开头,就像JDK中的List类一样。所以我得到了模板和东西,我只想知道如何制作它以便我可以循环遍历列表对象的内容。这样我就可以打印出所述对象的内容。我不知道从哪里开始。
#pragma once
template<typename T> class List {
public:
List() : _size(0), _elements(nullptr) {}
~List() {
if (_elements != nullptr) {
delete[] _elements;
}
}
inline int size() { return _size; }
inline void add(T element) {
_size++;
T* buffer = new T[_size];
if (_elements != nullptr) {
memcpy(buffer, _elements, sizeof(T) * (_size - 1));
delete[] _elements;
}
buffer[_size - 1] = element;
_elements = buffer;
}
inline void remove(T element) {
_size--;
T* buffer = new T[_size];
if (_elements != nullptr) {
memcpy(buffer, _elements, sizeof(T) * _size);
delete[] _elements;
}
else {
assert(false);
}
_elements = buffer;
}
inline T* getElements() {
return _elements;
}
private:
int _size;
T* _elements;
};
这是我的主要Cpp文件
#include <cstdio>
#include <string>
#include "List.h"
using namespace std;
int main( int argc, char ** argv )
{
string str = "This is a test!";
List<char> list = breakString(str);
for (char c : list.getElements()) {
}
getchar();
return 0;
}
List<char> breakString(string str) {
List<char> list;
for (char c : str) {
list.add(c);
}
return list;
}
所以我试图弄清楚的是for循环,我曾经习惯于像Java一样增强for循环,这在C ++中是一样的吗?如果是这样,我将如何使这个对象可迭代?
如果我直接询问,我想我会得到一个更准确的答案。
答案 0 :(得分:1)
可以在http://en.cppreference.com/w/cpp/language/range-for
上找到验证Range-based for
的指南
如果range_expression是类型C的表达式,其具有名为begin的成员和/或名为end的成员(无论此成员的类型或可访问性如何),则begin_expr为__range.begin(),end_expr为__range .END();
简而言之,由于您的数据位于原始数组中,因此您应将这些公共方法添加到类List<T>
T* begin() { return _elements;}
T* end() { return _elements + _size;}
然后您可以直接在对象上调用基于范围的for
:
for (char c : list)
但您的代码中还有其他问题。其中一个(不确定它是唯一的一个)是breakString
返回一个对象,但是你的类并不简单,它没有定义任何copy
或move
构造函数。
这个答案解决了关于如何为你的班级启用Range-based for
的“主要”问题。它只需要两个方法begin()
和end()
返回看起来像迭代器的东西(可能是实际的迭代器或指向连续内存块的指针“)
您可以在不使用breakString
的情况下测试建议的修改,如下所示:
int main( int argc, char ** argv )
{
std::string str = "This is a test!";
List<char> list;
for (char c : "abcdef") { list.add(c); }
for (char c : list) { std::cout << c << "\n"; }
}
为了使其“完全可迭代”定义,您可以定义一个名为ierator
的嵌套类..