帮助第一个C ++类/指针

时间:2011-03-03 04:48:11

标签: c++

嘿伙计们,几年前我自学了PHP,现在上大学,并且相对精通Java(而且我真的是说我是初学者,但我的数据结构课程也是如此。我会下学期学习算法

无论如何......我想学习C ++并偶然发现: http://newdata.box.sk/bx/c/

现在真正绊倒我的是指针......我想我得到了理论但是一个非常简单的“程序”运行不正确。它会编译但是会出现内存错误。

我决定购买C ++ Primer后,在这里进行了一些搜索,所以它将在星期五到达。在那之前,任何人都可以告诉我这个简单的代码是什么(可怕)错误:

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;
}

错误出现在构造函数中......就像* num = our_num part。

但不是那句话说“将num指针的值设置为our_num”吗?这就是我想要的!

感谢您帮助我所知道的非常愚蠢和根本性的错误...

3 个答案:

答案 0 :(得分:1)

您没有为num, twice,owner分配内存位置以指向。所以,在你的构造函数中 -

Number(int our_num, string me) {

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

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

由于班级正在管理资源,class Number应遵循 - Rule of Three

修改1

指针与任何其他变量一样,但保存内存地址。仅声明int* ptr;并不意味着ptr立即指向有效的内存位置。您应该将其指定/初始化到它应该指向的位置。

所以,

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.

希望它在一定程度上有所帮助。

答案 1 :(得分:1)

这是问题所在:

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

private: 
    int *num;
    int *twice;

在你的班级中你已经声明了num和两次指针,但它们没有指向 任何事情。执行* num = our_num不会更改指针,而是意味着您正在解析num指向的内容,以便分配our_num中包含的值。这会导致崩溃,因为num是一些随机值。

为了修复此设置,指针首先指向int。

e.g

int myints[2];

num = myints
twice = myints+1; 

然后你可以做

*num = our_num

所以写的时候

int *num;你告诉编译器num将包含一个地址。

当您使用num时,您实际上正在处理该地址。

当您撰写*num时,您正在引用地址为num的数据。

答案 2 :(得分:0)

num和两次不指向任何东西。在类的构造函数中,您需要num = new int和two = new int,并且在析构函数中您需要删除它们