#include <algorithm>
#include <cassert>
template<typename T> class Array2D
{
public:
Array2D(size_t width, size_t height)
: width(width)
, height(height)
, p_data(new T[width * height])
{
}
Array2D(const Array2D& other)
: width(other.width)
, height(other.height)
, p_data(new T[other.width * other.height])
{
*this = other;
}
~Array2D()
{
delete[] p_data;
}
// Zugriffsoperator
T& operator()(size_t x, size_t y)
{
assert(x < width && y < height);
return p_data[y * width + x];
}
// Zugriffsoperator (const)
const T& operator()(size_t x, size_t y) const
{
assert(x < width && y < height);
return p_data[y * width + x];
}
// Zuweisungsoperator
Array2D& operator =(const Array2D& rhs)
{
assert(width == rhs.width && height == rhs.height);
// Daten kopieren
std::copy(rhs.p_data, rhs.p_data + width * height, p_data);
return *this;
}
// Getter
size_t getWidth() const { return width; }
size_t getHeight() const { return height; }
private:
const size_t width;
const size_t height;
T* const p_data;
};
int main()
{
// Beispiel für Benutzung:
Array2D<int> meinArray(30, 50);
meinArray(10, 10) = 42;
meinArray(1000, 1000) = 0; // <-- Fehler, wird bei Debug vom "assert" abgefangen
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGNhc3NlcnQ+Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBBcnJheTJECnsKcHVibGljOgogICAgQXJyYXkyRChzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpCiAgICAgICAgOiB3aWR0aCh3aWR0aCkKICAgICAgICAsIGhlaWdodChoZWlnaHQpCiAgICAgICAgLCBwX2RhdGEobmV3IFRbd2lkdGggKiBoZWlnaHRdKQogICAgewogICAgfQogICAgCiAgICBBcnJheTJEKGNvbnN0IEFycmF5MkQmIG90aGVyKQogICAgICAgIDogd2lkdGgob3RoZXIud2lkdGgpCiAgICAgICAgLCBoZWlnaHQob3RoZXIuaGVpZ2h0KQogICAgICAgICwgcF9kYXRhKG5ldyBUW290aGVyLndpZHRoICogb3RoZXIuaGVpZ2h0XSkKICAgIHsKICAgICAgICAqdGhpcyA9IG90aGVyOwogICAgfQogICAgCiAgICB+QXJyYXkyRCgpCiAgICB7CiAgICAgICAgZGVsZXRlW10gcF9kYXRhOwogICAgfQogICAgCiAgICAvLyBadWdyaWZmc29wZXJhdG9yCiAgICBUJiBvcGVyYXRvcigpKHNpemVfdCB4LCBzaXplX3QgeSkKICAgIHsKICAgICAgICBhc3NlcnQoeCA8IHdpZHRoICYmIHkgPCBoZWlnaHQpOwogICAgICAgIHJldHVybiBwX2RhdGFbeSAqIHdpZHRoICsgeF07CiAgICB9CiAgICAKICAgIC8vIFp1Z3JpZmZzb3BlcmF0b3IgKGNvbnN0KQogICAgY29uc3QgVCYgb3BlcmF0b3IoKShzaXplX3QgeCwgc2l6ZV90IHkpIGNvbnN0CiAgICB7CiAgICAgICAgYXNzZXJ0KHggPCB3aWR0aCAmJiB5IDwgaGVpZ2h0KTsKICAgICAgICByZXR1cm4gcF9kYXRhW3kgKiB3aWR0aCArIHhdOwogICAgfQogICAgCiAgICAvLyBadXdlaXN1bmdzb3BlcmF0b3IKICAgIEFycmF5MkQmIG9wZXJhdG9yID0oY29uc3QgQXJyYXkyRCYgcmhzKQogICAgewogICAgICAgIGFzc2VydCh3aWR0aCA9PSByaHMud2lkdGggJiYgaGVpZ2h0ID09IHJocy5oZWlnaHQpOwogICAgICAgIAogICAgICAgIC8vIERhdGVuIGtvcGllcmVuCiAgICAgICAgc3RkOjpjb3B5KHJocy5wX2RhdGEsIHJocy5wX2RhdGEgKyB3aWR0aCAqIGhlaWdodCwgcF9kYXRhKTsKCiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQogICAgCiAgICAvLyBHZXR0ZXIKICAgIHNpemVfdCBnZXRXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIHdpZHRoOyB9CiAgICBzaXplX3QgZ2V0SGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gaGVpZ2h0OyB9CiAgICAKcHJpdmF0ZToKICAgIGNvbnN0IHNpemVfdCB3aWR0aDsKICAgIGNvbnN0IHNpemVfdCBoZWlnaHQ7CiAgICBUKiBjb25zdCBwX2RhdGE7Cn07CgppbnQgbWFpbigpCnsKICAgIC8vIEJlaXNwaWVsIGbDvHIgQmVudXR6dW5nOgogICAgQXJyYXkyRDxpbnQ+IG1laW5BcnJheSgzMCwgNTApOwogICAgbWVpbkFycmF5KDEwLCAxMCkgPSA0MjsKICAgIG1laW5BcnJheSgxMDAwLCAxMDAwKSA9IDA7IC8vIDwtLSBGZWhsZXIsIHdpcmQgYmVpIERlYnVnIHZvbSAiYXNzZXJ0IiBhYmdlZmFuZ2VuCn0=