Re: class with two dimensional array as a member (I need help)
* James Kanze:
On May 13, 9:18 am, "Alf P. Steinbach" <al...@start.no> wrote:
* Pawel_Iks:
Just a couple of nits (and the correction of a typo), but...
<code>
class A
{
private:
size_t myN;
std::vector<int> myElements;
size_t indexFor( size_t i, size_t j ) const
{
return myN*i + j;
}
public:
A( size_t n ): myN( n ), myElements( n*n ) {}
int at( size_t i, size_t j ) const
{
return myElements.at( indexFor( i + j ) );
You certainly meant "indexFor( i, j )"
Yes.
. As written, it won't
compile (and wouldn't do the right thing if it did).
Also, I very much question the wisdom of using at() here.
That's the design of std::vector::at.
It may be unwise (or not!) that std::vector::at doesn't terminate the
program instead of throwing, but what it does that is absolutely not
unwise is to guarantee to /fail/ on an invalid index value, which
guarantee operator[] doesn't offer -- all operator[] has is UB.
Especially for a newbie it's therefore a good idea to use at(), and a
bad idea to use operator[], unless one knows that one's standard
library implementation guarantees failure also for operator[] -- but
in general one won't know that, and in particular, a newbie won't.
If
there's an error in the indexing, you want an assertion failure,
not an exception. Which is what you'll get with any reasonable
implementation of std::vector<>::operator[]. But of course,
even that is only partially right, since something like 20, 0
will pass even if myN is 10. You really need to use assert in
indexFor, i.e.:
size_t indexFor( size_t i, size_t j ) const
{
assert( i < myN && j < myN ) ;
return myN*i + j;
}
Ideally, yes, agreed.
I congratulate myself on still being able to write off-the-cuff code
that is so easily modified, so maintainable. ;-)
Cheers,
- Alf
--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?