繁体   English   中英

VC ++中“C#对象”的等价物是什么?

[英]What is the Equivalent of “object of C# ” in VC++?

在C#中,我们有一个数据类型对象,可以容纳任何类型的数据。 我希望在VC ++中实现同样的目标。 任何人都可以让我知道VC ++相当于“C#的对象”。
IN C#,在调用appl程序中(比如call.cs)

object ob=null;
ob=(object)str; 
 funct(ref ob);

这里str是空字符串。

我希望在VC ++中实现这一点。 所以我需要创建VC ++等价的对象。 我确定我们需要使用指针作为ref的等价物?

没有一个。 C ++没有像.NET语言那样的统一类型层次结构。

你可以得到的最接近的是void* (指向void*指针),它可以指向任何类型的对象。 不过,你应该避免像瘟疫一样的void* 一旦你开始使用它们,你将失去所有类型的安全性。

正如其他评论家所说,C ++没有针对每个对象的公共基类。 从理论上讲,你可以创建自己的东西并从中派生出一切:

class Object
{
protected:
    Object(){};
    virtual ~Object(){};

public:
    virtual std::string toString() const {return("");};
}; // eo class Object

但是,这对整数类型(例如int,short)没有帮助。 你必须自己做:

class Int : public Object
{
private:
    int m_nVal;

public:
    Int(int _val = 0) : m_nVal(_val){};
    Int(const Int& _rhs) : m_nVal(_rhs.m_nVal){};
    virtual ~Int(){};

    // operators
    operator int() const {return(m_nVal);}
    bool operator == (const Int& _rhs) const {return(m_nVal == _rhs.m_nVal);};
    bool operator == (int _val) const {return(m_nVal == _val);};
    Int& operator = (const Int& _rhs) {m_nVal = _rhs.m_nVal; return(*this);}:
    Int& operator = (int _val) {m_nVal = _val; return(*this);};
    // .... and all the other operators

    // overrides
    virtual std::string toString() const
    {
       std::ostringstream oss;
       oss << m_nVal;
       return(oss.str());
    };
}; // eo class Int

然后,您必须为要使用的所有其他类型执行此操作。 一旦完成,你可以传递它们,就好像它们是整数,bool,longs等(由于运算符重载)。 更好的方法是使用模板类作为整数类型:

template<class T> class IntegralType : public Object
{
private:
    T m_Val;

public:
    // rest of class looks the same
}; // eo class IntegralType<>

然后键入dede他们:

typedef IntegralType<int> Int;
typedef IntegralType<short> Short;
typedef IntegralType<long> Long;

即使使用这样的模板类来完成它的工作,你仍然需要对字符串/ bool进行专门化。 在IntegralType <>上实现operator ++可以很好地处理数字,但是会在std :: string上运行。

如果你去模板路线,你现在有了“对象”,整数类型和字符串,bools的一些特殊化。 但是为了更多地模仿.NET,你可能想要引入用于比较的接口:

template<class T> class IEquitable
{
public:
    virtual Equals(T _other) = 0;
};   // eo class IEquitable<>

这可以很容易地进入您的IntegralType <>类和专业化。

但正如另一位评论员指出的那样,你为什么这么做? boost :: any非常有用,如果您尝试执行类似于具有名称和任意类型值的元组。 如果你需要构建这些集合,那么你的设计就会出现根本性的问题。 例如,在我用C#进行的所有编码中,我从未写过:

List<Object> list = new List<Object>();

可能有:

List<Vehicle> list;
List<Employee> List;
Dictionary<string, Alien> aliens;

但对象级别从来没有任何东西。 为什么? 除了在它上面调用ToString(),或者也许做一些冒险的演员,你为什么要这样做? 编程中存在泛型,因此我们不必拥有对象列表(或者在C ++,void *的情况下)。

所以你有它。 上面展示了如何让对象和整体类型像C#一样工作,我错过了一大堆东西。 现在是时候看看你的设计并决定你是否真的需要这样做。

这种语言没有内置任何东西。 通常,想要它表明你的设计没有经过深思熟虑,但如果你无法找到任何替代方案,你可以考虑(例如) Boost any

<comutil.h>头文件包含一个方便的VARIANT包装器。 注意正确的初始化和清理。

#include <comutil.h>
#ifdef _DEBUG
#  pragma comment(lib, "comsuppwd.lib")
#else
#  pragma comment(lib, "comsuppw.lib")
#endif
...
    _variant_t arg = L"some string";
    someComPtr->func(&arg);

您的代码段中没有任何内容可以帮助您找出如何获取COM接口指针。 如果遇到问题,请开始一个新的问题。

您可以选择System.Runtime.InteropServices.GCHandle,它允许您从非托管代码中查找托管对象,但无论如何您最终会遇到令人讨厌且冒险的类型转换,您需要非常小心保留某个对托管对象的引用,因为如果非托管代码中只有引用,它可能会被垃圾收集。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM