2011-05-17 72 views
0

我创建了一个类并将其对象传递给了cuda内核。访问cuda内核中的类的私有成员

内核的代码是:

__global__ void kernel(pt *p,int n) 
{ 
int id=blockDim.x*blockIdx.x+threadIdx.x; 
if(id<n) 
{ 
    p[id]=p[id]*p[id]; 
}} 

而且它提供了以下错误:error: ‘int pt::a’ is private

的问题是: 如何访问类的私有成员?

程序,如果没有私有成员类的

class pt{ 
int a,b; 
public: 
pt(){} 
pt(int x,int y) 
{ 
    a=x; 
    b=y; 
} 
friend ostream& operator<<(ostream &out,pt p) 
{ 
    out<<"("<<p.a<<","<<p.b<<")\n"; 
    return out; 
} 
int get_a() 
{ 
    return this->a; 
} 
int get_b() 
{ 
    return this->b; 
} 
__host__ __device__ pt operator*(pt p) 
{ 
    pt temp; 
    temp.a=a*p.a; 
    temp.b=b*p.b; 
    return temp; 
} 
pt operator[](pt p) 
{ 
    pt temp; 
    temp.a=p.a; 
    temp.b=p.b; 
    return temp; 
} 
void set_a(int p) 
{ 
    a=p; 
} 
void set_b(int p) 
{ 
    b=p; 
}}; 
+1

什么是'pt'的定义是什么? – 2011-05-17 08:48:15

+1

看来你的函数被声明为类定义之外的朋友。 class pt的定义是什么?除非朋友函数是在类定义中声明的,否则它不是该类的朋友。 – harrism 2011-05-18 03:31:58

回答

1

私有成员只能由它的成员函数和它的朋友可以访问运行良好。

+0

我正在使用朋友功能 – Shweta 2011-05-17 09:00:33

1

您的C++代码中存在一些错误。

这将编译我的机器(CUDA 4.0的Mac OSX)上

#include <iostream> 

class pt { 
    int a,b; 
public: 
    __host__ __device__ pt(){} 
    __host__ __device__ pt(int x,int y) : a(x), b(y) 
    { 
    } 

int get_a() 
{ 
    return this->a; 
} 
int get_b() 
{ 
    return this->b; 
} 

__host__ __device__ pt operator*(pt p) 
{ 
    pt temp; 
    temp.a=a*p.a; 
    temp.b=b*p.b; 
    return temp; 
} 
pt operator[](pt p) 
{ 
    pt temp; 
    temp.a=p.a; 
    temp.b=p.b; 
    return temp; 
} 
void set_a(int p) 
{ 
    a=p; 
} 
void set_b(int p) 
{ 
    b=p; 
} 

friend std::ostream& operator<<(std::ostream &out,pt p); 

}; 

std::ostream& operator<<(std::ostream &out,pt p) 
{ 
    out<<"("<<p.a<<","<<p.b<<")\n"; 
    return out; 
} 

__global__ void kernel(pt *p,int n) 
{ 
int id=blockDim.x*blockIdx.x+threadIdx.x; 
if(id<n) 
{ 
    p[id]=p[id]*p[id]; 
}}