【问题标题】:What is the Equivalent of "object of C# " in VC++?VC++ 中“C# 对象”的等价物是什么?
【发布时间】:2011-04-30 13:56:59
【问题描述】:

在 C# 中,我们有一个数据类型对象,它可以保存任何类型的数据。我想在 VC++ 中实现同样的事情。谁能告诉我 VC++ 相当于“C# 的对象”。
在 C# 中,在调用 appl 程序中(比如 call.cs)

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

这里的 str 是空字符串。

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

【问题讨论】:

  • 对象本身不能保存任何数据,但任何对象都可以转换为对象变量。
  • 至于使用指针作为ref 的等价物,它比指针和ref 要复杂一些。有关更多信息,请参阅此问题:stackoverflow.com/questions/924360/…
  • -1 用于询问您所追求的以外的其他内容。 @user485539:在对詹姆斯回答的评论中,您声明您的目标不是您的问题,而是调用声明为funct(VARIANT* z) 的函数。您可以通过提供指向VARIANT 的指针来调用该函数。这是一个有文档的类型,并且有很多支持它,只需选择你的毒药,例如_variant_t。阅读文档后。干杯,

标签: c# c++ visual-c++ com


【解决方案1】:

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

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

【讨论】:

  • 其实在上面的代码中,“funct(ref ob);”,这个funct()的函数定义;存在于 COM DLL 中(在 VC++ 中)。并且函数定义中的接收参数类型是VARIANT * type------funct(VARIANT * z)..如果我们想从C#代码调用这个函数而不是上面的代码sn-p(在我的问题) 可以使用。但是当我想从我的 VC++ 应用程序中调用这个 COM DLL 函数 funct(VARIANT * z) 时,我该如何实现呢?请告诉我..
  • @user:我不知道;我几乎没有使用 COM 的经验。 func(ref ob) 语法不是 C++。
  • 我可以创建一个 VARIANT 类型的 VT_BSTR 并将其地址作为参数传递。我的意思是 VARIANT 收集器;收集器.vt=VT_BSTR;收集器.bstrVal=SysAllocString((OLECHAR *)" ");最后调用funct(),------------funct(&collector); ......
  • @user:当我说我几乎没有使用 COM 的经验时,我是认真的。我不知道。不过,其他人可能会。
【解决方案2】:

正如其他评论员所说,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

然后,您必须对要使用的所有其他类型执行此操作。完成后,您可以将它们作为整数、布尔值、长整数等传递(感谢运算符重载)。更好的方法是对整数类型使用模板类:

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

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

然后 typedef 他们离开:

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

即使使用像这样的模板类来完成工作,您仍然需要对字符串/布尔值进行专门化。在 IntegralType 上实现运算符 ++ 可以很好地处理数字,但会在 std::string 上抛出。

如果你走模板路线,你现在已经有了“对象”、整数类型和一些字符串、布尔值的特化。但为了更加模仿 .NET,您可能需要引入接口进行比较:

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

这可以很容易地融入到您的 IntegralType 类和专业中。

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

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

可能有:

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

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

所以你有它。上面显示了你可能如何让对象和整数类型像 C# 一样工作,我错过了很多东西。现在是时候审视您的设计并决定这是否是您真正需要做的。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      &lt;comutil.h&gt; 标头包含一个方便的 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);
      

      您的代码 sn-p 中没有任何内容可以帮助我帮助您弄清楚如何获取 COM 接口指针。如果您遇到问题,请提出一个新问题。

      【讨论】:

        【解决方案5】:

        您的替代方法是查看 System.Runtime.InteropServices.GCHandle,它允许您从非托管代码中找到托管对象,但无论如何您最终都会遇到令人讨厌和危险的类型转换,您需要非常小心地在某处保留对托管对象的引用,因为如果非托管代码中只有一个引用,它可能会被垃圾回收。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-05-08
          • 1970-01-01
          • 1970-01-01
          • 2011-12-10
          • 2023-03-30
          • 2010-09-17
          • 2011-07-26
          • 2011-01-07
          相关资源
          最近更新 更多