如何通过包装类访问direcly类成员的方法

时间:2017-04-27 02:57:40

标签: java c# c++

我有一段代码,类似于在C ++中实现智能指针的方式。

template <class T>
class WrapObject
{
public:
    WrapObject(T* data)
    {
        _data = data;
    }
    T* operator->()
    {
        return _data;
    }
private:
    T* _data;
};

class Hello
{
public:
    void sayHello()
    {
        std::cout << "hello world" << std::endl;
    }
};


int main() {
    Hello h;
    WrapObject<Hello> wh(&h);
    wh->sayHello();
    return 0;
}

在main函数中,我们可以使用operator&#39; - &gt;&#39;直接从WrapObject访问Hello对象的所有方法。

有没有办法在C#或Java中做这样的事情?

1 个答案:

答案 0 :(得分:0)

C#类型分为&#39;值类型&#39;和&#39;参考类型&#39;

引用类型(如类,接口)就像C ++中的指针一样,值保存在堆中,堆栈保存堆的地址。

值类型(例如int,long,char,struct)保存在堆栈上。

C#只有值类型支持指针操作(您必须在项目中设置&#39;允许不安全的代码)。在C#中,您不能在堆栈上分配引用类型。您可以简单地认为引用类型是指针

    public class MyClass
    {
        public string name { get; set; }
    }

    public struct MyStruce
    {
        public string name { get; set; }
    }   

    static void Main()
    {
        //MyClass *myClass=new MyClass()
        //*myClass->name="Lee";
        MyClass myClass = new MyClass();            
        myClass.name = "Tom";

        //MyStruce myStruce;
        //myStruce.name="Jack";
        MyStruce myStruce = new MyStruce();
        myStruce.name = "Jack";
    }

您的代码更改为C#

    public class WrapObject<T>
    {
        private T _data;
        public WrapObject(T data)
        {
            _data = data;
        }

        public T Data
        {
            get { return _data; }
        }
    }

    public class Hello
    {
        public void SayHello()
        {
            Console.WriteLine("hello world");
        }
    }

    static void Main()
    {
        Hello h = new Hello();
        WrapObject<Hello> wh = new WrapObject<Hello>(h);
        wh.Data.SayHello();
    }