C++类设计和按值返回

标签 c++

我有一个如下所示的类层次结构:

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并且不会给你想要的行为。您所拥有的只是一个地址。它将不再是 InternalAddressExternalAddress

If there's a better way to do this, please enlighten me!

您将需要某种动态内存分配。为了让您的生活更轻松,让您的代码更安全,您应该查看 smart pointers它将为您管理内存,从而大大降低内存泄漏的可能性。

关于C++类设计和按值返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38058773/

相关文章:

c++ - 为什么我的 while 循环不接收新输入 (c++)

c++ - 计算字符串中的元音、辅音、数字和其他符号

c++ - 如何返回抽象类指针指向的对象?

c++ - C 和 C++ 类型之间的区别 (typedef)

c++ - 如何在一个 Mat 中找到指定的值,以及它在另一个 Mat 中的对应值

c++ - 如何将两个 double 据类型元素转换为一个点数据类型

c++ - LR(1) 语法的状态、符号和规则的数量的合理上限是多少?

c++ - 在C++中定义二维数组的最简单方法

c++ - 段错误(核心转储)C++

c++ - 在 JSON 字符串中序列化 utf-8 字符的标准方法