我刚刚开始学习c ++,并且在java和c方面有较早的经验。我决定对课程进行一些实验,以进一步了解它们。
目前,我有2个课程,分别是 Book 和 Shelf 。架子由一本书,一串和一个整数组成。本书由一个字符串和一个称为 page 的整数组成。
除了我在 Book 中的int页面,所有变量都包含期望值。它包含一些似乎与任何东西都不相关的任意值。我的猜测是,这与我的代码有关,以某种方式弄乱了指向页面的一些重要指针。
我试图将页面更改为* int而不是int,希望我将保留指向值的指针,而不是值本身。但是输出仍然“错误”,因为取消引用的指针仍然包含错误的值。
我的main.cpp:
int main(int argc, char** argv) {
Book harrypotter("Harry Potter and the Chamber of Secrets");
Shelf fantasy(harrypotter, "fantasy", 1);
fantasy.getBOOK().setPAGE(15);
std::cout << fantasy.getSUBJECT() << std::endl;
std::cout << fantasy.getSHELFNUMBER() << std::endl;
std::cout << fantasy.getBOOK().getNAME() << std::endl;
std::cout << fantasy.getBOOK().getPAGE(); //this line failes
return 0;
}
Shelf.hpp
class Shelf {
public:
Shelf();
Shelf(Book book, std::string subject, int shelfnr);
std::string getSUBJECT(){return this->subject;}
Book getBOOK(){return this->book;} //container with the faulty int
int getSHELFNUMBER(){return this->shelfnr;}
private:
Book book;
std::string subject;
int shelfnr;
};
Book.hpp
class Book {
public:
Book();
Book(std::string name);
std::string getNAME(){return this->name;}
void setPAGE(int page){this->page = page;}
int getPAGE(){return this->page;} //this returns wrong value!
private:
std::string name;
int page;//this contains wrong value!
};
当前输出:
fantasy
1
Harry Potter and the Chamber of Secrets
-2145318336 (or some other arbitrary number)
我期望的输出:
fantasy
1
Harry Potter and the Chamber of Secrets
15
答案 0 :(得分:2)
成员函数public function getPropertyValueAttribute()
{
return "{$this->property} => {$this->value}";
}
按值返回数据成员 。这意味着将复制并作为临时对象返回。这行
Shelf::getBOOK()
更改临时副本,而不是fantasy.getBOOK().setPAGE(15);
实例拥有的对象。您稍后访问的Shelf
变量因此未初始化,并且从中读取是未定义的行为。这就是设置有意义的默认值(例如
page
解决原始问题可以通过
class Book {
// ...
int page = 0;
};
或通过更改@PaulMcKenzie's answer中建议的Book harrypotter("Harry Potter and the Chamber of Secrets");
harrypotter.setPage(15);
// Now, the above book has the desired state, so pass it the Shelf instance:
Shelf fantasy(harrypotter, "fantasy", 1);
签名。
答案 1 :(得分:1)
您看不到更改的原因之一是:
Book getBOOK(){return this->book;}
这将返回Book
对象的副本。因此,您正在更改副本,而不是原始的Book
。
如果要更改在Book
中声明的实际Shelf
对象,请返回引用:
Book& getBOOK(){return this->book;}
答案 2 :(得分:0)
Book getBOOK(){return this->book;}
您返回book
的副本,并在该副本上调用setPAGE
。原始的book
永远不会改变。
如果book
中应该只有一个shelf
(这很奇怪),则可以从setPAGE()
本身暴露shelf
,这将称为{{1} }。
如果您打算在book.setPAGE()
上放置多个book
,则shelf
毫无意义。