类中的变量具有错误的值

时间:2019-01-24 10:30:45

标签: c++

我刚刚开始学习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

3 个答案:

答案 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毫无意义。