gpt4 book ai didi

c++ - 在 Effective C++ 书中的这个例子中,函数返回对象指针的实现细节是什么?

转载 作者:搜寻专家 更新时间:2023-10-31 00:32:04 24 4
gpt4 key购买 nike

class Investment { ... }; // root class of hierarchy of
// investment types

Investment* createInvestment(); // return ptr to dynamically allocated
// object in the Investment hierarchy;
// the caller must delete it
// (parameters omitted for simplicity)

void f()
{
Investment *pInv = createInvestment(); // call factory function
... // use pInv
delete pInv; // release object
}

在书中,作者给出了如上所示的示例代码。这是我第一次看到这一行:

Investment* createInvestment(); // call factory function

这个函数是写在类定义里面还是外面?类定义中要使该行起作用的要求是什么?即你需要这样的定义吗?这甚至是一个有效的定义吗?

class Investment {
public:
Investment* createInvestment(){
return ptr;
};
private:
Investment* ptr;
};

最佳答案

Is this function written inside the class definition or outside?

两者皆可。在这个例子中,它在类之外的一个自由函数中。它也可以放在一个单独的 InvestmentFactory 类中。但它也可以放在 Investment 类中,在这种情况下它需要是 static(即不依赖于特定的 Investment) .

What are the requirements in the class definition to make that line functional?

如果 Investment 的构造函数可以从 createInvestment 内部访问(在这种情况下,它必须是公开的),那么它可以像这样简单

Investment* createInvestment() { return new Investment; }

但在您的示例中,有一条评论指出 Investment 是“投资类型层次结构的根类”。这意味着 createInvestment 方法可能存在以从 Investment 创建派生类,并返回一个 Investment* 以允许对于多态性。例如,假设 StockBond 都派生自 Investment;那么 createInvestment 可能如下所示:

Investment* createInvestment(InvestmentType investType) {
switch (investType) {
case STOCK:
return new Stock;
case BOND:
return new Bond;
default:
throw std::invalid_argument("investType");
}
}

这是一个相当愚蠢的例子,但它只是展示了一些可行的东西。

在你的例子中:

class Investment {
public:
Investment* createInvestment(){
return ptr;
};
private:
Investment* ptr;
};

这是非常错误的(尽管它会编译)。首先,类不需要存储指向自身的指针(即 this 关键字)。其次,您从不初始化 ptr,因此您的 createInvestment 将返回一个未初始化的指针。您需要在某处创建一个 new 来实际创建一个对象。

关于c++ - 在 Effective C++ 书中的这个例子中,函数返回对象指针的实现细节是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32282579/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com