开发者

Help with first C++ class/pointers

Hey guys, I taught myself PHP a few years back and am now in college and am relatively well versed in Java (and by that I really mean I'm a beginner but did my data structures course in it. I'll be taking Algorithms next semester)

In any case...I want to learn C++ and stumbled upon this: http://newdata.box.sk/bx/c/

What is really tripping me up right now is pointers...I THINK I get the theory but a really simple "program" isn't running right. It compiles but then there's a memory error.

I've decided to purchase C++ Primer after doing a few searches here on SO so it'll get here on Friday. Until then, can anyone tell me what is (horribly) wrong with this simple code:

class Number {
public:
    string *owner;

    int getNum() {
        return *num;
    }

    int getTwice() {
        return *twice;
    }

    Number(int our_num, string me) {
        *num = our_num;
        *twice = 2 * *num;
        *owner = me;
    }

private: 
    int *num;
    int *twice;

};

int main()
{
Number *nbr3 = new Number(3,"Bob");

cout << nbr3->getNum() << endl;
cout << nbr3->getTwice() << endl;
cout << nbr3->owner << endl;
delete nbr3;
system("PAUSE");
return 0;
}

The errors appear in th开发者_Python百科e constructor...like the *num=our_num part.

But isn't that line saying "set the value of the num pointer to our_num"? That IS what I want!

Thanks for helping with what I know to be a very silly and fundamental error...


You didn't allocate memory locations to point to for num, twice,owner. So, in your constructor -

Number(int our_num, string me) {

    num = new int;
    twice = new int;
    owner = new string;

    *num = our_num;
    *twice = 2 * (*num);
    *owner = me;
}

Since, the class is managing resources, class Number should follow -Rule of Three

Edit 1

Pointers are like any other variables but holds a memory address. Just declaring int* ptr; doesn't mean that ptr is pointing a to valid memory location right away. You should assign/initialize it to where it should point to.

So,

int *ptr;
int num = 10;
ptr = &num; // ptr points to num location

int *ptr2 = new int; // The operator returns a memory location from free store that can hold an integer.
*ptr2 = 10;   // Now, store 10 in the location ptr2 is pointing to.
// ......

delete ptr2;  // You should return the resources back to the free store since we are managing resources.

Hope it helps to an extent.


This is the problem:

Number(int our_num, string me) {
    *num = our_num;
    *twice = 2 * *num;
    *owner = me;
}

private: 
    int *num;
    int *twice;

In your class you have declared num and twice to be pointers, but they do not point to anything. Doing *num = our_num doesn't change the pointer instead what that means is that you are derefencing what num is pointing to in order to assign the value contained in our_num. This will cause a crash since num is some random value.

In order to fix this set the pointer to point to an int first.

e.g

int myints[2];

num = myints
twice = myints+1; 

then you can do

*num = our_num

so when you write

int *num; you are telling the compiler that num will contain an address.

when you use num you are in fact handling the address.

when you write *num you are referencing the data that is at the address num.


num and twice don't point to anything. In the constructor of the class you need num=new int and twice=new int, and in the destructor you need to delete them

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜