【问题标题】:C++ variables not changing as intendedC++ 变量未按预期更改
【发布时间】:2016-10-05 09:38:05
【问题描述】:

我目前正在为 C++ 编程开发一个面向对象的项目。 我创建了一些对象:

int main()
{
    Address address1 = Address("7732","cambie street","vancouver","BC","v5p3r3");
    Author author1 = Author("Joe","Howe","joehow@hotmail.ca");
    Publisher publisher1("candy",address1);
    Book book1 = Book("sprite",author1,publisher1,"1995");
 return 0;
}

这是我的 4 个对象构造函数

Address::Address(string number, string name, string c, string crty, string pCode){
    streetNumber = number;
    streetName = name;
    city = c;
    country = crty;
    postalCode = pCode;
}
Book::Book(string newTitle, Author author1,Publisher pub, string y){
    ISBN++;
    bookISBN = ISBN;
    title = newTitle;
    a = author1;
    authorCount = 1;
    d = pub;
    year = y;
}
Author::Author(string fN, string lN, string e){

    firstName = fN;
    lastName = lN;
    email = e;
}
Publisher::Publisher(string n, Address x){
    name = n;
    a = x;
}

当我在 main 中调用这些函数时

cout << book1.getPublisher().getAddress().getCity() << endl;
book1.getPublisher().getAddress().set("washington",Address::CITY);
cout << book1.getPublisher().getAddress().getCity() << endl;

不确定c++中是否允许这些我已经在java中完成了,

我也试过将它们分开,它会给我想要的结果,

所以我的问题是 c++ 中是否允许这种格式,如果是,我做错了什么。

我的结果显示

vancouver
vancouver

但我想要的结果是

vancouver
washington

这些是我的 get/set 函数

Address Publisher::getAddress(){
    return a;
}


Publisher Book::getPublisher(){
    return d;
}
void Address::set(string value , int number){
switch(number)
{
    case STREET_NUMBER:
        streetNumber = value;break;
    case STREET_NAME:
        streetName = value;break;
    case CITY:
        city = value;break;
    case COUNTRY:
        country = value;break;
    case POSTAL_CODE:
        postalCode = value;break;


  }
}

感谢您的帮助

【问题讨论】:

  • 请买一本关于 C++ 的书。您的问题是您正在使用从 C++ 中的 Java 学到的东西。由于这两种语言具有完全不同的对象模型,因此您的代码会失败。 Nikita 解释了其中的一些内容(复制返回值),但还有更多内容,因此建议阅读一本好书。
  • 同意@UlrichEckhardt;您应该阅读指针和引用并了解它们是什么以及如何使用它们......因为这更接近于其他语言的工作方式。

标签: c++


【解决方案1】:

getAddress() 返回Address 对象的副本,因此您更改副本,而不是Publisher 中的Address 字段。

要解决问题getAddress() 应该返回参考:

Address& Publisher::getAddress()
{
    return a;
}

您可能需要重新设计对象层次结构,因为returning references (pointers) to internals is bad practice

【讨论】:

  • 返回参考
  • 好的,这也适用于 getPublisher() 和 getCity() 编辑:哦,它可以工作,非常感谢
  • 顺便说一句:我认为在 Java 中它甚至会改变 address1 对象实例。
【解决方案2】:

你必须创建方法

Book::setAddress(Address ads)

或者使用指针/引用来修改它的值。
否则你只会得到它的副本

【讨论】:

    【解决方案3】:

    在 Java 中,一切都是参考。在 C++ 中不是。

    对象的副本太多,如果不使用指针,您将无法轻松地做自己想做的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-12
      • 2020-08-02
      相关资源
      最近更新 更多