c ++将MyClass *转换为int *

时间:2013-09-30 22:21:06

标签: c++ pointers casting

我想将MyClass的实例指向int*,最好是这样我可以这样做:

void function(int*) {...};
MyClass * instance = new MyClass;
function(instance);

int指针不应该是MyClass指针的二进制副本。目前,我使用以下代码来实现类似的结果:

int * MyClass::getIntPointer() {return &my_int;}

如何将MyClass*投射到int*

3 个答案:

答案 0 :(得分:2)

您是否正在尝试访问班级的int成员?如果是这样,你可以这样做:

class MyClass {
  public:
  int myInt;
};

void function(int*) {...};
MyClass* instance = new MyClass;
function(&instance->myInt);

您不希望将强制转换 MyClass转换为int,您只想访问 MyClass的成员。

所以这就是那条线的含义:

          instance->           // follow the pointer to the actual MyClass object.
          instance->myInt      // access the int, "myInt"
         &instance->myInt      // get the address of that int
function(&instance->myInt);    // call "function", passing to it the address of "myInt"

修改

如果您正在创建一个包装int的类,您可以使用自定义转换运算符执行此操作,如@cmbasnett所示:

class MyClass {
  public:
  int* operator int*() { return &my_int; }
  private:
  int my_int;
};

MyClass instance;
function(instance);  // this line will trigger the custom cast operator.

答案 1 :(得分:0)

这些中的任何一个都可能引起您的兴趣:

#include <iostream>

struct MyClass
{
    int myInt;

    operator int*()
    {
        return &myInt;
    }
};

int main()
{
    MyClass* instance = new MyClass();

    //method 1
    instance->myInt = 42;
    int* a = &(instance->myInt);

    //method 2
    int* b = *instance;

    std::cout << *a << std::endl;
    std::cout << *b << std::endl;
}

答案 2 :(得分:0)

对不起,你被困了。您不能为指针类型重载类型转换操作符。这是您可以从MyClass*直接投射到int*的唯一方法,并要求生成的int*指向第一个int成员,即使该类的存储空间不存在-POD。

如果您可以保证MyClass始终是POD类型,那么reinterpret_cast<int*>(instance)就足够了。但是你的要求“int指针不应该是MyClass指针的二进制副本”意味着没有这样的保证。

如果您愿意以MyClass&而不是MyClass*开头,那么您可以使用cmbasnett为类添加类型转换过载的示例。