通过“指向类成员的指针”访问作为数组的类成员

Posted

技术标签:

【中文标题】通过“指向类成员的指针”访问作为数组的类成员【英文标题】:Accessing class members that are arrays through "pointers to class members" 【发布时间】:2014-05-04 06:54:09 【问题描述】:

我编写了以下代码来探索指向类成员的指针:

#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;

class Sample
    public:
        int i;
        char name[35];
        char* City;

        Sample(int i,const char* ptr,const char* addr):i(i)
            strncpy(name,ptr,35);
            City= (char*) malloc(strlen(addr)*sizeof(char));
            strcpy(City,addr);
        
;

int main()

    Sample Ob1(1,"Andrew Thomas","Glasgow");
    cout << Ob1.i << " : " << Ob1.name << " lives at : "<< (Ob1.City)<< endl;
    int Sample::*FI=&Sample::i;
    char* Sample::*FCity= &Sample::City;
    char* Sample::*FName=  &Sample::name;

    cout << Ob1.*FI << endl;
    cout << Ob1.*FCity << endl;
    cout << Ob1.*FName << endl;

    return 0;

char* Sample::*FName= &amp;Sample::name; 出现如下错误:

$ g++ -Wall ExploreGDB.cpp -o ExploreGDB
ExploreGDB.cpp: In function ‘int main()’:
ExploreGDB.cpp:28:34: error: cannot convert ‘char (Sample::*)[35]’ to ‘char* Sample::*’ in initialization
  char* Sample::*FName=  &Sample::name;
                                  ^

其余代码工作正常。

谁能告诉我如何声明一个指向声明为 -char name[35]; 的数据成员的指针?

【问题讨论】:

如果您使用 c++ 使用 std::string 而不是 char* 来存储文本,从长远来看,它将为您省去麻烦。 Sample的构造函数如果ptr指向的字符串长于34会出现溢出问题 我只是想探索pointer to character array,因此其他代码string 对C++ 来说是最安全的 @MattMcNabb 我想它会从ptr 中提取34 characters 并存储在name .. 虽然考虑到空字符我忘了写成City= (char*) malloc((strlen(addr)+1)*sizeof(char));.. 但它仍然会忽略characters beyond 34 in ptr while storing at name .. 那么name 存储34 chars + null character 即只有35 characters @Gaurav,它提取 35 个字符,如果有那么多字符,它不会以空字符结尾,但大概您的其余代码需要一个以空字符结尾的字符串 【参考方案1】:

你需要如下声明指针:

char (Sample::*FName)[35]=  &Sample::name;

一般规则是U (T::*&lt;var_name&gt;) 声明指向T 类型为U 的类成员的指针。这里的类型是char &lt;var_name&gt;[35],所以需要上面的语法。

另请注意,您的malloc 不正确。 strlen 给出了字符串中的字符数,但要表示它,您需要多一个字符作为终止空字符:

City= (char*) malloc(strlen(addr)+1);
strcpy(City,addr);

【讨论】:

以上是关于通过“指向类成员的指针”访问作为数组的类成员的主要内容,如果未能解决你的问题,请参考以下文章

C++ 指向类成员的指针

访问包含在数组中的指向类对象的类成员函数的正确语法是啥?

从 CUDA 中的主机访问设备上的类成员数组指针

在成员函数中访问参数的类成员

C ++ - 通过getter函数在单独的类中从对象指针映射访问成员函数

访问不同 CUDA 内核中的类成员