我已经学过一些C#,现在我正在学习C++。在C#中,可以使用get和set运算符进行数据隐藏,以便通过提供“get”而不是“set”将数据成员表示为“只读”。

这样一来,一个类(Person)可以包含另一个类(Account),以使Person.Account的用户可以使用Account类的公共(public)功能,但是由于它被读取,因此用户无法直接更改Account类。只要。

在下面的代码示例中,这应该更加清楚。

我的问题是,由于C++不提供漂亮的get / set语法,因此下面的代码是否有C++类似物?

using System;

class Person
{
    private string _Name;
    public string Name { get { return _Name; } set { _Name = value; } }

    private Account _Account;
    public Account Account { get { return _Account; } }

    public Person()
    {
        _Name = "";
        _Account = new Account();
    }
}

class Account
{
    private decimal _Balance;
    public decimal Balance { get { return _Balance; } }

    public Account()
    {
        _Balance = 0;
    }
    public void Deposit(decimal deposit)
    {
        _Balance += deposit;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Person p = new Person();
        p.Name = "John Doe";

        // not allowed: p.Account = new Account();
        // Property or indexer 'CSharp.Person.Account' cannot be assigned to -- it is read only

        // allowed: the Account Object's public functions are available
        p.Account.Deposit(1000);

        Console.WriteLine(p.Account.Balance.ToString());
        // console says "1000"
    }
}

最佳答案

返回shared_ptr<Account>。这样,使用者可以调用Account的方法,但不能覆盖Person._account。

#include <iostream>
#include <memory>

using std::cout;
using std::endl;
using std::shared_ptr;
using std::wstring;


class Account
{
  public:
    long Amount;
};

class Person
{
  private:
    shared_ptr<Account> _account = shared_ptr<Account>(new Account());

  public:
    wstring Name;
    shared_ptr<Account> GetAccount() { return _account; }
    shared_ptr<const Account> GetAccount() const { return _account; } // a const Person has a const Account
};

int main()
{
  Person p;

  shared_ptr<Account> a = p.GetAccount();
  a->Amount = 1;                          // access p.Account
  cout << a->Amount << endl;              // print 1

  Account* b = new Account();
  b->Amount = 2;

  a.reset(b);                             // doesn't affect p.Account

  cout << p.GetAccount()->Amount << endl; // still 1
}

之所以可行,是因为返回共享指针会复制它,包括原始指针。对共享容器的更改仅影响副本,但取消引用基础指针将到达原始实例。

关于c# - C++的做法类似于C#的只读数据成员行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19870877/

10-14 07:51