2014-10-09 68 views
2

我正在学习来自C#的C++。在C#中,可以有类如下列:C++等效的C#嵌套私有类

public abstract class BankAccount 
{ 
    private BankAccount() {} // prevent third-party subclassing. 
    private sealed class SavingsAccount : BankAccount { ... } 
    private sealed class ChequingAccount : BankAccount { ... } 
    public static BankAccount MakeSavingAccount() { ... } 
    public static BankAccount MakeChequingAccount() { ... } 
} 

这样,消费者不用担心的BankAccount类型和不能嵌套自己的子类。

在C++中有这样的方法吗?

+0

关键字'final'可能会帮助你(C++ 11) – OMGtechy 2014-10-09 23:33:20

+3

你永远不会完全对齐两种不同语言的语义。此外,在目标语言中这样做也许没有意义。我建议你不要试图通过C#眼镜来查看C++。忘记你对C#的了解,并从头开始学习C++。 – Galik 2014-10-09 23:39:51

+0

坚持使用c#并使用不安全的关键字。如果你不知道你在用c/C++做什么,你可以真正打开自己的安全漏洞。 – RadioSpace 2014-10-09 23:42:03

回答

1

首先,我是有点警惕,夫妻接口的实现和宁愿子类和工厂设计从BankAccount分离接口,但让我们假设你想这样。

在使用C++ 11之前,要小心C++中的嵌套类,它们对外部类没有特殊的访问权限,但是您可以通过朋友类实现类似的功能。

使用C++ 11,我们得到了final说明符,它允许我们防止子类化。

这里是版本使用嵌套类,使用友元类来代替将是非常相似:

#include <memory> 

class BankAccount { 
private: 
    class SavingsAccount; 
    class ChequingAccount; 
    BankAccount() = default; // prevent third-party subclassing 
public: 
    virtual ~BankAccount() {} 
    static std::unique_ptr<BankAccount> makeSavingsAccount(); 
    static std::unique_ptr<BankAccount> makeChequingAccount(); 
}; 

class BankAccount::SavingsAccount final : public BankAccount { }; 

class BankAccount::ChequingAccount final : public BankAccount { }; 

std::unique_ptr<BankAccount> 
BankAccount::makeSavingsAccount() { 
    return std::make_unique<SavingsAccount>(); 
} 

std::unique_ptr<BankAccount> 
BankAccount::makeChequingAccount() { 
    return std::make_unique<ChequingAccount>(); 
} 

int main() { 
    auto savings = BankAccount::makeSavingsAccount(); 
    auto chequing = BankAccount::makeChequingAccount(); 
} 

Live demo

工厂方法必须返回一个指针,最好是智能指针像unique_ptr。如果需要,unique_ptr可以转换为shared_ptr

0

这是直截了当在C++:

class BankAccount 
{ 
private: 
    BankAccount(){} 
    class SavingsAccount; 
    class ChequingAccount; 

public: 
    static BankAccount MakeSavingAccount(); 
    static BankAccount MakeChequingAccount(); 
}; 

class BankAccount::SavingsAccount final : public BankAccount 
{ 
}; 

class BankAccount::ChequingAccount final : public BankAccount 
{ 
}; 

BankAccount BankAccount::MakeSavingAccount() 
{ 
    ... 
} 

BankAccount BankAccount::MakeChequingAccount() 
{ 
    ... 
} 
+0

工厂方法如何实施? – cm007 2014-10-09 23:58:13

+0

与C#几乎完全相同。在'BankAccount'类中。 – 2014-10-10 00:01:03

+0

@ChrisDrew:私有构造函数在C++中是微不足道的 - 我只是复制了可能不明显的C++代码。 – 2014-10-10 01:04:39