我有一个如下所示的类层次结构:
class Address {
public:
virtual ~Address() {}
enum Type {
Internal, External
};
Type type() const { return _type; }
protected:
Address(Type type) : _type(type) {}
private:
Type _type;
};
class InternalAddress : public Address {
public:
InternalAddress(const string& portName) : Address(Internal), _portName(portName) {}
~InternalAddress() {}
const string& portName() const { return _portName; }
private:
string _portName;
};
class ExternalAddress : public Address {
public:
ExternalAddress(const string& handlerName) : Address(External), _handlerName(handlerName) {}
~ExternalAddress() {}
const string& handlerName() const { return string("handler"); }
private:
string _handlerName;
};
我想消除动态内存分配,所以我创建了一个工厂函数,它根据参数按值返回其中一个:
static Address addressForType(Address::Type type) {
if (Address::Internal == type)
return InternalAddress();
else
return ExternalAddress();
}
然后我做这样的事情:
int main(int argc, char **argv) {
Address address = addressForType(Address::External);
cout << ((ExternalAddress&)address).handlerName() << endl;
}
我在这里做的有什么问题吗?或者,这只是一个糟糕的设计??我问的原因是我正在尝试修改现有系统以使其使用较少的动态内存分配。当我尝试访问由“handlerName()”方法返回的字符串引用时,将代码更改为按值返回而不是动态分配的对象会导致段错误。
如果有更好的方法,请赐教!我要补充一点,为简洁起见,我省略了复制构造函数和赋值运算符。即使有这些,我也会得到相同的结果。
谢谢。
最佳答案
Is there anything wrong with the what I'm doing here?
是的。你在做什么叫做object slicing并且不会给你想要的行为。您所拥有的只是一个地址
。它将不再是 InternalAddress
或 ExternalAddress
。
If there's a better way to do this, please enlighten me!
您将需要某种动态内存分配。为了让您的生活更轻松,让您的代码更安全,您应该查看 smart pointers它将为您管理内存,从而大大降低内存泄漏的可能性。
关于C++类设计和按值返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38058773/