cod*_*ver 2 c# c++ com visual-c++
在C#中,我们有一个数据类型对象,可以容纳任何类型的数据.我希望在VC++中实现同样的目标.任何人都可以让我知道VC++相当于"C#的对象".
IN C#,在调用appl程序中(比如call.cs)
object ob=null;
ob=(object)str;
funct(ref ob);
Run Code Online (Sandbox Code Playgroud)
这里str是空字符串.
我希望在VC++中实现这一点.所以我需要创建VC++等价的对象.我确定我们需要使用指针作为ref的等价物?
没有一个.C++没有像.NET语言那样的统一类型层次结构.
你可以得到的最接近的是void*(指向虚空的指针),它可以指向任何类型的对象.不过,你应该避免void*像瘟疫一样; 一旦你开始使用它们,你将失去所有类型的安全性.
正如其他评论家所说,C++没有针对每个对象的公共基类.从理论上讲,你可以创建自己的东西并从中派生出一切:
class Object
{
protected:
Object(){};
virtual ~Object(){};
public:
virtual std::string toString() const {return("");};
}; // eo class Object
Run Code Online (Sandbox Code Playgroud)
但是,这对整数类型(例如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
Run Code Online (Sandbox Code Playgroud)
然后,您必须为要使用的所有其他类型执行此操作.一旦完成,你可以传递它们,就好像它们是整数,bool,longs等(由于运算符重载).更好的方法是使用模板类作为整数类型:
template<class T> class IntegralType : public Object
{
private:
T m_Val;
public:
// rest of class looks the same
}; // eo class IntegralType<>
Run Code Online (Sandbox Code Playgroud)
然后键入dede他们:
typedef IntegralType<int> Int;
typedef IntegralType<short> Short;
typedef IntegralType<long> Long;
Run Code Online (Sandbox Code Playgroud)
即使使用这样的模板类来完成它的工作,你仍然需要对字符串/ bool进行专门化.在IntegralType <>上实现operator ++可以很好地处理数字,但是会在std :: string上运行.
如果你去模板路线,你现在有了"对象",整数类型和字符串,bools的一些特殊化.但是为了更多地模仿.NET,你可能想要引入用于比较的接口:
template<class T> class IEquitable
{
public:
virtual Equals(T _other) = 0;
}; // eo class IEquitable<>
Run Code Online (Sandbox Code Playgroud)
这可以很容易地进入您的IntegralType <>类和专业化.
但正如另一位评论员指出的那样,你为什么这么做? boost :: any非常有用,如果您尝试执行类似于具有名称和任意类型值的元组.如果你需要构建这些集合,那么你的设计就会出现根本性的问题.例如,在我用C#进行的所有编码中,我从未写过:
List<Object> list = new List<Object>();
Run Code Online (Sandbox Code Playgroud)
可能有:
List<Vehicle> list;
List<Employee> List;
Dictionary<string, Alien> aliens;
Run Code Online (Sandbox Code Playgroud)
但对象级别从来没有任何东西.为什么?除了在它上面调用ToString(),或者也许做一些冒险的演员,你为什么要这样做?编程中存在泛型,因此我们不必拥有对象列表(或者在C++,void*的情况下).
所以你有它.上面展示了如何让对象和整体类型像C#一样工作,我错过了一大堆东西.现在是时候看看你的设计并决定你是否真的需要这样做.
标<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);
Run Code Online (Sandbox Code Playgroud)
您的代码片段中没有任何内容可以帮助我帮助您弄清楚如何获取 COM 接口指针。如果您遇到麻烦,请开始一个新问题。