嘿伙计们,几年前我自学了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”吗?这就是我想要的!
感谢您帮助我所知道的非常愚蠢和根本性的错误...
答案 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 = # // 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,并且在析构函数中您需要删除它们