2011-03-03 36 views
1

嘿,我几年前教了自己的PHP,现在在大学里,并且对Java比较熟练(因此我的意思是我是初学者,但是我的数据结构当然在这我将采取算法下学期)帮助第一个C++类/指针

在任何情况下......我想学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一部分。

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

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

+0

没有**算哪里,你试图做“2 * NUM”,还必须“民”和“两次”为指针,以一些记忆,但你不被方式,为他们分配内存 – fazo 2011-03-03 04:51:37

+0

哦...我认为代码试图做的事情相当明显,但以防万一:我有一个“Number”类,每个Number都有一个值和一个所有者,当创建一个新实例时,它们都被传入。然后还有“两倍”值,它被设置为数值的两倍。 – 2011-03-03 04:52:19

+1

我要加你如何需要得到一个C++的书,从无数次学习评论,直到你提到你已经购买了C++入门。第一次在Stack Overflow上搜索你的荣誉。 – 2011-03-03 04:54:38

回答

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正在将a指向有效的内存位置。您应该将其分配/初始化为它应该指向的位置。

所以,

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. 

希望它可以帮助到的程度。

+0

它应该是'owner = new string';' – fazo 2011-03-03 04:55:10

+0

@fazo - 谢谢指出。纠正。 – Mahesh 2011-03-03 04:56:43

+0

谢谢!我认为内存是在我声明变量时分配的。 – 2011-03-03 04:59:33

0

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

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。摹

int myints[2]; 

num = myints 
twice = myints+1; 

那么你可以做

*num = our_num 

所以,当你写

int *num;你是在告诉NUM将包含地址的编译器。

当您使用

num你实际上处理的地址。

当你写 *num

你会引用是在地址num的数据。