class with two dimensional array as a member (I need help)

P

Pawel_Iks

Hello!

I'd like to have a two dimensional array as a member of a class, bu if
I did it in the following way:

class A {
const int n;
int a[n][n];
public:
A(int nn): n(nn) {};
~A() {};
};

this produce error, when I changed it to:

class A {
const int n;
int** a;
public:
A(int nn): n(nn) {
for (int i=0;i<n;i++)
a=new int[n];
}
~A() {
for (int i=0;i<n;i++)
delete [] a;
}
};

it works fine, however when I tried to use it in some program like
this:

int main() {
int x,y;
A a(10);
return 0;
}

program compiled without any problems, but when I run it it was thrown
an unknown exception ... I don't understand what is going on.
 
J

James Kanze

* 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 )". 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. 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<>::eek:perator[]. 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;
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,576
Members
45,054
Latest member
LucyCarper

Latest Threads

Top