我已经学过一些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/