我正在为OOPs c ++课程做作业。这个赋值涉及使用set / get函数和constructor / persecutors。
我有一些代码可以使用VS professional 2015(windows)编译并运行但不会在我们的linux实验室编译(我需要它在这里编译所以我可以运行一个测试床以确保我之前没有样式错误转入,如果它不能编译,我会得到一些分数)
那么我正在研究的代码是创建四个不同的类。
地址,产品,客户,订单(Code)
Customer有一个类私有成员变量,它是Address的一个实例。 Order有两个类私有成员变量,Address和Customer实例。
如前所述,分配的目的是更熟悉set / get函数。
我的教授明确表示“get”函数应返回一个值而不存储值(访问私有成员变量)。
例如在班级Address中,我使用“get”函数来访问成员变量street
string getStreet() { return street; }
现在,当我需要创建一个get函数来访问私有成员变量但该变量恰好是一个类的实例时,我不知道该怎么做。
坚持训练我认为我会设置这样的东西(Customer Class)。
Address getAddress() { return address; }
同样我设置了如下的设置功能
void setAddress(Address &address)
{
this->address.setStreet(address.getStreet());
this->address.setCity(address.getCity());
this->address.setState(address.getState());
this->address.setZip(address.getZip());
}
更深入一步然后我有一个名为Order的类,它有一个Customer的私有成员变量实例。现在,我认为我遇到了麻烦。
我需要创建一个非默认构造函数,在其中传递一个实例,其中一个实例是客户类。
我的构造函数看起来像这样。
Order(Product &product, int quantity, Customer &customer)
{
this->product.setName(product.getName());
this->product.setDescription(product.getDescription());
this->product.setWeight(product.getWeight());
this->product.setBasePrice(product.getBasePrice());
this->quantity = quantity;
this->customer.setName(customer.getName());
this->customer.setAddress(customer.getAddress());
}
现在这个过程在VS专业版2015中运行时没有引发任何标志错误,但是当我尝试在linux实验室编译时,我得到了错误。
In file included from order.cpp:3:0:
order.h: In constructor ‘Order::Order(Product&, int, Customer&)’:
order.h:25:51: error: no matching function for call to‘Customer::setAddress(Address)’
this->customer.setAddress(customer.getAddress());
^
order.h:25:51: note: candidate is:
In file included from order.h:7:0,
from order.cpp:3:
customer.h:32:8: note: void Customer::setAddress(Address&)
void setAddress(Address &address)
^
customer.h:32:8: note: no known conversion for argument 1 from ‘Address’ to ‘Address&’
In file included from order.cpp:3:0:
order.h: In member function ‘void Order::setCustomer(Customer&)’:
order.h:39:51: error: no matching function for call to ‘Customer::setAddress(Address)’
this->customer.setAddress(customer.getAddress());
^
order.h:39:51: note: candidate is:
In file included from order.h:7:0,
from order.cpp:3:
customer.h:32:8: note: void Customer::setAddress(Address&)
void setAddress(Address &address)
^
customer.h:32:8: note: no known conversion for argument 1 from ‘Address’ to ‘Address&’
In file included from assign05.cpp:16:0:
order.h: In constructor ‘Order::Order(Product&, int, Customer&)’:
order.h:25:51: error: no matching function for call to ‘Customer::setAddress(Address)’
this->customer.setAddress(customer.getAddress());
.........
可以找到其余错误here
现在我不确定我做错了什么,但我觉得这与我如何传递实例地址然后尝试通过get函数访问它有关。任何有关这方面的见解将非常感激。感谢
答案 0 :(得分:3)
简短回答:对类型Address
的非const左值引用无法绑定到Address
类型的临时值。
您的Customer::getAddress
返回地址副本(临时对象/右值)。但Customer::setAddress
接受左值(非临时对象)引用。
正确的解决方案是让Custom::setAddress
接受 const 左值引用。由于您没有修改参数(并且不应执行此操作)和 const 左值引用可以绑定到右值。
注意:由于其他错误,您的代码将无法编译:您无法在const对象上调用非const方法(在您的情况下为getter)。通过将const
添加到声明结尾(例如:string getState() const { return state; }
)将getter标记为const方法。
如果你想了解什么是左值,rvalue正是...... What are rvalues, lvalues, xvalues, glvalues, and prvalues?和 http://thbecker.net/articles/rvalue_references/section_01.html
答案 1 :(得分:0)
由于getAddress
返回副本而setAddress
仅接受引用,因此您需要存储getAddress
的返回副本,然后将该变量用于setAddress
auto wAddress = customer.getAddress();
this->customer.setAddress(wAddress);