2011-05-17 67 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]; 
}}