2012-08-08 45 views
1

我想构建一个对象,然后将其中一个变量设置为一个值。使用指针/类的设置方法

类的头:

class Book { 
public: 
Book(); 
Book(string newSelection); 
string getSelection(); 
string setSelection(string newSelection); 

private: 
string selection; 
} 

级CPP

Book::Book() {} 

Book::Book(string newSelection) { 
selection = newSelection; 
} 


string Book::getSelection(){ 
return selection; 
} 

string Book::setSelection(string newSelection){ 
selection = newSelection; 
} 

驱动

Book* book1 = new Book(); 
book1->setSelection("The Book Title"); 
cout << "Book selected: " << book1->getSelection() << endl; 

我得到一个segmentat离子故障,我不知道为什么。有人能指出我的问题可能在哪里吗?

+2

此代码看起来完全正常。你确定这是所有?这给你seg-fault? – 2012-08-08 16:28:47

+0

尝试一下没有指针,所以Book book1;然后book1.setSelection(“书名”);那样有用吗?你还记得包括字符串?但是,你的代码很好,它应该工作。 – Annabelle 2012-08-08 16:30:09

+1

您在头文件的类定义中的'}'后面也缺少一个';',但这应该成为编译器错误 – learnvst 2012-08-08 16:31:43

回答

2

setSelection()函数声明为返回一个字符串,但实际上正在没有返回的字符串。你至少应该得到一个编译警告。

从调试器中运行这个,我相信发生了什么是在调用setSelection()后,在返回的字符串上调用析构函数。由于该字符串并不存在,因此运行时会导致abort()

作为一般规则,“二传手往往不如下返回任何东西,因此我们将写成:

void setSelection(const string& newSelection); 

...

void Book::setSelection(const string& newSelection) 
{ 
    selection = newSelection; 
} 

也注意到,该字符串被传递常量引用而不是价值更有效。这不会是你的问题的原因。

另一个建议是,以确保您“消气”被声明为const,因为它没有在对象改变什么:

string getSelection() const; 

...

string Book::getSelection() const 
{ 
    return selection; 
} 
+0

嗯..返回值从来没有使用过,但仍然 - 你可能是对的? – 2012-08-08 16:37:18

+0

我刚刚完成了。我花了一个多小时看着这个。是的......问题是在setSelection函数中返回一个字符串。我将其改为无效,并且可行!好极了。谢谢大家:) – CocaCola 2012-08-08 16:38:16

+0

比科学更直观。当我编译它时足够了我得到了'警告:控制达到了非空函数的末尾,这正是我期望的。我通过gdb运行它,并根据我发现的内容在上面添加了我的想法。 – 2012-08-08 16:50:54

1

setSelection方法被定义为返回一个字符串,但它没有返回任何东西。也许增加一个return语句(或者将其更改为无效)会解决这个问题:

string Book::setSelection(string newSelection){ 
    selection = newSelection; 
    return selection; 
} 
+0

编译器无需警告未返回值,因为它通常是很难判断所有路径是否可达。 – ecatmur 2012-08-08 16:39:46

+0

@ecatmur:好点。我删除了那句话。 – 2012-08-08 16:44:18